bophy20010 发表于 2010-10-27 17:40:00

[讨论]按指定点插入外图图块

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

kingofrpg 发表于 2010-11-8 12:09:00

无需临时数据库
         Acad::ErrorStatus err;
      const ACHAR *PathName = _T("E:\\12345.dwg");
      const ACHAR *BlockName = _T("aaa");   

      AcDbDatabase * pExDb = new AcDbDatabase(Adesk::kFalse);
      AcDbDatabase * pCurDb = acdbHostApplicationServices()->workingDatabase();      

      AcDbObjectId BlockId;
      
      pExDb ->readDwgFile(PathName);
      err = pCurDb ->insert(BlockId, BlockName, NULL,pExDb);   
      delete pExDb;

      if (err != Acad::eOk)    //克隆失败,退出
            return;
      
      
      AcDbBlockTable * pBlockTable;
      err = pCurDb    -> getSymbolTable(pBlockTable,AcDb::kForRead);

      pBlockTable ->getAt(BlockName, BlockId);

      AcDbBlockReference *pBlockRef = new AcDbBlockReference;
      
      pBlockRef ->setBlockTableRecord(BlockId);
      pBlockRef ->setPosition(AcGePoint3d(500, 20, 0));
      pBlockRef ->setRotation(2*atan(1.0));
      
      AcDbBlockTableRecord * pBlock;
      err = pBlockTable -> getAt(ACDB_MODEL_SPACE,pBlock,AcDb::kForWrite);
      pBlockTable -> close();

      if (err != Acad::eOk)
      {      
            delete pBlockRef;
            return;
      }      

      err = pBlock -> appendAcDbEntity(pBlockRef);
      pBlockRef ->close();
      pBlock -> close();
   

bophy20010 发表于 2010-11-26 18:54:00

<p>好像你的这个方法把原图形中的所有块都会复制到目标图形中去</p>

th_gsb 发表于 2010-12-8 16:01:23

2楼的兄弟没有理解LZ的意思,你的方式是把别图的整个数据库作为当前图的一个快参照进行插入了。

w1152111688 发表于 2020-2-22 18:45:08

研究学习感谢楼主
页: [1]
查看完整版本: [讨论]按指定点插入外图图块