|
|
发表于 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
% i4 J/ O* }; a5 ~ - On Error Resume Next: f7 f' n, L U6 }1 o8 ~/ p$ g4 x: t
- With ThisDrawing
: U; u' f& i+ F( Z. G* T8 K1 i - '创建选择集,用于选择所有文字对象6 d! v9 ]5 b& i
- Set SS = .SelectionSets.Add("SS")
5 g) B+ o7 L6 \0 I - '定义过滤器为选择单行文字对象
P" _: K# F7 D1 ]# e( H3 l - Ft(0) = 0- a2 `2 W8 {/ Q
- Fd(0) = "TEXT"
H! |. W7 u' `8 j* ?4 R - '选择所有单行文字对象
. {. U g/ e1 z1 ^ - SS.Select acSelectionSetAll, , , Ft, Fd+ [+ A* ~4 `; C+ u& d0 C
- '当存在单行文字对象时排序和替换
0 Z& d( E) D' j, ~/ ~; x3 G - If SS.Count > 0 Then
# c7 w0 G: W/ E0 }- `3 Y, b- N8 F - '由用户在屏幕上指定中心点8 ~9 K# p; Z8 R: x( q( M
- V = .Utility.GetPoint(, "指定中心点<默认>:")2 O9 D# n t( `" J8 \, N& @- P! t
- '如果用户没有取消则排序和替换" s. w! A/ f8 F* H, N/ H
- If Err <> -2147352567 Then$ ^6 \$ q. w) S+ `: i1 Z7 C
- '用户指定了点) e* m# }) {7 J% ?9 H& W8 i9 f" ^
- If Err = 0 Then- ?* i; D& p" V
- P(0) = V(0)
4 t3 X) R$ F G; p, F - P(1) = V(1)
: n- m' l# v/ A- Q+ z; S1 d: k - '用户选择了默认
: ^: ]- C, G" M1 E% X' w1 b - Else
, Q" a0 X$ m G, n" Q - '计算所有单行文字的几何中心9 B3 ^; T/ g# ]) N- n8 W
- For I = 0 To SS.Count - 1# w$ P+ o8 K, u7 {9 y6 w' B
- V = SS(I).InsertionPoint4 C3 Y z( N: T6 u) Q9 Q" M1 x
- P(0) = P(0) + V(0) / SS.Count
]# i# O7 g) E' P+ ] Z - P(1) = P(1) + V(1) / SS.Count
# ~4 i" Y) P% T, m: j* [ - Next
+ t! d& v4 X* q2 A3 N - End If
0 W) @+ \7 _% A - '重定义动态数组下标$ \; H) b1 K9 \8 O& ?) I
- ReDim A(SS.Count - 1, 1)
7 b/ C+ `: h5 N - For I = 0 To SS.Count - 13 e3 c% @) x% u7 R9 U9 A
- '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
2 x7 \, L2 h, }3 a - A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)8 U" { n" a; c3 t- s& N
- A(I, 1) = I
" V+ ~3 D, {) a0 ]0 h - Next' S6 k. M, P z5 w6 F$ p
- '按角度从大到小的顺序排序
1 D. {" p# T# o" w a. Q, B - For I = 0 To SS.Count - 2
0 t4 e# Z2 |* w# ]+ L0 o - For J = I + 1 To SS.Count - 1
* Q; M$ B1 o: G# j/ U - If A(J, 0) > A(I, 0) Then' s. m) \! }3 N! y
- D = A(J, 0)
' j, G2 Y$ S1 P" G - A(J, 0) = A(I, 0)
; |- T7 F& J E4 n* f" y - A(I, 0) = D! ?( H/ L) q* s7 x3 s
- D = A(J, 1)+ o1 L" Q4 `1 [2 L, e$ r9 ?
- A(J, 1) = A(I, 1)7 ~' U) N+ X' s
- A(I, 1) = D
) A7 y, g- }4 V+ k4 B - End If
3 f' L6 o; ?: f - Next
, U( I$ `- }# q: T+ `: N4 U2 M - Next5 g" G% z& o) l; Z/ c+ w; ]* w
- '替换5 c# V; j; T/ Z" V2 Y
- For I = 0 To SS.Count - 1+ Y4 s, g1 o9 S9 x' |! V. W' x
- SS(A(I, 1)).TextString = I + 1! N) g: y, A# \2 @% L, U. r& f
- Next+ a4 ?4 |& x4 J0 E7 M1 G
- End If9 N& C& E+ y+ [3 P1 Z
- End If
8 J* `2 O( V$ K0 S; ]/ J - '删除用过的选择集
0 q% C! a4 f: W1 y - SS.Delete4 }4 X G7 z3 w3 G
- End With
复制代码 |
|