找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 604|回复: 4

[ARX函数]:ObjectARX2004的acedDefun

[复制链接]
发表于 2004-4-22 12:44:28 | 显示全部楼层 |阅读模式

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

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

×
参照这个论坛的帖子,2002里面成功的例子及Arx的帮助文件,试验了多种方法,均未能成功的在2004里面定义一个能返回字符串给Lisp的命令。addCommand有一个flag是ARX_CMD_DEFUN,有谁成功用过。
我最终想实现的就是做一个实用的CAD工具包,想在Arx里面用一个lisp可用的命令返回这个工具包的安装目录,然后可以根据这个目录相对调用各级目录树的其它文件,比如VBA, LSP,DWG等等。
我说明白没有?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-4-23 08:44:49 | 显示全部楼层
实现你的目的似乎还比较简单,你这应属于不同应用程序间的简单通信,你可利用CAD提供的共计15个用户系统变量,userI1-5,userr1-5,users1-5(5个整型、实型、字符型)不同程序都可设这几个变量的值,亦可取它的值,以实现参数传递。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-4-24 02:06:35 | 显示全部楼层

Re: [ARX函数]:ObjectARX2004的acedDefun

最初由 r33d 发布
[B]参照这个论坛的帖子,2002里面成功的例子及Arx的帮助文件,试验了多种方法,均未能成功的在2004里面定义一个能返回字符串给Lisp的命令。addCommand有一个flag是ARX_CMD_DEFUN,有谁成功用过。
我最终想实现的就是做?.. [/B]


你要想实现ARX定义一个外部函数供LISP调用,那么需要在AcRx::kLoadDwgMsg消息里面,使用ads_defun 定义,结构如下:

[php]
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
        switch (msg) {
        case AcRx::kInitAppMsg:
                InitModule(_hdllInstance, DLL_PROCESS_ATTACH, NULL);
                acrxUnlockApplication(pkt);
#if(ADS>14)
                acrxDynamicLinker->registerAppMDIAware(pkt);
#endif
                initApp();
                break;
        case AcRx::kLoadDwgMsg:
                OnkLoadDwgMsg();
                break;
................................
.........................
[/php]

OnkLoadDwgMsg()函数定义如下:

[php]
static int OnkLoadDwgMsg(void)
{
        // TODO: add your message handler code here
        // FUNCLOAD  --  定义此应用程序的两个外部函数
        int i;
        for (i = 0; i < ELEMENTS(func_table); i++) {
                if (!ads_defun(func_table.func_name, (short)i))
                        return RTERROR;
        }
        return RTNORM;
        // end of message handler
}
[/php]

函数表func_table结构如下:
[php]
static struct func_entry func_table[] = {
        {"test",yourfunc},
...................
}
[/php]

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

使用道具 举报

 楼主| 发表于 2004-4-24 19:45:58 | 显示全部楼层
谢谢大家热心的回答,特别是XDSoft,我用的是2004
        virtual AcRx::AppRetCode On_kLoadDwgMsg(void *pkt) {
                AcRx::AppRetCode retCode = AcRxArxApp::On_kLoadDwgMsg (pkt);
                acedDefun("Hello", 1); //定义一个功能号为1的AutoLisp函数名字
                return (retCode);
        }

        virtual AcRx::AppRetCode On_kInvkSubrMsg(void *pkt) {
                AcRx::AppRetCode retCode = AcRxArxApp::On_kInvkSubrMsg(pkt);
        DoFun(); //执行定义的Lisp函数
                return (retCode);
        }
        static int DoFun(void) {
                //acedGetFunCode();
                acedRetStr("Hello, World!"); //不管功能号是多少,都返回这个东西给Lisp
                return (RTNORM);
        }

这样已经可以了。早几天试验的时候死活都不行。现在要解决的是定义命令的时候用ACRX_CMD_DEFUN是不是可以,而不是用acedDefun。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 15:42 , Processed in 0.179126 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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