[讨论] 如何清除上一个选择集记录
本帖最后由 作者 于 2007-12-26 8:38:49 编辑 <br /><br /> <p>我们用 (ssget "_p") 可以获得上一次使用过的选择集,而我想 (ssget "_p") 返回 nil,我用如下方法:</p><p>(defun lta:ClearSS (/ e)<br/> (if (setq e (entnext))<br/> (progn<br/> (setvar "cmdecho" 0)<br/> (setvar "highlight" 0)<br/> (command "_.select" e "")<br/> (command "_.undo" "1")<br/> (setvar "highlight" 1)<br/> )<br/> )<br/> nil<br/>)</p><p>但是图元 (entnext) 如果不在当前空间(模型\图纸)则此方法无效。</p><p>方法二</p><p>(defun lta:ClearSS (/ ss)<br/> (if (setq ss (ssget "_x" (list (cons 410 (getvar "ctab")))))<br/> (progn<br/> (setvar "cmdecho" 0)<br/> (setvar "highlight" 0)<br/> (command "_.select" (ssname ss 0) "")<br/> (command "_.undo" "1")<br/> (setvar "highlight" 1)<br/> )<br/> )<br/> nil<br/>)</p><p>但 (setq ss (ssget "_x" (list (cons 410 (getvar "ctab"))))) 可能运行速度会很慢。。。</p><p>请教大家有什么好方法。。。</p> try (acet-ss-clear-prev) <p>我不想用acet的函数,而且(acet-ss-clear-prev)的方法就是第一种方法,在模型空间执行选择集操作,</p><p>然后 tilemode设为 1进入布局的图纸空间执行 (acet-ss-clear-prev) 然后(ssget "p"),结果返回的不是nil</p> <p>但是图元 (entnext) 如果不在当前空间。</p><p>=>自已建立最後一件圖元(entlast)</p> <p>谢谢版主。 我原来的方法是在'(0 0)位置创建一个 POINT 然后删除,但要加上 undo_begin undo_end.</p> <p>(defun C:TT (/ E)<br/> (entmake '((0 . "TEXT") (10 0.0 0.0) (40 . 0) (1 . "")))<br/> (command "_.select" (setq E (entlast)) "")<br/> (command "_.undo" "1")<br/> (entdel E)<br/> (princ)<br/>)</p><p>為甚麼清空上一次使用过的选择集??</p><p></p> 本帖最后由 作者 于 2008-1-4 10:52:45 编辑 <br /><br /> <p>因为 ssget 函数必须 enter 后才能获得选择集,我想仿照 MATCHPROP 命令的实时操作的功能,就是在选择的过程中执行操作,而不是要等待 ssget 结束再执行操作。其实就是若干个 ssget_:s 的概念。</p><p>通过这种方法我们还可以获得指定图元名的选择集</p><p>再请龙版主指点!!</p><p>;;____________________________________________________________________________________________________<br/>;; ▓ (lt:ssget-RealTime msg flt fun)<br/>;; [功能] 获取选择集并实时进行指定函数的操作<br/>;; [参数] msg---提示信息(STR),如果nil时则显示缺省为"\n选择对象: "<br/>;; flt---等同于 ssget 函数图元过滤表<br/>;; fun---函数名<br/>;; [返回] 成功->选择集,反之->nil<br/>;|<br/>;; [测试1]<br/>(lt:ssget-RealTime "\n删除对象:" nil 'entdel)</p><p>;; [测试2]<br/>(defun c:tt ()<br/> (lt:ssget-RealTime "\n选择要改变颜色的直线:"<br/> '((0 . "line"))<br/> '(lambda (x)<br/> (if (or (>= col 256) (not col)) (setq col 0))<br/> (vla-put-color (vlax-ename->vla-object x) (setq col (1+ col)))<br/> )<br/> )<br/>)<br/>|;<br/>(defun lt:ssget-RealTime (msg flt fun / ss2 ss vd p1 a p1 p2 e ss3)<br/> (setvar "cmdecho" 0)<br/> (while<br/> (progn<br/> (lta:ClearSS)<br/> (princ (cond (msg) ("\n选择对象: ")))<br/> (command "_.select" "_si")<br/> (setvar "cmdecho" 1)<br/> (command pause)<br/> (setq ss2 (ssget "_p"))<br/> )<br/> (if ss2<br/> (if (not (setq ss (ssget "_p" flt)))<br/> (setq vd (getvar "viewdir")<br/> p1 (trans (getvar "lastpoint") 1 vd)<br/> a (* (getvar "pickbox") (lta:pixelUnit))<br/> p1 (list (+ (car p1) a) (+ (cadr p1) a) 0.0)<br/> p2 (list (- (car p1) a) (- (cadr p1) a) 0.0)<br/> p1 (trans p1 vd 1)<br/> p2 (trans p2 vd 1)<br/> ss (ssget "_c" p1 p2 flt)<br/> )<br/> )<br/> )<br/> (setq ss3 (ssadd))<br/> (if ss<br/> (repeat (setq n (fix (sslength ss)))<br/> (setq e (ssname ss (setq n (1- n))))<br/> (if fun (apply fun (list e)))<br/> (ssadd e ss3)<br/> )<br/> )<br/> (setvar "cmdecho" 0)<br/> ss3<br/> )<br/>)</p><p>(defun lta:ClearSS (/ e)<br/> (setvar "cmdecho" 0)<br/> (command "_.point" "0,0")<br/> (setq e (entlast))<br/> (command "_.select" e "")<br/> (command "_.undo" "1")<br/> (entdel e)<br/> nil<br/>)</p><p></p> (while (setq ss(ssget ":s" fil))<br/> (alert "\n 为什么你非要走远路?")<br/>) 本帖最后由 作者 于 2008-1-5 10:26:27 编辑 <br /><br /> <p>(setq ss(ssget ":s" fil))的方法我当然试过。但这样如果未选到对象,就会退出循环,这样我们就分不清是因为未选到对象而退出还是右键退出。</p><p>说白了就是 (ssget ":s") 和 (command "_.select" "_si") 的区别</p><p><br/></p><p></p><p></p><p></p> 一直没有找到好半法,所用方法跟楼主差不多,(先画一零长度直线再选择它再删除它)总觉得太笨却没有好办法.
页:
[1]