|
|
发表于 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 Double8 K) c# \- D3 ?! z* r& L. r
- On Error Resume Next
, v8 k6 K, |; t5 q5 T - With ThisDrawing8 O$ y7 c# C9 `2 k# R
- '创建选择集,用于选择所有文字对象 R! _4 D8 h+ m$ E
- Set SS = .SelectionSets.Add("SS"); t# }" q5 ?, N; r9 j3 U
- '定义过滤器为选择单行文字对象
, Q4 X4 }. f; f; D) Z - Ft(0) = 0; D# t# U- J8 S; k3 ~: v, T
- Fd(0) = "TEXT"
+ w G j# \0 y+ k" f8 A2 Y - '选择所有单行文字对象
' d3 J7 M& y( D - SS.Select acSelectionSetAll, , , Ft, Fd
8 S( P1 @$ s+ x# W( `- C) {$ W - '当存在单行文字对象时排序和替换
; l9 O+ k$ L" P/ f ~ - If SS.Count > 0 Then
2 \+ e, l, @; E2 L- d) g - '由用户在屏幕上指定中心点& k) E) a/ u2 n( M9 }
- V = .Utility.GetPoint(, "指定中心点<默认>:"), [/ s) r2 N" _9 I7 {4 u v+ e
- '如果用户没有取消则排序和替换) Q) n; T3 Q) R$ U9 g9 a
- If Err <> -2147352567 Then/ A+ |* p" L' u3 W5 w" u6 N0 a$ x
- '用户指定了点
9 r3 C/ L5 E! ^- f0 Z - If Err = 0 Then6 V' C* t2 p% h* ~+ Z: @- ]
- P(0) = V(0)
3 g7 R1 ]+ p# h# i0 Y - P(1) = V(1)/ @2 C; W( H' t1 b5 P: F. _
- '用户选择了默认
2 z+ S: y7 h( k& i - Else
1 x+ H% H& l" k4 I/ t/ O3 v - '计算所有单行文字的几何中心 X+ C% E b$ E' f8 n( o6 r; n" h
- For I = 0 To SS.Count - 1: {* r" q: Q& @/ s5 p
- V = SS(I).InsertionPoint
: G6 q1 X' W m4 M2 c0 f# C' Z - P(0) = P(0) + V(0) / SS.Count4 t3 P h. T$ I' g N R
- P(1) = P(1) + V(1) / SS.Count, e: A/ U7 L. o1 v( K
- Next
+ Q5 C! ~3 u5 t. ] - End If5 T0 J( d9 ^% G" j
- '重定义动态数组下标* ]8 U! H, B) _4 n! \$ L
- ReDim A(SS.Count - 1, 1)
* Z1 x+ V) k( q$ E6 }* F - For I = 0 To SS.Count - 11 g3 @) N/ g6 e" o9 T9 p8 H) i; _+ ^
- '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号, G% p( f6 ?& [6 m D- b
- A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
: r7 A9 S: ~+ Y8 H: R. h - A(I, 1) = I
! f5 c+ w- ?2 z/ n1 k1 G9 H - Next7 s9 P9 ?6 \7 K5 r
- '按角度从大到小的顺序排序9 ^8 \3 O- }! U3 E) h
- For I = 0 To SS.Count - 2
, q3 ?5 }% n1 x4 I5 Q: B: s4 Q& z4 J - For J = I + 1 To SS.Count - 1
4 A2 W) t4 |. C! m - If A(J, 0) > A(I, 0) Then4 b$ Y5 t7 e1 _, {
- D = A(J, 0)
; n% L9 C7 V8 s- N' D4 W - A(J, 0) = A(I, 0)
/ [# h @- H* D' |8 {! r0 w - A(I, 0) = D
0 m5 s* I+ V' k V o+ H G- G9 B - D = A(J, 1)
: Q5 O( t+ I' R. z - A(J, 1) = A(I, 1)
7 L/ `* M) K' t2 b' s - A(I, 1) = D& g5 F |) f m5 U, u
- End If5 v. U. W$ D8 ^; V2 u6 z% C; l9 _
- Next! d5 Y2 W* ^/ X0 e7 y' u/ j
- Next
8 t: f- }$ \3 e; z) K9 y - '替换* J- w( [6 m* ?4 S {3 S1 { g- |
- For I = 0 To SS.Count - 1
2 ?- }- F& B" o5 ?6 m# e4 _* J - SS(A(I, 1)).TextString = I + 1. T: g5 x7 l4 r, e$ n4 |2 a8 E
- Next
$ G& `$ z# k$ B6 \ - End If
# v) {; x/ w! o9 x - End If( z) r' r5 T: n! G3 J
- '删除用过的选择集0 ~( `3 q8 }8 ]$ [
- SS.Delete7 G7 }- Q# k. F: ]/ u8 U5 x6 `
- End With
复制代码 |
|