Тема: Объект - три размера
Предистория
В исполнительных чертежах требуется проставлять по три размера на каждый отснятый на местности объект. К примеру люк колодца должен быть привязан к трем углам зданий или к другим объектам. Но у таких привязок есть ограничения накладываемые ГОСТом: угол между привязками (размерами) должен быть больше 30 градусов и длина привязки должна быть меньше 50 метров.
Я реализовал это дело на ЛИСПе так:
(defun C:QQQ (/ ppc aanngg p1 p2 ang12 *error* olderror) (setq olderror *error*) (defun *error* (msg) (princ "\n Выход. ") (setvar "ANGBASE" 0) (princ " Переменная ANGBASE установлена в ноль.")(setq *error* olderror);) ) ) (setq aanngg (getvar "ANGBASE")) (setq p1 (getpoint "\n Укажите точку 1: ")) (setq ppc 0) (while (setq p2 (getpoint p1 "\n Укажите точку 2: ")) (while (> (distance (list (car p1) (cadr p1)) (list (car p2) (cadr p2))) 50) (setq p2 (getpoint p1 "\n В геотресте не прокатит, укажите другую точку: ")) ) (setq ang12 (atoi (angtos (angle p1 p2) 0 0))) (if (/= ppc 0) (while (if (or (> (distance (list (car p1) (cadr p1)) (list (car p2) (cadr p2))) 50) (< ang12 30) (> ang12 330) (and (> ang12 150) (< ang12 210))) (progn (setq p2 (getpoint p1 "\n В геотресте не прокатит, укажите другую точку: ")) (setq ang12 (atoi (angtos (angle p1 p2) 0 0))) );progn );if );while ) (setq ppc (distance (list (car p1) (cadr p1)) (list (car p2) (cadr p2)))) (setvar "ANGBASE" (angle p1 p2)) (adim3 p1 p2) );while (setvar "ANGBASE" aanngg) (princ) )
Но мне кажется можно сделать гораздо красивее и удобнее создав новый объект акада. Один объект - три размера. В котором соблюдалось бы изложенное выше требование ГОСТа. При переходе за ограничения можно было бы выделить красным или по-просту запретить этот переход.