设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 51|回复: 6

[求助] saveAs()保存问题

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 7 天前 | 显示全部楼层 |阅读模式

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

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

x
我的程序流程是这样的:
1.创建自定义实体(就是一个多段线)
2.将该实体保存到另一个文件中(已将当前文档锁定)
2.1 新建数据库,使用readDwgFile函数获取其他文件的数据库
2.2 获取块表,块表记录,将实体加到块表记录上
2.3 关闭各内容后,使用saveAs()保存,参数就是该文件路径

之前绘制自定义实体不太多的时候是没有问题的,但现在在绘制一个自定义实体较多的图案时,看运行时文件的大小,是先增长然后突然变小,再增长,再变小没有规律(例如20k到35k然后变成16k,)。调试时发现文件变小是在执行saveAs()之后发生的。打开绘制的dwg果然只绘制了一点点内容,最诡异的是调试时使用ErrorStatus观察每一步的返回值都是eOk,请问这是怎么回事,有人遇到过吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

点击这里给我发消息

已领礼包: 145个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 6 天前 | 显示全部楼层
本帖最后由 rwss009 于 2020-8-4 14:40 编辑
XDSoft 发表于 2020-7-31 09:43
有代码才好分析

其实真的代码意义不大。。因为就是正常的操作,es调试也都是eOK,只是到了saveAs那里,该绘制的实体没绘制,反而把之前绘制的全部清空了。。我贴一下代码
[C++] 纯文本查看 复制代码
AcDbObjectId PostToModelSpace( AcDbEntity *pEnt, CString cstr)
{
        assert(pEnt);

        AcDbDatabase *pDb = new AcDbDatabase(false,true);
        // cstr为文件路径
        Acad::ErrorStatus es = pDb->readDwgFile(cstr, _SH_DENYRW);
                
        // 获得块表
        AcDbBlockTable *pBlkTbl = NULL;
        es = pDb->getSymbolTable(pBlkTbl,AcDb::kForRead);
                
        // 获得模型空间对应的块表记录
        AcDbBlockTableRecord *pBlkTblRcd = NULL;
        es = pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForWrite);
        if(es != Acad::eOk)
        {
                pBlkTbl->close();
                delete pEnt;
                pEnt = NULL;
                return AcDbObjectId::kNull;
        }

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

        // 关闭模型空间块表记录和实体
        pBlkTbl->close();
        pBlkTblRcd->close();
        pEnt->close();

        // 关闭后才可保存
        es = pDb->saveAs(cstr); // 这里有时执行完文件变小

        delete pDb;
        return entId;
}


调用该函数时的操作
[C++] 纯文本查看 复制代码
custEnt *pCustEnt = new custEnt(); //此处新建了一个自定义实体
// 锁定文档acDocManager->lockDocument(acDocManager->curDocument());

PostToModelSpace(pCustEnt ,cstr_file); //传入该实体和路径

// 解锁文档
acDocManager->unlockDocument(acDocManager->curDocument());



如图所示,现在发现绘制前12个自定义实体是没有出错了,等到绘制第13个的时候,本该在图1的基础上再绘制图2所示内容(就那个“电”字左上方的方块),但实际没有绘制反而把图1绘制的东西全清除掉了。
通过调试,准备绘制第13个实体时,我遍历了readDwgFile获取到的cad数据库,里面存在的实体数量是正确的。一直在saveAs()前,es都是eOk,甚至saveAs()也是返回eOk的。。这里到底是因为什么导致了之前绘制的都被清除掉了。







图1

图1

图2

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

使用道具 举报

点击这里给我发消息

已领礼包: 145个

财富等级: 日进斗金

发表于 6 天前 | 显示全部楼层
没弹出报错窗口什么的吗?


AcDbDatabase *pDb = new AcDbDatabase(false,true);

把上面的改

AcDbDatabase *pDb = new AcDbDatabase(true);

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 3 天前 | 显示全部楼层
XDSoft 发表于 2020-7-31 15:56
没弹出报错窗口什么的吗?

一直没弹出任何报错窗口。。
按照你的办法,改了之后出现下面的情况:
运行时自动打开的那个cad那里,一拖动界面那个坐标轴会一直重复出现,拖的多了,就在saveAs的定义那里出现了异常。
14t.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 3 天前 | 显示全部楼层
XDSoft 发表于 2020-7-31 15:56
没弹出报错窗口什么的吗?

如果不乱动那个界面的话,是不会报异常的,但最终绘制完后,打开那个文件里面也还是不完整的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 3 天前 | 显示全部楼层
XDSoft 发表于 2020-7-31 15:56
没弹出报错窗口什么的吗?

大佬有个发现,就是如果我不新建数据库然后readDwgFile的话,是可以完全绘制在当前数据库中的。但读取文件后绘制再保存就不行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-8-6 06:33 , Processed in 0.155309 second(s), 38 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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