CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

打开和关闭数据库对象

2023-1-1 05:17| 发布者: admin| 查看: 502| 评论: 0|来自: AutoCAD

每个对象都可以用三种不同的方式引用:AcDbObject

  • 通过它的手柄
  • 按其对象 ID
  • 通过C++实例指针

当 AutoCAD 未运行时,图形将存储在文件系统中。DWG 文件中包含的对象由其控点标识。

打开图形后,可通过对象访问图形信息。数据库中的每个对象都有一个对象 ID,该 ID 在当前编辑会话中一直存在,从创建到删除对象所在的会话。打开函数将对象 ID 作为参数,并返回指向对象的指针。此指针在对象关闭之前有效,如下图所示。AcDbDatabaseAcDbDatabaseAcDbObject

您可以使用全局函数打开对象。acdbOpenObject()

您可以使用函数将句柄映射到对象 ID。getAcDbObjectId()

您还可以打开一个对象,然后请求其句柄:

AcDbObject* pObject;
AcDbHandle handle;
pObject->getAcDbHandle(handle);
注意:每当打开数据库对象时,都应尽早将其关闭。可以使用函数关闭数据库对象。AcDbObject::close()

Anis 相当于 an。AcDb 库提供了两个独立的函数,允许您在 anand 和 之间进行转换:ads_nameAcDbObjectIdAcDbObjectIdads_name

// Returns an ads_name for a given object ID.
//
acdbGetAdsName(ads_name& objName,
               AcDbObjectId objId); 
// Returns an object ID for a given ads_name.
//
acdbGetObjectId(AcDbObjectId& objId,
                ads_name objName); 

通常,通过选择获取对象,并返回通知。然后你需要交换 阿并打开它。以下函数演示了此过程:ads_nameads_nameAcDbObjectId

AcDbEntity*
selectEntity(AcDbObjectId& eId, AcDb::OpenMode openMode)
{
    ads_name en;
    ads_point pt;
    acedEntSel("\nSelect an entity: ", en, pt);
    // Exchange the ads_name for an object ID.
    //
    acdbGetObjectId(eId, en);
    AcDbEntity * pEnt;
    acdbOpenObject(pEnt, eId, openMode);
    return pEnt;
}

您可以通过以下三种模式之一打开对象:

  • kForRead.一个对象最多可以打开供 256 个读取器读取,只要该对象尚未打开进行写入或通知。
  • kForWrite.如果对象尚未打开,则可以打开该对象进行写入。否则,打开将失败。
  • kForNotify.当对象关闭、打开以供读取或打开以进行写入时,可以打开对象以获取通知,但当对象已打开以进行通知时,则不能打开该对象以获取通知。有关需要打开对象进行通知并向其发送通知的信息,请参阅“通知应用程序”。

下表显示了当您尝试以不同模式打开对象并且该对象已打开时返回的错误代码。

以不同模式打开对象

     

对象已打开:

kForRead

kForWrite

kForNotify

打开阅读

电子阅读器

(如果读取计数 = 256;否则成功)

eWasOpenForRead

(成功)

打开用于写入

eWasOpenForWrite

eWasOpenForWrite

(成功)

打开通知

eWasOpenForNotify

eWasOpenForNotify

eWasOpenForNotify

正在通知

(成功)

eWas通知

eWas通知

撤消

eWasOpenForUndo

eWasOpenForUndo

(成功)

如果尝试打开对象进行写入并收到错误,则可以使用将打开状态升级为写入(如果只有一个对象的读取器)。然后,您将习惯将其状态降级为读取。同样,如果对象处于打开状态以进行通知(例如,当您收到通知时),并且您希望打开它进行写入,则可以将其打开状态升级为写入。然后,您将习惯降级其状态以通知。eWasOpenForReadupgradeOpen()downgradeOpen()upgradeFromNotify()downgradeToNotify()

有关如何管理打开和关闭对象的复杂序列的详细信息,请参阅“事务管理器”部分。


路过

雷人

握手

鲜花

鸡蛋

最新评论

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

GMT+8, 2024-5-19 14:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部