|
|
发表于 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( w9 L% O1 D" W; i$ n
- On Error Resume Next( I: f7 @+ D( p/ W" G* F
- With ThisDrawing
2 U' e' |7 g$ X, Y7 p - '创建选择集,用于选择所有文字对象$ N, `6 d( P7 ^* x
- Set SS = .SelectionSets.Add("SS")! r' m4 q3 q5 n; |1 A
- '定义过滤器为选择单行文字对象
9 m2 A& g9 I- R3 W0 h1 Z - Ft(0) = 0" [: j x& }/ Z7 n& p% A# z
- Fd(0) = "TEXT"
% ~. M1 |& B) R Y% Y6 Y8 q - '选择所有单行文字对象
* g+ A( l1 j4 ?9 P$ X! K1 M$ t - SS.Select acSelectionSetAll, , , Ft, Fd( H# B9 A' R: {
- '当存在单行文字对象时排序和替换
6 _6 H, V( Y7 M+ G( s/ N - If SS.Count > 0 Then
' f7 w3 E! s6 b# a7 G) j: I( {2 ~9 y - '由用户在屏幕上指定中心点" A* ~- {& a+ M+ @+ U5 y% Y p
- V = .Utility.GetPoint(, "指定中心点<默认>:")9 Q8 q# B4 r5 K& h) H6 W
- '如果用户没有取消则排序和替换
/ T. M- t) ?# r5 e1 n( b - If Err <> -2147352567 Then" J" j9 E! k( p* w
- '用户指定了点
' M: a2 ^" k9 ` - If Err = 0 Then! H, d- W4 C2 V" |% J' s! i
- P(0) = V(0)
, x' ^' D6 D2 A* Q1 J - P(1) = V(1)
U) Q1 ~. U9 p' @' Q; `9 A* j - '用户选择了默认+ X, v+ V- E8 S
- Else8 r5 u& L. W! j6 Q! D$ O, B
- '计算所有单行文字的几何中心! {! r% U7 [) f. U1 G8 L4 R; K
- For I = 0 To SS.Count - 1
# A. V% T& R) Y) D7 d! n0 c/ E - V = SS(I).InsertionPoint0 _/ D, d5 b" r. R! \
- P(0) = P(0) + V(0) / SS.Count
$ X. e- b2 c" W& R5 d' | - P(1) = P(1) + V(1) / SS.Count
% |( d1 r5 }% i; ^- F+ W/ k+ m - Next
& P, h/ Y7 n9 u1 N; S - End If6 ~% A( H/ Q+ T3 I: c9 S7 [* ~: r
- '重定义动态数组下标2 v$ N5 }! |' |8 x N* Z) ?
- ReDim A(SS.Count - 1, 1)* ?, ~9 R7 O) w( v1 d1 Q6 J
- For I = 0 To SS.Count - 1
" y+ L4 W/ p( z - '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号) v$ j6 d0 c1 o' ^$ _: z2 X# r
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)* H! _, [# Z5 |
- A(I, 1) = I
; ]- ^# f2 J' X* d) P% O# X0 V - Next
! N3 W$ S2 |3 N) r# D" u2 x6 | - '按角度从大到小的顺序排序4 C4 h9 f+ r( Q, M5 z* I4 x; Z4 C
- For I = 0 To SS.Count - 2
$ B+ ~: @7 U) O1 `1 Y6 O0 e6 { - For J = I + 1 To SS.Count - 1# _+ e2 A6 B3 Q3 x9 n7 Z
- If A(J, 0) > A(I, 0) Then. O- ^$ m" k( `, ]7 K9 ^( S/ [
- D = A(J, 0)
, N3 i3 B5 V. w* A- @ - A(J, 0) = A(I, 0)% A6 Z* j/ \. Q$ k1 b
- A(I, 0) = D& N6 ]4 d2 w& B. A* \% _% z+ m: K
- D = A(J, 1)% ?4 ` G- W# I
- A(J, 1) = A(I, 1)
% D& g t2 m2 ^ y& }5 w- M( `7 w - A(I, 1) = D' Z! ^$ L" N2 j5 X* I
- End If/ f* n! |: B; t. n. F' c
- Next" c# T* H5 O4 G5 w/ D* T$ s
- Next
+ C1 J( k/ m! S - '替换7 v5 s; S% a, ~/ a& i3 y
- For I = 0 To SS.Count - 1
. `8 ]9 g& ]+ }& I& o) b6 F - SS(A(I, 1)).TextString = I + 1. V$ Z9 p. k" {# X3 E4 q* t
- Next5 z- v0 e V& u6 E! w& v; D
- End If! ?0 k4 d7 ^6 I; u
- End If9 p6 D1 }$ _/ M3 z) N4 b G
- '删除用过的选择集
2 A, F- P2 Y6 ~- u; B- ^% G - SS.Delete
' G ?" Q4 E: I% q0 c) M6 Q - End With
复制代码 |
|