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事务操作的主要内容,如果未能解决你的问题,请参考以下文章