CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

使用 ObjectIds (.NET)

2023-1-1 15:22| 发布者: admin| 查看: 1272| 评论: 0|来自: AutoCAD

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

  • 实体句柄
  • 对象标识
  • 实例指针

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

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

获取对象标识

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

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

打开对象

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

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

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

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

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

以下示例演示如何获取当前数据库的 for 层零。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()

下面的示例使用 the语句在不再需要事务后释放事务。语句是首选的编码样式。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();

下面的示例使用 the语句在不再需要事务后释放事务。语句是首选的编码样式。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-5-19 15:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部