天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 9|回复: 0

用arx 如何让 cad关闭文档时,不提示保存。

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    最近,有一个这样的需求,所以把解决方法给贴出来一下。
    首先,cad判断图纸是否被修改过,是根据一个变量的值来判断的,这个变量就是 DBMOD,很多人肯定会想到,那我把这个变量的值给修改成0或者是-1不就行了吗? 很不幸告诉你,这个变量是只读的。那么怎么办呢? 幸好桌子公司还挺厚道的,导出了一个接口给我们来修改database的这个flag,只不过是在官方的sdk文档里没有给出来而已,这个接口的原型如下:

    //声明设置数据库模式的函数
    extern long acdbSetDbmod(AcDbDatabase * pDb, long newVal);

    这个函数在我以前的blog文章中也提到过,按照我上面的方法,声明一下,就可以使用这个接口来解决问题。

    好了,现在有解决问题的接口啊,那么设置的时机应该在什么时候? 我想说的是,一个是,在你所有的修改操作之后,还有一个就是关闭文档之前。

    明显的后面一个实现起来更现实,因为,我们知道,可以通过反应器这个东东来实现,我就是通过反应器来实现的,能过editor反应器来hook Quit命令和CLOSE命令 willstart的时候,来设置对应数据库的flag,这样就可以认cad不弹出提示保存的对话框了,代码如下:
    void AMenEditorReactor::commandWillStart(const ACHAR * cmdStr)
    {
    CString strCmd = cmdStr;
    strCmd.MakeUpper();
    if( !strCmd.CompareNoCase(_T("_CLOSE")) || !strCmd.CompareNoCase(_T("CLOSE")) )
    {
       const TCHAR* szBuffer = NULL;
       acdbCurDwg()->getFilename(szBuffer);
       CString strRemoteFile = AMenFileManager::GetInstance()->GetLocaleBindFile(szBuffer);
       if( !strRemoteFile.IsEmpty() )
       {
        struct resbuf res;
        acedGetVar(L"DBMOD",&res);
        if(res.resval.rint) // If changes have been made...
        {
         //清除保存位
         acdbSetDbmod(acdbCurDwg(),0);
        }
       }
    }
    else if( !strCmd.CompareNoCase(_T("_QUIT")) || !strCmd.CompareNoCase(_T("QUIT")) )
    {
       AcApDocumentIterator *pIt;
       pIt=acDocManager->newAcApDocumentIterator();
       while(!pIt->done())
       {
        // For each open document...
        AcApDocument* pDoc=pIt->document();
        acDocManager->setCurDocument(pDoc);
        struct resbuf res;
        acedGetVar(L"DBMOD",&res);
        if(res.resval.rint) // If changes have been made...
        {
         acDocManager->lockDocument(pDoc); // Lock
         acdbSetDbmod(pDoc->database(),0); // clear changes flag
         acDocManager->unlockDocument(pDoc);//unlock
        }
        pIt->step();
       }
       delete pIt;
    }

    AcEditorReactor::commandWillStart (cmdStr) ;
    }


    PS: 另外还有方法的,记得AcApDocment类有两个成员接口,pushDbmod和popDbmod。 看文档可以得知,pushDbmod接口是copy当前DBMOD变量的值放在DBMOD栈上,从而pushDbmod之后对database的修改,改变是将是你copy后的这个值,在编辑完毕后,你再把这个值给popDbmod,这样就可以做到系统修改的是一个临时值,而不是database的DBMOD,而当系统判断database是否被修改的时候,就会以database本身的DBMOD来判断,这样也就不会提示保存对话框了。所以,这个模型可以如下:

    修改前:pushDbmod
    修改ing
    修改后:popDbmod
    关闭:不提示
    0了。

     

     

     

     

    用arx 如何让 cad关闭文档时,不提示保存。
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:58 , Processed in 0.060207 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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