乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: zzyong00

用VB6进行Autocad的二次开发(原创)

[复制链接]

23

主题

561

帖子

13

银币

中流砥柱

Rank: 25

铜币
653
发表于 2014-10-20 21:44:00 | 显示全部楼层
2、多选增量复制
在实际应用中,有可能同时选择多个文字对象,进行增量复制

31mpcdkrwa2.gif

31mpcdkrwa2.gif

先发个多选的子程序
  1. Private Sub SelectLots(ByVal Ssetname As String, _
  2.     ByVal objName As String, _
  3.     Optional strPrompt As String = "请选择单行文本,可以框选" & vbCrLf)
  4.     'Ssetname 新建选择集的名
  5.    'objName 要选择对象的名,可以文字对象,也可以是直线或其它任何acad实体
  6.    'strPrompt 选择时提示的文字
  7.     Dim sSetObj As AcadSelectionSet, flag As Boolean
  8.     For Each sSetObj In ThisDrawing.SelectionSets
  9.         If sSetObj.name = Ssetname Then
  10.             flag = True
  11.             Exit For
  12.         End If
  13.     Next
  14.     If flag Then sSetObj.Delete                                                 '创建集合,如集存在,则删除,新建
  15.     Set sSetObj = ThisDrawing.SelectionSets.Add(Ssetname)
  16.     Dim gpCode(0)    As Integer
  17.     Dim dataValue(0) As Variant
  18.     gpCode(0) = 0
  19.     dataValue(0) = objName
  20.     Dim groupCode As Variant, dataCode As Variant
  21.     groupCode = gpCode
  22.     dataCode = dataValue
  23.     ThisDrawing.Utility.Prompt strPrompt
  24.     sSetObj.SelectOnScreen groupCode, dataCode
  25. End Sub

没有太多变化,直接发代码:
  1. Public Sub CopyTextIncrement2()                                                  '增量复制,多选模式
  2.     Dim strSsetname As String, objTextArr() As AcadText, i As Long
  3.     strSsetname = "MEA~CopyTextIncrement2"
  4.     SelectLots strSsetname, "TEXT"
  5.     If ThisDrawing.SelectionSets(strSsetname).Count = 0 Then Exit Sub
  6.     On Error GoTo Err2
  7.     ReDim objTextArr(ThisDrawing.SelectionSets(strSsetname).Count - 1)
  8.     For i = 0 To ThisDrawing.SelectionSets(strSsetname).Count - 1
  9.         Set objTextArr(i) = ThisDrawing.SelectionSets(strSsetname).Item(i)
  10.     Next i
  11.     Dim IncreaseNum As Double
  12.     IncreaseNum = ThisDrawing.Utility.GetReal("请输入增加量(可以为负,默认为1):")
  13.     If IncreaseNum = 0 Then IncreaseNum = 1
  14.     On Error GoTo err1
  15.     Dim copyObj As AcadText, pt1, pt2
  16.     Dim dx As Double, dy As Double, InsPt(2) As Double
  17.     pt1 = ThisDrawing.Utility.GetPoint(, "请指定复制基点:")
  18.     Do
  19.         pt2 = ThisDrawing.Utility.GetPoint(pt1, "请指定复制到点:")
  20.         For i = 0 To UBound(objTextArr)
  21.             dx = pt2(0) - pt1(0)
  22.             dy = pt2(1) - pt1(1)
  23.             Set copyObj = objTextArr(i).Copy()
  24.             Dim strText As String, iPos As Integer, iDotPos As Integer, strFormat As String
  25.             strText = RTrim(copyObj.TextString)
  26.             iPos = Len(strText)
  27.             Do While IsNumeric(Mid(strText, iPos))
  28.                 iPos = iPos - 1
  29.                 If iPos = 0 Then Exit Do
  30.             Loop
  31.             If iPos = Len(strText) Then '末尾没有数字
  32.                 strText = strText & CStr(IncreaseNum)
  33.             Else
  34.                 iDotPos = InStr(iPos + 1, strText, ".", vbTextCompare)              '取小数点位置
  35.                 If iDotPos  0 Then '有小数点
  36.                     strFormat = "#." & String(Len(strText) - iDotPos, "0")
  37.                     strText = Mid(strText, 1, iPos) & Format(Val((Mid(strText, iPos + 1)) + _
  38.                     IncreaseNum), strFormat)
  39.                 Else '无小数点
  40.                     strText = Mid(strText, 1, iPos) & CStr(Val((Mid(strText, iPos + 1)) + _
  41.                     IncreaseNum))
  42.                 End If
  43.             End If
  44.             InsPt(0) = copyObj.InsertionPoint(0) + dx
  45.             InsPt(1) = copyObj.InsertionPoint(1) + dy
  46.             copyObj.TextString = strText
  47.             copyObj.Move copyObj.InsertionPoint, InsPt
  48.             copyObj.Highlight False
  49.             Set objTextArr(i) = copyObj
  50.             copyObj.Highlight True
  51.         Next i
  52.         pt1 = pt2
  53.     Loop
  54.     Exit Sub
  55. err1:
  56.     If Not (copyObj Is Nothing) Then copyObj.Highlight False
  57.     Debug.Print Err.Description
  58.     Err.Clear
  59.     Exit Sub
  60. Err2:
  61.     Err.Clear
  62.     Resume Next
  63. End Sub

