我想看一级黄色大片_久久亚洲国产精品一区二区_久久精品免视看国产明星_91久久青青青国产免费

您的位置:網站首頁 > CAD教程 > 常見問題

用arx 如何讓 cad關閉文檔時,不提示保存。

時間:2010-11-01 10:04:41 來源:未知

最近,有一個這樣的需求,所以把解決方法給貼出來一下。
首先,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了。