找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3323|回复: 10

[求助] 关于MFC和objectarx结合的打开.dwg文件问题

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2018-1-24 10:24:59 | 显示全部楼层 |阅读模式

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

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

×
在网上搜索到的打开固定位置的.dwg文件都是acDocManager->appContextOpenDocument(fname)这种方法,我使用的是acDocManager->appContextOpenDocument(L“C:\\mycad\\xx.DWG”)这种方式调用,但是在acrxEntryPoint文件直接写命令调用打不开文件,在MFC 的dialog.cpp对话框实现文件调用也是打不开文件,请问各位大哥这是什么问题导致的?

这是在对话框文件里的调用

这是在对话框文件里的调用

这是acrxEntryPoint里的调用,直接编写的cad的CCC命令调用

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

已领礼包: 40个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-1-24 12:02:47 | 显示全部楼层
本帖最后由 LoveArx 于 2018-1-24 12:04 编辑

不用MFC OPEN DWG 的代码。

[C++] 纯文本查看 复制代码
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#pragma region ATLCOM
  #include "acadi.h"      
  #include "acadi_i.c"
  #include <atlbase.h>
  #include <comutil.h>
#pragma endregion

#include "resource.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("")
//-----------------------------------------------------------------------------
//----- Object-A-RX EntryPoint
class COpenCloseApp : public AcRxArxApp {
public:
  COpenCloseApp() : AcRxArxApp() {}
  virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
    AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
    return (retCode);
  }
  virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
    AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
    return (retCode);
  }

  virtual void RegisterServerComponents() {}


  static void MyGroupOpenClose() {

    openDwg(AcString(_T("C:\\temp\\test.dwg")), false);

  }

  static void openDwg(AcString dwgName, bool savePrev)
  {
    CComQIPtr<IAcadApplication> pComApp(acedGetIDispatch(FALSE));
    HRESULT hr = 0;
    if (!pComApp)
      return;
    CComPtr<IAcadDocument> pDoc;
    hr = pComApp->get_ActiveDocument(&pDoc);
    if (FAILED(hr))
      return;
    BSTR fName;   hr = pDoc->get_FullName(&fName);
    _bstr_t dwgPrev(fName);

    if (SUCCEEDED(hr) && _wcsicmp(dwgPrev, dwgName) != 0)
    {
      _variant_t vb(savePrev ? VARIANT_TRUE : VARIANT_FALSE);
      _variant_t vnam(dwgPrev);
      hr = pDoc->Close(vb, vnam);
      if (FAILED(hr))
      {
        acutPrintf(L"\nFailed to close %s.", LPCTSTR(dwgPrev));
        return;
      }
      _bstr_t fileName(dwgName);

      CComPtr<IAcadDocuments> pDocs;
      hr = pComApp->get_Documents(&pDocs);
      if (FAILED(hr))
        return;

      _variant_t b(VARIANT_FALSE);
      _variant_t password("");

      CComPtr<IAcadDocument> pDoc;
      hr = pDocs->Open(fileName, b, password, &pDoc);
      if (FAILED(hr)) {
        AcString strErr; 
        strErr.format(L"\nFailed to open %s.", LPCTSTR(fileName));
        ::MessageBoxW(NULL, strErr, L"OpenFile error", MB_ICONERROR);
      }
    }
  }
};

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(COpenCloseApp)
ACED_ARXCOMMAND_ENTRY_AUTO(COpenCloseApp, MyGroup, OpenClose, OpenClose, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
#pragma region LIB
  #pragma comment(lib,"comsuppw.lib")
#pragma endregion
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-1-24 12:22:12 | 显示全部楼层
下面使用应用程序上下文的代码来自ADESK自己的例子

  1. //  NAME: openSyncDocHelper()        
  2. //
  3. //  REMARKS:  Simple callback function to be executed in the application context.
  4. //              Demonstrates opening a document synchronously to retain control
  5. //              in caller function
  6. //
  7. //              NOTEs: See explanation for inAppContext()
  8. //  RETURNS:
  9. //      void
  10. //
  11. void
  12. openSyncDocHelper( void *pData)
  13. {
  14.     AcApDocument* pDoc = acDocManager->curDocument();
  15.     if (acDocManager->isApplicationContext()) {
  16.         acutPrintf(_T("\nSucessfully Switched to App. Context\n"));
  17.         acDocManager->appContextOpenDocument((const TCHAR *)pData);
  18.         acutPrintf(_T("\nOpened a document synchronously:%s.\n"), (const TCHAR *)pData);
  19.     } else
  20.         acutPrintf(_T("\nERROR: in Document context : %s\n"),pDoc->fileName());

  21. }

  22. //  NAME: openSyncDoc()        
  23. //
  24. //  REMARKS:  Simple function which requests a OPEN to be executed via the application context.
  25. //
  26. //
  27. //              NOTEs: See explanation for inAppContext()
  28. //  RETURNS:
  29. //      void
  30. //
  31. void
  32. openSyncDoc()
  33. {
  34.     static TCHAR pData[] = _T(/*NOXLATE*/"test1.dwg");

  35.     AcApDocument* pDoc = acDocManager->curDocument();
  36.     if (pDoc) {
  37.         acutPrintf(_T("\nCurrently in Document context : %s, Switching to App.\n"),pDoc->fileName());
  38.         acDocManager->executeInApplicationContext(openSyncDocHelper, (void *)pData);
  39.     }   

  40. }




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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2018-1-24 16:02:54 | 显示全部楼层

没有错误码,就是能编译通过,但是在实际运行当中没有实现打开文件的功能,所以比较困惑
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2018-1-24 16:26:54 | 显示全部楼层

谢谢这位大哥的指点,您的ADESK例子我尝试过类似,我使用的代码如下void OpenDoc(void * pData);
void open1();
void Dialog1::OnBnClickedButton4()
{
        open1();
}

void OpenDoc(void * pData)
{
        AcApDocument* pDoc = acDocManager->curDocument();
        if (acDocManager->isApplicationContext())
        {
                acDocManager->appContextOpenDocument((const ACHAR *)pData);
        }
        else
        {
                acutPrintf(L"\nERROR To Open Doc!\n");
        }
}

void open1()
{
// 直接打开系统中存在的某个图形文件
        static char pData[] = "C:\\Users\\acer\\Desktop\\111\\3.dwg";
       acDocManager->executeInApplicationContext(OpenDoc, (void *)pData);
}



open按钮就是Button4,创建了点击响应,只调用了open1(),无响应

open按钮就是Button4,创建了点击响应,只调用了open1(),无响应

这是代码在程序中的使用,编译也通过的

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-1-24 16:56:38 | 显示全部楼层


编译成功,不代表运行正确。
Acad::ErrorStatus es = acDocManager->executeInApplicationContext(OpenDoc, (void *)pData);

你试试打印下 es 返回值是什么?


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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2018-1-25 12:53:29 | 显示全部楼层

对不起!最近在忙画图纸,没有及时回复您!我刚刚尝试了您的建议输出Acad::ErrorStatus的状态,作为一个arx刚上路的新手只能想到这么操作

switch判断es状态,输出信息

switch判断es状态,输出信息

调试出来的信息

调试出来的信息

您建议的锁定文档是这样操作吗? acDocManager->lockDocument(pDoc);

我是这么锁定了文档.

我是这么锁定了文档.

调试结果

调试结果


因为显示如下图的错误,编译无法通过,所以我采用的是Acad::ErrorStatus es = acDocManager->appContextOpenDocument(pData);这条语句,没有调用opendoc函数。至于显示es报错信息,我采用了最上方的switch判断,请问下有什么简便的es直接输出吗?

显示的错误

显示的错误



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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-1-25 13:08:49 | 显示全部楼层

acadErrorStatusText(es) ;

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 20:33 , Processed in 0.436553 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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