QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)5 M2 U! U5 P3 X3 Z4 M
功能:
5 }' o: m$ q5 \; g% B+ U# D8 L1.查找-替换
3 ]6 u) }1 @9 J3 z6 Q6 l- T& x' d2.加编号排序3 _7 Q! {! D6 \0 j& I' q3 a- U
2我不知道咋怎?
1 _' o' k5 D4 i) x- z
2 I, \8 v* w' h             文字         文字                                             文字02           文字03# y# q3 Q) O) s

; A/ x5 h6 F6 F# n0 `文字                              文字    ----------------  文字01                                文字04
* K2 S! x- D, f; P            文字                                                                文字066 ?3 D4 O3 [0 E9 {0 H
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:# L# q; y& _( R+ R0 g0 m/ `
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
0 B7 a$ x- q* l2 K1 i0 O下面的代码仅供参考
  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$ u+ k& l7 Q1 h5 o3 o3 h
  2.     With ThisDrawing' N  t$ Q* Y4 ]4 R/ d; k
  3.         '创建选择集,用于选择所有文字对象
    * k  g% O9 r5 |9 n' i9 ?; R+ h
  4.         Set SS = .SelectionSets.Add("SS")
    % t2 t8 c. r0 M! O" ^8 y+ O
  5.         '定义过滤器为选择单行文字对象& N( a. s, D& E4 w% y: d2 R
  6.         Ft(0) = 02 b% d' w0 q" t, A, `2 N5 x, q
  7.         Fd(0) = "TEXT"
    5 x5 ~1 u" T6 a1 I* V3 K! @( E
  8.         '选择所有单行文字对象
    ; B% l! N; ]9 e8 @( z7 y. F
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    5 N- a4 p; S& J/ r
  10.         '当存在单行文字对象时排序和替换( a# N$ V. R" Y
  11.         If SS.Count > 0 Then
    / A5 g+ \# M/ I5 j. G: j
  12.             '计算所有单行文字的几何中心
    & z8 g% m# Q5 L6 D: U) |9 j2 Q
  13.             For I = 0 To SS.Count - 1) i  X# j/ u3 x4 K2 V# @6 d7 V3 b) m
  14.                 V = SS(I).InsertionPoint
    0 P( R0 I* O$ m: d# I2 l+ Q
  15.                 P(0) = P(0) + V(0) / SS.Count% a" {/ C& m/ r5 f
  16.                 P(1) = P(1) + V(1) / SS.Count$ k2 C4 F' j/ r
  17.             Next' g" g& M0 a5 Z$ ?' D( u& t* d
  18.             '重定义动态数组下标
    * l3 ^: r) n, z; k- [
  19.             ReDim A(SS.Count - 1, 1)
    & c& v2 K- i/ ]
  20.             For I = 0 To SS.Count - 17 \4 t3 b+ c3 l3 O/ T
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号' U) _# _" z, r" h: n" i
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    ( C8 ^8 T& C2 B) E2 ~2 N+ J
  23.                 A(I, 1) = I2 `/ |/ M- b, U/ c6 M; L  E' {
  24.             Next" T8 ]8 d7 F6 n
  25.             '按角度从大到小的顺序排序: ?. u7 Z8 I4 F5 s! C' s
  26.             For I = 0 To SS.Count - 2
    2 Y3 [: L6 Y( Q& R. @! {% ]
  27.                 For J = I + 1 To SS.Count - 1
    2 m. Z. D7 r" N1 I
  28.                     If A(J, 0) > A(I, 0) Then' s% k$ d& W' G6 h1 B
  29.                         D = A(J, 0)
    & [# N8 O7 ]. }) Q" w
  30.                         A(J, 0) = A(I, 0)
    - j. Z9 V0 b- @! j. [6 Q
  31.                         A(I, 0) = D
    ! O# W9 {1 x$ i+ z2 L" e! r1 o1 I
  32.                         D = A(J, 1)5 R' _. e! _1 x4 E7 c
  33.                         A(J, 1) = A(I, 1)) l8 {# C; h4 B# i" A
  34.                         A(I, 1) = D9 I! z( x9 h, M2 ^+ T
  35.                     End If+ L7 |- N7 W. D- `6 z
  36.                 Next, d- |* g2 O# }" N0 L# G
  37.             Next; ]* R3 y% S1 s  R( F, |  l0 u
  38.             '替换' Y+ g; A8 M6 |9 u7 G; F  }5 M
  39.             For I = 0 To SS.Count - 1* N' d3 g. k. r* c) b  b9 ~
  40.                 SS(A(I, 1)).TextString = I + 10 z, x. H$ k: @  E
  41.             Next
    , u7 e8 F; ?( K: R2 U7 |0 I
  42.         End If
    9 M: O* P% [7 A: E: E  c. n: y1 m
  43.         '删除用过的选择集
    ! b( @7 f3 C4 P# S
  44.         SS.Delete
    % T7 G  M( }- o
  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+ B$ @8 A& Q6 _
  2.     On Error Resume Next
    5 l& u9 o6 k8 d% ^
  3.     With ThisDrawing
    ' ]) E5 q- m$ ~
  4.         '创建选择集,用于选择所有文字对象
    9 T4 j6 {+ E7 S. }/ i
  5.         Set SS = .SelectionSets.Add("SS")' [: s; g% f4 p
  6.         '定义过滤器为选择单行文字对象
    ) p5 z1 K: W4 v4 l
  7.         Ft(0) = 0! P. q5 M1 H: o" j5 O
  8.         Fd(0) = "TEXT"0 r/ P: \7 L) f* F" ~9 x) z! r
  9.         '选择所有单行文字对象
    : G" L6 v- t3 n$ }
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    , y, t' A: W: S, ~, o! Y
  11.         '当存在单行文字对象时排序和替换
      _0 i/ |  g: w& u' ]/ ~2 l' d
  12.         If SS.Count > 0 Then
    ) t4 w3 r6 {! J$ W: O/ I" }
  13.             '由用户在屏幕上指定中心点
    * R$ e. e* ]( u7 x+ L
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:"): d! Q* j6 N! {, y, P5 y. F# ^$ C
  15.             '如果用户没有取消则排序和替换
    / D4 r1 U- r) Z; y2 i5 _! T
  16.             If Err <> -2147352567 Then
    ' O/ e3 _" Y- e$ r
  17.                 '用户指定了点6 p" E- g) W0 F3 X5 `# C4 S
  18.                 If Err = 0 Then( h, o  y" m& d) o3 m  Y) E
  19.                     P(0) = V(0)
    ' y! Z# A0 V2 `2 J2 j3 e
  20.                     P(1) = V(1)' n+ U0 B0 \5 z
  21.                 '用户选择了默认
    . _4 Y' y0 I; z
  22.                 Else
    1 F# a" C/ o+ m% q0 w0 y3 C" {
  23.                     '计算所有单行文字的几何中心
    ' f( }% h7 t; ?. d+ t  I+ ~
  24.                     For I = 0 To SS.Count - 1
    4 V6 {* ^) A  f1 X9 a# K
  25.                         V = SS(I).InsertionPoint8 O7 j5 ^+ R$ c9 j, Y5 s
  26.                         P(0) = P(0) + V(0) / SS.Count
    2 U9 O0 ~) R6 s5 @5 f) H% i& {3 n9 W
  27.                         P(1) = P(1) + V(1) / SS.Count# E/ T# R2 l) ~: J- j
  28.                     Next
    , z$ p* D! c! u6 v: {, B
  29.                 End If! F: l4 ?* C) l' N. k9 K. E! {' T
  30.                 '重定义动态数组下标
    " x4 y0 R( q. }" v* P# u
  31.                 ReDim A(SS.Count - 1, 1)
    2 M) E9 s2 }, A/ P; }" v; a  d
  32.                 For I = 0 To SS.Count - 1
    * p+ i3 R# i/ X  A
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    3 t- f* K, C' v% C/ X0 Y" }8 K* A  F
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    9 n; K$ w  F+ w0 e. F; A$ A- B
  35.                     A(I, 1) = I% t# j$ [( W, X3 n5 M: H: l
  36.                 Next7 ?2 o: W* d5 h( b, e: B* m
  37.                 '按角度从大到小的顺序排序
    7 n# X; Y+ s% |; v2 ?* t
  38.                 For I = 0 To SS.Count - 2) [1 J9 @! G& Q' A$ U0 F7 h' O3 k
  39.                     For J = I + 1 To SS.Count - 17 ?. a% K! i: y. X0 o: `- [
  40.                         If A(J, 0) > A(I, 0) Then( M+ v; O& W9 |' c
  41.                             D = A(J, 0)/ Z* u! U1 y1 s1 T# ^3 w* t+ I
  42.                             A(J, 0) = A(I, 0)# J3 L3 v. {; j8 M9 j0 F7 V+ X
  43.                             A(I, 0) = D: ^! q$ A$ I/ @! `3 y
  44.                             D = A(J, 1)
    : c; F/ r) v8 t; B% I) `& i
  45.                             A(J, 1) = A(I, 1)( s9 N9 C3 z$ w
  46.                             A(I, 1) = D
    5 J2 f7 W3 [+ d0 E& y
  47.                         End If8 D  d4 d' e5 G  U
  48.                     Next
    7 g8 M% L7 }! ^
  49.                 Next. L$ g! L) n* u% D6 T7 M: P0 \
  50.                 '替换. @  ~. H3 A# ?+ W0 v- D+ b; s
  51.                 For I = 0 To SS.Count - 1
    0 S) D% f5 ]4 W0 U' i/ S$ m$ y
  52.                     SS(A(I, 1)).TextString = I + 1
    3 y9 H( g9 q* Q; N4 m. V$ ?3 k
  53.                 Next
    + j5 p5 C0 Y  Q) x% {
  54.             End If
    ' z8 E' }' R( f
  55.         End If; f* ?- X9 W, y. S8 W( G
  56.         '删除用过的选择集' a- P* u: ^4 I: `. m( u2 J( F0 I
  57.         SS.Delete
    1 C/ p! n% [5 H% m6 k
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia 8 Q/ V& p0 {  i. u% A1 N

5 q( O9 f7 Z- I" _# F6 h# ?能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
* W) t% m8 V2 Q# F6 |5 u$ j# A$ Z我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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