entsel与ssget一问——祝新年快乐
本帖最后由 作者 于 2008-2-12 12:27:14 编辑遇到好多Mtext,需要改成Text,同时有部分Text的字高要改,都统一改成2.5,下面这段程序是根据caoyin前辈的提示自己修改的,勉强可以实现这个要求,但现在只能用entsel一个一个的点选,能否想办法改成ssget框选呢?请高人指点!
(defun c:zg (/ en ss str)
(setq s1 (entsel "\n选择多行文字或文字: "))
;能否把这里的entsel改成ssget?
(cond ((= (get 0 (setq ent (entget (setq name (car s1))))) "MTEXT")
(progn
(command "_.explode" (car s1))
(setq ss (ssget "_p"))
(repeat (setq n (fix (sslength ss)))
(setq ent (entget (ssname ss (setq n (1- n)))))
(ssset ent 40 2.5)
)
)
)
((= (get 0 ent) "TEXT")
(ssset ent 40 2.5)
)
)
(princ)
)
(defun get (aaaaa bbbbb /)
(cdr (assoc aaaaa bbbbb))
)
(defun ssset (eent nnum variable /)
(setq eent (subst (cons nnum variable) (assoc nnum eent) eent))
(entmod eent)
)
新年快乐!
<p> <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a> s1 <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/entsel.htm" target="_black"><font color="#0000ff">entsel</font></a>
<font color="#ff00ff">"\n选择多行文字或文字: "</font><font color="#ff0000">)</font><font color="#ff0000">)</font><br/> <font color="#800080">;能否把这里的entsel改成ssget?</font></p><p><font color="#800080"></font></p><p><font color="#800080"><font color="#000000"> </font><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a><font color="#000000"> s1 </font><font color="#ff0000">(ssget '((0 . "MTEXT"))</font><font color="#ff0000">)</font><font color="#ff0000">)</font><br/></font></p> 无痕前辈大概是没有看明白我的意思。楼上直接改为ssget之后,把MText炸开后就得不到炸开的Text,(command "_.explode" (car s1))
(setq ss (ssget "_p"))
这里的(ssget "_p")就出问题了。
<p><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/command.htm" target="_black"><font color="#0000ff">command</font></a> <font color="#ff00ff">"_.explode"</font> s1<font color="#ff0000">)</font><br/><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a> ss <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/ssget.htm" target="_black"><font color="#0000ff">ssget</font></a>
<font color="#ff00ff">"_p"</font><font color="#ff0000">)</font><font color="#ff0000">)</font><br/></p> <p>没看懂楼上的意思。<br/>现在的问题是,若用<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a><font color="#000000"> s1 </font><font color="#ff0000">(ssget '((0 . "*TEXT"))</font><font color="#ff0000">)</font><font color="#ff0000">)</font>框选,这里可能会选到Text,这样就需要判断是否为MText而炸开,判断完之后就不能用<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/command.htm" target="_black"><font color="#0000ff">command</font></a> <font color="#ff00ff">"_.explode"</font> s1<font color="#ff0000">)了。</font></p> 本帖最后由 作者 于 2008-2-12 18:20:14 编辑 <br /><br /> <p>二楼已经给你正确的答案了,你为什么还要把他的MTEXT改成 *TEXT来用呢</p><p>ssget得到的是一个选集<br/>entsel得到的是对象名和选择点组成的表,所以要用car才能把对象名取出来</p> 用*Text是想既可以选择MText,也可以选择Text。(defun c:zg (/ en ss str)
(setq s1 (ssget '((0 . "MTEXT"))))
(command "_.explode" s1)
(setq ss (ssget "_p"))
(repeat (setq n (fix (sslength ss)))
(setq ent (entget (ssname ss (setq n (1- n)))))
(ssset ent 40 2.5)
)
(princ)
)
(defun ssset (eent nnum variable /)
(setq eent (subst (cons nnum variable) (assoc nnum eent) eent))
(entmod eent)
)上面这段程序可以多选,但却也只能炸开一个MText,不知道错在哪里?
本帖最后由 作者 于 2008-2-13 15:05:49 编辑 <br /><br /> <p>你的目的是把Mtext改成Text,那你就不需要选择Text了</p><p>你上面的程序问题错在 <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/command.htm" target="_black"><font color="#0000ff">command</font></a><br/> <font color="#ff00ff">"_.explode"</font> s1<font color="#ff0000">)<br/>系统变量QAFLAGS=0时,explode只炸开选集的第一个对象,所以在运行前要把QAFLAGS修改为1<br/>(setvar "QAFLAGS" 1)<br/>(command "_.explode" s1 "")<br/></font></p><p><font color="#ff0000">另外你的<font color="#000000"><br/> </font><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/repeat.htm" target="_black"><font color="#0000ff">repeat</font></a><font color="#000000"><br/> </font><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a><font color="#000000"> n </font><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/fix.htm" target="_black"><font color="#0000ff">fix</font></a><font color="#000000"><br/> </font><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/sslength.htm" target="_black"><font color="#0000ff">sslength</font></a><font color="#000000"> ss</font><font color="#ff0000">)</font><font color="#ff0000">)</font><font color="#ff0000">)中的fix实为多余</font><br/></font></p> <p>嗯,明白了。</p><p>其实我的目的有两个,一个是把MText改成Text,并设定字高;另一个是把Text设定成相同的字高。所以想连Text一起选。不过既然不好选那就编成两个命令好了。</p><p>感谢sailorcwx前辈的耐心指导!</p> 本帖最后由 作者 于 2008-2-16 15:14:58 编辑 <br /><br /> <p>(setq ss1 (ssget '((0 . "*text"))))</p><p>然后再</p><p>(setq ss2 (ssget "_p" '((0 . "mtext"))))</p><p>....</p><p>不就得到两个选集了吗!!</p><br/>
页:
[1]
2