QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)$ o6 U& }" E. a, A  H  q- q$ M
功能:
. b( }& b5 M5 r1.查找-替换
, p# G- S- l( _4 v3 f9 L4 d2.加编号排序
6 R0 k: ]# i; T2我不知道咋怎?
5 i; h( G* P; ~9 Y# E; b; D
/ b8 ?7 L7 B( ^6 y! z6 z$ L: b: u             文字         文字                                             文字02           文字03# c9 p( o5 `; L- Q
# s/ z2 `8 G: r6 i
文字                              文字    ----------------  文字01                                文字04
( g0 {) M6 y9 N            文字                                                                文字06+ \; p6 p  k! e! L! p
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:
+ j. O' T& N& N遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
' x. ^- c' s$ g( T1 P下面的代码仅供参考
  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
    0 F. K+ P2 X, c' S5 B, ^4 \$ f+ I
  2.     With ThisDrawing
    : k( U5 r; C' O: U
  3.         '创建选择集,用于选择所有文字对象
    ) m8 ~# I0 J( ~% y/ r; I) X& l$ |
  4.         Set SS = .SelectionSets.Add("SS")  R0 b7 C8 U, |- l
  5.         '定义过滤器为选择单行文字对象
    3 B. e8 t; T! u' a+ Z7 g( h
  6.         Ft(0) = 0( B! n" ^6 g2 K: H- v
  7.         Fd(0) = "TEXT"
    & T% C& x1 a# h# Y  I
  8.         '选择所有单行文字对象
    ( E$ a9 Z( P1 W2 P9 s
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    ) O9 W8 q, h5 S: E1 D
  10.         '当存在单行文字对象时排序和替换
    ( U, T$ F: v# v  x/ x4 u- e
  11.         If SS.Count > 0 Then0 d* r# ^  F; ]% f. `( p9 x  z
  12.             '计算所有单行文字的几何中心, c2 ~6 w3 p$ I% l" \& p9 @
  13.             For I = 0 To SS.Count - 1
    # \% ~* g% l& R8 d& `5 z6 }- o5 d+ j: b" M
  14.                 V = SS(I).InsertionPoint
    7 ^. y- o+ _4 p& V# ^$ o+ o) e
  15.                 P(0) = P(0) + V(0) / SS.Count* O; s" f- d7 k5 J) X) U
  16.                 P(1) = P(1) + V(1) / SS.Count9 j' }1 [  n7 a* P( W3 F8 E
  17.             Next% e  D( L6 g2 y: j; Y
  18.             '重定义动态数组下标
    # d6 q# ?1 j0 _. Q( o8 u7 c4 w. ]) H
  19.             ReDim A(SS.Count - 1, 1)$ h8 M. \6 V( z  `
  20.             For I = 0 To SS.Count - 1% B* l3 h, L  @) h  m
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    ( o9 \0 k' Q7 u2 G0 e
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    & t) ]  p* z3 e9 }- K
  23.                 A(I, 1) = I0 M' Y( F% r& ^! B8 d
  24.             Next
    * j2 C: s: T; p
  25.             '按角度从大到小的顺序排序
    : |* J$ S  N9 G/ \! ~
  26.             For I = 0 To SS.Count - 2
    - T$ a% n9 e- ^$ f. p& U
  27.                 For J = I + 1 To SS.Count - 16 A" g/ z" t) n$ F3 A5 J, I& F6 _
  28.                     If A(J, 0) > A(I, 0) Then
      e( D. e$ S- g3 r: G3 c
  29.                         D = A(J, 0)5 m* L& n' L  u2 ^9 v
  30.                         A(J, 0) = A(I, 0)
    6 Z- z7 Y: A0 ]* Q) Q, N: v
  31.                         A(I, 0) = D% l+ D% l2 [7 d* S; d
  32.                         D = A(J, 1)' p# n5 a/ R8 g
  33.                         A(J, 1) = A(I, 1)
    , }2 |. x# L: E
  34.                         A(I, 1) = D# M; @5 ^# d8 Y0 ~
  35.                     End If, K6 s; K; c/ x. h* f+ H
  36.                 Next
    ( [# Q) l0 M/ B3 a4 r, r
  37.             Next$ b- {7 y7 n. Y$ k: d
  38.             '替换
    * Q/ {7 ^, _, `* V- b
  39.             For I = 0 To SS.Count - 1
    0 A9 Y- s- V0 T
  40.                 SS(A(I, 1)).TextString = I + 1
    3 X2 F7 w, E, m. }' p
  41.             Next
    9 G$ M! b5 T, ~8 f) U
  42.         End If
    - ]. x- d$ M$ {; V5 s* D
  43.         '删除用过的选择集" g  \0 Z  P* s; J
  44.         SS.Delete$ E5 ?3 a0 B) E) A. V2 v% M- p
  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
    ) F& i3 ?/ Y& g! d3 Z
  2.     On Error Resume Next
      z. @& F, x: j$ v/ D9 s
  3.     With ThisDrawing
    2 _4 Y# q- x7 u
  4.         '创建选择集,用于选择所有文字对象% q# q# P( X- \& h
  5.         Set SS = .SelectionSets.Add("SS")
    , f) Q; n, C' a+ Q5 b; b* b9 X* y6 a
  6.         '定义过滤器为选择单行文字对象
    # q" Q- D8 O+ e  I: r  Y
  7.         Ft(0) = 0
    * q9 u1 `% d8 u2 y2 M
  8.         Fd(0) = "TEXT"
    9 V6 B' B$ Q; C0 u
  9.         '选择所有单行文字对象# u- U; s, E! v  C9 O* ]
  10.         SS.Select acSelectionSetAll, , , Ft, Fd5 K+ {$ ^* M2 C# i
  11.         '当存在单行文字对象时排序和替换0 q* j; X8 p4 d  ?
  12.         If SS.Count > 0 Then+ M2 z' j* j, k. k  T5 D( t5 Z) g
  13.             '由用户在屏幕上指定中心点
    ) v' N6 p- C7 P3 n) c
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")/ _6 q( i; W- q$ N8 z3 H; J
  15.             '如果用户没有取消则排序和替换
    . @- t7 _1 c- X& \, I
  16.             If Err <> -2147352567 Then  ~. o1 i( @5 T/ w/ I* s0 V5 Z& p
  17.                 '用户指定了点
    3 h3 i/ P4 ^0 C: J0 \  D
  18.                 If Err = 0 Then
      p; Y$ ]( K0 n% f
  19.                     P(0) = V(0)% G+ ^1 i. a5 a0 h4 G6 I; B  T2 D' }
  20.                     P(1) = V(1)
      T. d/ _- f% a$ R7 D  m
  21.                 '用户选择了默认5 F3 b2 `$ f# W; [- K& T4 }
  22.                 Else
    , @2 ^- X0 J& y0 `( x5 `. k
  23.                     '计算所有单行文字的几何中心1 q0 W1 ]! s4 H$ w" P) U8 x, p8 ]7 @
  24.                     For I = 0 To SS.Count - 1# A1 I; H4 r, d% \
  25.                         V = SS(I).InsertionPoint
    ( A0 G" A% Q/ G' Q1 q% P2 A0 K
  26.                         P(0) = P(0) + V(0) / SS.Count
    : `" h, F/ A0 @
  27.                         P(1) = P(1) + V(1) / SS.Count9 V# \' x/ p' O" t# ]5 T
  28.                     Next
    4 V7 h& K) D4 D9 n0 g3 K9 b2 w, c2 {/ h
  29.                 End If
    ) Y$ t1 y- y( y5 o; O8 z
  30.                 '重定义动态数组下标6 y0 W/ o5 [/ P8 g+ C5 i3 M4 ^
  31.                 ReDim A(SS.Count - 1, 1)! l+ f& t5 H. U/ }- N
  32.                 For I = 0 To SS.Count - 1
    - O% |, q0 R/ z7 }$ M. p0 X
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号' c3 G, G: ~/ m4 {) z
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)6 l8 E" F3 |- w
  35.                     A(I, 1) = I/ c6 u# V9 M4 X1 w+ u2 T* f6 q
  36.                 Next" M3 _9 J+ j$ t* A5 W9 M8 ~( ~
  37.                 '按角度从大到小的顺序排序
    & \  w, Y+ j' e4 T
  38.                 For I = 0 To SS.Count - 2  |- z8 n. U( c/ P3 |' t+ Z5 `
  39.                     For J = I + 1 To SS.Count - 1# L) \( \1 y5 A, Z4 K7 @% U
  40.                         If A(J, 0) > A(I, 0) Then
    6 N3 ~0 M, X, @3 j- z( A8 U: I' n
  41.                             D = A(J, 0)8 q- b- r; ]* m/ ]2 g3 _
  42.                             A(J, 0) = A(I, 0)/ v4 a) m, W3 x: N0 O7 A8 h4 O* F
  43.                             A(I, 0) = D1 U* V9 P* N- r+ b( b, {8 ~
  44.                             D = A(J, 1)
    2 K. H" M/ ]3 I
  45.                             A(J, 1) = A(I, 1)
    ; S  I& k& b4 p, R. ]3 M- }' i4 ?5 F
  46.                             A(I, 1) = D$ A, t, b; W: Y9 f" S
  47.                         End If
    9 b9 D$ n6 |! W2 v- p7 O
  48.                     Next
    / M# ^9 s6 W, c4 W" s, v
  49.                 Next6 g% x! p/ F/ Q$ d" l
  50.                 '替换  J# M) ]4 u" H6 a8 D( x
  51.                 For I = 0 To SS.Count - 16 W8 T0 O& \$ ]6 f
  52.                     SS(A(I, 1)).TextString = I + 1
    9 B& @3 M# E" b% L& |9 o% L9 d
  53.                 Next
    , Z% y+ \3 H& u4 k" Y! N/ `- t
  54.             End If+ T1 [0 Z" A# h$ E7 @0 B8 [
  55.         End If4 j9 r# |1 B, P& L
  56.         '删除用过的选择集9 }) T9 G: C" v. _
  57.         SS.Delete7 q- M6 |7 k, A
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia 6 V0 w( h4 d% |5 D; y3 \

; G# Y5 \, n4 q能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
# v* _; C% l9 t- @& }* |8 |我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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