找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2876|回复: 25

[求助] 模态对话框下读写用户字典,CAD直接崩溃,请教如何解决

[复制链接]

已领礼包: 112个

财富等级: 日进斗金

发表于 2016-10-12 21:55:31 | 显示全部楼层 |阅读模式

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

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

×
void CGridDlgQCReport::OnBnClickedOk()
{
        // TODO: 在此添加控件通知处理程序代码
        //隐藏对话框把控制权交给AutoCAD
        BeginEditorCommand();
        CString strtmp=_T("1;2;3;4;5;");
        CCreatEnt::addNameDict(_T("YJ"),_T("YM"),strtmp);
        //结束控制权
        CancelEditorCommand();
}

在模态对话框下,只要一点击确定,CAD就直接崩溃,而在acrxEntryPoint.cpp定义的命令,却不会崩溃
static void YTMsupportPutMyData(void)
        {
                CString strtmp=_T("1;2;3;4;5;");
                CCreatEnt::addNameDict(_T("YJ"),_T("YM"),strtmp);               
        }

原本以为是CAD没有操作数据库的控制权,添加了BeginEditorCommand()之后还是不行,请教如何解决此问题?

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

已领礼包: 859个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-10-12 22:12:48 | 显示全部楼层
关闭对话框,然后在执行词典的写试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-10-13 08:45:56 | 显示全部楼层

void CGridDlgQCReport::OnBnClickedOk()
{
        // TODO: 在此添加控件通知处理程序代码
        //隐藏对话框把控制权交给AutoCAD       
        BeginEditorCommand();
        //将当前文档锁定,
        acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite,NULL,NULL,true);
        CString strtmp=_T("1;2;3;4;5;");
        CCreatEnt::addNameDict(_T("YJ"),_T("YM"),strtmp);
        //文档解锁
        acDocManager->unlockDocument(acDocManager->curDocument());
        //结束控制权
        CancelEditorCommand();
}
添加文档锁定与解锁,还是一样的崩溃
       


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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-10-13 08:47:09 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-10-13 08:55:08 | 显示全部楼层

你认为隐藏了,可不一定是真的把控制权交给CAD了,所以让你关闭对话框运行下一步代码看看是否正常。

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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-10-13 09:11:13 | 显示全部楼层

直接写在onclose中
void CGridDlgQCReport::OnClose()
{
        CAcUiDialog::OnClose();
        CString strtmp=_T("1;2;3;4;5;");
        CCreatEnt::addNameDict(_T("YJ"),_T("YM"),strtmp);
}

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-10-13 09:30:05 | 显示全部楼层

你的代码:

  1. void CGridDlgQCReport::OnBnClickedOk()
  2. {
  3.         // TODO: 在此添加控件通知处理程序代码
  4.         //隐藏对话框把控制权交给AutoCAD        
  5.         BeginEditorCommand();
  6.         //将当前文档锁定,
  7.         acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite,NULL,NULL,true);
  8.         CString strtmp=_T("1;2;3;4;5;");
  9.         CCreatEnt::addNameDict(_T("YJ"),_T("YM"),strtmp);
  10.         //文档解锁
  11.         acDocManager->unlockDocument(acDocManager->curDocument());
  12.         //结束控制权
  13.         CancelEditorCommand();
  14. }
复制代码


AcAdErrorStatus es = acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite,NULL,NULL,true);
看下 es 返回值是什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2016-10-13 09:31:21 来自手机 | 显示全部楼层
注释掉adddict如果不出错,那就检查adddict函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2016-10-13 10:08:32 | 显示全部楼层

确保你的对话框派生于CAdUiBaseDialog, 然后调用 CAdUiBaseDialog::BeginEditorCommand() 开始用户交互,交互后调用CAdUiBaseDialog::CompleteEditorCommand() 或者 CAdUiBaseDialog::CancelEditorCommand().
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-10-13 10:41:49 | 显示全部楼层

注释掉不会出错,
//向图形数据库添加一个有名字典并添加记录
void CCreatEnt::addNameDict(CString appName,CString recName,CString data)
{
        //得到命名对象词典指针
        AcDbDictionary *pNamedobj, *pDict;
        acdbHostApplicationServices()->workingDatabase()
                ->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);
        // 检查是否已有关键字为“设计信息”的词典,如没有,则创建
        if (pNamedobj->getAt(appName, (AcDbObject*&) pDict,AcDb::kForWrite) == Acad::eKeyNotFound)
        {
                pDict = new AcDbDictionary;
                AcDbObjectId DictId;
                pNamedobj->setAt(appName, pDict, DictId);
        }
        pNamedobj->close();
        //创建AcDbXrecord对象,并添加到扩展词典
        AcDbXrecord *pXrec = new AcDbXrecord;
        AcDbObjectId xrecObjId;
        pDict->setAt(recName, pXrec, xrecObjId);
        pDict->close();
        //为AcDbXrecord对象创建resbuf链表
        struct resbuf *pHead;
        pHead = acutBuildList(AcDb::kDxfText, data,0);
        // 为AcDbXrecord对象设置链表
        pXrec->setFromRbChain(*pHead);
        acutRelRb(pHead);
        pXrec->close();
}
//从图形数据库获取一个有名字典并获取记录
void CCreatEnt::getNameDict(CString appName,CString recName,CString& data)
{
        AcDbDictionary *pNamedobj;
        acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead);
        //得到关键字为"设计信息"的词典
        AcDbDictionary *pDict;
        if(pNamedobj->getAt(appName, (AcDbObject*&)pDict,AcDb::kForRead)== Acad::eKeyNotFound)
        {
                acutPrintf(_T("\n未找到用户字典!"));
                return;
        }
        pNamedobj->close();
        //得到关键字为"设计者"的AcDbXrecord对象
        AcDbXrecord *pXrec;
        if(pDict->getAt(recName, (AcDbObject*&) pXrec,AcDb::kForRead)== Acad::eKeyNotFound)
        {
                acutPrintf(_T("\n未找到指定记录!"));
                return;
        }
        pDict->close();
        struct resbuf *pRbList;
        pXrec->rbChain(&pRbList);
        pXrec->close();
        //返回的结果缓存的处理参考示例工程
        //vector<CString> secret;
        //acutPrintf(_T("\n%s"),pRbList->resval.rstring);
        //vecStr.push_back(pRbList->resval.rstring);
        if(pRbList!=NULL)
        {
                data=pRbList->resval.rstring;
        }
        else
        {
                acutPrintf(_T("\n未找到用户字典!"));
        }
        acutRelRb(pRbList);
}


这两个函数是读写用户字典的函数,目前问题应该集中在这两个函数上。
//隐藏对话框把控制权交给AutoCAD       
        BeginEditorCommand();
        //焦点给acad主窗体
        AfxGetMainWnd()->SetFocus();

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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-10-13 10:43:31 | 显示全部楼层

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-10-13 11:09:12 | 显示全部楼层

acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite,NULL,NULL,true); 看下这个的返回值是什么,代码里面关键的地方要判断下返回值,满足在执行你下面的代码。

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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-10-13 12:46:51 | 显示全部楼层

addline是正常的,如果注释掉添加字典,程序也是正常的,目前能定位到是添加到字典出错了,但同样的添加字典的代码,通过注册一个CAD命令的方式调用(无对话框的情况下),是正常读写字典的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-10-13 13:03:46 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-18 13:53 , Processed in 0.491185 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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