- 积分
- 230
- 明经币
- 个
- 注册时间
- 2021-12-28
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 jepvyg 于 2024-12-16 19:23 编辑
有高手能帮忙看下吗。
为了画图方便,将所有的图都放一个文件里了。现在需要将一个个的图都独立出来,用图号命名。
忙了几天,东拼西凑做了个程序。可是运行的速度却很慢(主要是在复制阶段),还不如Crtl+C 加CTRL +V快。吐血了。
跪求大神了!!
Option Explicit
Sub Explore()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim destDoc As AcadDocument
Dim templatePath As String, txtStr As String, tName As String, tPath As String
Dim ss As AcadSelectionSet
Dim k As Integer
Dim objCollection() As Object
Dim filterType(0) As Integer, filterData(0) As Variant
'防止错误
On Error Resume Next
'如果CAD开了,就取得,没有就新开。
Set acadApp = GetObject(, "AutoCAD.Application")
If acadApp Is Nothing Then
Set acadApp = CreateObject("AutoCAD.Application")
End If
' CAD可见
acadApp.Visible = True
On Error Resume Next
'首先确认要分解的图纸图号。
ThisDrawing.Utility.Prompt "请拾取新图纸图号"
'安全创建选择集***********************
If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then
Set ss = ThisDrawing.SelectionSets.Item("this")
ss.Delete
End If
Set ss = ThisDrawing.SelectionSets.Add("this")
filterType(0) = 0
filterData(0) = "text,mtext"
ss.SelectOnScreen filterType, filterData '点选输入图号
'得到选择的图号。
For k = 0 To ss.Count - 1
txtStr = ss.Item(k).ObjectName
If txtStr = "AcDbMText" Then
tName = MtextStringClearFormat(ss.Item(k).TextString)
Else: tName = ss.Item(k).TextString
End If
Next k
' 创建选择集并让用户选择实体
If Not IsNull(ThisDrawing.SelectionSets.Item("this")) Then
Set ss = ThisDrawing.SelectionSets.Item("this")
ss.Delete
End If
Set ss = ThisDrawing.SelectionSets.Add("this")
' 让用户在屏幕上选择实体
ThisDrawing.Utility.Prompt "请框选要分解的图纸部分"
ss.SelectOnScreen
'没选到图形提醒。
If ss.Count = 0 Then
MsgBox "没有选到图形!", vbExclamation
Exit Sub
End If
If Len(Dir("D:\ming\standard.dwg")) <> 0 Then
Set destDoc = ThisDrawing.Application.Documents.Open("D:\ming\standard.dwg")
Else
MsgBox "指定的文件不存在!"
End If
ReDim objCollection(ss.Count - 1) As Object
For k = 0 To ss.Count - 1
Set objCollection(k) = ss.Item(k)
Next k
acadDoc.CopyObjects objCollection, destDoc.ModelSpace
For k = 0 To ss.Count - 1
destDoc.ModelSpace.Item(k).Visible = True
Next k
' 设置缩放范围,让分出来的图Zoom-E
ThisDrawing.Application.ZoomExtents
' 保存并关闭目标文档
tPath = "D:\ming\"
destDoc.SaveAs (tPath & tName)
destDoc.Close
' 提示完成
MsgBox "所选复制完毕!"
End Sub
Public Function MtextStringClearFormat(MTextString As String) As String '清除掉多行文字中的格式。
Dim MyString As String
MyString = MTextString
MyString = ReplaceByRegExp(MyString, "\\{", Chr(1))
MyString = ReplaceByRegExp(MyString, "\\}", Chr(2))
MyString = ReplaceByRegExp(MyString, "\\\\", Chr(3))
MyString = ReplaceByRegExp(MyString, "\\S([^;]*?)(\^|#)([^;]*?);", "$1$3")
MyString = ReplaceByRegExp(MyString, "\\S([^;]*?);", "$1")
MyString = ReplaceByRegExp(MyString, "(\\P|\\O|\\o|\\L|\\l|\{|\})", "")
MyString = ReplaceByRegExp(MyString, "\\[^;]*?;", "")
MyString = ReplaceByRegExp(MyString, "\x01", "{")
MyString = ReplaceByRegExp(MyString, "\x02", "}")
MyString = ReplaceByRegExp(MyString, "\x03", "\")
MtextStringClearFormat = Trim(MyString)
End Function
Public Function ReplaceByRegExp(ByVal Mystrig As String, ByVal TxtFind As String, ByVal TxtReplace As String)'替换文字程序
Dim RE As Object
Set RE = ThisDrawing.Application.GetInterfaceObject("Vbscript.RegExp")
RE.IgnoreCase = False
RE.Global = True
RE.Pattern = TxtFind
ReplaceByRegExp = RE.Replace(Mystrig, TxtReplace)
Set RE = Nothing
End Function
|
|