找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 472|回复: 5

[求助] 多文档打开的困惑

[复制链接]
发表于 2020-6-17 23:44:49 | 显示全部楼层 |阅读模式

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

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

×
void OpenDoc(void* pData)
{
AcApDocument* pDoc = acDocManager->curDocument();
Acad::ErrorStatus es;
if (acDocManager->isApplicationContext())
{
        es=acDocManager->appContextOpenDocument((ACHAR *)pData); //打开test7.dwg
       
        if(es!=Acad::eOk) {
                acutPrintf(L"\nError: %s\n",acadErrorStatusText(es));
                return;
        }
       

       
}

else
{
acutPrintf(L"\nERROR To Open Doc!\n");
}
}



void open_test()
{
ACHAR pData2[80]=L"test7.dwg";
acDocManager->executeInApplicationContext(OpenDoc, (void *)pData2);
//打开后,停在此句,test7.dwg 变为当前文档和活动文档
//只有drawing1 重新变为当前和活动文档,才会执行下面一句
AfxMessageBox(L"ok");
}


我有一个MDI程序,cad2008上运行良好,移植到cad2015上就不正常了,我简化成上面的代码。要的就是上面的效果。
即最先打开的图是drawing1, 运行程序打开另一张图test7.dwg,此时test7.dwg成为当前和活动文档,打开后就停留在test7.dwg文档上,并不会显示“ok”,只有重新切换到
drawing1(或者关闭test7.dwg),才会显示"ok",我的程序正是要达到这样的效果。


但移植到cad2015(objarx2015)后,程序的运行逻辑变了,打开test7.dwg后,无需切换到drawing1.dwg,就接着显示了“OK”,导致程序执行混乱

这是什么原因? 如何解决?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2020-6-19 21:28:40 | 显示全部楼层
一直到acad2014,acDocManager->executeInApplicationContext(OpenDoc, (void *)pData2),打开文件后都会挂起,直到重新切换到最先的图形。

但从acad2015 就不会停顿了,接着执行后面的代码。有没有什么办法在新版本上与原来一样?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-20 09:01:07 | 显示全部楼层
或者autocad 2015以上版本,有没有在Document context 下打开固定位置文件的方法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

发表于 2020-7-16 11:10:27 | 显示全部楼层
我想问下你这个函数是在命令中实现的吗?如果不在命令中实现,该如何设置ACRX_CMD_SESSION呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-8-30 20:44:20 | 显示全部楼层
acDocManager->openDocument();//新开视窗打开DWG 不切换 此函数不返回
说明这个函数CAD14以前的版本有消息循环,后来版本变了,你只能把打开文件 作为命令的最后一句。要停住是不可能了,除非知道CAD消息循环的代码。

改成 Acad::ErrorStatus es=pDb2->readDwgFile(tssdslab.textbuf,_SH_DENYNO); 试试

MFC消息        for (;;)
        {
                // phase1: check to see if we can do idle work
                while (bIdle &&
                        !::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))
                {
                        // call OnIdle while in bIdle state
                        if (!acedGetAcadWinApp()->OnIdle(lIdleCount++))
                                bIdle = FALSE; // assume "no idle" state
                }

                // phase2: pump messages while available
                do
                {
                        // pump message, but quit on WM_QUIT
                        acedGetAcadWinApp()->PumpMessage();

                        // reset "no idle" state after pumping "normal" message
                        //if (IsIdleMessage(&m_msgCur))
                        if (acedGetAcadWinApp()->IsIdleMessage(&(pState->m_msgCur)))
                        {
                                bIdle = TRUE;
                                lIdleCount = 0;
                        }

                } while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));
        }
循环代码,CAD自己的VIEW视窗不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-8-30 20:45:24 | 显示全部楼层
acDocManager->openDocument();//新开视窗打开DWG 不切换 此函数不返回
说明这个函数CAD14以前的版本有消息循环,后来版本变了,你只能把打开文件 作为命令的最后一句。要停住是不可能了,除非知道CAD消息循环的代码。

改成 Acad::ErrorStatus es=pDb2->readDwgFile(tssdslab.textbuf,_SH_DENYNO); 试试

MFC消息        for (;;)
        {
                // phase1: check to see if we can do idle work
                while (bIdle &&
                        !::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))
                {
                        // call OnIdle while in bIdle state
                        if (!acedGetAcadWinApp()->OnIdle(lIdleCount++))
                                bIdle = FALSE; // assume "no idle" state
                }

                // phase2: pump messages while available
                do
                {
                        // pump message, but quit on WM_QUIT
                        acedGetAcadWinApp()->PumpMessage();

                        // reset "no idle" state after pumping "normal" message
                        //if (IsIdleMessage(&m_msgCur))
                        if (acedGetAcadWinApp()->IsIdleMessage(&(pState->m_msgCur)))
                        {
                                bIdle = TRUE;
                                lIdleCount = 0;
                        }

                } while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));
        }
循环代码,CAD自己的VIEW视窗不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 16:58 , Processed in 0.179613 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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