明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3279|回复: 4

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

  [复制链接]
发表于 2010-10-27 17:40 | 显示全部楼层 |阅读模式

如题,如何在当前“模型空间” 或者一个“块”中,按照指定的点插入别图图块,我用了以下的方法,请大家看看是否有什么不妥,是不是还有别的方法。

 

插入别图图块到当前数据库:
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;

发表于 2010-11-8 12:09 | 显示全部楼层
无需临时数据库
  1.          Acad::ErrorStatus err;
  2.         const ACHAR *PathName = _T("E:\\12345.dwg");
  3.         const ACHAR *BlockName = _T("aaa");   
  4.         AcDbDatabase * pExDb = new AcDbDatabase(Adesk::kFalse);
  5.         AcDbDatabase * pCurDb = acdbHostApplicationServices()->workingDatabase();        
  6.         AcDbObjectId BlockId;
  7.         
  8.         pExDb ->readDwgFile(PathName);
  9.         err = pCurDb ->insert(BlockId, BlockName, NULL,pExDb);   
  10.         delete pExDb;
  11.         if (err != Acad::eOk)    //克隆失败,退出
  12.             return;
  13.         
  14.         
  15.         AcDbBlockTable * pBlockTable;
  16.         err = pCurDb    -> getSymbolTable(pBlockTable,AcDb::kForRead);
  17.         pBlockTable ->getAt(BlockName, BlockId);
  18.         AcDbBlockReference *pBlockRef = new AcDbBlockReference;
  19.         
  20.         pBlockRef ->setBlockTableRecord(BlockId);
  21.         pBlockRef ->setPosition(AcGePoint3d(500, 20, 0));
  22.         pBlockRef ->setRotation(2*atan(1.0));
  23.         
  24.         AcDbBlockTableRecord * pBlock;
  25.         err = pBlockTable -> getAt(ACDB_MODEL_SPACE,pBlock,AcDb::kForWrite);
  26.         pBlockTable -> close();
  27.         if (err != Acad::eOk)
  28.         {        
  29.             delete pBlockRef;
  30.             return;
  31.         }        
  32.         err = pBlock -> appendAcDbEntity(pBlockRef);
  33.         pBlockRef ->close();
  34.         pBlock -> close();
  35.    
复制代码
 楼主| 发表于 2010-11-26 18:54 | 显示全部楼层

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

发表于 2010-12-8 16:01 | 显示全部楼层
2楼的兄弟没有理解LZ的意思,你的方式是把别图的整个数据库作为当前图的一个快参照进行插入了。
发表于 2020-2-22 18:45 | 显示全部楼层
研究学习  感谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-21 23:45 , Processed in 0.413428 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表