|
|
发表于 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 Double8 |8 m; P/ W2 f" `
- On Error Resume Next6 }$ a2 e- \4 n$ R& }
- With ThisDrawing% g$ B. m: j6 T# n/ D
- '创建选择集,用于选择所有文字对象
- `0 f$ u: q5 O( E, T6 U - Set SS = .SelectionSets.Add("SS")2 g* D/ X, \' ]; t
- '定义过滤器为选择单行文字对象; W0 Z$ X, ]# t3 C, `' x7 e; N
- Ft(0) = 0
: e3 {. _" m Z' P* Z7 b4 Z! g! a. p - Fd(0) = "TEXT"6 I4 B6 C1 l; P+ v* F, v: z
- '选择所有单行文字对象( Z, a% T+ L6 b" S5 u; i
- SS.Select acSelectionSetAll, , , Ft, Fd
8 d( i3 T9 q5 | - '当存在单行文字对象时排序和替换 r M" p: k7 f( X, G7 T* n- e
- If SS.Count > 0 Then
) ~# y8 E& U$ u @1 p' H - '由用户在屏幕上指定中心点$ q' q, f- Y4 M1 n7 h$ W" Z' ]
- V = .Utility.GetPoint(, "指定中心点<默认>:")
! _5 J% x+ G9 ~" K, ^6 x - '如果用户没有取消则排序和替换
) }6 z+ Z. z* U" h( ? - If Err <> -2147352567 Then6 [2 b; J6 v6 f: G, l }3 J
- '用户指定了点: ^9 c, I0 {, u+ ?4 S+ p
- If Err = 0 Then) s- B2 t8 [2 L
- P(0) = V(0)
- Z A' H; N: N3 y Z. @" X2 b - P(1) = V(1)( J; L. H1 a1 O* g
- '用户选择了默认
8 k5 d) a- k4 p0 _' E0 c8 B5 Q6 j - Else1 G5 [/ L' q& W
- '计算所有单行文字的几何中心3 w( x; l! X$ k& N
- For I = 0 To SS.Count - 1
. R3 Y6 {# k1 `2 I; E - V = SS(I).InsertionPoint
8 P6 S2 z6 x' u( C0 u - P(0) = P(0) + V(0) / SS.Count
6 y# E5 G( b6 E6 _; c - P(1) = P(1) + V(1) / SS.Count
2 ~& A7 D6 G- f% u% o - Next
$ v {" v4 C' Y0 R! Y( }2 m+ o - End If
9 p3 n; P0 A8 P, r1 o/ b) \ - '重定义动态数组下标
8 l0 n( ^1 B: v. B/ J - ReDim A(SS.Count - 1, 1)
& V1 q2 k+ s% G2 b - For I = 0 To SS.Count - 1
+ n* |; w+ P' K; L$ `9 @9 F - '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号; y6 V! j, P7 m/ ^3 M" D3 r
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)0 T0 D9 V0 p+ n3 f) c& G# u
- A(I, 1) = I; R+ V* n9 _: U. [: s
- Next
1 k' a9 A) x6 x" ^ - '按角度从大到小的顺序排序' r, h* `7 ^% Q, i2 A% s3 D+ O- M
- For I = 0 To SS.Count - 2
# [. w- ]# O+ ~4 f! O - For J = I + 1 To SS.Count - 13 T# F' q0 i3 I k& m! t
- If A(J, 0) > A(I, 0) Then. m+ q) }* V1 L u# _0 |( d/ P
- D = A(J, 0)
5 n. v6 p& x3 u8 H9 @8 R$ L - A(J, 0) = A(I, 0)
( Q1 s2 t- D: [3 o( @8 w - A(I, 0) = D
$ N1 B- J$ P* z; c1 w - D = A(J, 1)& t. l, _& y1 _; J+ O
- A(J, 1) = A(I, 1)
: @% k8 R8 b/ K4 n - A(I, 1) = D
8 H1 c& [: }: j; Y: f/ [ `& q" J - End If9 I0 N, R# ^) w
- Next# \. a* u! s- m+ Z4 ? m# u/ [: P/ ^
- Next5 S* n! O) ?) e/ A
- '替换
: B2 z% l$ W8 p6 X# _' j - For I = 0 To SS.Count - 1
/ K9 h9 o5 B3 t; C/ l. L$ P1 n; Y - SS(A(I, 1)).TextString = I + 1/ N1 |# r, h3 T, b4 r) g4 h4 ?
- Next+ p' i* ?, m7 n3 \* ?, I. }6 L
- End If
9 A& u4 O$ o6 y3 q - End If8 h. H0 I9 `- ~- C7 ~
- '删除用过的选择集. d! d0 g0 y3 U/ B" ?3 u
- SS.Delete9 f9 k, u9 ~ l% u- s. V$ a
- End With
复制代码 |
|