找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 281|回复: 3

[原创]:输出为lisp表的问题:又像bug

[复制链接]
发表于 2004-3-19 16:14:55 | 显示全部楼层 |阅读模式

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

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

×
下面的代码很简单  : 问题却有点复杂。
代码主要功能就是获取lisp表 在返回lisp表 不处理
一般问题已经如注释所述
但是如果输入参数为一个简单表,如(1  2 3),如果表原子只有2或者3个,且为整数或者实数,则返回有点异常,竟然是((1 2 3))    甚是奇怪!


  1. ////返回同样的数据
  2. /*  pArg = acedGetArgs();  acedRetList(pArg); 两句连着使用的效果不是精确返回入参
  3. *  输入单个参数或者多个原子数据或者原子数据和表的混合参数  则返回这些数据构成的表
  4. *  输入单个参数为表           返回的还是那个表。
  5. *  输入单个表 且表元素为数据 real或者 int  且元素个数为2~3个 则返回这些数据组成的表的表 ??
  6. *  所以在LISP使用这个函数时要 先判断输入参数 如果是表就再建一层表,最后car返回的数据就可以了
  7. *   2002.12.06
  8. */

  9. int dd_functionlsp()
  10. {

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-19 16:36:53 | 显示全部楼层

Re: [原创]:输出为lisp表的问题:又像bug

最初由 fylinwater 发布
[B]下面的代码很简单  : 问题却有点复杂。
代码主要功能就是获取lisp表 在返回lisp表 不处理
一般问题已经如注释所述
但是如果输入参数为一个简单表,如(1  2 3),如果表原子只有2或者3个,且为整数或者实数,则返回... [/B]


这不是ARX的BUG,而是在2000+以上,ARX的 ads_retlist  处理返回表给LISP和R14不同而已,R14 下要多个括号对。

所以,你自己的程序里面,处理下就可以。

你参考下下面的XDRX API 通用C++库中的一个函数,红色的部分就是识别R14还是2000+,然后做不同的处理。


  1. void XdRbUtils::toLisp(resbuf * rblist,BOOL ucsFlag)
  2. {
  3.         if (!rblist)
  4.                 return;
  5.         resbuf * head=rblist;
  6.         XdRbList myNode;
  7.         myNode=rblist;
  8.         if (ucsFlag)
  9.                 myNode.wcsToUcs();
  10. [color=red]#if (ADS>14)
  11.         myNode.addHead(ads_newrb(RTLB));
  12.         myNode.addTail(ads_newrb(RTLE));
  13. #endif
  14. [/color]
  15.         ads_retlist(myNode.data());
  16.         return;
  17. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-22 14:16:33 | 显示全部楼层
谢谢晓东 不过问题是现在2002下也会多个括号对!! 而且是部分 才觉得危险!
我提供的函数做的lisp测试结果如下
命令: (oxa_functionend '(1 ))
(1)

命令: (oxa_functionend '(1 2))       :  看这里多了个括号对
((1.0 2.0))

命令: (oxa_functionend '(1 2 3.0))          看这里也多了个括号对

((1.0 2.0 3.0))

命令: (oxa_functionend '(1 2 3.0 4.0))      看这里又没有多括号对

(1 2 3.0 4.0)

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-22 14:28:42 | 显示全部楼层
最初由 fylinwater 发布
[B]谢谢晓东 不过问题是现在2002下也会多个括号对!! 而且是部分 才觉得危险!
我提供的函数做的lisp测试结果如下
命令: (oxa_functionend '(1 ))
(1)

命令: (oxa_functionend '(1 2))       :  看这里多了个括... [/B]


1、'(1 2) ,在ARX里面不是LIST,是AcGePoint2d,是点。
(1 2 3.0) ,在ARX里面不是LIST,是AcGePoint3d,是点。

上面的数据都是一个resbuf 节点。都是ads_point 类型表示。

ARX对于 两个或者三个整数、实数都归结为ads_point 类型的一个resbuf 节点结构。 对于两个或三个元素,只有里面有如字符或其他非整数、实数数据的时候,才是多个resbuf 链表。

所以,上面的你要得到不带括号的,应该用:ads_retpoint,要带括号的,如:((1 2 3.0))用ads_retlist ,因为ARX把单独的resbuf 作为一个元素,认为是“点”,所以,你要返回表,当然外面要多加个括号,里面的括号是“点”,这点ARX没有BUG。

2、(1 2 3.0 4.0),(1 2 "ss"),分别是4个、3个元素,因此结构是一个四个或者三个type为ads_int 和 ads_real , ads_str 的resbuf 链表结构,这个才是LIST,所以ARX返回给LISP的时候就不带括号了。

具体的区分,就是看要返回的数据是单独的resbuf (点),还是resbuf 链表。

记住一点就清楚了:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 12:19 , Processed in 0.392260 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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