获取字典/XRecord父项
本人';我试图读取另一个应用程序写入的XRecord数据。如果我导出,我可以在DXF文件中看到它,但我没有找到拥有字典的名字。我试过';窥视#039;在它使用DBView时,它会用一个;不允许写入“;错误我编写了一个例程,在对象期间获取XRecords的ObjectID。修改的事件,以及;抓住他们“;当它们经过时,当使用XRecords的实体被修改时。当所有事件均为';超过#039;,我运行了第二个例程,从ObjectID#039;s、 并尝试向上遍历父树到字典。虽然XRecord对象似乎没有问题(因为我可以获取它们的NAME属性),但例程在尝试获取父字典的名称时会失败。我通过了下面的例程和XRecord的ObjectID
误差为;运行时错误#039-2145386494 (80200002)':&引用
&039&引用;“不适用”
Sub getDictName(lngXRecID As Long)
&039;如果通过
&039;xrecord的对象ID。运行良好,直到我尝试
&039;获取字典的名称,然后返回以下错误:
&039&引用;运行时错误#039-2145386494 (80200002)':&引用
&039&引用;“不适用”
Dim objTmp As AcadObject
Dim objXRec As AcadXRecord
Dim lngOwnerID只要长
Dim objDict As AcadDictionary
Set objTmp=this drawing。ObjectedToObject(lngXRecID)
如果objTmp为空,则调试。打印“;找不到ObjectID的对象
退出Sub;如果不是,请确保它是一个Xrecord(objTmp.ObjectName=“AcDbXrecord”)然后调试。打印“;传递的ObjectID不是XRecord的
退出Sub
Else
Set objXRec=objTmp';设置为XRecord对象调试。打印“;XRecord名称为;;objXRec。如果
&039;获取XRecord的所有者。OwnerID设置objTmp=ThisDrawing。目标对象(lngOwnerID)
&039;如果不是,请确保它是一个字典(objTmp.ObjectName=“AcDbDictionary”)然后调试。打印“;XRecord的所有者不是一本字典
其他;设置为字典对象;获取一个“;“不适用”;此处显示错误消息调试。打印“;字典名为;;objDict。Name如果End Sub,我希望得到自己的字典,这样我就可以看到所有可用的XRecords了
它唯一的字符串数据应该很容易返回。还是我走错了路
还有别的方法可以得到字典名吗?甚至需要字典名吗
波基普西的困惑
亲爱的困惑者,我刚刚用字典和;Xrecords在其中。它运行得很好……你能用你正在使用的数据发布一张图纸吗?与代码一起获得Xrecord#039;反对? 我附上了一张样图。至于获取objectID#039;这是一个只使用调试的简单例程。在Acaddocument中打印。objectmodified事件。如果您输入此绘图,并将其加载到记事本中,请搜索“X”;y: \";(驱动器号),您';我将看到部分有问题的xrecords
我也在其他图纸上运行过代码,没有问题。我之前发布的代码和DBVIEW都位于该图形上,但我的代码和DBVIEW都位于没有由相关第三方应用程序创建的实体的图形上。我开始觉得它在某种程度上得到了保护?这可能吗 ;我快速浏览加载的应用程序,除了默认目录外,没有显示任何特殊的ARX…除非我遗漏了什么? 好的,不用深入研究,Xrecord引用的字典似乎没有name属性。与组、布局、材质和其他的基本Acad字典非常类似,这些字典没有名称属性。任何一种都会在点名时窒息
因此,第三方应用程序正在创建一个字典,而不是给它一个name属性 ;知道了这一点,你可以围绕它编码,这取决于你试图用它做什么。
>&燃气轮机;Xrecord引用的字典似乎没有name属性
我开始这么想,就像一个';匿名#039;阻止
>&燃气轮机;知道了这一点,你可以围绕它编码,这取决于你想做什么。无论如何,这听起来很容易 ;我试图获取字典,读取路径信息和相关的字符串变量,这样我就可以检查引用的目录(存储在XRecords中)中是否有用于存储额外信息的额外MSOffice文件 ;我不会;拥有等待物品修改事件的奢侈;据我所知,可能不止一本字典。但是我知道XRecords的名字,而且它们在不同的绘图中会非常一致
我该如何编写代码?我看到的唯一代码显示了一个使用其名称获取词典的代码。而对于现有的;XRecord代码,XRecord名称在DXF中显而易见,所以,你';我把门打开了一条缝,但那该死的东西上仍然有一条链子 刚刚醒来,所以我';我睡眼惺忪……只是一张小纸条……字典不';t sport一个name属性仍然有一个句柄(稍后可以通过handletoobject方法利用该句柄)…因为它';s worth…嗯…咖啡…
…自以为是…如果你能给我寄一份样品图纸I';在我冲澡然后开车去上班之前,我还有大约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。我认为这才是您真正想要的……检查xcode&;的返回值;测试2子项结束时的扩展数据…
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
谁呼!即#039;就是这样!有了这段代码,以及我刚刚通过电子邮件发送给你的GMail帐户的代码,我应该能够35;039;爬上树';相当快
我必须说,几个月来,我断断续续地把这个问题的一个*版本*张贴在各个董事会上。这是我第一次收到回复。Thanx! 仅供参考…我提供了通过电子邮件提供的数据模型的层次结构和关系链接(多个)的详细地图。由原海报决定是否#039;这是他想公开的事情'在那之前,我必须在保密方面犯错。
页:
[1]
2