找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7156|回复: 11

[求助] ARX 向CAD 发送命令 带参数

[复制链接]
发表于 2013-8-14 15:59:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
定义CAD命令,就是得定义一个函数。我想可不可以给这个函数添加个参数,发送命令时,带个参数。不知道这个可以实现不。比如定义函数void LTTest(CString str);然后定义命令test,调用LTTest 然后使用SendMsgToAutoCAD,或其他方式调用这个命令,在这个调用命令中给出参数。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2013-8-14 16:01:21 | 显示全部楼层
自己顶?????

点评

向ACAD命令行发送字符串执行,需要什么参数,你字符串都写好就行了。 有好多种方法  详情 回复 发表于 2013-8-14 17:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-14 17:49:48 | 显示全部楼层
lingbinbai 发表于 2013-8-14 16:01
自己顶?????

向ACAD命令行发送字符串执行,需要什么参数,你字符串都写好就行了。

有好多种方法

  1. //----------------------------------------------------------------------------------------
  2. //向CAD 窗口发送命令
  3. //----------------------------------------------------------------------------------------
  4. LRESULT  XdDbUtils::SendCommand(CString cmd)
  5. {
  6.         COPYDATASTRUCT cmdMsg;
  7.         cmdMsg.dwData = (DWORD)1;
  8.         cmdMsg.cbData = (DWORD)_tcslen(cmd) + 1;
  9.         cmdMsg.lpData = cmd.GetBuffer(0);
  10.         LRESULT ret = SendMessage(adsw_acadMainWnd(),WM_COPYDATA,NULL,(LPARAM)&cmdMsg);
  11.         return ret;
  12. }

  13. //----------------------------------------------------------------------------------------
  14. //向CAD 窗口发送命令
  15. //----------------------------------------------------------------------------------------
  16. #if (ADS>16)
  17. HRESULT  XdDbUtils::SendCommand(BSTR cmd)
  18. {
  19.         IAcadApplication * pApp =(IAcadApplication *) acedGetIDispatch(TRUE);
  20.         IAcadDocument * pDoc;
  21.         pApp->get_ActiveDocument(&pDoc);
  22.         HRESULT ret = pDoc->SendCommand(cmd);
  23.         pApp->Release();
  24.         pDoc->Release();
  25.         return ret;
  26. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-14 17:57:11 | 显示全部楼层
AcApDocManager::sendStringToExecute Function
virtual Acad::ErrorStatus
sendStringToExecute(
AcApDocument* pAcTargetDocument,
const ACHAR * pszExecute,
bool bActivate = true,
bool bWrapUpInactiveDoc = false,
bool bEchoString = true) = 0;
pAcTargetDocumentDocument to send input to
pszExecuteString to use as input
bActivateInput Boolean indicating whether to activate the target document
bWrapUpInactiveDocInput Boolean indicating whether to queue current active document to complete in the next OnIdle() when switching active documents.
bEchoStringInput Boolean indicating whether the sent string is echoed on the command line
This function sends a string to the command line to be executed in the provided target document.

  1. void
  2. XdAcadUi::stuffAcadCmdLine(const CString& str)
  3. {
  4.     if (str.IsEmpty())
  5.         return;

  6.     CString tmpStr = str;
  7.     tmpStr += _T("\n");

  8.         Acad::ErrorStatus es;
  9.         es = acDocManager->sendStringToExecute(acDocManager->curDocument(), tmpStr, false, true);
  10.         if (es != Acad::eOk)
  11.                 XdAcadUi::rxErrorMsg(es);
  12. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-14 18:01:20 | 显示全部楼层
  1. int SendStrToExcute()
  2. {
  3.         resbuf *rb=ads_getargs();
  4.         if (!rb)
  5.                 return RTNORM;
  6.         if (rb->restype!=RTSTR)
  7.                 return RTNORM;
  8.         ads_queueexpr(rb->resval.rstring);
  9.         ads_rett();
  10.         return RTNORM;
  11. }

点评

晓东老大,您写的我看懂了。但我想要的没实现。我想实现的效果是这个样子的。 //声明 void LTStartSKTC(CString str); //添加命令 AddCommand( , StartSKTC, StartSKTC, , LTStartSKTC);//开始色块填充 //实  详情 回复 发表于 2013-8-15 17:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 08:53:26 | 显示全部楼层
谢谢老大,俺来仔细研究下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 17:55:06 | 显示全部楼层

晓东老大,您写的我看懂了。但我想要的没实现。我想实现的效果是这个样子的。
//声明
void LTStartSKTC(CString str);
//添加命令
AddCommand( , StartSKTC, StartSKTC, , LTStartSKTC);//开始色块填充

//实现命令
void LTStartSKTC(CString str)
{

}

//调用命令或使用其他方式调用
acDocManager->sendStringToExecute(curDoc(), _T("StartSKTC"));

这种方式行不能,因为CAD不让给LTStartSKTC带参数。
我想通过一种方式调用该命令,然后给LTStartSKTC函数传递个值。
如果不用使用这种方式,还有什么好的办法呢。

点评

咱们一直讨论的是如何发送字符串让ACAD执行。 就是说发送的字符串你在ACAD命令行手动交互输入也一样执行的。 你的程序发送的是一个命令,在ACAD下面输入也不能带参数的。 你不要定义成命令了,用ads_defun 定  详情 回复 发表于 2013-8-15 18:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-15 18:31:31 | 显示全部楼层
lingbinbai 发表于 2013-8-15 17:55
晓东老大,您写的我看懂了。但我想要的没实现。我想实现的效果是这个样子的。
//声明
void LTStartSKTC ...

咱们一直讨论的是如何发送字符串让ACAD执行。 就是说发送的字符串你在ACAD命令行手动交互输入也一样执行的。

你的程序发送的是一个命令,在ACAD下面输入也不能带参数的。

你不要定义成命令了,用ads_defun 定义个外部函数,函数可以带参数。

定义外部函数在kLoadDwgMsg消息循环中添加,func_table结构里面是你的外部函数的名字
  1. // 在此定义由外部函数名称和对应的用户函数名称所构成的结构数组

  2. static struct func_entry func_table[] = {
  3.         {_T("lisp_funcname"),ARXFUNC},
  4. }

  5. virtual AcRx::AppRetCode On_kLoadDwgMsg (void *pkt)
  6.         {
  7.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kLoadDwgMsg (pkt) ;
  8.                 LoadFunctions();
  9.                 return AcRx::kRetOK;
  10.         }

  11. AcRx::AppRetCode LoadFunctions()
  12. {
  13.         int i;
  14.         for (i = 0; i < ELEMENTS(func_table); i++)
  15.         {
  16.                 ret = ads_defun(func_table.func_name, (short)i);
  17.                 if (ret != RTNORM)
  18.                         return AcRx::kRetError;
  19.         }
  20.         return AcRx::kRetOK;
  21. }


点评

这段咋用啊  详情 回复 发表于 2015-5-27 00:49
哈哈。谢谢您。  详情 回复 发表于 2013-8-16 14:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 14:48:02 | 显示全部楼层
XDSoft 发表于 2013-8-15 18:31
咱们一直讨论的是如何发送字符串让ACAD执行。 就是说发送的字符串你在ACAD命令行手动交互输入也一样执行 ...

哈哈。谢谢您。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-5-26 23:08:17 | 显示全部楼层
咋用啊!:@:@:@:@
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2015-5-27 00:42:47 | 显示全部楼层
\acrxEntryPoint.cpp(7446) : error C2065: “IAcadApplication”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7446) : error C2065: “pApp”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7446) : error C2065: “IAcadApplication”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7446) : error C2059: 语法错误 : “)”
1>.\acrxEntryPoint.cpp(7447) : error C2065: “IAcadDocument”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7447) : error C2065: “pDoc”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7448) : error C2065: “pApp”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7448) : error C2227: “->get_ActiveDocument”的左边必须指向类/结构/联合/泛型类型
1>        类型是“'unknown-type'”
1>.\acrxEntryPoint.cpp(7448) : error C2065: “pDoc”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7449) : error C2065: “pDoc”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7449) : error C2227: “->SendCommand”的左边必须指向类/结构/联合/泛型类型
1>        类型是“'unknown-type'”
1>.\acrxEntryPoint.cpp(7450) : error C2065: “pApp”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7450) : error C2227: “->Release”的左边必须指向类/结构/联合/泛型类型
1>        类型是“'unknown-type'”
1>.\acrxEntryPoint.cpp(7451) : error C2065: “pDoc”: 未声明的标识符
1>.\acrxEntryPoint.cpp(7451) : error C2227: “->Release”的左边必须指向类/结构/联合/泛型类型
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-5-27 00:49:56 | 显示全部楼层
XDSoft 发表于 2013-8-15 18:31
咱们一直讨论的是如何发送字符串让ACAD执行。 就是说发送的字符串你在ACAD命令行手动交互输入也一样执行 ...

这段咋用啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-17 03:02 , Processed in 0.309554 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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