乐筑天下

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

获取字典/XRecord父级

[复制链接]

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-2-22 12:56:19 | 显示全部楼层 |阅读模式
我正在尝试读取由另一个应用程序编写的XRecords数据。如果我导出,我可以在DXF文件中看到它,但是Ive在尝试获取拥有的字典的名称时没有运气。我尝试使用DBView“偷看”它,它以“未打开写入”错误崩溃autocad。
我编写了一个例程,在Object.Modified事件期间获取XRecords的ObjectID,并在它们经过时“捕捉它们”,当使用XRecords的实体被修改时。当所有事件都“结束”时,我运行了第二个例程从ObjectID获取XRecords对象,并尝试向上遍历父树到字典。虽然XRecord对象似乎没问题,(因为我可以获得它们的NAME属性,无论如何),但例程在尝试获取父字典的名称时会失败。我传递了下面的例程,以及XRecord的ObjectID。
错误是“运行时错误”-2145386494(80200002)':“
'“不适用”
Sub getDictName(lngXRecID As Long)
'如果传递了xRecords的
'对象ID,则尝试获取所有者字典名称。运行正常,直到我尝试
'获取字典的名称,然后返回以下错误:
'"运行时错误'-2145386494(80200002)':"
'"不适用"
暗淡的对象Tmp As AcadObject
暗淡的对象XRec As AcadXRecord
暗淡的lngOwnerID As Long
暗淡的对象Dict As AcadDicpedia
设置对象Tmp=ThisDrawing.ObjectIdToObject(lngXRecID)
如果对象Tmp什么都没有那么
Debug.Print"没有找到对象的对象的对象的对象的对象的ID"
Exit Sub
结束如果
'确保它的一个X记录
如果不是(objTmp.ObjectName="AcDbXset")然后
Debug.Print"传递的对象ID不是一个X记录"
Exit Sub
Else
设置对象XRec=ObjTmp'is";objXRec.Name
end如果
'获取XRecords的所有者
lngOwnerID=objXRec.OwnerID
设置对象Tmp=ThisDrawing.ObjectIdToObject(lngOwnerID)
'确保它是一个字典
如果不是(objTmp.ObjectName="AcDbDicpedia"),那么
Debug.Print"Owner of XRecords not a Dicpedia"
Else
'set to Dicpedia Object
设置对象为字典对象
Debug.Print"字典名称为";objDict.Name
结束如果
结束子
我希望得到拥有的字典,这样我就可以看到所有可用的XRecords。
它唯一的字符串数据,应该很容易返回。还是我走错路了?
还有其他方法可以获取字典名称吗?甚至需要字典名称吗?
...在波基普西感到困惑

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

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

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-2-22 15:05:23 | 显示全部楼层
亲爱的困惑,
我刚刚在一个示例绘图上运行了您的代码,其中包含字典和Xrecords。它运行良好...你能用你正在使用的数据发布一个图纸吗?除了代码之外,您还要获取Xrecord的ObjectID?
回复

使用道具 举报

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-2-25 06:57:01 | 显示全部楼层
我附上了一张样图。至于获取objectID的goes,这是一个简单的例程,只需在Acaddocument.objectmodified事件中使用debug.print。如果您找到此图形,并将其加载到记事本中,搜索“y:\”(一个驱动器号),您将看到有问题的xrecords的一部分。
我也在其他绘图上运行过代码,没有任何问题。我之前发布的代码和DBVIEW,tank都出现在该图纸上,但我的代码和DBVIEW,tank都没有出现在没有第三方应用程序创建的实体的图纸上。我开始认为它受到了某种保护?这可能吗?我快速浏览加载的应用程序,没有显示任何特殊的ARX,除了默认目录...除非我错过了什么...?
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-2-25 15:03:37 | 显示全部楼层
好的,不用深入研究,Xrecord引用的字典似乎没有name属性。与用于组、布局、材质和其他对象的基本Acad字典非常相似,这些字典没有名称属性。任何一个名字都会让你窒息
因此,第三方应用程序正在创建一个字典,而不是给它一个name属性。知道了这一点,你可以围绕它编码,这取决于你想用它做什么。
回复

使用道具 举报

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-2-26 06:50:43 | 显示全部楼层

