明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: pckite

[ARX]布局到布局的复制问题

  [复制链接]
发表于 2011-5-7 16:21:32 | 显示全部楼层
不明白啊。。。光从你的描述没办法看出端倪
发表于 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;
}
发表于 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应该看得出吧,你这段代码写得不错的,呵呵!
发表于 2011-5-9 01:10:33 | 显示全部楼层
本帖最后由 jyaki 于 2011-5-9 01:20 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 04:40 , Processed in 0.146969 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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