ObjectARX_事务

作者: admin 分类: C++,CAD,ObjectARX 发布时间: 2022-01-14 18:15

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

 

标签云