>>它看起来像字典,Xrecord引用没有名称属性。
我开始这么想 - 就像一个“匿名”块?
>>知道这一点,你可以围绕它编码,这取决于你想要什么
,无论如何,它*听起来*容易。 我正在尝试获取字典,读取路径信息和关联的字符串变量,以便我可以检查引用的目录(存储在XRecords中)以获取用于存储额外信息的额外MSOffice文件。 我不会奢侈地等待对象修改事件;据我所知,可能不止一本字典。但是我知道XRecords的名字,这些在图纸之间会非常一致。
如何围绕此编写代码?我看到的唯一代码显示一个人通过使用其名称来获取字典。虽然现有的 XRecord 代码也是如此,但 XRecord 名称在 DXF 中显然可用。
所以,你已经打开了一扇门,但该死的东西上仍然有一条链子......
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-2-26 07:02:50 | 显示全部楼层
刚刚醒来,所以我睡眼惺忪...只是一张小纸条...没有name属性的字典仍然有一个句柄(以后可以通过handletoobject方法利用它)...不管怎样...嗯...咖啡...
...心里想...如果你能发给我一个样本图,在我冲淋浴然后开车去上班之前,我有大约15分钟的时间...你可以说我疯了,但我想我能破解这个难题...
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-2-26 11:13:49 | 显示全部楼层
迈克尔,他们的第二篇文章附有一张小样本图纸
这里有一种方法。虽然有一张巨大的图纸,但可能需要一段时间。
  1. Function get_the_dict(strXRecName As String) As AcadDictionary
  2. Dim oEnt As AcadEntity
  3. Dim oDict As AcadDictionary
  4. Dim oXrec As AcadXRecord
  5. Dim oTmp2 As AcadObject
  6. For Each oEnt In ThisDrawing.ModelSpace
  7.     If oEnt.HasExtensionDictionary = True Then
  8.         Set oDict = oEnt.GetExtensionDictionary
  9.         For Each oTmp2 In oDict
  10.             If TypeOf oTmp2 Is AcadXRecord Then
  11.                 Set oXrec = oTmp2
  12.                 If oXrec.Name = strXRecName Then
  13.                     Set get_the_dict = oDict
  14.                     Exit Function
  15.                 End If
  16.             End If
  17.         Next
  18.     End If
  19. Next
  20. End Function
  21. Sub test()
  22. Dim oDict As AcadDictionary
  23. Set oDict = get_the_dict("MV_PRODUCTS")
  24. If Not oDict Is Nothing Then
  25.     Debug.Print oDict.Handle
  26.     'do whatever you want with it now that you have it
  27. End If
  28. End Sub

回复

使用道具 举报

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-2-26 11:46:28 | 显示全部楼层
事实上,虽然这符合我的要求,但这将获得基于xrecord名称的Xrecorddata。我想这就是您真正想要的……检查test2子部分末尾的xcode和xdata的返回值……
  1. Function get_the_Xrec(strXRecName As String) As AcadXRecord
  2. Dim oEnt As AcadEntity
  3. Dim oDict As AcadDictionary
  4. Dim oXrec As AcadXRecord
  5. Dim oTmp2 As AcadObject
  6. For Each oEnt In ThisDrawing.ModelSpace
  7.     If oEnt.HasExtensionDictionary = True Then
  8.         Set oDict = oEnt.GetExtensionDictionary
  9.         For Each oTmp2 In oDict
  10.             If TypeOf oTmp2 Is AcadXRecord Then
  11.                 Set oXrec = oTmp2
  12.                 If oXrec.Name = strXRecName Then
  13.                     Set get_the_Xrec = oXrec
  14.                     Exit Function
  15.                 End If
  16.             End If
  17.         Next
  18.     End If
  19. Next
  20. End Function
  21. Sub test2()
  22. Dim oXrec As AcadXRecord
  23. Set oXrec = get_the_Xrec("MV_PRODUCTS")
  24. If Not oXrec Is Nothing Then
  25.     Debug.Print oXrec.Handle
  26.     'do whatever you want with it now that you have it
  27.     Dim xdata As Variant
  28.     Dim xcode As Variant
  29.     oXrec.GetXRecordData xcode, xdata
  30. End If
  31. End Sub

回复

使用道具 举报

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-2-26 12:48:28 | 显示全部楼层
谁呼!就这样!有了那个片段,以及我刚刚通过电子邮件发送到您的GMail帐户的代码,我应该能够相当快地“爬上树”。
我必须说,几个月来,我一直断断续续地将这个问题的*版本*发布到各种板上。这是我得到的第一个回复。谢谢!
回复

使用道具 举报

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-2-27 09:12:31 | 显示全部楼层
仅供参考…我为通过电子邮件提供的数据模型提供了详细的层次结构图和关系链接(多个)。这取决于原始海报,以决定这是否是他想要公开的东西在那之前,我必须在保密方面犯错。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 09:54 , Processed in 0.779224 second(s), 72 queries .

© 2020-2025 乐筑天下

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