乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 87|回复: 4

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

[复制链接]

3

主题

14

帖子

2

银币

初来乍到

Rank: 1

铜币
26
发表于 2010-10-27 17:40:00 | 显示全部楼层 |阅读模式
如题,如何在当前“模型空间” 或者一个“块”中,按照指定的点插入别图图块,我用了以下的方法,请大家看看是否有什么不妥,是不是还有别的方法。

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

使用道具 举报

0

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
3
发表于 2010-11-8 12:09:00 | 显示全部楼层
无需临时数据库复制代码
回复

使用道具 举报

3

主题

14

帖子

2

银币

初来乍到

Rank: 1

铜币
26
发表于 2010-11-26 18:54:00 | 显示全部楼层
好像你的这个方法把原图形中的所有块都会复制到目标图形中去
回复

使用道具 举报

7

主题

43

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
71
发表于 2010-12-8 16:01:00 | 显示全部楼层
2楼的兄弟没有理解LZ的意思,你的方式是把别图的整个数据库作为当前图的一个快参照进行插入了。
回复

使用道具 举报

0

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2020-2-22 18:45:00 | 显示全部楼层
研究学习  感谢楼主
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 05:31 , Processed in 0.146680 second(s), 62 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表