找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 605|回复: 10

[求助]:晓东 可以给个用ARX生产LISP函数的例子吗?

[复制链接]
发表于 2002-11-21 21:23:51 | 显示全部楼层 |阅读模式

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

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

×
晓东 可以给个用ARX生产LISP函数的例子吗?
论坛里没有找到详细的东西,
最多就如下
土土土       
1、用acedDefun来定义Arx命令,这样lisp在调用arx命令时,Arx就能通过acedGetFunCode得知Lisp要的是哪个命令
2、acedGetArgs()得到来自Lisp的ResBuf,反之可用AcEdRetList 向Lisp返回一个resbuf表
3、acedRetInt\acedRetStr...等函数可以向Lisp返回各种类型的数据
总之,Arx与Lisp之间是可以很好地交互的,包括运行过程中的参数传送;

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-21 22:32:55 | 显示全部楼层

Re: [求助]:晓东 可以给个用ARX生产LISP函数的例子吗?

最初由 fylinwater 发布
[B]晓东 可以给个用ARX生产LISP函数的例子吗?
论坛里没有找到详细的东西,
最多就如下
土土土       
1、用acedDefun来定义Arx命令,这样lisp在调用arx命令时,Arx就能通过acedGetFunCode得知Lisp要的是哪个命令
2、acedG... [/B]


你说的实际是指什么?

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

使用道具 举报

 楼主| 发表于 2002-11-21 22:49:20 | 显示全部楼层
比如用arx写个  (myprinc  str):   (myprinc "TEST") => "你输入的是TEST"
可以贴个完整的例子吗? 最好是工程
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-21 22:59:28 | 显示全部楼层
最初由 fylinwater 发布
[B]比如用arx写个  (myprinc  str):   (myprinc "TEST") => "你输入的是TEST"
可以贴个完整的例子吗? 最好是工程 [/B]

  1. int examle()
  2. {
  3.      resbuf *rb=ads_getargs();
  4.      
  5.      if (!rb)
  6.         return RTNORM;

  7.      if (rb->restype!=RTSTR)
  8.         return RTNORM;

  9.      char * str=rb->resval.rstring;

  10.      rb=rb->rbnext;
  11.      if (rb)
  12.          return RTNORM;

  13.      .....................  // 上面进行了参数处理,如果没有参数或者,参数不是字符串或者多于1个参数,函数返回NIL

  14.       return RTNORM;
  15. }

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

使用道具 举报

 楼主| 发表于 2002-11-21 23:16:11 | 显示全部楼层
编译有问题

E:\DDproject\MYwork\showtip\Main.cpp(106) : error C2065: 'RTNORM' : undeclared identifier
E:\DDproject\MYwork\showtip\Main.cpp(108) : error C2065: 'RTSTR' : undeclared identifier

我在一个函数里添加acedDefun("aaa" , examle());
同时把上面的代码防入同一个文件
这样对吗?
是不是缺少了哪个头文件? 帮助里找不到定义这两个常量的文件名
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-21 23:19:10 | 显示全部楼层
最初由 fylinwater 发布
[B]编译有问题

E:\DDproject\MYwork\showtip\Main.cpp(106) : error C2065: 'RTNORM' : undeclared identifier
E:\DDproject\MYwork\showtip\Main.cpp(108) : error C2065: 'RTSTR' : undeclared identifier

我?.. [/B]


把ADS.H, ADSCODE.H等INCLUDE进去。

技巧是提示你什么没有,你可以用WIN的搜索功能,搜索ARX 的INC目录,文件选*.h, 包括文字填这个标识符如:RTNORM,就可以找到需要的头文件了,一般ARX联机帮助里面都能找到。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-21 23:40:43 | 显示全部楼层
程序是通过了 功能还没实现,我在ARX入口出添加了acedDefun("aaa" , examle());
又在examle()里添加了acutPrintf( "test\n" );
结果在加载arx时 命令行有“test”  而(aaa "test" ) 什么也不发生 返回值NIL
唉  都快没信心了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-21 23:45:06 | 显示全部楼层
最初由 fylinwater 发布
[B]程序是通过了 功能还没实现,我在ARX入口出添加了acedDefun("aaa" , examle());
又在examle()里添加了acutPrintf( "test\n" );
结果在加载arx时 命令行有“test”  而(aaa "test" ) 什么也不发生 返回值NIL
唉  ?.. [/B]


你在命令行输入: !aaa
看看外部函数是否已经定义了。如果没有定义,返回NIL。

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

