|
发表于 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 c: e6 `) c, Q; H0 g2 f3 l
- On Error Resume Next. H5 H4 c0 \ w6 L1 s! M
- With ThisDrawing/ Z9 U) ]/ W; o% K4 o6 X
- '创建选择集,用于选择所有文字对象1 w4 e4 _7 l2 u
- Set SS = .SelectionSets.Add("SS")5 Y6 j* s% o L/ F3 N
- '定义过滤器为选择单行文字对象7 I: @0 |% p. b2 z
- Ft(0) = 0
2 Z* P5 i1 O2 V - Fd(0) = "TEXT"
& q# Z7 Z8 z1 P2 F0 x- v - '选择所有单行文字对象( V6 h9 c, u% y8 i. S
- SS.Select acSelectionSetAll, , , Ft, Fd. ]- ^& Z* p# }8 [
- '当存在单行文字对象时排序和替换$ H; u! V1 V. m, R
- If SS.Count > 0 Then
; Q8 k# a# i8 a" ]0 b - '由用户在屏幕上指定中心点' K. I- p9 T2 g- R4 j- s9 V
- V = .Utility.GetPoint(, "指定中心点<默认>:")
6 V+ Q" r! m( F% `! }! H9 e - '如果用户没有取消则排序和替换
, G. v% s, @2 a3 o) W# {7 v0 ] - If Err <> -2147352567 Then
6 d! D& B0 d* k5 J* J - '用户指定了点" n4 V6 M$ x$ {% D
- If Err = 0 Then
* M9 W1 g; s: h+ _ - P(0) = V(0)
% m( r8 [5 [& B( T - P(1) = V(1)$ z$ @' U8 {; R$ G. a1 b
- '用户选择了默认 T! |1 c8 Y1 @$ ?! [/ X) @
- Else
) K) q o \# u. L1 w! k! b - '计算所有单行文字的几何中心$ O# |! H6 y8 o; q
- For I = 0 To SS.Count - 1
8 t' T0 q) v: L0 q - V = SS(I).InsertionPoint
3 _7 H) p6 P9 u5 x. { - P(0) = P(0) + V(0) / SS.Count& F% K- Z3 ?3 w7 F9 c9 X! x: q
- P(1) = P(1) + V(1) / SS.Count( t! g/ J, a1 X" {+ n- e% h
- Next
; b' l: m1 B5 \% [. ?! N - End If
" l5 h+ ~3 e2 D/ k! h" d - '重定义动态数组下标
7 _3 w0 Y) l+ _; ? - ReDim A(SS.Count - 1, 1)( l$ a0 e) J, Q% D- n* y
- For I = 0 To SS.Count - 1
7 ^/ w8 l* g$ E8 X' P1 }/ g# j% w$ h - '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
; H2 f7 O: O7 i* f - A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
2 J9 D' S+ g: }0 ^8 s. \& L( ]" B* [ - A(I, 1) = I1 w3 r n: c9 x' T! `
- Next' c/ J: h9 K8 ?8 b+ D3 d* C8 L
- '按角度从大到小的顺序排序
0 z, n6 ?; T# f9 z) u - For I = 0 To SS.Count - 29 g) `" z4 [2 J1 {: }
- For J = I + 1 To SS.Count - 1
! o6 ?0 Y6 v6 G5 a' a4 Z; G - If A(J, 0) > A(I, 0) Then
2 p- Y9 e2 c" b* x - D = A(J, 0)2 t/ u% j; v9 A* u* r2 Z, e9 m
- A(J, 0) = A(I, 0)
' v* i# v0 B. |! Z i$ i - A(I, 0) = D
2 g5 _$ d$ B O) B; D3 X - D = A(J, 1)
6 j6 Y# [4 i4 l' p/ K( c - A(J, 1) = A(I, 1)) A2 ^5 H/ u$ }2 Y0 ~2 y$ B' w
- A(I, 1) = D
8 Y2 r: R: A9 H! l# S" p# _ - End If9 o) P# @8 b0 U3 Z
- Next
& U& T7 g- P9 t" V( l - Next
3 v7 j) T. e& `& L! u - '替换
% s E3 t& H9 ~7 s c# u - For I = 0 To SS.Count - 1; l% R, L# F) |' _
- SS(A(I, 1)).TextString = I + 1
. I# k4 ~4 m! @ - Next# I& A- x" m- ^, Q$ K% I$ N7 b1 [5 ^
- End If
: e! e, \4 I+ A* {1 r; f5 g - End If
; V2 v0 b, Q+ U - '删除用过的选择集
; O5 _1 f" x4 x: X4 b3 [ - SS.Delete4 S# |% t9 i" e# S- ?
- End With
复制代码 |
|