dinosaurhxe2 发表于 2008-2-12 12:23:00

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)
)


新年快乐!

无痕 发表于 2008-2-12 14:17:00

<p>&nbsp;&nbsp; <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/>&nbsp;&nbsp; <font color="#800080">;能否把这里的entsel改成ssget?</font></p><p><font color="#800080"></font></p><p><font color="#800080"><font color="#000000">&nbsp;&nbsp; </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>

dinosaurhxe2 发表于 2008-2-12 14:27:00

无痕前辈大概是没有看明白我的意思。楼上直接改为ssget之后,把MText炸开后就得不到炸开的Text,(command    "_.explode"    (car s1))
   (setq ss (ssget    "_p"))
这里的(ssget "_p")就出问题了。

sailorcwx 发表于 2008-2-12 15:10:00

<p><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/command.htm" target="_black"><font color="#0000ff">command</font></a>&nbsp;<font color="#ff00ff">"_.explode"</font>&nbsp;&nbsp;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>

dinosaurhxe2 发表于 2008-2-12 17:44:00

<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>&nbsp;<font color="#ff00ff">"_.explode"</font>&nbsp;&nbsp;s1<font color="#ff0000">)了。</font></p>

sailorcwx 发表于 2008-2-12 18:18:00

本帖最后由 作者 于 2008-2-12 18:20:14 编辑 <br /><br /> <p>二楼已经给你正确的答案了,你为什么还要把他的MTEXT改成 *TEXT来用呢</p><p>ssget得到的是一个选集<br/>entsel得到的是对象名和选择点组成的表,所以要用car才能把对象名取出来</p>

dinosaurhxe2 发表于 2008-2-13 14:05:00

用*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,不知道错在哪里?

sailorcwx 发表于 2008-2-13 15:05:00

本帖最后由 作者 于 2008-2-13 15:05:49 编辑 <br /><br /> <p>你的目的是把Mtext改成Text,那你就不需要选择Text了</p><p>你上面的程序问题错在&nbsp;<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/command.htm" target="_black"><font color="#0000ff">command</font></a><br/>&nbsp;&nbsp;<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/>&nbsp;&nbsp;&nbsp;</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/>&nbsp;&nbsp;&nbsp;</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/>&nbsp;&nbsp;&nbsp;</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>

dinosaurhxe2 发表于 2008-2-14 12:20:00

<p>嗯,明白了。</p><p>其实我的目的有两个,一个是把MText改成Text,并设定字高;另一个是把Text设定成相同的字高。所以想连Text一起选。不过既然不好选那就编成两个命令好了。</p><p>感谢sailorcwx前辈的耐心指导!</p>

caoyin 发表于 2008-2-16 15:12:00

本帖最后由 作者 于 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
查看完整版本: entsel与ssget一问——祝新年快乐