找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4051|回复: 17

[教学] 带关键字的SSGET终极解决方案

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-9-24 01:48:25 | 显示全部楼层 |阅读模式

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

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

×
2016.0923版本的API终于对带关键字的SSGET提供了“终极”的解决方案。

带关键字的SSGET一直是LISPER想要的东西,但受限于LISP的功能,不管LISP哪种解决方案,都不能把SSGET的选择和GETXXX类的关键字完美的结合。
API由于依托ARX,因此把ARX的acedSSGetKwordPtr()等功能和LISP的使用习惯结合封装起来,带来了API函数 xdrx_initSSGet和xdrx_ssget函数。

如对于GETXXX类的关键字设置需要函数initget一样,xdrx_ssget需要xdrx_initssget 函数预设关键字和其他信息

一、xdrx_initssget函数用法:

(xdrx_initSSGet <"选择对象提示字符串"> ["关键字"] ["移除对象提示字符串"] ["关键字回调函数"] ["非关键字输入回调函数"])
<>之间参数是必选项,[]之间是可选参数。

1、选择对象提示字符串: 让SSGET再也不是看着一成不变的 “选择对象:”提示字符串了,可以定制自己的提示字符串。2、关键字: 输入的关键字之间空格隔开,不要和SSGET自己的“固定”的关键字冲突,比如W,C,WP,CP等等。
3、移除对象提示字符串: 定制自己的在SSGET输入R时候的提示字符串。
4、关键字回调函数:在输入关键字后,激活调用的处理关键字的函数(可选)
5、非关键字回调函数:输入非关键字时候,调用的处理函数(可选)

API有两套方案处理关键字:

1、给 回调函数参数:
        特点,不中断SSGET的情况下,回调函数处理关键字后需要处理的函数完成需要的工作。回调函数执行完,继续SSGET的进程。
2、不给回调函数:
        特点,如同我们习惯的GETXXX类函数的关键字处理方式,在给关键字参数情况下,如果不给回调函数参数或者回调函数给“”,那么在输入关键字的时候,结束SSGET,返回字符串给LISP。

二、选择集函数xdrx_ssget,参数如同普通的SSGET函数参数一样。

下面给两套处理关键字的示例程序:

