ZZXXQQ发表于2009-12-10 21:09:00 1、函数ss-list有什么用?多了无用的循环判断。2、判断有重复线后可以保留当前线,将多余的线直接删除,这样可以尽快结束循环。注意:要从ss选择集中去除删除的选择集。
谢谢zzxxqq,你说的第一点,我测试了一下,基本不影响速度,第二点采用,改了一下,快了一些如下" ;;ɾ³ýÕ¨¿ªºóµÄÎÄ×ÖÖжàÓàµÄÏß ;;;luyu9635 (defun c:ett(/ ss st1 st2 p1 p2 midp len xold i stime etime) (if (setq ss(ssget'((0 . "LINE")))) (progn (setq stime(getvar"date")) (prompt "\nÕýÔÚɨÃèÊý¾ÝÇëÉÔºò=======") (setq st1 nil st2(ssadd)) (mapcar '(lambda(x) (setq p1(dxf 10 x) p2(dxf 11 x)) (setq midp(mid p1 p2) len(distance p1 p2)) (if (>= (sslength (ssget "c" midp midp)) 2);;¹ýÖеãͼԪ¶àÓÚÁ½¸ö (setq st1(cons (list x midp len) st1)) ) ) (ss-list ss) ) (setq i 0 len(length st1)) (while (< i len) (setq i(1+ i)) (setq x(car st1) st1(vl-remove x st1)) (foreach y (vl-remove x st1) (if (and(member (cadr x) y) (member (caddr x) y));;Èç¹ûÖеãºÍ³¤¶È¶¼Ïàͬ (progn (ssadd (car x) st2)(ssadd (car y) st2) (setq st1(vl-remove y st1)) ) ) ) ) ) ) (setvar 'cmdecho 0) (command "undo" "be") (if(and st2 (> (sslength st2) 0))(progn(command "erase" st2 "")(princ "\nÒÑÍê³ÉÈÎÎñ"))) (command "undo" "e")(setvar 'cmdecho 1) (setq etime(getvar"date")) (princ "\n³ÌÐò¹²ºÄÓÃʱ¼ä£º") (princ (* 86400.0 (- (- etime stime) (fix (- etime stime))))) (princ "Ãë") (princ) ) ;;;;;;;;Ñ¡Ôñ¼¯×ªÍ¼Ôª±í (defun ss-list(ss) (vl-remove-if 'listp(mapcar 'cadr (ssnamex ss))) ) ;;;;;;;;ÇóÖеã (defun mid(p1 p2) (mapcar '(lambda(x y)(/ (+ x y) 2.0)) p1 p2) ) ;;;;;;;;È¡×éÂëÖµ (defun dxf(n endata) (if(= (type endata) 'ENAME)(cdr(assoc n(entget endata))) (cdr(assoc n endata)) ) )
|