如题。

解决方案 »

  1.   

    一般的ACAD命令都可以用这个函数实现:
    acedCommand();
    比如:
    acedCommand(RTSTR, "-layer", RTSTR, "s",  RTSTR, "0", RTSTR, "", RTNONE);我认为你最好把对话框作为你整个ACAD开发的功能的一部分,也就是说,你使用ARXOBJECT向导生成了一个框架,然后你自己创建一个对话框类,添加到该框架当中,当在CAD环境下运行某一命令时,就会出现这个对话框.
    这种方法的优点就在于,即使是在对话框当中,你也可以使用ACAD提供的API函数和命令.
      

  2.   

    TO byry(pepsi) ﹕
    首先謝謝你的回答。
    恕我沒有把意思表達清楚﹐這裡我再詳述一下﹕
    我想讓對話框上的按鈕添加一個處理函數﹐該函數中調用了acedCommand(...)等ACAD命令﹐起初﹐我認為直接調用是沒問題的就寫了下面的類似語句﹕
    void OnClick_InsertBtn()
    {
    ...
    acedCommand(RTSTR,"_DDINSERT",0);
    ...
    }
    結果發現﹐插入圖塊的對話框並不出現﹐同樣的語句在其它命令(用OBJECTARX工具添加的)中調用卻沒有問題﹐向ACAD輸入/輸出窗口寫字符串也沒有效果。
    (對話框的創建如下)
    void BM()
    {
    CBMDlg* dlg=new CBMDlg;
    dlg->Create(IDD_DIALOG1);
    dlg->ShowWindow(SW_SHOW);
    }
    後來我把dlg作為了一個全局指針變量﹐在函數InitApplication()中將它創建﹐BM()僅作為顯示使用﹐但還是沒有效果﹐只是可以輸出字符串了﹐看來acedCommand(RTSTR,"_DDINSERT",0);這樣的語句是沒有找到地方和ACAD通信﹐你能告訴我如何解決嗎﹖
      

  3.   

    1\我试过了,用对话框可能进行CAD命令的传递,我认为应该是你的OnClick_InsertBtn()事件写的有问题吧,你是不是没有得到当前CAD控制台的句柄就开始发送acedCommand(RTSTR,"_DDINSERT",0);???2\你现在既然能把命令输入到控制台上,为什么这个命令不能执行呢?
      

  4.   

    To:byry(pepsi) :1。我確實沒有得到当前CAD控制台的句柄﹐也不知道如何去得到﹐你能給我一些示例代碼嗎﹖
    2。我沒有把命令輸入上去﹐而是輸出的字符串。
      

  5.   

    謝謝byry(pepsi) 的指點﹐問題已解決。
      

  6.   

    感谢byry(pepsi)的帮助,以下方案是在他的帮助下完成的,下列关键代码也是他写的,我只是稍微改了改,现在我总结一下,贴出来.
    程序的相关下载地址是:http://www.mjtd.com/bbs/viewFile.asp?Boardid=14&ID=6798,可以在http://www.mjtd.com/bbs/dispbbs.asp?boardID=14&ID=19696&page=1访问到.关于模式对话框按钮调用外部命令的总结:
    首先,我创建了一个新的ObjectArx工程"OuterCommandTest",在里面插入了一个对话框,其ID是"IDD_DIALOG1",并由此生成了一个新类"CTestDlg",由于此类要与资源"IDD_DIALOG1"联系,在文件"TestDlg.h"开头的地方还要加上"#include "resource.h""这句话.
    然后,在对话框中添加一个按钮"IDC_BUTTON1",并生成函数"void CTestDlg::OnButton1() ",在函数中添加调用CAD外部命令的语句,函数如下:
    void CTestDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    acedCommand(RTSTR,"_DDINSERT",0);// Call Cad Outer Command
    }
    然后,转到函数"void InitApplication()"所在的文件"outercommandtest.cpp"中,在开头部分改写如下:
    //HINSTANCE _hdllInstance =NULL ;//这句话取消,因为下面要做个新的
    再添加下面三句:
    HWND adsw_acadMainWnd();
    HINSTANCE _hdllInstance;
    extern "C" BOOL APIENTRY DllMain(HINSTANCE, DWORD, LPVOID);再添加下面两个函数:
    void InitMFC()
    {
    DllMain(_hdllInstance, DLL_PROCESS_ATTACH, NULL);
    hWndACAD = adsw_acadMainWnd();
    }void EndMFC()
    {
    DllMain(_hdllInstance, DLL_PROCESS_DETACH, NULL);
    }然后让InitApplication()调用函数InitMFC(),UnloadApplication()调用EndMFC().处理完毕后,在"StdAfx.h"和"StdAfx.cpp"中创建全局变量hWndACAD,这样做使文件"outercommandtest.cpp"和"outercommandtestcommands.cpp"中的函数都可以调用它了.
    创建代码:
    extern HWND hWndACAD;//"StdAfx.h"
    HWND hWndACAD = NULL;//"StdAfx.cpp"最后,用ObjectArx工具条创建一个新的命令函数"test",实现如下:
    void test()
    {
    CTestDlg dlg(CWnd::FromHandle(hWndACAD));
    dlg.DoModal();
    }
    这样,就实现了byry(pepsi)说的"得到当前AUTOCAD窗口的句柄hWndACAD,通过这个句柄我们才能创建一个对话框:C***Dlg Dlg(CWnd::FromHandle(hWndACAD)),这样才能实现与CAD窗口的通信"了.然后起动程序,用命令"TEST"调用对话框,点击按钮"TEST",就可以看到acedCommand(RTSTR,"_DDINSERT",0);调出来的对话框了.
      

  7.   

    向AutoCAD窗口(adsw_acadMainWnd())发送WM_COPYDATA消息,就可以调用一个命令,
    该方式使用起来安全!
    使用方法如下:
    COPYDATASTRUCT cmdMsg;
    cmdMsg.dwData=1;
    cmdMsg.cbData=10;
    cmdMsg.lpData=“_DDINSERT”;
    ::SendMessage(adsw_acadMainWnd(),WM_COPYDATA,NULL,(LPARAM)&cmdMsg);采用acedCommand方式调用时候,注意调用的命令,如_DDINSERT和DDINSERT、._DDINSERT
    在程序调用中是有区别的!
      

  8.   

    向AutoCAD窗口(adsw_acadMainWnd())发送WM_COPYDATA消息,就可以调用一个命令,
    调用命令和执行Api函数是两码事情,该方式调用命令安全,你所使用的ads_command方式经常会无效,特别是在钩子里面使用的时候更是如此,但我说说的方式却可以在任何时候使用,常规向阿AutoCAD中加入一个实体,不是使用命令,而使你自己创建一个命令,在该命令函数中编写你的操作代码,你可以去买一本ObjetARx的书,那上面讲解的很详细。
    绘制一条线的方式有多种,你可以调用命令绘制一台条,也可以将参数通过命令的方式掺入绘制,最常规的是创建一个AcDbLine实体,添加到数据库中就行!CAD的API函数一般用在自己所写的函数中,如设置进度条函数等等。ads_command就是一个Api函数,他的功能就是调用一个命令。