- 积分
- 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;
}
|
|