如何处理AutoCAD中的序列化和句柄

时间:2015-08-18 10:13:44

标签: c# handle autocad objectarx

我想在xml文件和(其属性)中序列化块引用句柄。所以我在初始化时存储了这个值:

blockReference.ObjectId.Handle.Value; // decimal value = 10658

但是当我在AutoCAD中选择blockReference时,句柄已经改变。

private void database_ObjectModified(object sender, ObjectEventArgs e)
{
    long currentId = e.DBObject.ObjectId.Handle.Value;  // Now it's 10659 !!!!

    ...
}

我是否正确使用手柄?

2 个答案:

答案 0 :(得分:3)

使用 theEntityObj.Handle.Value

如果从ObjectId得到if,则在关闭/打开图形时它会改变。

注意在某些情况下,句柄可能会发生变化,例如,如果你在一个程序段中有一个LINE,如果你对该块进行了BEDIT,则HANDLES会发生变化。

答案 1 :(得分:1)

当您在XML文件中使用句柄时,您需要通过其ObjectId获取.Handle,然后使用仅在当前会话中有效ObjectId 读/写对象。见http://through-the-interface.typepad.com/through_the_interface/2007/02/getting_access_.html

在SDK文档(托管接口CHM文件)中查找Database.GetObjectId()方法。简而言之......

public ObjectId GetObjectId(
[MarshalAs(UnmanagedType.U1)] bool createIfNotFound, 
Handle objHandle, 
int identifier
);
  • [MarshalAs(UnmanagedType.U1)] bool createIfNotFound输入布尔值,指示如果未找到输入句柄,则创建objectId存根
  • Handle objHandle输入包含传入的句柄的句柄对象
  • int identifier保留供将来使用