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;