乐筑天下

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

代理实体

[复制链接]

5

主题

21

帖子

1

银币

初来乍到

Rank: 1

铜币
41
发表于 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。计数和“代理实体”
这是正确的方法,还是有其他方法来完成消除代理的任务?“

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

10

主题

86

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
126
发表于 2006-8-29 16:04:04 | 显示全部楼层
我不确定您得到的是什么代理对象,但LDT和Civil 3D生成的代理对象可以分解为块,然后再次分解为原生AutoCAD元素。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-8-29 18:28:23 | 显示全部楼层
在副本上尝试一下,我不太确定这是否是您想要的,当然还有Jeff所说的内容代码0]
回复

使用道具 举报

16

主题

168

帖子

39

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2006-8-30 02:11:42 | 显示全部楼层
选择集不会获取所有代理对象。有些将生活在NOD(命名对象字典)的土地上,因此您还必须处理它们,但VBA不能从内存中处理它们。
回复

使用道具 举报

12

主题

150

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
198
发表于 2006-8-31 07:11:46 | 显示全部楼层
对于来自外部承包商的图形中的代理对象,我也遇到过类似的问题。
我最终使用Microstation来“清理”这些代理对象。
不过,我还是用这个找到了它们:
  1. Option Explicit
  2. Public Sub Find_Proxy()
  3.   Dim objEnt As AcadEntity
  4.   Dim intCnt As Integer
  5.   Dim iLp As Integer
  6.   Dim iDx As Integer
  7.   Dim objDic As AcadDictionary
  8.   Dim tempObj As AcadObject
  9.   For Each objEnt In ThisDrawing.ModelSpace
  10.     If objEnt.HasExtensionDictionary Then
  11.       objEnt.Color = acRed
  12.       Set objDic = objEnt.GetExtensionDictionary
  13.       iLp = objDic.Count
  14.       For iDx = 0 To iLp - 1
  15.         Set tempObj = objDic.Item(iDx)
  16.         tempObj.Delete
  17.       Next iDx
  18.       intCnt = intCnt + objDic.Count
  19.     End If
  20.   Next objEnt
  21.   Debug.Print intCnt
  22. End Sub

回复

使用道具 举报

12

主题

150

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

12

主题

150

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
198
发表于 2006-8-31 21:09:53 | 显示全部楼层
这可能是一个很好的起点:
  1. Option Explicit
  2. Sub main()
  3.   scanDictionary ThisDrawing.Dictionaries
  4.   scanTable ThisDrawing.DimStyles
  5.   scanTable ThisDrawing.Layers
  6.   scanTable ThisDrawing.Linetypes
  7.   scanTable ThisDrawing.TextStyles
  8.   scanObjects
  9. End Sub
  10. Sub scanDictionary(ByRef dictionary As Object)
  11.   Dim obj As AcadObject
  12.   For Each obj In dictionary
  13.     If obj.ObjectName Like "AcDbZombie*" Then
  14.       obj.Delete
  15.     Else
  16.       If obj.HasExtensionDictionary Then
  17.         scanDictionary obj.GetExtensionDictionary
  18.       End If
  19.     End If
  20.   Next obj
  21.   Set obj = Nothing
  22. End Sub
  23. Sub scanTable(ByRef table As Object)
  24.   Dim obj As Object
  25.   For Each obj In table
  26.     If obj.HasExtensionDictionary Then
  27.       scanDictionary obj.GetExtensionDictionary
  28.     End If
  29.   Next obj
  30.   Set obj = Nothing
  31. End Sub
  32. Sub scanObjects()
  33.   Dim block As AcadBlock
  34.   For Each block In ThisDrawing.Blocks
  35.     Dim ent As AcadEntity
  36.     For Each ent In block
  37.       If ent.ObjectName = "AcDbZombieEntity" Then
  38.         ent.Delete
  39.       Else
  40.         If ent.HasExtensionDictionary Then
  41.           scanDictionary ent.GetExtensionDictionary
  42.         End If
  43.       End If
  44.     Next ent
  45.     Set ent = Nothing
  46.   Next block
  47.   Set block = Nothing
  48. End Sub

回复

使用道具 举报

12

主题

150

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 13:16 , Processed in 1.282347 second(s), 73 queries .

© 2020-2025 乐筑天下

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