[原创]带关键字的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)
)
)
)
)
liminnet 发表于 2008-11-4 15:50
本帖最后由 作者 于 2008-11-4 15:51:37 编辑(defun c:mjtd(/ setmode ss i mode) (cmdbe) & ...
缺少部分源码 没有例子是件很悲伤的事。 原来有这么好的东东 本帖最后由 作者 于 2008-11-4 13:02:48 编辑
不错,飞哥,你真是天才,一级棒, <p>是不是2008的ssget有关键字了.</p> 飞诗总有精品...强烈支持... <p>强悍 好思路</p> 本帖最后由 作者 于 2008-11-4 15:23:26 编辑 <br /><br /> <p>在</p> 本帖最后由 作者 于 2008-11-4 15:51:37 编辑 <br /><br /> <p>(defun c:mjtd(/ setmode ss i mode)<br/> (cmdbe)<br/> (princ"\n程序功能:快速剪掉多段线内或外的对象")<br/> (if mode mode (setq mode "内部"))<br/> (setq setmode t)<br/> (while setmode<br/> (princ (strcat "\n当前剪切模式是:" mode))<br/> (setq ss (ko-ssget (strcat "\n选择对象或[设置剪切环境(S)<" mode ">]:") "S" '((0 . "*polyline"))))<br/> (cond<br/> ((= ss "S") (setq mode (settrimmode mode))<br/> )<br/> ((= (type ss) 'PICKSET) (trimmainprogram ss) (setq setmode nil)<br/> )<br/> ((= ss nil) (setq setmode nil)<br/> )<br/> )<br/> )<br/> (cmde)<br/> (princ)<br/>)</p><p>(defun trimmainprogram(ss / i lst ena)<br/> (command "._zoom" "o" ss "")<br/> (setq i 0)<br/> (repeat (sslength ss)<br/> (setq ena (ko-convert-pline (ssname ss i)))<br/> (cond <br/> ((= mode "内部") <br/> (setq lst (ko-get->list-offsetpline ena t 3))<br/> (command "._trim" ena "" "f")<br/> (foreach x lst (command "non" x))<br/> (command (car lst) "" "")<br/> )<br/> ((= mode "外部")<br/> (setq lst (ko-get->list-offsetpline ena nil 3))<br/> (command "._trim" ena "" "f")<br/> (foreach x lst (command "non" x))<br/> (command (car lst) "" "")<br/> )<br/> )<br/> (setq i (1+ i))<br/> )<br/> (command "._zoom" "p")<br/>)<br/>(defun settrimmode(mode / value)<br/> (initget "V Q")<br/> (setq value (getkword (strcat "\n[内部(V)/外部(Q)<" mode ">]:")))<br/> (cond<br/> ((= value "V") (setq value "内部"))<br/> ((= value nil) (setq value mode))<br/> ((= value "Q") (setq value "外部"))<br/> ) <br/> value<br/>)</p><p></p><p>;;;;借用了飞哥的上面的一颗奔腾CPU8核心处理器 来改装把我的程序一下,</p><p>;;;;多谢谢飞哥哥啦</p> 本帖最后由 作者 于 2008-11-5 9:04:20 编辑
飞哥,为什么你上面的程序执行后,用空格来响应命令时,不会退出,而是去选择一个点呀,飞哥,可以解决空格能退出程序的问题吗 而且这个点的坐标是34146.72050038344,-585.7550495938848,0.000000000000000 怎么这么长的数据呀,不知道可以不要显示出这个坐标的值出来吗, <p>用这个方法实现的就不能不显示~!</p><p>你可以研究别的方法试下哈~</p>