使用道具 举报

 楼主| 发表于 2002-11-21 23:55:08 | 显示全部楼层

  1. void cmdFilterChangesOn();
  2. void cmdFilterChangesOff();
  3. int examle();
  4. AsdkInputPointFilter myFilter;




  5. void cmdShowInfoChanges()
  6. {
  7.    
  8.         acedDefun("aaa" , examle());  //为什么不亮显?
  9.          


  10.     if ( NULL != curDoc()->inputPointManager()->currentPointFilter() )
  11.     {
  12.                  myFilter.disableChanges();
  13.         curDoc()->inputPointManager()->revokePointFilter();   
  14.                 acutPrintf( "实体信息查询功能关闭.\n" );
  15.     }
  16.         else
  17.         {       
  18.                 curDoc()->inputPointManager()->registerPointFilter( &myFilter );
  19.                 myFilter.enableChanges();

  20.                 acutPrintf( "实体信息查询功能打开.\n" );
  21.         }
  22. }


  23. extern "C" __declspec( dllexport )
  24. AcRx::AppRetCode acrxEntryPoint( AcRx::AppMsgCode msg, void *p )
  25. {
  26.     switch ( msg )
  27.     {
  28.     case AcRx::kInitAppMsg:
  29.         acrxRegisterAppMDIAware( p );
  30.         acrxUnlockApplication( p );
  31.         acedRegCmds->addCommand( "AsdkInputPoint", "InfoChanges", "DD_INFO", ACRX_CMD_TRANSPARENT, cmdShowInfoChanges );
  32.         
  33.                
  34.                 cmdShowInfoChanges();
  35.                
  36.                 break;

  37.     case AcRx::kUnloadAppMsg:
  38.         acedRegCmds->removeGroup( "AsdkInputPoint" );
  39.         cmdShowInfoChanges();

  40.         break;
  41.     }
  42.     return AcRx::kRetOK;
  43. }




  44. int examle()
  45. {
  46.          acutPrintf( "------------\nddddddddddd\n" );
  47.      resbuf *rb=ads_getargs();
  48.     acutPrintf( "输入了1\n" );  
  49.      if (!rb)
  50.         return RTNORM ;

  51.      if (rb->restype!=RTSTR)
  52.         return RTNORM;
  53.      acutPrintf( "输入了2\n" );
  54.      char * str=rb->resval.rstring;
  55.        acedRetStr(str);
  56.      rb=rb->rbnext;
  57.      if (rb)
  58.          return RTNORM;

  59.       // 上面进行了参数处理,如果没有参数或者,参数不是字符串或者多于1个参数,函数返回NIL
  60.        acutPrintf( str );
  61.       return RTNORM;
  62. }

复制代码


测试结果:
命令: testarx      //加载ARX
------------
ddddddddddd
输入了1
实体信息查询功能打开.

命令:
命令: !aaa
#<SUBR @0290044c <EXRXSUBR>>

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-22 00:11:59 | 显示全部楼层
你还没有搞清楚ADSRX的模板结构

!aaa 提示你定义了吗? 还是返回NIL?


  1. // 首先,定义一个结构,第一个域为字符串,表示外部函数的名称;
  2. // 第二个域为函数指针,指向返回值为int型值的函数
  3. struct func_entry { char *func_name;
  4. int (*func) ();
  5. };


  6. // 在此定义由外部函数名称和对应的用户函数名称所构成的结构数组
  7. static struct func_entry func_table[] = {
  8.         {"aaa",example},

  9. };
复制代码


  1. extern "C" AcRx::AppRetCode
  2. acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
  3. {
  4.         switch (msg) {
  5.         case AcRx::kInitAppMsg:
  6.                 InitModule(_hdllInstance, DLL_PROCESS_ATTACH, NULL);
  7.                 acrxUnlockApplication(pkt);
  8. #if(ADS>14)
  9.                 acrxDynamicLinker->registerAppMDIAware(pkt);
  10. #endif
  11.                 initApp();
  12.                 break;
  13.         case AcRx::kLoadDwgMsg:
  14.         [color=blue]        OnkLoadDwgMsg();[/color]
  15.                 break;
  16. ......
复制代码


  1. static int OnkLoadDwgMsg(void)
  2. {
  3.         // TODO: add your message handler code here
  4.         // FUNCLOAD  --  定义此应用程序的两个外部函数
  5.         int i;
  6.         for (i = 0; i < ELEMENTS(func_table); i++) {
  7.                 if (!ads_defun(func_table[i].func_name, (short)i))
  8.                         return RTERROR;
  9.         }
  10.        
  11.         // end of message handler
  12. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-22 20:14:30 | 显示全部楼层
我昨天帖的代码编译执行后
命令: (aaa "d")
nil
命令: !aaa
#<SUBR @0290044c <EXRXSUBR>>
说明函数已经生成了吧

晓东:arx 帮助里好像找不到ads_defun函数  
但有acedDefun
int acedDefun(
    const char* sname,
    short funcno);
Include File:acedads.h
但是没有说明这两个参数是什么意思 怎么使用
使用ADS函数好像复杂多了
/////
原来有个很好的方法就是用ARXWIZARD工具直接定义
可以生成现成的代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 11:17 , Processed in 0.347193 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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