我的代码是这样的:(源数据里要拷贝的实体里有视口)
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;
}
这段代码在我这是好的呀。。。可以拷贝过去,哪里有问题?代码执行完就直接Crash?你代码写得不错,但有两个地方注意一下es=pBlkRcdItr->getEntityId(entId);
if(es!=Acad::eOk)
{
return es;////////////////////这里不要return, 设置状态Break,要么就要删迭代器,就是你的pBlkRecItr;
}
另一处是AcDbLayout *pLayout=acdbHostApplicationServices()->layoutManager()->findLayoutNamed(LayoutName);
这里直接没判断pLayout==NULL,直接用,我机器是英文版,需要用“Layout1“才能得到。刚开始我是这里Crash。
你调试了吧?哪里Crash应该看得出吧,你这段代码写得不错的,呵呵! 本帖最后由 jyaki 于 2011-5-9 01:20 编辑
夸奖了,我只是个业余爱好者,所以对调试是一窍不通啊,呵呵
补充一下,我的开发环境是ARX2007+VS2005
我这边是代码执行完后,没有直接carsh,而是打开“布局1”的时候,在里面的任何操作都会导致crash,比如重画。
具体问题出在哪边我也不清楚,我把1.dwg布局1里的视口都删掉了,这样拷贝就没问题,然后再重新添加了一个视口,拷贝也没问题,就是不知道原来的视口拷贝为什么就是有问题。附件就是我出问题的1.dwg文件。
页:
1
[2]