QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)( j& }$ q& ]' O5 o# D
功能:" [9 i7 U/ K( e
1.查找-替换
/ m+ {7 s4 f1 b) f8 d2.加编号排序
2 q$ n9 T- L) e- d8 k2我不知道咋怎?
1 E1 ~- T4 z5 u6 W& y1 o2 h  h" N3 P8 B5 C
             文字         文字                                             文字02           文字03
; @9 G+ z, z" q- \: h; p+ P; Z$ D: g- s- e7 k
文字                              文字    ----------------  文字01                                文字041 M* K3 o: `3 ?# ]3 ]7 P9 s- E9 j7 _
            文字                                                                文字06
  R/ s5 b* E! I- h1 k                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:# V/ o( t- W( E) E8 c. m/ e* L) r
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
4 V/ P# o2 ?8 `9 c下面的代码仅供参考
  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
    9 n# e$ I" p3 B& G7 ]! r8 m0 l8 H, m
  2.     With ThisDrawing/ q5 g& w* v& J
  3.         '创建选择集,用于选择所有文字对象
    ; V  `5 j  c7 F+ W
  4.         Set SS = .SelectionSets.Add("SS")# h6 k+ q: Q- e! M
  5.         '定义过滤器为选择单行文字对象7 e" y# n  H( h+ R
  6.         Ft(0) = 05 D" _/ Y1 Q( `* D
  7.         Fd(0) = "TEXT"
    , g2 `. ^# H: ^8 |- Z
  8.         '选择所有单行文字对象
    8 z& Q* s, @5 {3 H2 m- C- X
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    : I9 }& ^( z6 ^. j) k7 Y% ]
  10.         '当存在单行文字对象时排序和替换
    ( _2 `0 N- j# ~+ y& B
  11.         If SS.Count > 0 Then
    " Y3 ?) R6 Y* q
  12.             '计算所有单行文字的几何中心
    ' h! u" W# q( s, ^; g; u
  13.             For I = 0 To SS.Count - 1
    + V( \3 t8 y- ?& t
  14.                 V = SS(I).InsertionPoint
    ) t/ V% {) X# t0 e+ I- [
  15.                 P(0) = P(0) + V(0) / SS.Count
    . R/ e5 c9 Q) {/ P
  16.                 P(1) = P(1) + V(1) / SS.Count
    - H6 q) E8 I& |- D+ P
  17.             Next
    0 @" Q9 I9 o7 b6 d* ~6 t% v
  18.             '重定义动态数组下标$ |3 b( C, \2 ]& V6 j
  19.             ReDim A(SS.Count - 1, 1)' h% o4 T- \+ U2 g# ^) {. Z
  20.             For I = 0 To SS.Count - 13 M' Y8 `* \; M6 s6 J' }
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    7 H8 U: j. g) L' W& {
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)2 C. Y: x- a5 Y4 y
  23.                 A(I, 1) = I
    * i* D5 l0 W5 S2 S  j
  24.             Next
    8 M) r, p- A2 j- L9 A# q
  25.             '按角度从大到小的顺序排序
    1 i7 j6 s" Z. w' B
  26.             For I = 0 To SS.Count - 2- z, w* H+ w  l; Z" G
  27.                 For J = I + 1 To SS.Count - 15 j* s+ n% g- Z3 S. h( i0 W
  28.                     If A(J, 0) > A(I, 0) Then
    % b, J0 l: K/ E  R3 `
  29.                         D = A(J, 0)7 I! `+ q. n8 X! z2 G. @' O
  30.                         A(J, 0) = A(I, 0)
    ' r. w/ t* e5 p
  31.                         A(I, 0) = D
    + d% ?! l1 C3 ^: v; {& }
  32.                         D = A(J, 1)( c7 ]. f3 @6 @9 L( v) l  Q
  33.                         A(J, 1) = A(I, 1)
    . C" g3 C) S, S  A  d' W3 W
  34.                         A(I, 1) = D* O6 P& y5 w: W5 J- q+ `
  35.                     End If8 u1 e3 B  e) E$ d# S- z
  36.                 Next
    , u5 K$ Y0 ~7 U
  37.             Next  h( {; P" m7 k1 @$ b  r5 I
  38.             '替换
    , I- ^& s+ u& Z, j
  39.             For I = 0 To SS.Count - 1
    . j% _; K  Q+ m8 J5 C5 N! q
  40.                 SS(A(I, 1)).TextString = I + 11 M! O7 u0 v/ g& p' z$ t: M- G
  41.             Next
    + r. P( E0 N3 J2 t  a' F- w
  42.         End If
    % u6 \; Y  H; S: A# b9 }& e& {* z
  43.         '删除用过的选择集
    * ?5 Y# Z! S. r- a
  44.         SS.Delete
    0 q* A" p0 R$ h6 |
  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 Double3 O- X/ s( T0 x8 G; ~( ]  S
  2.     On Error Resume Next, n! _# J8 g! l3 O- P5 J# t
  3.     With ThisDrawing
    ! `# ^& Q, K8 g7 _' Q6 u7 P
  4.         '创建选择集,用于选择所有文字对象
    7 i# C' a9 ], N7 l! E* a
  5.         Set SS = .SelectionSets.Add("SS")( v- D: v+ r2 G5 U0 H6 T% I
  6.         '定义过滤器为选择单行文字对象' D% g# R/ Q- [% P* k! D: f
  7.         Ft(0) = 09 [+ p. t6 V; e4 L) t. q' h
  8.         Fd(0) = "TEXT": E" ^; S% Z7 u) c+ v
  9.         '选择所有单行文字对象
    5 G; {3 K' G4 _+ |% E* z
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    4 E6 L* u4 |6 [) T" m
  11.         '当存在单行文字对象时排序和替换
    $ D8 B* N' `0 W1 ~2 d, g  ^. H
  12.         If SS.Count > 0 Then6 Q( Y% e( k* `) C! c4 F3 k
  13.             '由用户在屏幕上指定中心点
    * \8 ]! e  i- U. h  o' E% F2 h' e0 {
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    $ n5 r& F! V! Y+ X# S; I
  15.             '如果用户没有取消则排序和替换; z5 {+ X( f* O- b
  16.             If Err <> -2147352567 Then. n4 Q% \0 `9 P( M
  17.                 '用户指定了点
    4 u2 v! ]' j  ]  X% s+ w" I0 o+ U
  18.                 If Err = 0 Then; `( k9 c0 T9 R3 o
  19.                     P(0) = V(0)
    1 Q2 H3 U: w: C2 q9 \+ a2 C0 P
  20.                     P(1) = V(1)
    & I4 ~0 h: v2 s9 S
  21.                 '用户选择了默认
    ( \& F: V" X' z% w- h0 s
  22.                 Else& t/ _" ~2 L( f, v1 f! B
  23.                     '计算所有单行文字的几何中心
    ' v( f( `6 {/ x* L
  24.                     For I = 0 To SS.Count - 13 E; i7 C+ D, u" h: A( s: X
  25.                         V = SS(I).InsertionPoint
    ; M; x2 |) O: P) H! _* c! U
  26.                         P(0) = P(0) + V(0) / SS.Count
    ) v  W/ p1 O; d+ }( v
  27.                         P(1) = P(1) + V(1) / SS.Count
    : ~3 x9 Y& r/ h! k% ?
  28.                     Next$ j0 s0 ]7 r  k% ]* }& V5 v6 H
  29.                 End If
    , ?6 t9 I) c, a/ Y$ R. l, D
  30.                 '重定义动态数组下标
    6 ]. ?- k0 U) Z
  31.                 ReDim A(SS.Count - 1, 1)0 |. G. M2 e) C) |2 U
  32.                 For I = 0 To SS.Count - 1& y  D0 {* [1 x
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    * |. w$ y$ j: D6 A3 a
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    & Q) h) \' U) \/ r# U
  35.                     A(I, 1) = I! K+ s2 @) Z0 V4 ~. A
  36.                 Next
    - E8 A. C2 C$ T( Y
  37.                 '按角度从大到小的顺序排序, P6 B0 X7 q2 D$ M
  38.                 For I = 0 To SS.Count - 2
    1 k: |/ I$ x5 g* O
  39.                     For J = I + 1 To SS.Count - 1
    / t# }8 m0 L: ]8 Z% h1 F
  40.                         If A(J, 0) > A(I, 0) Then
    ; ~+ H8 N! \! b1 @' r9 K
  41.                             D = A(J, 0)3 |8 w3 K* J: ]; g# }% V3 n
  42.                             A(J, 0) = A(I, 0)2 o0 d3 k; l; Z
  43.                             A(I, 0) = D
    9 [/ V7 t0 p% c" ~6 y4 m. a: H  P
  44.                             D = A(J, 1)
    0 R1 V1 i4 o) W# Y2 S
  45.                             A(J, 1) = A(I, 1)$ F) b+ X! ]2 R, K2 }2 y$ E
  46.                             A(I, 1) = D( e$ r2 S& [2 m1 Y% ~' r$ |, V
  47.                         End If9 U2 U# T- W4 q- X: s% ]
  48.                     Next
    , D  |( s3 y$ E  ~& T
  49.                 Next9 n5 ~+ D( O# V: |, N$ F6 \
  50.                 '替换
    * c7 V/ ]3 X+ X; f/ r  Y: [- m
  51.                 For I = 0 To SS.Count - 16 L5 T4 L, ^2 h& C
  52.                     SS(A(I, 1)).TextString = I + 1
    " T) C; [. S6 K' l( z/ S& q( L
  53.                 Next& v7 o' r* X, J" B
  54.             End If
    + C+ b4 i- i  U
  55.         End If; Q3 A% d( Q& D7 |
  56.         '删除用过的选择集
    + n- X* y* {, s5 v& u. \6 Q2 y
  57.         SS.Delete# }. y1 y/ i# ^) L
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia , R0 n  K' i1 [6 I) p
$ A4 X7 @8 H5 o, [
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:0 [8 d5 L' ?2 Z" g: |& _1 \
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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