[求助]如何:join几条线段(多线段),然后闭合这条连接后的多线段?
本帖最后由 作者 于 2007-4-2 11:23:54 编辑 <br /><br /> <p>废话一句:本人刚入门,这是我的第二个程序。既然刚入门,提问题也许很菜,但还是要提。诚请知道的人答复!深表感谢!</p><p>本人的意思:AutoLisp调用Command的“pedit”命令,使它能够完成连接几条线段,多线段,在选择几条多线段之后,使这条合成后的多线段闭合。</p><p>本人做出过不少尝试,但都失败。用到了while循环,但因为join命令本身有一个循环,所以弄了两天一直没有搞懂应该怎么办。</p><p>(defun c:pj ()<br/> (setvar "cmdecho" 1)<br/> (command "peditaccept" 1)<br/> <br/> (command "pedit" "j" ) ;;;调用Pedit命令,join命令<br/> (setq pl(entsel)) ;;;取值,<br/> (while pl ;;;如果pl存在,即如果选取了线段,则执行循环,但join本身就有一个循环<br/> (setq pl(entsel)) </p><p> )<br/> (command "c" "") ;;;调用闭合命令,使多线段闭合</p><p>)</p> linshiyin2 发表于 2010-6-2 15:45(defun fsxm-silenceexit (/ *error*) ;无声退出 ;by fsxm (t (setq *error* strcat)))
(defun c:n...
8楼的程序,太好了!这个是我想要的!谢谢! 感谢大家的分享,学习了
感谢楼上分享!赞! <p>1. PEDIT 命令后不应该为 "j", 而应该为图元名!</p><p>2. 在这种情况下不适合用 while ,如果循环结束,它传递给command的参数就是 nil</p><p>3. 最好先获取参数然后再command</p><p>4. (while pl (setq pl(entsel)))为什么不直接用 ssget</p><p>5. 当你第一次 (setq pl(entsel)) 时,是否要将结果进行判断,是多段线还是直线,因为类型不同</p><p> 命令行参数也不一样</p><p>6. 与其这样还不如干脆这样</p><p>(defun c:pj ()<br/> (command "pedit" pause "j" pause "" "c" "")<br/>)</p> <p>(ENTSEL)返回点表,要运用(CAR (ENTSEL))才能返回图元名</p><p>要将第一次选择结果进行判断,是多段线还是直线、弧……</p><p>(defun c:pj ()<br/> (setvar "cmdecho" 0)<br/> (command "peditaccept" 1)<br/> <br/> (command "pedit") ;;;调用Pedit命令,join命令<br/> (setq pl (car (entsel))) ;;;取值,<br/> (IF pl ;;;如果pl存在,即如果选取了线段,则执行循环,但join本身就有一环<br/> (PROGN<br/> (command pl)<br/> (if (WCMATCH (CDR (ASSOC 0 (ENTGET PL))) "*POLYLINE") (command "J") (command "Y" "J"))<br/> (setq pl (SSGET))<br/> (command pl "" "C" "");;;调用闭合命令,使多线段闭合<br/> )<br/> )<br/> (setvar "cmdecho" 1)<br/>(PRINC)<br/>)</p> <p>哈哈哈哈 ~!</p><p>太好了,太谢谢了 !</p><p>根据<font face="Verdana" color="#61b713"><strong><em>caoyin</em><font color="#44bba3">大侠的提示,终于解决了问题。非常感谢!</font></strong></font></p><p><strong><font face="Verdana" color="#44bba3">依找caoyin的意见,修改如下:</font></strong></p><p>(defun c:pj ()<br/> (setvar "cmdecho" 1)<br/> (command "peditaccept" 1) ;;;如果是直线,则直接变为多线段从而跳过询问<br/> (setq pl_sel (ssget)) ;;;取得选择集,也就是仁兄所说,先获取参数。<br/> (command "pedit" "m" pl_sel "" "j" "0.01" "c" "") ;;;万事俱备,只要调用command命令即可,</p><p> ;;;其中“j”前必须加上一个空格命令,<br/> )<br/></p><p></p><p>学习是一件很快乐的事情啊!</p><p>哈哈 ,</p> <p>刚看了三楼的提示,程序是能解决问题,可是我不太明白一些问题:</p><p>1.(command pl) 这句不知道什么作用。是相当于CAD命令行中先放入之前的选择集的意思?</p><p>2.在之前已经有了“ (command "peditaccept" 1)”这句,后面是不是(我认为是)就不用判断是直线还是多线段了?</p><p></p><p>谢谢你的答复,希望与您交流。</p> <p>(command pl)是执行PEDIT后的先择对象,</p><p>(command "peditaccept" 1)后面是不用判断是直线还是多线段了,但在ACAD2002以下版中没有这个系统变量</p> 终于知道一点点了,知道返回的对象是怎么回事了。总算有一点进步了 <p><font face="Verdana">(defun fsxm-silenceexit (/ *error*) ;无声退出 ;by fsxm<br/> (t (setq *error* strcat))<br/>)</font></p>
<p><font face="Verdana">(defun c:n (/ ss *error*) ;连接多义线<br/>(defun *error* (msg) (princ))<br/>(princ "\n连接多义线")<br/>(setq ss (ssget '((-4 . "<or")<br/>(-4 . "<AND") (0 . "LWPOLYLINE") (70 . 0) (-4 . "AND>")<br/>(0 . "LINE")<br/>(0 . "ARC")<br/>(-4 . "or>")))<br/>)<br/>(or ss (fsxm-silenceexit))<br/>(setvar "cmdecho" 0)<br/>(setvar "PEDITACCEPT" 1)<br/>(if (= (sslength ss) 1)<br/> (vl-cmdf "PEDIT" (ssname ss 0) "j" "all" "" "")<br/> (command "PEDIT" "m" "P" "" "j" "" "")<br/>)<br/>(setvar "PEDITACCEPT" 0)<br/>(princ)<br/>)</font></p> 谢谢分享!!!!!
页:
[1]
2