langjs 发表于 2009-5-29 09:18:00
<p>;;;===========================================================<br/>;;;功能:可以点选和框选的修剪和延伸命令<br/>;;;原创ZML84,由langjs修改于2009-05-07<br/>;;;===========================================================</p><p>(defun c:kxjq () (trim&extend T) )<br/>(defun c:kxys () (trim&extend nil) )</p><p>(defun trim&extend (cmd / S1 S2 PT1 PT2 CMDECHO_OLD I XX zhuj1)<br/> (if cmd<br/> (setq cmd "_.trim" zhuj1 "\n选择剪切边,或:<选择全部>:" zhuj2 "\n选择要修剪的对象,或 [投影(P)/边(E)/放弃(U)]:" )<br/> (setq cmd "_.extend" zhuj1 "\n选择边界的边,或:<选择全部>:" zhuj2 "\n选择要延伸的对象,或 [投影(P)/边(E)/放弃(U)]:" )<br/> )<br/> (defun error (x) (error_end))<br/> (defun error_end ()<br/> (liangxian s1 4 )<br/> (setvar "osmode" snap) 打开捕捉<br/> (if cm (setvar "cmdecho" cm))<br/> (if os (setvar "osmode" os))<br/> (setq *error* olderr)<br/> )<br/> (setq olderr *error* *error* error)<br/> (setq CMDECHO_OLD (getvar "CMDECHO"))<br/> (setvar "CMDECHO" 0)<br/> (setq liangx 1) <br/> (princ zhuj1)<br/> ;;若没有选取边界,就将全部对象作为边界<br/> (setvar "nomutt" 1)<br/> (if (setq S1 (ssget))<br/> ()<br/> (progn<br/> (setq S1 (ssget "all"))<br/> (setq liangx 0) <br/> )<br/> )<br/> (setvar "nomutt" 0)<br/> (setq snap (getvar "osmode"))<br/> (setvar "osmode" 0) ;关闭<br/> (liangxian s1 3 )<br/> (while t<br/> (initget 4 "P E U p e u ")<br/> (QQQ)<br/> (princ zhuj2)<br/> (cond<br/> ;;分支零:右键退出<br/> ((= PT1 0.0)<br/> (exit))</p><p> ;;分支一:投影选项设置<br/> ((= PT1 "P")<br/> (progn<br/> (initget 4)<br/> (setq<br/> XX (getint (strcat "\n输入投影选项 [无(0)/UCS(1)/视图(2)] <" (itoa (getvar "PROJMODE")) ">:" ) )<br/> )<br/> (if (or (= XX 0) (= XX 1) (= XX 2))<br/> (setvar "PROJMODE" XX)<br/> )<br/> )<br/> )<br/> ;;分支二:边延伸选项设置<br/> ((= PT1 "E")<br/> (progn<br/> (initget 4)<br/> (setq XX (getint<br/> (strcat<br/> "\n输入隐含边延伸模式 [不延伸(0)/延伸(1)] <"<br/> (itoa (getvar "EDGEMODE"))<br/> ">:"<br/> )<br/> )<br/> )<br/> (if (or (= XX 0) (= XX 1))<br/> (setvar "EDGEMODE" XX)<br/> )<br/> )<br/> )<br/> ;;分支四:撤销上一步操作<br/> ((= PT1 "U")<br/> (command "_.undo" 1)<br/> )<br/> ;;分支五:对选中的对象进行修剪操作<br/> ((listp PT1)<br/> (progn<br/> (if (setq S2 (ssget PT1)) <br/> (progn<br/> (command "_.undo" "be")<br/> (command cmd S1 "" S2 "")<br/> (command "_.undo" "e")<br/> (liangxian s1 3 )<br/> )<br/> (if (and (setq PT2 (getcorner PT1 " >>>第二角点: " ) )<br/> (setq S2 (ssget "c" PT1 PT2))<br/> )<br/> (progn<br/> (command "_.undo" "be")<br/> (command cmd S1 "")<br/> (setq I 0)<br/> (repeat (sslength S2)<br/> (command (list (ssname S2 I) PT1))<br/> (setq I (1+ I))<br/> )<br/> (command "")<br/> (command "_.undo" "e")<br/> (liangxian s1 3 )<br/> )<br/> (princ "\n★未选择到对象。")<br/> )<br/> )<br/> )<br/> ) ;_结束 分支五<br/> ) ;_结束 cond 结束分支<br/> ) ;_结束 while<br/> (liangxian s1 4 )<br/> (setvar "CMDECHO" CMDECHO_OLD)<br/> (setvar "osmode" snap) 打开捕捉<br/> (error_end)<br/> (princ)<br/>) ;_结束 defun</p><p><br/>(defun qqq ();;;选择点鼠标变成框子程序<br/> (princ zhuj2)</p><p> (while (not (member (car (setq PT1 (grread T 12 2))) '(3 2 11)))<br/> (setq PT1 (cadr PT1))<br/> (if (vl-consp PT1)<br/> (progn<br/> (or PT (setq PT PT1))<br/> (setq X (car PT) Y (cadr PT))<br/> (if (> (distance PT1 PT) (P2U222 (* 0.0001 (car (getvar "screensize")))))<br/> (progn<br/> (redraw)<br/> (setq LEN (P2U222 1) X (car PT) Y (cadr PT))<br/> (setq PT PT1)<br/> )<br/> )<br/> )<br/> )<br/> )<br/> (redraw)<br/> (and (= (car PT1) 3)<br/> (vl-consp (cadr PT1))<br/> (setq EN (nentselp (cadr PT1)))<br/> )<br/> (setq ent (car EN) PT1 (cadr PT1) )<br/> (cond ((or (= PT1 80) (= PT1 112)) (setq PT1 "P"))<br/> ((or (= PT1 69) (= PT1 101)) (setq PT1 "E"))<br/> ((or (= PT1 85) (= PT1 117)) (setq PT1 "U"))<br/> )<br/> ( if (= PT1 0.0) (setvar "osmode" snap) );打开捕捉<br/> (princ)<br/>)</p><p>(defun p2u222 (pix) (* pix (/ (getvar "viewsize") (cadr (getvar "screensize")))))</p><p>(defun liangxian (ss n / slen I ent );;控制选择集亮显程序<br/> (if (/= liangx 0);;亮显判断条件<br/> (progn <br/> (setq slen (sslength ss) I 0 )<br/> (while (ssname ss I)<br/> (setq ent (ssname ss I))<br/> (redraw ent n);亮显<br/> (setq I (+ 1 I))<br/> );end while<br/> );end progn <br/> );end if<br/>);end defun<br/>;;;===========================================================</p><p></p>clh521 发表于 2009-5-29 13:56:00
<p>程序不错哦,收集了</p>luyu9635 发表于 2009-5-30 10:51:00
<p>我也来凑凑热闹,整理和修改和几位高手的程序,在此感谢了</p><p> </p>wowan1314 发表于 2009-8-27 18:02:00
本帖最后由 wowan1314 于 2012-3-28 21:17 编辑<p>1、哎,都是无法实现块内线作为剪切边啊!</p><p>2、剪切完后无法右键退出。</p><p>3、当剪切的两条线一个很长一个很短时,框选两条线程序剪错。</p>