[求助]求一个自动打断并倒角的lisp
本帖最后由 作者 于 2008-9-29 15:39:33 编辑 <br /><br /> <p>哪位朋友能编个lisp,实现第一个图编为第二图</p><p> </p> <p>这个可满足楼主的要求:</p><p>;+---------------------+<br/>;+ 四条直线快速修剪 +<br/>;+ 文件名: TRIM4.lsp +<br/>;+---------------------+<br/>(defun C:T4( / index index1 ss p0 ss1 entn ent ty l_p1 l_p2 p1 p2 p3 p4 ang1 ang2 <br/> ang3 dist1 dist2 )</p><p>(defun inivar()<br/> (setq osm (getvar "osmode"))<br/> (setq cly (getvar "clayer"))<br/> )<br/> (defun resvar()<br/> (setvar "osmode" osm)<br/> (setvar "clayer" cly)<br/> )</p><p>(inivar) ;初始化系统变量<br/>(setvar "blipmode" 1)<br/>(setq index 1 <br/> ss (ssadd) ;构件一个空选择集<br/>) ;setq end<br/>(setvar "osmode" 512) ;设定捕捉模式为Nearest<br/>(setq ss (ssget '((0 . "LINE"))))<br/>(while (/= (sslength ss) 4)<br/> (progn<br/> (print "未选到四条直线,请重新选择")<br/> (setq ss (ssget '((0 . "LINE"))))<br/> )<br/>)</p><p>(setvar "osmode" 0)<br/>(setvar "blipmode" 0)<br/>(setq index 0<br/> l_p1 '()<br/> l_p2 '()<br/> ) ;setq end<br/>(repeat 4 ;获取每一根线的起点、终点<br/> (setq ent (entget (ssname ss index))<br/> index (+ 1 index)<br/> p1 (cdr (assoc 10 ent))<br/> p2 (cdr (assoc 11 ent))<br/> l_p1 (cons p1 l_p1) <br/> l_p2 (cons p2 l_p2)<br/> ) ;setq end<br/>) ;repeat end<br/>(setq index 0 n 4<br/> l_int '()<br/>)<br/>(repeat (1- n) ;计算交点<br/> (setq p1 (nth index l_p1)<br/> p2 (nth index l_p2) <br/> index1 (1+ index)<br/> index (1+ index)<br/> ) ;setq end<br/> (repeat (- n index)<br/> (setq p3 (nth index1 l_p1) <br/> p4 (nth index1 l_p2)<br/> index1 (1+ index1)<br/> pt (inters p1 p2 p3 p4) ;求交点<br/> l_int (if pt (cons pt l_int) l_int)<br/> ) ;setq end<br/> ) ;repeat end<br/>) ;repeat end<br/>(setq index 0 <br/> la (cdr (assoc 8 ent))<br/>) ;setq end<br/>(repeat n ;删除原直线<br/> (setq entn (ssname ss index)<br/> index (1+ index)<br/> ) ;setq end<br/> (entdel entn)<br/>) ;repeat end<br/>(setq index 0)<br/>(command "layer" "s" la "")<br/>(repeat (1- n) ;重新画线<br/> (setq p3 (nth index l_int)<br/> index2 (1+ index)<br/> index (1+ index)<br/> ) ;setq end<br/> (repeat (- n index)<br/> (setq index1 0<br/> p4 (nth index2 l_int)<br/> index2 (1+ index2)<br/> ) ;setq end<br/> (repeat n<br/> (setq p1 (nth index1 l_p1)<br/> p2 (nth index1 l_p2) <br/> index1 (1+ index1)<br/> ) ;setq end<br/> (setq ang1 (angtos (angle p1 p2) 0 1)<br/> ang2 (angtos (angle p1 p3) 0 1)<br/> ang3 (angtos (angle p1 p4) 0 1)<br/> ) ;setq end<br/> (if (= ang1 ang2 ang3)<br/> (progn<br/> (setq dist1 (distance p1 p3)<br/> dist2 (distance p1 p4)<br/> ) ;set end<br/> (if (< dist1 dist2)<br/> (progn<br/> (command "line" p1 p3 "")<br/> (command "line" p4 p2 "")<br/> ) ;progn end<br/> (progn<br/> (command "line" p1 p4 "")<br/> (command "line" p3 p2 "")<br/> ) ;progn end<br/> ) ;if end<br/> ) ;progn end<br/> ) ;if end<br/> ) ;repeat end<br/> ) ;repeat end<br/>) ;repeat end<br/>(redraw)<br/>(resvar) ;还原系统变量<br/>(princ)<br/>) ;defun end<br/></p> <p>楼上的只能一次打断四条线,如果想打断井字梁的话还是去找一个全部打断的程序 然后用vla-get-length把长度小于梁宽(比如400)的线段用vla-delete删除!就可以实现楼主的效果</p> 感谢分享感谢分享
页:
[1]