caoyin 发表于 2007-12-26 08:36:00

[讨论] 如何清除上一个选择集记录

本帖最后由 作者 于 2007-12-26 8:38:49 编辑 <br /><br /> <p>我们用 (ssget "_p") 可以获得上一次使用过的选择集,而我想 (ssget "_p") 返回 nil,我用如下方法:</p><p>(defun lta:ClearSS (/ e)<br/>&nbsp; (if (setq&nbsp;e (entnext))<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "highlight" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_.select"&nbsp;e "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_.undo" "1")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "highlight" 1)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; nil<br/>)</p><p>但是图元 (entnext) 如果不在当前空间(模型\图纸)则此方法无效。</p><p>方法二</p><p>(defun lta:ClearSS (/ ss)<br/>&nbsp; (if (setq ss (ssget "_x" (list (cons 410 (getvar "ctab")))))<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "highlight" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_.select" (ssname ss 0) "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_.undo" "1")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "highlight" 1)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; nil<br/>)</p><p>但 (setq ss (ssget "_x" (list (cons 410 (getvar "ctab"))))) 可能运行速度会很慢。。。</p><p>请教大家有什么好方法。。。</p>

Andyhon 发表于 2007-12-26 17:10:00

try (acet-ss-clear-prev)

caoyin 发表于 2007-12-27 10:17:00

<p>我不想用acet的函数,而且(acet-ss-clear-prev)的方法就是第一种方法,在模型空间执行选择集操作,</p><p>然后 tilemode设为 1进入布局的图纸空间执行 (acet-ss-clear-prev) 然后(ssget "p"),结果返回的不是nil</p>

龙龙仔 发表于 2008-1-3 07:59:00

<p>但是图元 (entnext) 如果不在当前空间。</p><p>=&gt;自已建立最後一件圖元(entlast)</p>

caoyin 发表于 2008-1-3 14:52:00

<p>谢谢版主。 我原来的方法是在'(0 0)位置创建一个 POINT 然后删除,但要加上 undo_begin undo_end.</p>

龙龙仔 发表于 2008-1-4 07:54:00

<p>(defun C:TT (/ E)<br/>&nbsp; (entmake '((0 . "TEXT") (10 0.0 0.0) (40 . 0) (1 . "")))<br/>&nbsp; (command "_.select" (setq E (entlast)) "")<br/>&nbsp; (command "_.undo" "1")<br/>&nbsp; (entdel&nbsp;E)<br/>&nbsp; (princ)<br/>)</p><p>為甚麼清空上一次使用过的选择集??</p><p></p>

caoyin 发表于 2008-1-4 10:44:00

本帖最后由 作者 于 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/>;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flt---等同于 ssget 函数图元过滤表<br/>;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fun---函数名<br/>;; [返回] 成功-&gt;选择集,反之-&gt;nil<br/>;|<br/>;; [测试1]<br/>(lt:ssget-RealTime "\n删除对象:" nil 'entdel)</p><p>;; [测试2]<br/>(defun c:tt ()<br/>&nbsp; (lt:ssget-RealTime "\n选择要改变颜色的直线:"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '((0 . "line"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '(lambda (x)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (or (&gt;= col 256) (not col)) (setq col 0))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-color (vlax-ename-&gt;vla-object x) (setq col (1+ col)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>|;<br/>(defun lt:ssget-RealTime (msg flt fun / ss2 ss vd p1 a p1 p2 e ss3)<br/>&nbsp; (setvar "cmdecho" 0)<br/>&nbsp; (while<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lta:ClearSS)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (princ (cond (msg) ("\n选择对象: ")))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_.select" "_si")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command pause)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss2 (ssget "_p"))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (if ss2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (not (setq ss (ssget "_p" flt)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq vd (getvar "viewdir")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1 (trans (getvar "lastpoint") 1 vd)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a&nbsp; (* (getvar "pickbox") (lta:pixelUnit))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1 (list (+ (car p1) a) (+ (cadr p1) a) 0.0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p2 (list (- (car p1) a) (- (cadr p1) a) 0.0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1 (trans p1 vd 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p2 (trans p2 vd 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ss (ssget "_c" p1 p2 flt)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (setq ss3 (ssadd))<br/>&nbsp;&nbsp;&nbsp; (if ss<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (setq n (fix (sslength ss)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq e (ssname ss (setq n (1- n))))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if fun (apply fun (list e)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ssadd e ss3)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 0)<br/>&nbsp;&nbsp;&nbsp; ss3<br/>&nbsp; )<br/>)</p><p>(defun lta:ClearSS (/ e)<br/>&nbsp; (setvar "cmdecho" 0)<br/>&nbsp; (command "_.point" "0,0")<br/>&nbsp; (setq e (entlast))<br/>&nbsp; (command "_.select" e "")<br/>&nbsp; (command "_.undo" "1")<br/>&nbsp; (entdel e)<br/>&nbsp; nil<br/>)</p><p></p>

无痕 发表于 2008-1-4 20:58:00

(while (setq ss(ssget ":s" fil))<br/>&nbsp; (alert "\n 为什么你非要走远路?")<br/>)

caoyin 发表于 2008-1-5 10:19:00

本帖最后由 作者 于 2008-1-5 10:26:27 编辑 <br /><br /> <p>(setq ss(ssget ":s" fil))的方法我当然试过。但这样如果未选到对象,就会退出循环,这样我们就分不清是因为未选到对象而退出还是右键退出。</p><p>说白了就是&nbsp; (ssget ":s")&nbsp; 和&nbsp;(command "_.select" "_si") 的区别</p><p><br/></p><p></p><p></p><p></p>

jack093 发表于 2013-5-4 13:36:48

一直没有找到好半法,所用方法跟楼主差不多,(先画一零长度直线再选择它再删除它)总觉得太笨却没有好办法.
页: [1]
查看完整版本: [讨论] 如何清除上一个选择集记录