代理实体
我在AUGI编程页面上发布了以下主题。本人';我把它贴在这里,以防任何人都能对一个棘手的问题有所了解;我们有一个永无止境的问题,工程顾问向我们提交文件,其中包含代理对象,通常来自他们购买的用于计算的第三方软件。我们已经尽力说服他们不要给我们发送带有代理的文件,但没有什么能阻止他们。我已经决定,更好的方法可能是删除我们端的对象我的第一个想法是在VBA中使用选择过滤器来选择代理对象,然后删除它们。问题是找到DXG组码进行选择。我可以';不要让代码工作。在我的测试文件上弹出的代理通知指示170个对象。我能够从这个文件中生成DXF文件,并且;AcDbProxyObject“;出现在DXF文件中170次。这里是#039;作为DXF代码的示例:0ACAD\U PROXY\u对象p>9049991937952555929I我知道这其中的大部分是什么,但我可以#039;t获取获取170个代理的选择集。这里是#039;s my VBA code:Dim Sset As AcadSelectionSet作为整数Dim Codes(0)作为变量Dim CodeValues(0) 设置Sset=ThisDrawing.SelectionSets.Add(“代理”)
Sset。选择acSelectionSetAll、Codes、CodeValues调试。打印“;绘图;“有”&;Sset。计数(&A)&引用;“代理实体”
这是正确的方法,还是有其他方法来完成消除代理的任务&引用
我不确定您得到的是什么代理对象,但由LDT和Civil 3D生成的代理对象可以分解为块,然后再次分解为原生AutoCAD元素。 首先,你不能过滤100个组码。改为使用0组。尽管如此,我';我不确定在没有object enabler的情况下,你能用代理对象做什么。我不知道';t在这里有一个普通的安装来测试,但您可以尝试代码(0)=0和代码值(0)=*代理*“
当然,如果您要将这些图纸发回给顾问,并且这些图纸取决于这些物体的位置,他们可能会对您删除这些图纸产生异议。 在副本上试试这个,我';我不太确定';这就是你想要的,当然还有杰夫说的Sub Apps()
Dim App As AcadRegisteredApplication
For Each App In ThisDrawing.RegisteredApplications
Debug.Print App.Name
DeleteApplicationXData App.Name
Next
End Sub
'Cadvault
Public Function DeleteApplicationXData(strAppName As String) As Boolean
Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Dim objEnt As AcadEntity
Dim intXData(0) As Integer
Dim varXData(0) As Variant
Dim varData(0) As Variant
Dim intData(0) As Integer
On Error GoTo Err_Control
Set objSelSet = ThisDrawing.PickfirstSelectionSet
intData(0) = 1001
varData(0) = strAppName
objSelSet.Select 5, FilterType:=intData, FilterData:=varData
For Each objEnt In objSelSet
objEnt.SetXData intData, varData
Next objEnt
objSelSet.Delete
DeleteApplicationXData = True
Exit_Here:
Exit Function
Err_Control:
Select Case Err.Number
Case Else
MsgBox Err.Description
Resume Exit_Here
End Select
End Function
选择集不会获取所有代理对象。有些人将生活在NOD(命名对象字典)的土地上,因此你也必须处理这些,但VBA可以#039;t来自内存。 对于来自外部承包商的图纸中的代理对象,我也有类似的问题
最后,我使用Microstation来;“清理”;这些代理对象
然而,我用这个找到了他们:
Option Explicit
Public Sub Find_Proxy()
Dim objEnt As AcadEntity
Dim intCnt As Integer
Dim iLp As Integer
Dim iDx As Integer
Dim objDic As AcadDictionary
Dim tempObj As AcadObject
For Each objEnt In ThisDrawing.ModelSpace
If objEnt.HasExtensionDictionary Then
objEnt.Color = acRed
Set objDic = objEnt.GetExtensionDictionary
iLp = objDic.Count
For iDx = 0 To iLp - 1
Set tempObj = objDic.Item(iDx)
tempObj.Delete
Next iDx
intCnt = intCnt + objDic.Count
End If
Next objEnt
Debug.Print intCnt
End Sub
这对我来说也是一种痛苦。我刚刚试过你的两个';s代码,它们不起作用。就像杰夫说的
我刚在脖子上做了双重融合,所以我现在不是百分之百。希望有人能想出一种方法,在没有处理程序的情况下把它们清理干净
有趣的是,它说它删除了Genius MDT的内容,但它仍然存在于图形数据库查看器中。我试着净化,但没有效果
我认为解决方案代码将导出我们想要的,而不是删除我们不需要的;t、 即便如此,谁知道呢? 这可能是一个很好的起点:
Option Explicit
Sub main()
scanDictionary ThisDrawing.Dictionaries
scanTable ThisDrawing.DimStyles
scanTable ThisDrawing.Layers
scanTable ThisDrawing.Linetypes
scanTable ThisDrawing.TextStyles
scanObjects
End Sub
Sub scanDictionary(ByRef dictionary As Object)
Dim obj As AcadObject
For Each obj In dictionary
If obj.ObjectName Like "AcDbZombie*" Then
obj.Delete
Else
If obj.HasExtensionDictionary Then
scanDictionary obj.GetExtensionDictionary
End If
End If
Next obj
Set obj = Nothing
End Sub
Sub scanTable(ByRef table As Object)
Dim obj As Object
For Each obj In table
If obj.HasExtensionDictionary Then
scanDictionary obj.GetExtensionDictionary
End If
Next obj
Set obj = Nothing
End Sub
Sub scanObjects()
Dim block As AcadBlock
For Each block In ThisDrawing.Blocks
Dim ent As AcadEntity
For Each ent In block
If ent.ObjectName = "AcDbZombieEntity" Then
ent.Delete
Else
If ent.HasExtensionDictionary Then
scanDictionary ent.GetExtensionDictionary
End If
End If
Next ent
Set ent = Nothing
Next block
Set block = Nothing
End Sub
嘿,Chuck,我给你的代码介绍了一些旧的MDT代理
这里的行:
"  ;如果obj.ObjectName类似于;AcDbZombie*”;然后  ;删除“目标”
这抓住了这个名字;AcDbZombieObject“
然后它拒绝删除它,并出现了这个错误(见附件jpg):
对不起,我帮不了你解释为什么它赢了';t删除。即使是100%的我也只是你们中的5%
还有,我确实把它跳到了下一行,它返回了:
?obj.HasExtensionDictionaryFalse 当ObjectARX开发人员设计自定义对象时,他可以决定当他的代码未加载时,该对象的代理上允许哪些操作 ;显然,MDT开发人员决定禁止删除MDT代理(可能还包括所有其他操作)
我知道这对一些代理来说是个问题,但我认为我们可能会幸运地遇到迈克面临的特定代理 ;对不起,这是白费力气
我相信有人[编辑]呃……你我的意思是[编辑]提到了导出所有内容,但将代理导出到新绘图 ;我觉得这是个不错的主意;事实上,我提供的代码可以适应这样做,而不需要太多的努力。
页:
[1]
2