|
|
发表于 2011-3-25 00:23:55
|
显示全部楼层
来自: 中国辽宁大连
是否可以这样:( w4 B( g I; Z, x% f/ @& v# z
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.9 n7 o/ [. U h/ r! K' q/ \
下面的代码仅供参考- 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& t% F b% a+ U8 w
- With ThisDrawing) U+ G( O9 [" j: [
- '创建选择集,用于选择所有文字对象
t7 v2 _/ v1 \* p' O0 u - Set SS = .SelectionSets.Add("SS")
& M# N4 ^/ Y$ w+ ^5 `, w - '定义过滤器为选择单行文字对象
i A. e6 R" h% Q: @' _. G L - Ft(0) = 0. g( U7 [1 s- A0 \
- Fd(0) = "TEXT"8 C, l5 y% w0 R& { _( K: R3 J
- '选择所有单行文字对象: |- y) E$ x! q# w. s1 ?, m
- SS.Select acSelectionSetAll, , , Ft, Fd
" V, g3 {7 ?' F0 ]: }, H - '当存在单行文字对象时排序和替换
4 L- V* M+ i; s- h - If SS.Count > 0 Then0 H8 F0 U3 } e
- '计算所有单行文字的几何中心- l% ]' ?! t# C2 v5 D' K
- For I = 0 To SS.Count - 1$ ], H( t. V7 h: v1 X+ Y; ]
- V = SS(I).InsertionPoint
# u* U% r, \; o* Y - P(0) = P(0) + V(0) / SS.Count
+ J. R# L1 [ R0 E7 U- M' D1 G; @ Y& [ - P(1) = P(1) + V(1) / SS.Count& J3 Y( m4 P: _: T4 `" r, n
- Next4 F; B9 i2 v. }- ^+ k3 U* u8 [0 e5 T
- '重定义动态数组下标
/ {6 o2 _6 G9 y+ ?4 x - ReDim A(SS.Count - 1, 1)! [# N1 T% i& h1 s8 K; c2 {
- For I = 0 To SS.Count - 10 o( G& ]1 ^! t3 w6 z: k
- '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号 }7 X3 C* A' v0 z
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)8 f1 j0 D3 N2 K* R) m5 A F+ M
- A(I, 1) = I
8 o' K4 a- _4 C( ~% u* ~* o0 W% J' N - Next
. Z3 a( O2 v0 C: c; U/ u7 ?: j - '按角度从大到小的顺序排序
6 J; ^9 e' }& @/ w7 M - For I = 0 To SS.Count - 2/ n. j8 q) a- Y8 d, r
- For J = I + 1 To SS.Count - 1
6 `+ t: ]2 g1 P - If A(J, 0) > A(I, 0) Then
" x! j/ N* {- ]8 ?2 u9 g - D = A(J, 0)" G1 F; R9 E, b3 ]% }% l! P0 ]6 Q
- A(J, 0) = A(I, 0), F3 z6 g W3 I- s. z: S9 s# j
- A(I, 0) = D$ e9 q K$ L1 ]5 H* j/ O }+ q! I, G
- D = A(J, 1)) L2 P+ p2 P/ q6 x+ S
- A(J, 1) = A(I, 1)+ I* u+ n ~) U b5 x
- A(I, 1) = D; d) u$ ]9 `; Q* ?
- End If
: @: y4 B6 b1 o. b. `& Q2 z$ ] - Next7 q' X6 b$ a, O d+ Q V, ^
- Next% z: a' F% m: }
- '替换
/ {% i0 ~# n5 C" _ - For I = 0 To SS.Count - 1, e' x q2 p5 t& d: W
- SS(A(I, 1)).TextString = I + 1
) k1 R2 N; t/ O - Next
; [1 Z7 z/ B9 P. S* F& F - End If
, `5 r" W5 D/ d/ s, G. J1 Y% Q - '删除用过的选择集6 i; M, a% @ U! e% m
- SS.Delete% A5 c0 o& r8 k$ ~* [
- End With
复制代码 |
|