设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2952|回复: 10

[分享] 初学ARX写的第一个程序,让 LISP也能使用关键字的SSget

[复制链接]

点击这里给我发消息

发表于 2013-5-12 18:09:14 | 显示全部楼层 |阅读模式

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

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

x
一直以来都是使用LISP编写一些简单的程序自用,但发现LISP的SSGET用得实在太不爽了,不能自定提示和关键字。期间也试过用LISP来模仿但都达不到自己想要的效果,而是学习ARX,但发现C++学起来实在太难了,还好来到这个论坛,找到很多例子,特别是高飞大哥的源码,而是照葫芦画瓢终于写好了,帖出来希望大家能指正下。

[pcode=cpp,true]static int StampingDieSSGet(struct resbuf *rb);
static int StampingDieSSFree(struct resbuf *rb);
resbuf* ssCallback(const TCHAR* kword);
static bool Getlispresbuf(struct resbuf        *lisprb,struct resbuf **rb);
TCHAR *PfunctionName;
const TCHAR *outkword;
static bool Getlispresbuf(struct resbuf        *lisprb,struct resbuf **rb)
{
        if (lisprb->restype != RTLB)
        {
                return false;
        }
        lisprb = lisprb->rbnext;
        struct resbuf *rb1 =NULL;
        struct resbuf *rb2 = NULL;
        do
        {
                struct resbuf *temrb = acutNewRb(abs(lisprb->restype));
                temrb->restype = lisprb->restype;
                temrb->resval = lisprb->resval;
                if (rb1 == NULL)
                {
                        rb1 = rb2 = temrb;
                }
                else
                {
                        rb2->rbnext = temrb;
                        rb2 = rb2->rbnext;
                }
                lisprb = lisprb->rbnext;
        } while (lisprb != NULL && lisprb->restype != RTLE);
        *rb = rb1;
        return true;
}
resbuf* ssCallback(const TCHAR* kword)
{
        resbuf *result = NULL;
        resbuf *rb_in = NULL;
        outkword  = kword;
        if(PfunctionName != NULL)
        {
                rb_in = acutBuildList(RTSTR,PfunctionName,RTSTR,kword,RTNONE);
                int ret = acedInvoke(rb_in,&result);
        }
        else
        {
                throw kword;
        }
        return result;
}
static int StampingDieSSGet(struct resbuf *rb)
{
        resbuf* (*oldFunc)(const ACHAR*);
        acedSSGetKwordCallbackPtr(&oldFunc);
        outkword = NULL;
        PfunctionName = NULL;
        TCHAR *promptStr=NULL;
        ACHAR *kwordStr=NULL;
        struct resbuf *filterrb = NULL;
        //不带参数运行提示字符串
        if(rb == NULL)
        {
                promptStr = _T("选择对象: ");
                goto StartSSget;
        }
        //提示字符串
        if(rb->restype == RTSTR)
        {
                promptStr = rb->resval.rstring;
        }
        else if(rb->restype == RTLB)
        {
                promptStr = _T("选择对象: ");
                Getlispresbuf(rb,&filterrb);
                goto StartSSget;
        }
        else
        {
                acutPrintf(_T("\n错误: 参数错误"));
                return RTERROR;
        }
        rb = rb->rbnext;
        if(rb == NULL)
        {
                goto StartSSget;
        }
        //关键字
        if (rb->restype == RTSTR)
        {
                kwordStr = rb->resval.rstring;
                rb = rb->rbnext;
                if(rb == NULL)
                {
                        goto StartSSget;
                }
                //回调函数
                if(rb->restype == RTSTR)
                {
                        PfunctionName = rb->resval.rstring;
                        rb = rb->rbnext;
                        if(rb == NULL)
                        {
                                goto StartSSget;
                        }
                        //过虑表
                        else if (rb->restype == RTLB)
                        {
                                Getlispresbuf(rb,&filterrb);
                        }
                        else
                        {
                                acutPrintf(_T("\n错误: 第四个参数过虑表"));
                                return RTERROR;
                        }
                }
                //过虑表
                else if(rb->restype == RTLB)
                {
                        Getlispresbuf(rb,&filterrb);
                        goto StartSSget;
                }
                else
                {
                        acutPrintf(_T("\n错误: 第三个参数为回调函数字符串或过虑表"));
                        return RTERROR;
                }
        }
        //过虑表
        else if(rb->restype == RTLB)
        {
                Getlispresbuf(rb,&filterrb);
                goto StartSSget;
        }
        else
        {
                acutPrintf(_T("\n错误: 第二参数为关键字或过虑表"));
                return RTERROR;
        }

StartSSget:
        TCHAR *prorptlist[] = {promptStr,_T("删除对象: ")};
        ads_name ss;
        try
        {
                if(kwordStr != NULL)
                {
                        acedSSSetKwordCallbackPtr(ssCallback);
                        if (RTNORM == acedSSGet(_T("_:$:K"),prorptlist,kwordStr,filterrb,ss))
                        {
                                acedRetName(ss,RTPICKS);
                                //acedSSFree(ss);
                        }
                }
                else
                {
                        if (RTNORM == acedSSGet(_T("_:$"),prorptlist,NULL,filterrb,ss))
                        {
                                acedRetName(ss,RTPICKS);
                                //acedSSFree(ss);
                        }
                }
                acedSSSetKwordCallbackPtr(*oldFunc);
        }
        catch(...)  
        {
                if(outkword != NULL)
                {
                        acedRetStr(outkword);

                }
                else
                {
                        acedRetNil();
                }
                acedSSFree(ss);
                acedSSSetKwordCallbackPtr(*oldFunc);
        }
        return 0;
};
static int StampingDieSSFree(struct resbuf *rb)
{
        if(rb == NULL)
        {
                acutPrintf(_T("\n错误: 参数为空"));
                return RTERROR;
               
        }
        if(rb->restype != RTPICKS)
        {
                acutPrintf(_T("\n错误: 参数类型错误."));
                return RTERROR;
        }
        ads_name ss ;
        ads_name_set(rb->resval.rlname,ss);
        acedSSFree(ss);
        acedRetT();
        return RTNORM;
};[/pcode]

