三维网
标题:
CAD_VBA文字相对于指定点90度顺(或逆)时针加编号排序?
[打印本页]
作者:
taqqug
时间:
2011-4-14 11:10
标题:
CAD_VBA文字相对于指定点90度顺(或逆)时针加编号排序?
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按相对于指定点90度,顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
1 O5 f. b6 I9 T
功能:
4 w6 ~% n0 N/ d' g, }& C' Q
1.查找-替换
. Y0 }# C$ W8 M1 z3 n7 ~6 |
2.加编号排序
7 b% [2 P. Y+ r, O8 j
2我不知道咋怎
' ]1 Q% {: {7 @. }$ E3 ]/ l
4 g3 t6 ~' v% u$ ^2 @/ ?
以前版主
woaishuijia
帮忙给过方法,但我想扩展一下功能,一直不得其解,还请大家帮忙!
作者:
woaishuijia
时间:
2011-4-19 09:54
本帖最后由 woaishuijia 于 2011-4-23 10:56 编辑
# f2 ]8 m8 }3 b
Dim SS As AcadSelectionSet, Ft(0) As Integer, Fd(0) As Variant, V As Variant, An As Double, P(2) As Double, A() As Double, I As Integer, J As Integer, D As Double, S1 As String, S2 As String
! ~1 q3 C. q6 _* w, |1 m' W6 i
On Error Resume Next
8 ^" G/ U- U" S, b. Y! [5 B `
With ThisDrawing
$ c; O- I5 a3 M P
'创建选择集,用于选择所有文字对象
o. b+ n$ u$ C! C0 g$ P
Set SS = .SelectionSets.Add("SS"
8 I6 }6 g" E) M
'定义过滤器为选择单行文字对象
8 Y; k6 I; f8 w& v u7 O% \# u* o
Ft(0) = 0
& ]1 m' Z! x1 J( ^2 w( B! p: `
Fd(0) = "TEXT"
- [- y, \# [* N# X! i
'选择所有单行文字对象
; ^) \) S w4 J3 {& T
SS.Select acSelectionSetAll, , , Ft, Fd
) J) c, V; K8 x- ^. ?/ s
'当存在单行文字对象时排序和替换
, T2 ]2 C1 k0 d, u2 H( A
If SS.Count > 0 Then
$ p3 j. w! ^4 G7 S& {! d: p7 \
'如果只有一个文字对象,则修改其为原字符串+1
' O+ R! w! n. l
'如果有多个文字对象,则由用户指定中心点,起始角度和方向并修改文字
! P5 |( e3 S( H& z- P
If SS.Count = 1 Then
# Z3 a, `& e. d) x& [* ^# T9 L1 x
SS.Item(0).TextString = SS.Item(0).TextString & 1
" X" d/ b3 H0 K6 T, r% |
Else
# t8 U6 m3 C, d U
'由用户在屏幕上指定中心点
6 c+ [5 q& h, {5 J
V = .Utility.GetPoint(, "指定中心点或 <计算所有单行文字的几何中心点>:"
( S* j8 o8 i* }1 N" X; _
'如果用户没有取消则排序和修改
( s. ], h1 m \5 |
If Err <> -2147352567 Then
+ w5 a, B( g l- r i9 k7 D; Q# V( o
If Err = 0 Then
, `8 D4 q! h) E" h# V
'用户指定了点
5 O! n- F0 j" e) p. y" O3 V
P(0) = V(0)
g7 [& H: O2 M, y; @9 h0 n
P(1) = V(1)
3 x; D" w3 d$ b4 ^
Else
4 v& r- e, ]( b$ b
'用户选择了计算所有单行文字的几何中心点
- ?. j4 W8 f# N* F1 h' c9 r4 [% n
For I = 0 To SS.Count - 1
0 c" x+ e% g3 Q& J) [
V = SS(I).InsertionPoint
4 w' j9 [1 P% Z" H" o" i
P(0) = P(0) + V(0) / SS.Count
0 I# P( P, p, D0 O0 S# i1 _
P(1) = P(1) + V(1) / SS.Count
' O2 p! F# l6 b6 L( H' L
Next
1 h# ?& X) u+ O- @2 k
End If
q/ G6 R! f6 k* l0 r U0 [
'指定起始角度和方向等参数
; B; n( A9 b2 E2 Q
Do
. y+ Z) f1 }! K. f% d" N
Err.Clear
# q7 Y! v% T8 L3 J7 ~. M
An = 0
3 z& J& k& q& C; e! z
'定义关键字
1 i6 m8 U) ]5 O
.Utility.InitializeUserInput 0, "D"
0 j6 Q- N2 K. P
'由用户在屏幕上指定起始角度或选项
' o0 ^) p# O) N! q/ Y6 }/ f( G
An = .Utility.GetAngle(P, "指定起始角度或 [方向(D)] <0>:"
5 @/ f+ S* Q P7 r: p
'如果用户指定了角度或取消则退出循环向下进行
5 W4 E7 E! H9 Y2 u5 {* L* i6 d$ f
'如果用户输入了关键字
( I! F6 i" b1 e. Q9 z9 ^
If Err = -2145320928 Then
' \2 O, @8 T; d* L& y: g
'获得用户输入的关键字
2 a/ P z7 @9 Y0 d1 ~3 C# @+ A! u
S1 = .Utility.GetInput
4 M6 D- X3 R+ g0 _1 A. X: R& l
'如果关键字为空说明是用户直接回车,则确定起始角度为0度并退出循环向下进行
/ C8 U- l4 w! l- m
'如果关键字为"D"说明用户选择了"方向(D)"选项
, e" C+ U; D7 w0 v
If S1 = "D" Then
. S( \; p5 t" x
Err.Clear
: y* i# t& K( A0 ^7 v- I. z
'再次定义关键字
: _( C0 T4 U; t% l3 ?
.Utility.InitializeUserInput 0, "L R"
* q. ~3 j+ C( R! V& e' Q8 t+ `. [
'由用户在屏幕上选择选项
# p: X# ?1 y: w5 `. n' `9 i1 X# B
S2 = .Utility.GetKeyword("指定方向 [逆时针(L)/顺时针(R)] <L>:"
$ i' R$ |- p8 s' D
'把起始角度改为负数,使其不能满足结束循环的条件,返回重新指定角度
: c$ V4 v. b2 H, K' T Y) I: S
An = -1
9 b; `2 e" j5 Z' D* \% c/ e x
End If
/ J) j& }' S/ [# D. b1 b/ ^
End If
I$ z( Y5 Z8 j) r6 X; Z+ P
Loop Until Err = -2147352567 Or An >= 0
5 r, ]& e/ Q4 W m9 v: }9 F ` p
'如果用户没有取消则排序和修改
4 U8 ?" P) W6 O) T4 N0 O
If Err <> -2147352567 Then
" B. Z$ A- A' e* q* t: w2 J
'重定义动态数组下标
9 _( G; T5 T' {& Q' A
ReDim A(SS.Count - 1, 1)
. h( [8 a& P T7 `% a- P7 y
For I = 0 To SS.Count - 1
4 u! H. } Q' @; n1 D& q! R
'计算所有单行文字对象相对于中心点的角度再减去起始角度的差,并记录其在选择集中的索引号
2 H( A: k2 _7 h' |$ o: s8 v
A(I, 0) = .Utility.AngleToReal(.Utility.AngleFromXAxis(P, SS.Item(I).InsertionPoint) - An, acRadians)
$ i! s3 V! q q) M8 Y
A(I, 1) = I
7 D" `# ]* n9 [ ]
Next
) e" {* O% A" Z2 n5 j1 p4 s
'按相对角度从小到大的顺序排序
7 } G4 t- C4 O, g
For I = 0 To SS.Count - 2
3 J' S+ P3 g% H5 z# ^: e9 O; t5 [
For J = I + 1 To SS.Count - 1
0 P7 o7 I+ u" @; w9 R7 z( Q4 |
If A(J, 0) < A(I, 0) Then
6 k3 H& \% W0 z q8 e
D = A(J, 0)
3 b9 k; U$ f0 o% P2 F% x
A(J, 0) = A(I, 0)
1 M5 W( d$ a1 V; e
A(I, 0) = D
0 V4 e6 M9 O& f
D = A(J, 1)
( } x1 k+ q$ n% X
A(J, 1) = A(I, 1)
& f' ~% R- ~9 ^: z
A(I, 1) = D
& \4 w, T# n: p+ J: M" k9 O" c$ t! p
End If
6 J c. L3 H& S8 {+ \3 D4 S
Next
7 _6 f% @6 e! }
Next
8 r) Y! D3 j& d" y d! k
'修改文字
3 x2 ], u& Y% W. P, D' b
If S2 = "R" Then
2 R& P8 q4 X7 V" I$ D6 ?
'顺时针
% X9 x$ P6 w4 B6 P, U1 c
For I = 0 To SS.Count - 1
S" J) M3 [' N# z
SS.Item(A(I, 1)).TextString = SS.Item(A(I, 1)).TextString & SS.Count - I
v4 k) V5 l( N u5 W
Next
! \& P1 B1 |/ X# r% F, x
Else
1 D9 T8 x3 x, V2 w. e
'逆时针
2 } b l# s2 t3 }
For I = 0 To SS.Count - 1
4 Y# X$ r7 k" A! r$ a
SS.Item(A(I, 1)).TextString = SS.Item(A(I, 1)).TextString & (I + 1)
& \! s/ t" P/ Q) B C
Next
: g1 r. D% Y+ b4 D7 c+ j) E
End If
: O$ y5 D, ~0 C) ~7 c" i! P2 [
End If
3 M. z! l4 F' Q. c1 q# E% c
End If
- M" _- d/ ?6 Z- N% w( _* O; M
End If
0 n* O" t% S! n* A& r5 S$ `
End If
. }- A! c, k' u9 } r7 r7 [- ?3 A
'删除用过的选择集
) v* `. M: P( [0 d: _3 S3 L
SS.Delete
/ P. H' T" C" I d# f7 C
End With
复制代码
作者:
taqqug
时间:
2011-4-22 14:11
谢谢版主,后来我用了另一个方法也能达到这个效果,我将所有选择的文件相对于用户指定的中心点旋转90度,排序后再转回来就行了。方法简单些,但没版主的灵活,呵呵
欢迎光临 三维网 (http://www.3dportal.cn/discuz/)
Powered by Discuz! X3.4