zoukankan      html  css  js  c++  java
  • 长事务实例

      1 static void lzxARX_AcDbDatabaseRefEdit(void)
      2     {
      3         AcDbObjectId transId;
      4         AcDbDatabase* pDb;
      5         ACHAR* fname;
      6         struct resbuf* rb;
      7 
      8         //提示让用户选择一个图形文件
      9         rb = acutNewRb(RTSTR);
     10         int stat = acedGetFileD(L"Pick a drawing",NULL,L"dwg",0,rb);
     11 
     12         //如果用户选择有误,则提示用户,退出命令
     13         if ((stat != RTNORM) || (rb == NULL))
     14         {
     15             acutPrintf(L"\nYou must pick a drawing file.");
     16             return;
     17         }
     18 
     19         //将获得的文件名转换成字符串
     20         fname = (TCHAR*)acad_malloc(_tcslen(rb->resval.rstring)+1);
     21         _tcscpy(fname, rb->resval.rstring);
     22         acutRelRb(rb);
     23 
     24         //打开前面选中的图形文件
     25         pDb = new AcDbDatabase(Adesk::kFalse);
     26 
     27         //如果打开失败或用户已经打开了些图形
     28         if (pDb->readDwgFile(fname)!= Acad::eOk)
     29         {
     30             acutPrintf(L"\nSorry, that draing is probably already open.");
     31             return;
     32         }
     33 
     34         //获得这个图形文件数据库的块表
     35         AcDbBlockTable* pBlockTable;
     36         pDb->getSymbolTable(pBlockTable,AcDb::kForRead);
     37 
     38         //获得模型空间块表记录
     39         AcDbBlockTableRecord* pOtherMsBtr;
     40         pBlockTable->getAt(ACDB_MODEL_SPACE,pOtherMsBtr,AcDb::kForRead);
     41         pBlockTable->close();
     42 
     43         //创建一个遍历器
     44         AcDbBlockTableRecordIterator* pIter;
     45         pOtherMsBtr->newIterator(pIter);
     46 
     47         //创建一个对象ID数组
     48         AcDbObjectIdArray objIdArray;
     49 
     50         //对模型空间块表记录进行遍历
     51         for (pIter->start();!pIter->done();pIter->step())
     52         {
     53             //获得实体
     54             AcDbEntity* pEntity;
     55             pIter->getEntity(pEntity,AcDb::kForRead);
     56 
     57             //对实体类型进行断送
     58             //如果实体是圆,则将实体的对象ID添加到数组中
     59             if (pEntity->isKindOf(AcDbCircle::desc()))
     60             {
     61                 objIdArray.append(pEntity->objectId());
     62             }
     63 
     64             //关闭实体
     65             pEntity->close();
     66         }
     67         delete pIter;
     68         pOtherMsBtr->close();
     69 
     70         //如果图形中没有圆对象,则释放文件名,返回
     71         if (objIdArray.isEmpty())
     72         {
     73             acad_free(fname);
     74             acutPrintf(L"\nYou must pick a drawing file that contains Circles.");
     75             return;
     76         }
     77 
     78         //现在获得当前数据库和当前数据库的块表
     79         AcDbBlockTable* pThisBlockTable;
     80         acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pThisBlockTable,AcDb::kForRead);
     81 
     82         //获得当前数据库的模型空间块表记录
     83         AcDbBlockTableRecord* pThisMsBtr;
     84         pThisBlockTable->getAt(ACDB_MODEL_SPACE,pThisMsBtr,AcDb::kForWrite);
     85         pThisBlockTable->close();
     86 
     87         //获得当前数据库模型空间记录的对象ID
     88         AcDbObjectId id = pThisMsBtr->objectId();
     89         pThisMsBtr->close();
     90 
     91         //创建长事务,这将从外部数据库中获得外部对象
     92         AcDbIdMapping errorMap;
     93         acapLongTransactionManagerPtr()->checkOut(transId,objIdArray,id,errorMap);
     94 
     95         //下面修改这些对象的颜色和半径
     96         int colorIndex;
     97         double radius;
     98         acedGetInt(L"\nEnter color number to change entityes to:",&colorIndex);
     99         acedGetReal(L"\nEnter circle radius:",&radius);
    100 
    101         //如果半径小于或等于0,则返回
    102         if (radius<=0)
    103         {
    104             acutPrintf(L"\nError:Radius can't less than 0!");
    105             return;
    106         }
    107 
    108         AcDbObject* pObj;
    109 
    110         //打开对象成功
    111         if(acdbOpenObject(pObj,transId,AcDb::kForRead) == Acad::eOk)
    112         {
    113             //获得事务的指针
    114             AcDbLongTransaction* pLongTrans = AcDbLongTransaction::cast(pObj);
    115             if (pLongTrans != NULL)
    116             {
    117                 //获得工作集遍历器
    118                 AcDbLongTransWorkSetIterator* pWorkSetIter;
    119                 pLongTrans->newWorkSetIterator(pWorkSetIter);
    120 
    121                 //对工作集中实体进行遍历,改变实体颜色和半径
    122                 for (pWorkSetIter->start();!pWorkSetIter->done();pWorkSetIter->step())
    123                 {
    124                     AcDbEntity* pEntity;
    125                     acdbOpenAcDbEntity(pEntity,pWorkSetIter->objectId(),AcDb::kForWrite);
    126 
    127                     //改变实体颜色和半径然后关闭对象
    128                     pEntity->setColorIndex(colorIndex);
    129                     ((AcDbCircle*)pEntity)->setRadius(radius);
    130                     pEntity->close();
    131                 }
    132                 delete pWorkSetIter;
    133             }
    134             pObj->close();
    135         }
    136 
    137         //暂停使用户能看见这种变化
    138         ACHAR str[50];
    139         acedGetString(0,L"\nSee the new colors and radius. Press retrn to back",str);
    140 
    141         //将实体放回原数据库
    142         acapLongTransactionManagerPtr()->checkIn(transId, errorMap);
    143 
    144         //保存原数据库
    145         pDb->saveAs(fname);
    146 
    147         //关闭数据库然后删除些对象
    148         delete pDb;
    149         pDb = NULL;
    150 
    151         //释放文件名
    152         acad_free(fname);
    153     }
  • 相关阅读:
    javascript数组查重方法总结
    html5的web存储
    掌握javascript中的最基础数据结构-----数组
    ES解决geoip的location不为geo_point格式
    elk默认分片只有1000导致索引没有创建
    Polysh批量管理服务器
    Git永久删除文件和历史记录
    windows下设置JupyterNotebook默认目录
    windwos安装RabbitMQ
    win7计划任务报该任务映像己损坏或己篡改
  • 原文地址:https://www.cnblogs.com/lzx838/p/2664957.html
Copyright © 2011-2022 走看看