pandoram 发表于 2005-5-12 10:53:00

外部块插入解决方案(2000版本)

最近问外部块的人很多, 解决一下..


问题: 把已有的DWG文件作为块插入当前图纸中. 假设块不含attribute.


环境: ARX2000, VC++6, ACAD2000.


思路: 将要插入的DWG文件作为一个block table记录加入当前图纸的数据库, 然后在当前图纸的Model Space(已存在的block table记录)里添加对这个DWG文件记录的块参考.


注意: 需加入dbents.h, dbmain.h, dbsymtb.h. 错误检查请各位自己酌情处理.


代码:


AcDbDatabase* pSourceDb = new AcDbDatabase(FALSE, FALSE); //建立空白临时数据库<BR>AcDbDatabase* pCurDb; // 当前图纸数据库


AcDbBlockTable* pBlkTable; // 当前图纸的block table<BR>AcDbBlockTableRecord* pModelSpace; // 当前图纸的model space<BR>AcDbBlockReference* pBlkRef = new AcDbBlockReference;// 预备加入当前图纸的块参考


AcDbObjectId blkRecordId;// 预备加入当前图纸的块记录(从外部DWG文件制作)ID


pCurDb = acdbHostApplicationServices()-&gt;workingDatabase(); // 取得当前图纸数据库


pSourceDb-&gt;readDwgFile(&lt;filename&gt;); // 读取外部文件<BR>pCurDb-&gt;insert(blkRecordId, &lt;block name&gt;, pSourceDb);<BR>// 将外部文件以块记录的方式插入当前图纸数据库, &lt;block name&gt;为自定义块名, 当前数据库将在自己的block table中自动建立新的块记录, 记录名为&lt;block name&gt;, 并将外部文件数据库中的所有实体加入块记录<BR>delete pSourceDb;// 释放无用的指针


//这里前后可以考虑加上文件锁定. 不过我的测试结果是如果保证只对active document进行操作, 不加文件锁定也可以正常运行.


pBlkRef-&gt;setBlockTableRecord(blkRecordId);<BR>// 将块参考设为引用刚刚从外部文件加入当前数据库的块记录


// 插入点, base point, scale factor, rotation等等请各位酌情处理..


pCurDb-&gt;getSymbolTable(pBlkTable, AcDb::kForRead); // 取得当前块表<BR>pBlkTable-&gt;getAt(ACDB_MODEL_SPACE, pModelSpace, AcDb::kForWrite);//取得当前model space块记录<BR>pModelSpace-&gt;appendAcDbEntity(pBlkRef);// 将块参考加入model space


pBlkRef-&gt;close();<BR>pModelSpace-&gt;close();<BR>pBlkTable-&gt;close();<BR>// 打扫工作

chenpool 发表于 2005-5-25 16:16:00

好详细啊~~


不知道你手上还有没有更好的冬冬啊,发几个我参考参考:)
页: [1]
查看完整版本: 外部块插入解决方案(2000版本)