飞诗(fsxm) 发表于 2008-11-4 12:03:00

[原创]带关键字的ssget

本帖最后由 飞诗(fsxm) 于 2011-10-25 11:50 编辑

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


;;函数库(用FSTL用户可以不加)
;;带关键字的ssget
(defun fsxm-ssget (Msg Kwd Fil / Kwd0 pt var)
(cond      ((cadr (ssgetfirst)))
      (t
         (setq Kwd0 "W L C BOX ALL F WP CP G A R M P U AU SI")
         (initget (strcat Kwd0 " " kwd))
         (cond ((and (listp (setq var (fsxm-entsel Msg Fil)))
                     (/= 52 (getvar "errno"))
                )
                (setq pt (mapcar 'fsxm-tostring (cadr (grread t))))
                (vla-sendcommand *doc* (strcat (fsxm-join pt ",") "\n"))
                (ssget Fil)
               )
               ((member var (fsxm-split Kwd0 " "))
                (vla-sendcommand *doc* (strcat var "\n"))
                (ssget Fil)
               )
               (t var)
         )
      )
)
)


下面是完整的版本:

(vl-load-com)
(setq *acad* (vlax-get-acad-object))
(setq *doc* (vla-get-ActiveDocument *acad*))
;;带过滤器的entsel
(defun Fsxm-entsel (msg filter)
(setq enp (entsel msg))
(if (or (= (type enp) 'str)
          (and enp (ssget (cadr enp) filter))
      )
    enp
)
)
;;;用分隔符解释字符串成表
(defun Fsxm-Split (string strkey / po strlst xlen)
(setq xlen (1+ (strlen strkey)))
(while (setq po (vl-string-search strkey string))
    (setq strlst (cons (substr string 1 po) strlst))
    (setq string (substr string (+ po xlen)))
)
(reverse (cons string strlst))
)
;;点化字串
(defun Pt2Str (pt)
(strcat (rtos (car pt) 2 20)
          ","
          (rtos (cadr pt) 2 20)
          ","
          (rtos (caddr pt) 2 20)
          "\n"
)
)
;;带关键字的ssget
(defun Fsxm-ssget (Msg Kwd Fil / Kwd0 pt var)
(cond        ((cadr (ssgetfirst)))
        (t
       (setq Kwd0 "W L C BOX ALL F WP CP G A R M P U AU SI")
       (initget (strcat Kwd0 " " kwd))
       (cond ((and (listp (setq var (fsxm-entsel Msg Fil)))
                     (/= 52 (getvar "errno"))
                )
                (vla-sendcommand *doc* (Pt2Str (cadr (grread t))))
                (ssget Fil)
             )
             ((member var (fsxm-split Kwd0 " "))
                (vla-sendcommand *doc* (strcat var "\n"))
                (ssget Fil)
             )
             (t var)
       )
        )
)
)

cghdy 发表于 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) & ...

缺少部分源码

cghdy 发表于 2019-6-28 09:15:51

没有例子是件很悲伤的事。

LIULISHENG 发表于 2021-7-14 10:42:51

原来有这么好的东东

liminnet 发表于 2008-11-4 12:53:00

本帖最后由 作者 于 2008-11-4 13:02:48 编辑

不错,飞哥,你真是天才,一级棒,

jxlsp 发表于 2008-11-4 13:23:00

<p>是不是2008的ssget有关键字了.</p>

carrot1983 发表于 2008-11-4 14:42:00

飞诗总有精品...强烈支持...

nonsmall 发表于 2008-11-4 15:15:00

<p>强悍 好思路</p>

鬼谷子 发表于 2008-11-4 15:21:00

本帖最后由 作者 于 2008-11-4 15:23:26 编辑 <br /><br /> <p>在</p>

liminnet 发表于 2008-11-4 15:50:00

本帖最后由 作者 于 2008-11-4 15:51:37 编辑 <br /><br /> <p>(defun c:mjtd(/ setmode ss i mode)<br/>&nbsp; (cmdbe)<br/>&nbsp;&nbsp; (princ"\n程序功能:快速剪掉多段线内或外的对象")<br/>&nbsp; (if mode mode (setq mode "内部"))<br/>&nbsp; (setq setmode t)<br/>&nbsp; (while setmode<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (princ (strcat "\n当前剪切模式是:" mode))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss (ko-ssget (strcat "\n选择对象或[设置剪切环境(S)&lt;" mode "&gt;]:") "S" '((0 . "*polyline"))))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= ss "S") (setq mode (settrimmode mode))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= (type ss) 'PICKSET) (trimmainprogram ss) (setq setmode nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= ss nil) (setq setmode nil)<br/>&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (cmde)<br/>&nbsp; (princ)<br/>)</p><p>(defun trimmainprogram(ss / i lst ena)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (command "._zoom" "o" ss "")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq i 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ena (ko-convert-pline (ssname ss i)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= mode "内部")&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq lst (ko-get-&gt;list-offsetpline ena t 3))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "._trim" ena "" "f")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (foreach x lst (command "non" x))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command (car lst) "" "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= mode "外部")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq lst (ko-get-&gt;list-offsetpline ena nil 3))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "._trim" ena "" "f")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (foreach x lst (command "non" x))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command (car lst) "" "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq i (1+ i))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (command "._zoom" "p")<br/>)<br/>(defun settrimmode(mode / value)<br/>&nbsp;&nbsp; (initget "V Q")<br/>&nbsp;&nbsp; (setq value (getkword (strcat "\n[内部(V)/外部(Q)&lt;" mode "&gt;]:")))<br/>&nbsp;&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= value "V") (setq value "内部"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= value nil) (setq value mode))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= value "Q") (setq value "外部"))<br/>&nbsp;&nbsp; ) <br/>&nbsp; value<br/>)</p><p></p><p>;;;;借用了飞哥的上面的一颗奔腾CPU8核心处理器 来改装把我的程序一下,</p><p>;;;;多谢谢飞哥哥啦</p>

liminnet 发表于 2008-11-5 09:02:00

本帖最后由 作者 于 2008-11-5 9:04:20 编辑

飞哥,为什么你上面的程序执行后,用空格来响应命令时,不会退出,而是去选择一个点呀,飞哥,可以解决空格能退出程序的问题吗

liminnet 发表于 2008-11-5 09:03:00

而且这个点的坐标是34146.72050038344,-585.7550495938848,0.000000000000000 怎么这么长的数据呀,不知道可以不要显示出这个坐标的值出来吗,

飞诗(fsxm) 发表于 2008-11-5 11:48:00

<p>用这个方法实现的就不能不显示~!</p><p>你可以研究别的方法试下哈~</p>
页: [1] 2 3 4 5
查看完整版本: [原创]带关键字的ssget