MikeJarosz 发表于 2006-8-29 15:45:53

代理实体

我在AUGI编程页面上发布了以下主题。我把它贴在这里,以防任何人都能对一个棘手的问题有所了解……。
“我们有一个永无止境的问题,工程顾问向我们提交带有代理对象的文件,通常来自他们购买的用于计算的第三方软件。我们尽了一切努力说服他们不要向我们发送带有代理的文件,但没有什么能阻止他们。我决定,更好的方法可能是删除我们端的对象。
我的第一个想法是使用代理VBA中的选择过滤器选择代理对象,然后将其删除。问题在于找到DXG组码以进行选择。我无法让代码正常工作。在我的测试文件上弹出的代理通知指示170个对象。我可以从这个文件中创建一个DXF文件,“AcDbProxyObject”在DXF文件中出现170次。以下是DXF代码的示例:
0
ACAD_PROXY_OBJECT
5
813D7E
102
{ACAD_ REACTORS
330
3859C9
102
330
3859C9
100
AcDbProxyObject
90
499
937
95
2555929
70
0
93
105
1284d310
929A894251896A5A9680<br>340<br>813D7F<br>94<br>0<br>我了解其中的大部分内容,但我找不到一个能抓住170个代理的选择集。这是我的VBA代码:
将Sset设置为AcadSelectionSet
设置为整数的Dim代码(0)设置为变量的Dim实体设置为AcadEntity
代码(0)=100
代码值(0)=“ProxyObject”
设为Sset=ThisDrawing.SelectionSets.Add(“代理”)
Sset。选择acSelectionSetAll,即Codes和CodeValues<br>Debug。打印“图纸有”&Sset。计数和“代理实体”
这是正确的方法,还是有其他方法来完成消除代理的任务?“
**** Hidden Message *****

DinØsaur 发表于 2006-8-29 16:04:04

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

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

首先,您不能过滤100个组码。请改用0组。也就是说,我不太确定在没有对象启用码的情况下,您是否可以对代理对象执行任何操作。我这里没有普通的安装可供测试,但您可以尝试代码(0)=0和代码值(0)=“*PROXY*”
当然,如果您要将这些绘图发回给顾问,并且它们取决于这些对象,他们可能会对您删除它们提出异议。

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

在副本上尝试一下,我不太确定这是否是您想要的,当然还有Jeff所说的内容代码0]

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

选择集不会获取所有代理对象。有些将生活在NOD(命名对象字典)的土地上,因此您还必须处理它们,但VBA不能从内存中处理它们。

DaveW 发表于 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

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

这些对我来说也很痛苦。我刚刚试了你们两个的代码,但都不工作。就像杰夫说的!!!
我刚刚做了颈部双重融合手术,所以现在我还没有完全康复。希望有人能想出一种不用训练员就能把它们弄干净的方法。
有趣的是,它说它正在删除Genius MDT内容,但它仍然在绘图数据库查看器中。我试着清洗,但没有用。
我认为解决方案代码将导出我们想要的内容,而不是删除我们不想要的内容。即使那样,谁知道呢?

DaveW 发表于 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

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

嘿,查克,
我让你的代码浏览了一些旧的MDT代理的东西。
这里的行:
“如果obj。ObjectName 像 “AcDbZombie*” 然后
obj.删除“
这抓住了这个名字,”AcDbZombieObject“
然后它拒绝删除它,并出现这个错误(见附的jpg):
对不起,我无法更有帮助地找出为什么它不会删除。A即使在100%的情况下,我可能只是你们中的5%。
另外,我确实把它撞到了下一行,它又回来了:
? obj。HasExtensionDictionary
False
如果有人想看这个MDT的东西,我已经附上了图纸。 我认为ADT会更糟。

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

当 ObjectARX 开发人员设计自定义对象时,他可以决定在未加载代码时允许对该对象的代理执行哪些操作。 显然,MDT 开发人员决定禁止擦除 MDT 代理(可能还包括所有其他操作)。
我知道这对一些代理来说是一个问题,但我认为我们可能会幸运地遇到迈克面临的特定代理。 对不起,大雁追逐。
我相信其他人[编辑]犯了错误...我的意思是提到导出除代理之外的所有内容。 对我来说,这听起来是个好主意。 事实上,我提供的代码可以适应这一点,而无需花费太多精力。
页: [1] 2
查看完整版本: 代理实体