明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4950|回复: 14

请教个问题:ARX中可以加载LSP、FAS或VLX文件吗?如何加载?

[复制链接]
发表于 2015-8-11 12:56:34 | 显示全部楼层 |阅读模式
请教个问题:ARX中可以加载LSP、FAS或VLX文件吗?如何加载?
我的想法是:ARX随着CAD启动,其它的LSP程序由ARX按需加载。
除了用sendcommand之外,还有没有其它更好的办法?
望明经的高手赐教!!
发表于 2018-8-27 08:03:35 | 显示全部楼层
tengte 发表于 2015-8-17 17:51
果然,ads_queueexpr最好用,命令行没有回显(程序中的输出信息除外),不受当前文档的限制。
比SendStr ...

百度搜索manusoft,国外的owen有lspload,就是自动加载lsp的
发表于 2015-8-11 16:26:33 | 显示全部楼层
acedInvoke/acedCmd /acedCommand 三个函数都可以实现加载Lisp文件!
 楼主| 发表于 2015-8-11 16:52:37 | 显示全部楼层
菡萏 发表于 2015-8-11 16:26
acedInvoke/acedCmd /acedCommand 三个函数都可以实现加载Lisp文件!

谢谢你的回复!请给我一个例子好吗?它们分别执行什么函数或命令呢?
因为我用acedInvoke执行Load时,总是失败。查了文档,这种方式只能调用C:xx的AutoLisp函数。
发表于 2015-8-12 10:08:02 | 显示全部楼层
http://www.xdcad.net/forum/thread-54606-1-1.html     百度的。不知道效果如何
ObjectARX调用LISP方法(含参数传递)返回值
发表于 2014 年 3 月 31 日 由 boitboy       

//acrxEntryPoint.cpp

void Test()
{
struct resbuf *ptList,*ptResult=NULL;
//注意,一定要写成_T("c:lisp_test"),写成"c:lisp_test"调用会失败
double dx=135.6;
double dy=147.5;
ptList=acutBuildList(RTSTR,_T("c:lisp_test"),RTREAL,dx,RTREAL,dy,RTNONE);
int rc=acedInvoke(ptList,&ptResult);
if(rc!=RTNORM)
{
acutPrintf(_T("\r\n调用LISP失败,请检查依赖的LISP是否加载"));
acutRelRb(ptList);
return;
}
acutRelRb(ptList);
if(ptResult==NULL)
{
acutPrintf(_T("\r\n调用LISP失败,返回空值"));
return;
}
if(ptResult->restype!=RTSTR)
{
acutPrintf(_T("\r\n调用LISP失败,返回错误的值类型"));
acutRelRb(ptResult);
return;
}
CString strRC=ptResult->resval.rstring;
acutRelRb(ptResult);
acutPrintf(_T("\r\n返回值:%s"),strRC);
}
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CInvokeLispTestApp : public AcRxArxApp {

public:
CInvokeLispTestApp () : AcRxArxApp () {}

virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here

// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
acedRegCmds->addCommand(_T("InvokeLispTestApp"),_T("Test"),_T("Test"),0,Test);

// TODO: Add your initialization code here

return (retCode) ;
}

virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
// TODO: Add your code here

// You *must* call On_kUnloadAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

// TODO: Unload dependencies here
acedRegCmds->removeGroup(_T("InvokeLispTestApp"));

return (retCode) ;
}

virtual void RegisterServerComponents () {
}

} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CInvokeLispTestApp)



//InvokeLispTest.lsp

;;定义函数lisp_test
;;函数有两个参数x,y
;;函数名必须写成c:xx否则ARX无法调用
(defun c:lisp_test(x y)
;;将X转换成字符串
(setq strX(rtos x 2 10))
;;将Y转换成字符串
(setq strY(rtos y 2 10))
;;将X,Y转换的字符串合并起来,并返回给ARX函数
;;返回给ARX调用
;;LISP最后一个运算的返回值做为函数的返回值
(setq strXY(strcat strX "|" strY))
)
 楼主| 发表于 2015-8-12 10:28:42 | 显示全部楼层
434939575 发表于 2015-8-12 10:08
http://www.xdcad.net/forum/thread-54606-1-1.html     百度的。不知道效果如何
ObjectARX调用LISP ...

谢谢434939575 的回复!
ARX调用LISP这种我知道,现在我是想从ARX中加载LISP程序,也就是调用之前,需要先加载。
不知道有没有好的方法!
现在我已经用acedPostCommand和SendMessage发送文字到命令行实现了,但是命令行会出现发送的文字,感觉不太“和谐”,不知道有没有“安静”的方法?
发表于 2015-8-13 10:40:46 | 显示全部楼层
tengte 发表于 2015-8-12 10:28
谢谢434939575 的回复!
ARX调用LISP这种我知道,现在我是想从ARX中加载LISP程序,也就是调用之前,需要 ...

Arx提供的Lisp函数(load Path)
在ArxObject中 应该是有原型函数的.
实在不行,你调用Lisp函数 调用Load 就OK了
 楼主| 发表于 2015-8-14 10:49:06 | 显示全部楼层
鱼与熊掌 发表于 2015-8-13 10:40
Arx提供的Lisp函数(load Path)
在ArxObject中 应该是有原型函数的.
实在不行,你调用Lisp函数 调用Load  ...

谢谢你的回复!
首先没有找到原型函数。
ARX中只能调用C:xxx和用vl-acad-defun定义的LISP函数,LOAD是不能直接用acedCmd调用的。
不过,现在我已经解决了这个问题,用的SendStringToExecute。
发表于 2015-8-14 10:51:41 | 显示全部楼层
tengte 发表于 2015-8-14 10:49
谢谢你的回复!
首先没有找到原型函数。
ARX中只能调用C:xxx和用vl-acad-defun定义的LISP函数,LOAD是不 ...

你可以在调用前 调用vl-acad-defun注册他 就解决了.
 楼主| 发表于 2015-8-14 11:34:30 | 显示全部楼层
本帖最后由 tengte 于 2015-8-14 11:35 编辑
鱼与熊掌 发表于 2015-8-14 10:51
你可以在调用前 调用vl-acad-defun注册他 就解决了.
vl-acad-defun是LSP中的函数,ARX不能直接调用的,只能在LSP中调用。
LSP都没有加载,怎么调用得了呢?
我是想用ARX加载LSP,这是执行LSP的第一步。
发表于 2015-8-17 09:43:37 | 显示全部楼层
  1. int ret=ads_queueexpr(_T("(load \"c:/test.lsp\")"));
  2.         if (RTNORM==ret)
  3.         {
  4.                 acutPrintf(_T("\n加载成功..."));
  5.         }
  6.         else
  7.         {
  8.                 acutPrintf(_T("\n加载失败..."));
  9.         }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 05:25 , Processed in 0.229737 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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