QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
5天前
查看: 3773|回复: 6
收起左侧

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
7 a% p( }( k* V0 E功能:: C2 L8 b( `  W% ]5 m: _
1.查找-替换
7 j' D9 E0 c. j2.加编号排序# r2 o9 f" Z" D/ W/ c0 b
2我不知道咋怎?
0 W8 H& ]& `0 d) q: E& i) u
. r4 g. q0 R( `3 k             文字         文字                                             文字02           文字03
, J- Y% x8 ^6 K* f$ E
( p; B. `  `' g% S0 O6 [! K" f7 Y1 q  c文字                              文字    ----------------  文字01                                文字04
) a* D9 R# X  S# `            文字                                                                文字06
- V0 ^9 _0 O- O# A5 X, L                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:
( V( r7 O5 z; e遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.3 s' }3 T4 {" _' c8 k# a/ Z1 K5 q
下面的代码仅供参考
  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
    " Q) Q8 e) ?2 i" U- V, Z& k& u& ^- f
  2.     With ThisDrawing6 U6 g, }: F( J: k& }4 x0 S& g: k, {
  3.         '创建选择集,用于选择所有文字对象
    0 Q. t! q! ^0 }% R6 Q$ X# o1 P0 E. `
  4.         Set SS = .SelectionSets.Add("SS")2 v% C2 k3 y; t/ E
  5.         '定义过滤器为选择单行文字对象- s, e, p  U1 h5 V% k1 b- X
  6.         Ft(0) = 0# d9 a1 S9 n* p$ X9 M' t$ b1 Y
  7.         Fd(0) = "TEXT"
    . u7 B1 ]" X9 q: Z9 X1 b8 d0 ]
  8.         '选择所有单行文字对象
    . c, y# [' ~4 T+ x. o! z
  9.         SS.Select acSelectionSetAll, , , Ft, Fd5 F: H9 H+ i2 |6 h
  10.         '当存在单行文字对象时排序和替换
    . b, y0 v7 |! F
  11.         If SS.Count > 0 Then
    $ v3 ^! @2 {. T* A6 O+ u) o
  12.             '计算所有单行文字的几何中心
    # n& ?2 V6 v5 ^7 ~& t7 e( }9 `- x
  13.             For I = 0 To SS.Count - 1
    , x* K) S  j$ t$ v( y; ?! {
  14.                 V = SS(I).InsertionPoint+ O3 Z/ B, E, p( I: x' Q. Z/ M, |
  15.                 P(0) = P(0) + V(0) / SS.Count: g- k6 k; w8 p4 h' o* m$ `
  16.                 P(1) = P(1) + V(1) / SS.Count
    % N# ~4 T0 }$ h0 c; e
  17.             Next
    7 e/ m/ V3 A6 z4 ^/ L" d
  18.             '重定义动态数组下标
    * z  e8 P0 L3 R; S
  19.             ReDim A(SS.Count - 1, 1); _( E) V2 Q& J: L( o7 F: u5 ~1 C
  20.             For I = 0 To SS.Count - 1
    ; U3 _, I' G8 H( A: E
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    " [# C' Z7 R" }* U2 h) C- F' {+ Q
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    9 N) H$ \+ b  p6 v$ j7 v* r
  23.                 A(I, 1) = I
    : R; f# E! [0 O) A* }
  24.             Next1 b& p' b% m0 p3 V
  25.             '按角度从大到小的顺序排序1 q& n) S7 Q2 b1 K
  26.             For I = 0 To SS.Count - 2( N  G" r9 S# O  [% B/ ~3 x" _
  27.                 For J = I + 1 To SS.Count - 1
    ( v: z. ~( j7 \
  28.                     If A(J, 0) > A(I, 0) Then
    9 b: o5 l' I# i0 @) K( l- P
  29.                         D = A(J, 0)) v! U' }$ w9 }9 X
  30.                         A(J, 0) = A(I, 0)) ~, M0 |8 M- x5 G4 e" x) ~
  31.                         A(I, 0) = D$ j! x5 b/ R4 r( c7 F) K' n
  32.                         D = A(J, 1)
    2 C2 }  ^* M9 `2 ~8 f5 P
  33.                         A(J, 1) = A(I, 1)) I3 b% D; j) W$ s2 w, i- X
  34.                         A(I, 1) = D
    4 A' _3 s4 o) }/ o
  35.                     End If; K8 r: w7 M5 I( L2 J3 C; e
  36.                 Next
    0 c! C* j9 z4 p  Y1 o: |. G3 w9 D
  37.             Next8 Z/ Z' C7 z  y; O0 [9 B( x
  38.             '替换4 @# N# ]% i6 l
  39.             For I = 0 To SS.Count - 1; Y4 g2 m/ ~8 n- \8 q
  40.                 SS(A(I, 1)).TextString = I + 17 W6 Q2 S: o, G0 T7 D
  41.             Next
    , V7 P3 f& Z8 k. l
  42.         End If
    " U* T- G7 g6 g9 f) w/ k1 @5 ^
  43.         '删除用过的选择集
    ' a7 C* B1 P: T! O2 D8 k6 y
  44.         SS.Delete
    - @1 L- x% a7 E% w9 @1 C
  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
    2 c  e9 S- F8 T5 X/ G1 b; }5 g/ ~, {5 R
  2.     On Error Resume Next5 f! u$ d* ^# Y: F# p) G
  3.     With ThisDrawing1 R( \: z2 M" ]7 @+ `5 @
  4.         '创建选择集,用于选择所有文字对象
    2 E8 X0 D( ^1 l8 z) D; m
  5.         Set SS = .SelectionSets.Add("SS")
    : \, r" b% x) [: l& t* U) A/ t
  6.         '定义过滤器为选择单行文字对象- f3 t0 U% G( c: s9 s+ s
  7.         Ft(0) = 0
    4 ~$ ^. |8 n1 Y
  8.         Fd(0) = "TEXT"1 S1 |+ J: X7 q, o9 I. B7 `
  9.         '选择所有单行文字对象
    8 X# B9 y5 I6 [' H5 q7 P& j
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    - ^) K  V- m" y2 @
  11.         '当存在单行文字对象时排序和替换, r0 m5 R% h+ j
  12.         If SS.Count > 0 Then
    ' I) q9 u: d7 [4 x
  13.             '由用户在屏幕上指定中心点
    & k# w3 |7 x; t7 V& P
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    $ C1 {( |% E" z; {" q8 e
  15.             '如果用户没有取消则排序和替换
    % w) o2 I0 P1 O$ b9 @! Y2 s8 G8 S( s
  16.             If Err <> -2147352567 Then
    ' m  ~" ]& x9 g# ]$ g" k6 K
  17.                 '用户指定了点  U1 Z% G: v9 B  h- A; r3 L5 r1 j
  18.                 If Err = 0 Then
    ) j4 J1 P( m4 y
  19.                     P(0) = V(0), X* Z$ o  x9 W; T
  20.                     P(1) = V(1)6 x& M" ]5 F# Q# J3 q
  21.                 '用户选择了默认
    ( \* s' s+ X% x* j
  22.                 Else% ?4 B# i% F/ b6 S1 `
  23.                     '计算所有单行文字的几何中心
    * }. b4 o/ P6 g. @
  24.                     For I = 0 To SS.Count - 1
    6 L1 h  d7 p2 R4 c+ ^
  25.                         V = SS(I).InsertionPoint
    4 }6 a5 r: ^' z- e* a* l
  26.                         P(0) = P(0) + V(0) / SS.Count5 z! d! P1 W9 @2 q+ K0 b
  27.                         P(1) = P(1) + V(1) / SS.Count9 i8 G% Z( v2 I) o  R/ k
  28.                     Next
    % C; J0 [! c7 ?/ g- [
  29.                 End If
    5 t& ?1 {$ x% o# _2 L. Y
  30.                 '重定义动态数组下标% W' Q) ?0 @  M
  31.                 ReDim A(SS.Count - 1, 1)
    1 m$ d" K/ A* h: U4 H% u$ F. g3 Z
  32.                 For I = 0 To SS.Count - 1
    , U, R( i& ?7 @/ y9 I
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    # }' }) Q  h5 a/ M
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    ; C# |5 m& o0 P+ O5 y1 N, j" ^7 n
  35.                     A(I, 1) = I
    9 w; C+ Y( x9 C$ n* r; h' B# ?
  36.                 Next
    # J6 N1 c. k$ A& K& B
  37.                 '按角度从大到小的顺序排序' z1 [2 A/ o5 P" X" e1 R" n7 b
  38.                 For I = 0 To SS.Count - 2" W9 H, O) k2 q* o& E( ]. {/ D
  39.                     For J = I + 1 To SS.Count - 18 y0 F3 H3 o" f. a) I! n
  40.                         If A(J, 0) > A(I, 0) Then
    + i1 I4 z5 l9 k9 E' h
  41.                             D = A(J, 0)
    ! A( m4 Z3 N7 {* j. H' D) E# q
  42.                             A(J, 0) = A(I, 0)
    / Q3 l8 b+ K+ k
  43.                             A(I, 0) = D# {+ Z$ i+ ?: a# U
  44.                             D = A(J, 1)' a* o: C/ g0 i
  45.                             A(J, 1) = A(I, 1)
    2 h8 g5 d1 G! y( x3 C/ p5 X
  46.                             A(I, 1) = D
    $ m$ T% ~! D8 I2 m' t/ r- h) u
  47.                         End If
    8 W& J" G8 A; @! `" O) o
  48.                     Next
    2 z( B" U$ x$ v) V, d+ V
  49.                 Next
    + I2 i  T% ~& ^0 q6 Z
  50.                 '替换
    ) K9 c+ d: K0 c6 N3 X
  51.                 For I = 0 To SS.Count - 1( k; c0 P5 P& d: v$ M* u
  52.                     SS(A(I, 1)).TextString = I + 16 a: B7 e- I1 y- `
  53.                 Next
    ; \+ U" |5 {7 G  F/ O; _, u0 D
  54.             End If$ v' h4 Y  @. R
  55.         End If
    & V& {2 b, a* L; \
  56.         '删除用过的选择集
    ( z3 x  r! v! I2 V6 |  U7 O. D
  57.         SS.Delete
    " b+ s' z9 f6 p2 V$ z
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia + k/ Q* f: P* E! D
' c: h$ _# h; [% q  B6 ?) Z
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
/ _: i0 y# }3 l% W" S' N我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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