QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)+ `  I7 ?& I% E1 O! \7 E
功能:- ~2 p( m1 ?6 x3 K) z2 r
1.查找-替换
9 U7 Z3 }. ]( [" f( o* I0 x2.加编号排序
$ L1 Z! L( M" i1 [2我不知道咋怎?
6 |- b6 [# g0 i9 l( S
) g) S5 o3 V. j) q             文字         文字                                             文字02           文字030 z; l; P) L# N) M+ m- U% ?8 U9 u; K
9 x" I6 `( p, Y9 r, w
文字                              文字    ----------------  文字01                                文字049 C1 H" ^% B# j2 O, ]( U
            文字                                                                文字06
- ^8 s, n' {, I                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:+ R! ]6 m. E/ J5 Y, ~# y
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
1 Z" n2 i- a0 W- ?. N下面的代码仅供参考
  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+ X2 A3 _  |4 C8 a0 L, l
  2.     With ThisDrawing
    , l+ z5 l" n: K! n. y+ e7 l; w  r
  3.         '创建选择集,用于选择所有文字对象
    ) u1 p! u" \8 a4 g' |4 ~' w2 L
  4.         Set SS = .SelectionSets.Add("SS")! b* S/ _& b7 n$ P1 k. A
  5.         '定义过滤器为选择单行文字对象
    , C9 Q+ C# S3 c, L
  6.         Ft(0) = 08 ?% s3 U) q: V# o) u% r8 M" g1 i
  7.         Fd(0) = "TEXT", a" T( y* s# h! w1 C
  8.         '选择所有单行文字对象7 K2 _5 m" k' g4 x& {
  9.         SS.Select acSelectionSetAll, , , Ft, Fd/ {$ ^; d( i& I7 N# E
  10.         '当存在单行文字对象时排序和替换6 c, @9 X+ f2 t8 c% ~; h
  11.         If SS.Count > 0 Then4 X4 u% v& \6 ^% ], v
  12.             '计算所有单行文字的几何中心/ `+ ~, s) ]9 B' @. @4 k
  13.             For I = 0 To SS.Count - 1
    , A8 Z: L% y# o6 G) L
  14.                 V = SS(I).InsertionPoint8 ~3 d, ]. C/ m% a& B$ T* m# u
  15.                 P(0) = P(0) + V(0) / SS.Count2 F& q3 l  B. G: w
  16.                 P(1) = P(1) + V(1) / SS.Count6 ]/ z. U( N7 c" [
  17.             Next
    ( Z( i& Q: V2 j! x4 A6 Q: X5 K
  18.             '重定义动态数组下标( D% {- t; y6 o3 X7 h* b* q
  19.             ReDim A(SS.Count - 1, 1)
    ( I# n6 R; v7 }5 o( t
  20.             For I = 0 To SS.Count - 1) Y9 R6 g9 g& g" {) y8 j5 C& H
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号% C5 v# G# T1 s9 A* {
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P), V4 K* L9 R" E1 m' h* `- _2 \- _$ e' l
  23.                 A(I, 1) = I
    4 A; \. c0 D* Q6 V- R
  24.             Next$ n7 J8 |7 Z1 W) A# L
  25.             '按角度从大到小的顺序排序8 ]( @* I" K/ D2 {# l1 _
  26.             For I = 0 To SS.Count - 2
    % n: j* ^9 a0 F$ z, s# I( ?
  27.                 For J = I + 1 To SS.Count - 1; a) Z) N- t8 r/ D/ }/ ]# N
  28.                     If A(J, 0) > A(I, 0) Then
    6 i& r, ~6 x9 U' _' O& U0 p
  29.                         D = A(J, 0)
    9 Q/ n7 I2 s9 f# f, |. T% d+ ~
  30.                         A(J, 0) = A(I, 0)
    - E. Q3 m7 S9 g$ _
  31.                         A(I, 0) = D% a  u6 S8 f; v8 r( F& U
  32.                         D = A(J, 1)
      T) R; x6 _; J3 ^
  33.                         A(J, 1) = A(I, 1)& G$ u1 P4 M( K5 i% W
  34.                         A(I, 1) = D. F- H7 c  U9 A4 p8 Z6 S
  35.                     End If
    3 ~* v% _9 m6 p) J# |' @
  36.                 Next1 @3 b# X/ z! C
  37.             Next
    9 U# p* k, {7 [" B/ d' p! @+ q
  38.             '替换2 i4 i0 F  t/ N+ C. x& B
  39.             For I = 0 To SS.Count - 1) i9 C8 W2 A1 i3 Q7 r
  40.                 SS(A(I, 1)).TextString = I + 1
    $ z" ~$ r& Y9 A% x& {) {
  41.             Next' ~3 a  f. [% I& O$ ~
  42.         End If  h3 T% N) T0 C; M! N' x+ z
  43.         '删除用过的选择集
    ! c/ R: g/ n, D" q# O3 f
  44.         SS.Delete
    2 ~. E9 T& A9 G: I' x$ ?& ]
  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
    0 o4 V) Z8 I' s  o
  2.     On Error Resume Next
    5 k. ^; _- r6 i; u; g  H
  3.     With ThisDrawing
    7 i+ p% e8 y! \! [8 R2 H8 |! d2 Z1 m
  4.         '创建选择集,用于选择所有文字对象2 G, r- E$ h. Y1 P1 Q; |0 T
  5.         Set SS = .SelectionSets.Add("SS")
      K: u  C2 V9 M% T
  6.         '定义过滤器为选择单行文字对象
    ' Y$ t% I( I+ w
  7.         Ft(0) = 0$ H9 t7 Y+ P; b- p1 }
  8.         Fd(0) = "TEXT"
    5 [$ x8 g- A$ y) b+ h
  9.         '选择所有单行文字对象
    . o. Q$ D- y. ?7 e7 P" q. O, G
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    ! d" Y3 q9 ^# X0 ^2 `% _
  11.         '当存在单行文字对象时排序和替换
    : a& g8 I4 O8 b6 B
  12.         If SS.Count > 0 Then  c6 g! Q. i7 w+ K  P2 N. t. ^7 N1 A
  13.             '由用户在屏幕上指定中心点
    : `4 V, C# l! _9 {, x
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    + \6 `" l; \' s8 M
  15.             '如果用户没有取消则排序和替换; k; l0 A- F1 ?; M+ T" \0 N
  16.             If Err <> -2147352567 Then+ t' ]6 @+ |% W- o- J# Z
  17.                 '用户指定了点6 P. h, J) P! H. T- P. L
  18.                 If Err = 0 Then
    7 |. k; ]' j* W+ k1 X( R' J. i$ R
  19.                     P(0) = V(0)* E1 D% Y4 I- L) g) d+ A
  20.                     P(1) = V(1)% i- p9 V* y) {
  21.                 '用户选择了默认0 d: ~" z' m6 y& W% z
  22.                 Else
    / [% C, |0 Q0 a# w( P) i9 }
  23.                     '计算所有单行文字的几何中心  u$ O# ?0 Z+ X, d5 H& Y# f
  24.                     For I = 0 To SS.Count - 18 d+ I$ ]$ }7 t* ~2 W7 Z3 t6 J
  25.                         V = SS(I).InsertionPoint5 \+ K" O0 O# \* \
  26.                         P(0) = P(0) + V(0) / SS.Count# F. z0 ?  w0 t$ M3 F
  27.                         P(1) = P(1) + V(1) / SS.Count
    0 r% _. r$ O+ C: u8 ^7 z+ o$ Q
  28.                     Next" \. X: E0 ~" H$ h; W( i
  29.                 End If
    % ]0 ?# E! h; Q
  30.                 '重定义动态数组下标) l" O1 S) Q2 F, q( ^6 ^" i5 e* e
  31.                 ReDim A(SS.Count - 1, 1)4 T( r) l7 |8 g0 H' \% _
  32.                 For I = 0 To SS.Count - 1* c) v4 ~3 E& K9 t1 V4 H& N; F
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号' T% B! A7 ]8 [- M; T0 Y
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    8 c$ ]9 l, y! o% \
  35.                     A(I, 1) = I
    5 i1 w. h6 |$ H, H) B
  36.                 Next9 U- E+ D* i% d7 n: w3 Q
  37.                 '按角度从大到小的顺序排序6 W! v; d: w( h* z
  38.                 For I = 0 To SS.Count - 2# a+ I- X9 |* f
  39.                     For J = I + 1 To SS.Count - 1$ }6 D/ u1 ?3 ?6 C: g
  40.                         If A(J, 0) > A(I, 0) Then- w5 f- [+ b% X& Z
  41.                             D = A(J, 0)
    # f' `. [$ G' H& k  P' C) y
  42.                             A(J, 0) = A(I, 0)0 X) s" {& t4 b
  43.                             A(I, 0) = D
    ; ^: @% z: W9 Y; X0 L& f! i+ u
  44.                             D = A(J, 1)3 T7 b; y* q) v4 w1 |9 d
  45.                             A(J, 1) = A(I, 1)
    : O6 x: t& ~5 F; |7 m
  46.                             A(I, 1) = D
    " T5 j/ c2 a: T* I( A6 {" s
  47.                         End If
    , }7 }" a2 Q; s7 h; @
  48.                     Next
    $ f6 e  p1 @9 S, A2 p. [; F' W/ v
  49.                 Next
    + \, g1 l; }% w8 P  m* E( q/ l: M
  50.                 '替换
    7 O4 p2 @1 G4 S: E' J' s6 e
  51.                 For I = 0 To SS.Count - 1
    9 D- _3 z. Q* e
  52.                     SS(A(I, 1)).TextString = I + 1
    1 {6 A0 d. P% w& @+ }  G$ v+ r5 X4 u
  53.                 Next
    8 p1 H% O9 V, Q* i0 ^
  54.             End If
    7 \4 k9 @/ w( O6 E# Z
  55.         End If2 m+ b% x( b& s- l1 m
  56.         '删除用过的选择集
    0 \' k$ q# T5 T5 q! Z" S; W
  57.         SS.Delete9 x1 b3 h% R+ D4 L  @7 e/ p
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia 4 W7 R1 |- i0 l/ Z: W3 p

& m+ X7 g6 s. `" ]' L, ~2 E能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:# @7 i. e4 b; g  d* T
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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