|
如题,如何在当前“模型空间” 或者一个“块”中,按照指定的点插入别图图块,我用了以下的方法,请大家看看是否有什么不妥,是不是还有别的方法。
插入别图图块到当前数据库:
1、创建一个新数据库:此时必须创建一个空的数据库。AcDbDatabase ExDb(Adesk::kFalse)或者以指针的型式创建一个
AcDbDatabase* pExDb=new AcDbDatabase(Adesk::kFalse)
2、使用 readDwgFile函数读取源文件:es=pExDb->readDwgFile(strSourceDwgFile);
3、取得数据库名为"BlockName"的块表与块表记录:
AcDbBlockTable *pBlockTable;
AcDbBlockTableRecord * pBlockTableRecord;
es=pExDb->getBlockTable(pBlockTable,AcDb::kForRead);
es=pBlockTable->getAt(BlockName,pBlockTableRecord,AcDb::kForRead);
pBlockTable->close();
4、创建一个保存实体ID的数组:AcDbObjectIdArray list;// 导出到临时图形数据库的实体数组
5、获得块表记录中的实体: 此时有两种方法
①:创建一个块表记录遍历器(块表中所有的实体):
AcDbBlockTableRecordIterator *pItr;
es=pBlkTblRcd->newIterator(pItr));
for (pItr->start(); !pItr->done(); pItr->step())
{
AcDbObjectId blkRefId;
if (Acad::eOk == pItr->getEntityId(blkRefId))
{
list.append(blkRefId);
/*break;*/
}
}
delete pItr;
pBlkTblRcd->close();
②:直接获取该块中的块参照实体id(块参照中所有实体,此时块名"BlockName"不能是模型空间):
es=pBlkTblRcd->getBlockReferenceIds(list, false,true);
pBlkTblRcd->close();
6、创建临时数据库,将list数组中包含的实体输出到一个临时图形数据库中:
AcDbDatabase *pTempDb;
es=pExDb->wblock( pTempDb, list, AcGePoint3d::kOrigin ));
#附加步骤:重新设置块的原点,转角,比例:
⑴:设置点坐标:
AcGePoint3d pt(500,200,0);
⑵:得到临时数据库的块表与块表记录:
pTempDb->getSymbolTable(pBlockTable,AcDb::kForRead);
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForRead);
pBlockTable->close();
⑶创建块表记录遍历器:
AcDbBlockTableRecordIterator* prcdit;
pBlockTable->newIterator(prcdit);
for (prcdit->start(); !prcdit->done(); prcdit->step())
{
AcDbEntity* penty;
AcDbBlockReference *pblkref;
prcdit->getEntity(penty,AcDb::kForWrite);
if (penty->isKindOf(AcDbBlockReference::desc()))
{
pblkref=(AcDbBlockReference*)penty;
pblkref->setPosition(pt);
pblkref->setRotation(2*atan(1.0));
penty->close();
break;
}
}
pBlockTable->close();
delete prcdit;
7、将临时数据库的内容插入到当前图形数据库:
es=acdbHostApplicationServices()->workingDatabase()
->insert(AcGeMatrix3d::kIdentity, pTempDb));
delete pTempDb;
delete pExDb;
|
|