QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3762|回复: 6
收起左侧

[已答复] CAD_VBA怎样文字查找替换并排序?

[复制链接]
发表于 2011-3-24 21:10:33 | 显示全部楼层 |阅读模式 来自: 中国浙江杭州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图), T& a9 L4 O6 l6 `) d6 o
功能:( I3 O$ v# ?, S; i. l+ N3 _2 ]5 J( H
1.查找-替换3 j- v( r7 R8 x0 @7 Z" Q. @
2.加编号排序
. n7 e' B$ b# p/ G5 P+ x: R2我不知道咋怎?
/ A! W- H. v; @' ~! B& H/ ~' [* w! Y3 ^0 U1 E  `7 U) t6 E: j
             文字         文字                                             文字02           文字03( i, `1 I* k8 `* {
. g' v8 b( M: x% Q* E
文字                              文字    ----------------  文字01                                文字04* a/ \0 C" L+ L. a! h
            文字                                                                文字068 x2 D6 M% s% }$ Q; q
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:" Y4 P% P  a8 ?6 {
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.6 w# }: l- ]$ l% h" J
下面的代码仅供参考
  1.     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( s! X  K  O1 O4 `& D9 i2 F) @
  2.     With ThisDrawing
      t. Q8 z+ e' Z+ {/ Q# a. a! B
  3.         '创建选择集,用于选择所有文字对象+ l! q4 W5 l  D
  4.         Set SS = .SelectionSets.Add("SS")
    ! c3 H  }1 X9 R% L. G2 F" a3 t& Y
  5.         '定义过滤器为选择单行文字对象
    ' ^9 y6 `" \' C  u1 y! W
  6.         Ft(0) = 0: r: N% j# F6 ?9 m. ?
  7.         Fd(0) = "TEXT"! v- g0 V6 {1 M- n, @6 c- o
  8.         '选择所有单行文字对象3 g6 Q! U* f2 o7 Y; Z) ]
  9.         SS.Select acSelectionSetAll, , , Ft, Fd) v, X* `# h$ j
  10.         '当存在单行文字对象时排序和替换
    2 f! _! f/ U/ ~5 A6 p& \
  11.         If SS.Count > 0 Then
    - q7 R7 J7 n2 i7 @, E
  12.             '计算所有单行文字的几何中心
    3 d' |0 G, z9 A! t" f3 ?2 p
  13.             For I = 0 To SS.Count - 11 e2 N$ U. v. E
  14.                 V = SS(I).InsertionPoint
    - Z2 Q3 p* Y' ?& X
  15.                 P(0) = P(0) + V(0) / SS.Count
    % _/ a1 Z- \1 _" x0 s  ^# e/ f7 \
  16.                 P(1) = P(1) + V(1) / SS.Count% j: x$ v6 F# S. Q/ h- T: ^/ K/ M
  17.             Next
    : `4 z) `! z6 m: D
  18.             '重定义动态数组下标+ `( x, S6 c: s( m
  19.             ReDim A(SS.Count - 1, 1)
    ) ]) ]" I9 P# b( Z# V% w
  20.             For I = 0 To SS.Count - 1) c$ l0 |: j, a. u3 O" N- g7 e
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号7 P( }# S6 A* ~0 }0 x& s1 h: P
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)6 m( \! ]& T; g
  23.                 A(I, 1) = I
    5 r" b8 K# L- D" I
  24.             Next, a! ?+ u" @* a, W. }" }
  25.             '按角度从大到小的顺序排序! I/ i2 J# _9 _
  26.             For I = 0 To SS.Count - 2
    : }( S0 C0 I+ x& _3 U+ S# V
  27.                 For J = I + 1 To SS.Count - 1
    , l: _$ @: x& z" E7 ?
  28.                     If A(J, 0) > A(I, 0) Then
    ! f' ~/ x6 E( G- s+ g
  29.                         D = A(J, 0)9 w3 f/ G' x, N( O
  30.                         A(J, 0) = A(I, 0)6 r/ D5 c) ], z, G$ `% Z+ G
  31.                         A(I, 0) = D5 M) {5 f- O' w
  32.                         D = A(J, 1)
      L  R& l* [" a- f
  33.                         A(J, 1) = A(I, 1)
    6 A3 q$ j% b+ V2 |& N+ K: v
  34.                         A(I, 1) = D7 ^2 P) X0 p+ O! {
  35.                     End If
    2 m/ P; S, [" l
  36.                 Next8 l) N: U8 n# J
  37.             Next
    ; P6 Z! v2 _7 h7 W
  38.             '替换
    0 P" Q2 x, D" Z- a
  39.             For I = 0 To SS.Count - 1; b  O% r6 v( }3 B/ c+ x9 I+ W4 w- x
  40.                 SS(A(I, 1)).TextString = I + 1- g% z" |+ B4 I5 |$ ^
  41.             Next
    4 j" j9 O7 ]6 R! b+ Q' N: [7 c' B
  42.         End If
    6 x7 |1 N: B& G  H& Q1 o* h4 c
  43.         '删除用过的选择集( b. f9 R! E4 X8 C7 q0 f8 B
  44.         SS.Delete
    9 s# ]! Z  S% M9 A/ U' }
  45.     End With
复制代码
 楼主| 发表于 2011-3-25 10:25:55 | 显示全部楼层 来自: 中国江苏无锡
woaishuijia  你这个思路太好了,我用坐标比较,整了半天没整好,非常感谢!
发表于 2011-3-25 12:23:08 | 显示全部楼层 来自: 中国辽宁
我又想了一下,只用加总平均的办法计算中心点未免有点太单一了.如果增加一个选项,由用户在屏幕上指定中心点会更好些
  1.     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 Double2 o1 c: c  L( M
  2.     On Error Resume Next& _5 }9 }# l$ L
  3.     With ThisDrawing% R4 ~. I; Y/ U) K9 Y% T7 ?, W5 V
  4.         '创建选择集,用于选择所有文字对象1 ?: p; I# c% V, b7 n' @/ u
  5.         Set SS = .SelectionSets.Add("SS")4 _& g3 m) ]' U8 }
  6.         '定义过滤器为选择单行文字对象
    # l! a* A7 ]6 T) A; z3 x0 g
  7.         Ft(0) = 0
    9 B+ m, F' q% o( c
  8.         Fd(0) = "TEXT"( i2 G, R8 T  f; c
  9.         '选择所有单行文字对象
    : C; b; h: U7 ]+ {7 P- E6 o
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    * N( O" x" j$ q8 h' Z
  11.         '当存在单行文字对象时排序和替换/ L7 F4 R2 n2 S
  12.         If SS.Count > 0 Then5 p4 d8 q, `, Z, ^/ l) @
  13.             '由用户在屏幕上指定中心点0 J0 [5 w$ E, e8 m0 M; A, o
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")! `+ s5 y, v- z% m) X. p) R
  15.             '如果用户没有取消则排序和替换0 d, Z5 M. X( k  v" O9 H/ l0 U3 O( b
  16.             If Err <> -2147352567 Then
    : B( L0 E; M  P
  17.                 '用户指定了点  W3 Y- W! p7 a# f
  18.                 If Err = 0 Then+ {$ }5 U+ n  K/ x( M
  19.                     P(0) = V(0)
    . l. x2 z" g7 T) b7 H5 u4 @8 v
  20.                     P(1) = V(1)
    3 h! K* U8 f% e: L' e
  21.                 '用户选择了默认
    - P. _& b5 l4 c3 ^8 Q4 F
  22.                 Else+ U9 j1 `# G9 `% @+ K: j5 f
  23.                     '计算所有单行文字的几何中心
    , c/ C( Q) d- k: W
  24.                     For I = 0 To SS.Count - 1
    - c7 V' S1 N' m0 a7 q. T
  25.                         V = SS(I).InsertionPoint" V; A! F2 b0 U" d" s: e8 }% G+ |
  26.                         P(0) = P(0) + V(0) / SS.Count
    $ R' n5 Q6 R7 B  O5 U2 y  H/ {
  27.                         P(1) = P(1) + V(1) / SS.Count% G- \+ s4 |( D
  28.                     Next1 c+ G8 o$ \2 C2 R$ g) G
  29.                 End If4 }4 \/ ^+ {, _) ?. t
  30.                 '重定义动态数组下标
    ) ~9 n8 d  T2 X' |$ x. V' s
  31.                 ReDim A(SS.Count - 1, 1): M; `* c4 _6 n: P2 \" Z7 i; p
  32.                 For I = 0 To SS.Count - 10 e6 j( k! ], t6 @
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号* Z" I6 ^& h; z8 c( r
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    0 n2 A. |& J6 i6 U2 j, _) P0 }
  35.                     A(I, 1) = I1 m! L$ N. w: W3 V7 C
  36.                 Next7 a: S" a6 R# n" s. U: ^/ ?
  37.                 '按角度从大到小的顺序排序; r% @1 s, ]8 O4 ~  w
  38.                 For I = 0 To SS.Count - 25 k1 O" R% ~7 ~: e
  39.                     For J = I + 1 To SS.Count - 1
    9 i1 T: v/ i2 Y* h
  40.                         If A(J, 0) > A(I, 0) Then# _/ `: H1 l: ^. y6 L% m
  41.                             D = A(J, 0)
      E0 a" u/ a2 _: t: F- A8 T) @
  42.                             A(J, 0) = A(I, 0)
    $ K5 o& [: w9 a; m
  43.                             A(I, 0) = D7 m: F4 j/ R9 Z( U1 K( B, _  E
  44.                             D = A(J, 1)
    0 \9 F5 _. M, ~" S7 X
  45.                             A(J, 1) = A(I, 1)
    , ~. d' m! a2 t) S3 U0 J+ Y
  46.                             A(I, 1) = D
    3 d  v; {% [) i
  47.                         End If2 y; x$ [7 }3 a/ l2 B9 v
  48.                     Next9 K; k0 F! |2 z
  49.                 Next
    8 V6 X* G/ H+ L
  50.                 '替换
    2 S. ^  Y# V/ K: {7 ]' V
  51.                 For I = 0 To SS.Count - 19 p/ I% W+ s0 j- X
  52.                     SS(A(I, 1)).TextString = I + 12 f! j4 c, x! W7 s/ o2 L4 V
  53.                 Next. x) k2 N" C' p# d) Y+ X, i$ n
  54.             End If4 K& ^( }% b6 e% |
  55.         End If, r& f0 f& o6 O" H, o# j$ a
  56.         '删除用过的选择集( o9 }# h) ~, ]  J7 y$ \) P
  57.         SS.Delete3 m3 F) c0 o$ L7 ]0 H
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
7 A: s0 t3 _3 E/ x( V: d0 N4 L$ }9 A# \3 S4 I5 A( w, m
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:% i  M4 H  G/ j( a4 u9 W# k
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

快速回复 返回顶部 返回列表