샘플 코드
/*
objIds : 블럭이 explode되고나서 생성되는 entity의 object id들
pBlkRef : block reference
bErase : 블럭을 지울것인가 말것인가?
*/
bool explodeBlockReference(AcDbObjectIdArray& objIds,AcDbBlockReference *pBlkRef,const bool bErase)
{
assert(pBlkRef && "pBlkRef is NULL");
bool bRet=false;
if(pBlkRef)
{
CString rLayer=pBlkRef->layer();
AcDbVoidPtrArray entitySet;
// explode the block, this will return a load of pre-transfromed entities for our perusal
USES_OKEYS;
try
{
ARXOK(pBlkRef->explode(entitySet));
}
catch(const char* ex)
{
ARXERROR(ex); return bRet;
}
if(true == bErase) pBlkRef->erase();
pBlkRef->close();
AcDbDatabase *pDb=acdbHostApplicationServices()->workingDatabase();
AcDbBlockTable *pBT;
pDb->getSymbolTable(pBT, AcDb::kForRead);
AcDbBlockTableRecord *pBTR;
pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);
pBT->close();
// loop round getting each entity
for (long i=0l; i<entitySet.length(); i++)
{
// get a pointer to the entity object
AcDbEntity *pNewEnt = (AcDbEntity *)entitySet.at (i); // if you don't add it to the database, clean it up
pBTR->appendAcDbEntity(pNewEnt);
pNewEnt->setLayer(rLayer);
pNewEnt->setColorIndex(256);
objIds.append(pNewEnt->objectId());
pNewEnt->close();
}
pBTR->close();
bRet = true;
}
else acutPrintf("Selected entity is not an INSERT.");
return bRet;
}
댓글
댓글 쓰기