找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1433|回复: 1

[公告] [ARX 程序]:长事务处理一例,摘自某书示例

[复制链接]
发表于 2002-1-27 22:24:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  1. #include <rxregsvc.h>
  2. #include <aced.h>

  3. #include <dbidmap.h>
  4. #include <lngtrans.h>
  5. #include <dbltrans.h>

  6. #include <dbmain.h>
  7. #include <dbsymtb.h>
  8. #include <dbents.h>
  9. #include <dbapserv.h>
  10. #include <adslib.h>

  11. void
  12. refEdit()
  13. {

  14.     AcDbObjectId transId;
  15.     AcDbDatabase* pDb;
  16.     char *fname;
  17.     struct resbuf *rb;

  18.     rb = acutNewRb(RTSTR);
  19.     int stat = acedGetFileD("Pick a drawing", NULL, "dwg", 0, rb);
  20.    
  21.     if ((stat != RTNORM) || (rb == NULL))
  22.         {
  23.         acutPrintf("\nYou must pick a drawing file.");
  24.         return;
  25.     }

  26.     fname = (char*)acad_malloc(strlen(rb->resval.rstring) + 1);
  27.     strcpy(fname, rb->resval.rstring);
  28.     acutRelRb(rb);
  29.    
  30.     pDb = new AcDbDatabase(Adesk::kFalse);
  31.     if (pDb->readDwgFile(fname) != Acad::eOk)
  32.         {
  33.         acutPrintf("\nSorry, that draing is probably already open.");
  34.         return;
  35.     }

  36.     AcDbBlockTable *pBlockTable;
  37.     pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
  38.     AcDbBlockTableRecord *pOtherMsBtr;
  39.     pBlockTable->getAt(ACDB_MODEL_SPACE, pOtherMsBtr, AcDb::kForRead);
  40.     pBlockTable->close();

  41.     AcDbBlockTableRecordIterator *pIter;
  42.     pOtherMsBtr->newIterator(pIter);

  43.     AcDbObjectIdArray objIdArray;

  44.     for (pIter->start(); !pIter->done(); pIter->step()) {
  45.         AcDbEntity *pEntity;
  46.         pIter->getEntity(pEntity, AcDb::kForRead);

  47.         if (pEntity->isKindOf(AcDbCircle::desc())) {
  48.             objIdArray.append(pEntity->objectId());
  49.         }
  50.         pEntity->close();
  51.     }
  52.     delete pIter;
  53.     pOtherMsBtr->close();

  54.     if (objIdArray.isEmpty()) {
  55.         acad_free(fname);
  56.         acutPrintf("\nYou must pick a drawing file that contains circles.");
  57.         return;
  58.     }

  59.     AcDbBlockTable *pThisBlockTable;
  60.     acdbHostApplicationServices()->workingDatabase()
  61.         ->getSymbolTable(pThisBlockTable, AcDb::kForRead);

  62.     AcDbBlockTableRecord *pThisMsBtr;
  63.     pThisBlockTable->getAt(ACDB_MODEL_SPACE, pThisMsBtr, AcDb::kForWrite);
  64.     pThisBlockTable->close();
  65.    
  66.     AcDbObjectId id = pThisMsBtr->objectId();
  67.     pThisMsBtr->close();


  68.     AcDbIdMapping errorMap;
  69.     acapLongTransactionManagerPtr()->checkOut(transId, objIdArray, id, errorMap);

  70.     int colorIndex;
  71.         double radius;
  72.     acedGetInt("\nEnter color number to circles center line: ", &colorIndex);
  73.         acedGetReal("\nEnter circle radius: ",&radius);
  74.         if (radius<=0)
  75.         {
  76.                 acutPrintf("\nError:Radius can't less than 0!");
  77.                 return;
  78.         }
  79.     AcDbObject* pObj;
  80.     if (acdbOpenObject(pObj, transId, AcDb::kForRead) == Acad::eOk)
  81.         {

  82.         AcDbLongTransaction* pLongTrans = AcDbLongTransaction::cast(pObj);
  83.         if (pLongTrans != NULL)
  84.                 {

  85.             AcDbLongTransWorkSetIterator* pWorkSetIter;
  86.             pLongTrans->newWorkSetIterator(pWorkSetIter);

  87.             for (pWorkSetIter->start(); !pWorkSetIter->done(); pWorkSetIter->step())
  88.                         {
  89.                 AcDbEntity *pEntity;
  90.                 acdbOpenAcDbEntity(pEntity, pWorkSetIter->objectId(), AcDb::kForWrite);
  91.                             pEntity->setColorIndex(colorIndex);
  92.                                 ((AcDbCircle*)pEntity)->setRadius(radius);
  93.                 pEntity->close();
  94.             }
  95.             delete pWorkSetIter;
  96.         }
  97.         pObj->close();
  98.     }

  99.     char str[132];
  100.     acedGetString(0, "\nSee the new colors and radius. Press return to back", str);

  101.     acapLongTransactionManagerPtr()->checkIn(transId, errorMap);

  102.     pDb->saveAs(fname);

  103.     delete pDb;
  104.     pDb = NULL;

  105.     acad_free(fname);
  106. }

  107. void
  108. initApp()
  109. {

  110.     acedRegCmds->addCommand("EXAM04A",
  111.                 "LONGTRANS",
  112.                 "LONGTRANS",
  113.                 ACRX_CMD_MODAL,
  114.                 refEdit);

  115. }


  116. void unloadApp()
  117. {
  118.     acedRegCmds->removeGroup("EXAM04A");

  119. }

  120. extern "C" AcRx::AppRetCode
  121. acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
  122. {
  123.     switch (msg) {
  124.     case AcRx::kInitAppMsg:
  125.         acrxDynamicLinker->unlockApplication(appId);
  126.         acrxDynamicLinker->registerAppMDIAware(appId);
  127.         initApp();
  128.         break;
  129.     case AcRx::kUnloadAppMsg:
  130.         unloadApp();
  131.         break;
  132.     case AcRx::kLoadDwgMsg:

  133.         break;
  134.     case AcRx::kUnloadDwgMsg:

  135.         break;
  136.     case AcRx::kInvkSubrMsg:

  137.         break;
  138.     default:
  139.         ;
  140.     }
  141.     return AcRx::kRetOK;
  142. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2018-2-25 18:55:44 | 显示全部楼层
啥是长事物,干什么用的,谁能解释下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-8 07:18 , Processed in 0.241217 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表