QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图)$ t; e7 D2 d6 J
功能:
7 g% x. z* A. e1.查找-替换2 s% ~) R4 B3 e7 \3 [. e
2.加编号排序
% V! T1 l, ?" W5 t) Q2我不知道咋怎?1 a$ v/ s, w" |- v  p6 n- U

/ T- B9 i) `) q8 P, a' d: N             文字         文字                                             文字02           文字03
- R: o: F! u! c+ X, w4 B- @$ {+ s7 F& p" f
文字                              文字    ----------------  文字01                                文字04' g" Q; L3 J$ q# H: |, c
            文字                                                                文字06
" P- Q, E% E! s5 Y) _3 R; f                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:- Y" @$ x  i. X. U+ ?! h3 y
遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
  T: B/ n6 d/ A* a/ [下面的代码仅供参考
  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+ Y8 s1 s5 H6 [# z$ o
  2.     With ThisDrawing
    0 [: i! @! J' F7 l/ y
  3.         '创建选择集,用于选择所有文字对象
    " p6 R7 F6 }8 T* t2 l# d2 \+ r- W
  4.         Set SS = .SelectionSets.Add("SS")
    : n. T: j0 i9 ]9 k' g+ N6 Q# N
  5.         '定义过滤器为选择单行文字对象( x! u1 t2 C& B! v$ d( s) U2 s
  6.         Ft(0) = 01 D2 k7 h, Q, M( _- a
  7.         Fd(0) = "TEXT": @# L# B! Y) ^9 m. w
  8.         '选择所有单行文字对象4 k: h' a2 h7 m" ?5 ?. F
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    - G. m: a# Y  K" ~' q6 g1 S
  10.         '当存在单行文字对象时排序和替换
    $ M- K( Z% ^  V6 P! l" s( C0 T
  11.         If SS.Count > 0 Then
    9 i1 U' k: y6 X6 o$ _( S5 Z
  12.             '计算所有单行文字的几何中心8 E: V! s9 ]; E. `4 g, K
  13.             For I = 0 To SS.Count - 1/ w$ Z) C) K7 d7 N
  14.                 V = SS(I).InsertionPoint9 p5 R4 x! h0 z% q, X5 _& `" P; M
  15.                 P(0) = P(0) + V(0) / SS.Count
    8 V+ t, e9 N6 B
  16.                 P(1) = P(1) + V(1) / SS.Count
    5 W- \3 }- ?1 M0 S( y& \" B
  17.             Next0 O( `5 X5 x4 o
  18.             '重定义动态数组下标9 f) s; C' r5 \1 _7 o
  19.             ReDim A(SS.Count - 1, 1)0 w, y2 _7 g0 P; N9 X
  20.             For I = 0 To SS.Count - 1
    & S, A2 w* n# x; {( `+ J
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    : k$ a3 M: R( s) u  r% [
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    # i, k, ?& v  @0 X5 p! E# G
  23.                 A(I, 1) = I
    1 v: W+ @) R, T' C1 j  E
  24.             Next' Z, d+ a* R0 L, \8 i) T& L1 U
  25.             '按角度从大到小的顺序排序0 B- V5 N/ M/ ^4 U, D
  26.             For I = 0 To SS.Count - 2
    . ]2 O5 e/ Y9 h0 Y; b2 g& X
  27.                 For J = I + 1 To SS.Count - 1
    $ |/ n- w8 h& q( Q+ E
  28.                     If A(J, 0) > A(I, 0) Then
    ! o" K$ n8 X  x- t) h8 ]! t1 j- c
  29.                         D = A(J, 0)
    4 K/ G; x; y) o* H# K. P: E
  30.                         A(J, 0) = A(I, 0)
    % B8 p' _9 ~: \
  31.                         A(I, 0) = D& e- D( ?. S% W+ g# v
  32.                         D = A(J, 1)
      Y+ I0 g# `& @" e$ r: K1 |9 \
  33.                         A(J, 1) = A(I, 1)
    / Q  ?' }2 Q+ \: a0 v# {
  34.                         A(I, 1) = D! t+ N0 Z5 C" I" d# {5 R/ L
  35.                     End If2 ^" u& t* \" a) v
  36.                 Next
    : n+ m: x" |; U: V# c6 Z
  37.             Next. S; F2 g+ a$ x& {$ e' R
  38.             '替换
    / z5 u/ [7 E! f  ^, K
  39.             For I = 0 To SS.Count - 1
    : w2 ~4 v4 `" o! J
  40.                 SS(A(I, 1)).TextString = I + 1
    4 L' D* w2 J0 c; O' e
  41.             Next
    5 m6 K' \8 i& f7 y$ I* ~
  42.         End If( g7 k+ n# u! I8 L( ^3 L
  43.         '删除用过的选择集
    3 [! y! H* w( B
  44.         SS.Delete6 L/ X6 w; t! C
  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 Double8 K) c# \- D3 ?! z* r& L. r
  2.     On Error Resume Next
    , v8 k6 K, |; t5 q5 T
  3.     With ThisDrawing8 O$ y7 c# C9 `2 k# R
  4.         '创建选择集,用于选择所有文字对象  R! _4 D8 h+ m$ E
  5.         Set SS = .SelectionSets.Add("SS"); t# }" q5 ?, N; r9 j3 U
  6.         '定义过滤器为选择单行文字对象
    , Q4 X4 }. f; f; D) Z
  7.         Ft(0) = 0; D# t# U- J8 S; k3 ~: v, T
  8.         Fd(0) = "TEXT"
    + w  G  j# \0 y+ k" f8 A2 Y
  9.         '选择所有单行文字对象
    ' d3 J7 M& y( D
  10.         SS.Select acSelectionSetAll, , , Ft, Fd
    8 S( P1 @$ s+ x# W( `- C) {$ W
  11.         '当存在单行文字对象时排序和替换
    ; l9 O+ k$ L" P/ f  ~
  12.         If SS.Count > 0 Then
    2 \+ e, l, @; E2 L- d) g
  13.             '由用户在屏幕上指定中心点& k) E) a/ u2 n( M9 }
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:"), [/ s) r2 N" _9 I7 {4 u  v+ e
  15.             '如果用户没有取消则排序和替换) Q) n; T3 Q) R$ U9 g9 a
  16.             If Err <> -2147352567 Then/ A+ |* p" L' u3 W5 w" u6 N0 a$ x
  17.                 '用户指定了点
    9 r3 C/ L5 E! ^- f0 Z
  18.                 If Err = 0 Then6 V' C* t2 p% h* ~+ Z: @- ]
  19.                     P(0) = V(0)
    3 g7 R1 ]+ p# h# i0 Y
  20.                     P(1) = V(1)/ @2 C; W( H' t1 b5 P: F. _
  21.                 '用户选择了默认
    2 z+ S: y7 h( k& i
  22.                 Else
    1 x+ H% H& l" k4 I/ t/ O3 v
  23.                     '计算所有单行文字的几何中心  X+ C% E  b$ E' f8 n( o6 r; n" h
  24.                     For I = 0 To SS.Count - 1: {* r" q: Q& @/ s5 p
  25.                         V = SS(I).InsertionPoint
    : G6 q1 X' W  m4 M2 c0 f# C' Z
  26.                         P(0) = P(0) + V(0) / SS.Count4 t3 P  h. T$ I' g  N  R
  27.                         P(1) = P(1) + V(1) / SS.Count, e: A/ U7 L. o1 v( K
  28.                     Next
    + Q5 C! ~3 u5 t. ]
  29.                 End If5 T0 J( d9 ^% G" j
  30.                 '重定义动态数组下标* ]8 U! H, B) _4 n! \$ L
  31.                 ReDim A(SS.Count - 1, 1)
    * Z1 x+ V) k( q$ E6 }* F
  32.                 For I = 0 To SS.Count - 11 g3 @) N/ g6 e" o9 T9 p8 H) i; _+ ^
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号, G% p( f6 ?& [6 m  D- b
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    : r7 A9 S: ~+ Y8 H: R. h
  35.                     A(I, 1) = I
    ! f5 c+ w- ?2 z/ n1 k1 G9 H
  36.                 Next7 s9 P9 ?6 \7 K5 r
  37.                 '按角度从大到小的顺序排序9 ^8 \3 O- }! U3 E) h
  38.                 For I = 0 To SS.Count - 2
    , q3 ?5 }% n1 x4 I5 Q: B: s4 Q& z4 J
  39.                     For J = I + 1 To SS.Count - 1
    4 A2 W) t4 |. C! m
  40.                         If A(J, 0) > A(I, 0) Then4 b$ Y5 t7 e1 _, {
  41.                             D = A(J, 0)
    ; n% L9 C7 V8 s- N' D4 W
  42.                             A(J, 0) = A(I, 0)
    / [# h  @- H* D' |8 {! r0 w
  43.                             A(I, 0) = D
    0 m5 s* I+ V' k  V  o+ H  G- G9 B
  44.                             D = A(J, 1)
    : Q5 O( t+ I' R. z
  45.                             A(J, 1) = A(I, 1)
    7 L/ `* M) K' t2 b' s
  46.                             A(I, 1) = D& g5 F  |) f  m5 U, u
  47.                         End If5 v. U. W$ D8 ^; V2 u6 z% C; l9 _
  48.                     Next! d5 Y2 W* ^/ X0 e7 y' u/ j
  49.                 Next
    8 t: f- }$ \3 e; z) K9 y
  50.                 '替换* J- w( [6 m* ?4 S  {3 S1 {  g- |
  51.                 For I = 0 To SS.Count - 1
    2 ?- }- F& B" o5 ?6 m# e4 _* J
  52.                     SS(A(I, 1)).TextString = I + 1. T: g5 x7 l4 r, e$ n4 |2 a8 E
  53.                 Next
    $ G& `$ z# k$ B6 \
  54.             End If
    # v) {; x/ w! o9 x
  55.         End If( z) r' r5 T: n! G3 J
  56.         '删除用过的选择集0 ~( `3 q8 }8 ]$ [
  57.         SS.Delete7 G7 }- Q# k. F: ]/ u8 U5 x6 `
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia " M7 B7 w# t) p; H

* F. K2 o& l' L% v能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:
- Y# Z/ R! ^8 v& T我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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