|
|
发表于 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 Double2 o1 c: c L( M
- On Error Resume Next& _5 }9 }# l$ L
- With ThisDrawing% R4 ~. I; Y/ U) K9 Y% T7 ?, W5 V
- '创建选择集,用于选择所有文字对象1 ?: p; I# c% V, b7 n' @/ u
- Set SS = .SelectionSets.Add("SS")4 _& g3 m) ]' U8 }
- '定义过滤器为选择单行文字对象
# l! a* A7 ]6 T) A; z3 x0 g - Ft(0) = 0
9 B+ m, F' q% o( c - Fd(0) = "TEXT"( i2 G, R8 T f; c
- '选择所有单行文字对象
: C; b; h: U7 ]+ {7 P- E6 o - SS.Select acSelectionSetAll, , , Ft, Fd
* N( O" x" j$ q8 h' Z - '当存在单行文字对象时排序和替换/ L7 F4 R2 n2 S
- If SS.Count > 0 Then5 p4 d8 q, `, Z, ^/ l) @
- '由用户在屏幕上指定中心点0 J0 [5 w$ E, e8 m0 M; A, o
- V = .Utility.GetPoint(, "指定中心点<默认>:")! `+ s5 y, v- z% m) X. p) R
- '如果用户没有取消则排序和替换0 d, Z5 M. X( k v" O9 H/ l0 U3 O( b
- If Err <> -2147352567 Then
: B( L0 E; M P - '用户指定了点 W3 Y- W! p7 a# f
- If Err = 0 Then+ {$ }5 U+ n K/ x( M
- P(0) = V(0)
. l. x2 z" g7 T) b7 H5 u4 @8 v - P(1) = V(1)
3 h! K* U8 f% e: L' e - '用户选择了默认
- P. _& b5 l4 c3 ^8 Q4 F - Else+ U9 j1 `# G9 `% @+ K: j5 f
- '计算所有单行文字的几何中心
, c/ C( Q) d- k: W - For I = 0 To SS.Count - 1
- c7 V' S1 N' m0 a7 q. T - V = SS(I).InsertionPoint" V; A! F2 b0 U" d" s: e8 }% G+ |
- P(0) = P(0) + V(0) / SS.Count
$ R' n5 Q6 R7 B O5 U2 y H/ { - P(1) = P(1) + V(1) / SS.Count% G- \+ s4 |( D
- Next1 c+ G8 o$ \2 C2 R$ g) G
- End If4 }4 \/ ^+ {, _) ?. t
- '重定义动态数组下标
) ~9 n8 d T2 X' |$ x. V' s - ReDim A(SS.Count - 1, 1): M; `* c4 _6 n: P2 \" Z7 i; p
- For I = 0 To SS.Count - 10 e6 j( k! ], t6 @
- '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号* Z" I6 ^& h; z8 c( r
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
0 n2 A. |& J6 i6 U2 j, _) P0 } - A(I, 1) = I1 m! L$ N. w: W3 V7 C
- Next7 a: S" a6 R# n" s. U: ^/ ?
- '按角度从大到小的顺序排序; r% @1 s, ]8 O4 ~ w
- For I = 0 To SS.Count - 25 k1 O" R% ~7 ~: e
- For J = I + 1 To SS.Count - 1
9 i1 T: v/ i2 Y* h - If A(J, 0) > A(I, 0) Then# _/ `: H1 l: ^. y6 L% m
- D = A(J, 0)
E0 a" u/ a2 _: t: F- A8 T) @ - A(J, 0) = A(I, 0)
$ K5 o& [: w9 a; m - A(I, 0) = D7 m: F4 j/ R9 Z( U1 K( B, _ E
- D = A(J, 1)
0 \9 F5 _. M, ~" S7 X - A(J, 1) = A(I, 1)
, ~. d' m! a2 t) S3 U0 J+ Y - A(I, 1) = D
3 d v; {% [) i - End If2 y; x$ [7 }3 a/ l2 B9 v
- Next9 K; k0 F! |2 z
- Next
8 V6 X* G/ H+ L - '替换
2 S. ^ Y# V/ K: {7 ]' V - For I = 0 To SS.Count - 19 p/ I% W+ s0 j- X
- SS(A(I, 1)).TextString = I + 12 f! j4 c, x! W7 s/ o2 L4 V
- Next. x) k2 N" C' p# d) Y+ X, i$ n
- End If4 K& ^( }% b6 e% |
- End If, r& f0 f& o6 O" H, o# j$ a
- '删除用过的选择集( o9 }# h) ~, ] J7 y$ \) P
- SS.Delete3 m3 F) c0 o$ L7 ]0 H
- End With
复制代码 |
|