找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1224|回复: 10

[求助] [求助]:arx能调用lisp定义的命令吗?

[复制链接]
发表于 2002-2-27 16:04:15 | 显示全部楼层 |阅读模式

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

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

×
arx能调用lisp定义的命令吗(例如:defun定义的)?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-3-6 11:15:14 | 显示全部楼层
2000以后就不知道了
是不是有间接的方法也没想到
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-3-6 11:16:59 | 显示全部楼层
2000 前是不能的  
(原来在回帖的时候写在标题上的话是不显示出来的啊)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-3-6 11:18:24 | 显示全部楼层

Re: [求助]:arx能调用lisp定义的命令吗?

最初由 lgw 发布
[B]arx能调用lisp定义的命令吗(例如:defun定义的)? [/B]


使用:sendStringToExecute往命令行发送字符串让ACAD执行

virtual Acad::ErrorStatus
sendStringToExecute(
    AcApDocument* pAcTargetDocument,
    const char* pszExecute,
    bool bActivate = true,

    bool bWrapUpInactiveDoc = false) = 0;

pAcTargetDocument        Document to send input to
pszExecute        String to use as input
bActivate        Boolean indicating whether to activate the target document
bWrapUpInactiveDoc        Boolean indicating whether to queue current active document to complete in next OnIdle() when switching active documents.

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-3-6 11:22:40 | 显示全部楼层
最初由 fylinwater 发布
[B]2000 前是不能的  
(原来在回帖的时候写在标题上的话是不显示出来的啊) [/B]


在R14也可以的,原理就是往命令行发送字符串,没有现成的API,可以自己写个,获得命令行窗口句柄,往上发消息。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-3-6 12:08:31 | 显示全部楼层
我搞错了
我指的是调用lisp定义的带参数的函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-3-6 12:33:33 | 显示全部楼层
最初由 fylinwater 发布
[B]我搞错了
我指的是调用lisp定义的带参数的函数 [/B]


一样的啊,都是发字符串到命令行,比如你把 "(abc 1 2 3)"发到命令行就可以了啊。ARX不知道做什么,只是把他们发到命令行,让ACAD解释而已。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-3-6 22:42:37 | 显示全部楼层
ObjectARX applications cannot call AutoLISP functions
但是AutoLisp能调用Arx而且可以同调用Lisp自已的function一样交互数据.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-3-6 22:54:28 | 显示全部楼层
最初由 fylinwater 发布
[B]我搞错了
我指的是调用lisp定义的带参数的函数 [/B]


真正意义上是ARX可以让AUTOCAD LISP解释器去执行命令行的交互,“间接”的调用LISP函数,当然也可以获得LISP函数的返回值,在ARX程序里面使用ads_getsysm()获得LISP变量符号值。

获得符号值的前提是这个ARX函数必须是ADSRX定义的外部函数,既不是通过AcEdCommandStack::addCommand定义的命令,而是通过ads_defun定义的外部函数,既type 函数名得到的类型是:EXRXSUBR
如:命令: (type sldna)
EXRXSUBR
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-3-6 23:34:08 | 显示全部楼层
最初由 fylinwater 发布
[B]我搞错了
我指的是调用lisp定义的带参数的函数 [/B]


  在ObjectARX编程中,可以使用ads_command()或者ads_cmd()函数来执行AutoCAD的命令(包括AutoLISP函数、
AutoCAD的内部命令以及注册的ARX应用程序);但也可以通过向AutoCAD发送消息的形式来执行上面的操作,
尤其是对于独立于AutoCAD运行的应用程序。例如在启动AutoCAD后进行的诸如加载菜单等初始化工作,就必须
向AutoCAD发送消息才能进行。

  在AutoCAD 2000(包括14.0版本)中,通过Windows/NT平台向AutoCAD发送消息所采用的消息标识于12.0版本
  有所不同。其中,AutoCAD 12.0(WINDOWS版本)使用定制的WM_ACAD消息,而AutoCAD2000使用WIN32 API本身
  提供的WM_COPYDATA消息。

  发送WM_COPYDATA消息只能采用SendMessage()函数(或者相应的MFC类成员函数),其原型声明如下:


  1. LRESULT SendMessage(HWND hWnd, //目的窗口句柄
  2.                       UINT Msg,  //发送的消息
  3.                       WPARAM wParam, //第一个消息函数,发送消息的窗口句柄
  4.                       LPARAM lParam, //第二个消息函数
  5.                      );
