- 积分
- 1320
- 明经币
- 个
- 注册时间
- 2005-3-7
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
最近问外部块的人很多, 解决一下..
问题: 把已有的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); //建立空白临时数据库 AcDbDatabase* pCurDb; // 当前图纸数据库
AcDbBlockTable* pBlkTable; // 当前图纸的block table AcDbBlockTableRecord* pModelSpace; // 当前图纸的model space AcDbBlockReference* pBlkRef = new AcDbBlockReference;// 预备加入当前图纸的块参考
AcDbObjectId blkRecordId;// 预备加入当前图纸的块记录(从外部DWG文件制作)ID
pCurDb = acdbHostApplicationServices()->workingDatabase(); // 取得当前图纸数据库
pSourceDb->readDwgFile(<filename>); // 读取外部文件 pCurDb->insert(blkRecordId, <block name>, pSourceDb); // 将外部文件以块记录的方式插入当前图纸数据库, <block name>为自定义块名, 当前数据库将在自己的block table中自动建立新的块记录, 记录名为<block name>, 并将外部文件数据库中的所有实体加入块记录 delete pSourceDb;// 释放无用的指针
//这里前后可以考虑加上文件锁定. 不过我的测试结果是如果保证只对active document进行操作, 不加文件锁定也可以正常运行.
pBlkRef->setBlockTableRecord(blkRecordId); // 将块参考设为引用刚刚从外部文件加入当前数据库的块记录
// 插入点, base point, scale factor, rotation等等请各位酌情处理..
pCurDb->getSymbolTable(pBlkTable, AcDb::kForRead); // 取得当前块表 pBlkTable->getAt(ACDB_MODEL_SPACE, pModelSpace, AcDb::kForWrite);//取得当前model space块记录 pModelSpace->appendAcDbEntity(pBlkRef);// 将块参考加入model space
pBlkRef->close(); pModelSpace->close(); pBlkTable->close(); // 打扫工作 |
|