|
发表于 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
9 d. h( s) }8 f4 ]' |2 V - On Error Resume Next' b- a& @3 b! O' ^, W7 L7 y- Z
- With ThisDrawing
% m* X; Y. ` ] - '创建选择集,用于选择所有文字对象( f* L) h& _: U. Y
- Set SS = .SelectionSets.Add("SS")4 B2 R, \/ M( I$ u6 b! K( J
- '定义过滤器为选择单行文字对象
% _2 b3 H ^' P - Ft(0) = 0' z3 g$ l0 U! |! } ?6 t: X
- Fd(0) = "TEXT"
0 } Y0 [* Z5 n, r! C# g* x! ~1 h - '选择所有单行文字对象2 _) a2 }* ]4 L' G/ @
- SS.Select acSelectionSetAll, , , Ft, Fd" p2 k( k/ X |# f" e
- '当存在单行文字对象时排序和替换3 B& _# j* D9 e, @ J
- If SS.Count > 0 Then6 }+ O( X+ z$ {" h- ]
- '由用户在屏幕上指定中心点
4 f3 e' K" I8 ]6 _% q+ R - V = .Utility.GetPoint(, "指定中心点<默认>:")
# }7 ]: h: g( J- t% R - '如果用户没有取消则排序和替换) o1 x1 Z0 w1 R+ }) t
- If Err <> -2147352567 Then
) C6 }" J6 I5 e4 j. S/ }" a$ l - '用户指定了点
. o3 O% r1 J# t1 O; M/ o- u/ G" @ - If Err = 0 Then
" {% X) L2 F3 H# ]! m - P(0) = V(0)( Y2 c9 o- r& z$ N: G* w* M; m! _* M
- P(1) = V(1)
! X; P7 E) Z0 m8 e1 Q. p2 T - '用户选择了默认
. h# ?) [) l) n" f: U4 a - Else
* n d/ {' y& h F. a - '计算所有单行文字的几何中心/ c4 X) `2 E5 k2 c
- For I = 0 To SS.Count - 1
+ q3 m: s# Y3 a- m1 R6 T* O - V = SS(I).InsertionPoint- J% u P; T0 F1 D, c3 m6 @0 N
- P(0) = P(0) + V(0) / SS.Count, R% i# d9 L. L Q! k y
- P(1) = P(1) + V(1) / SS.Count5 E% W+ _" c3 G: g$ j6 w" Y6 r3 T
- Next
0 z( @$ i# g$ N; u - End If
y8 i4 L2 C& D6 X+ B, W - '重定义动态数组下标
7 R b$ U# L' \% X6 @2 k - ReDim A(SS.Count - 1, 1)& y) E( S/ A' X; L, e. _6 G2 v
- For I = 0 To SS.Count - 1
! j' j( I7 _) U/ | - '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号1 s2 r4 C) w& K; r V$ M, B
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
0 E% {( T) y" Y - A(I, 1) = I
/ J _2 [8 A4 X8 b - Next0 z# X1 T9 n$ o4 b- |
- '按角度从大到小的顺序排序
3 d! l% @" N' {) m4 l - For I = 0 To SS.Count - 2
1 P, i# T4 D+ N) d" A! H& d9 G - For J = I + 1 To SS.Count - 1
# n7 v7 f, R5 d" ]( U! W& z - If A(J, 0) > A(I, 0) Then
" H" u) t5 n: U3 x; k6 F/ M) y% x - D = A(J, 0)
, L$ G3 |+ q/ Y2 j6 S - A(J, 0) = A(I, 0) w! ^' T2 A) ]) F
- A(I, 0) = D7 L, {) W# X0 C% N9 D/ g6 U
- D = A(J, 1)
9 _+ h8 v/ V5 }- o! d" x% h) c - A(J, 1) = A(I, 1)/ {4 i; K" E# ]# g
- A(I, 1) = D5 s) }1 }: x$ O. @ s5 v- C
- End If0 I5 |0 O: r U8 d: x" F
- Next
4 u/ m5 j' r" G% u) m - Next
: w2 p5 g) k6 `/ r" {! U$ e - '替换' X) Z3 h& g2 X; n- Y; @2 ^% q
- For I = 0 To SS.Count - 1
0 j" v4 D! F. L# H1 U - SS(A(I, 1)).TextString = I + 1% F) v d) W4 ^+ L( B
- Next
$ H6 y# {; r# ?0 U9 m! t$ x1 l - End If" V! _- D O! z; X" ?' N9 f- D
- End If
8 O" @5 P( `5 S. ~( _$ k - '删除用过的选择集
: s4 k1 ^7 J, l' D6 F - SS.Delete
& p# M6 J4 ~$ i6 S7 s" k" F Q( V - End With
复制代码 |
|