获取字典/XRecord父级
我正在尝试读取由另一个应用程序编写的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。
它唯一的字符串数据,应该很容易返回。还是我走错路了?
还有其他方法可以获取字典名称吗?甚至需要字典名称吗?
...在波基普西感到困惑
**** Hidden Message ***** 亲爱的困惑,
我刚刚在一个示例绘图上运行了您的代码,其中包含字典和Xrecords。它运行良好...你能用你正在使用的数据发布一个图纸吗?除了代码之外,您还要获取Xrecord的ObjectID? 我附上了一张样图。至于获取objectID的goes,这是一个简单的例程,只需在Acaddocument.objectmodified事件中使用debug.print。如果您找到此图形,并将其加载到记事本中,搜索“y:\”(一个驱动器号),您将看到有问题的xrecords的一部分。
我也在其他绘图上运行过代码,没有任何问题。我之前发布的代码和DBVIEW,tank都出现在该图纸上,但我的代码和DBVIEW,tank都没有出现在没有第三方应用程序创建的实体的图纸上。我开始认为它受到了某种保护?这可能吗?我快速浏览加载的应用程序,没有显示任何特殊的ARX,除了默认目录...除非我错过了什么...? 好的,不用深入研究,Xrecord引用的字典似乎没有name属性。与用于组、布局、材质和其他对象的基本Acad字典非常相似,这些字典没有名称属性。任何一个名字都会让你窒息
因此,第三方应用程序正在创建一个字典,而不是给它一个name属性。知道了这一点,你可以围绕它编码,这取决于你想用它做什么。
>>它看起来像字典,Xrecord引用没有名称属性。
我开始这么想 - 就像一个“匿名”块?
>>知道这一点,你可以围绕它编码,这取决于你想要什么
,无论如何,它*听起来*容易。 我正在尝试获取字典,读取路径信息和关联的字符串变量,以便我可以检查引用的目录(存储在XRecords中)以获取用于存储额外信息的额外MSOffice文件。 我不会奢侈地等待对象修改事件;据我所知,可能不止一本字典。但是我知道XRecords的名字,这些在图纸之间会非常一致。
如何围绕此编写代码?我看到的唯一代码显示一个人通过使用其名称来获取字典。虽然现有的 XRecord 代码也是如此,但 XRecord 名称在 DXF 中显然可用。
所以,你已经打开了一扇门,但该死的东西上仍然有一条链子......
刚刚醒来,所以我睡眼惺忪...只是一张小纸条...没有name属性的字典仍然有一个句柄(以后可以通过handletoobject方法利用它)...不管怎样...嗯...咖啡...
...心里想...如果你能发给我一个样本图,在我冲淋浴然后开车去上班之前,我有大约15分钟的时间...你可以说我疯了,但我想我能破解这个难题... 迈克尔,他们的第二篇文章附有一张小样本图纸
这里有一种方法。虽然有一张巨大的图纸,但可能需要一段时间。
Function get_the_dict(strXRecName As String) As AcadDictionary
Dim oEnt As AcadEntity
Dim oDict As AcadDictionary
Dim oXrec As AcadXRecord
Dim oTmp2 As AcadObject
For Each oEnt In ThisDrawing.ModelSpace
If oEnt.HasExtensionDictionary = True Then
Set oDict = oEnt.GetExtensionDictionary
For Each oTmp2 In oDict
If TypeOf oTmp2 Is AcadXRecord Then
Set oXrec = oTmp2
If oXrec.Name = strXRecName Then
Set get_the_dict = oDict
Exit Function
End If
End If
Next
End If
Next
End Function
Sub test()
Dim oDict As AcadDictionary
Set oDict = get_the_dict("MV_PRODUCTS")
If Not oDict Is Nothing Then
Debug.Print oDict.Handle
'do whatever you want with it now that you have it
End If
End Sub
事实上,虽然这符合我的要求,但这将获得基于xrecord名称的Xrecorddata。我想这就是您真正想要的……检查test2子部分末尾的xcode和xdata的返回值……
Function get_the_Xrec(strXRecName As String) As AcadXRecord
Dim oEnt As AcadEntity
Dim oDict As AcadDictionary
Dim oXrec As AcadXRecord
Dim oTmp2 As AcadObject
For Each oEnt In ThisDrawing.ModelSpace
If oEnt.HasExtensionDictionary = True Then
Set oDict = oEnt.GetExtensionDictionary
For Each oTmp2 In oDict
If TypeOf oTmp2 Is AcadXRecord Then
Set oXrec = oTmp2
If oXrec.Name = strXRecName Then
Set get_the_Xrec = oXrec
Exit Function
End If
End If
Next
End If
Next
End Function
Sub test2()
Dim oXrec As AcadXRecord
Set oXrec = get_the_Xrec("MV_PRODUCTS")
If Not oXrec Is Nothing Then
Debug.Print oXrec.Handle
'do whatever you want with it now that you have it
Dim xdata As Variant
Dim xcode As Variant
oXrec.GetXRecordData xcode, xdata
End If
End Sub
谁呼!就这样!有了那个片段,以及我刚刚通过电子邮件发送到您的GMail帐户的代码,我应该能够相当快地“爬上树”。
我必须说,几个月来,我一直断断续续地将这个问题的*版本*发布到各种板上。这是我得到的第一个回复。谢谢! 仅供参考…我为通过电子邮件提供的数据模型提供了详细的层次结构图和关系链接(多个)。这取决于原始海报,以决定这是否是他想要公开的东西在那之前,我必须在保密方面犯错。
页:
[1]
2