Тема: LISP. Выравнивание отрезков по осям X и Y
Программу разработал Александр Ривилис по запросу участника форума под ником Forma.
Код можно сохранить в файле с именем l_align_xy.lsp
;;---------------------------------------------------- ;; Программа для выравнивания отрезков по осям X и Y ;; Если отрезки не будут лежать в плоскости МСК ;; результат работы не определен. ;; Автор Александр Ривилис. ;;---------------------------------------------------- (defun C:L_ALIGN_XY ( / ss en e p1 p2 i n dir d dr x y l dl) (setvar "CMDECHO" 0) (if (null L_ALIGN_XY_delta_ang) (progn (setq L_ALIGN_XY_delta_ang 1.0) )) ;; (if (progn (setq d (getreal (strcat "\nМаксимальный угол отклонения от оси в градусах <" (rtos L_ALIGN_XY_delta_ang 2 3) ">: "))) (if d (setq L_ALIGN_XY_delta_ang (abs d))) (setq d (* PI (/ L_ALIGN_XY_delta_ang 180.0))) (princ "\nВыберите отрезки для выравнивания: ") (cond ((setq ss (ssget '((0 . "LINE")))) (setq i 0 n (sslength ss)) (while (< i n) (setq e (entget (ssname ss i))) (setq p1 (cdr (assoc 10 e)) p2 (cdr (assoc 11 e))) (setq l (distance p1 p2)) ;; Длина отрезка (setq dir (angle p1 p2)) ;; Находим угол с осью X ;; Приводим угол в диапазон 0...2*PI (if (< dir 0.0) (setq dir (+ (* 2.0 PI) dir))) (cond ;; Отрезок условно параллелен оси X ((or (equal dir 0.0 d) (equal dir PI d) (equal dir (* 2.0 PI) d)) (setq y (* 0.5 (+ (cadr p1) (cadr p2)))) (setq p1 (list (car p1) y (caddr p1))) (setq p2 (list (car p2) y (caddr p2))) (setq dl (* 0.5 (- l (distance p1 p2)))) ;; Восстанавливаем длину отрезка (setq p1 (polar p1 (angle p2 p1) dl)) (setq p2 (polar p2 (angle p1 p2) dl)) (setq e (subst (cons 10 p1) (assoc 10 e) e)) (setq e (subst (cons 11 p2) (assoc 11 e) e)) (entmod e) ) ;; Отрезок условно параллелен оси Y ((or (equal dir (* PI 0.5) d) (equal dir (* PI 1.5) d)) (setq x (* 0.5 (+ (car p1) (car p2)))) (setq p1 (list x (cadr p1) (caddr p1))) (setq p2 (list x (cadr p2) (caddr p2))) (setq dl (* 0.5 (- l (distance p1 p2)))) ;; Восстанавливаем длину отрезка (setq p1 (polar p1 (angle p2 p1) dl)) (setq p2 (polar p2 (angle p1 p2) dl)) (setq e (subst (cons 10 p1) (assoc 10 e) e)) (setq e (subst (cons 11 p2) (assoc 11 e) e)) (entmod e) ) ) ;; (cond (setq i (1+ i)) ) ;; endof (while ) (T (princ "\nНичего не выбрано, или выбрано что-то не то!") ) ) ;; (cond (princ) )
Возможный макрос для кнопки или пункта меню:
^C^C^P(if (not C:L_ALIGN_XY) (load "l_align_xy")) L_ALIGN_XY