评分

参与人数 2D豆 +6 收起 理由
ScmTools + 2 技术讨论奖!
XDSoft + 4 出题引导交流奖!

查看全部评分

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

点击这里给我发消息

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-12 18:23:05 | 显示全部楼层
能编译成个ARX贴论坛吗? 让大家用LISP调用测试测试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1632个

财富等级: 堆金积玉

发表于 2013-5-12 18:35:21 | 显示全部楼层
希望LZ增加一个完整的测试例子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

点击这里给我发消息

 楼主| 发表于 2013-5-12 22:21:24 | 显示全部楼层
ScmTools 发表于 2013-5-12 18:35
希望LZ增加一个完整的测试例子

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

使用道具 举报

点击这里给我发消息

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-12 23:02:40 | 显示全部楼层
比我当初自己写的第一个ARX程序厉害多了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

点击这里给我发消息

 楼主| 发表于 2013-5-12 23:09:38 | 显示全部楼层
XDSoft 发表于 2013-5-12 23:02
比我当初自己写的第一个ARX程序厉害多了。

我这是照着高飞大哥的例子描出来的,还有你说的释放内存,要怎么释放,指针变量都需要释放吗?能不能给个例子?我写的都没释放的,运行久了会不会有问题?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

点击这里给我发消息

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-12 23:32:44 | 显示全部楼层
Gdlprfcu 发表于 2013-5-12 23:09
我这是照着高飞大哥的例子描出来的,还有你说的释放内存,要怎么释放,指针变量都需要释放吗?能不能给个 ...

你这么理解就行了

1、你定义的指针只是指向的一个内存地址
2、这个指针指向的内存在程序中是否被你分配内存了,如果是,那么程序结束的地方要释放它。不释放,内存没了就死呗、内存不足,系统慢呗,不释放你分配的内存,名词叫 “内存泄露”。、
     如果没分配的话,你只是引用,那么就不用释放。
3、ARX中释放的一般是选择集,用malloc分配的字符串内存。。。。
4、你不清楚的,你就程序里面先释放,然后编译运行,如果系统蹦了,你在改回来,不蹦,就是对了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

点击这里给我发消息

 楼主| 发表于 2013-5-13 12:11:21 | 显示全部楼层
XDSoft 发表于 2013-5-12 23:32
你这么理解就行了

1、你定义的指针只是指向的一个内存地址

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

使用道具 举报

已领礼包: 913个

财富等级: 财运亨通

发表于 2020-4-1 17:53:33 | 显示全部楼层
编译几个新版吧,2014 2016 2018 2019 2020 2021
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-10-21 15:14 , Processed in 0.162264 second(s), 67 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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