明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1744|回复: 5

求助,关于修改文字的问题

[复制链接]
发表于 2004-6-6 11:11:00 | 显示全部楼层 |阅读模式
我想用VBA编一个修改文字的程序,


就好象CAD的特性匹配一样,只要选择了参照文字,其他被选择的文字对象都改变了


比如:图中有是个文字,分别是“A”,“B”,“C”,“D”


我想把“B”改成“A”,只要选择“A”,再刷一下“B”,“B”就变成“A”了。
发表于 2004-6-6 11:51:00 | 显示全部楼层
错误处理没写,所以一点要点准,呵呵 Sub tt()
Dim pnt As Variant
Dim ent As AcadEntity
Dim stxt As String
Dim mtxt As String
Dim sset As AcadSelectionSet
Dim i As Integer
For i = 0 To ThisDrawing.SelectionSets.Count - 1
ThisDrawing.SelectionSets.Item(i).Clear
ThisDrawing.SelectionSets.Item(i).Delete
Next
ThisDrawing.Utility.GetEntity ent, pnt, "choose"
stxt = ent.TextString
Set sset = ThisDrawing.SelectionSets.Add("tt") sset.SelectOnScreen
For i = 0 To sset.Count - 1
sset.Item(i).TextString = stxt
Next
End Sub
发表于 2004-6-6 13:49:00 | 显示全部楼层
这个我写过,和楼主所说的功能一模一样。对于属性文字也可以(不过属性中只提取第一个文字),不过对于Mtext没有试过,不知道好不好用。代码如下:
  1. '主程序如下
  2. Sub SameText()   ThisDrawing.Utility.Prompt "欢迎使用《文字变相同》"
  3.    
  4.    Dim getobj1 As Object
  5.    Dim getObj2 As Object
  6.    Dim basePnt As Variant
  7.    Dim getaReal As Variant
  8.    Dim ssetobj As AcadSelectionSet '声明一个集合
  9.    Dim Att1 As Variant   '声明一个属性变量
  10.    Dim Att2 As Variant
  11.    On Error Resume Next
  12.    ThisDrawing.SelectionSets("被改变文字").Delete
  13.    Set ssetobj = ThisDrawing.SelectionSets.Add("被改变文字")
  14.    
  15.    On Error GoTo Finish
  16.    gwGetEntity getobj1, basePnt, "选择被复制文字或属性:", "AcDbBlockReference", "AcDb*text"
  17.    If getobj1 Is Nothing Then GoTo Finish
  18.    
  19.    Dim FType, FData
  20.    BuildFilter FType, FData, -4, "<or", 0, "insert", 0, "*text", -4, "or>"
  21.    ssetobj.SelectOnScreen FType, FData
  22.    If ssetobj.Count = 0 Then GoTo Finish '如果没有选择物体,结束程序
  23.    Dim textStr As String
  24.    
  25.        If getobj1.ObjectName = "AcDbBlockReference" Then
  26.            Att1 = getobj1.GetAttributes()
  27.            textStr1 = Att1(0).TextString
  28.        ElseIf getobj1.ObjectName = "AcDbText" Then
  29.            textStr1 = getobj1.TextString
  30.        End If
  31.    
  32.    For Each pickedObjs In ssetobj
  33.        If pickedObjs.ObjectName = "AcDbBlockReference" Then
  34.            Att2 = pickedObjs.GetAttributes()
  35.            Att2(0).TextString = textStr1
  36.        Else
  37.            pickedObjs.TextString = textStr1
  38.        End If
  39.    NextFinish:
  40.    ssetobj.Delete
  41. End Sub'函数如下Public Sub gwGetEntity(ent As Object, pickedPoint, Prompt As String, ParamArray gType())
  42.   '选择某一类型的实体,如果选择错误则继续,按ESC退出
  43.   'gtype是实体名称,不区分大小写,可以用通配符号,如"AcDbBlockReference","acdb*text"等
  44.   Dim i As Integer
  45.   Dim pd As Boolean
  46.   pd = False
  47.   Do
  48.    GetEntityEx ent, pickedPoint, Prompt
  49.    
  50.    If ent Is Nothing Then
  51.        Exit Do
  52.    ElseIf UBound(gType) - LBound(gType) + 1 = 0 Then
  53.        Exit Do
  54.    Else
  55.        For i = LBound(gType) To UBound(gType)
  56.            If UCase(ent.ObjectName) Like UCase(gType(i)) Then
  57.                Exit Do
  58.            Else
  59.                pd = True
  60.            End If
  61.        Next i
  62.        If pd Then ThisDrawing.Utility.Prompt "选择的实体不符合要求."
  63.    End If
  64.   Loop
  65.   
  66. End Sub
  67. Public Sub GetEntityEx(ent As Object, pickedPoint, Optional Prompt)
  68.    '选择实体,直到用户取消操作
  69.        On Error Resume Next
  70. StartLoop:
  71.        ThisDrawing.Utility.GetEntity ent, pickedPoint, Prompt
  72.        If Err Then
  73.                If ThisDrawing.GetVariable("errno") = 7 Then
  74.                        Err.Clear
  75.                        GoTo StartLoop
  76.                Else                       Err.Raise vbObjectError + 5, , "用户取消操作"
  77.                End If
  78.        End IfEnd Sub
  79. Public Sub BuildFilter(typeArray, dataArray, ParamArray gCodes())
  80.        '用数组方式填充一对变量以用作为选择集过滤器使用
  81.        Dim FType() As Integer, FData()
  82.        Dim index As Long, i As Long
  83.       
  84.        index = LBound(gCodes) - 1
  85.                
  86.        For i = LBound(gCodes) To UBound(gCodes) Step 2
  87.                index = index + 1
  88.                ReDim Preserve FType(0 To index)
  89.                ReDim Preserve FData(0 To index)
  90.                FType(index) = CInt(gCodes(i))
  91.                FData(index) = gCodes(i + 1)
  92.        Next
  93.        typeArray = FType: dataArray = FData
  94. End Sub
发表于 2004-6-7 08:33:00 | 显示全部楼层
myfreemind发表于2004-6-6 11:51:00错误处理没写,所以一点要点准,呵呵 Sub tt()Dim pnt As VariantDim ent As AcadEntityDim stxt As StringDim mtxt As StringDim sset ...
可以用过滤器,只选择文字对象
 楼主| 发表于 2004-6-7 12:27:00 | 显示全部楼层
我试了一下,可以的,但是还有一个小问题,


就是在使用中我想同时可以使用CAD的某些功能,如实时缩放,平移等


不知以上程序如何处理,如果VBA运行的同时不能使用CAD命令,那画图的速度很慢的!
发表于 2004-6-7 14:38:00 | 显示全部楼层
如果要要使用缩放和平移等透明命令,那要用本版面的置顶帖子 getxx类。


我当时写的时候没有考虑用透明命令。


楼主用的cad版本是什么?autocad2004以上就有滚轮缩放功能,不需要缩放平移等透明命令了,滚轮缩放功能在vba中能用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-28 05:33 , Processed in 0.152761 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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