我是想把以前非参照图框改为参照的,但图框有些内容还要保留..批量修改时.多选几个就会出现intersect 所选对象太多 导致程序出错, 以下是源码: (defun c:tk ( / inspt xa-ent plst nlst ent inspt pt len sca newent x y pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 ss-oldtk oldla ptcmp1 ptcmp2 fileflag) (command "undo" "be") (setvar "cmdecho" 0) (princ"\n支持当前坐标系,选择要替划的图框") (if (setq ss-oldtk (ssget '((8 . "市政图框")))) (progn (setq pliness (ssget "P" '((0 . "LWPOLYLINE") (40 . 0.0) (90 . 4) (70 . 1)))) ;;;;70为闭合,90为四边形 40为线宽为0 (initget "S" ) (setq fileflag (getkword "\n选取要参照的图框<S更改> <回车默认>")) (setq filename "E:\\cad简化命令\\Tyt\\A3sztk.dwg") (if (or (= fileflag "S") (= (findfile filename) nil) ) (setq filename (getfiled "选取要参照的图框" "" "dwg" 2)) ) (setq fileflag nil) (if filename (progn (setq olderr *error*) ;;;;错误函数;;; (defun *error* (msg) (princ "\n程序出错!") (command "layer" "S" oldla "") (command "undo" "end") (setq *error* olderr) (princ) ) ;;; (setq oldla (getvar "clayer")) (command "layer" "S" "市政图框" "") (setq i 0 ) (repeat (sslength pliness) (setq plst '() nlst '()) (setq ent (entget (ssname pliness i))) (mapcar '(lambda (x) (if (= (car x) 10) (setq plst (cons (trans (cdr x) 0 1 ) plst) ) ) ) ent );mapcar ;;;根据坐标x轴大小排列;;; (setq nlst (vl-sort plst (function (lambda (e1 e2) (< (car e1) (car e2) ) ) ) ) ) ;;;寻找左下角点; (setq ptcmp1 (nth 0 nlst)) (setq ptcmp2 (nth 1 nlst)) (if (< (cadr ptcmp1) (cadr ptcmp2)) (setq inspt ptcmp1) (setq inspt ptcmp2) ) (setq pt (nth 2 nlst)) (setq len (abs(- (car pt) (car inspt) )) ) (setq sca (/ len 410 )) (setq x (car inspt)) (setq y (cadr inspt)) (setq pt1 (list (+ x (* sca 120)) (+ y (* sca 5))) ) (setq pt2 (list (+ x (* sca 195)) (+ y (* sca 12))) ) (setq pt3 (list (+ x (* sca 335)) (+ y (* sca 12))) ) (setq pt4 (list (+ x (* sca 360)) (+ y (* sca 18))) ) (setq pt5 (list (+ x (* sca 375)) (+ y (* sca 5))) ) (setq pt6 (list (+ x (* sca 405)) (+ y (* sca 12))) ) (setq pt7 (list (+ x (* sca 355)) (+ y (* sca 268))) ) (setq pt8 (list (+ x (* sca 405)) (+ y (* sca 280))) ) (setq pt9 (list (+ x (* sca 405)) (+ y (* sca 266))) ) (setq pt10 (list (+ x (* sca 20)) (+ y (* sca 22))) ) (setq ss1 (ssget "w" pt1 pt2 '((8 . "市政图框")) )) (setq ss2 (ssget "w" pt3 pt4 '((8 . "市政图框")) )) (setq ss3 (ssget "w" pt5 pt6 '((8 . "市政图框")) )) (setq ss4 (ssget "W" pt7 pt8 '((8 . "市政图框")) )) (setq ss5 (ssget "W" pt9 pt10 '((8 . "市政图框")) )) ;;图框内选择集 ;;;;; (defun ss-del (ss-1 ss-2 / ss1 ss2 n ent ents newss);;;ss-2中删除ss-1 (setq n 0) (repeat (sslength ss-1) (setq ents (entget (ssname ss-1 n))) (setq ent (cdr (assoc -1 ents))) (setq newss (ssdel ent ss-2)) (setq n (+ n 1)) ) newss );;defun (if (/= ss1 nil) (setq ss-oldtk (ss-del ss1 ss-oldtk));;;图层中要保留的图框内容 ) (if (/= ss2 nil) (setq ss-oldtk (ss-del ss2 ss-oldtk)) ) (if (/= ss3 nil) (setq ss-oldtk (ss-del ss3 ss-oldtk)) ) (if (/= ss4 nil) (setq ss-oldtk (ss-del ss4 ss-oldtk)) ) (if (/= ss5 nil) (setq ss-oldtk (ss-del ss5 ss-oldtk)) ) (command "_xref" "" filename inspt sca "" 0) (setq i (+ i 1)) );repeat (command "erase" ss-oldtk "") );progn (alert "\n没找到参照图框!!!!") );if filename ) ;;pgogn ss-oldtk (alert "\n只适用于[410x285]图框!!!!") ):if ss-oldtk (setq olderr *error*) (command "layer" "S" oldla "") (command "undo" "end") (princ) ) |