三维网

标题: CAD_VBA怎样文字查找替换并排序? [打印本页]

作者: taqqug    时间: 2011-3-24 21:10
标题: CAD_VBA怎样文字查找替换并排序?
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)6 e; O: J; }- M- W8 m' m
功能:
" y% u" c5 ]$ ?6 |. s1.查找-替换
3 W4 q6 Z- _5 U, A1 L5 ]2.加编号排序
5 I: i" D+ m& T8 C; u% ]2我不知道咋怎?: a# i+ Z5 x# U/ w7 T! v* r

# s6 z+ T! j9 g0 }) U. c             文字         文字                                             文字02           文字03
# v+ Y& \) ?- i3 R, z% G
4 q5 i# u1 M$ }3 u6 [+ @文字                              文字    ----------------  文字01                                文字04
; ?' {" b, Q# d7 v% g            文字                                                                文字06+ \& z3 G; a, R
                           文字                                                                 文字05
作者: taqqug    时间: 2011-3-24 21:15
最好给出代码,谢谢了!
作者: woaishuijia    时间: 2011-3-25 00:23
是否可以这样:
; Y9 G' b* ^8 s# B0 H, Z: P遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.& ~; q" h  Q# B  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
    : h% T; X, T" T
  2.     With ThisDrawing! w+ W2 }( y. B# d9 W5 \
  3.         '创建选择集,用于选择所有文字对象3 k5 A* L# C  x2 ?- h3 [; Z
  4.         Set SS = .SelectionSets.Add("SS")# ?+ F- q$ E& `% L' r
  5.         '定义过滤器为选择单行文字对象
    1 c7 }" w% X$ Q+ D. f" R* z: S
  6.         Ft(0) = 0
    % G/ t$ S' N; k3 ^5 T: B
  7.         Fd(0) = "TEXT"% n# I: D# F5 S: p$ Z
  8.         '选择所有单行文字对象
    . l( c! x' h; a
  9.         SS.Select acSelectionSetAll, , , Ft, Fd5 |, S) I. h7 i9 \# U
  10.         '当存在单行文字对象时排序和替换9 {! N! A. b) m% @* E  p8 ]
  11.         If SS.Count > 0 Then7 ]% ]; H8 T. [' n/ {! r
  12.             '计算所有单行文字的几何中心
    " C: b" ]. T1 T, b8 P
  13.             For I = 0 To SS.Count - 1/ e6 d, {' c6 r! \, {
  14.                 V = SS(I).InsertionPoint
      v( k" _$ R. }7 C- D
  15.                 P(0) = P(0) + V(0) / SS.Count7 Y5 t% V4 A. G2 v# e5 j
  16.                 P(1) = P(1) + V(1) / SS.Count7 F* L( y  O% c" y
  17.             Next: A) R0 i9 ^/ d4 E0 a- p" I% j; {
  18.             '重定义动态数组下标
    8 O8 Z, H+ p! ^2 r/ h' ?. |: y' L4 g
  19.             ReDim A(SS.Count - 1, 1)
    # X& j3 K4 @1 i
  20.             For I = 0 To SS.Count - 1. l1 l1 f  c. i
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    4 y9 l. [: L; Y7 ~5 j# w( r9 e
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)  Z, o- s, a3 P0 D- J2 |( u- B/ y/ m
  23.                 A(I, 1) = I3 T* Z5 g9 u3 }# ]" C
  24.             Next
    3 k& O- b6 x# M- b8 [4 ?  X
  25.             '按角度从大到小的顺序排序
    $ }% x6 @! N+ L& E
  26.             For I = 0 To SS.Count - 24 n5 P* x' s  t; a8 m# H
  27.                 For J = I + 1 To SS.Count - 1
    ! \$ J2 h6 D; V: }
  28.                     If A(J, 0) > A(I, 0) Then: t, I- K7 I6 i; h1 ~
  29.                         D = A(J, 0)" `8 V, A  G1 k
  30.                         A(J, 0) = A(I, 0)! D# d# c) V( @$ x) o- l* a3 v6 ]. ]6 r
  31.                         A(I, 0) = D
    * x2 h4 P/ Z, e
  32.                         D = A(J, 1)
    $ s$ T3 [: Q1 ]5 P7 D& n0 v
  33.                         A(J, 1) = A(I, 1)
    4 s" D7 B# T5 S' s& d
  34.                         A(I, 1) = D& e( y$ V; Y/ i% c
  35.                     End If- |# x/ n' C% S! b5 G! J! ~: [
  36.                 Next
    * J7 \) s! L( c1 ~" U/ e  p& t" m
  37.             Next7 _: R2 ^5 B( u0 @, u
  38.             '替换
    " Q0 d5 T9 ^( T& U2 L4 A5 r
  39.             For I = 0 To SS.Count - 1
    ; A5 m! J" R, S1 `5 j
  40.                 SS(A(I, 1)).TextString = I + 1! M% b5 Y2 c: k5 _" `4 S
  41.             Next
    ! U. Z- J2 G7 E( k$ r, l" e* D3 ?
  42.         End If) n4 C: ~7 d4 b1 |, c( a
  43.         '删除用过的选择集0 E, J  @) V% J: g
  44.         SS.Delete& C7 e7 O' V2 h
  45.     End With
复制代码

作者: taqqug    时间: 2011-3-25 10:25
woaishuijia  你这个思路太好了,我用坐标比较,整了半天没整好,非常感谢!
作者: woaishuijia    时间: 2011-3-25 12:23
我又想了一下,只用加总平均的办法计算中心点未免有点太单一了.如果增加一个选项,由用户在屏幕上指定中心点会更好些
  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" ]2 t6 F2 a1 M  R
  2.     On Error Resume Next
    4 w. _2 e- v' o5 `' R1 L
  3.     With ThisDrawing
    " a! P; V0 l& |
  4.         '创建选择集,用于选择所有文字对象
    4 J! \! y$ }5 \) r  B; j4 B6 Y2 a
  5.         Set SS = .SelectionSets.Add("SS")
    6 D8 Y5 |; [# Z6 O0 P. A
  6.         '定义过滤器为选择单行文字对象* w4 b  s. \/ k" c2 [" p5 `+ a
  7.         Ft(0) = 0
    ; b, i. |6 B" r+ h
  8.         Fd(0) = "TEXT"$ W" b; m3 Q9 Y
  9.         '选择所有单行文字对象4 C0 Z. s+ S9 d# }# N/ o2 t
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    , S' y& U$ }4 D* M9 F0 Y; [& {
  11.         '当存在单行文字对象时排序和替换' y8 P  c7 n8 `$ U; }" l* R
  12.         If SS.Count > 0 Then
    " f0 K' X' v! A  o6 W
  13.             '由用户在屏幕上指定中心点
    4 J$ f7 C% V" P. A
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    % M7 X  m; P4 D% g: r2 x/ J( i
  15.             '如果用户没有取消则排序和替换
    7 |) Y6 y' L6 W) b$ X. E5 t& R5 x
  16.             If Err <> -2147352567 Then
    # Y: \! V1 o5 |4 r
  17.                 '用户指定了点& s4 L% ?4 R3 |4 X
  18.                 If Err = 0 Then
    9 p6 h$ n5 H/ n% {  l2 k7 y9 l. }
  19.                     P(0) = V(0)# M7 L% e* I( R: Z  E/ m1 l
  20.                     P(1) = V(1)
    6 A7 Q8 ]: Z' O+ l( O$ r7 ~1 Q
  21.                 '用户选择了默认
    6 S) G, ~9 B6 r9 D$ I1 W
  22.                 Else" O7 K! ~3 L9 H
  23.                     '计算所有单行文字的几何中心
    2 y5 w; }9 Z# J) x. z
  24.                     For I = 0 To SS.Count - 1
    4 ]3 C( O: h# y3 Z. x7 X
  25.                         V = SS(I).InsertionPoint
    4 h5 [( i) x4 w8 g
  26.                         P(0) = P(0) + V(0) / SS.Count
    6 I% I5 A8 m% h
  27.                         P(1) = P(1) + V(1) / SS.Count
    ! Q1 L9 F0 T% U3 \- B. M4 f
  28.                     Next
    / Z6 _1 A2 r; m! ~3 B
  29.                 End If3 n4 ~" ?# V0 ^; ~1 A4 T9 N
  30.                 '重定义动态数组下标
    1 `; u4 n$ Q6 A5 c! c/ Y. d( _; v5 s
  31.                 ReDim A(SS.Count - 1, 1)
    . G0 q( ]& K3 E& s$ k% Y8 G: I
  32.                 For I = 0 To SS.Count - 1
    ' v, _: [& S# {- s; q, ^! A
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号. q: t/ K( [1 M: j8 R1 E* p
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)' ?3 q/ d: X+ _/ {
  35.                     A(I, 1) = I
    % A- S# {0 q5 l: [8 e" b! @# ^/ |" d
  36.                 Next
    2 z/ r" Q) y8 e8 X- j( a
  37.                 '按角度从大到小的顺序排序
    - G6 T( J# e. H, j9 L- `
  38.                 For I = 0 To SS.Count - 26 Q2 R; W+ I) K/ _- @# s
  39.                     For J = I + 1 To SS.Count - 1" [' W* o& U0 t) g
  40.                         If A(J, 0) > A(I, 0) Then& S8 A( r& N+ o6 Q; q
  41.                             D = A(J, 0)" C. G; u8 x1 k5 `; B- `
  42.                             A(J, 0) = A(I, 0)1 O! e, z* Z. R* s$ |* [8 Q3 N
  43.                             A(I, 0) = D
    3 @4 i3 q; i& s4 K* P" {
  44.                             D = A(J, 1)& X0 g% _1 B- c) N$ O
  45.                             A(J, 1) = A(I, 1)
    + ]! u. h! E* O
  46.                             A(I, 1) = D
    % F% \* w6 K7 t8 V
  47.                         End If
    ( n" S* B0 X$ V2 H; w( t& s
  48.                     Next( v  @7 a6 s9 e4 |5 {
  49.                 Next# D2 Y' V$ @6 h( q
  50.                 '替换
    ) B& E- t- m* R1 w( f3 N5 B$ F
  51.                 For I = 0 To SS.Count - 1
    . C( N; C, G# q( U2 i% `
  52.                     SS(A(I, 1)).TextString = I + 1
      f  I( K& F% @
  53.                 Next
    # B8 g, v; b, A3 ]& b8 r
  54.             End If" G2 d( O8 T- s: q
  55.         End If$ O7 _# @2 C2 U  A/ Q6 Q* D/ W  B9 f
  56.         '删除用过的选择集- F  P- Q. C# d* B" V* E
  57.         SS.Delete; a1 v1 l# v5 J" T3 j
  58.     End With
复制代码

作者: wangdy111    时间: 2011-3-26 11:15
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
作者: taqqug    时间: 2011-4-14 11:00
5# woaishuijia # v+ f& T4 j4 n; g7 J; K

/ Q% g8 w7 \& I7 }  T4 v能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:3 y( d2 B( r6 v' c, q5 L- `
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了




欢迎光临 三维网 (http://www.3dportal.cn/discuz/) Powered by Discuz! X3.4