bluelightcsy 发表于 2011-5-7 16:21:32

不明白啊。。。光从你的描述没办法看出端倪

jyaki 发表于 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;
}

bluelightcsy 发表于 2011-5-8 19:07:40

这段代码在我这是好的呀。。。可以拷贝过去,哪里有问题?代码执行完就直接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:10:33

本帖最后由 jyaki 于 2011-5-9 01:20 编辑

夸奖了,我只是个业余爱好者,所以对调试是一窍不通啊,呵呵
补充一下,我的开发环境是ARX2007+VS2005
我这边是代码执行完后,没有直接carsh,而是打开“布局1”的时候,在里面的任何操作都会导致crash,比如重画。
具体问题出在哪边我也不清楚,我把1.dwg布局1里的视口都删掉了,这样拷贝就没问题,然后再重新添加了一个视口,拷贝也没问题,就是不知道原来的视口拷贝为什么就是有问题。附件就是我出问题的1.dwg文件。
页: 1 [2]
查看完整版本: [ARX]布局到布局的复制问题