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


        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);
            //將擴展字典改為硬擁有,否則寫塊出去后會丟失
            AcDbEntity *pEnt=NULL;
            es = pIter->getEntity(pEnt,AcDb::kForWrite);
            if (Acad::eOk == es)
            {
                AcDbObjectId dicId= pEnt->extensionDictionary();
                if (AcDbObjectId::kNull != dicId)
                {
                    AcDbObjectPointer<AcDbDictionary> pDic(dicId,AcDb::kForWrite);
                    if(Acad::eOk == pDic.openStatus())
                    {
                        pDic->setTreatElementsAsHard(Adesk::kTrue);
                        pDic->close();
                    }
                }
                pEnt->close();
            }
        }
        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);
//                 if (pEnt->isKindOf(AcDbDimension::desc()))
//                 {
//                     AcDbDimension *pDim=AcDbDimension::cast(pEnt);
//                     pDim->recomputeDimBlock();
//                 }
                pEnt->recordGraphicsModified();
                pEnt->close();
            }                    
        }
        Adesk::Int32 nLength;
        acedSSLength(ss,&nLength);        
        if (nLength>0)
        {
            acedSSSetFirst(ss,NULL);
        }
        //acedCommand(RTSTR,_T("_.select"),RTPICKS,ss,RTSTR,_T(""),RTNONE);        
        acedSSFree(ss);
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM