找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 621|回复: 12

[求助] Object ARX 定义LISP外部函数的参数传递

[复制链接]
发表于 2021-1-2 23:54:11 | 显示全部楼层 |阅读模式

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

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

×
Object ARX 定义LISP外部函数,传递多段线图元名,返回对短线的顶点个数和顶点坐标的表
(顶点个数(顶点1)(顶点2)...)
希望高人指点指点,如果能简单写一下代码就更好了,
相关书籍不是很多,所以无从下手,
在这里谢谢了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2021-1-3 09:59:19 | 显示全部楼层
通过 acedRetList 返回给LISP
acedRetList(acutBuildList(RT3DPOINT,p1,RT3DPOINT,p2.....,0));
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-3 10:46:32 | 显示全部楼层
XDSoft 发表于 2021-1-3 09:59
通过 acedRetList 返回给LISP
acedRetList(acutBuildList(RT3DPOINT,p1,RT3DPOINT,p2.....,0));

返给lisp我会,我现在卡在arx在如何得到多段线的图元名,得到后怎么处理!!

点评

你是说ARX怎么得到LISP函数的参数? 用 resbuf *rb = acedGetArgs(); if (!rb) return RSRSLT; if (rb->restype== RTENAME) { .... }  详情 回复 发表于 2021-1-3 11:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2021-1-3 11:16:43 | 显示全部楼层
forever123 发表于 2021-1-3 10:46
返给lisp我会,我现在卡在arx在如何得到多段线的图元名,得到后怎么处理!!

你是说ARX怎么得到LISP函数的参数?

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

使用道具 举报

 楼主| 发表于 2021-1-3 12:27:47 | 显示全部楼层
newer 发表于 2021-1-3 11:16
你是说ARX怎么得到LISP函数的参数?

resbuf *rb = acedGetArgs();

我现在就卡在这步,
传递来的 参数判断为图元名后我该怎么办,
怎么判断它是多段线,如果是多段线的话怎么得到顶点坐标及顶点个数。
刚接触arx不久,还在学习当中,,

点评

