如题,如何在当前“模型空间” 或者一个“块”中,按照指定的点插入别图图块,我用了以下的方法,请大家看看是否有什么不妥,是不是还有别的方法。
插入别图图块到当前数据库: 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; |