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

您的位置:網站首頁 > CAD新聞

發送命令給AutoCAD的方法,比如Cancel命令

時間:2010-01-12 10:35:49 來源:

閑來無事,突然想整理一下發送命令到AutoCAD的方法,在ARX的幫助里有最常見的兩個方法:

int acedCommand(int rtype, ... unnamed);

int acedCmd(const struct resbuf * rbp);

      這兩個函數處理命令的方式差不多,只不過一個通過鏈表來描述整個命令,一個通過不定參數來描述。

       1. acedCommand()[ads_command()]
       acedCommand()函數的參數是成對處理的。每對參數中的第一個表示參數的類型,第二個表示其實際的數據。參數表中的最后一個必須是單個參數,其值為0或RTNONE。每個表示參數類型的參數值必須為在adscodes.h文件中定義的結果類型碼中的一個(例如RTPOINT)。比如:acedCommand(RTSTR, "ZOOM", RTSTR, "W", RT3DPOINT, p11, RT3DPOINT, p21 ,0);這個命令執行后會根據p11和p21點所確定的窗口范圍縮放。注意p11和p21是ads_point類型。

      2. acedCmd()[ads_cmd()]
      注意此函數有一個resbuf指針類型的參數。該 resbuf 指針從何而來?它來自acutBuildList()函數。該函數的優點就是可以動態修改命令內容,不像acedCommand那樣命令是寫死的,但是缺點就是執行效率比acedCommand要差一些,同樣,對于上面那個功能,我們可以如下調用:

struct resbuf *cmdlist;

cmdlist = acutBuildList(RTSTR, "ZOOM", RTSTR, "W", RT3DPOINT, p11, RT3DPOINT, p21 ,0);

if (cmdlist == NULL) {

    acdbFail("Couldn't create listn");

    return BAD;

}

acedCmd(cmdlist);

acutRelRb(cmdlist);

執行效果是一樣的。

 

   其實還有其它方式來執行AutoCAD命令,下面介紹另外一種方法:

  // 發送命令給AutoCAD
void YgxAcadUtil::SendCommandToCAD(CString cmd)
{
    cmd.Format("%s", cmd);
    COPYDATASTRUCT cmdMsg;
    cmdMsg.dwData = (DWORD)1;
    cmdMsg.cbData = (DWORD)_tcslen(cmd) + 1;
    cmdMsg.lpData = cmd.GetBuffer(cmd.GetLength()+1)                   
    SendMessage(adsw_acadMainWnd(), WM_COPYDATA, (WPARAM)adsw_acadMainWnd(),
  (LPARAM)&cmdMsg);
}

這是我寫的一個函數,通過給AutoCAD發送消息,來執行一些命令。cmd這個字符串包含的內容和acedCommand中的內容差不多,比如像發送一個redraw命令,可以這樣調用:

SendCommandToCAD(_T("redraw "));

注意后面要帶一空格。

zoom e命令可以這樣:

SendCommandToCAD(_T("zoom e "));在zoom后面要有空格,e 后面也要有空格。

 

   這里還介紹一種發送命令的方法:

  acedPostCommand,由于這個函數Autodesk沒有公布,在使用之前,我們需要先申明一下:

extern Adesk::Boolean acedPostCommand(const char* );

然后,我們發送Cancel命令為例:

acedPostCommand("CANCELCMD");

嗯,確實非常簡單,呵呵!