arx 调用 lisp 函数
有时候ARX需要用到内存中运行的LISP函数,可通过acedInvoke函数。但这里发现一个问题,只能调用LISP中以“C:”开头的函数。有什么办法能调用LISP中自编的普通函数呢并且能返回值。
struct resbuf *result = NULL, *list;
list = acutBuildList(RTSTR,"c:dmsj", RTNONE);
//list = acutBuildList(RTSTR,"alert", RTSTR,"你好世界!",RTNONE); //调用不以C:开头的函数无反应
if (list != NULL)
{
int stat = acedInvoke(list, &result);
acutRelRb(list);
}
if (result != NULL)
{
// Do somthing
acutRelRb(result);
}
同问。。。。 恐怕需要在lisp前面加上一句:
(vl-acad-defun 'alert) 之类的才可以运行
本帖最后由 highflybird 于 2011-6-18 01:55 编辑
http://forums.autodesk.com/t5/Autodesk-ObjectARX/Calling-Lisp-from-ObjectArx/td-p/321529
See example:
=========LISP code start==============
(defun LispFunction ( prl )
(princ prl)
)
;
; If you want to be able to invoke this function from an external ObjectARX
; application, you can use vl-acad-defun to make the function accessible.
;
(vl-acad-defun 'LispFunction)
=========LISP code end===============
=========C++ code start==============
int ads_call_lisp_function(void)
{
char *output_line = "\nHello, Lisp!!!";
resbuf *rb_in = acutBuildList(RTSTR,"LispFunction",
RTSTR,output_line,RTNONE);
resbuf *rb_out = NULL;
int rc = acedInvoke(rb_in,&rb_out);
acutRelRb(rb_in); acutRelRb(rb_out);
return (RSRSLT) ;
}
本帖最后由 chpmould 于 2011-6-18 09:01 编辑
按楼上的方法可以调用不带参的LISP,但是不知能否做到调用LISP中带参的子程序... 本帖最后由 highflybird 于 2011-6-18 10:47 编辑
回复 chpmould 的帖子
楼上还没看明白吗?这个已经是调用带参的lisp程序啊。
首先用vl-acad-defun'LispFunction --->定义要调用的lisp函数给arx用。
resbuf *rb_in = acutBuildList(RTSTR,"LispFunction",RTSTR,output_line,RTNONE);
构建表,
RTSTR,lispfunction -函数名字,可以是自编的,也可以是lisp的其他一些函数。
第二个----RTSTR,参数类型, output_line取决于你的参数类型。
因为实例中只有一个参数,所以后面就加RTNONE结束了。
如果多个的话,就要按照格式
int参数类型, 参数.....
最后加RTNONE结束
然后acedInvoke;
具体用法请参考说明和帮助。或者google
highflybird 发表于 2011-6-18 10:34 static/image/common/back.gif
回复 chpmould 的帖子
楼上还没看明白吗?这个已经是调用带参的lisp程序啊。
谢谢你的指导,刚才确实没有看懂,现经你的指导总算是明白了 用sendStringToExecute传一个整字符串进去
页:
[1]