CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2024 开发者帮助

使用 ObjectIds (.NET)

2024-5-18 19:13| 发布者: admin| 查看: 15| 评论: 0|原作者: admin|来自: AutoCAD

使用 ObjectIds (.NET)

数据库中包含的每个对象都分配了几个唯一的 ID。访问对象的独特方式包括:

  • 实体句柄
  • 对象 Id
  • 实例指针

访问对象的最常见方法是通过其 ObjectId。如果项目同时使用 COM 互操作和托管的 AutoCAD .NET API,ObjectId 可以很好地工作。如果创建自定义 AutoLISP 函数,则可能需要使用实体句柄。

手柄在AutoCAD任务之间是持久的,因此,如果需要将图形信息导出到外部文件(以后可能需要使用该文件来更新图形),则手柄是访问对象的最佳方式。数据库中对象的 ObjectId 仅在数据库加载到内存中时存在。关闭数据库后,分配给对象的 ObjectId 将不再存在,并且下次打开数据库时可能会有所不同。

获取 ObjectId

在处理对象时,需要先获取 ObjectId,然后才能打开对象进行查询或编辑。打开图形文件时,将 ObjectId 分配给数据库中的现有对象,并在首次创建新对象时为其分配 ObjectId。通常通过以下方式获取数据库中现有对象的 ObjectId:

  • 使用对象的成员属性,例如检索当前图层的对象 IDDatabaseClayer
  • 迭代符号表,例如图层符号表

打开对象

获取对象 ID 后,该函数用于打开分配了给定对象 ID 的对象。可以在以下模式之一中打开对象:GetObject

  • 阅读。打开要读取的对象。
  • 。如果对象尚未打开,则打开该对象进行写入。
  • 通知。当对象关闭、打开读取或打开写入时,打开该对象以进行通知,但当对象已打开以进行通知时,则不打开该对象。此模式适用于对象可能从其自身代码中修改自身的情况,例如在定义 AutoCAD Managed .NET API 不支持的自定义对象时使用。

您应以最适合访问对象的情况的模式打开对象。由于创建撤消记录,打开对象进行写入会引入比可能需要的额外开销。如果不确定要打开的对象是否是要使用的对象,则应打开它进行读取,然后将对象从读取模式升级为写入模式。有关升级对象的详细信息,请参阅“升级和降级打开的对象 (.NET)”。

和 函数都返回一个对象。使用某些编程语言时,您需要根据值分配给的变量来强制转换返回的值。如果您使用的是 VB.NET,则无需担心强制转换返回值,因为它已为您完成。GetObjectOpen

使用动态运行时语言 (DLR) 时,无需担心打开对象进行读取或写入。对象的打开是透明的,在不使用事务的情况下提交对对象所做的更改的过程也是如此。

以下示例演示如何获取当前数据库的 for Layer Zero。LayerTableRecord

VB.NET

以下示例在不再需要事务后手动释放事务。

Dim acCurDb As Document = Application.DocumentManager.MdiActiveDocument.Database
Dim acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
 
Dim acLyrTblRec As LayerTableRecord
acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero, OpenMode.ForRead)
 
acTrans.Dispose()

下面的示例使用该语句在不再需要事务后释放该事务。该语句是首选的编码样式。UsingUsing

Dim acCurDb As Document = Application.DocumentManager.MdiActiveDocument.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
    Dim acLyrTblRec As LayerTableRecord
    acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero, OpenMode.ForRead)
End Using

C#

以下示例在不再需要事务后手动释放事务。

Document acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
Transaction acTrans = acCurDb.TransactionManager.StartTransaction();
 
LayerTableRecord acLyrTblRec;
acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero,
                                OpenMode.ForRead) as LayerTableRecord;
 
acTrans.Dispose();

下面的示例使用该语句在不再需要事务后释放该事务。该语句是首选的编码样式。UsingUsing

Document acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
    LayerTableRecord acLyrTblRec;
    acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero,
                                    OpenMode.ForRead) as LayerTableRecord;
}

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-6-27 16:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部