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