QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
3天前
查看: 3771|回复: 6
收起左侧

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)4 |; l5 X6 L6 w
功能:
$ V, B" e8 V9 \, _1.查找-替换
* h: S9 c+ b8 l2.加编号排序& l2 O; g) q' q% v8 h
2我不知道咋怎?
- n0 B+ `1 v3 h' g1 t
% X  {: s: y! C) x0 k5 G9 m             文字         文字                                             文字02           文字03
% k: F3 |5 q  K9 P
  z% C1 D9 T- K0 P% h# S文字                              文字    ----------------  文字01                                文字04
( E" Q. y% n- J7 ?- G# t  U2 R& j            文字                                                                文字069 n6 W8 f# l' H- U6 Z
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:( w4 B( g  I; Z, x% f/ @& v# z
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.9 n7 o/ [. U  h/ r! K' 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& t% F  b% a+ U8 w
  2.     With ThisDrawing) U+ G( O9 [" j: [
  3.         '创建选择集,用于选择所有文字对象
      t7 v2 _/ v1 \* p' O0 u
  4.         Set SS = .SelectionSets.Add("SS")
    & M# N4 ^/ Y$ w+ ^5 `, w
  5.         '定义过滤器为选择单行文字对象
      i  A. e6 R" h% Q: @' _. G  L
  6.         Ft(0) = 0. g( U7 [1 s- A0 \
  7.         Fd(0) = "TEXT"8 C, l5 y% w0 R& {  _( K: R3 J
  8.         '选择所有单行文字对象: |- y) E$ x! q# w. s1 ?, m
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    " V, g3 {7 ?' F0 ]: }, H
  10.         '当存在单行文字对象时排序和替换
    4 L- V* M+ i; s- h
  11.         If SS.Count > 0 Then0 H8 F0 U3 }  e
  12.             '计算所有单行文字的几何中心- l% ]' ?! t# C2 v5 D' K
  13.             For I = 0 To SS.Count - 1$ ], H( t. V7 h: v1 X+ Y; ]
  14.                 V = SS(I).InsertionPoint
    # u* U% r, \; o* Y
  15.                 P(0) = P(0) + V(0) / SS.Count
    + J. R# L1 [  R0 E7 U- M' D1 G; @  Y& [
  16.                 P(1) = P(1) + V(1) / SS.Count& J3 Y( m4 P: _: T4 `" r, n
  17.             Next4 F; B9 i2 v. }- ^+ k3 U* u8 [0 e5 T
  18.             '重定义动态数组下标
    / {6 o2 _6 G9 y+ ?4 x
  19.             ReDim A(SS.Count - 1, 1)! [# N1 T% i& h1 s8 K; c2 {
  20.             For I = 0 To SS.Count - 10 o( G& ]1 ^! t3 w6 z: k
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号  }7 X3 C* A' v0 z
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)8 f1 j0 D3 N2 K* R) m5 A  F+ M
  23.                 A(I, 1) = I
    8 o' K4 a- _4 C( ~% u* ~* o0 W% J' N
  24.             Next
    . Z3 a( O2 v0 C: c; U/ u7 ?: j
  25.             '按角度从大到小的顺序排序
    6 J; ^9 e' }& @/ w7 M
  26.             For I = 0 To SS.Count - 2/ n. j8 q) a- Y8 d, r
  27.                 For J = I + 1 To SS.Count - 1
    6 `+ t: ]2 g1 P
  28.                     If A(J, 0) > A(I, 0) Then
    " x! j/ N* {- ]8 ?2 u9 g
  29.                         D = A(J, 0)" G1 F; R9 E, b3 ]% }% l! P0 ]6 Q
  30.                         A(J, 0) = A(I, 0), F3 z6 g  W3 I- s. z: S9 s# j
  31.                         A(I, 0) = D$ e9 q  K$ L1 ]5 H* j/ O  }+ q! I, G
  32.                         D = A(J, 1)) L2 P+ p2 P/ q6 x+ S
  33.                         A(J, 1) = A(I, 1)+ I* u+ n  ~) U  b5 x
  34.                         A(I, 1) = D; d) u$ ]9 `; Q* ?
  35.                     End If
    : @: y4 B6 b1 o. b. `& Q2 z$ ]
  36.                 Next7 q' X6 b$ a, O  d+ Q  V, ^
  37.             Next% z: a' F% m: }
  38.             '替换
    / {% i0 ~# n5 C" _
  39.             For I = 0 To SS.Count - 1, e' x  q2 p5 t& d: W
  40.                 SS(A(I, 1)).TextString = I + 1
    ) k1 R2 N; t/ O
  41.             Next
    ; [1 Z7 z/ B9 P. S* F& F
  42.         End If
    , `5 r" W5 D/ d/ s, G. J1 Y% Q
  43.         '删除用过的选择集6 i; M, a% @  U! e% m
  44.         SS.Delete% A5 c0 o& r8 k$ ~* [
  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
    3 ?% _5 G; I) x4 c# l& t9 d
  2.     On Error Resume Next
    & G8 I+ I* Y3 b, a, T5 p+ q
  3.     With ThisDrawing3 }- \3 E* m- }& }' h% l
  4.         '创建选择集,用于选择所有文字对象; T( j7 R1 E- y
  5.         Set SS = .SelectionSets.Add("SS")
    7 T+ M1 P* [+ o! ~
  6.         '定义过滤器为选择单行文字对象1 `) }- |0 N% I7 y. b4 b6 [- e
  7.         Ft(0) = 0
    - m6 q9 X$ |6 B* u1 c9 d
  8.         Fd(0) = "TEXT"6 `  }8 u! n  q! r5 Y# ?9 Q7 v
  9.         '选择所有单行文字对象
    8 z( r2 T& E. x$ c! i8 r
  10.         SS.Select acSelectionSetAll, , , Ft, Fd% u: j+ C* U* b6 A+ s% i# o1 X
  11.         '当存在单行文字对象时排序和替换: r; J/ p$ W0 \$ `  K" _5 g9 C1 q4 J
  12.         If SS.Count > 0 Then
    % j0 Y6 j1 r& M
  13.             '由用户在屏幕上指定中心点) s* }7 Y* b( n/ h# b% z; K
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:"): ~9 [6 I5 g. U3 i- B* V
  15.             '如果用户没有取消则排序和替换
    8 w2 j  p: A: a. B' z$ s
  16.             If Err <> -2147352567 Then% O+ h% \+ ^- Q& V
  17.                 '用户指定了点
    2 z! R) }3 b& Z% n7 E
  18.                 If Err = 0 Then. o# J. w4 u" l: C4 B1 `
  19.                     P(0) = V(0)
    6 j3 q  \4 N: n1 L+ N# ~
  20.                     P(1) = V(1)4 c5 n; v, D% Y
  21.                 '用户选择了默认
    # O6 b5 E5 R) C# Z# K5 E3 w- @
  22.                 Else
    - ]4 o6 N: F# t& q
  23.                     '计算所有单行文字的几何中心% q$ ?# e, \8 R7 X% Y& R
  24.                     For I = 0 To SS.Count - 1
    : x4 E! H& y! f0 d1 k& F' o4 ?
  25.                         V = SS(I).InsertionPoint
    # O5 S2 p# H4 `5 _% S7 o
  26.                         P(0) = P(0) + V(0) / SS.Count
    8 W8 Y- v$ a0 ~  |# `" z5 x1 A
  27.                         P(1) = P(1) + V(1) / SS.Count0 N0 _# t7 h/ k( U" L) _! g
  28.                     Next4 x' C1 x5 a# S4 Y8 e0 A9 k
  29.                 End If8 q! r5 v6 c, Z
  30.                 '重定义动态数组下标
    , u, I+ C+ o$ `/ P7 B
  31.                 ReDim A(SS.Count - 1, 1)/ n+ N% j; \: K+ ^% ^8 I
  32.                 For I = 0 To SS.Count - 1
    , `! \! \& f4 S0 j5 U, n3 v, s" ~
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号$ Y1 v5 U: H4 q( s
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)" m) c7 u( A- ], b6 ]' y: N
  35.                     A(I, 1) = I* L0 J  S  \. Y0 T: N' ~
  36.                 Next& U; l; m% @% L1 w: s
  37.                 '按角度从大到小的顺序排序7 w, h* i+ ]$ d' c/ S2 e7 w2 h/ F  F
  38.                 For I = 0 To SS.Count - 2
    5 n" @  {, _) t1 Y" l
  39.                     For J = I + 1 To SS.Count - 1
    " H- M+ h" X! L* }/ Q* d- p
  40.                         If A(J, 0) > A(I, 0) Then6 o' O4 I; R$ {' j
  41.                             D = A(J, 0)0 P( Q! b" l* x/ J
  42.                             A(J, 0) = A(I, 0)$ Y$ p  ?, a5 i' C; z
  43.                             A(I, 0) = D
    3 b+ W% q2 [. \8 [% I
  44.                             D = A(J, 1)
    # Z( g" M+ d3 r4 p; V/ [
  45.                             A(J, 1) = A(I, 1)7 q2 v( \5 H3 h1 ~4 Y: E( N
  46.                             A(I, 1) = D# G" e1 X/ x$ u
  47.                         End If, k" f$ ^% U# l# X  k
  48.                     Next
    3 J7 R/ f: W5 N2 f
  49.                 Next' k' W9 a8 `* Y5 S- \8 x( l. t
  50.                 '替换) v" ~9 w- m9 ]# w- t$ y% [
  51.                 For I = 0 To SS.Count - 1
    6 q# }& k/ {) f
  52.                     SS(A(I, 1)).TextString = I + 1
    ! {" u: Z4 j6 E3 ~& D
  53.                 Next
    1 T6 {' c8 _4 M4 i* f/ l$ P, Q) `: v* n9 ]
  54.             End If
    6 n8 K- Y$ Z' f/ S
  55.         End If
    ; T5 p. P5 ]% a! Y
  56.         '删除用过的选择集
      i. C; P9 L2 q" A# t* S- M1 \# {
  57.         SS.Delete% ^% P: |2 J9 a) o# u- z
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
$ q# S& \  o% k; z. l2 w, R2 t* y/ K8 b  v! ^
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
3 U" u5 B6 |  R6 M. Q# L- h我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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