CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2020 开发者帮助

打开和关闭数据库对象

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

打开和关闭数据库对象

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

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

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

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

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

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

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

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

an 等价于 .AcDb 库提供了两个独立的函数,允许您在 an 和 之间进行转换: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

打开ForRead的

eAtMax阅读器

(如果 readCount = 256;否则成功)

eWasOpenForRead

(成功)

打开ForWrite

eWasOpenForWrite

eWasOpenForWrite

(成功)

openedForNotify

eWasOpenForNotify

eWasOpenForNotify

eWasOpenForNotify

正在通知

(成功)

eWasNotifying(电子信息通知)

eWasNotifying(电子信息通知)

撤消

eWasOpenForUndo

eWasOpenForUndo

(成功)

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

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

父主题:

  1. 数据库对象

路过

雷人

握手

鲜花

鸡蛋

最新评论

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

GMT+8, 2024-6-27 15:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部