QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
全站
goto3d 说: 在线网校新上线表哥同事(Mastercam2022)+虞为民版大(inventor2022)的最新课程,来围观吧!
2021-06-26
查看: 3536|回复: 6
收起左侧

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

[复制链接]
发表于 2011-3-24 21:10:33 | 显示全部楼层 |阅读模式

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
$ ]* J1 a2 u/ i: q功能:% u7 S9 M. y6 F
1.查找-替换
# e7 T4 o. R4 A4 L1 |: r# s7 K2.加编号排序
0 q& s8 \: x" j% X2我不知道咋怎?
3 O9 g$ m8 F$ \# a/ W8 a( \1 x" _' l/ L- c/ Y6 {
             文字         文字                                             文字02           文字03
4 ]1 [/ H5 y1 ^8 e" E7 S  y; M7 l: m( q5 O/ f! H
文字                              文字    ----------------  文字01                                文字049 K# J' ?+ B, ^) N' B- L
            文字                                                                文字06
! u( I1 d- h* ^/ W9 r                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层
是否可以这样:
! x) l6 |0 f' p: \8 Y) Q遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
$ B' d) S% P1 e! u. W' z2 V# C) N下面的代码仅供参考
  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* b) ?4 \9 U$ O, x  v0 @/ D
  2.     With ThisDrawing* N$ {5 E+ x; n7 \# E
  3.         '创建选择集,用于选择所有文字对象
    5 d& Z' ?, y' y+ I/ ~3 K/ Z. C
  4.         Set SS = .SelectionSets.Add("SS")
    9 |7 e( d; n) |; ]
  5.         '定义过滤器为选择单行文字对象
    * J" i" H2 A. x* i& S
  6.         Ft(0) = 0* I+ ?0 _. g; u/ m5 O' {
  7.         Fd(0) = "TEXT"
    1 Y  Z1 P- p& k, R! M8 V$ n! |7 i. n1 l
  8.         '选择所有单行文字对象
    / }. A; P: w6 d( ?: z* \) h
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    1 y0 ^) u  \/ P6 ~
  10.         '当存在单行文字对象时排序和替换! w0 B/ J3 ]. K  N
  11.         If SS.Count > 0 Then
    - ~2 t" Q: ]; S1 N/ |2 o
  12.             '计算所有单行文字的几何中心
    2 `' J# a$ g; x* b
  13.             For I = 0 To SS.Count - 1
    , W) Q  x' m4 s* j/ t9 S
  14.                 V = SS(I).InsertionPoint
    8 ~4 W; c# s$ [/ p$ L0 }% Q
  15.                 P(0) = P(0) + V(0) / SS.Count& v/ _3 x7 Z3 a9 ?- s; R
  16.                 P(1) = P(1) + V(1) / SS.Count2 p8 k% D! k  B% _' z3 V2 L
  17.             Next
    & q+ Z( B+ g! g3 j$ @' u+ r
  18.             '重定义动态数组下标1 g5 z1 ]2 m1 y4 v
  19.             ReDim A(SS.Count - 1, 1)
    5 M) l$ Z7 Z5 K% ?
  20.             For I = 0 To SS.Count - 15 T  o. p. L& q/ m
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    2 G) a. y) ?% }& a& L; V# f
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)7 g7 b% w( k' u9 s* Z1 _" d
  23.                 A(I, 1) = I" g2 l" `' U9 }3 t
  24.             Next% }5 }6 m1 k$ L4 K8 S
  25.             '按角度从大到小的顺序排序
    * z% C0 b8 E2 Y, K& v8 `
  26.             For I = 0 To SS.Count - 2- @4 R8 T0 V" d, Q3 S7 ]- `2 l) q0 x
  27.                 For J = I + 1 To SS.Count - 1# D8 I4 O5 D; g& ~1 q2 a
  28.                     If A(J, 0) > A(I, 0) Then
    , Y6 i% b( U# r  r- M9 d  e
  29.                         D = A(J, 0)
    8 K) X8 z9 h  z7 h7 `5 E
  30.                         A(J, 0) = A(I, 0)9 {0 u% N' T1 _! A  V: B, g! P
  31.                         A(I, 0) = D
    ' X& I$ z9 N' O! N! G, q7 z8 ?# l
  32.                         D = A(J, 1)
    , Z4 n; h9 B4 _6 t4 U& l* \* E
  33.                         A(J, 1) = A(I, 1)
    % t, y; ~; A( ?: F5 l
  34.                         A(I, 1) = D
    $ D, T+ g& l0 d7 c' \0 F
  35.                     End If
    ; K3 e" \2 w5 b5 \" n1 q4 H
  36.                 Next
    7 n* f. @. e; e
  37.             Next5 ^$ e  t0 l7 M' o
  38.             '替换
    + m* _% M( _4 ~% }& v! Q9 a
  39.             For I = 0 To SS.Count - 1
    5 S3 S2 M  Z& V+ t" W; w  p
  40.                 SS(A(I, 1)).TextString = I + 1" X% v/ S& F6 r9 e( \: Y
  41.             Next
    7 x6 V0 t* V4 G7 d7 c
  42.         End If
    , }2 K- B0 T, P. B# A" F4 l( s# p
  43.         '删除用过的选择集
    6 M9 G# m# m2 s
  44.         SS.Delete
    . b. b) Z. ?; w" V/ a, U  N% {# D
  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
    " v. v! {* e% t: L
  2.     On Error Resume Next( G9 w  b; `, |8 }
  3.     With ThisDrawing
    1 A: I6 @9 r- }& A
  4.         '创建选择集,用于选择所有文字对象
    ) F; y9 u9 N; X- U: x: ~4 H6 z% d7 \
  5.         Set SS = .SelectionSets.Add("SS")
    6 L, I  p4 X4 @2 h
  6.         '定义过滤器为选择单行文字对象! K% V0 a4 Y5 V; |1 l$ w
  7.         Ft(0) = 0
      o( r2 L/ B6 i6 z! [
  8.         Fd(0) = "TEXT") j  W6 T3 s2 P6 m- X, S
  9.         '选择所有单行文字对象( E- v. z3 a4 R: ?2 S' q2 b. h
  10.         SS.Select acSelectionSetAll, , , Ft, Fd1 ]& ?$ v8 z# R2 D4 F, w
  11.         '当存在单行文字对象时排序和替换6 w% E$ t# E6 ?0 A, \
  12.         If SS.Count > 0 Then
    / ~8 c" \/ y  _- A& X
  13.             '由用户在屏幕上指定中心点
    7 o3 q& q  L2 P0 x
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")+ W2 j1 s/ t% M' l9 n
  15.             '如果用户没有取消则排序和替换3 v2 e* e( e: t) s; K' ^
  16.             If Err <> -2147352567 Then' J; |1 F2 Y' K, u
  17.                 '用户指定了点
    9 Z- [$ G# h- I/ i1 }  F$ d
  18.                 If Err = 0 Then9 _5 i# ~/ n0 ^4 |2 y6 _
  19.                     P(0) = V(0). h. X) }4 `9 N- o/ F
  20.                     P(1) = V(1)5 l$ r4 G/ E2 B2 O: X! p
  21.                 '用户选择了默认
    + q  H! R( F8 {
  22.                 Else* o" a3 e+ c% b* ?$ p4 U
  23.                     '计算所有单行文字的几何中心
    : s0 \2 f. {/ Z  o* Z
  24.                     For I = 0 To SS.Count - 18 Y& ^: L1 l- V3 \- b: a& M8 R
  25.                         V = SS(I).InsertionPoint
      G7 I% k0 z# s( Y- B* T
  26.                         P(0) = P(0) + V(0) / SS.Count1 g$ |& e( e2 N9 N% p
  27.                         P(1) = P(1) + V(1) / SS.Count
    7 _( h$ V/ y6 T; w2 M1 J
  28.                     Next
    9 {+ [$ W8 o$ O4 A
  29.                 End If# D  [3 S' d$ y: g& H
  30.                 '重定义动态数组下标: A# C3 ~  |: s9 v
  31.                 ReDim A(SS.Count - 1, 1)
    6 m9 Q9 r/ f; f9 s0 S6 B3 m( Q& s
  32.                 For I = 0 To SS.Count - 1
    + V2 N  k& Z4 P% B5 Z
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    % L% d8 @; t# _0 z
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    0 {' O& |5 M1 e; Z, Z5 _& W. v1 ^( l& U
  35.                     A(I, 1) = I, T; x9 o& {0 L( K6 p' X5 A
  36.                 Next# Q9 |. W- W+ u# N& m4 e: C* Q
  37.                 '按角度从大到小的顺序排序5 _0 j. ?" n4 H" j0 Q5 [
  38.                 For I = 0 To SS.Count - 28 M+ X  o8 F; i6 I1 W) b& A8 w
  39.                     For J = I + 1 To SS.Count - 1# o% g6 g+ _: S6 Q
  40.                         If A(J, 0) > A(I, 0) Then- [# g: L' o- W& y5 h9 p
  41.                             D = A(J, 0)
    , f! l! g; G7 H, \8 g
  42.                             A(J, 0) = A(I, 0)
    , }' N0 T' I/ v0 o0 E
  43.                             A(I, 0) = D
    1 m$ Q! D7 P. k/ h
  44.                             D = A(J, 1)2 f8 X* L; u1 O) g
  45.                             A(J, 1) = A(I, 1)
    6 s. ~4 w1 R! s, x  A
  46.                             A(I, 1) = D, J, K% Z; F6 ]: @8 K4 ^" U5 W
  47.                         End If0 A- Q9 b8 M, O# A0 w6 v- o
  48.                     Next
    ! q5 o, `2 ]3 K3 {' X
  49.                 Next# y+ }! W+ k! B( ]
  50.                 '替换% w' c: o' m: p9 n* @
  51.                 For I = 0 To SS.Count - 10 w# |' k& j+ u. ^4 Y
  52.                     SS(A(I, 1)).TextString = I + 1
    / ?; D2 D( Q% a2 V) h/ O& H
  53.                 Next
    2 y: K8 v4 X" V5 u# d5 i: t: ^+ ]3 i
  54.             End If
    0 n3 e2 k/ Z+ O3 W) O
  55.         End If% M) |( K# c: F- P/ T! Q2 L& g
  56.         '删除用过的选择集, t, i7 Q* ~, v% ~# s
  57.         SS.Delete- l" `& }6 @8 j8 A
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层
5# woaishuijia % {$ D  a4 F$ j5 S
, n% C! \! H3 a
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
8 a. E3 X# U! G9 q/ c我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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