QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)6 z& X7 v8 S- j0 e
功能:( U5 {+ b# n" A5 Y
1.查找-替换8 Z# c9 X' h4 W9 E5 T
2.加编号排序" f+ ]3 Z3 F8 j4 M- F: K+ J/ {
2我不知道咋怎?1 i/ |6 ]/ R/ o8 W8 ]# b3 [, U+ j, [
( _% T* X4 I) ?% ^
             文字         文字                                             文字02           文字03( x* S4 w9 Y# W; B. w5 G
' ]. N& a+ _: Z
文字                              文字    ----------------  文字01                                文字04. @1 ?0 S9 c. K3 z: Y' w
            文字                                                                文字06# H+ {* A: r/ S# N% f( y
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:
3 E6 D1 L& T, `, b遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换./ b3 A1 D/ w' `$ a9 m
下面的代码仅供参考
  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! T/ h$ j# E4 B7 y
  2.     With ThisDrawing
    + T2 a6 h0 g# [, }: D, ~. S
  3.         '创建选择集,用于选择所有文字对象; M  z( K+ B0 j) L
  4.         Set SS = .SelectionSets.Add("SS")
    : J' B) O" `) i/ g' V. _2 u
  5.         '定义过滤器为选择单行文字对象/ R, `# q6 E4 V' d
  6.         Ft(0) = 0) L2 \; a1 \2 }
  7.         Fd(0) = "TEXT"
    1 q% }& y8 g# y
  8.         '选择所有单行文字对象! |. L9 Z% Y+ |* N6 h
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    ! i( K' J9 ?% v4 X
  10.         '当存在单行文字对象时排序和替换
    ; W3 i5 ?7 f3 e  L* Q# C2 v) L$ G; X' C
  11.         If SS.Count > 0 Then0 p9 i# o0 R0 T$ G
  12.             '计算所有单行文字的几何中心
    - _1 N0 _8 e) O+ i6 _5 \# E
  13.             For I = 0 To SS.Count - 1
    : p$ Q4 o8 P$ N. ~/ s1 [. w  t. V
  14.                 V = SS(I).InsertionPoint
      ^: g9 V, s' Q  ]) B4 L
  15.                 P(0) = P(0) + V(0) / SS.Count
    ; y9 w2 X3 f% ]
  16.                 P(1) = P(1) + V(1) / SS.Count3 W& ^; Z/ a# ?* c+ Q4 }, d
  17.             Next
    ( R5 ^% [4 r4 @8 G
  18.             '重定义动态数组下标( c& V5 h9 U/ K
  19.             ReDim A(SS.Count - 1, 1)
    8 R' _- A/ Y" ?
  20.             For I = 0 To SS.Count - 1' |) I. M' T) T% E7 g6 T
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    9 `% h. B/ A. V( U/ o' ]. @
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)4 D7 a3 _  G0 T  m9 R7 w* _! M/ F, |
  23.                 A(I, 1) = I
    # y& c/ T8 f3 q  q% u! E' I* f/ [
  24.             Next
    6 C0 r! J; C6 I9 b1 \. ?
  25.             '按角度从大到小的顺序排序8 ]& p  R/ @6 W" f2 m+ T
  26.             For I = 0 To SS.Count - 2* I8 w( u( ?# C, V; P. _
  27.                 For J = I + 1 To SS.Count - 1" j/ F# n1 f* G. }7 z. S
  28.                     If A(J, 0) > A(I, 0) Then! Y( ~: S- _* d" P9 g- E
  29.                         D = A(J, 0)7 N8 L# P7 {1 ?$ t
  30.                         A(J, 0) = A(I, 0)
    , r( r) n) f% {) P* x* I$ G
  31.                         A(I, 0) = D0 }2 m- ]: ]+ {
  32.                         D = A(J, 1)1 P8 G( Q, o6 [& l' U
  33.                         A(J, 1) = A(I, 1)
    / F: `+ \& ?- N( Z3 G* W8 R; `
  34.                         A(I, 1) = D# {& q0 J/ ^0 j
  35.                     End If6 F4 ]) B9 |/ }; l% H
  36.                 Next# X) {, L4 p4 \9 e' S2 ^; M; g' M3 G
  37.             Next0 F( R$ N5 |; p  C. ~
  38.             '替换; `' Y' a1 F3 O6 S" ?( Q$ ^" h6 I
  39.             For I = 0 To SS.Count - 1& E3 l% t% w' @6 q# V. B
  40.                 SS(A(I, 1)).TextString = I + 19 ~7 M: e+ O- c  v5 U- ?
  41.             Next1 q/ S1 P, b9 ~4 m/ o: D
  42.         End If
    9 k9 T+ p5 Q5 |
  43.         '删除用过的选择集
    7 N$ z" x1 p1 F# E: j2 S0 x
  44.         SS.Delete
    $ f+ F2 J, d  r0 n
  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' Z8 s1 ~% ?5 N5 h
  2.     On Error Resume Next
    1 h; m& J$ R* ^' N
  3.     With ThisDrawing
    : p7 e1 W. o- c9 N, V/ R; s
  4.         '创建选择集,用于选择所有文字对象( o3 X  F! \3 o9 ?- H& A& O  j
  5.         Set SS = .SelectionSets.Add("SS")7 ]# r" S6 R$ ~9 Q+ h" ~
  6.         '定义过滤器为选择单行文字对象3 y6 |8 A) C( j& d
  7.         Ft(0) = 0
    * q' N" Q2 E" }& E1 z+ C- H
  8.         Fd(0) = "TEXT"$ Z; Z: u" X! x3 K1 ]- t+ L
  9.         '选择所有单行文字对象; N7 Z! ~; z1 {: n  s1 C9 d+ I" i
  10.         SS.Select acSelectionSetAll, , , Ft, Fd1 c# ^" |! F( a. i( l$ E  C2 h2 P
  11.         '当存在单行文字对象时排序和替换/ |) @; }( e5 Z# [/ `+ s6 ]3 {/ B& v
  12.         If SS.Count > 0 Then
    5 U3 d2 g' N( J/ _% S
  13.             '由用户在屏幕上指定中心点$ ?+ |) S  P4 h
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")9 L4 p: Y9 f5 c/ K
  15.             '如果用户没有取消则排序和替换6 I+ ^  U0 f. W/ z" N  i
  16.             If Err <> -2147352567 Then
    # z" z% k7 C9 y7 ^# O; H; C5 ?
  17.                 '用户指定了点) a  t' I6 G! [- @. r
  18.                 If Err = 0 Then/ h. A) N0 j' I" y* Q
  19.                     P(0) = V(0)7 ]3 N4 s% X1 i2 p" c, s
  20.                     P(1) = V(1)
    . N/ n# Q: J" Q8 i8 ^
  21.                 '用户选择了默认! T3 k' C' O- q; e% d) K
  22.                 Else5 _+ c, Y) K, E1 U0 K
  23.                     '计算所有单行文字的几何中心* A- y8 U/ {! e( g& E) R
  24.                     For I = 0 To SS.Count - 19 h. c4 Q- Y, ]# d
  25.                         V = SS(I).InsertionPoint8 [: T. e0 g! y* [
  26.                         P(0) = P(0) + V(0) / SS.Count3 X; v. d; k$ v. C% _+ m
  27.                         P(1) = P(1) + V(1) / SS.Count
    ) R# L& Q8 a+ @$ ~, s% e0 j
  28.                     Next6 l5 O0 w- L2 _. f8 ^8 d$ |2 o, ^
  29.                 End If
    : R# }1 d8 f+ C1 I0 m9 P1 u
  30.                 '重定义动态数组下标
    9 y7 ?1 W& n7 Z3 R5 w' {
  31.                 ReDim A(SS.Count - 1, 1)
    ; b$ r' f6 ?; T4 m
  32.                 For I = 0 To SS.Count - 11 }5 I$ s  C2 F/ k) {1 D: }2 u
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    . x  M$ U  g, X
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    * q7 p( ^% V; I8 E; m/ |
  35.                     A(I, 1) = I% {2 [& _! B" ~/ T4 b3 F
  36.                 Next- x3 R- P$ G" _& H) m+ p6 m
  37.                 '按角度从大到小的顺序排序8 B/ l9 \2 b; x$ j( u8 ^2 B4 \$ b
  38.                 For I = 0 To SS.Count - 2
    : {4 X8 \6 [5 y
  39.                     For J = I + 1 To SS.Count - 1! E3 p2 a& e  p  O0 K
  40.                         If A(J, 0) > A(I, 0) Then
    / ^" F  ^% u2 J6 ]
  41.                             D = A(J, 0)8 L' l+ x: J5 [8 U2 A: G
  42.                             A(J, 0) = A(I, 0)
    ( y/ _, V: d9 ^# C5 K; Y
  43.                             A(I, 0) = D
    2 l& ]" ?1 q+ [
  44.                             D = A(J, 1). l1 d. v3 y- [5 W& o' h6 L
  45.                             A(J, 1) = A(I, 1)
    3 Q3 D- d( ~6 X. X, {7 b; t3 m
  46.                             A(I, 1) = D
    0 E) k- c7 |2 U' k6 b
  47.                         End If$ [  U( P& ~; L9 A" A
  48.                     Next
    ! Q  a' C( b; q3 E- G- ]
  49.                 Next
    ( y0 |4 _1 X7 u" E% {
  50.                 '替换
    : b- }; u. [; `9 s' {# h3 j" m
  51.                 For I = 0 To SS.Count - 12 C8 _/ _: c/ j  n  ?" l& ^. E. e
  52.                     SS(A(I, 1)).TextString = I + 1
    - t5 W2 ~/ X& P& C
  53.                 Next9 g: M8 A' \  E+ A8 Y  O! ^
  54.             End If- s2 P+ ?5 S: Y% @
  55.         End If1 y+ _+ h4 \2 O9 c2 a. L8 ^
  56.         '删除用过的选择集
    ( J" f" U4 |" [. S+ |1 s5 l
  57.         SS.Delete) m5 [3 V6 ^* z
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia 9 D9 G0 f) `4 i. h

' l' P9 C( w4 I1 M6 h能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
. {- N4 U% U7 g( ]* ~我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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