|
发表于 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+ B$ @8 A& Q6 _
- On Error Resume Next
5 l& u9 o6 k8 d% ^ - With ThisDrawing
' ]) E5 q- m$ ~ - '创建选择集,用于选择所有文字对象
9 T4 j6 {+ E7 S. }/ i - Set SS = .SelectionSets.Add("SS")' [: s; g% f4 p
- '定义过滤器为选择单行文字对象
) p5 z1 K: W4 v4 l - Ft(0) = 0! P. q5 M1 H: o" j5 O
- Fd(0) = "TEXT"0 r/ P: \7 L) f* F" ~9 x) z! r
- '选择所有单行文字对象
: G" L6 v- t3 n$ } - SS.Select acSelectionSetAll, , , Ft, Fd
, y, t' A: W: S, ~, o! Y - '当存在单行文字对象时排序和替换
_0 i/ | g: w& u' ]/ ~2 l' d - If SS.Count > 0 Then
) t4 w3 r6 {! J$ W: O/ I" } - '由用户在屏幕上指定中心点
* R$ e. e* ]( u7 x+ L - V = .Utility.GetPoint(, "指定中心点<默认>:"): d! Q* j6 N! {, y, P5 y. F# ^$ C
- '如果用户没有取消则排序和替换
/ D4 r1 U- r) Z; y2 i5 _! T - If Err <> -2147352567 Then
' O/ e3 _" Y- e$ r - '用户指定了点6 p" E- g) W0 F3 X5 `# C4 S
- If Err = 0 Then( h, o y" m& d) o3 m Y) E
- P(0) = V(0)
' y! Z# A0 V2 `2 J2 j3 e - P(1) = V(1)' n+ U0 B0 \5 z
- '用户选择了默认
. _4 Y' y0 I; z - Else
1 F# a" C/ o+ m% q0 w0 y3 C" { - '计算所有单行文字的几何中心
' f( }% h7 t; ?. d+ t I+ ~ - For I = 0 To SS.Count - 1
4 V6 {* ^) A f1 X9 a# K - V = SS(I).InsertionPoint8 O7 j5 ^+ R$ c9 j, Y5 s
- P(0) = P(0) + V(0) / SS.Count
2 U9 O0 ~) R6 s5 @5 f) H% i& {3 n9 W - P(1) = P(1) + V(1) / SS.Count# E/ T# R2 l) ~: J- j
- Next
, z$ p* D! c! u6 v: {, B - End If! F: l4 ?* C) l' N. k9 K. E! {' T
- '重定义动态数组下标
" x4 y0 R( q. }" v* P# u - ReDim A(SS.Count - 1, 1)
2 M) E9 s2 }, A/ P; }" v; a d - For I = 0 To SS.Count - 1
* p+ i3 R# i/ X A - '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
3 t- f* K, C' v% C/ X0 Y" }8 K* A F - A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
9 n; K$ w F+ w0 e. F; A$ A- B - A(I, 1) = I% t# j$ [( W, X3 n5 M: H: l
- Next7 ?2 o: W* d5 h( b, e: B* m
- '按角度从大到小的顺序排序
7 n# X; Y+ s% |; v2 ?* t - For I = 0 To SS.Count - 2) [1 J9 @! G& Q' A$ U0 F7 h' O3 k
- For J = I + 1 To SS.Count - 17 ?. a% K! i: y. X0 o: `- [
- If A(J, 0) > A(I, 0) Then( M+ v; O& W9 |' c
- D = A(J, 0)/ Z* u! U1 y1 s1 T# ^3 w* t+ I
- A(J, 0) = A(I, 0)# J3 L3 v. {; j8 M9 j0 F7 V+ X
- A(I, 0) = D: ^! q$ A$ I/ @! `3 y
- D = A(J, 1)
: c; F/ r) v8 t; B% I) `& i - A(J, 1) = A(I, 1)( s9 N9 C3 z$ w
- A(I, 1) = D
5 J2 f7 W3 [+ d0 E& y - End If8 D d4 d' e5 G U
- Next
7 g8 M% L7 }! ^ - Next. L$ g! L) n* u% D6 T7 M: P0 \
- '替换. @ ~. H3 A# ?+ W0 v- D+ b; s
- For I = 0 To SS.Count - 1
0 S) D% f5 ]4 W0 U' i/ S$ m$ y - SS(A(I, 1)).TextString = I + 1
3 y9 H( g9 q* Q; N4 m. V$ ?3 k - Next
+ j5 p5 C0 Y Q) x% { - End If
' z8 E' }' R( f - End If; f* ?- X9 W, y. S8 W( G
- '删除用过的选择集' a- P* u: ^4 I: `. m( u2 J( F0 I
- SS.Delete
1 C/ p! n% [5 H% m6 k - End With
复制代码 |
|