DinØsaur 发表于 2006-8-29 15:45:53

代理实体

我在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)&引用;“代理实体”
这是正确的方法,还是有其他方法来完成消除代理的任务&引用

Jeff_M 发表于 2006-8-29 16:04:04

我不确定您得到的是什么代理对象,但由LDT和Civil 3D生成的代理对象可以分解为块,然后再次分解为原生AutoCAD元素。

Bryco 发表于 2006-8-29 16:08:45

首先,你不能过滤100个组码。改为使用0组。尽管如此,我'我不确定在没有object enabler的情况下,你能用代理对象做什么。我不知道't在这里有一个普通的安装来测试,但您可以尝试代码(0)=0和代码值(0)=*代理*“
当然,如果您要将这些图纸发回给顾问,并且这些图纸取决于这些物体的位置,他们可能会对您删除这些图纸产生异议。

Jeff_M 发表于 2006-8-29 18:28:23

在副本上试试这个,我'我不太确定'这就是你想要的,当然还有杰夫说的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

JohnF 发表于 2006-8-30 02:11:42

选择集不会获取所有代理对象。有些人将生活在NOD(命名对象字典)的土地上,因此你也必须处理这些,但VBA可以#039;t来自内存。

Jeff_M 发表于 2006-8-31 07:11:46

对于来自外部承包商的图纸中的代理对象,我也有类似的问题
最后,我使用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

Bryco 发表于 2006-8-31 19:19:27

这对我来说也是一种痛苦。我刚刚试过你的两个's代码,它们不起作用。就像杰夫说的
我刚在脖子上做了双重融合,所以我现在不是百分之百。希望有人能想出一种方法,在没有处理程序的情况下把它们清理干净
有趣的是,它说它删除了Genius MDT的内容,但它仍然存在于图形数据库查看器中。我试着净化,但没有效果
我认为解决方案代码将导出我们想要的,而不是删除我们不需要的;t、 即便如此,谁知道呢?

JohnF 发表于 2006-8-31 21:09:53

这可能是一个很好的起点:
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

Jeff_M 发表于 2006-9-1 11:12:16

嘿,Chuck,我给你的代码介绍了一些旧的MDT代理
这里的行:
&quot&nbsp 如果obj.ObjectName类似于;AcDbZombie*”;然后&nbsp 删除“目标”
这抓住了这个名字;AcDbZombieObject“
然后它拒绝删除它,并出现了这个错误(见附件jpg):
对不起,我帮不了你解释为什么它赢了't删除。即使是100%的我也只是你们中的5%
还有,我确实把它跳到了下一行,它返回了:
?obj.HasExtensionDictionaryFalse

JohnF 发表于 2006-9-1 12:46:58

当ObjectARX开发人员设计自定义对象时,他可以决定当他的代码未加载时,该对象的代理上允许哪些操作 显然,MDT开发人员决定禁止删除MDT代理(可能还包括所有其他操作)
我知道这对一些代理来说是个问题,但我认为我们可能会幸运地遇到迈克面临的特定代理 对不起,这是白费力气
我相信有人[编辑]呃……你我的意思是[编辑]提到了导出所有内容,但将代理导出到新绘图 我觉得这是个不错的主意;事实上,我提供的代码可以适应这样做,而不需要太多的努力。
页: [1] 2
查看完整版本: 代理实体