//==================================================================================================================== //功能:从源文件 插入一个块 到 目标文件中 //参数: //返回: //==================================================================================================================== AcDbObjectId CXXFile::InsertBlkDef(AcDbDatabase* pDb, CString SourceDwgFile, CString SourceBlockName, CString DestinationBlockName) { AcDbDatabase* pExternalDb; Acad::ErrorStatus es; //打开外部文件 pExternalDb = new AcDbDatabase(Adesk::kFalse); es = pExternalDb->readDwgFile(SourceDwgFile); if (es!=Acad::eOk) { delete pExternalDb; //return; } // 获得名称为Blk的块表记录 AcDbBlockTable* pBlkTbl; if (Acad::eOk != pExternalDb->getBlockTable(pBlkTbl, AcDb::kForRead)) { acedAlert( "获得块表失败!" ); //return; }
AcDbBlockTableRecord* pBlkTblRcd; es = pBlkTbl->getAt(SourceBlockName, pBlkTblRcd, AcDb::kForRead); pBlkTbl->close(); if (Acad::eOk != es) { acedAlert("获得指定的块表记录失败!"); //return; } // 创建块参照遍历器 AcDbBlockReferenceIdIterator *pItr; if (Acad::eOk != pBlkTblRcd->newBlockReferenceIdIterator(pItr)) { acedAlert("创建遍历器失败!"); pBlkTblRcd->close(); // return; } // 找到图形中的第一个复合要求的块参照,将其添加到ObjectId数组中 AcDbObjectIdArray list; // 导出到临时图形数据库的实体数组 for (pItr->start(); !pItr->done(); pItr->step()) { AcDbObjectId blkRefId; if (Acad::eOk == pItr->getBlockReferenceId(blkRefId)) { list.append(blkRefId); break; } } delete pItr;
pBlkTblRcd->close(); if (list.isEmpty()) { acedAlert("实体数组中未包含任何实体!"); // return; } AcDbDatabase *pTempDb;// 临时图形数据库 AcGePoint3d ptBase(0, 0, 0); // 将list数组中包含的实体输出到一个临时图形数据库中 if (Acad::eOk != pExternalDb->wblock(pTempDb, list, ptBase)) { acedAlert("wblock操作失败!"); //return; }
//////////////////////////////////////////////////////////////////////// // 将临时数据库的内容插入到当前图形数据库 if (Acad::eOk != pDb->insert(AcGeMatrix3d::kIdentity, pTempDb)) acedAlert("insert操作失败!"); delete pTempDb; // 如果不需要保留块参照,将模型空间中的最后一个对象删除即可 ads_name lastEnt; if (acdbEntLast(lastEnt) != RTNORM) { acedAlert("获得模型空间最后一个实体失败!"); //return; } AcDbObjectId entId; es = acdbGetObjectId(entId, lastEnt); AcDbEntity *pEnt; es = acdbOpenAcDbEntity(pEnt, entId, AcDb::kForWrite);
// pEnt->erase(); pEnt->close();
return entId;/**/ }
这段代码能实现从一个文件中 找到一个块 并且插入到 图形数据库pDb中, 但是不能实现在指定位置插入,请问该如何解决
|