ObjectARX给CAD发送命令的几种方法

更新时间:2023-12-10 13:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

在ARX的帮助里有最常见的两个方法: int acedCommand(int rtype, ... unnamed); int acedCmd(const struct resbuf * rbp);

这两个函数处理命令的方式差不多,只不过一个通过链表来描述整个命令,一个通过不定参数来描述。

1. acedCommand()[ads_command()]

acedCommand()函数的参数是成对处理的。每对参数中的第一个表示参数的类型,第二个表示其实际的数据。参数表中的最后一个必须是单个参数,其值为0或RTNONE。每个表示参数类型的参数值必须为在adscodes.h文件中定义的结果类型码中的一个(例如RTPOINT)。比如:acedCommand(RTSTR, \RTSTR, \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, \

p11, RT3DPOINT, p21 ,0); if (cmdlist == NULL) {

acdbFail(\

return BAD; }

acedCmd(cmdlist); acutRelRb(cmdlist); 执行效果是一样的。

其实还有其它方式来执行AutoCAD命令,下面介绍另外一种方法:

3 // 发送命令给AutoCAD

void YgxAcadUtil::SendCommandToCAD(CString cmd) {

cmd.Format(\ 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(\注意后面要带一空格。 zoom e命令可以这样:

SendCommandToCAD(_T(\在zoom后面要有空格,e 后面也要有空格。

这里还介绍一种发送命令的方法:

4 acedPostCommand,由于这个函数Autodesk没有公布,在使用

之前,我们需要先申明一下:

extern Adesk::Boolean acedPostCommand(const char* ); 然后,我们发送Cancel命令为例: acedPostCommand(\

5 ads_queueexpr( _T(\该

函数CAD未公开,使用时提前声明下就可以了。可以参考帮助文件中:Tips and Techniques 。

6 acDocManager->sendStringToExecute(curDoc(), _T(\

2,2,0 \该函数在Arx帮助中有详细说明。

7 Windows API 方法void SendCmdToAcad(ACHAR *cmd)

{

COPYDATASTRUCT cmdMsg; cmdMsg.dwData = (DWORD)1;

cmdMsg.cbData = (DWORD)(_tcslen(cmd) + 1) * sizeof(ACHAR); cmdMsg.lpData = cmd;

SendMessage(adsw_acadMainWnd(),WM_COPYDATA,NULL, (LPARAM)&cmdMsg); }

8

?Com 方法

void SendCommandTest(void) {

IAcadApplicationPtr pApp = acedGetIDispatch(TRUE); IAcadDocumentPtr pDoc;

pApp->get_ActiveDocument(&pDoc);

pDoc->SendCommand( _T(\}

? ? ? ? ?

ads_queueexpr()

AcApDocManager::sendStringToExecute() ::SendMessage()

IAcadDocument::SendCommand() acedCommand()

本文来源:https://www.bwwdw.com/article/dez5.html

Top