QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
7 L/ [* O1 E; x& o( h功能:
4 Q: v, G0 v- e' c5 [$ O1.查找-替换2 b6 t. v( @7 h* ^
2.加编号排序
! a; q' X- R* L+ e7 }2我不知道咋怎?5 s; Z7 I3 O: H  y# o/ s1 t+ B
  P7 Q- p& v! \
             文字         文字                                             文字02           文字03
$ f6 c5 T& |8 [6 j
" w; z3 v/ E0 ]* r, Z4 Y- y# a) `文字                              文字    ----------------  文字01                                文字04
5 p0 ^/ J4 ?! \            文字                                                                文字06
+ H( f( {5 H) m* q: t. ?                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:, A' i4 r& y; I- N* n- `6 [5 h7 K7 J  K
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
+ B/ N* z% n1 s1 B' 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 Double6 a! e( X! k& V
  2.     With ThisDrawing
    6 `4 \" N* j: N+ g) K7 l# B9 x4 A5 i' \
  3.         '创建选择集,用于选择所有文字对象
    ! u$ {9 ]* I5 l% H
  4.         Set SS = .SelectionSets.Add("SS")
    ' R( V/ p" x. n9 N4 P! J
  5.         '定义过滤器为选择单行文字对象
    8 ~& D- i4 Q9 s* j
  6.         Ft(0) = 0/ s& ?5 D" A' W/ [: r( |) }; p4 e
  7.         Fd(0) = "TEXT"
    / H4 R; g" _9 Q/ s2 H7 s
  8.         '选择所有单行文字对象! i: z, k1 ]- C) e
  9.         SS.Select acSelectionSetAll, , , Ft, Fd  c8 x  V5 _: W) x  R
  10.         '当存在单行文字对象时排序和替换
    ( t0 n' s  l0 q) U6 ^
  11.         If SS.Count > 0 Then
    . s+ N# J* r7 t6 h" N
  12.             '计算所有单行文字的几何中心, K5 p8 X( |# m/ }
  13.             For I = 0 To SS.Count - 1
    . i$ _; H6 K& U1 J& ~
  14.                 V = SS(I).InsertionPoint
    2 |1 T- X3 Q* E% ^: d
  15.                 P(0) = P(0) + V(0) / SS.Count
    ' T2 X1 k( G/ g( @$ y
  16.                 P(1) = P(1) + V(1) / SS.Count  B# ]* O# U( ]0 O: ?: z! y7 o  z
  17.             Next
    2 ]+ E8 C+ t/ ?6 m
  18.             '重定义动态数组下标
    3 w; G# f- J) _  C: x# b- `
  19.             ReDim A(SS.Count - 1, 1)
    , w  q7 Z, W$ q7 p: T2 {) G
  20.             For I = 0 To SS.Count - 1, E" J7 f) x3 {
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号4 C( c) O' Y# ~& J) g
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    $ C" F' S) P( c
  23.                 A(I, 1) = I0 |2 }9 g- W- Y) z* V: L
  24.             Next
    , E5 f! a# ~% q1 `* c& ?5 y
  25.             '按角度从大到小的顺序排序* n/ e$ s! k# F) M/ m: I! h
  26.             For I = 0 To SS.Count - 28 V0 ?7 u- S8 i( O0 P8 `$ C
  27.                 For J = I + 1 To SS.Count - 1+ y$ i, L2 s6 W# t  g! ?5 z& U
  28.                     If A(J, 0) > A(I, 0) Then
    % Z5 h. d" Y' Y- y- W
  29.                         D = A(J, 0)# Y% J. b* a6 d! v5 H8 ?) O8 g. [
  30.                         A(J, 0) = A(I, 0)
      g7 W% S8 m9 d" S3 X! w: D
  31.                         A(I, 0) = D! P' X/ ?; u8 K5 S& w. O
  32.                         D = A(J, 1)' ^% K3 l9 j! r0 B  j6 A- |6 `
  33.                         A(J, 1) = A(I, 1)
    , M- O* k8 I9 G9 |
  34.                         A(I, 1) = D9 S; f+ j! A3 j! w
  35.                     End If
    3 e- S7 q) W7 {5 f, S
  36.                 Next9 s2 ]4 c" }# a( ]# t
  37.             Next
    ! _% z1 C* B+ Y0 Y/ r: g! t# G; w
  38.             '替换1 y! F; @3 ?* }
  39.             For I = 0 To SS.Count - 18 |2 O6 `# ^( Z* X5 V
  40.                 SS(A(I, 1)).TextString = I + 1, Q3 I) [# j) `3 a- a& x
  41.             Next
    " i/ w0 F9 H' v
  42.         End If. ~6 E# j/ T# K: O7 X
  43.         '删除用过的选择集6 C$ X, p0 _: C  |; f
  44.         SS.Delete: u- a# O/ y4 M. ]/ s% d3 g
  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
    % i4 J/ O* }; a5 ~
  2.     On Error Resume Next: f7 f' n, L  U6 }1 o8 ~/ p$ g4 x: t
  3.     With ThisDrawing
    : U; u' f& i+ F( Z. G* T8 K1 i
  4.         '创建选择集,用于选择所有文字对象6 d! v9 ]5 b& i
  5.         Set SS = .SelectionSets.Add("SS")
    5 g) B+ o7 L6 \0 I
  6.         '定义过滤器为选择单行文字对象
      P" _: K# F7 D1 ]# e( H3 l
  7.         Ft(0) = 0- a2 `2 W8 {/ Q
  8.         Fd(0) = "TEXT"
      H! |. W7 u' `8 j* ?4 R
  9.         '选择所有单行文字对象
    . {. U  g/ e1 z1 ^
  10.         SS.Select acSelectionSetAll, , , Ft, Fd+ [+ A* ~4 `; C+ u& d0 C
  11.         '当存在单行文字对象时排序和替换
    0 Z& d( E) D' j, ~/ ~; x3 G
  12.         If SS.Count > 0 Then
    # c7 w0 G: W/ E0 }- `3 Y, b- N8 F
  13.             '由用户在屏幕上指定中心点8 ~9 K# p; Z8 R: x( q( M
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")2 O9 D# n  t( `" J8 \, N& @- P! t
  15.             '如果用户没有取消则排序和替换" s. w! A/ f8 F* H, N/ H
  16.             If Err <> -2147352567 Then$ ^6 \$ q. w) S+ `: i1 Z7 C
  17.                 '用户指定了点) e* m# }) {7 J% ?9 H& W8 i9 f" ^
  18.                 If Err = 0 Then- ?* i; D& p" V
  19.                     P(0) = V(0)
    4 t3 X) R$ F  G; p, F
  20.                     P(1) = V(1)
    : n- m' l# v/ A- Q+ z; S1 d: k
  21.                 '用户选择了默认
    : ^: ]- C, G" M1 E% X' w1 b
  22.                 Else
    , Q" a0 X$ m  G, n" Q
  23.                     '计算所有单行文字的几何中心9 B3 ^; T/ g# ]) N- n8 W
  24.                     For I = 0 To SS.Count - 1# w$ P+ o8 K, u7 {9 y6 w' B
  25.                         V = SS(I).InsertionPoint4 C3 Y  z( N: T6 u) Q9 Q" M1 x
  26.                         P(0) = P(0) + V(0) / SS.Count
      ]# i# O7 g) E' P+ ]  Z
  27.                         P(1) = P(1) + V(1) / SS.Count
    # ~4 i" Y) P% T, m: j* [
  28.                     Next
    + t! d& v4 X* q2 A3 N
  29.                 End If
    0 W) @+ \7 _% A
  30.                 '重定义动态数组下标$ \; H) b1 K9 \8 O& ?) I
  31.                 ReDim A(SS.Count - 1, 1)
    7 b/ C+ `: h5 N
  32.                 For I = 0 To SS.Count - 13 e3 c% @) x% u7 R9 U9 A
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    2 x7 \, L2 h, }3 a
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)8 U" {  n" a; c3 t- s& N
  35.                     A(I, 1) = I
    " V+ ~3 D, {) a0 ]0 h
  36.                 Next' S6 k. M, P  z5 w6 F$ p
  37.                 '按角度从大到小的顺序排序
    1 D. {" p# T# o" w  a. Q, B
  38.                 For I = 0 To SS.Count - 2
    0 t4 e# Z2 |* w# ]+ L0 o
  39.                     For J = I + 1 To SS.Count - 1
    * Q; M$ B1 o: G# j/ U
  40.                         If A(J, 0) > A(I, 0) Then' s. m) \! }3 N! y
  41.                             D = A(J, 0)
    ' j, G2 Y$ S1 P" G
  42.                             A(J, 0) = A(I, 0)
    ; |- T7 F& J  E4 n* f" y
  43.                             A(I, 0) = D! ?( H/ L) q* s7 x3 s
  44.                             D = A(J, 1)+ o1 L" Q4 `1 [2 L, e$ r9 ?
  45.                             A(J, 1) = A(I, 1)7 ~' U) N+ X' s
  46.                             A(I, 1) = D
    ) A7 y, g- }4 V+ k4 B
  47.                         End If
    3 f' L6 o; ?: f
  48.                     Next
    , U( I$ `- }# q: T+ `: N4 U2 M
  49.                 Next5 g" G% z& o) l; Z/ c+ w; ]* w
  50.                 '替换5 c# V; j; T/ Z" V2 Y
  51.                 For I = 0 To SS.Count - 1+ Y4 s, g1 o9 S9 x' |! V. W' x
  52.                     SS(A(I, 1)).TextString = I + 1! N) g: y, A# \2 @% L, U. r& f
  53.                 Next+ a4 ?4 |& x4 J0 E7 M1 G
  54.             End If9 N& C& E+ y+ [3 P1 Z
  55.         End If
    8 J* `2 O( V$ K0 S; ]/ J
  56.         '删除用过的选择集
    0 q% C! a4 f: W1 y
  57.         SS.Delete4 }4 X  G7 z3 w3 G
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
2 K( p! A! U, Y1 @% [+ {& z) e: J# P1 r+ l0 G( k7 e4 Y% e
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:8 ^' Q. y4 V6 [3 L: P, K
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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