(defun c:cut_new(/ ss ns i pset oldos en ed p1 p2 plist intSET pi1 pi2 eni intseti j pjlist pj1 pj2 enj intp dis12 midpoint intlist midSET np midlb midrt) (command "undo" "group") (if (= fixdist_1 nil) (setq fixdist_1 400)) (princ "\n请输入控制间距,即平面图中最大梁宽) <") (princ fixdist_1) (princ ">:") (setq fixdist (getint)) (if (= fixdist nil) (setq fixdist fixdist_1)) (setq fixdist_1 fixdist) (setq ss (ssget (list (cons 0 "LINE")))) (setq ns (sslength ss)) (setq i 0) (setq pset nil) (setq oldos (getvar "osmode")) (setvar "osmode" 0) (setvar "cmdecho" 0) ;得到线的端点集 (while (< i ns) (progn (setq en (ssname ss i)) (setq ed (entget en)) (setq p1 (cdr (assoc 10 ed))) (setq p2 (cdr (assoc 11 ed))) (setq plist (list p1 p2 en)) (setq pset (cons plist pset)) (setq i (1+ i)) ) ) ;得到线的交点 (setq intSET nil) (setq i 0) (while (< i ns) (progn (setq plist (nth i pset)) (setq pi1 (nth 0 plist) pi2 (nth 1 plist) eni (nth 2 plist) ) (setq intseti nil) (setq j 0) (while (< j ns) (progn (if (= i j) (setq j (1+ j)) (progn (setq pjlist (nth j pset)) (setq pj1 (nth 0 pjlist) pj2 (nth 1 pjlist) enj (nth 2 pjlist) ) (if (setq intp (inters pi1 pi2 pj1 pj2)) ;如果有交点,则存入交点集 (progn (setq intlist (list intp enj)) (setq intseti (cons intlist intseti)) ;;; (princ intseti) ;;; (princ "\n") ) ) (setq j (1+ j)) ) ) ) ) ;排序 (setq intseti (vl-sort intseti (function (lambda (e1 e2) (or (< (car (car e1)) (car (car e2))) (< (cadr (car e1)) (cadr (car e2))) ) ) ) ) ) (setq intseti (cons eni intseti)) (setq intSET (cons intseti intSET)) ;;; (princ intSET) ;;; (princ "\n") (setq i (1+ i)) );结束progn ) ;结束while i