ARX C++库很方便啊 if (rb->restype != RTENAME) return RSRSLT; AcDbObjectId mId; if ( acdbGetObjectId(mId,rb->resval.rlname) != Acad::eOk) return RSRSLT; AcDbPolyLine *pLine; if (AcDbOpe  详情 回复 发表于 2021-1-3 12:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2021-1-3 12:35:06 | 显示全部楼层
forever123 发表于 2021-1-3 12:27
我现在就卡在这步,
传递来的 参数判断为图元名后我该怎么办,
怎么判断它是多段线,如果是多段线的话 ...

ARX C++库很方便啊

if (rb->restype != RTENAME)
    return RSRSLT;
AcDbObjectId mId;
if ( acdbGetObjectId(mId,rb->resval.rlname) != Acad::eOk)
   return RSRSLT;
AcDbPolyLine *pLine;
if (AcDbOpenObject(pLine,mId,kForRead) != Acad::eOk)
   return RSRSLT;
......
pLine->close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-4 14:15:36 | 显示全部楼层
newer 发表于 2021-1-3 12:35
ARX C++库很方便啊

if (rb->restype != RTENAME)

通过newer老师,XDSoft老师的指点,以及在论坛上各位高手的帖子,东拼西凑,实现如下。
  1. static int ads_Hxlisp()
  2.         {
  3.                 struct resbuf *prb = acedGetArgs();
  4.                 struct resbuf *rbb = acedGetArgs();

  5.                 if (prb == NULL)
  6.                 {
  7.                         acedPrompt(TEXT("参数太少"));
  8.                         acedRetVoid();
  9.                         return RTNORM;
  10.                 }
  11.                
  12.                 if (prb->restype != RTENAME)
  13.                 {
  14.                         acedPrompt(TEXT(";错误,参数类型错误,应为图元名"));
  15.                         acedRetVoid();
  16.                         return RTNORM;
  17.                 }

  18.                 AcDbObjectId objId;
  19.                 AcDbPolyline  *pLine;
  20.                 if (acdbGetObjectId(objId, rbb->resval.rlname) != Acad::eOk)
  21.                         return RSRSLT;

  22.                 if (acdbOpenObject(pLine, objId, kForRead) != Acad::eOk)
  23.                         return RSRSLT;

  24.                 prb = prb->rbnext;
  25.                 if (prb->restype != RTSHORT)
  26.                 {
  27.                         acedPrompt(TEXT(";错误,参数类型错误,应为整数"));
  28.                         acedRetVoid();
  29.                         return RTNORM;
  30.                 }
  31.                 short real ;
  32.                 real = prb->resval.rint;

  33.                 acutRelRb(prb);
  34.                 acutRelRb(rbb);

  35.                 struct resbuf *rbbb = acedGetArgs();
  36.                 int n;//设置多段线顶点个数
  37.                 switch (real)
  38.                 {
  39.                 case 0:
  40.                         n = pLine->numVerts();//获取顶点个数
  41.                         acedRetInt( n);
  42.                         return RTNORM;
  43.                         break;
  44.                 case 1:
  45.                         n = pLine->numVerts();//获取顶点个数
  46.                         rbbb = acutBuildList(RTSHORT, n,  RTNONE);
  47.                         for (int i = 0; i < n; i++)
  48.                         {
  49.                                 AcGePoint3d pt;
  50.                                 pLine->getPointAt(i, pt);
  51.                                 rbbb = acutBuildList(RTRESBUF, rbbb, RT3DPOINT, pt, RTNONE);
  52.                         }
  53.                         acedRetList(rbbb);
  54.                         return RTNORM;
  55.                         break;
  56.                 }
  57.                 acutRelRb(rbbb);//不知道怎么处理,有没有用就放在这了,往高手指点。
  58.         }
  59.        
复制代码

本人初学,望各位老师指点指点,如何优化,谢谢!!

点评

你的代码里面返回既有 RTNORM,还有 RSRSLT 要统一,根据你定义的外部函数, 如果没有注册,返回都是RTNORM, 否则返回都是RSRSLT  详情 回复 发表于 2021-1-5 02:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2021-1-5 02:59:08 | 显示全部楼层
本帖最后由 newer 于 2021-1-5 03:14 编辑
forever123 发表于 2021-1-4 14:15
通过newer老师,XDSoft老师的指点,以及在论坛上各位高手的帖子,东拼西凑,实现如下。
        
本人初学,望 ...

你的代码里面返回既有
RTNORM,还有 RSRSLT

1、要统一,根据你定义的外部函数,
如果没有注册,返回都是RTNORM, 否则返回都是RSRSLT
2、另外你OPEN了对象读,最后一定要关闭
pline->close();
3、用一个指针获得 acedGetArgs()就可以了,你代码里面获得了多次
4、参数给整数1的情况下,你要动态建立个点表,用两个refbuf 指针,一个头指针供返回用,另外一个遍历,通过rbnext指针把点给串起来。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-14 20:31:19 | 显示全部楼层
newer 发表于 2021-1-5 02:59
你的代码里面返回既有
RTNORM,还有 RSRSLT


研究了几天,第四条有点没有明白。
用两个refbuf 指针,一个是用来遍历,一个最后销毁,那新建的refbuf 指针最后不用销毁吗?
如果不用销毁那直接用第一个refbuf 指针用来遍历不可以吗?
第二个就是如果我在中途跳出函数,那跳出的时候对于第一个 refbuf 指针 要不要用来销毁?
                if (prb == NULL)
                {
                        acedPrompt(TEXT("参数太少"));
                        acutRelRb(prb)
                        acedRetVoid();
                        return RTNORM;
                }
谢谢 回复

点评

if (prb == NULL) { acedPrompt(TEXT("参数太少")); acutRelRb(prb) acedRetVoid(); retu  详情 回复 发表于 2021-1-14 20:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-1-14 20:39:18 | 显示全部楼层
指针就是内存地址,不能同一个内存区域释放多次

头指针保存好,另外一个遍历指针遍历,

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2021-1-14 20:44:37 | 显示全部楼层
forever123 发表于 2021-1-14 20:31
研究了几天,第四条有点没有明白。
用两个refbuf 指针,一个是用来遍历,一个最后销毁,那新建 ...

if (prb == NULL)
                {
                        acedPrompt(TEXT("参数太少"));
                        acutRelRb(prb)
                        acedRetVoid();
                        return RTNORM;
                }

上面错了,NULL指针不能释放

这段代码放在最后,只有不是NULL的时候,才做,你写反了

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

使用道具 举报

 楼主| 发表于 2021-1-15 13:06:56 | 显示全部楼层
newer 发表于 2021-1-14 20:44
if (prb == NULL)
                {
                        acedPrompt(TEXT("参数太少"));

不好意思 ,我没有说明白
lisp 传递参数 obj:图元名,n:0或1的整数 ,
调用上面函数 ads_Hxlisp( obj  n),
但不小心把 n 的参数写成了字符串 “0”
那函数运行到下面这步时会跳出函数,因为不是RTSHORT类型。
static int ads_Hxlisp()
        {
                struct resbuf *prb = acedGetArgs();
               .
               .
               .
                prb = prb->rbnext;
                if (prb->restype != RTSHORT)
                {
                        acedPrompt(TEXT(";错误,参数类型错误,应为整数"));
                        acutRelRb(prb) 是不是在这里需要增加这一行
                        acedRetVoid();
                        return RTNORM;
                }
               .
               .
               .
        }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-15 13:40:41 | 显示全部楼层
Lisphk 发表于 2021-1-14 20:39
指针就是内存地址,不能同一个内存区域释放多次

头指针保存好,另外一个遍历指针遍历,

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 13:29 , Processed in 0.435431 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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