QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
4天前
查看: 3772|回复: 6
收起左侧

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
4 L$ E- J4 h0 k  F/ F. F功能:
5 d4 B3 m5 k/ d3 h( O1.查找-替换
' O4 }8 f9 |* _2.加编号排序
7 A  F8 e- z) y1 s$ e, [2我不知道咋怎?' N; M. g( B. d6 i3 Y
" T" f9 }! r% H. @$ g- r
             文字         文字                                             文字02           文字03# C7 e6 Q; m+ @$ n0 J
. w" J7 U  ]6 J
文字                              文字    ----------------  文字01                                文字04# Z7 _' E  q' \6 r$ u
            文字                                                                文字06
0 |5 Y5 y5 J- [' Y5 B6 G. Y                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:9 I9 ~% k4 Q0 W
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
9 W5 T: m( |' N, x6 z下面的代码仅供参考
  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
    - z7 `' E# c% f2 S9 ?9 w# J
  2.     With ThisDrawing8 V. N% j. I/ W3 m+ a
  3.         '创建选择集,用于选择所有文字对象
    - ~4 k- g+ C% g2 S0 y2 N
  4.         Set SS = .SelectionSets.Add("SS")/ x/ P" m3 _9 h
  5.         '定义过滤器为选择单行文字对象
    % K$ |8 ~2 X' k; q9 b
  6.         Ft(0) = 0
    9 y; E! h3 C3 {2 C8 {8 V
  7.         Fd(0) = "TEXT"
    - J0 |% T2 }: L8 p- {. K
  8.         '选择所有单行文字对象
      e2 Y1 S( M& L6 m/ g/ v& w( Q. x) ?
  9.         SS.Select acSelectionSetAll, , , Ft, Fd- |0 e" D, |% q" Y$ B% h# a
  10.         '当存在单行文字对象时排序和替换
    8 C* J7 q5 `! n
  11.         If SS.Count > 0 Then
    4 ]5 C" P: q* _0 S
  12.             '计算所有单行文字的几何中心
    1 {; M; y! _( _$ K
  13.             For I = 0 To SS.Count - 1
    " a# D2 G4 z8 L* I
  14.                 V = SS(I).InsertionPoint
    - |+ G" V+ x, c% Z7 Z
  15.                 P(0) = P(0) + V(0) / SS.Count) r: G- N6 X  t' f5 Y" E
  16.                 P(1) = P(1) + V(1) / SS.Count, _$ i" ~  P) V
  17.             Next
    : j; T! E+ p( O. k/ ]8 F- D  F' ?
  18.             '重定义动态数组下标: I1 D- V. o) Q% i
  19.             ReDim A(SS.Count - 1, 1): h; f0 p3 E' a; a+ b( o3 |" |$ G
  20.             For I = 0 To SS.Count - 1+ ?) b' i( K" `% {# q" G
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    6 P# ^) Z# @: }0 G! E. e0 p& M+ B
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)8 \8 B! ^: J- J( b7 H
  23.                 A(I, 1) = I& K, c9 z7 S: h1 P8 t9 ~2 |2 v( l
  24.             Next
    " h( ^( D9 M: _
  25.             '按角度从大到小的顺序排序% L) x6 c8 x7 M  ^, k# D, E
  26.             For I = 0 To SS.Count - 2) f% E* c( ]9 ^3 j$ f" n9 @
  27.                 For J = I + 1 To SS.Count - 1& y" G; i1 P) z/ N
  28.                     If A(J, 0) > A(I, 0) Then
    + d* o8 _$ j8 n4 `' s8 i' u& l
  29.                         D = A(J, 0)
    9 q, g1 J0 P  q/ t4 c
  30.                         A(J, 0) = A(I, 0)- X7 [1 t0 b& \. a4 m
  31.                         A(I, 0) = D
    % M* ]5 i* J8 X3 a: P
  32.                         D = A(J, 1)
    ' M$ z- s3 \& D0 ~& ]
  33.                         A(J, 1) = A(I, 1)1 ^: s# |  J3 [1 P
  34.                         A(I, 1) = D
    0 ^( S( }, g# y: z8 k. S, _+ h
  35.                     End If
    " z" [' N+ f0 C. a: V/ E; i" x" S* [
  36.                 Next3 L8 ?, {. h- h# p0 U! H; p
  37.             Next1 h0 E- |; K4 a1 h
  38.             '替换
    . B% R8 M! I  n2 j5 |  T
  39.             For I = 0 To SS.Count - 1' i& E5 j7 \0 \9 ]
  40.                 SS(A(I, 1)).TextString = I + 1
    1 ]1 C1 Y, m, J# L7 l1 G: c/ M% n
  41.             Next
    3 [4 Y/ Q! D: R9 n" v) S
  42.         End If
    0 n& ?; q* j4 M. N/ d5 z4 e
  43.         '删除用过的选择集, A7 B& {. V5 Q& g! J: A. ]
  44.         SS.Delete
    4 A4 J) N& L& T* r0 T6 Y
  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 Double( w9 L% O1 D" W; i$ n
  2.     On Error Resume Next( I: f7 @+ D( p/ W" G* F
  3.     With ThisDrawing
    2 U' e' |7 g$ X, Y7 p
  4.         '创建选择集,用于选择所有文字对象$ N, `6 d( P7 ^* x
  5.         Set SS = .SelectionSets.Add("SS")! r' m4 q3 q5 n; |1 A
  6.         '定义过滤器为选择单行文字对象
    9 m2 A& g9 I- R3 W0 h1 Z
  7.         Ft(0) = 0" [: j  x& }/ Z7 n& p% A# z
  8.         Fd(0) = "TEXT"
    % ~. M1 |& B) R  Y% Y6 Y8 q
  9.         '选择所有单行文字对象
    * g+ A( l1 j4 ?9 P$ X! K1 M$ t
  10.         SS.Select acSelectionSetAll, , , Ft, Fd( H# B9 A' R: {
  11.         '当存在单行文字对象时排序和替换
    6 _6 H, V( Y7 M+ G( s/ N
  12.         If SS.Count > 0 Then
    ' f7 w3 E! s6 b# a7 G) j: I( {2 ~9 y
  13.             '由用户在屏幕上指定中心点" A* ~- {& a+ M+ @+ U5 y% Y  p
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")9 Q8 q# B4 r5 K& h) H6 W
  15.             '如果用户没有取消则排序和替换
    / T. M- t) ?# r5 e1 n( b
  16.             If Err <> -2147352567 Then" J" j9 E! k( p* w
  17.                 '用户指定了点
    ' M: a2 ^" k9 `
  18.                 If Err = 0 Then! H, d- W4 C2 V" |% J' s! i
  19.                     P(0) = V(0)
    , x' ^' D6 D2 A* Q1 J
  20.                     P(1) = V(1)
      U) Q1 ~. U9 p' @' Q; `9 A* j
  21.                 '用户选择了默认+ X, v+ V- E8 S
  22.                 Else8 r5 u& L. W! j6 Q! D$ O, B
  23.                     '计算所有单行文字的几何中心! {! r% U7 [) f. U1 G8 L4 R; K
  24.                     For I = 0 To SS.Count - 1
    # A. V% T& R) Y) D7 d! n0 c/ E
  25.                         V = SS(I).InsertionPoint0 _/ D, d5 b" r. R! \
  26.                         P(0) = P(0) + V(0) / SS.Count
    $ X. e- b2 c" W& R5 d' |
  27.                         P(1) = P(1) + V(1) / SS.Count
    % |( d1 r5 }% i; ^- F+ W/ k+ m
  28.                     Next
    & P, h/ Y7 n9 u1 N; S
  29.                 End If6 ~% A( H/ Q+ T3 I: c9 S7 [* ~: r
  30.                 '重定义动态数组下标2 v$ N5 }! |' |8 x  N* Z) ?
  31.                 ReDim A(SS.Count - 1, 1)* ?, ~9 R7 O) w( v1 d1 Q6 J
  32.                 For I = 0 To SS.Count - 1
    " y+ L4 W/ p( z
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号) v$ j6 d0 c1 o' ^$ _: z2 X# r
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)* H! _, [# Z5 |
  35.                     A(I, 1) = I
    ; ]- ^# f2 J' X* d) P% O# X0 V
  36.                 Next
    ! N3 W$ S2 |3 N) r# D" u2 x6 |
  37.                 '按角度从大到小的顺序排序4 C4 h9 f+ r( Q, M5 z* I4 x; Z4 C
  38.                 For I = 0 To SS.Count - 2
    $ B+ ~: @7 U) O1 `1 Y6 O0 e6 {
  39.                     For J = I + 1 To SS.Count - 1# _+ e2 A6 B3 Q3 x9 n7 Z
  40.                         If A(J, 0) > A(I, 0) Then. O- ^$ m" k( `, ]7 K9 ^( S/ [
  41.                             D = A(J, 0)
    , N3 i3 B5 V. w* A- @
  42.                             A(J, 0) = A(I, 0)% A6 Z* j/ \. Q$ k1 b
  43.                             A(I, 0) = D& N6 ]4 d2 w& B. A* \% _% z+ m: K
  44.                             D = A(J, 1)% ?4 `  G- W# I
  45.                             A(J, 1) = A(I, 1)
    % D& g  t2 m2 ^  y& }5 w- M( `7 w
  46.                             A(I, 1) = D' Z! ^$ L" N2 j5 X* I
  47.                         End If/ f* n! |: B; t. n. F' c
  48.                     Next" c# T* H5 O4 G5 w/ D* T$ s
  49.                 Next
    + C1 J( k/ m! S
  50.                 '替换7 v5 s; S% a, ~/ a& i3 y
  51.                 For I = 0 To SS.Count - 1
    . `8 ]9 g& ]+ }& I& o) b6 F
  52.                     SS(A(I, 1)).TextString = I + 1. V$ Z9 p. k" {# X3 E4 q* t
  53.                 Next5 z- v0 e  V& u6 E! w& v; D
  54.             End If! ?0 k4 d7 ^6 I; u
  55.         End If9 p6 D1 }$ _/ M3 z) N4 b  G
  56.         '删除用过的选择集
    2 A, F- P2 Y6 ~- u; B- ^% G
  57.         SS.Delete
    ' G  ?" Q4 E: I% q0 c) M6 Q
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia 1 _, x2 u$ K2 W+ W& Y7 {( g

) _9 b; o9 I" Z7 r; ^5 z- H* H& s能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:8 e/ t" }" M5 w% s
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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