1、xdrx_initSSGet里面,给关键字和回调函数参数,不中断SSGET的情况下,处理关键字,输入偏移多段线的距离。

  1. (defun c:tt()
  2.    (xdrx_begin)
  3.    (if (not #wid)
  4.      (setq #wid 10)
  5.    )
  6.    (xdrx_initssget "选取要偏移的曲线[设置(XL)]<退出>:"  ;;选取对象提示字符串
  7.                    "XL" ;;关键字
  8.                    ""   ;;移除对象提示字符串
  9.                    "_callback"  ;;关键字回调函数
  10.                    "_callback1" ;;非关键字回调函数
  11.    )
  12.    (defun _callback(kword)
  13.       (princ (strcat "\n选择了关键字: " kword))
  14.       (if (= kword "XL")
  15.          (if (setq wid (getreal (xdrx_prompt "\n请输入偏移距离<" #wid ">:" t)))
  16.            (setq #wid wid)
  17.          )
  18.       )
  19.       (princ)     
  20.    )
  21.    (defun _callback1(kword)
  22.      (princ)
  23.    )
  24.    (if (setq ss (xdrx_ssget '((0 . "LWPOLYLINE")(-4 . "&=")(70 . 1))))
  25.       (progn
  26.          (xdrx_curve_getoffsetcurves ss #wid)
  27.       )
  28.    )
  29.    (xdrx_end)
  30.    (princ)
  31. )



2、同普通GETXXX类函数处理关键字一样的代码结构,根据返回的关键字进行处理(期间中断SSGET)

  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (if (not #wid)
  4.     (setq #wid 10)
  5.   )
  6.   (setq tf t)
  7.   (while (and
  8.            tf
  9.            (xdrx_initssget  "选取要偏移的曲线[设置(XL)]<退出>:"  "XL" "" "" "")
  10.            (setq ss (xdrx_ssget))
  11.          )
  12.       (setq tf1 (type ss))
  13.       (cond
  14.         ((= tf1 'STR)
  15.           (if (= ss "XL")
  16.             (if (setq wid (getreal (xdrx_prompt "\n请输入偏移距离<" #wid
  17.                                                 ">:" t
  18.                                    )
  19.                           )
  20.                 )
  21.               (setq #wid wid)
  22.             )
  23.           )
  24.         )
  25.         ((= tf1 'PICKSET)
  26.           (xdrx_curve_getoffsetcurves ss #wid)
  27.           (setq tf nil)
  28.         )
  29.       )
  30.   )
  31.   (xdrx_end)
  32.   (princ)
  33. )



带关键字的SSGET终极解决方案

带关键字的SSGET终极解决方案


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

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-9-24 17:00:15 | 显示全部楼层
本帖最后由 newer 于 2016-9-24 17:03 编辑

其实,把上面第二种方案改写成这样:

  1. (defun c:tt ()
  2.   (defun _getdist ()
  3.     (if        (setq wid (getreal (xdrx_prompt
  4.                              "\n请输入偏移距离<"
  5.                              #wid
  6.                              ">:"
  7.                              t
  8.                            )
  9.                   )
  10.         )
  11.       (setq #wid wid)
  12.     )
  13.   )
  14.   (xdrx_begin)
  15.   (if (not #wid)
  16.     (setq #wid 10)
  17.   )
  18.   (setq tf t)
  19.   (while (and
  20.            tf
  21.            (xdrx_initssget
  22.              "选取要偏移的曲线[设置(XL)]<退出>:"
  23.              "XL"                     ""
  24.              ""                             ""
  25.             )
  26.            (setq ss (xdrx_ssget))
  27.          )
  28.     (setq tf1 (type ss))
  29.     (cond
  30.       ((= tf1 'STR)
  31.        (if (= ss "XL")
  32.          (_getdist)
  33.          ;; 调用函数(是不是就相当于第一种方案的回调函数了?)
  34.        )
  35.       )
  36.       ((= tf1 'PICKSET)
  37.        (xdrx_curve_getoffsetcurves ss #wid)
  38.        (setq tf nil)
  39.       )
  40.     )
  41.   )
  42.   (xdrx_end)
  43.   (princ)
  44. )


再和第一种方案比较,第一种方案就是把函数 _getdist() 放入 xdrx_initssget里面声明了,判断是否输入关键字和处理都在xdrx_ssget内部处理了,不中断ssget的过程,代码更简短(没有WHILE循环和COND判断关键字),效率也更高了。

可以省去上面代码:
  1.     (cond
  2.       ((= tf1 'STR)
  3.        (if (= ss "XL")
  4.          (_getdist)
  5.          ;; 调用函数(是不是就相当于第一种方案的回调函数了?)
  6.        )
  7.       )
  8.       ((= tf1 'PICKSET)
  9.        (xdrx_curve_getoffsetcurves ss #wid)
  10.        (setq tf nil)
  11.       )
  12.     )

的部分。
  1. (if (setq ss (xdrx_ssget '((0 . "LWPOLYLINE")(-4 . "&=")(70 . 1))))
  2.       (progn
  3.          (xdrx_curve_getoffsetcurves ss #wid)
  4.       )
  5.    )


相当于

  1.   (while (and
  2.            tf
  3.            (xdrx_initssget
  4.              "选取要偏移的曲线[设置(XL)]<退出>:"
  5.              "XL"                     ""
  6.              ""                             ""
  7.             )
  8.            (setq ss (xdrx_ssget))
  9.          )
  10.     (setq tf1 (type ss))
  11.     (cond
  12.       ((= tf1 'STR)
  13.        (if (= ss "XL")
  14.          (_getdist)
  15.          ;; 调用函数(是不是就相当于第一种方案的回调函数了?)
  16.        )
  17.       )
  18.       ((= tf1 'PICKSET)
  19.        (xdrx_curve_getoffsetcurves ss #wid)
  20.        (setq tf nil)
  21.       )
  22.     )
  23.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

发表于 2016-9-24 20:13:28 | 显示全部楼层
多谢N版,这说明够细致的,我好好看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

发表于 2016-9-24 20:17:21 | 显示全部楼层
如果设置了关键字回调函数,是不是必须写非关键字回调函数?哪怕不需要做任何事,也不能像第二种写法一样只给个""?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-9-24 20:28:34 | 显示全部楼层

1、只有  选择提示字符串是必须有的,其他都可选
2、如果给了关键字,也给了回调函数,那么就是第一种方案
3、如果给了关键字,不给关键字回调函数,是第二种方案,
4、非关键字回调函数无关紧要,给不给都不影响。这个是为了适合ARX功能的扩展,目前永远不给或者给"" 都行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 177个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

发表于 2016-9-26 16:50:06 | 显示全部楼层
用了一下,对关键字有限制,如"A" "W" "R"等,都不可作为关键字,initget没有这个限制
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-9-26 16:54:16 | 显示全部楼层

SSGET   自己的那些关键字,你是不能和他们冲突的,不能改变他们,他们是保留的关键字,如果 A,R,ALL,C,CP,W,WP,F .......
initget之所以可以,是因为这些关键字在那个场合没用到。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-9-26 16:55:22 | 显示全部楼层

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

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

发表于 2016-9-26 17:08:45 | 显示全部楼层
还有"L""C""P",基本上预设的关键字都不行
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

发表于 2016-9-26 17:11:26 | 显示全部楼层
(xdrx_initget "K H R Z A")
      (xdrx_initssget
        "\n{K}风量复制 / {H}最大高度 / {R}宽高比 / {Z}风量逐段求和 / {A}自动计算 / 选择要计算尺寸的风管管段:"
        "K H R Z A" "" "" "")
      (setq ss
             (xdrx_ssget ":L" (list (cons 0 "LINE,ARC") (cons 8 fg_lst)))
      )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

发表于 2016-9-26 17:20:41 | 显示全部楼层

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

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

发表于 2016-9-26 20:05:35 | 显示全部楼层
能不能加个强制返回任何键的开关?有时候用预设的关键字好记
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 22:11 , Processed in 0.513912 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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