明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2179|回复: 3

插入块问题求助?

[复制链接]
发表于 2010-7-8 22:41:00 | 显示全部楼层 |阅读模式

//====================================================================================================================
//功能:从源文件 插入一个块 到 目标文件中
//参数:
//返回:
//====================================================================================================================
AcDbObjectId CXXFile::InsertBlkDef(AcDbDatabase* pDb, CString SourceDwgFile, CString SourceBlockName, CString DestinationBlockName)
{
 AcDbDatabase* pExternalDb;
 Acad::ErrorStatus es;
 
 //打开外部文件
 pExternalDb = new AcDbDatabase(Adesk::kFalse);
 es = pExternalDb->readDwgFile(SourceDwgFile);
 if (es!=Acad::eOk)
 {
  delete pExternalDb;
  //return;
 }
 
 // 获得名称为Blk的块表记录
    AcDbBlockTable* pBlkTbl;
    if (Acad::eOk != pExternalDb->getBlockTable(pBlkTbl, AcDb::kForRead))
    {
        acedAlert( "获得块表失败!" );
  //return;
 }

    AcDbBlockTableRecord* pBlkTblRcd;
    es = pBlkTbl->getAt(SourceBlockName, pBlkTblRcd, AcDb::kForRead);
    pBlkTbl->close();
    if (Acad::eOk != es)
 {
        acedAlert("获得指定的块表记录失败!");
  //return;
    }
   
 // 创建块参照遍历器
 AcDbBlockReferenceIdIterator *pItr;
 if (Acad::eOk != pBlkTblRcd->newBlockReferenceIdIterator(pItr))
 {
  acedAlert("创建遍历器失败!");
        pBlkTblRcd->close();
  // return;
 }
 
 // 找到图形中的第一个复合要求的块参照,将其添加到ObjectId数组中
 AcDbObjectIdArray list;  // 导出到临时图形数据库的实体数组
 for (pItr->start(); !pItr->done(); pItr->step())
 {
  AcDbObjectId blkRefId;
  if (Acad::eOk == pItr->getBlockReferenceId(blkRefId))
  {
   list.append(blkRefId);
   break;
  }
 }
 delete pItr;

 pBlkTblRcd->close();
 
    if (list.isEmpty())
 {
        acedAlert("实体数组中未包含任何实体!");
       // return;
    }
 
    AcDbDatabase *pTempDb;// 临时图形数据库
 AcGePoint3d ptBase(0, 0, 0);
 // 将list数组中包含的实体输出到一个临时图形数据库中
    if (Acad::eOk != pExternalDb->wblock(pTempDb, list, ptBase))
    {
        acedAlert("wblock操作失败!");
        //return;
    }

 ////////////////////////////////////////////////////////////////////////
  // 将临时数据库的内容插入到当前图形数据库
 if (Acad::eOk != pDb->insert(AcGeMatrix3d::kIdentity, pTempDb))
       acedAlert("insert操作失败!");
 delete pTempDb;
   
 // 如果不需要保留块参照,将模型空间中的最后一个对象删除即可
 ads_name lastEnt;
 if (acdbEntLast(lastEnt) != RTNORM)
 {
  acedAlert("获得模型空间最后一个实体失败!");
  //return;
 }
 
 AcDbObjectId entId;
 es = acdbGetObjectId(entId, lastEnt);
 AcDbEntity *pEnt;
 es = acdbOpenAcDbEntity(pEnt, entId, AcDb::kForWrite);

 //
 pEnt->erase();
 pEnt->close();

 return entId;/**/
}

 

这段代码能实现从一个文件中 找到一个块 并且插入到 图形数据库pDb中, 但是不能实现在指定位置插入,请问该如何解决


发表于 2010-7-9 09:28:00 | 显示全部楼层
不能在指定位置呢,估计是坐标系的问题,你转到ucs下看看
 楼主| 发表于 2010-7-10 22:06:00 | 显示全部楼层

经张帆老师指点,问题解决,是insert(AcGeMatrix3d::kIdentity, pTempDb)) 的问题,设置矩阵变换

AcGeMatrix3d xform; 
 AcGeVector3d vec(ptDest.x - ptBase.x, ptDest.y - ptBase.y, 
  ptDest.z - ptBase.z);
 xform.setToTranslation(vec);

 

if (Acad::eOk != pDb->insert(xform, pTempDb))
       acedAlert("insert操作失败!");
 delete pTempDb;

发表于 2011-7-14 00:21:35 | 显示全部楼层
感谢,感谢啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 04:39 , Processed in 0.186182 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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