QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
6 b% Q5 X  @# f/ K! T功能:
+ q7 g/ _5 L+ e4 Z9 C' V# X- F( `4 C+ u6 z1.查找-替换
7 x. R4 L$ z9 }* y  R2.加编号排序" X& V  r0 q' f0 w! H! o
2我不知道咋怎?  G! `% y5 f/ L9 O

! b# q4 a6 k! S             文字         文字                                             文字02           文字03  I" G7 d7 M, s. e% G

2 o/ c+ Y& D( M/ \% N文字                              文字    ----------------  文字01                                文字040 }$ _& s7 \- f2 Y2 \/ B/ r+ D) n6 d
            文字                                                                文字06
. b& T& R' E* Q                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:1 W2 ^' p( h9 Y6 h) X  D2 u+ @! W
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
5 E( A* I# X* u  y5 s- X下面的代码仅供参考
  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% M( O2 Q) o" p
  2.     With ThisDrawing
    + j& i" P# K2 R
  3.         '创建选择集,用于选择所有文字对象! E3 Q" v/ ]. W/ P# r+ {
  4.         Set SS = .SelectionSets.Add("SS")% }4 w+ @4 j% N- V) t! K3 B
  5.         '定义过滤器为选择单行文字对象1 G2 o( p& o: Z1 J, l# b- t/ Q
  6.         Ft(0) = 0
    : i# d6 R8 ^1 j+ J1 B- Y+ G, d; h. E9 @
  7.         Fd(0) = "TEXT"' O) V2 B3 N  W( c
  8.         '选择所有单行文字对象
    , s# z; |* Q9 h" M. t- e
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    1 F' V) D/ Y  U3 M. s& w7 h
  10.         '当存在单行文字对象时排序和替换
    4 \9 k3 M% q$ b0 B/ J
  11.         If SS.Count > 0 Then( _. m' b3 ^' R' J* `
  12.             '计算所有单行文字的几何中心
    / L7 x0 H# x, |% J3 F! H
  13.             For I = 0 To SS.Count - 13 @0 V5 y  M7 ]6 \) O
  14.                 V = SS(I).InsertionPoint  L6 ]8 n* S0 b
  15.                 P(0) = P(0) + V(0) / SS.Count
    2 N& ]) u6 D; h
  16.                 P(1) = P(1) + V(1) / SS.Count
    $ k$ O  C8 @; i# H* a) m4 |% \' r
  17.             Next& J% D. j. [. k* L/ }
  18.             '重定义动态数组下标
    " R0 h  ~0 w4 \5 y
  19.             ReDim A(SS.Count - 1, 1)
    / t- p4 e7 n$ G) Q+ V
  20.             For I = 0 To SS.Count - 1
    8 W- u1 S% t. l' c! r$ L
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    ( ?! y- N, [8 m
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)! P3 V( W. d  S0 y: O( Y6 q
  23.                 A(I, 1) = I
      e+ l3 i' s0 f/ K$ I% ^0 h' F$ r
  24.             Next
    # r" ~1 _3 a5 n; [
  25.             '按角度从大到小的顺序排序
    $ t+ b$ l7 i0 X1 z" b" j
  26.             For I = 0 To SS.Count - 2
    : q& `; Z5 G4 J
  27.                 For J = I + 1 To SS.Count - 1
    ' p. I' q+ K0 [* F
  28.                     If A(J, 0) > A(I, 0) Then1 V! A; E) Z  s% e; [& l9 k
  29.                         D = A(J, 0)
    ' l: v; {8 K$ h: [0 i
  30.                         A(J, 0) = A(I, 0)+ U5 g! ^2 ?; A) H" c4 z
  31.                         A(I, 0) = D: U5 W$ P* d# ^/ v2 [  g' _4 p$ o
  32.                         D = A(J, 1); g1 k$ ]6 a, c6 g# G- o
  33.                         A(J, 1) = A(I, 1)& {( u2 q0 ~: q0 C! \: K
  34.                         A(I, 1) = D
    " i4 j1 ], D6 a. c
  35.                     End If
    ) @& ~7 E5 `3 V& ]+ ]+ L3 Q
  36.                 Next. g8 [0 k7 R" j/ W
  37.             Next$ p: }: V; R2 |6 `" n
  38.             '替换- W- _2 w) L" I- N) u5 M  G, v
  39.             For I = 0 To SS.Count - 1+ K0 K0 R6 o% A4 E  z3 O+ x
  40.                 SS(A(I, 1)).TextString = I + 1
    / @" o  y0 d* K0 q! j9 U' ]4 a  O
  41.             Next
    ; ^5 Z0 P9 t, \6 J; ]3 m
  42.         End If/ _$ [9 I( |6 m: H' V2 c
  43.         '删除用过的选择集' ?2 S+ G/ o; b4 d. ?% a) P
  44.         SS.Delete
    5 k- e- T/ S, b3 ^
  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 Double8 |8 m; P/ W2 f" `
  2.     On Error Resume Next6 }$ a2 e- \4 n$ R& }
  3.     With ThisDrawing% g$ B. m: j6 T# n/ D
  4.         '创建选择集,用于选择所有文字对象
    - `0 f$ u: q5 O( E, T6 U
  5.         Set SS = .SelectionSets.Add("SS")2 g* D/ X, \' ]; t
  6.         '定义过滤器为选择单行文字对象; W0 Z$ X, ]# t3 C, `' x7 e; N
  7.         Ft(0) = 0
    : e3 {. _" m  Z' P* Z7 b4 Z! g! a. p
  8.         Fd(0) = "TEXT"6 I4 B6 C1 l; P+ v* F, v: z
  9.         '选择所有单行文字对象( Z, a% T+ L6 b" S5 u; i
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    8 d( i3 T9 q5 |
  11.         '当存在单行文字对象时排序和替换  r  M" p: k7 f( X, G7 T* n- e
  12.         If SS.Count > 0 Then
    ) ~# y8 E& U$ u  @1 p' H
  13.             '由用户在屏幕上指定中心点$ q' q, f- Y4 M1 n7 h$ W" Z' ]
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    ! _5 J% x+ G9 ~" K, ^6 x
  15.             '如果用户没有取消则排序和替换
    ) }6 z+ Z. z* U" h( ?
  16.             If Err <> -2147352567 Then6 [2 b; J6 v6 f: G, l  }3 J
  17.                 '用户指定了点: ^9 c, I0 {, u+ ?4 S+ p
  18.                 If Err = 0 Then) s- B2 t8 [2 L
  19.                     P(0) = V(0)
    - Z  A' H; N: N3 y  Z. @" X2 b
  20.                     P(1) = V(1)( J; L. H1 a1 O* g
  21.                 '用户选择了默认
    8 k5 d) a- k4 p0 _' E0 c8 B5 Q6 j
  22.                 Else1 G5 [/ L' q& W
  23.                     '计算所有单行文字的几何中心3 w( x; l! X$ k& N
  24.                     For I = 0 To SS.Count - 1
    . R3 Y6 {# k1 `2 I; E
  25.                         V = SS(I).InsertionPoint
    8 P6 S2 z6 x' u( C0 u
  26.                         P(0) = P(0) + V(0) / SS.Count
    6 y# E5 G( b6 E6 _; c
  27.                         P(1) = P(1) + V(1) / SS.Count
    2 ~& A7 D6 G- f% u% o
  28.                     Next
    $ v  {" v4 C' Y0 R! Y( }2 m+ o
  29.                 End If
    9 p3 n; P0 A8 P, r1 o/ b) \
  30.                 '重定义动态数组下标
    8 l0 n( ^1 B: v. B/ J
  31.                 ReDim A(SS.Count - 1, 1)
    & V1 q2 k+ s% G2 b
  32.                 For I = 0 To SS.Count - 1
    + n* |; w+ P' K; L$ `9 @9 F
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号; y6 V! j, P7 m/ ^3 M" D3 r
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)0 T0 D9 V0 p+ n3 f) c& G# u
  35.                     A(I, 1) = I; R+ V* n9 _: U. [: s
  36.                 Next
    1 k' a9 A) x6 x" ^
  37.                 '按角度从大到小的顺序排序' r, h* `7 ^% Q, i2 A% s3 D+ O- M
  38.                 For I = 0 To SS.Count - 2
    # [. w- ]# O+ ~4 f! O
  39.                     For J = I + 1 To SS.Count - 13 T# F' q0 i3 I  k& m! t
  40.                         If A(J, 0) > A(I, 0) Then. m+ q) }* V1 L  u# _0 |( d/ P
  41.                             D = A(J, 0)
    5 n. v6 p& x3 u8 H9 @8 R$ L
  42.                             A(J, 0) = A(I, 0)
    ( Q1 s2 t- D: [3 o( @8 w
  43.                             A(I, 0) = D
    $ N1 B- J$ P* z; c1 w
  44.                             D = A(J, 1)& t. l, _& y1 _; J+ O
  45.                             A(J, 1) = A(I, 1)
    : @% k8 R8 b/ K4 n
  46.                             A(I, 1) = D
    8 H1 c& [: }: j; Y: f/ [  `& q" J
  47.                         End If9 I0 N, R# ^) w
  48.                     Next# \. a* u! s- m+ Z4 ?  m# u/ [: P/ ^
  49.                 Next5 S* n! O) ?) e/ A
  50.                 '替换
    : B2 z% l$ W8 p6 X# _' j
  51.                 For I = 0 To SS.Count - 1
    / K9 h9 o5 B3 t; C/ l. L$ P1 n; Y
  52.                     SS(A(I, 1)).TextString = I + 1/ N1 |# r, h3 T, b4 r) g4 h4 ?
  53.                 Next+ p' i* ?, m7 n3 \* ?, I. }6 L
  54.             End If
    9 A& u4 O$ o6 y3 q
  55.         End If8 h. H0 I9 `- ~- C7 ~
  56.         '删除用过的选择集. d! d0 g0 y3 U/ B" ?3 u
  57.         SS.Delete9 f9 k, u9 ~  l% u- s. V$ a
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
5 J; F* i9 O, T2 y. M" ~% M
7 w- @) j0 q& E$ {6 C8 N能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
1 Z7 M8 l7 i# z8 H' O我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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