|
|
发表于 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
- n: B1 \: g2 m; U' z3 l - On Error Resume Next/ b5 S. F- k( X9 Z0 \( Y3 l
- With ThisDrawing' v/ Q4 _( S. Q& S: G! z$ B
- '创建选择集,用于选择所有文字对象- r4 Z) [, Z( h* n0 x
- Set SS = .SelectionSets.Add("SS")
4 Y* v6 W+ z- a - '定义过滤器为选择单行文字对象
( ~7 H9 N: z7 I$ y9 v. P$ g - Ft(0) = 0
) H# J' u$ n- x - Fd(0) = "TEXT"
# S3 y2 X. m% o9 j/ H - '选择所有单行文字对象
X$ O' E# o0 a: m* k$ w5 \$ L - SS.Select acSelectionSetAll, , , Ft, Fd
7 w1 g7 n' u* w6 N - '当存在单行文字对象时排序和替换6 J! K2 J; z) H* r
- If SS.Count > 0 Then. s' ?+ \8 U4 j! @1 u
- '由用户在屏幕上指定中心点
& P9 k1 @7 N4 _% R0 s7 ? k, Q - V = .Utility.GetPoint(, "指定中心点<默认>:")9 P3 \+ h, h# c9 n1 l% z# L$ B. B
- '如果用户没有取消则排序和替换
! [( D+ Z$ _) D9 z3 {4 P: a6 M/ b - If Err <> -2147352567 Then
) y. B0 R# d+ w( l - '用户指定了点
8 H' k& ?, X6 n+ B$ n - If Err = 0 Then3 H; x3 x- R, C0 V
- P(0) = V(0)1 M; Q/ L' I! {: l" r& V
- P(1) = V(1)$ N; p, a3 K! N: M$ l! _, \
- '用户选择了默认8 R. i" S5 v1 Y2 r' J
- Else
# h! a! |% M$ q - '计算所有单行文字的几何中心% }: r; `& F% x5 z" J. D8 l n
- For I = 0 To SS.Count - 1
B, g5 v2 S3 P1 D - V = SS(I).InsertionPoint! ^* A! H T: b) }, o/ W
- P(0) = P(0) + V(0) / SS.Count
/ E5 x) ~3 x/ f# l - P(1) = P(1) + V(1) / SS.Count" ^4 e& t5 B8 u) K, @; ^8 G/ S
- Next m# e6 U0 [4 D# W( l! k F
- End If8 o6 {( y1 X/ C: [# _
- '重定义动态数组下标
" s' p' p* @; q/ P" ^; ]6 X6 m - ReDim A(SS.Count - 1, 1)
' p/ @5 f. s2 Z- c - For I = 0 To SS.Count - 10 ]8 m8 Z E- y
- '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
% h @+ U8 o1 a( G) v/ o2 D- @ - A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)8 F/ N" O* I& S0 Q7 D w/ k. W4 ?
- A(I, 1) = I
c5 E+ x/ d @1 ]6 n ]! w0 {- s. [ - Next& F/ p% G4 i8 N& w. \
- '按角度从大到小的顺序排序
9 H+ w( v7 F' a. _/ v" A6 o - For I = 0 To SS.Count - 2
9 M; ?8 X! a1 C+ J1 o - For J = I + 1 To SS.Count - 12 r0 D" M( d3 B: a$ W
- If A(J, 0) > A(I, 0) Then0 V! }/ d+ P/ e
- D = A(J, 0)0 g5 W5 ` n7 W) a+ g
- A(J, 0) = A(I, 0)6 }9 I/ b4 L$ z, q, c m
- A(I, 0) = D3 |% `% B; }: l8 c0 I
- D = A(J, 1)7 y/ L: C0 ~3 H5 `% M+ Z; P$ \- e
- A(J, 1) = A(I, 1)
# r6 ~) S9 S6 O* z# p* s- R# O - A(I, 1) = D
0 V$ ^7 E7 U1 V0 G. @5 ~, S; I - End If
5 q1 Z; O. A0 f; k" H4 Q - Next( G& j' K$ K2 H$ H' Q# f
- Next
# M5 m$ H5 c- r* F - '替换- X1 Z( u- t# U$ [$ P0 t# p
- For I = 0 To SS.Count - 1
) a, F3 b% G9 \6 S, R - SS(A(I, 1)).TextString = I + 1
; i) a3 w7 k% a* A- b! C. h* V* r - Next' Y1 ? r' b& ]1 b4 o# U2 I1 N
- End If3 D; V Z. z$ p. G1 H
- End If9 F/ Y+ h% W" o; I4 I1 u1 x
- '删除用过的选择集: R. O, y) A1 c4 h" W1 D
- SS.Delete- R; y* I& S4 {8 O3 Q; _
- End With
复制代码 |
|