找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4621|回复: 11

[研讨] 再说 带关键字的ssget

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-11-22 09:18:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 /db_自贡黄明儒_ 于 2013-11-22 09:20 编辑

;|下面看格式刷
'_matchprop
Select source object:
Select destination object(s) or [Settings]:
最后一行时,我们可以直接选取目标,也可以输入"S"来进行设置,这就是特别之处。ll_j为我指点了一下,说飞诗的[带关键字的ssget]http://bbs.mjtd.com/thread-71545-1-1.html是他见过的最好的。昨天静心研读了一下,希望站在巨人的肩上看得更远,结果未如愿,看下面的程序Myssget,比较接近matchprop的用法了。Myssget可以输入一次S来进行设置,而matchprop可以任何时候输入S进行设置

initget之后,只有entsel起作用,ssget不起作用,飞诗还是开始打的entsel的主意
.各位有没有更好的办法呢?

|;

  1. ;;带关键字的ssget
  2. ;;(sslength(Myssget "\n 选择目标对象或 [设置(S)]:" "S " '((0 . "line"))))
  3. (defun Myssget (Msg Kwd Fil)
  4.   ;;带过滤器的entsel
  5.   (defun MyEntsel (msg fil / ENP)
  6.     (princ "\n")
  7.     (setq enp (entsel msg))
  8.     (cond ((equal (type enp) 'STR) (DoSth enp))
  9.           (T (and enp (ssget (cadr enp) fil)))
  10.     )
  11.     enp
  12.   )
  13.   ;;initget时do
  14.   (defun DoSth (enp)
  15.     (princ enp)
  16.   )
  17.   ;;点化字串
  18.   (defun Pt2Str        (pt)
  19.     (strcat (rtos (car pt) 2 3)
  20.             ","
  21.             (rtos (cadr pt) 2 3)
  22.             ","
  23.             (rtos (caddr pt) 2 3)
  24.             "\n"
  25.     )
  26.   )

  27.   (or *DOC*
  28.       (setq *DOC* (vla-get-ActiveDocument (vlax-get-acad-object)))
  29.   )
  30.   (cond        ((cadr (ssgetfirst)) (ssget "_P" fil))
  31.         (t
  32.          (initget Kwd)                                            ;随后调用entsel时
  33.          (cond ((and (listp (MyEntsel Msg Fil))
  34.                      (/= 52 (getvar "errno"))
  35.                 )
  36.                 (vla-sendcommand *doc* (Pt2Str (cadr (grread t))))
  37.                 (ssget Fil)
  38.                )
  39.                (T (ssget Fil))
  40.          )
  41.         )
  42.   )
  43. )

  1. ;;调用系统格式刷,主要是显示那把刷子,do nothing
  2. (defun C:test (/ E)
  3.   (setq e (car (entsel)))
  4.   (COMMAND "MATCHPROP" E)
  5.   (sslength
  6.     (Myssget "\n 选择目标对象或 [设置(S)]:" "S " '((0 . "line")))
  7.   )
  8.   (while (not (equal (getvar "cmdnames") "")) (command nil))
  9. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-11-22 09:41:58 | 显示全部楼层
大概从AutoLisp开始植入ACAD并被用户使用时,ssget不带关键字的这个问题就一直是大家的纠结,相信很多朋友在学习Alisp的时候也都试着解决这个问题,似乎都没有结果,或者说,结果都并不理想。
个人以为,飞诗的这段代码算是目前所能找到的Lisp代码中最好的,虽然也有一定的局限性和不尽人意的地方,但一般情况是可以应付的,他的这个思路也是被大家称作巧妙的,可惜后来就没有人再能试着更完善了。
一直想不通,自动桌子公司不知为什么就不把ssget扩展一下,在他们那里,这应该是比较容易的。
虽然说Lisp“无所不能”,但对普通用户而言,用Lisp去扩展这个功能的确不是一件容易的事。
根据对目前活跃在论坛的各位高手的了解,G版如果有兴趣,有结果的几率应该较高。

点评

这么一说,我就差不多绝望和死心了  详情 回复 发表于 2013-11-22 10:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-22 10:29:45 来自手机 | 显示全部楼层
ssget直接跟关键字还是有难度,因为ssget后面用了一些字符做模式的,"S" "F" "WP" "CP" "C" "W" "F" "A" "P"等等

点评

飞诗考虑这些,"W L C BOX ALL F WP CP G A R M P U AU SI",我倒觉得不用考虑它。因为其中调用ssget时,这些关键字照样可用。关键是我希望它响应别的关键字,从而do 一些事情。  详情 回复 发表于 2013-11-22 10:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-11-22 10:35:11 | 显示全部楼层
st788796 发表于 2013-11-22 10:29
ssget直接跟关键字还是有难度,因为ssget后面用了一些字符做模式的,"S" "F" "WP" "CP" "C" "W" "F" "A" "P ...

飞诗考虑这些,"W L C BOX ALL F WP CP G A R M P U AU SI",我倒觉得不用考虑它。因为其中调用ssget时,这些关键字照样可用。关键是我希望它响应别的关键字,从而do 一些事情。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-11-22 10:36:51 | 显示全部楼层
ll_j 发表于 2013-11-22 09:41
大概从AutoLisp开始植入ACAD并被用户使用时,ssget不带关键字的这个问题就一直是大家的纠结,相信很多朋友 ...

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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-11-22 11:26:50 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-11-22 10:36
这么一说,我就差不多绝望和死心了

这也不一定,早期我试着做的时候还是纯Alisp,确实不行,说实在的,对函数的理解也不够,后来出了Vlisp,情况可能有些转机,飞诗的这段代码就是在Vlisp基础上的,这几年Vlisp也有了很大的提升(看G版的程序就有“只有做不到没有想不到”的感觉),有意的话,或许能有突破。
不过这里有一个是否值得的问题,说根本的,这个问题还是应该自动桌子来做,毕竟固化的函数是不局限于Lisp语言的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-22 16:27:11 | 显示全部楼层
本帖最后由 牢固 于 2013-11-22 16:28 编辑

  1. ;;自定义SSGet框架,By Gu_xl;;参数 KWORD = 自定义关键字字串,可为nil
  2. ;;     MSG = 提示信息,可为nil
  3. ;;     FILTER = SSGET 过滤表
  4. ;;     FUN = 根据关键字要执行的函数,(FUN KeyPosion SS),该函数返回值 '(T or nil<是否结束SSGET> 函数返回选择集)
  5. (defun ssget1 (KWORD        MSG   FILTER FUN          /        KWD   KWDS  KWORDS
  6.                   LOOP        SS    RES   E          N        E1    GO    GR          PT
  7.                   P3        P1    P2    P4          A
  8.                  )
  9.   ;;ssget自带的关键字,在KWORD中无需输入,可自动响应
  10.   ;;(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)
  11.   ;;/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)
  12.   (setq        kwd  "W L C BOX ALL F WP CP G A R M P U AU SI"
  13.         kwds '("W" "L" "C" "BOX" "ALL" "F" "WP"        "CP" "G" "A" "R" "M" "P"
  14.                "U" "AU"        "SI")
  15.   )
  16.   (if kword
  17.     (progn
  18.       (setq kwords (mapcar 'VL-PRINC-TO-STRING (read (strcat "(" kword ")"))))
  19.       (setq kwd (strcat kwd " " kword))
  20.     )
  21.   )
  22.   (if (null msg)
  23.     (if        kwords
  24.       (setq msg        (strcat        "\n选择对象["
  25.                         (if kwords
  26.                           (strcat
  27.                             (car kwords)
  28.                             (apply
  29.                               'strcat
  30.                               (apply
  31.                                 'mapcar
  32.                                 (cons
  33.                                   'strcat
  34.                                   (list
  35.                                     (mapcar
  36.                                       '(lambda (x) "/")
  37.                                       (cdr kwords)
  38.                                     )
  39.                                     (cdr kwords)
  40.                                   )
  41.                                 )
  42.                               )
  43.                             )
  44.                           )
  45.                           ""
  46.                         )
  47.                         "]:"
  48.                 )
  49.       )
  50.       (setq msg "\n选择对象:")

  51.     )
  52.   )
  53.   (setq        loop t
  54.         ss   (ssadd)
  55.   )
  56.   (while loop
  57.     (setvar 'errno 0)
  58.     (initget kwd)
  59.     (setq res (entsel msg))
  60.     (setq curpt (cadr (grread t 15)))

  61.     (if        (/= 52 (getvar 'errno))
  62.       (progn
  63.         (cond
  64.           ((or (not res ) (= 'list (type res)))
  65.            (setq res curpt)
  66.            (if filter
  67.              (setq e (ssget res filter))
  68.              (setq e (ssget res))
  69.            )
  70.            (if e
  71.              (repeat (setq n (sslength e))
  72.                (ssadd (setq e1 (ssname e (setq n (1- n)))) ss)
  73.                ;;亮显图元
  74.                (redraw e1 3)
  75.              )
  76.              (progn
  77.                (setq go t)
  78.                (princ "指定对角点:")
  79.                (while go
  80.                  (setq gr (grread t 15))
  81.                  (cond
  82.                    ((= 5 (car gr))
  83.                     (redraw)
  84.                     (setq pt (cadr gr))
  85.                     (if        (< (car (setq p3 (trans pt 1 0)))
  86.                            (car (setq p1 (trans res 1 0)))
  87.                         )
  88.                       (progn

  89.                         (setq
  90.                           p2 (trans (list (car p1) (cadr p3) 0) 0 1)
  91.                         )
  92.                         (setq
  93.                           p4 (trans (list (car p3) (cadr p1) 0) 0 1)
  94.                         )
  95.                         (grvecs
  96.                           (list        -7
  97.                                 (list (car res) (cadr res))
  98.                                 (list (car p2) (cadr p2))
  99.                                 -7
  100.                                 (list (car p2) (cadr p2))
  101.                                 (list (car pt) (cadr pt))
  102.                                 -7
  103.                                 (list (car pt) (cadr pt))
  104.                                 (list (car p4) (cadr p4))
  105.                                 -7
  106.                                 (list (car p4) (cadr p4))
  107.                                 (list (car res) (cadr res))
  108.                           )
  109.                         )
  110.                       )
  111.                       (progn
  112.                         (setq
  113.                           p2 (trans (list (car p1) (cadr p3) 0) 0 1)
  114.                         )
  115.                         (setq
  116.                           p4 (trans (list (car p3) (cadr p1) 0) 0 1)
  117.                         )
  118.                         (grvecs
  119.                           (list        7
  120.                                 (list (car res) (cadr res))
  121.                                 (list (car p2) (cadr p2))
  122.                                 7
  123.                                 (list (car p2) (cadr p2))
  124.                                 (list (car pt) (cadr pt))
  125.                                 7
  126.                                 (list (car pt) (cadr pt))
  127.                                 (list (car p4) (cadr p4))
  128.                                 7
  129.                                 (list (car p4) (cadr p4))
  130.                                 (list (car res) (cadr res))
  131.                           )
  132.                         )
  133.                       )
  134.                     )
  135.                    )
  136.                    ((= 3 (car gr))
  137.                     (redraw)
  138.                     (setq go nil)
  139.                     (if        (< (car (setq p3 (trans pt 1 0)))
  140.                            (car (setq p1 (trans res 1 0)))
  141.                         )
  142.                       (progn
  143.                         (if filter
  144.                           (setq e (ssget "c" res (cadr gr) filter))
  145.                           (setq e (ssget "c" res (cadr gr)))
  146.                         )
  147.                         (if e
  148.                           (repeat (setq n (sslength e))
  149.                             (ssadd (setq a (ssname e (setq n (1- n))))
  150.                                    ss
  151.                             )
  152.                             ;;亮显图元
  153.                             (redraw a 3)
  154.                           )
  155.                         )
  156.                       )
  157.                       (progn
  158.                         (if filter
  159.                           (setq e (ssget "w" res (cadr gr) filter))
  160.                           (setq e (ssget "w" res (cadr gr)))
  161.                         )
  162.                         (if e
  163.                           (repeat (setq n (sslength e))
  164.                             (ssadd (setq a (ssname e (setq n (1- n))))
  165.                                    ss
  166.                             )
  167.                             ;;亮显图元
  168.                             (redraw a 3)
  169.                           )
  170.                         )
  171.                       )
  172.                     )
  173.                    )
  174.                    ((or        (= 25 (car gr))
  175.                         (and (= 2 (car gr))
  176.                              (or (= 13 (cadr gr)) (= 32 (cadr gr)))
  177.                         )
  178.                     )
  179.                     (redraw)
  180.                     (princ "\n窗口说明无效。 ")
  181.                     (princ "\n指定对角点:")
  182.                    )
  183.                  )
  184.                )
  185.              )
  186.            )
  187.           )
  188.           ((= 'str (type res))
  189.            (cond ((member (strcase res) kwds)
  190.                   (if (> (sslength ss) 0)
  191.                     (command "_select" ss res)
  192.                     (command "_select" res)
  193.                   )
  194.                   (while (= 1 (logand (getvar 'cmdactive) 1))
  195.                     (vl-cmdf pause)
  196.                   )
  197.                   (if filter
  198.                     (progn
  199.                       (setq e (ssget "_P" filter))
  200.                       (if e
  201.                         (progn
  202.                           (setq ss e)
  203.                           ;;选择集亮显
  204.                           (repeat (setq n (sslength ss))
  205.                             (redraw (ssname ss (setq n (1- n))) 3)
  206.                           )
  207.                         )
  208.                       )
  209.                     )
  210.                     (progn
  211.                       (setq e (ssget "_P"))
  212.                       (if e
  213.                         (progn
  214.                           (setq ss e)
  215.                           ;;选择集亮显
  216.                           (repeat (setq n (sslength ss))
  217.                             (redraw (ssname ss (setq n (1- n))) 3)
  218.                           )
  219.                         )
  220.                       )
  221.                     )
  222.                   )
  223.                  )
  224.                  ((and kwords (setq pos (VL-POSITION (strcase res) kwords)))
  225.                   ;;根据关键字来执行函数FUN
  226.                   (setq result (vl-catch-all-apply (if (= 'SYM (type fun)) fun (function fun)) (list pos ss)))
  227.                   (if (not (VL-CATCH-ALL-ERROR-P result))
  228.                     (progn
  229.                       (setq loop (car result)
  230.                             ss (cadr result)
  231.                             )
  232.                      
  233.                       )
  234.                     )

  235.                  )
  236.                  (t
  237.                   (princ "\n错误关键字:")
  238.                  )
  239.            )
  240.           )
  241.         )
  242.       )
  243.       (setq loop nil) ;_ 跳出循环
  244.     )
  245.   )
  246.   (if (and ss (> (sslength ss) 0))
  247.     (progn
  248.       ;;取消选择集亮显
  249.       (repeat (setq n (sslength ss))
  250.         (redraw (ssname ss (setq n (1- n))) 4)
  251.       )
  252.       (command "_select" ss "")
  253.       ;;返回选择集
  254.       ss
  255.     )
  256.   )
  257. )
  258. ;;响应的函数,自己根据需要任意编写
  259. (defun MyFun (pos ss)
  260.   (if ss
  261.   (cond ((= 0 pos) ;_ 第一个关键字响应,复制对象
  262.          (command "_copy" ss "" pause pause)
  263.          )
  264.         ((= 1 pos) ;_ 第二个关键字响应,移动对象
  265.          (command "_move" ss "" pause pause)
  266.          )
  267.         )
  268.     )
  269.   (list t ss)
  270.   )
  271. ;;使用测试
  272. (ssget1 "CO MO" "选择物体或[复制COpy/移动MOve]:" nil MyFun)


点评

好复杂的代码,得好好学习一下  详情 回复 发表于 2013-11-22 16:54

评分

参与人数 2D豆 +10 收起 理由
WhoCanSay + 5 很给力!经验;技术要点;资料分享奖!
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-11-22 16:54:14 | 显示全部楼层

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-9-20 22:49:43 | 显示全部楼层

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-9-20 22:54:52 | 显示全部楼层
不知道用 ENTSEL组合GETPOINT,GETCORNER 能不知道实现,
ENTSEL选择为空的时候,用GETCORNER拉窗口,然后用SSGET的C,CP,WP,利用窗口来构建选择集。

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

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 3186个

财富等级: 富可敌国

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 00:14 , Processed in 0.481835 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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