明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 25304|回复: 44

[原创]带关键字的ssget

    [复制链接]
发表于 2008-11-4 12:03:00 | 显示全部楼层 |阅读模式
本帖最后由 飞诗(fsxm) 于 2011-10-25 11:50 编辑

虽然理论上可以为任意的关键字,
但是为了保持与CAD的选择的习惯一致
在这个函数中我特意摒避了CAD内置于SSGET中的关键字~
主要思路给出来了,要别的类似效果的自己改下就成!
同时也请大家严格尊重用户习惯~不要乱用系统内置关键字。

  1. ;;函数库(用FSTL用户可以不加)
  2. ;;带关键字的ssget
  3. (defun fsxm-ssget (Msg Kwd Fil / Kwd0 pt var)
  4.   (cond        ((cadr (ssgetfirst)))
  5.         (t
  6.          (setq Kwd0 "W L C BOX ALL F WP CP G A R M P U AU SI")
  7.          (initget (strcat Kwd0 " " kwd))
  8.          (cond ((and (listp (setq var (fsxm-entsel Msg Fil)))
  9.                      (/= 52 (getvar "errno"))
  10.                 )
  11.                 (setq pt (mapcar 'fsxm-tostring (cadr (grread t))))
  12.                 (vla-sendcommand *doc* (strcat (fsxm-join pt ",") "\n"))
  13.                 (ssget Fil)
  14.                )
  15.                ((member var (fsxm-split Kwd0 " "))
  16.                 (vla-sendcommand *doc* (strcat var "\n"))
  17.                 (ssget Fil)
  18.                )
  19.                (t var)
  20.          )
  21.         )
  22.   )
  23. )


下面是完整的版本:
  1. (vl-load-com)
  2. (setq *acad* (vlax-get-acad-object))
  3. (setq *doc* (vla-get-ActiveDocument *acad*))
  4. ;;带过滤器的entsel
  5. (defun Fsxm-entsel (msg filter)
  6.   (setq enp (entsel msg))
  7.   (if (or (= (type enp) 'str)
  8.           (and enp (ssget (cadr enp) filter))
  9.       )
  10.     enp
  11.   )
  12. )
  13. ;;;用分隔符解释字符串成表
  14. (defun Fsxm-Split (string strkey / po strlst xlen)
  15.   (setq xlen (1+ (strlen strkey)))
  16.   (while (setq po (vl-string-search strkey string))
  17.     (setq strlst (cons (substr string 1 po) strlst))
  18.     (setq string (substr string (+ po xlen)))
  19.   )
  20.   (reverse (cons string strlst))
  21. )
  22. ;;点化字串
  23. (defun Pt2Str (pt)
  24.   (strcat (rtos (car pt) 2 20)
  25.           ","
  26.           (rtos (cadr pt) 2 20)
  27.           ","
  28.           (rtos (caddr pt) 2 20)
  29.           "\n"
  30.   )
  31. )
  32. ;;带关键字的ssget
  33. (defun Fsxm-ssget (Msg Kwd Fil / Kwd0 pt var)
  34.   (cond        ((cadr (ssgetfirst)))
  35.         (t
  36.          (setq Kwd0 "W L C BOX ALL F WP CP G A R M P U AU SI")
  37.          (initget (strcat Kwd0 " " kwd))
  38.          (cond ((and (listp (setq var (fsxm-entsel Msg Fil)))
  39.                      (/= 52 (getvar "errno"))
  40.                 )
  41.                 (vla-sendcommand *doc* (Pt2Str (cadr (grread t))))
  42.                 (ssget Fil)
  43.                )
  44.                ((member var (fsxm-split Kwd0 " "))
  45.                 (vla-sendcommand *doc* (strcat var "\n"))
  46.                 (ssget Fil)
  47.                )
  48.                (t var)
  49.          )
  50.         )
  51.   )
  52. )

点评

(entsel)不支持默认的关键字"W L C BOX ALL F WP CP G A R M P U AU SI" 会提示“无效的选择" 如果自定义的关键字是P1 P2 P3 P4,输入P还会提示"有歧义的响应,请澄清" 如何解决?  发表于 2016-3-14 10:22
"X" 这个过滤该如何弄呢  发表于 2012-10-10 09:22
好东西,谢谢  发表于 2012-3-16 14:04

评分

参与人数 4威望 +1 明经币 +5 金钱 +20 贡献 +5 激情 +5 收起 理由
tryhi + 1 很给力!
自贡黄明儒 + 1 很给力!
cnks + 1
mccad + 1 + 2 + 20 + 5 + 5 【精华】好程序

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2019-6-28 09:18:45 | 显示全部楼层
liminnet 发表于 2008-11-4 15:50
本帖最后由 作者 于 2008-11-4 15:51:37 编辑  (defun c:mjtd(/ setmode ss i mode)  (cmdbe) & ...

缺少部分源码
发表于 2019-6-28 09:15:51 | 显示全部楼层
没有例子是件很悲伤的事。
发表于 2021-7-14 10:42:51 | 显示全部楼层
原来有这么好的东东
发表于 2008-11-4 12:53:00 | 显示全部楼层
本帖最后由 作者 于 2008-11-4 13:02:48 编辑

不错,飞哥,你真是天才,一级棒,
发表于 2008-11-4 13:23:00 | 显示全部楼层

是不是2008的ssget有关键字了.

点评

lisp的基本函数的用法,估计从R14之后就没改变。Autodesk的那些人啊。。。  发表于 2011-10-25 07:32
发表于 2008-11-4 14:42:00 | 显示全部楼层
飞诗总有精品...强烈支持...
发表于 2008-11-4 15:15:00 | 显示全部楼层

强悍 好思路

发表于 2008-11-4 15:21:00 | 显示全部楼层
本帖最后由 作者 于 2008-11-4 15:23:26 编辑

发表于 2008-11-4 15:50:00 | 显示全部楼层
本帖最后由 作者 于 2008-11-4 15:51:37 编辑

(defun c:mjtd(/ setmode ss i mode)
  (cmdbe)
   (princ"\n程序功能:快速剪掉多段线内或外的对象")
  (if mode mode (setq mode "内部"))
  (setq setmode t)
  (while setmode
           (princ (strcat "\n当前剪切模式是:" mode))
           (setq ss (ko-ssget (strcat "\n选择对象或[设置剪切环境(S)<" mode ">]:") "S" '((0 . "*polyline"))))
           (cond
                ((= ss "S") (setq mode (settrimmode mode))
                )
                ((= (type ss) 'PICKSET) (trimmainprogram ss) (setq setmode nil)
                )
                ((= ss nil) (setq setmode nil)
  )
           )
  )
  (cmde)
  (princ)
)

(defun trimmainprogram(ss / i lst ena)
     (command "._zoom" "o" ss "")
     (setq i 0)
     (repeat (sslength ss)
       (setq ena (ko-convert-pline (ssname ss i)))
       (cond
         ((= mode "内部") 
           (setq lst (ko-get->list-offsetpline ena t 3))
           (command "._trim" ena "" "f")
           (foreach x lst (command "non" x))
           (command (car lst) "" "")
         )
         ((= mode "外部")
            (setq lst (ko-get->list-offsetpline ena nil 3))
            (command "._trim" ena "" "f")
            (foreach x lst (command "non" x))
            (command (car lst) "" "")
         )
      )
       (setq i (1+ i))
    )
    (command "._zoom" "p")
)
(defun settrimmode(mode / value)
   (initget "V Q")
   (setq value (getkword (strcat "\n[内部(V)/外部(Q)<" mode ">]:")))
   (cond
       ((= value "V") (setq value "内部"))
       ((= value nil) (setq value mode))
       ((= value "Q") (setq value "外部"))
   )
  value
)

;;;;借用了飞哥的上面的一颗奔腾CPU8核心处理器 来改装把我的程序一下,

;;;;多谢谢飞哥哥啦

发表于 2008-11-5 09:02:00 | 显示全部楼层
本帖最后由 作者 于 2008-11-5 9:04:20 编辑

飞哥,为什么你上面的程序执行后,用空格来响应命令时,不会退出,而是去选择一个点呀,飞哥,可以解决空格能退出程序的问题吗
发表于 2008-11-5 09:03:00 | 显示全部楼层
而且这个点的坐标是34146.72050038344,-585.7550495938848,0.000000000000000 怎么这么长的数据呀,不知道可以不要显示出这个坐标的值出来吗,
 楼主| 发表于 2008-11-5 11:48:00 | 显示全部楼层

用这个方法实现的就不能不显示~!

你可以研究别的方法试下哈~

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 17:45 , Processed in 0.289898 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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