| 
积分210明经币 个注册时间2011-5-2在线时间 小时威望 金钱 个贡献 激情  
 | 
 
 发表于 2011-5-7 21:59:26
|
显示全部楼层 
| 本帖最后由 jyaki 于 2011-5-7 22:01 编辑 
 我的代码是这样的:(源数据里要拷贝的实体里有视口)
 void hello()
 {
 //新建数据库
 AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
 pDb->readDwgFile(_T("c:\\1.dwg"));//读入指定的dwg
 AcDbBlockTable *pBlockTable;
 Acad::ErrorStatus es=pDb->getBlockTable(pBlockTable,AcDb::kForRead);
 AcDbBlockTableRecord *pModelSpaceRcd;
 es=pBlockTable->getAt(ACDB_PAPER_SPACE,pModelSpaceRcd,AcDb::kForWrite);
 pBlockTable->close();
 //得到新数据库的实体
 AcDbObjectIdArray entIdArray;
 GetAllEntity(entIdArray,pModelSpaceRcd);//得到指定块表记录里的所有实体
 pModelSpaceRcd->close();
 int num=entIdArray.length();
 acutPrintf(_T("\n共%d个实体"),num);
 
 //块表记录里没有实体则退出
 int i=0;
 if(num==0)
 {
 acutPrintf(_T("\n错误"));
 return;
 }
 for(i=0;i<num;i++)
 {
 es=cloneEntity(pDb,entIdArray.at(i),_T("布局1"));//拷贝实体到当前数据库的名为“布局1”的布局里
 if(es!=Acad::eOk)
 {
 acutPrintf(_T("\n实体拷贝错误"));
 delete pDb;
 return;
 }
 }
 
 delete pDb;
 }
 
 //拷贝一个实体到指定布局,拷到当前数据库
 Acad::ErrorStatus cloneEntity(AcDbDatabase *pSrcDb,AcDbObjectId srcId,const TCHAR * LayoutName)
 {
 //获取当前数据库名字为LayoutName的布局ID
 AcDbLayout *pLayout=acdbHostApplicationServices()->layoutManager()->findLayoutNamed(LayoutName);
 AcDbObjectId descSpaceId=pLayout->getBlockTableRecordId();
 pLayout->close();
 AcDbIdMapping IdMap;
 AcDbIdPair idPair;
 idPair.setKey(srcId);
 AcDbObjectIdArray idArray;
 idArray.append(srcId);
 pSrcDb->wblockCloneObjects(idArray, descSpaceId, IdMap, AcDb::kDrcIgnore);//拷贝实体
 return Acad::eOk;
 }
 
 //得到给定块表记录内的所有实体ID
 Acad::ErrorStatus GetAllEntity(AcDbObjectIdArray &entIdArray,//返回所有实体Id数值
 AcDbBlockTableRecord *pBlkTblRcd)//指定块表记录
 {
 //创建遍历器
 AcDbObjectId entId;//单个实体Id
 AcDbBlockTableRecordIterator *pBlkRcdItr;
 Acad::ErrorStatus es=pBlkTblRcd->newIterator(pBlkRcdItr);
 if(es!=Acad::eOk)
 {
 return es;
 }
 //遍历记录内实体
 for(pBlkRcdItr->start();!pBlkRcdItr->done();pBlkRcdItr->step())
 {
 es=pBlkRcdItr->getEntityId(entId);
 if(es!=Acad::eOk)
 {
 return es;
 }
 entIdArray.append(entId);
 }
 delete pBlkRcdItr;//删除遍历器对象
 
 return Acad::eOk;
 }
 
 | 
 |