|
|
发表于 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
) F& i3 ?/ Y& g! d3 Z - On Error Resume Next
z. @& F, x: j$ v/ D9 s - With ThisDrawing
2 _4 Y# q- x7 u - '创建选择集,用于选择所有文字对象% q# q# P( X- \& h
- Set SS = .SelectionSets.Add("SS")
, f) Q; n, C' a+ Q5 b; b* b9 X* y6 a - '定义过滤器为选择单行文字对象
# q" Q- D8 O+ e I: r Y - Ft(0) = 0
* q9 u1 `% d8 u2 y2 M - Fd(0) = "TEXT"
9 V6 B' B$ Q; C0 u - '选择所有单行文字对象# u- U; s, E! v C9 O* ]
- SS.Select acSelectionSetAll, , , Ft, Fd5 K+ {$ ^* M2 C# i
- '当存在单行文字对象时排序和替换0 q* j; X8 p4 d ?
- If SS.Count > 0 Then+ M2 z' j* j, k. k T5 D( t5 Z) g
- '由用户在屏幕上指定中心点
) v' N6 p- C7 P3 n) c - V = .Utility.GetPoint(, "指定中心点<默认>:")/ _6 q( i; W- q$ N8 z3 H; J
- '如果用户没有取消则排序和替换
. @- t7 _1 c- X& \, I - If Err <> -2147352567 Then ~. o1 i( @5 T/ w/ I* s0 V5 Z& p
- '用户指定了点
3 h3 i/ P4 ^0 C: J0 \ D - If Err = 0 Then
p; Y$ ]( K0 n% f - P(0) = V(0)% G+ ^1 i. a5 a0 h4 G6 I; B T2 D' }
- P(1) = V(1)
T. d/ _- f% a$ R7 D m - '用户选择了默认5 F3 b2 `$ f# W; [- K& T4 }
- Else
, @2 ^- X0 J& y0 `( x5 `. k - '计算所有单行文字的几何中心1 q0 W1 ]! s4 H$ w" P) U8 x, p8 ]7 @
- For I = 0 To SS.Count - 1# A1 I; H4 r, d% \
- V = SS(I).InsertionPoint
( A0 G" A% Q/ G' Q1 q% P2 A0 K - P(0) = P(0) + V(0) / SS.Count
: `" h, F/ A0 @ - P(1) = P(1) + V(1) / SS.Count9 V# \' x/ p' O" t# ]5 T
- Next
4 V7 h& K) D4 D9 n0 g3 K9 b2 w, c2 {/ h - End If
) Y$ t1 y- y( y5 o; O8 z - '重定义动态数组下标6 y0 W/ o5 [/ P8 g+ C5 i3 M4 ^
- ReDim A(SS.Count - 1, 1)! l+ f& t5 H. U/ }- N
- For I = 0 To SS.Count - 1
- O% |, q0 R/ z7 }$ M. p0 X - '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号' c3 G, G: ~/ m4 {) z
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)6 l8 E" F3 |- w
- A(I, 1) = I/ c6 u# V9 M4 X1 w+ u2 T* f6 q
- Next" M3 _9 J+ j$ t* A5 W9 M8 ~( ~
- '按角度从大到小的顺序排序
& \ w, Y+ j' e4 T - For I = 0 To SS.Count - 2 |- z8 n. U( c/ P3 |' t+ Z5 `
- For J = I + 1 To SS.Count - 1# L) \( \1 y5 A, Z4 K7 @% U
- If A(J, 0) > A(I, 0) Then
6 N3 ~0 M, X, @3 j- z( A8 U: I' n - D = A(J, 0)8 q- b- r; ]* m/ ]2 g3 _
- A(J, 0) = A(I, 0)/ v4 a) m, W3 x: N0 O7 A8 h4 O* F
- A(I, 0) = D1 U* V9 P* N- r+ b( b, {8 ~
- D = A(J, 1)
2 K. H" M/ ]3 I - A(J, 1) = A(I, 1)
; S I& k& b4 p, R. ]3 M- }' i4 ?5 F - A(I, 1) = D$ A, t, b; W: Y9 f" S
- End If
9 b9 D$ n6 |! W2 v- p7 O - Next
/ M# ^9 s6 W, c4 W" s, v - Next6 g% x! p/ F/ Q$ d" l
- '替换 J# M) ]4 u" H6 a8 D( x
- For I = 0 To SS.Count - 16 W8 T0 O& \$ ]6 f
- SS(A(I, 1)).TextString = I + 1
9 B& @3 M# E" b% L& |9 o% L9 d - Next
, Z% y+ \3 H& u4 k" Y! N/ `- t - End If+ T1 [0 Z" A# h$ E7 @0 B8 [
- End If4 j9 r# |1 B, P& L
- '删除用过的选择集9 }) T9 G: C" v. _
- SS.Delete7 q- M6 |7 k, A
- End With
复制代码 |
|