天天看點

wblockCloneObjects從塊定義寫塊到外部檔案wblockCloneObjects從塊定義寫塊到外部檔案簡單例子

wblockCloneObjects從塊定義寫塊到外部檔案簡單例子

AcDbObjectIdArray objIds;
        ads_name ent;
        ads_point pt;
        if (RTNORM != acedEntSel(_T("\n選擇一個塊參照對象:"),ent,pt))
        {
            acutPrintf(_T("\n未選擇有效對象!"));
            return;
        }
        AcDbObjectId objId;
        acdbGetObjectId(objId,ent);
        AcDbObjectPointer<AcDbBlockReference> pBlkRef(objId,AcDb::kForRead);
        if (Acad::eOk != pBlkRef.openStatus())
        {
            acutPrintf(_T("\n未選擇塊參照對象!"));
            return;
        }
        AcDbObjectId blkId=pBlkRef->blockTableRecord();
        AcDbBlockTableRecordPointer pBlkDef(blkId,AcDb::kForRead);
        if (Acad::eOk != pBlkDef.openStatus())
        {
            acutPrintf(_T("\n打開塊定義對象失敗!"));
            return;
        }                
        AcDbBlockTableRecordIterator *pNewItor=NULL;
        pBlkDef->newIterator(pNewItor);
        if (pNewItor==NULL)
        {
            acutPrintf(_T("\n建立塊定義周遊器失敗!"));
            return;
        }        
        for (pNewItor->start();!pNewItor->done();pNewItor->step())
        {
            AcDbObjectId entId;
            pNewItor->getEntityId(entId);
            objIds.append(entId);
            //将擴充字典改為硬擁有,否則寫塊出去後會丢失
            AcDbEntity *pEnt=NULL;
            Acad::ErrorStatus es = pNewItor->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 pNewItor;
        if (objIds.length()<1)
        {
            acutPrintf(_T("\n塊定義中沒有實體對象!"));
            return;
        }
        AcDbDatabase *pNewDb=new AcDbDatabase();
        if (pNewDb==NULL)
        {
            acutPrintf(_T("\n建立新資料庫對象失敗!"));
            return;
        }
        AcDbObjectId msId=pNewDb->currentSpaceId();
        AcDbIdMapping idMap;
        //擷取對象id的原始資料庫指針
        AcDbDatabase *pOriginalDatabase=objIds.at(0).originalDatabase();
        //恢複到外部參照符号狀态
        pOriginalDatabase->restoreOriginalXrefSymbols();
        //寫塊克隆
        Acad::ErrorStatus es=pOriginalDatabase->wblockCloneObjects(objIds,msId,idMap,AcDb::kDrcIgnore);    
        //恢複外部參照符号之前的狀态
        pOriginalDatabase->restoreForwardingXrefSymbols();
        if(Acad::eOk == es)
        {
            acutPrintf(_T("\n克隆成功!"));
        }
        else
        {
            acutPrintf(_T("\n克隆出錯,錯誤碼%s"),acadErrorStatusText(es));
        }        
        pNewDb->saveAs(_T("d:\\myclone.dwg"));
        delete pNewDb;
        pNewDb=NULL;
 
           

繼續閱讀