ObjectARX_事务
https://blog.csdn.net/weixin_33933118/article/details/92346699
ObjectARX中对实体的操作一般有俩种方式,一种为open/close方式,另一种维通过事务的方式.
事务:通过程序对多个对象的多步操作集合成一个操作,如果事务操作成功,则对对象的操作成功,如果事务被中止,则取消对对象的操作,使用事务的好处是可以避免以上打开对象机制的限制.
#define actrTransactionManager acTransactionManagerPtr()
(1)AcDbTransactionManager::startTransaction:开始事务
startTransaction函数的定义形式为:
virtual AcTransaction* startTransaction() = 0;
返回值:成功返回一个AcTransaction对象实例,失败返回NULL.
(2)AcDbTransactionManager::endTransaction:结束事务,结束一个事务的同时提交一个事务事务中所作的修改生效.
endTransaction函数的定义形式为:
virtual Acad::ErrorStatus endTransaction() = 0;
(3)AcDbTransactionManager::abortTransaction:取消事务
abortTransaction函数的定义形式为:
virtual Acad::ErrorStatus abortTransaction() = 0;
(4)AcTransaction::getObject:获取所需的对象指针
getObject函数的定义形式为:
virtual Acad::ErrorStatus getObject( AcDbObject*& obj, AcDbObjectId objectId, AcDb::OpenMode mode, bool openErasedObject = false) = 0;
通过事务修改数据库的具体实例如下:
1. //获取选择集
2. ads_name sset;
3. int err = acedSSGet(_T("p"),NULL,NULL,NULL,sset);
4. if(err != RTNORM)
5. return;
6.
7. //开始事务
8. actrTransactionManager->startTransaction();
9. long length;
10.acedSSLength(sset,&length);
11.ads_name en;
12.AcDbObjectId eId;
13.AcDbEntity *pEnt = NULL;
14.for(long i = 0; i < length; i++)
15.{
16.acedSSName(sset,i,en);
17.//获取对象id
18.Acad::ErrorStatus es =acdbGetObjectId(eId, en);
19.//通过事务获取数据库对象
20.es = actrTransactionManager->getObject((AcDbObject*&)pEnt,eId,AcDb::kForWrite);
21.pEnt->setColorIndex(1);
22.}
23.
24.//提交事务
25.actrTransactionManager->endTransaction();
26.//释放选择集
27.acedSSFree(sset);
转载于:https://my.oschina.net/u/2930533/blog/2245846