1. 程式人生 > >使用wblockCloneObjects從後臺讀取dwg文件復制實體到當前數據庫

使用wblockCloneObjects從後臺讀取dwg文件復制實體到當前數據庫

nstat space %s 重定義 first lock read start ssl

AcDbDatabase *pNewDb=new AcDbDatabase(Adesk::kFalse);        
        if (pNewDb == NULL)
        {
            return;
        }
        Acad::ErrorStatus es= pNewDb->readDwgFile(_T("D:\\123.dwg"));
        if (Acad::eOk != es || NULL == pNewDb)
        {
            acutPrintf(_T("\n打開dwg文件失敗,錯誤碼:%s
"),acadErrorStatusText(es)); return; } AcDbObjectIdArray objIdArray; AcDbBlockTable *pBlkTbl=NULL; es= pNewDb->getBlockTable(pBlkTbl,AcDb::kForRead); if (Acad::eOk != es || NULL == pBlkTbl) { acutPrintf(_T("\n獲取源數據庫塊表失敗,錯誤碼:%s
"),acadErrorStatusText(es)); delete pNewDb; pNewDb=NULL; return; } AcDbBlockTableRecord *pMsBlkRcd=NULL; es= pBlkTbl->getAt(ACDB_MODEL_SPACE,pMsBlkRcd,AcDb::kForRead); pBlkTbl->close(); if (Acad::eOk != es || NULL == pMsBlkRcd) { acutPrintf(_T(
"\n獲取源數據庫模型空間塊表記錄失敗,錯誤碼:%s"),acadErrorStatusText(es)); delete pNewDb; pNewDb=NULL; return; } //遍歷源數據庫模型空間塊記錄中的實體 AcDbBlockTableRecordIterator *pIter=NULL; pMsBlkRcd->newIterator(pIter); pMsBlkRcd->close(); AcDbObjectId objId; for (pIter->start();!pIter->done();pIter->step()) { pIter->getEntityId(objId); objIdArray.append(objId); } delete pIter; //檢查objectId if (objIdArray.isEmpty()) { acutPrintf(_T("\n克隆失敗,源數據庫的模型空間沒有實體!")); delete pNewDb; pNewDb=NULL; return; } AcDbIdMapping idMap; AcDbDatabase *pDb= acdbHostApplicationServices()->workingDatabase(); //獲取當前數據庫的空間ID AcDbObjectId mSpaceId= pDb->currentSpaceId(); //寫塊克隆 忽略重定義模式 es = pNewDb->wblockCloneObjects(objIdArray,mSpaceId,idMap,AcDb::kDrcIgnore); if (Acad::eOk != es) { acutPrintf(_T("\ndeepCloneObjects失敗錯誤碼:%s"),acadErrorStatusText(es)); delete pNewDb; pNewDb=NULL; return; } //刪除臨時數據庫 delete pNewDb; pNewDb=NULL; AcDbIdPair IdPair; AcDbObjectIdArray arrID2; //獲取克隆後的和原id匹配的對象的objectid,克隆idmap是全部的id映射,包括一些附帶的數據 for (int i=0;i<objIdArray.length();i++) { IdPair.setKey(objIdArray[i]); if (idMap.compute(IdPair)) { arrID2.append(IdPair.value()); } } if (!arrID2.isEmpty()) { acutPrintf(_T("\n復制:%d個對象成功!"),arrID2.length()); } #define Randmod(x) rand()%x //亮顯選擇集 ads_name ss,ent; acedSSAdd(NULL,NULL,ss); for (int i=0;i<arrID2.length();i++) { AcDbEntityPointer pEnt(arrID2[i],AcDb::kForWrite); if (Acad::eOk == pEnt.openStatus()) { pEnt->setColorIndex(Randmod(11)); } acdbGetAdsName(ent,arrID2[i]); acedSSAdd(ent,ss,ss); } Adesk::Int32 nLength; acedSSLength(ss,&nLength); if (nLength>0) { acedSSSetFirst(ss,NULL); } //acedCommand(RTSTR,_T("_.select"),RTPICKS,ss,RTSTR,_T(""),RTNONE); acedSSFree(ss);

使用wblockCloneObjects從後臺讀取dwg文件復制實體到當前數據庫