找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1577|回复: 1

[求助] 打开dwg文件问题【已用其他方法解决】

[复制链接]

已领礼包: 4个

财富等级: 恭喜发财

发表于 2020-7-16 17:14:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 rwss009 于 2020-7-23 09:13 编辑

继解决了块表记录问题后,我遇到了新的问题。。。
迫不得已,我还得在晓东CAD中寻求各位大佬的帮助!

言归正传,说明一下需求。我用arx代码操作打开dwg文件到cad中,这方面的代码很多,但基本都是创建一个命令后,在cad中输入命令,然后打开文件的。如下:
  1. static void myCmdOpenyy(void)
  2. {
  3.         // Add your code for command nmdsopenfile.openyy here
  4.         string str = "D:\\dwg_file\\any.dwg";
  5.         CString pData = str.c_str();

  6.         Acad::ErrorStatus es;
  7.         es = acDocManager->appContextOpenDocument(pData);        
  8. }

很简单的代码,就是为了加载arx文件后,输入命令openyy,在cad里打开名为any.dwg的文件。但此时会报错,es返回值为eNotApplicable,这时需要修改注册该命令的代码:

  1. ACED_ARXCOMMAND_ENTRY_AUTO(CopenfileApp, nmdsopenfile, openyy, openyy, ACRX_CMD_MODAL, NULL)

修改为:
  1. ACED_ARXCOMMAND_ENTRY_AUTO(CopenfileApp, nmdsopenfile, openyy, openyy, ACRX_CMD_SESSION, NULL)

也就是把ACRX_CMD_MODAL改为ACRX_CMD_SESSION。再一运行,any.dwg成功被打开。

但是!!!!!
我现在的程序,是不注册命令的,我程序是在加载arx时,新建一个线程,程序是在这个线程里运行的。而不注册命令,意味着我无法把上述参数修改为ACRX_CMD_SESSION。果然程序在运行时,执行到这里:
  1. Acad::ErrorStatus es = acDocManager->appContextOpenDocument(filepath);
  2. //filepath即为dwg文件路径加名称

es的返回值为eNotApplicable。
请教各位大佬,这里要怎么弄,才能把我的程序设置为如ACRX_CMD_SESSION这样,能在cad中打开dwg文件呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2020-7-23 09:10:38 | 显示全部楼层
本帖最后由 rwss009 于 2020-7-23 09:16 编辑

解决了,不过不再是打开文件的问题了。
改用了读取到外部文件的数据库后,对其操作,之前此方法前几步没有问题,但到了保存该数据库时报 eFileAccessErr 的错。后来发现需要将保存操作放置在关闭块表和块表记录等之后,才可以在保存到那dwg文件中。上代码:
  1. AcDbObjectId PostToModelSpace( AcDbEntity *pEnt, CString cstr)
  2. {
  3.         // pEnt为要添加的实体,cstr为文件路径加文件名
  4.         AcDbDatabase *pDb = new AcDbDatabase(false,true);
  5.         Acad::ErrorStatus es = pDb->readDwgFile(cstr, _SH_DENYNO);

  6.         // 设置外部dwg的数据库为当前数据库,原当前数据库备用,之后再设置回去,文档锁定已在函数外部添加
  7.         AcDbDatabase *pOldDb = acdbCurDwg();
  8.         acdbHostApplicationServices()->setWorkingDatabase(pDb);

  9.         // 获得块表
  10.         AcDbBlockTable *pBlkTbl = NULL;
  11.         es = pDb->getBlockTable(pBlkTbl,AcDb::kForRead);
  12.         
  13.         // 获得模型空间对应的块表记录
  14.         AcDbBlockTableRecord *pBlkTblRcd = NULL;
  15.         es = pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForWrite);
  16.         if(es != Acad::eOk)
  17.         {
  18.                 pBlkTbl->close();
  19.                 delete pEnt;
  20.                 pEnt = NULL;
  21.                 acutPrintf(_T("\n打开对象失败!,错误码: %s"),acadErrorStatusText(es));
  22.                 return AcDbObjectId::kNull;
  23.         }

  24.         // 将实体添加到模型空间的块表记录
  25.         AcDbObjectId entId = NULL;
  26.         es = pBlkTblRcd->appendAcDbEntity(entId, pEnt);
  27.         if (es != Acad::eOk)
  28.         {
  29.                 pBlkTblRcd->close();
  30.                 delete pEnt;        // 添加失败时,要delete
  31.                 pEnt = NULL;
  32.                 return AcDbObjectId::kNull;
  33.         }

  34.         // 原本在此处保存会报错
  35.         
  36.         // 关闭模型空间块表记录和实体
  37.         pBlkTbl->close();
  38.         pBlkTblRcd->close();
  39.         pEnt->close();

  40.         // 关闭后才可保存
  41.         acdbHostApplicationServices()->setWorkingDatabase(pOldDb);
  42.         es = pDb->saveAs(cstr);

  43.         delete pDb;

  44.         return entId;
  45. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-6-9 22:26 , Processed in 0.333128 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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