QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)1 c+ x  e" x  Z5 Q; X1 k$ s$ B) m  x
功能:
3 {- x9 k5 B/ C- @6 T1.查找-替换
$ \0 i+ l! T% {) t2.加编号排序& j$ p  p. F6 f( J
2我不知道咋怎?8 x6 p$ |- d7 s" Q0 h, U

% \" D3 C0 u& |2 X0 r             文字         文字                                             文字02           文字03
7 B3 ]5 F* k% T- J( p1 c
) V' [: g  V8 _' ~5 L' o$ B7 M文字                              文字    ----------------  文字01                                文字04
% K7 _( w) {! h! c! |+ N3 b: z0 }            文字                                                                文字06- j; b0 k% |* i7 P' a$ [( i3 A' v8 z
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:8 V  K& _* y3 H  E$ P: C
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.% @0 C# Q2 w- e( s
下面的代码仅供参考
  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
    5 m7 x3 w# }- c1 v, `0 |; k8 U
  2.     With ThisDrawing
    ( `. C3 z* B9 P$ ?8 t: k: G( `
  3.         '创建选择集,用于选择所有文字对象# |6 i) U0 u6 @3 K# ^4 q
  4.         Set SS = .SelectionSets.Add("SS")6 ?2 f0 N$ j/ ?4 N4 O
  5.         '定义过滤器为选择单行文字对象
    9 S' `" ]4 M  l( i4 J
  6.         Ft(0) = 02 ?3 |9 W0 g1 k
  7.         Fd(0) = "TEXT"
    ( h* R# `% G; {
  8.         '选择所有单行文字对象2 M3 _- H( X+ L. ~4 z9 [. ]
  9.         SS.Select acSelectionSetAll, , , Ft, Fd4 K1 K" R6 t# P7 Z
  10.         '当存在单行文字对象时排序和替换
    4 \; L& \' g: i
  11.         If SS.Count > 0 Then. N) h  D  S4 g4 g1 j5 J! u  b, C
  12.             '计算所有单行文字的几何中心
    3 u9 n/ f* j# P2 K# e# \
  13.             For I = 0 To SS.Count - 1
    $ o( e/ Y- y( |' f
  14.                 V = SS(I).InsertionPoint" @# n8 n: P" L* J
  15.                 P(0) = P(0) + V(0) / SS.Count" X# w/ s$ f) i, v8 X
  16.                 P(1) = P(1) + V(1) / SS.Count
    % Y0 D' _- e; v' c0 l5 s3 }
  17.             Next
    6 p+ Y& e5 k: f& w: ]
  18.             '重定义动态数组下标
    ) i; b1 ^, p) e' W2 |) @& S
  19.             ReDim A(SS.Count - 1, 1)
    7 A5 M  b) r( j1 ^6 O; Y9 J
  20.             For I = 0 To SS.Count - 13 x( Y1 O$ L6 y  [" O- B( s3 o$ m; X* V
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号" C8 [" s& a2 N9 v
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)0 I; x/ ?$ \! q6 T2 f
  23.                 A(I, 1) = I+ f9 n2 z( s: e' w( q% S/ u
  24.             Next
    ( h1 j! a. j4 K; |; L
  25.             '按角度从大到小的顺序排序
    6 u; u# m, Y0 \2 G5 h( P. U
  26.             For I = 0 To SS.Count - 2+ V- j4 O: m* Y! m/ U$ _# p' D
  27.                 For J = I + 1 To SS.Count - 1
    " l) s3 W0 ^. L  u- ?" S7 A' B9 g
  28.                     If A(J, 0) > A(I, 0) Then
    7 L+ U' c  {! V" _' R$ ]6 ]
  29.                         D = A(J, 0)
    " t2 y7 e8 j7 n: \4 W0 W
  30.                         A(J, 0) = A(I, 0)( G: f& g: ^1 M- _) P$ C
  31.                         A(I, 0) = D* U0 T/ z" H/ d5 ]. r% m* K1 y
  32.                         D = A(J, 1)
    ' J% l: Q! o. k/ x- Z$ k
  33.                         A(J, 1) = A(I, 1)
    ( u9 u6 o% j" P- z& O- |
  34.                         A(I, 1) = D8 O& m5 C+ N2 m" L* [' T4 `; i
  35.                     End If
    8 ?3 ~1 S& K6 J+ P; H  C
  36.                 Next
    . O4 u% r! G% N& p2 e
  37.             Next7 h, _9 S3 f2 ~2 r; G
  38.             '替换
    % t- \3 S7 C& ]" `" e+ i) f7 n, ^
  39.             For I = 0 To SS.Count - 1. {; N& {7 U- F
  40.                 SS(A(I, 1)).TextString = I + 1
    / R& a/ q- ]! z* v
  41.             Next
    7 O. b& `  b: \' s6 p
  42.         End If
    2 d" X1 k0 g  V6 E5 p
  43.         '删除用过的选择集
    8 w! e* o3 M" c3 u% j
  44.         SS.Delete* p  x) @9 d% O7 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
    3 ~6 i3 N; [' q9 v# d1 e
  2.     On Error Resume Next
    . g* g: I' P. l/ s
  3.     With ThisDrawing4 y" C4 ^& H0 X4 k$ ^
  4.         '创建选择集,用于选择所有文字对象
    ; U+ A& {5 S; l2 x% G- x
  5.         Set SS = .SelectionSets.Add("SS")7 o" J9 }' a+ L. k7 x/ Y
  6.         '定义过滤器为选择单行文字对象
    $ C( A' C- C; R0 D1 n! T
  7.         Ft(0) = 0& B0 B1 ~; d3 q& @2 d  A0 H
  8.         Fd(0) = "TEXT"
    " _- E1 J9 g; S8 G# _# K
  9.         '选择所有单行文字对象
    + t3 \$ \4 t2 Y* K5 M+ n
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    + s, K9 T1 m9 x
  11.         '当存在单行文字对象时排序和替换- Z. H2 v+ |/ y7 b
  12.         If SS.Count > 0 Then
    * ?* J: S! {  G. E/ G4 {) E
  13.             '由用户在屏幕上指定中心点; A/ D! i0 ]) W
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    7 R2 [  D( u' L* J, _
  15.             '如果用户没有取消则排序和替换
    3 m2 I/ [) n3 w2 G) \: W7 N+ |4 A4 E
  16.             If Err <> -2147352567 Then  {0 `( F# ]9 t$ H3 y7 {/ k
  17.                 '用户指定了点
    , \& Z: f# S* V! R) b" d  e
  18.                 If Err = 0 Then
    * i* U& E4 M. ^& G" z# S( g0 l
  19.                     P(0) = V(0)/ k. Q* L5 g, P( S1 l. S( W
  20.                     P(1) = V(1)) o; H! I- q' C# |7 ^  n4 g. l" @
  21.                 '用户选择了默认# x# O% l( L0 m& W
  22.                 Else$ S! F& k' n; p  A+ d$ ]+ i8 `
  23.                     '计算所有单行文字的几何中心
    0 w" b7 o1 d$ C$ l8 ~
  24.                     For I = 0 To SS.Count - 13 o3 I+ T6 Q0 S- ]/ [
  25.                         V = SS(I).InsertionPoint8 O& Y% A& |  l9 u$ H" K
  26.                         P(0) = P(0) + V(0) / SS.Count$ n' H  l( ~4 Y# k; U
  27.                         P(1) = P(1) + V(1) / SS.Count
    6 ]8 m; \7 s8 i- K4 [
  28.                     Next' |2 g9 v# w3 p! f( H5 a, `  b
  29.                 End If
    & @% h) \2 G9 X5 F
  30.                 '重定义动态数组下标  Z8 @1 Q0 D! @, Q
  31.                 ReDim A(SS.Count - 1, 1)  w" `; X( ]: }
  32.                 For I = 0 To SS.Count - 1
      ]; ?6 z) ], t6 a
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号8 l; g5 V" Q9 \! v
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)( B7 N6 R, V5 A" C' f) v, B
  35.                     A(I, 1) = I6 s: X0 |. j9 k
  36.                 Next- W# L( B6 N" ]! g& d
  37.                 '按角度从大到小的顺序排序
      V5 U9 _3 A% [0 d" w% k+ w1 S
  38.                 For I = 0 To SS.Count - 2, h8 c8 j% x( L
  39.                     For J = I + 1 To SS.Count - 1
    9 }& J3 c1 B$ Z2 r3 Z3 |+ c
  40.                         If A(J, 0) > A(I, 0) Then
    8 d' h6 f$ s# {/ ?* w7 M) ]
  41.                             D = A(J, 0)2 |8 t% r$ n! c' W8 {" w6 F1 _
  42.                             A(J, 0) = A(I, 0); r) Y$ w* ^8 S3 ^% N- w# U
  43.                             A(I, 0) = D' Y0 f/ V. {# r$ \
  44.                             D = A(J, 1)- c8 Z# I# |9 C0 `9 B8 }4 ~
  45.                             A(J, 1) = A(I, 1)  I) @# ^. L3 X
  46.                             A(I, 1) = D9 y2 n* C) T" b; c( e
  47.                         End If
    % }% ]: D$ _) m7 b4 Y6 ?
  48.                     Next0 B/ W2 h5 a% H8 H2 C0 _
  49.                 Next
    : G( d% z; b9 e' |: h9 D/ A
  50.                 '替换3 @; }1 i* u- @3 J% _
  51.                 For I = 0 To SS.Count - 19 d4 \  {( s0 F2 H, T, g
  52.                     SS(A(I, 1)).TextString = I + 1$ I. J; W6 T3 W- v! L$ j/ ?
  53.                 Next
    ) O) `* G1 N) Q' ^( {- J2 g% U
  54.             End If
    6 x! Y( C) y4 s
  55.         End If8 h' T' G8 H4 c, r3 l( O6 a/ ~6 d
  56.         '删除用过的选择集2 q( O2 X. A+ U. Y: h& Z
  57.         SS.Delete
    6 j( a  K1 {% {" z* j8 ]& U
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
4 H9 a( k7 ~  B' `1 I
8 \# w! a; O; _. G* v  |能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
2 ?. @( b0 q  V我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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