QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)' D& [+ S5 ]: ?; k  C4 l9 X1 g5 K
功能:
# y4 E- Q% o: [1.查找-替换
8 L8 Y/ R8 @; z/ r- f# Q2.加编号排序
6 _4 F/ ~! Y, P. [2我不知道咋怎?9 }0 ]* Q! ]) o
3 |7 h* j8 ?: V9 _- T
             文字         文字                                             文字02           文字038 ?0 M! t0 |# [) `5 D6 q
7 A: ?( K! x+ ]4 B" o* B
文字                              文字    ----------------  文字01                                文字04
4 t/ o* w3 Z' z. n            文字                                                                文字06; V' S$ @4 `: E" L* s" ^! L$ v
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:( a1 P. N7 u, z4 B1 q- ?9 B
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
& N# {$ u+ t0 |/ y9 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% Y) S# U8 w7 i3 ]6 W
  2.     With ThisDrawing
    ' \7 t5 v/ t: w' e, Y0 V& T
  3.         '创建选择集,用于选择所有文字对象& u, x0 J, R+ s% [' G
  4.         Set SS = .SelectionSets.Add("SS")3 ~, `5 T7 B4 x. Q7 j4 U( B' i
  5.         '定义过滤器为选择单行文字对象
    - b& K) I, T% ]6 N- [: H5 x
  6.         Ft(0) = 0
    + o) |' J; }- p1 F( P: h
  7.         Fd(0) = "TEXT"
    * Q1 K/ [/ j  P8 z
  8.         '选择所有单行文字对象
    6 g1 R) `9 s$ P  \& E
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    # y" Y/ J: U# q( I' i' E
  10.         '当存在单行文字对象时排序和替换
    * T* V, E; o& y# \% T+ _, P
  11.         If SS.Count > 0 Then
    6 f! Q$ u1 I/ S) e2 J# A" @
  12.             '计算所有单行文字的几何中心% _; Z/ j% Y3 j
  13.             For I = 0 To SS.Count - 1% h2 Q6 r7 N# l6 Z5 e, q
  14.                 V = SS(I).InsertionPoint
    0 Q$ v5 F( f  f' n& M
  15.                 P(0) = P(0) + V(0) / SS.Count
    ) A% _6 [) L% y3 L% D
  16.                 P(1) = P(1) + V(1) / SS.Count
    " i* p& j" o  [# v; C
  17.             Next
    ' G) ~! v8 Q0 f
  18.             '重定义动态数组下标, w2 O$ {7 B/ {# W
  19.             ReDim A(SS.Count - 1, 1)
    8 }* c  k% Q- A( z+ b4 {% r/ p7 @4 q
  20.             For I = 0 To SS.Count - 1! ]0 q% z& d) r0 D/ y
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    % L/ T8 P1 ~8 Z1 Y; z' r$ K
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)2 h, }( i6 e1 U! b% ~: K( {
  23.                 A(I, 1) = I
    1 q( d2 p' h! Z6 |1 x: M
  24.             Next0 p+ v7 H9 @$ D( F, o- s
  25.             '按角度从大到小的顺序排序. V7 P$ G# N! E( Z9 H
  26.             For I = 0 To SS.Count - 28 T: x. Y8 U: U
  27.                 For J = I + 1 To SS.Count - 1
    4 F& r$ A- Y' |' O
  28.                     If A(J, 0) > A(I, 0) Then
    4 Z( o4 y" C# T2 u8 @, T9 [' q' {6 V
  29.                         D = A(J, 0)
    3 I/ |1 @% u/ G, g5 ^
  30.                         A(J, 0) = A(I, 0)
    0 z( q; G. U1 l3 t+ l
  31.                         A(I, 0) = D3 [4 v6 q" A; O4 Q
  32.                         D = A(J, 1)/ ~& \- Z8 B+ x3 |3 \/ Q9 W
  33.                         A(J, 1) = A(I, 1), M. o3 Q& i. A, o! i7 R# c
  34.                         A(I, 1) = D$ ^; d2 b* y! M9 C3 x
  35.                     End If
    2 K) U+ w" G- \& Z5 ~2 v( X* Z+ e
  36.                 Next  b- B0 V8 p- F( L& G; e
  37.             Next7 _9 u& Q$ O! }* F" m% F/ M" E1 f) U
  38.             '替换, `5 J; i' `) ]3 I
  39.             For I = 0 To SS.Count - 1
    2 f7 @- A: L+ f  i1 S
  40.                 SS(A(I, 1)).TextString = I + 1
    - i+ j4 X: G% z5 X8 |  k
  41.             Next
    8 H: s2 ^, t  X% D% b. ~5 S$ X
  42.         End If5 h7 q4 G) m. m+ ~& x) S
  43.         '删除用过的选择集
    : a- `+ o$ k+ [3 Z  Y5 Q
  44.         SS.Delete9 h2 z3 ^) J) }. N& U& }1 J
  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
    ' Z, F8 N' _+ g$ c6 M: F% C& x
  2.     On Error Resume Next
    5 x  f+ O; g+ W7 x8 `9 x1 G
  3.     With ThisDrawing
    / c. |" E1 L& R/ U
  4.         '创建选择集,用于选择所有文字对象
    / A6 n. G# f' Y+ v$ q
  5.         Set SS = .SelectionSets.Add("SS")& U" H3 X# @4 c3 U7 U" o. ^
  6.         '定义过滤器为选择单行文字对象
    ! ^0 O9 f/ \$ C8 A+ K5 u; V; w# }
  7.         Ft(0) = 0
    % f0 X8 y) `% ~+ O# q( Q
  8.         Fd(0) = "TEXT"
    , I+ i, m/ T( ~; U5 p
  9.         '选择所有单行文字对象
    3 Z1 H6 X2 Q8 {3 C9 Y
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
      V  E6 D2 ~% |2 ^6 b3 W
  11.         '当存在单行文字对象时排序和替换
    " W5 ~9 x% v& k2 k
  12.         If SS.Count > 0 Then% M% G+ B; X  q* [5 f1 H6 o5 y# H8 [
  13.             '由用户在屏幕上指定中心点( f6 {/ q/ i+ ^+ X
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")3 g# O" Q% D/ U: @1 A
  15.             '如果用户没有取消则排序和替换+ O5 y* v/ t8 v1 q/ J1 m3 Y! O. d" I
  16.             If Err <> -2147352567 Then9 d: i& o  G2 ?$ |( |  D# ^! n7 r2 N
  17.                 '用户指定了点
    $ }8 E1 L6 J: ~( \+ B
  18.                 If Err = 0 Then
    5 p: \1 ?) J; U& q
  19.                     P(0) = V(0)! y; a8 r" W7 M" s' ?
  20.                     P(1) = V(1)! @1 q4 K/ X$ T- t1 e9 k
  21.                 '用户选择了默认) X9 L2 B  G" |+ W) j1 Y6 J
  22.                 Else
    0 O+ d! o% b# _6 T8 N
  23.                     '计算所有单行文字的几何中心2 ?, `' E0 }2 V4 h9 O: Z
  24.                     For I = 0 To SS.Count - 10 V2 R1 U4 {$ F5 ?' _) I8 `# A
  25.                         V = SS(I).InsertionPoint( h& s# K% v- n
  26.                         P(0) = P(0) + V(0) / SS.Count$ U' M: n& m2 u# M: ~
  27.                         P(1) = P(1) + V(1) / SS.Count; q. X" s) [5 \( Y0 O" J7 G
  28.                     Next/ G; t5 b" U% n2 a& k7 h
  29.                 End If; E) i9 Z: q  e4 ~; @& ]
  30.                 '重定义动态数组下标
    & f/ H+ ~) t9 g; a' ^
  31.                 ReDim A(SS.Count - 1, 1)0 d" R( T7 p" ]7 X/ L1 a
  32.                 For I = 0 To SS.Count - 14 H/ F/ X  b! v
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号- `; U  o: M  u' I# g9 e
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    1 b! \" u* s+ Z, L! `4 g
  35.                     A(I, 1) = I. A1 O, Q) E; k6 n$ Q
  36.                 Next
      c% D+ Q  \/ J# g8 o! d& e% E
  37.                 '按角度从大到小的顺序排序
    ' a2 [4 I+ B, ?/ ~  \# D3 x3 b
  38.                 For I = 0 To SS.Count - 2: U: ]& h( l% n4 v, n$ m5 O
  39.                     For J = I + 1 To SS.Count - 1: N8 r8 V( ~$ w2 s5 q2 n5 C) a
  40.                         If A(J, 0) > A(I, 0) Then
    & }% w( Q5 T! ~/ g1 p
  41.                             D = A(J, 0)
    3 W: K2 |* r. N; H$ U7 m
  42.                             A(J, 0) = A(I, 0)2 q4 d- K5 w, K+ a0 Z
  43.                             A(I, 0) = D
    " y# z/ h% W( ?# H$ a
  44.                             D = A(J, 1)
      a+ [! F+ ?' M/ U# p+ }) S2 m8 W
  45.                             A(J, 1) = A(I, 1)
    5 S! F  q  e4 U7 O
  46.                             A(I, 1) = D1 V, F9 T* f6 R- D0 _) w
  47.                         End If0 c& O: m* c( e, X; g$ F
  48.                     Next
    6 a. F! a# \4 l( K' k4 h6 m: x4 Y
  49.                 Next+ Y4 k( r& D  V" b
  50.                 '替换
    3 ]4 S; \/ Y. M
  51.                 For I = 0 To SS.Count - 1- y( V# [9 U- s( H  X
  52.                     SS(A(I, 1)).TextString = I + 1& n, e9 t. H  ~. W  e6 H2 X
  53.                 Next0 s9 ~* R# y- i; g& W3 Q. y5 h/ p
  54.             End If
    4 P7 _: N5 ~0 p& f% Y5 ^9 |3 g
  55.         End If* u( t! ^2 d9 ?7 I+ @' O
  56.         '删除用过的选择集
    & D  c5 g8 q. H9 F. {
  57.         SS.Delete
    1 o5 r$ y; [# R/ \
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
5 R. v3 t3 O! Z; [, a1 U0 O# E5 W6 y: n, T7 ^
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:) _9 w' Y$ }: G5 r: g6 e
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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