QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
/ i8 Z2 T- N& [4 K7 `, F8 m' x功能:
+ B1 X& \) N/ s) P3 y* g1.查找-替换
7 a6 o1 z/ L% g  `5 j6 P2 y2.加编号排序
8 x* ~% N- ?6 d  u2我不知道咋怎?
: S2 P- J$ `5 k' O" j1 W" T; X; @/ Z% i, B
             文字         文字                                             文字02           文字03
2 A3 u5 w, P, o* N
* S% z+ u& L! O7 o& }0 g! S文字                              文字    ----------------  文字01                                文字04% y( b+ W; j) R+ F1 H
            文字                                                                文字06
: I1 O* u% k9 t1 {! o                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:
0 E" Y2 ~+ N9 g$ I( X, _8 p4 z) W遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
0 {( H6 J5 S" H5 ?. ~下面的代码仅供参考
  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
    ! r  J, c; y8 f: u& t
  2.     With ThisDrawing2 n- y$ H8 v$ d
  3.         '创建选择集,用于选择所有文字对象
    9 a  V& r% t* E
  4.         Set SS = .SelectionSets.Add("SS")- Q9 T' U" `# J6 s
  5.         '定义过滤器为选择单行文字对象
    3 r% m: O! k0 F/ {/ J( ^$ W9 a
  6.         Ft(0) = 0
    3 v9 Y% \1 i8 }5 B& d# v8 C* |8 i
  7.         Fd(0) = "TEXT"0 X5 m7 h* L9 S; A. H0 s# m1 P4 w
  8.         '选择所有单行文字对象
    7 c. A/ H& D3 y. x0 e4 _7 j. F
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    / n6 N4 D. x- X2 B# v$ ?% [
  10.         '当存在单行文字对象时排序和替换1 z$ x5 }5 o3 m3 [" i$ Q
  11.         If SS.Count > 0 Then
    # ]7 ]% B. _# w& ^2 p* t5 N
  12.             '计算所有单行文字的几何中心
    4 K1 ?$ I* h$ T+ q* H2 K3 H
  13.             For I = 0 To SS.Count - 1$ b* H" T& X: u$ A: X
  14.                 V = SS(I).InsertionPoint  D/ A. R& L; W  N3 Y
  15.                 P(0) = P(0) + V(0) / SS.Count! U5 I/ ^+ E% N, m
  16.                 P(1) = P(1) + V(1) / SS.Count
    # O% O; h0 k! C2 A. b6 {
  17.             Next4 h4 F5 Z/ x, v, A/ o
  18.             '重定义动态数组下标0 ^5 b& _# f: t
  19.             ReDim A(SS.Count - 1, 1). i  `$ T- s. J- i$ y) H
  20.             For I = 0 To SS.Count - 1
    ) z/ e6 U' K+ i; S* }! ]4 E
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号; q6 v, L: `0 K) H0 w$ J  L# j
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    4 |+ P1 s+ }) y7 Y# A3 Z, l  Q
  23.                 A(I, 1) = I/ X; Q& W! f0 Y& P
  24.             Next
    : g4 G, Y2 z( p3 K. |
  25.             '按角度从大到小的顺序排序
    # |1 M0 v) s/ v
  26.             For I = 0 To SS.Count - 2
    # X+ u5 w8 I1 z6 l
  27.                 For J = I + 1 To SS.Count - 1
    , \3 I2 U) D7 b& J9 d% F6 O
  28.                     If A(J, 0) > A(I, 0) Then
    5 A- M5 w9 R, ]+ L
  29.                         D = A(J, 0)
    , Z4 @- m- ?3 m9 I* X
  30.                         A(J, 0) = A(I, 0)/ {4 \5 l% K2 L( V0 V; n
  31.                         A(I, 0) = D
    ( E- l9 x: J. y3 g
  32.                         D = A(J, 1)
    ) n* g  Q6 R) K. f
  33.                         A(J, 1) = A(I, 1)
    7 L3 Z- u, g. v# x! z- S
  34.                         A(I, 1) = D
    ! x9 P% k* T9 y: n5 K9 B$ O" N
  35.                     End If
    8 D. g3 z5 r6 t  b2 V: \; L, t3 t) J6 [
  36.                 Next+ Y% A4 s' Q1 d; p
  37.             Next
    % p  T+ ~" [2 f' X( `& E
  38.             '替换
      v0 d: x% Y6 u6 H( P
  39.             For I = 0 To SS.Count - 1# Q. M% C5 q, S
  40.                 SS(A(I, 1)).TextString = I + 14 K" A  S2 y4 u6 {3 D
  41.             Next/ h9 y. A* T. X6 d2 W
  42.         End If3 E6 Q# t4 q# _, x
  43.         '删除用过的选择集
    ) w; o' j  M3 P( t. A
  44.         SS.Delete
    , T/ y# D/ k8 H  w& P6 m+ w: w
  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: P- v4 M, Z- w
  2.     On Error Resume Next. ~" c+ m- k( S# A  k0 v6 k. G
  3.     With ThisDrawing
    , Z* L! p/ ?" I+ g7 C
  4.         '创建选择集,用于选择所有文字对象" L# M" X, H, r9 d. w0 ~( ?3 o2 |: y
  5.         Set SS = .SelectionSets.Add("SS")1 Z9 Y% U; _4 [" a% N( y  V8 d
  6.         '定义过滤器为选择单行文字对象8 G( q& \$ h, n# z( l8 R. L, F
  7.         Ft(0) = 05 F+ s3 z. [8 K5 c
  8.         Fd(0) = "TEXT"5 _+ s7 N2 x7 @. W
  9.         '选择所有单行文字对象: U, R( v4 X" P0 |0 x. J( x
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    6 e6 {# q1 n- ?& D8 h) M
  11.         '当存在单行文字对象时排序和替换* F5 b* n% h7 e
  12.         If SS.Count > 0 Then. d" E8 l4 t0 n0 r, {4 Y
  13.             '由用户在屏幕上指定中心点
    : V* |/ J# Z* U& g  h8 A# w% c
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")- k1 I5 R  X7 c
  15.             '如果用户没有取消则排序和替换
    5 k3 R$ {& }3 D4 J2 p6 ~
  16.             If Err <> -2147352567 Then
    . M* ?$ G. U/ q
  17.                 '用户指定了点
    . `3 _7 _  T& E' T  G7 U( W
  18.                 If Err = 0 Then
    1 {; T9 l/ J% q- Y- R
  19.                     P(0) = V(0), D: ^) Z, |% ?
  20.                     P(1) = V(1)2 L. m2 Q2 r6 R0 a& f7 |: \
  21.                 '用户选择了默认# A( g7 T! ]4 G: \
  22.                 Else" H, B) R! i$ d2 M; _! t% d
  23.                     '计算所有单行文字的几何中心5 h0 D/ ]8 h: }9 d0 L9 X
  24.                     For I = 0 To SS.Count - 13 `$ p: C- Y- f( Y
  25.                         V = SS(I).InsertionPoint0 \: N' V7 ?8 I# e+ n
  26.                         P(0) = P(0) + V(0) / SS.Count
    ! x$ ^; l4 i" P$ |( d6 s6 Q% @- ?# B- F% \$ ]
  27.                         P(1) = P(1) + V(1) / SS.Count
    7 o- s- B' c2 l5 O6 a+ A
  28.                     Next
    : {; x2 g! h3 ~0 {. {4 w9 A
  29.                 End If& E+ A4 M8 q+ \0 V
  30.                 '重定义动态数组下标- m$ d1 Q  `: L6 v5 h& \- Z
  31.                 ReDim A(SS.Count - 1, 1)
    ; M! z( r- W+ R" q6 J! n4 I
  32.                 For I = 0 To SS.Count - 1
    4 I5 o$ t0 P% l4 M1 e  t
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号" R8 m/ I8 r, E" Y
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    ) f0 f) e2 x& G- K. I
  35.                     A(I, 1) = I
    # {# f8 ~" G2 e4 m7 h7 x
  36.                 Next
    0 \& P* j, i2 J5 P
  37.                 '按角度从大到小的顺序排序
    . B! S/ `' c- n7 A
  38.                 For I = 0 To SS.Count - 21 }5 M  q& m5 C$ G9 h9 l) x
  39.                     For J = I + 1 To SS.Count - 1  }- `0 q7 U& x1 ]$ U% g
  40.                         If A(J, 0) > A(I, 0) Then& u' i: [! U8 H7 I; Q  P5 Y
  41.                             D = A(J, 0)  R$ N2 R9 ~1 Q6 q( b0 A
  42.                             A(J, 0) = A(I, 0)
    / ^( S. |# n" A
  43.                             A(I, 0) = D1 I% h# Z7 y0 @: |! x
  44.                             D = A(J, 1)
    1 C, Q  W; E' C# M9 F! J( v
  45.                             A(J, 1) = A(I, 1)# N  ~% N7 M( z2 [; c
  46.                             A(I, 1) = D
    2 `# i' |' q* ?- M1 Z  W2 D! C! M
  47.                         End If- f. Y3 A: C. K5 f
  48.                     Next) B- _% }: _5 x
  49.                 Next3 O2 ]( C& p1 r7 m* t5 l( t
  50.                 '替换% I+ s# ]3 I! D4 G
  51.                 For I = 0 To SS.Count - 15 o5 d: w' z2 V2 Q: F- m
  52.                     SS(A(I, 1)).TextString = I + 1( O% n, v' v9 R: @5 p
  53.                 Next- c7 m# f# {7 j5 E& x
  54.             End If6 V1 p) y/ i3 j% q5 `2 u
  55.         End If7 y$ p! w: @1 T0 t
  56.         '删除用过的选择集
    ' x& Y. l) a- V% W
  57.         SS.Delete0 E( g+ E% o9 J
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia : W# H* d1 b! {
2 v! U$ o7 f) J, q" W- E
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
( @) {3 F5 J3 V& @* I: ?) k我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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