复制代码

  发送WM_COPYDATA消息时,必须构造一个COPYDATASTRUCT结构变量作为消息的第二个参数,既lParam。
COPYDATASTRUCT结构如下:

  1.   typedef struct tagCOPYDATASTRUCT{
  2.      DWORD dwData;
  3.      DWORD cbData;
  4.      PVOID lpData;
  5.   }COPYDATASTRUCT;
复制代码

  在向AutoCAD2000发送WM_COPYDATA消息时,dwData域必须置为1且为32位;lpData 域必须指向将要发送
  的以空字符(null)结束的命令字符串,该域可以为空(null);cbData 域值指定该命令字符串的长度。
  如果dwData域值不为1,或者lpData指向的命令字符串不以NULL结束,则AutoCAD 主程序将不会处理该消息。

  下面的函数可以向AutoCAD 2000的主程序发送一条字符串命令:

  1.    void SendCommandToAutoCAD(HWND hWndAcad,CString cmd)
  2.    {
  3.       if (!hWndAcad)
  4.          return;
  5.       COPYDATASTRUCT cmdMsg;
  6.       cmdMsg.dwData=(DWORD)1;
  7.       cmdMsg.cbData=(DWORD)_tcslen(cmd)+1;
  8.       cmdMsg.lpData=cmd.GetBuffer(cmd.GetLength()+1);
  9.       SendMssage(hWndAcad,WM_COPYDATA,(WPARAM)hWndAcad,(LPARAM)&cmdMsg);
  10.    }
复制代码

  ADSRX函数 asdw_acadMainWnd()返回 AutoCAD 2000主框架窗口的句柄,其值等于acedGetAcadFrame()->m_hWnd
  注意:只有动态链接MFC库时两者才相等(在Project|Settings|General中设置);否则,即时编译能通过,
acedGetAcadFrame()->m_hWnd的值也是错误的,并且毫无意义。

  注意:在上述任何情况下,函数asdw_acadMainWnd()的返回值总是正确的。

  当然,上述函数代码可以添加到任何基于MFC类库ARX 编程工作中,不过,对于非MFC程序,则需要将传递字符串
  命令的参数从CString改为LPSTR(因为没有用MFC,所以CString不能用),并且对命令字符串的操作也要相应修改。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-3-6 23:48:55 | 显示全部楼层
最初由 fylinwater 发布
[B]我搞错了
我指的是调用lisp定义的带参数的函数 [/B]


另外一个让ACAD执行字符串的方法比较简单,使用ARX未公开的函数ads_queueexpr()....
使用这个函数前,要声明:
extern "C" int ads_queueexpr(const char*);
见下面的ADN教学

SendStringToExecute does not work when called during kLoadDwgMsg  
ID    45277  
Applies to:    AutoCAD 2000

Date    6/22/2000  

This document is part of    ObjectARX   AcDb (AutoCAD Database)   Calling Commands   MDI-MDE   Opening Drawings   AcEd     


Question
Why does an "eNoDocument" error occur when executing an AutoLISP expression
while in the kLoadDwgMsg handler and when using sendStringToExecute?
Answer
Although sendStringToExecute is the preferred way to execute an AutoLISP
expression or commands on AutoCAD 2000, this function does not work during the
kLoadDwgMsg. This is because the AutoCAD command line is not yet fully ready at
this point. (Note that your application receives a kLoadDwgMsg when it is loaded
into AutoCAD in the middle of a session, and at that time sendStringToExecute
will work. However, kLoadDwgMsg is also sent to your application when a new
document is created and sendStringToExecute will not work in this scenario.)

The workaround is to use the ads_queueexpr function in this context. (Search the
ObjectARX online help for more information on ads_queueexpr.)

Example:
extern "C" int ads_queueexpr(const char*);

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 05:05 , Processed in 0.227193 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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