回复

使用道具 举报

23

主题

561

帖子

13

银币

中流砥柱

Rank: 25

铜币
653
发表于 2014-10-20 21:54:00 | 显示全部楼层
3、先选择对象再执行命令
在vb中可不可以先选择对象再执行命令呢?当然是可以的,AcadDocument对象有一个PickfirstSelectionSet属性,可以实现这个目的。看代码:
  1. Private Function getPickFirstSel(Optional strObjName As String = "AcDbText") As _
  2.     AcadSelectionSet                                                            '选当前选择的text
  3.    
  4.     On Error GoTo err1
  5.    
  6.     Dim objSset As AcadSelectionSet
  7.    
  8.     Dim obj1    As AcadObject, objRemove(0) As AcadObject, i As Integer
  9.    
  10.     Dim iNum    As Integer
  11.    
  12.     iNum = 0
  13.     Set objSset = ThisDrawing.PickfirstSelectionSet
  14.    
  15.     If objSset.Count > 0 Then
  16.         
  17.         For i = objSset.Count - 1 To 0 Step -1
  18.             Set obj1 = objSset.Item(i)
  19.             
  20.             If StrComp(obj1.ObjectName, strObjName, vbTextCompare) = 0 Then
  21.                 iNum = iNum + 1
  22.             Else
  23.                 Set objRemove(0) = obj1                                         '如果不是文字,就从选集中删除
  24.                 objSset.RemoveItems objRemove                                   '这里必须是数组(变体)
  25.             End If
  26.             
  27.         Next i
  28.         
  29.     End If
  30.    
  31.     If iNum > 0 Then
  32.         Set getPickFirstSel = objSset
  33.     Else
  34.         Set getPickFirstSel = Nothing
  35.     End If
  36.    
  37.     Exit Function
  38.    
  39. err1:
  40.     Set getPickFirstSel = Nothing
  41.     ‘Debug.Print Err.Number, Err.Description
  42.     Err.Clear
  43. End Function
回复

使用道具 举报

23

主题

561

帖子

13

银币

中流砥柱

Rank: 25

铜币
653
发表于 2014-10-20 21:58:00 | 显示全部楼层
另外说一点Autocad的小知识,知道的同志请忽略,对于不支持先选择后执行命令的命令,也可以先选择后执行,方法是:(1),选择你要选择的对象
                   (2),执行命令,选择对象之前按p键,回车就可以了
回复

使用道具 举报

2

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
19
发表于 2014-10-21 15:38:00 | 显示全部楼层
很好很强大 学习学习
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-4-20 05:11 , Processed in 1.804863 second(s), 61 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表