QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)8 V8 s& C8 w* x# R2 F# C) w
功能:0 b! C, Q) m$ i0 @3 O* }8 R* @
1.查找-替换: t7 }5 d7 ^: E
2.加编号排序* K/ D5 f* @7 m
2我不知道咋怎?# `  n" H' y2 t1 t( @# {
5 I2 q; ?/ Y& G7 a: H
             文字         文字                                             文字02           文字03
8 o1 {# U6 F# |$ ?/ J3 c/ @0 D. L
7 |( \3 j& I* f5 W0 A3 w文字                              文字    ----------------  文字01                                文字04
4 R3 D/ H2 M1 R            文字                                                                文字06
% ~1 S4 D1 U, D8 Q0 C                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:
4 _2 D; T1 T/ c& `- X遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
7 z" n- N' T" s* x% C9 P& L下面的代码仅供参考
  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
    - l( B! r; f5 C: N. q% k9 e
  2.     With ThisDrawing
    1 J5 J+ i7 c2 Z% q( K, J
  3.         '创建选择集,用于选择所有文字对象
    ' F1 q# Q  @2 K5 S% W' L
  4.         Set SS = .SelectionSets.Add("SS")
    / p' E7 a2 f" F
  5.         '定义过滤器为选择单行文字对象0 g# T! o! @/ O5 s* r; v- U7 B
  6.         Ft(0) = 0
      r, Z, U7 Y4 J) S% i" h
  7.         Fd(0) = "TEXT"
    6 b: \/ z' L% Q4 K
  8.         '选择所有单行文字对象
      C( R6 j# H. ]) r0 Q
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    + k. H# r. q6 P+ \9 O- i
  10.         '当存在单行文字对象时排序和替换+ U$ x+ v* _. O/ B7 P
  11.         If SS.Count > 0 Then" |: H& |8 ~- F3 G6 B! ~! |' Q
  12.             '计算所有单行文字的几何中心
    / f- g! M2 p+ G! y' z
  13.             For I = 0 To SS.Count - 1
      y, g) {) A# e/ |0 P# B
  14.                 V = SS(I).InsertionPoint& I8 g: p2 b) W0 M6 s* O- X* G
  15.                 P(0) = P(0) + V(0) / SS.Count/ V# Q! N$ x  @- Y' H% Z* d
  16.                 P(1) = P(1) + V(1) / SS.Count
    ( B! J; C1 x5 x' [6 K" ?7 H+ _# J
  17.             Next
    # K) G4 m' V* B/ w# Y2 n
  18.             '重定义动态数组下标5 j  Z. F8 _+ p3 M
  19.             ReDim A(SS.Count - 1, 1)# n9 @$ o# R2 ?
  20.             For I = 0 To SS.Count - 1# H2 X6 t5 o. E6 ^1 w; _
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    2 H4 M9 i) ?- U7 L8 I+ n
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    : o% r- I# h+ t4 D" b) x0 `
  23.                 A(I, 1) = I
    9 m, Y0 N% \$ j: M! A; b
  24.             Next
    / j. `/ Y1 |% U& P+ [! C% j
  25.             '按角度从大到小的顺序排序. o8 ?$ E% l1 z* a: v
  26.             For I = 0 To SS.Count - 2
    $ D+ |& Z2 q5 ?9 F" {/ M( c% K
  27.                 For J = I + 1 To SS.Count - 1
    2 z) K" c' t& G1 J- w' M& \. v
  28.                     If A(J, 0) > A(I, 0) Then
    / ~2 n- Q" m( U
  29.                         D = A(J, 0)# U( R3 y) K5 l+ |, `6 ]
  30.                         A(J, 0) = A(I, 0)
      d; x# N6 U; i4 S- v
  31.                         A(I, 0) = D
    % n% S, E9 n9 S- q1 m
  32.                         D = A(J, 1)
    ! T3 \+ t. B5 k9 f+ d9 t1 b
  33.                         A(J, 1) = A(I, 1)
    1 A3 V! O& @! k3 H% b
  34.                         A(I, 1) = D
    5 S6 L2 S5 V; r$ f/ Y* d% \+ Z
  35.                     End If+ g% i! E6 m8 m7 h! P& ]
  36.                 Next5 q& a7 v( D; G$ C# U$ G" F+ p1 p
  37.             Next$ U+ w7 J# z, Y' Z+ {
  38.             '替换6 v, E+ l4 }/ n* [! Y
  39.             For I = 0 To SS.Count - 1! y  R+ k7 P; l7 A* c) r1 o
  40.                 SS(A(I, 1)).TextString = I + 1
    8 x8 ?# j$ [. Q  {' \
  41.             Next( Q$ |5 m# i) {& L, d$ G
  42.         End If# v3 y/ }; q* X% w. J. D- ?8 P7 A
  43.         '删除用过的选择集4 L8 i  X) }4 r5 ^, h9 `3 H
  44.         SS.Delete
      y3 X4 |' ~3 m! m6 g; z' l: s: P
  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
    5 B; d# c! x: v
  2.     On Error Resume Next# B, y4 m* H& a: P, `8 P
  3.     With ThisDrawing
      g2 h" x, d) T3 j) l( \6 R5 v7 w' P
  4.         '创建选择集,用于选择所有文字对象
    8 Z1 ?* f2 `7 A0 K5 e' f
  5.         Set SS = .SelectionSets.Add("SS")
    7 P' u, K( R% b  q
  6.         '定义过滤器为选择单行文字对象) U% y  ]. E: u( b$ E5 ~; G
  7.         Ft(0) = 0
    " P) k: y2 R6 b$ |/ g# e4 [! N5 [! b
  8.         Fd(0) = "TEXT"
    9 X$ }0 ~) {6 O  |) @3 a
  9.         '选择所有单行文字对象. E. A) b2 e* A5 a* c
  10.         SS.Select acSelectionSetAll, , , Ft, Fd1 K3 p3 u5 D  l' ~( x3 \  B5 U" X
  11.         '当存在单行文字对象时排序和替换
    + U& i. j8 m8 w' ^* U# l
  12.         If SS.Count > 0 Then* {: E2 j0 T# n( P
  13.             '由用户在屏幕上指定中心点( R" c% o+ _! F( j
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")7 c: U3 h1 j3 _% C$ a
  15.             '如果用户没有取消则排序和替换
    % l' B9 U1 |! J% R9 n$ l: c" a; B
  16.             If Err <> -2147352567 Then
    - X- J* o/ t) }) {) S& i
  17.                 '用户指定了点
    0 r* @! F  T/ g8 I6 ?& f! Z' n
  18.                 If Err = 0 Then
    ; F* U; k8 `+ x/ P
  19.                     P(0) = V(0)
    6 z7 l; l$ M0 s. U  }/ B) a
  20.                     P(1) = V(1)
    ! M: A+ b  l4 Y( I" G1 N
  21.                 '用户选择了默认
    1 t, O. ^5 j) ?/ Z& _. _) h8 U
  22.                 Else
    " h: ?$ p7 I% T! [. w* f8 s
  23.                     '计算所有单行文字的几何中心
      I& D5 T; u; p5 \- \7 D
  24.                     For I = 0 To SS.Count - 16 B; P& @  w) b( g) H4 Z3 B
  25.                         V = SS(I).InsertionPoint
    9 {* A; w% D- b  Z. w3 K% H. I% O
  26.                         P(0) = P(0) + V(0) / SS.Count. D& @) D: F' Z' Z$ h1 r! {/ I  c" |2 L# m
  27.                         P(1) = P(1) + V(1) / SS.Count, u6 I# J' E" |" n2 F
  28.                     Next9 ?9 y" Y* B- C1 {% ^4 p) ?
  29.                 End If: Q; f2 w" n/ \" R  }( z
  30.                 '重定义动态数组下标8 I8 ^  k: r. R# g/ E
  31.                 ReDim A(SS.Count - 1, 1)
    + \3 U3 M2 A* ~9 A* w
  32.                 For I = 0 To SS.Count - 1
    : U, t5 Y3 i# U1 S' M
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号* s8 j! B) T, m% Q  @$ \0 m5 I, |
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    , t. L( E' @3 O( W
  35.                     A(I, 1) = I$ @/ v7 n$ t8 H# E4 Y
  36.                 Next
    1 ?, O) M6 b: _
  37.                 '按角度从大到小的顺序排序4 r1 M% H2 S4 N' g$ e
  38.                 For I = 0 To SS.Count - 2
    0 w: A/ U$ L. }6 ?, k! H6 |
  39.                     For J = I + 1 To SS.Count - 1
    + D& T" O. `3 `" W9 X
  40.                         If A(J, 0) > A(I, 0) Then3 U) s) ]$ c+ {
  41.                             D = A(J, 0)
    9 F& m# a" M, }, F! ~
  42.                             A(J, 0) = A(I, 0)
    9 R' {% ]8 c% z' O( s2 P) w: @$ n1 Y
  43.                             A(I, 0) = D; l& g. G" H# v& A
  44.                             D = A(J, 1)+ M* P& `' g) m# `2 W
  45.                             A(J, 1) = A(I, 1)
    8 @& }  q) C* |+ f" G. u6 d3 m
  46.                             A(I, 1) = D
    2 l8 q+ a: R5 ], M: }
  47.                         End If& G# K) t  C/ G
  48.                     Next
    ; M6 \. u* Q& o* J. _- Q# D1 Z$ f
  49.                 Next
      z$ B+ C7 W# U( `  i  a3 B; W0 W
  50.                 '替换
    2 }% f& L# Y6 @
  51.                 For I = 0 To SS.Count - 1! D; G! g  J+ _" {# q
  52.                     SS(A(I, 1)).TextString = I + 1$ Y# S  y1 p& W' N
  53.                 Next
    / x' Z0 o" E4 u/ G) N
  54.             End If
      H6 @! G9 q  g5 D; {' |
  55.         End If
    ( }9 y  e4 x, S5 g- s
  56.         '删除用过的选择集% U. N  z% f7 m/ [1 w, y% l
  57.         SS.Delete; C3 M$ L. h, \# z, K$ G; Z7 ]
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
6 x, u/ b& C2 p4 w5 J& }. t4 z* H$ |, T# p# S# |. U. @
能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:; R% p- y/ T! J$ p# h. `
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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