QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
1 V$ E# t1 n7 j. L功能:
. s7 F  Z, }/ s: J  D1 \1.查找-替换
: I1 ?0 n+ ], A( N! T2.加编号排序
% M1 c4 ~/ _  n( v6 I, W2我不知道咋怎?
, G; \& `: U2 ]5 f  p; j0 X0 x# s' j# n* S# ~+ o0 W. H& U' g+ x- p
             文字         文字                                             文字02           文字03
' G: d8 \0 h3 ~3 G) w; T( V; |% s5 U
文字                              文字    ----------------  文字01                                文字04
% U) R& ~: a) X- o/ Z2 Y            文字                                                                文字064 n, u( i- F* X% Z( _
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:- `- s7 g0 ~$ @
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
( H" s  v3 c( ~% G2 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 Double2 D$ T! f8 }4 ?; M
  2.     With ThisDrawing
    ( M) w2 T  V, B
  3.         '创建选择集,用于选择所有文字对象( ?3 U0 y1 `$ p; z
  4.         Set SS = .SelectionSets.Add("SS")0 s8 u% A: `9 T5 j& }7 o, p- I- M
  5.         '定义过滤器为选择单行文字对象! F3 {7 M) ?+ Z
  6.         Ft(0) = 02 d4 V4 S: P! h3 X' L1 S0 u
  7.         Fd(0) = "TEXT"/ w2 X* a6 l% A/ Z2 r" W
  8.         '选择所有单行文字对象
    ( W, k& E/ h6 M( V) `% Y: m/ I
  9.         SS.Select acSelectionSetAll, , , Ft, Fd: Z, O& A: P. _6 ^. I9 c3 R) Y3 `
  10.         '当存在单行文字对象时排序和替换$ k" v) U3 o; a: b/ K; E
  11.         If SS.Count > 0 Then
    ) R0 W: i4 S) c; w7 g
  12.             '计算所有单行文字的几何中心; n" |7 e' e) p6 k( ?  R
  13.             For I = 0 To SS.Count - 1! N6 p2 P3 Z5 p' g& s2 v- l; n
  14.                 V = SS(I).InsertionPoint$ b, p8 S  F; i' I( S
  15.                 P(0) = P(0) + V(0) / SS.Count+ o8 ]% o- H( S8 u2 ~" y( w
  16.                 P(1) = P(1) + V(1) / SS.Count0 f6 P8 Q& r( F4 ?' |2 b5 e
  17.             Next
    ) @* h) v( T. K  u
  18.             '重定义动态数组下标: N8 b& }! \3 `2 M' T- h) S- p
  19.             ReDim A(SS.Count - 1, 1)2 V4 _" V5 h5 f1 z& }( W) n3 ]
  20.             For I = 0 To SS.Count - 18 F: ~& l8 i: ?1 D
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号, f1 q5 ?# I5 Y8 o$ @
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    2 `" L* L! P+ D5 C- _* u
  23.                 A(I, 1) = I3 f( I+ `6 q6 z& H
  24.             Next
    : D: J, m7 S; G* O% |& h
  25.             '按角度从大到小的顺序排序
    7 E* V( u: O1 Q
  26.             For I = 0 To SS.Count - 23 p8 `& i) r; X+ |
  27.                 For J = I + 1 To SS.Count - 1
    4 P) C4 b& a& m) W1 \
  28.                     If A(J, 0) > A(I, 0) Then
    2 D- f4 A: m6 ]! f0 ^' F
  29.                         D = A(J, 0)
    8 I* ^; O/ g  M2 b/ B2 X7 O/ ]4 g: u; Y% @
  30.                         A(J, 0) = A(I, 0)8 [- j' ?' M0 K- Y+ k$ n
  31.                         A(I, 0) = D
    % w$ g: X4 ~1 m% m# M2 ]. N
  32.                         D = A(J, 1)/ K- C) j2 ?( ^
  33.                         A(J, 1) = A(I, 1)2 d& g  h; ]0 M" [9 v. M
  34.                         A(I, 1) = D
    ; U9 a  V& M2 J7 R4 E
  35.                     End If
    - \' ?: j5 T4 H& t5 S! I
  36.                 Next! J2 l: n; H; C/ P  d9 @) Y
  37.             Next% a0 C; \. P; g. z2 w" G, T
  38.             '替换
    3 I6 u1 e* h) Q; p- A2 Y7 N+ I7 ?: v, o
  39.             For I = 0 To SS.Count - 1, K' Q& L$ Q* O6 G2 I
  40.                 SS(A(I, 1)).TextString = I + 1
    : E& d3 o: ~" E
  41.             Next1 y- t+ ?9 _3 Y' m
  42.         End If- I6 K; r5 t. M- C
  43.         '删除用过的选择集' k0 v9 v' b" R( T* y
  44.         SS.Delete
    ! b7 q- b: U( t- z! X7 \9 w4 [/ E
  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
    9 d. h( s) }8 f4 ]' |2 V
  2.     On Error Resume Next' b- a& @3 b! O' ^, W7 L7 y- Z
  3.     With ThisDrawing
    % m* X; Y. `  ]
  4.         '创建选择集,用于选择所有文字对象( f* L) h& _: U. Y
  5.         Set SS = .SelectionSets.Add("SS")4 B2 R, \/ M( I$ u6 b! K( J
  6.         '定义过滤器为选择单行文字对象
    % _2 b3 H  ^' P
  7.         Ft(0) = 0' z3 g$ l0 U! |! }  ?6 t: X
  8.         Fd(0) = "TEXT"
    0 }  Y0 [* Z5 n, r! C# g* x! ~1 h
  9.         '选择所有单行文字对象2 _) a2 }* ]4 L' G/ @
  10.         SS.Select acSelectionSetAll, , , Ft, Fd" p2 k( k/ X  |# f" e
  11.         '当存在单行文字对象时排序和替换3 B& _# j* D9 e, @  J
  12.         If SS.Count > 0 Then6 }+ O( X+ z$ {" h- ]
  13.             '由用户在屏幕上指定中心点
    4 f3 e' K" I8 ]6 _% q+ R
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    # }7 ]: h: g( J- t% R
  15.             '如果用户没有取消则排序和替换) o1 x1 Z0 w1 R+ }) t
  16.             If Err <> -2147352567 Then
    ) C6 }" J6 I5 e4 j. S/ }" a$ l
  17.                 '用户指定了点
    . o3 O% r1 J# t1 O; M/ o- u/ G" @
  18.                 If Err = 0 Then
    " {% X) L2 F3 H# ]! m
  19.                     P(0) = V(0)( Y2 c9 o- r& z$ N: G* w* M; m! _* M
  20.                     P(1) = V(1)
    ! X; P7 E) Z0 m8 e1 Q. p2 T
  21.                 '用户选择了默认
    . h# ?) [) l) n" f: U4 a
  22.                 Else
    * n  d/ {' y& h  F. a
  23.                     '计算所有单行文字的几何中心/ c4 X) `2 E5 k2 c
  24.                     For I = 0 To SS.Count - 1
    + q3 m: s# Y3 a- m1 R6 T* O
  25.                         V = SS(I).InsertionPoint- J% u  P; T0 F1 D, c3 m6 @0 N
  26.                         P(0) = P(0) + V(0) / SS.Count, R% i# d9 L. L  Q! k  y
  27.                         P(1) = P(1) + V(1) / SS.Count5 E% W+ _" c3 G: g$ j6 w" Y6 r3 T
  28.                     Next
    0 z( @$ i# g$ N; u
  29.                 End If
      y8 i4 L2 C& D6 X+ B, W
  30.                 '重定义动态数组下标
    7 R  b$ U# L' \% X6 @2 k
  31.                 ReDim A(SS.Count - 1, 1)& y) E( S/ A' X; L, e. _6 G2 v
  32.                 For I = 0 To SS.Count - 1
    ! j' j( I7 _) U/ |
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号1 s2 r4 C) w& K; r  V$ M, B
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    0 E% {( T) y" Y
  35.                     A(I, 1) = I
    / J  _2 [8 A4 X8 b
  36.                 Next0 z# X1 T9 n$ o4 b- |
  37.                 '按角度从大到小的顺序排序
    3 d! l% @" N' {) m4 l
  38.                 For I = 0 To SS.Count - 2
    1 P, i# T4 D+ N) d" A! H& d9 G
  39.                     For J = I + 1 To SS.Count - 1
    # n7 v7 f, R5 d" ]( U! W& z
  40.                         If A(J, 0) > A(I, 0) Then
    " H" u) t5 n: U3 x; k6 F/ M) y% x
  41.                             D = A(J, 0)
    , L$ G3 |+ q/ Y2 j6 S
  42.                             A(J, 0) = A(I, 0)  w! ^' T2 A) ]) F
  43.                             A(I, 0) = D7 L, {) W# X0 C% N9 D/ g6 U
  44.                             D = A(J, 1)
    9 _+ h8 v/ V5 }- o! d" x% h) c
  45.                             A(J, 1) = A(I, 1)/ {4 i; K" E# ]# g
  46.                             A(I, 1) = D5 s) }1 }: x$ O. @  s5 v- C
  47.                         End If0 I5 |0 O: r  U8 d: x" F
  48.                     Next
    4 u/ m5 j' r" G% u) m
  49.                 Next
    : w2 p5 g) k6 `/ r" {! U$ e
  50.                 '替换' X) Z3 h& g2 X; n- Y; @2 ^% q
  51.                 For I = 0 To SS.Count - 1
    0 j" v4 D! F. L# H1 U
  52.                     SS(A(I, 1)).TextString = I + 1% F) v  d) W4 ^+ L( B
  53.                 Next
    $ H6 y# {; r# ?0 U9 m! t$ x1 l
  54.             End If" V! _- D  O! z; X" ?' N9 f- D
  55.         End If
    8 O" @5 P( `5 S. ~( _$ k
  56.         '删除用过的选择集
    : s4 k1 ^7 J, l' D6 F
  57.         SS.Delete
    & p# M6 J4 ~$ i6 S7 s" k" F  Q( V
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia 1 @; v9 n% I2 b" [$ X- I3 |1 n
2 ^/ P; W% [( j. q5 f4 _, S, W/ p
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:, [& l, @2 C! e5 n/ ]& T
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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