CAD事务操作

Posted zeqi1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAD事务操作相关的知识,希望对你有一定的参考价值。

cad事务机制


实体的操作方式

​ 对于cad的实体而言,一般有两种操作方式。一种是open/close方式,一种是通过事务的方式。


open/close方式

假定现在需要选中一个实体,并把它改为红色

ads_name en;
ads_point pnt;
acedEntSel(_T("\\n选择需要改为红色的实体:"), en, pnt);
AcDbObjectId id;
acdbGetObjectId(id, en);
AcDbEntity* pEnt = NULL;
//open
if (Acad::eOk != acdbOpenObject(pEnt, id, Acad::kForWrite))
    return;
pEnt->setColorIndex(1);
//close
pEnt->close();

使用open/close模式操作对象的时候,需要指定对象的打开模式read,write,notify三种之一。那么如果当你读打开一个实体,但是你却修改它的属性,比如setColorIndex,那么就会崩溃。当然,也可以用upgradeOpen升级打开模式为写也可以。但是这却比较麻烦。有两方面的原因:
第一:再写代码的过程中,如果有很多判断条件,比如需要知道是否是直线,线形是不是DASH,图层是不是COLU,可能你在做一次判断过后,如果不符合修改,那么有可能直接return了,就会容易close对象。**这会导致cad异常!!!**当然,你也可以使用智能指针处理,这样也不用管理close。

​ 第二:读,写打开是有限制的

- 打开模式-说明
AcDb::kForRead读模式打开。一个对象最多可以同时被读模式打开256次,此时不能再以读或者通知模式打开
AcDb::kForWrite写模式打开。如果已经打开了,再次打开会失败。同一时间只允许一次写打开
AcDb::kFroNotify通知模式打开。当对象已经被读或者写打开时,可以通知模式打开

对于多对象操作

下面要选择修改多个实体的颜色

ads_name enset;
if (RTNORM != acedSSGet(_T("p"), NULL, NULL, NULL, sset))
	return;
AcDbObjectIdArray idArray = CPubliction::GetObjectIds(enset);
acedSSFree(enset);
for (int i = 0; i < idArray.length(); i++)

    AcDbEntity* pEntity = NULL;
    //write open
    acdbOpenObject(...);
    if (NULL != pEntity)
        pEntity->setColorIndex(1);
    pEntity->close();

在这个代码中有一个问题,如果在循环中出现了问题,比如已经读打开了,或者已经写打开了,或者出现其他问题。那么代码会在CAD中直接崩溃,如果不崩溃,可能出现问题就是,每一个实体改色是有先后顺序的,如果我想undo回去,那么会发生什么情况?是不是需要按很多次才能还原?于是,针对多个实体操作,事务变成了很好的方法。

事务操作

事务操作的意思是:通过程序,对多个对象的多步操作集合成一个操作,如果事务操作成功,那么所有对象都成功。如果操作终止,那么取消对所有对象的操作,即使开头的几个对象已经setColorIndex了。

ads_name sset;
if (RTNORM != acedSSGet(_T("p"), NULL, NULL, NULL, sset))
    return;
//开始事务
actrTransactionManager->startTransaction();
long length;
acedSSLength(sset, &length);
ads_name en;
AcDbObjectId id;
AcDbEntity* pEnt = NULL;
for (long i = 0; i < length; i++)

    acedSSName(sset, i, en);
    acdbGetObjectId(id, en);
    //通过事务获取数据库对象
    actrTransactionManager->getObject((AcDbObject*&)pEnt, id, AcDb::kForWrite);
    pEnt->setColorIndex(1);

//提交事务
actrTransactionManager->endTransaction();
acedSSFree(sset);

对事务的研究,可以去查看帮助文档。事务的好处在于,中断了不会影响数据库现有对象将多个操作合并成一个操作

以上是关于CAD事务操作的主要内容,如果未能解决你的问题,请参考以下文章

推荐net开发cad入门阅读代码片段

片段事务中的实例化错误

BottomNavigationView 滞后于片段事务

理解片段事务期间片段的生命周期方法调用

提交带有全屏片段的片段事务

使用 OnItemClickListener 列出视图片段到片段事务