QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
全站
goto3d 说: 在线网校新上线表哥同事(Mastercam2022)+虞为民版大(inventor2022)的最新课程,来围观吧!
2021-06-26
查看: 3538|回复: 6
收起左侧

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

[复制链接]
发表于 2011-3-24 21:10:33 | 显示全部楼层 |阅读模式

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)
, K: {" t5 q# |$ f$ d; l2 m功能:
( z7 ^) c. T( B' a  y1.查找-替换
, I- |+ I7 T% ~5 T/ N2 {% }* C2.加编号排序. Y1 H) v' O) T. }! K
2我不知道咋怎?/ L1 v# Q, o0 X) L

* X9 c( \+ }+ i7 q6 x             文字         文字                                             文字02           文字03$ X2 d, T' T' x5 i
4 S2 `$ B, V- n( z! z
文字                              文字    ----------------  文字01                                文字04
2 [- V7 ]& Y; g4 E. S            文字                                                                文字069 p' u5 x1 s" m3 Y) T
                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层
是否可以这样:
" q7 _- x& o' O% T4 ~遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.# Q7 \! B3 d8 a. A9 H+ @
下面的代码仅供参考
  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% i8 H; T, F9 D& {; T- o; Y
  2.     With ThisDrawing
    # Q& @& s# S. N& I, a' z2 A% q
  3.         '创建选择集,用于选择所有文字对象
    # h5 ^' r7 l# l7 M
  4.         Set SS = .SelectionSets.Add("SS")
    3 a( `+ f6 n( d; F
  5.         '定义过滤器为选择单行文字对象
    3 [; D! |' Z9 I' `
  6.         Ft(0) = 08 t3 P& y8 C5 o& ]; m
  7.         Fd(0) = "TEXT"
    2 `# P: {6 E8 A8 c
  8.         '选择所有单行文字对象
    7 D! b+ Z! s3 s8 t$ W
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    + `& {. r# s! ^, n  D, p. D+ v4 H0 z2 \
  10.         '当存在单行文字对象时排序和替换6 k2 z9 c- n6 ^6 v8 q9 b
  11.         If SS.Count > 0 Then
    0 F3 v4 J9 h  V; u4 u' |$ e/ P
  12.             '计算所有单行文字的几何中心
    , Z5 o. M% r- G+ u5 U& R
  13.             For I = 0 To SS.Count - 1
    ) M7 B5 {& r' F# N, M: z
  14.                 V = SS(I).InsertionPoint* K' p1 ~! ~" a5 N
  15.                 P(0) = P(0) + V(0) / SS.Count8 _6 t0 A2 V# H& l5 X' V  I
  16.                 P(1) = P(1) + V(1) / SS.Count) |2 a. v( [& C  V! c
  17.             Next( ~9 F& P1 a. Q6 C
  18.             '重定义动态数组下标! g9 w8 }! [2 L1 n6 B, N' N0 V
  19.             ReDim A(SS.Count - 1, 1)
    , t4 ?5 C+ O3 f3 |) f1 X; X) q+ N
  20.             For I = 0 To SS.Count - 1
    . [- s' e+ d- b, Y/ y; c+ @# w: G
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    2 ]' V8 [+ S; G5 C# q) r4 z4 Q
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)4 T4 R3 ], T  H
  23.                 A(I, 1) = I
    ( E% \2 B3 i' ]
  24.             Next  {0 R6 s7 r2 N: C: f5 n+ C5 f+ C
  25.             '按角度从大到小的顺序排序
    / Z0 L/ m# a' Q
  26.             For I = 0 To SS.Count - 2" u2 C7 r" i' v6 L
  27.                 For J = I + 1 To SS.Count - 1; H( g3 M: V0 E
  28.                     If A(J, 0) > A(I, 0) Then
    4 C5 P" x( W& O7 Z' i# Z( P) X
  29.                         D = A(J, 0)( r8 Y$ j9 D5 K* i* z0 ~% r6 I% Z
  30.                         A(J, 0) = A(I, 0)
    $ y8 B  P! m, S3 L! @
  31.                         A(I, 0) = D
    ) R. M) I+ ?( B9 k. K, c7 u7 B
  32.                         D = A(J, 1)
    1 s1 Y- y1 v- B, |3 ]' F' {+ S8 E2 S
  33.                         A(J, 1) = A(I, 1)
    ) K4 y6 K6 |7 j
  34.                         A(I, 1) = D
    6 m" A% U- L, C% P7 `7 l6 X' u
  35.                     End If
    - T3 o2 L3 i% U+ N0 q( ]
  36.                 Next9 W* x) M* T0 x0 q% E
  37.             Next
    % d0 [; m) S* K
  38.             '替换
    - L) G! g. `- V/ I# m  K
  39.             For I = 0 To SS.Count - 18 {. o- E  L$ K* O
  40.                 SS(A(I, 1)).TextString = I + 1
    4 @* w* M3 A5 |# B
  41.             Next6 Y$ ]( F6 j+ p6 Y
  42.         End If" k$ ?' R( @. @9 q
  43.         '删除用过的选择集* E: d0 |# j/ o) w* S
  44.         SS.Delete
    / q* ]! Y/ a3 Z
  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
    " K' p" \; \( v+ F0 ^
  2.     On Error Resume Next& O* X3 c) f6 |8 O$ x$ Q
  3.     With ThisDrawing; k. ~! C" n+ e' _+ o; J
  4.         '创建选择集,用于选择所有文字对象0 j6 [1 p" e- W9 N; Q
  5.         Set SS = .SelectionSets.Add("SS")
    6 X4 p( [1 e/ g& t( M6 z% i- B  V  i' e
  6.         '定义过滤器为选择单行文字对象$ K; P7 `# ^8 w
  7.         Ft(0) = 0! c- Z2 Q4 L) v  o5 Y
  8.         Fd(0) = "TEXT"& K0 _6 o3 {: U# d7 S" i/ @
  9.         '选择所有单行文字对象1 C! p& G( }5 U9 b
  10.         SS.Select acSelectionSetAll, , , Ft, Fd( y- P7 ?" Q: b6 ?6 R8 t3 t
  11.         '当存在单行文字对象时排序和替换/ w3 b( b( [8 l
  12.         If SS.Count > 0 Then
    4 m9 W- r; Y! w! s3 z* |5 x9 l
  13.             '由用户在屏幕上指定中心点
    0 E! |! p! p, d
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    / h) ?5 ^% d% Z! X
  15.             '如果用户没有取消则排序和替换( I6 R3 U# `. K/ K2 u
  16.             If Err <> -2147352567 Then
    + m3 [* z% C6 }4 J' ^  H
  17.                 '用户指定了点( ]2 g5 C+ N' J- ~# ^: V
  18.                 If Err = 0 Then. ]# P' n0 Z- m, r: o  A; u$ r0 w
  19.                     P(0) = V(0)0 F# ]! S! G+ i6 q# |9 s6 S: j
  20.                     P(1) = V(1)
    $ O% M/ D6 V7 j! N
  21.                 '用户选择了默认2 s, b, @: O+ @& I$ j2 p9 [- X/ ?
  22.                 Else
    ! |7 x$ j$ Y! @5 E
  23.                     '计算所有单行文字的几何中心
    4 B) \. Z& U- O- R3 Y5 v1 P5 c* I
  24.                     For I = 0 To SS.Count - 17 [- k" ]; H' o! C. l) ]" v
  25.                         V = SS(I).InsertionPoint* F" B8 B1 |; F
  26.                         P(0) = P(0) + V(0) / SS.Count$ s8 m: _+ L* r* w$ Q
  27.                         P(1) = P(1) + V(1) / SS.Count: k+ l% S/ l3 \, m+ u+ L
  28.                     Next2 I) R8 p% j7 B, Z6 T
  29.                 End If
    3 \! K, b: h; c: e8 \. Q
  30.                 '重定义动态数组下标4 {" w, Y- D, z( ~# f5 [
  31.                 ReDim A(SS.Count - 1, 1). V  H" I# Y) T* N. ?
  32.                 For I = 0 To SS.Count - 1
    7 ?0 `6 ]; e+ x- p* e- H
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    - ?, O. |3 s  k; @- I# p/ I9 n
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    6 l* D, L, T: x8 w3 Z7 M
  35.                     A(I, 1) = I1 Y  C0 p/ V0 i, C) B( U  i; F
  36.                 Next
    3 S" e  {! @- {" H
  37.                 '按角度从大到小的顺序排序# `5 `/ i4 c) I& S2 B" W  g6 f. w, [
  38.                 For I = 0 To SS.Count - 2/ L! b2 d: s! R; t
  39.                     For J = I + 1 To SS.Count - 1+ w' `- U9 x" |. B* x1 ^
  40.                         If A(J, 0) > A(I, 0) Then5 U2 b. A1 s4 @" z0 q7 m
  41.                             D = A(J, 0)4 }/ m& u5 A& l5 w, n3 ?6 w8 Y: o
  42.                             A(J, 0) = A(I, 0)! B, q( ]5 _" ?& o5 l
  43.                             A(I, 0) = D
    & |& D3 h4 G6 ^, Y/ i% N' g1 b( K" ^
  44.                             D = A(J, 1)- E* T, [2 ~! Y3 B
  45.                             A(J, 1) = A(I, 1)
    * U: ~6 r, I1 l. m( r- s% X1 P9 X/ @
  46.                             A(I, 1) = D
    8 e' t: f5 p3 s
  47.                         End If0 P- }; V. I8 T
  48.                     Next" Z/ K0 o7 h% j
  49.                 Next4 N! T2 `6 @+ }. V7 B
  50.                 '替换
      ?) u  Q, }! Q  e0 i2 ]) V
  51.                 For I = 0 To SS.Count - 14 `' l  N3 Y' ^+ i! W
  52.                     SS(A(I, 1)).TextString = I + 1
    ( a- {5 c* {$ s* y( Z% x8 F2 _
  53.                 Next
    , Q- [0 ?0 i5 ?; V2 Y
  54.             End If
    ! r6 n3 f! i% @9 q
  55.         End If
    , I3 z4 n. `! ^% s3 ]
  56.         '删除用过的选择集, k! w+ A5 Z  ?' S. g
  57.         SS.Delete
    4 d! k5 l+ z' _3 s1 a" W. ]# y
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层
5# woaishuijia 1 M1 V: Z1 }7 B3 P. m" T: M) H

, @8 F5 R+ n2 A+ U8 Y能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:. D. U1 M+ ]* Y' @9 W! M: B) E
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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