QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
$ I0 l+ Q0 D5 _( K8 K6 q功能:1 B! _- V  |' X; k& D
1.查找-替换
5 v1 r* s! }/ ?* q; B" A" V5 P2.加编号排序
( c7 C8 w/ X) {# V2我不知道咋怎?
1 r0 n+ \9 \% _- ]3 V& q5 L
" ^$ n& Z5 G4 A# y* R             文字         文字                                             文字02           文字03$ I! P+ |" B! a
" x( H8 Z: `2 j  ?) B" p
文字                              文字    ----------------  文字01                                文字04' S# P, O3 L$ @0 d- E
            文字                                                                文字06: Y# P% k, }# L
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:1 ]) q& h, p2 Q& {8 O2 M
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
  H( e0 e$ F; y0 W- B' v9 i+ y下面的代码仅供参考
  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
    3 P# u' h* P$ x' p1 T% {- X; e! V2 j
  2.     With ThisDrawing# h; \7 G( L& l' U, w7 ^
  3.         '创建选择集,用于选择所有文字对象
    , t5 a" u* K+ g' W0 H" q7 F
  4.         Set SS = .SelectionSets.Add("SS")0 N/ ]- v' F1 ^5 X0 `- b/ r2 d
  5.         '定义过滤器为选择单行文字对象
    ) N) |# W: B0 b- d( t
  6.         Ft(0) = 06 k- M* j+ J% X, A! B
  7.         Fd(0) = "TEXT"
    $ c1 W$ Z; ?/ D% z/ T+ s. g
  8.         '选择所有单行文字对象
    0 H# B% s3 _3 Y! @
  9.         SS.Select acSelectionSetAll, , , Ft, Fd1 j: q: \! E. z# m1 A: v
  10.         '当存在单行文字对象时排序和替换
    # ~. P2 N) P* F4 z
  11.         If SS.Count > 0 Then
    * [! |/ ?+ y2 l/ N
  12.             '计算所有单行文字的几何中心  \+ M% M/ C' {! K/ |
  13.             For I = 0 To SS.Count - 1
    3 a; p/ g( Q# z2 ?+ ?$ d9 o3 Y" Z. v
  14.                 V = SS(I).InsertionPoint* ]3 y7 ]7 p; C; F+ u0 G
  15.                 P(0) = P(0) + V(0) / SS.Count0 t- U& w7 C0 f1 I& \; @) J3 A# |
  16.                 P(1) = P(1) + V(1) / SS.Count, T/ {2 w2 @/ Q
  17.             Next+ A; Z5 X: s. J# f! W! D) u  x
  18.             '重定义动态数组下标
    # V  d6 d; T# l' s3 f6 Q8 a. q+ L- q5 [
  19.             ReDim A(SS.Count - 1, 1)
    " c! d( t, |% W; a* E: a- _
  20.             For I = 0 To SS.Count - 1' r: R3 \: |( i( s" ]
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    0 T# i) L. g6 f- t$ z
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)) e7 Y9 A; ^8 H$ f9 H5 E
  23.                 A(I, 1) = I
    2 q) I: `6 \1 a4 E3 H3 v
  24.             Next6 \, I7 r# u% T* F1 r
  25.             '按角度从大到小的顺序排序
    & _6 M7 X! x, j9 x4 \
  26.             For I = 0 To SS.Count - 2
    2 I, [1 n# R3 a- J7 H, \" E% S4 S
  27.                 For J = I + 1 To SS.Count - 1
      H# D# q6 ]7 K3 M3 |4 _
  28.                     If A(J, 0) > A(I, 0) Then, L* f0 T; R' p
  29.                         D = A(J, 0)# w" l( M0 @9 h5 G" l' S+ ~' z
  30.                         A(J, 0) = A(I, 0)
    4 ^4 a" O0 N$ `# m; O( Q
  31.                         A(I, 0) = D9 b' \7 l+ h# Y5 _8 }
  32.                         D = A(J, 1)2 b& q" ?" E# A. Q. f" j( e
  33.                         A(J, 1) = A(I, 1)8 s8 W4 B& F9 I# R2 P
  34.                         A(I, 1) = D4 o0 a2 H* x! V- j  `) j' C9 u, Q
  35.                     End If
    4 c: S4 ]9 W5 L. W+ S0 |: Z8 l
  36.                 Next
    & I4 R# V. |" N- U# _& k5 F. A! M8 I  p2 u
  37.             Next
      j2 d/ J# g, j
  38.             '替换0 m) [; H) B7 o* _4 y6 P: L) I* H
  39.             For I = 0 To SS.Count - 1
    , o  |. Z) `  _$ U/ l) I4 x
  40.                 SS(A(I, 1)).TextString = I + 1
    % C! X5 b; c$ C! W9 N7 _
  41.             Next* O- S& R; ]: A7 y- k9 ~
  42.         End If
    % k8 l1 G2 Q, {, \* C: o
  43.         '删除用过的选择集7 m8 `6 U& B& ^/ w$ c' `- Q# |( r" H8 j
  44.         SS.Delete: K4 j# m$ e( s9 A
  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# U! R# H" d$ G# B* i) P4 j
  2.     On Error Resume Next- s8 Q( ]2 W1 H: m. w/ v9 M- Q
  3.     With ThisDrawing
    ; Q7 @$ y, z# a% N
  4.         '创建选择集,用于选择所有文字对象- _4 {7 |: G: Q$ e
  5.         Set SS = .SelectionSets.Add("SS")
    : s+ T: O% d0 ?, D0 S" @& D
  6.         '定义过滤器为选择单行文字对象9 i, l$ ~% u2 ?/ w
  7.         Ft(0) = 00 k7 f" ^* _2 ?# H- e
  8.         Fd(0) = "TEXT"
    - V  q# F$ }; x/ B4 u- q
  9.         '选择所有单行文字对象. s5 Y1 U& g9 S# `& g
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    : {; z1 |' h" j7 W* p
  11.         '当存在单行文字对象时排序和替换' N# E9 X: t# @% R- G
  12.         If SS.Count > 0 Then
    7 U6 O/ a7 h& D: g
  13.             '由用户在屏幕上指定中心点
    & M5 K( E; `# h. Z
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    : c9 D7 T4 ^7 c. w" A+ l" N  c, m
  15.             '如果用户没有取消则排序和替换
    & v8 H1 [# Q0 A1 _8 |2 k
  16.             If Err <> -2147352567 Then
    4 ?1 N. L+ S; G% k( @, k
  17.                 '用户指定了点' U$ N( \+ c! ^9 \$ f; i  {
  18.                 If Err = 0 Then& t( o, }, N5 q0 S. M
  19.                     P(0) = V(0)
    4 f$ ?& ?- E# Z, P* q
  20.                     P(1) = V(1)
    ! ~; k5 s7 g: \: H, u6 B
  21.                 '用户选择了默认
    % {2 I6 P$ S* H9 e
  22.                 Else
    2 I# H) D) w6 N5 O
  23.                     '计算所有单行文字的几何中心6 M# }+ X3 q- |& v
  24.                     For I = 0 To SS.Count - 1" h* D. Z7 E$ a% v6 S! c
  25.                         V = SS(I).InsertionPoint
    " X) _0 U: I) V; s$ g3 P
  26.                         P(0) = P(0) + V(0) / SS.Count" o2 F6 P. `! v: [! g/ |
  27.                         P(1) = P(1) + V(1) / SS.Count4 f0 Z- f( x* z% A. n3 @
  28.                     Next
    + d# b* U1 D9 g4 u
  29.                 End If
    6 r$ p' w( g, l& a) _. M/ ^
  30.                 '重定义动态数组下标5 l) l) @! L5 I4 f( [, D! m7 K9 w* J
  31.                 ReDim A(SS.Count - 1, 1)
    9 H  ]/ k( S0 b6 m/ [5 t" L$ F
  32.                 For I = 0 To SS.Count - 16 |: e/ F& D' }/ X- T
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号7 Q( b- H: j! m+ k  x
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    * L: a; M0 a7 e9 V
  35.                     A(I, 1) = I: B* _2 I1 m# m+ `7 g
  36.                 Next/ m8 W8 s4 |9 ]+ [" |2 H
  37.                 '按角度从大到小的顺序排序) I( X  ^; f& H, T, [. c' M
  38.                 For I = 0 To SS.Count - 2: ~6 c9 Q: @7 V
  39.                     For J = I + 1 To SS.Count - 1
    ( B6 J, P! C' w4 V. ]  S8 g
  40.                         If A(J, 0) > A(I, 0) Then
    5 u* t' T4 F3 n/ X! ~0 C& \
  41.                             D = A(J, 0)
    0 t9 ]+ a7 M) z; X' U; S3 M
  42.                             A(J, 0) = A(I, 0)
    5 R. E# T& {# g
  43.                             A(I, 0) = D
    * n( w0 l$ b$ x
  44.                             D = A(J, 1)
    6 H/ M' o% {1 F6 U" [
  45.                             A(J, 1) = A(I, 1)& Q# G% g* l: b% d1 c
  46.                             A(I, 1) = D" W+ h% b# L  x/ A- e: C/ v7 V
  47.                         End If
    1 T' Z+ T  S2 R0 B( {
  48.                     Next" p* l6 x  Z# P  M/ y5 \4 Z0 j
  49.                 Next2 g8 s7 v, @$ H: o
  50.                 '替换
    4 H7 i3 Q" W) n# D0 X+ ?, P$ o& S
  51.                 For I = 0 To SS.Count - 1$ C  h6 Y' ?5 I: n/ N/ j' a
  52.                     SS(A(I, 1)).TextString = I + 1
    # ^! k$ j& M! e# s
  53.                 Next* m9 Y1 i4 Q, L
  54.             End If
    , T; j- I* k. w/ U! {$ J! n
  55.         End If
    0 ]" o+ ]  H4 P  b+ d
  56.         '删除用过的选择集
    ( m' s( g. j! G" [( W* e( x9 L
  57.         SS.Delete
    - Y, n" `& h/ L( K' c+ R
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia / t9 p* |+ p4 [6 F+ O3 [: [4 ]

1 x5 p2 _9 L3 f8 x) D, |* l能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
: W' P) x/ Z7 [/ P: v8 h+ I我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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