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);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值