|
|
发表于 2011-3-25 12:23:08
|
显示全部楼层
来自: 中国辽宁
我又想了一下,只用加总平均的办法计算中心点未免有点太单一了.如果增加一个选项,由用户在屏幕上指定中心点会更好些- Dim SS As AcadSelectionSet, Ft(0) As Integer, Fd(0) As Variant, V As Variant, P(2) As Double, A() As Double, I As Integer, J As Integer, D As Double
5 B; d# c! x: v - On Error Resume Next# B, y4 m* H& a: P, `8 P
- With ThisDrawing
g2 h" x, d) T3 j) l( \6 R5 v7 w' P - '创建选择集,用于选择所有文字对象
8 Z1 ?* f2 `7 A0 K5 e' f - Set SS = .SelectionSets.Add("SS")
7 P' u, K( R% b q - '定义过滤器为选择单行文字对象) U% y ]. E: u( b$ E5 ~; G
- Ft(0) = 0
" P) k: y2 R6 b$ |/ g# e4 [! N5 [! b - Fd(0) = "TEXT"
9 X$ }0 ~) {6 O |) @3 a - '选择所有单行文字对象. E. A) b2 e* A5 a* c
- SS.Select acSelectionSetAll, , , Ft, Fd1 K3 p3 u5 D l' ~( x3 \ B5 U" X
- '当存在单行文字对象时排序和替换
+ U& i. j8 m8 w' ^* U# l - If SS.Count > 0 Then* {: E2 j0 T# n( P
- '由用户在屏幕上指定中心点( R" c% o+ _! F( j
- V = .Utility.GetPoint(, "指定中心点<默认>:")7 c: U3 h1 j3 _% C$ a
- '如果用户没有取消则排序和替换
% l' B9 U1 |! J% R9 n$ l: c" a; B - If Err <> -2147352567 Then
- X- J* o/ t) }) {) S& i - '用户指定了点
0 r* @! F T/ g8 I6 ?& f! Z' n - If Err = 0 Then
; F* U; k8 `+ x/ P - P(0) = V(0)
6 z7 l; l$ M0 s. U }/ B) a - P(1) = V(1)
! M: A+ b l4 Y( I" G1 N - '用户选择了默认
1 t, O. ^5 j) ?/ Z& _. _) h8 U - Else
" h: ?$ p7 I% T! [. w* f8 s - '计算所有单行文字的几何中心
I& D5 T; u; p5 \- \7 D - For I = 0 To SS.Count - 16 B; P& @ w) b( g) H4 Z3 B
- V = SS(I).InsertionPoint
9 {* A; w% D- b Z. w3 K% H. I% O - P(0) = P(0) + V(0) / SS.Count. D& @) D: F' Z' Z$ h1 r! {/ I c" |2 L# m
- P(1) = P(1) + V(1) / SS.Count, u6 I# J' E" |" n2 F
- Next9 ?9 y" Y* B- C1 {% ^4 p) ?
- End If: Q; f2 w" n/ \" R }( z
- '重定义动态数组下标8 I8 ^ k: r. R# g/ E
- ReDim A(SS.Count - 1, 1)
+ \3 U3 M2 A* ~9 A* w - For I = 0 To SS.Count - 1
: U, t5 Y3 i# U1 S' M - '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号* s8 j! B) T, m% Q @$ \0 m5 I, |
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
, t. L( E' @3 O( W - A(I, 1) = I$ @/ v7 n$ t8 H# E4 Y
- Next
1 ?, O) M6 b: _ - '按角度从大到小的顺序排序4 r1 M% H2 S4 N' g$ e
- For I = 0 To SS.Count - 2
0 w: A/ U$ L. }6 ?, k! H6 | - For J = I + 1 To SS.Count - 1
+ D& T" O. `3 `" W9 X - If A(J, 0) > A(I, 0) Then3 U) s) ]$ c+ {
- D = A(J, 0)
9 F& m# a" M, }, F! ~ - A(J, 0) = A(I, 0)
9 R' {% ]8 c% z' O( s2 P) w: @$ n1 Y - A(I, 0) = D; l& g. G" H# v& A
- D = A(J, 1)+ M* P& `' g) m# `2 W
- A(J, 1) = A(I, 1)
8 @& } q) C* |+ f" G. u6 d3 m - A(I, 1) = D
2 l8 q+ a: R5 ], M: } - End If& G# K) t C/ G
- Next
; M6 \. u* Q& o* J. _- Q# D1 Z$ f - Next
z$ B+ C7 W# U( ` i a3 B; W0 W - '替换
2 }% f& L# Y6 @ - For I = 0 To SS.Count - 1! D; G! g J+ _" {# q
- SS(A(I, 1)).TextString = I + 1$ Y# S y1 p& W' N
- Next
/ x' Z0 o" E4 u/ G) N - End If
H6 @! G9 q g5 D; {' | - End If
( }9 y e4 x, S5 g- s - '删除用过的选择集% U. N z% f7 m/ [1 w, y% l
- SS.Delete; C3 M$ L. h, \# z, K$ G; Z7 ]
- End With
复制代码 |
|