QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 3688|回复: 6
收起左侧

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)/ q5 \, z8 R& W6 ~4 k% P, u) S0 N
功能:3 C7 X. O5 E! H6 I5 k) x; p/ X
1.查找-替换
3 Q  c% @; r/ Q1 I- O' s' Q2.加编号排序7 K4 b1 K9 W/ Z9 J9 Y% C4 d
2我不知道咋怎?, M2 |! T  N, S/ z4 u' i

6 s" i6 @$ Z. `) m9 \! L             文字         文字                                             文字02           文字03: T; D3 [0 K4 E
1 M) |  H  B+ Z! a' N% q
文字                              文字    ----------------  文字01                                文字04! \& O- Y; `* S2 r
            文字                                                                文字06$ D# r, B5 @1 }  x4 R5 N) R! w
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:6 ]% l% k7 `4 Z$ B& |7 K* Q" s, v
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换., m3 J" ]( E4 v$ P9 b
下面的代码仅供参考
  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 J6 I' J3 P% ]6 e: L
  2.     With ThisDrawing. O! y) L: B8 B
  3.         '创建选择集,用于选择所有文字对象, `3 W+ L6 Q& w8 |1 P
  4.         Set SS = .SelectionSets.Add("SS")
    ; t  e2 L+ @" Q6 a. p0 ^! e
  5.         '定义过滤器为选择单行文字对象
    6 a, s9 a  v) O
  6.         Ft(0) = 08 f5 I7 y* g( c0 r
  7.         Fd(0) = "TEXT"6 P) Z# G1 _# t6 O; c8 Q- v
  8.         '选择所有单行文字对象
    5 l, ~' c5 o/ S" S. H
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    - N; P" P9 v. P+ M# j
  10.         '当存在单行文字对象时排序和替换
    * B( s6 ?" E9 b- v
  11.         If SS.Count > 0 Then
    . O6 q( j  U; ~  Q5 z5 W
  12.             '计算所有单行文字的几何中心
    2 O) w+ h0 T# O: s) Q" `) f
  13.             For I = 0 To SS.Count - 14 T1 Z) U! u# B- T
  14.                 V = SS(I).InsertionPoint& X! l1 N; `1 Q5 s0 k  j
  15.                 P(0) = P(0) + V(0) / SS.Count
    - H# N6 N2 R3 J" M( u+ o7 J
  16.                 P(1) = P(1) + V(1) / SS.Count
    & ^8 w& b8 {4 J
  17.             Next
    6 e! K- T6 y  g5 G
  18.             '重定义动态数组下标0 ^# J! w, N" I; Q
  19.             ReDim A(SS.Count - 1, 1)
    - O1 ~* J: M0 C: k" ?
  20.             For I = 0 To SS.Count - 1
      {8 [) O1 X7 O0 d% B
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    / @7 _3 m8 Q! t' A/ W
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    4 Q8 F+ L8 I- W0 d0 S# o. Q3 i
  23.                 A(I, 1) = I; ?, }3 l) W* \3 v: Q
  24.             Next0 K" M  s1 X+ j; a+ U+ i6 `  y
  25.             '按角度从大到小的顺序排序
    9 ^* V4 R1 E+ H" w/ r6 C
  26.             For I = 0 To SS.Count - 2
    & b. [, \' ?( v! h: v" s; H! x
  27.                 For J = I + 1 To SS.Count - 1
    % U: Q, T' V0 |$ k- B
  28.                     If A(J, 0) > A(I, 0) Then
    ) R7 F4 ]9 _; [; N: P0 ^' r
  29.                         D = A(J, 0)/ ?' a" t5 P, i1 N- [
  30.                         A(J, 0) = A(I, 0)& Y  W$ }5 A) d' b! ]. ?7 q$ N
  31.                         A(I, 0) = D' Z& @0 k1 a" x7 q
  32.                         D = A(J, 1)
    ( X: x' F$ r! A4 D8 i9 `: D
  33.                         A(J, 1) = A(I, 1)
    / Z0 ^8 B. f7 G. z5 p- J/ K  ?
  34.                         A(I, 1) = D
    % L- l* J% P+ z( y8 W4 y1 h$ V
  35.                     End If
    - m7 ~9 G, g4 x) o7 U8 ]
  36.                 Next0 ^9 S8 w) O6 ^5 V- a4 A; n
  37.             Next" C5 g' s* O( x/ p) u$ H  @
  38.             '替换& V3 g' t) N' X! R9 A. s  q
  39.             For I = 0 To SS.Count - 1+ g* u+ B0 Z" R, W
  40.                 SS(A(I, 1)).TextString = I + 11 a  D0 S) i! E9 N7 ~
  41.             Next
    , K* Z3 z1 l$ n6 v
  42.         End If
    " g* K5 u( ~& b. x
  43.         '删除用过的选择集) R: G' i$ B5 |& z9 A- v9 _
  44.         SS.Delete
    0 o( s* a0 v4 M$ m
  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/ d$ O) u* Q) y$ _+ j
  2.     On Error Resume Next
    1 j) r% K5 K! F5 o5 z! i
  3.     With ThisDrawing0 w# S! l# h. _9 S9 v/ Z
  4.         '创建选择集,用于选择所有文字对象" a8 E. d# B7 i; W* w3 u2 F
  5.         Set SS = .SelectionSets.Add("SS")/ H1 {- c3 F9 [0 O
  6.         '定义过滤器为选择单行文字对象
    4 k- Y- s! c( X% H& v# k1 Y
  7.         Ft(0) = 02 A* c: ^6 Z# D
  8.         Fd(0) = "TEXT"( O' M5 b6 d. q' f2 ]
  9.         '选择所有单行文字对象% D7 p2 K2 U* o3 t" x1 z
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    ) j) s" ^% J. i* T: G6 Y
  11.         '当存在单行文字对象时排序和替换5 ]7 v( e( @! j) P
  12.         If SS.Count > 0 Then
    6 m) b3 h  S' q, w# k
  13.             '由用户在屏幕上指定中心点1 l) \6 m  C. P$ Q) u
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
      X/ `' o, m% _  j( y& h
  15.             '如果用户没有取消则排序和替换8 ^* i# B, `9 A0 W/ `
  16.             If Err <> -2147352567 Then
    : n* N$ C6 q* W/ q: J6 Q$ Z* H
  17.                 '用户指定了点
    * u+ O. u' w# b. Z' b
  18.                 If Err = 0 Then
    , w" j0 r; ]. i( O" b, k
  19.                     P(0) = V(0)1 g3 {- t. T! l3 o1 k6 D  b
  20.                     P(1) = V(1)
    - d: A% e2 p8 o5 D
  21.                 '用户选择了默认$ O$ \0 r; k8 M8 A& ~4 y) J
  22.                 Else
    ' p! S2 |; V6 \
  23.                     '计算所有单行文字的几何中心
    - n9 T5 _2 A% c+ \  x
  24.                     For I = 0 To SS.Count - 1& L/ g( K. e" l
  25.                         V = SS(I).InsertionPoint
    ( @9 r) h0 i; E9 Y$ w# }. h: g2 O
  26.                         P(0) = P(0) + V(0) / SS.Count
    1 ^$ m3 b" m8 d3 a: ^
  27.                         P(1) = P(1) + V(1) / SS.Count9 R) @5 y4 o" {( l
  28.                     Next( ^+ T, R8 ^2 H' x% @
  29.                 End If' u; F* G. ~1 G2 Q5 l3 N# E% \7 J
  30.                 '重定义动态数组下标& L7 F& m4 f0 l9 E  m0 r) z2 @
  31.                 ReDim A(SS.Count - 1, 1)' g& V1 ~) T% A8 I' E3 \
  32.                 For I = 0 To SS.Count - 1( w! d, ^5 f: Z( H: ?( q% V
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号- ^# n+ c+ s8 w: C
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P); ^3 d+ ?1 `! A2 x6 L
  35.                     A(I, 1) = I# W# g8 B$ @) P/ m) g
  36.                 Next
    8 R9 O. Z$ I6 }2 d
  37.                 '按角度从大到小的顺序排序
    * z7 [- y  i' ~. ]: C, b
  38.                 For I = 0 To SS.Count - 2' c- g! y5 A$ c- f
  39.                     For J = I + 1 To SS.Count - 1
    7 H) g- E" r6 y: I
  40.                         If A(J, 0) > A(I, 0) Then$ x/ w/ M' w& }( v1 q1 m* M
  41.                             D = A(J, 0)
    ; B1 h* j! z3 _. G
  42.                             A(J, 0) = A(I, 0)" C" r3 C2 d# C9 U9 _! S
  43.                             A(I, 0) = D$ r4 G: f& u9 z7 y3 ?
  44.                             D = A(J, 1)6 j$ x/ C, i& u. d0 b" y
  45.                             A(J, 1) = A(I, 1)2 F7 z/ _) J- [0 f1 A
  46.                             A(I, 1) = D
    , n& |" n7 Y4 L0 Z+ K! k0 i0 ~
  47.                         End If; f! L% R6 p$ Q4 e3 i$ P( S& ]: n
  48.                     Next
    7 g6 T7 H6 n1 j0 c: _! ~. z( l6 E
  49.                 Next
    4 P. `; A: v  E, b  g
  50.                 '替换2 y" `* D  C7 u' @; L) ?! O
  51.                 For I = 0 To SS.Count - 1; Q; O% j% V9 u3 U# D, M
  52.                     SS(A(I, 1)).TextString = I + 1
    # P6 I* U" ~3 j5 ^# M
  53.                 Next
    3 ?) H# ?# h3 N3 e7 }7 q. c! e
  54.             End If+ F! k( O" W9 {& S! a! O' i
  55.         End If* {2 }/ p0 R$ [4 f: }& ~: m' v6 ?
  56.         '删除用过的选择集& N4 e7 a; i: y) U- w( d5 b! y: M
  57.         SS.Delete
    ' H* T% @$ j) C6 D" P4 v# f  y
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
: w! R1 D3 @- B0 ?
( p! _; ~: M5 y  ^3 W. E" V能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:  S3 ?1 S2 G4 b( j  Q2 H
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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