QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我想在CAD图纸中实现查找指定的文字,然后替换成想要的文字,还要按顺(或逆)时针加编号排序,头疼在排序,请大家帮忙,谢谢!(如图); s" J% T2 p7 V- @9 ]: x0 ?
功能:
' Y0 u4 w0 k# c3 D$ K1.查找-替换0 L0 W! R. O: n3 x. d) ]0 p
2.加编号排序
0 T. Z) F% U" R* ?5 D2 |2我不知道咋怎?
5 H9 K' Z: K- n3 [2 N1 ^7 v! a5 p! b; `* `- O
             文字         文字                                             文字02           文字03* H! t$ y1 V4 k( d9 j5 z) R$ k
& g% c) Y, Y& [% _
文字                              文字    ----------------  文字01                                文字04
3 T: B2 _7 H7 x/ l            文字                                                                文字06
( r: w! x/ E: \5 y: [8 w0 U                           文字                                                                 文字05
未命名.JPG
 楼主| 发表于 2011-3-24 21:15:04 | 显示全部楼层 来自: 中国浙江杭州
最好给出代码,谢谢了!
发表于 2011-3-25 00:23:55 | 显示全部楼层 来自: 中国辽宁大连
是否可以这样:
3 R. k  p" v. ]+ x0 b遍历所有文字对象并分别对其X和Y坐标加总平均,找出所有文字对象的几何中心点,再计算出所有文字对象相对于此点的角度,排序,按排序结果替换.
- e. s; }- r  W& x下面的代码仅供参考
  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) C& T' R* q5 l, v) Y' m
  2.     With ThisDrawing  Y2 |+ ]0 q/ e
  3.         '创建选择集,用于选择所有文字对象
    5 L  V- l+ V# @) D: ~( ~7 @4 z
  4.         Set SS = .SelectionSets.Add("SS")
    + |5 d" S$ S+ a. ~
  5.         '定义过滤器为选择单行文字对象, q/ b1 ^9 ?' ^' x
  6.         Ft(0) = 05 B' N$ e& }) w1 h) y( w
  7.         Fd(0) = "TEXT"1 o. L- ^: `$ c/ N) K: U5 P1 u! u
  8.         '选择所有单行文字对象
    ' }* b( \+ l. }0 S5 A# j
  9.         SS.Select acSelectionSetAll, , , Ft, Fd
    3 T3 t5 o  T# V7 |0 f
  10.         '当存在单行文字对象时排序和替换
    . K+ M4 S' E5 N5 c# j: ?. j( l
  11.         If SS.Count > 0 Then3 m) Y! J" F) @$ [; C/ |
  12.             '计算所有单行文字的几何中心
    . J# U% e( O" r% F- g" X5 S
  13.             For I = 0 To SS.Count - 1
    0 \$ u4 r0 S7 J2 k4 M* l  ^) I$ A- M  n
  14.                 V = SS(I).InsertionPoint
    % J6 g% }6 @; v
  15.                 P(0) = P(0) + V(0) / SS.Count
    5 E9 H. g2 c/ ~# D  G
  16.                 P(1) = P(1) + V(1) / SS.Count
    $ H* O) h, W9 J: Z* Y- k
  17.             Next
    / _6 m/ H1 h$ Q, t
  18.             '重定义动态数组下标
    2 |& A4 t8 g8 E! n$ P* z' t
  19.             ReDim A(SS.Count - 1, 1)
    ) Y  p) I! q/ a# A5 f) |
  20.             For I = 0 To SS.Count - 1" d. e# Z+ I/ L
  21.                 '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    : ^# ]$ [4 q# S0 n# K' Y
  22.                 A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    % m% S0 E, E" s6 s& G! L
  23.                 A(I, 1) = I+ }4 q% \- @# i1 O0 U$ j) o$ X
  24.             Next
    % _. r) T. n- |, l& u" k
  25.             '按角度从大到小的顺序排序
    & i- m4 j2 S  u5 ~5 L
  26.             For I = 0 To SS.Count - 2: z5 M; D) j$ N4 s, }
  27.                 For J = I + 1 To SS.Count - 15 q- Y1 ~- i- N: F" y1 I
  28.                     If A(J, 0) > A(I, 0) Then. F7 Y- ]6 S7 p
  29.                         D = A(J, 0)" @: Z1 A  u0 v- s+ k) S5 C0 J
  30.                         A(J, 0) = A(I, 0)5 e/ L- h/ d# M. J# s$ j0 q7 A# N
  31.                         A(I, 0) = D
    + F+ `7 N. D/ w. K! W  J( _8 c% K
  32.                         D = A(J, 1)4 ]: X) ]  i  o" d- u
  33.                         A(J, 1) = A(I, 1)
    % m& k; ~1 g2 |( F$ N1 T, @
  34.                         A(I, 1) = D
    / l* z  Q- ~: {( Q1 A' M9 ~" G/ p
  35.                     End If" y3 H8 ~# H# a: o; S
  36.                 Next
    3 M( x$ ?8 b* Y5 Q/ a6 y4 N
  37.             Next
    3 x$ u( y0 I5 \" R8 a* G, J
  38.             '替换. @; O* c- K$ C! E) Z/ b8 |
  39.             For I = 0 To SS.Count - 1
    * N" }3 n- \& X$ p$ s  b: O
  40.                 SS(A(I, 1)).TextString = I + 1. M# F9 x* V2 P$ U" M) H
  41.             Next
    / }: `. q/ u0 r9 c; _4 e% I& K7 ?
  42.         End If  b  g# A3 B6 E7 J$ A  j* E9 _
  43.         '删除用过的选择集
    6 X# Q8 L4 a, |3 t( K8 N4 x
  44.         SS.Delete  B  x, Z3 e) @: 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 Double8 c: e6 `) c, Q; H0 g2 f3 l
  2.     On Error Resume Next. H5 H4 c0 \  w6 L1 s! M
  3.     With ThisDrawing/ Z9 U) ]/ W; o% K4 o6 X
  4.         '创建选择集,用于选择所有文字对象1 w4 e4 _7 l2 u
  5.         Set SS = .SelectionSets.Add("SS")5 Y6 j* s% o  L/ F3 N
  6.         '定义过滤器为选择单行文字对象7 I: @0 |% p. b2 z
  7.         Ft(0) = 0
    2 Z* P5 i1 O2 V
  8.         Fd(0) = "TEXT"
    & q# Z7 Z8 z1 P2 F0 x- v
  9.         '选择所有单行文字对象( V6 h9 c, u% y8 i. S
  10.         SS.Select acSelectionSetAll, , , Ft, Fd. ]- ^& Z* p# }8 [
  11.         '当存在单行文字对象时排序和替换$ H; u! V1 V. m, R
  12.         If SS.Count > 0 Then
    ; Q8 k# a# i8 a" ]0 b
  13.             '由用户在屏幕上指定中心点' K. I- p9 T2 g- R4 j- s9 V
  14.             V = .Utility.GetPoint(, "指定中心点<默认>:")
    6 V+ Q" r! m( F% `! }! H9 e
  15.             '如果用户没有取消则排序和替换
    , G. v% s, @2 a3 o) W# {7 v0 ]
  16.             If Err <> -2147352567 Then
    6 d! D& B0 d* k5 J* J
  17.                 '用户指定了点" n4 V6 M$ x$ {% D
  18.                 If Err = 0 Then
    * M9 W1 g; s: h+ _
  19.                     P(0) = V(0)
    % m( r8 [5 [& B( T
  20.                     P(1) = V(1)$ z$ @' U8 {; R$ G. a1 b
  21.                 '用户选择了默认  T! |1 c8 Y1 @$ ?! [/ X) @
  22.                 Else
    ) K) q  o  \# u. L1 w! k! b
  23.                     '计算所有单行文字的几何中心$ O# |! H6 y8 o; q
  24.                     For I = 0 To SS.Count - 1
    8 t' T0 q) v: L0 q
  25.                         V = SS(I).InsertionPoint
    3 _7 H) p6 P9 u5 x. {
  26.                         P(0) = P(0) + V(0) / SS.Count& F% K- Z3 ?3 w7 F9 c9 X! x: q
  27.                         P(1) = P(1) + V(1) / SS.Count( t! g/ J, a1 X" {+ n- e% h
  28.                     Next
    ; b' l: m1 B5 \% [. ?! N
  29.                 End If
    " l5 h+ ~3 e2 D/ k! h" d
  30.                 '重定义动态数组下标
    7 _3 w0 Y) l+ _; ?
  31.                 ReDim A(SS.Count - 1, 1)( l$ a0 e) J, Q% D- n* y
  32.                 For I = 0 To SS.Count - 1
    7 ^/ w8 l* g$ E8 X' P1 }/ g# j% w$ h
  33.                     '计算所有单行文字对象相对于中心点的角度,并记录其在选择集中的索引号
    ; H2 f7 O: O7 i* f
  34.                     A(I, 0) = .Utility.AngleFromXAxis(SS(I).InsertionPoint, P)
    2 J9 D' S+ g: }0 ^8 s. \& L( ]" B* [
  35.                     A(I, 1) = I1 w3 r  n: c9 x' T! `
  36.                 Next' c/ J: h9 K8 ?8 b+ D3 d* C8 L
  37.                 '按角度从大到小的顺序排序
    0 z, n6 ?; T# f9 z) u
  38.                 For I = 0 To SS.Count - 29 g) `" z4 [2 J1 {: }
  39.                     For J = I + 1 To SS.Count - 1
    ! o6 ?0 Y6 v6 G5 a' a4 Z; G
  40.                         If A(J, 0) > A(I, 0) Then
    2 p- Y9 e2 c" b* x
  41.                             D = A(J, 0)2 t/ u% j; v9 A* u* r2 Z, e9 m
  42.                             A(J, 0) = A(I, 0)
    ' v* i# v0 B. |! Z  i$ i
  43.                             A(I, 0) = D
    2 g5 _$ d$ B  O) B; D3 X
  44.                             D = A(J, 1)
    6 j6 Y# [4 i4 l' p/ K( c
  45.                             A(J, 1) = A(I, 1)) A2 ^5 H/ u$ }2 Y0 ~2 y$ B' w
  46.                             A(I, 1) = D
    8 Y2 r: R: A9 H! l# S" p# _
  47.                         End If9 o) P# @8 b0 U3 Z
  48.                     Next
    & U& T7 g- P9 t" V( l
  49.                 Next
    3 v7 j) T. e& `& L! u
  50.                 '替换
    % s  E3 t& H9 ~7 s  c# u
  51.                 For I = 0 To SS.Count - 1; l% R, L# F) |' _
  52.                     SS(A(I, 1)).TextString = I + 1
    . I# k4 ~4 m! @
  53.                 Next# I& A- x" m- ^, Q$ K% I$ N7 b1 [5 ^
  54.             End If
    : e! e, \4 I+ A* {1 r; f5 g
  55.         End If
    ; V2 v0 b, Q+ U
  56.         '删除用过的选择集
    ; O5 _1 f" x4 x: X4 b3 [
  57.         SS.Delete4 S# |% t9 i" e# S- ?
  58.     End With
复制代码
发表于 2011-3-26 11:15:07 | 显示全部楼层 来自: 中国黑龙江哈尔滨
版主真是高手,羡慕,我就会点autolisp基础,能编一点简单程序,请问,需要学vb编程吗,是不是够用就行,vb编程有什么好处
 楼主| 发表于 2011-4-14 11:00:27 | 显示全部楼层 来自: 中国江苏无锡
5# woaishuijia
. b& _6 w' q" U; T& Z" Y5 }
( N" \, r6 F2 ^# `能不能做成这样,我们随意指定一点,然后从相对此点的90度方向开始顺时针编号,如图所示:8 k% I2 i; U; L* I7 b; p$ s3 T
我考虑到用极坐标,但达不到效果,还想请教一下大家,谢谢了
CAD替换排序.JPG
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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