- •Пример программы генерации 3d твердотельной модели и рабочего чертежа.
- •Запрос координат точки:
- •Проверка значений на соответствие их допустимому диапазону:
- •Расчет параметров модели и чертежа на основе данных, полученных от пользователя:
- •Построение 3d твердотельной модели.
- •Подготовка шаблона чертежа.
Проверка значений на соответствие их допустимому диапазону:
Листинг 1.2 Запрос координат 2D точки, соответствующих допустимому диапазону.
(setq p1 (if p1 p1 (list 0 0)))
(setq szP1 (strcat “Enter point 1 <” (rtos (car p1)) “, ” (rtos (cadr p1)) “>:”))
(setq Paux (getpoint szP1))
(setq p1 (if Paux Paux p1))
(setq Xmin 12 Xmax 120 Ymin –300 Ymax 300)
(while (not (and (< Xmin (car p1))
(> Xmax (car p1))
(< Ymin (cadr p1))
(> Ymax (cadr p1))
)
)
(setq szP1 (strcat “Enter point 1 <” (rtos (car p1)) “, ” (rtos (cadr p1)) “>:”))
(setq Paux (getpoint szP1))
(setq p1 (if Paux Paux p1))
)
По сравнению с листингом 1.1 здесь добавлены строки инициализации диапазона допустимых значений координат 2D точки и цикл проверки их текущих значений на соответствие допустимому диапазону с требованием повторного ввода координат в случае недопустимых значений.
Первые 4 строки точно такие же, как и в листинге 1.1. Их подробное обсуждение см. в п.1.
Пятая строка задает (setq Xmin 12 Xmax 120 Ymin –300 Ymax 300) границы диапазона допустимых значений для каждой из координат 2D точки.
В шестой строке начинается цикл проверки текущих значений координат 2D точки на соответствие диапазону допустимых значений. К этому моменту координаты точки или заданы пользователем в ответ на первый вызов функции getpoint в строке 3, или сохранились без изменений с момента предыдущего исполнения программы (повторный вызов программы и пользователь отказался от ввода новых значений, нажав [Enter]), или проинициализированы значениями по умолчанию (0 0), заданными в строке 1 (первый вызов программы и пользователь отказался от ввода значений, нажав [Enter]). Цикл проверки реализован с помощью функции while. Она имеет следующий формат:
(while <условие> <выражение 1> [<выражение 2> …[<выражение N>]…])
В листинге 1.2 условие имеет следующий вид
(not (and (< Xmin (car p1)) (> Xmax (car p1)) (< Ymin (cadr p1)) (> Ymax (cadr p1))))
Здесь функции car и cadr извлекают координаты точки p1. Функции сравнения < и > сравнивают значения координат с границами диапазона, например, (< Ymin (cadr p1)) проверяет превышает ли значение ординаты точки p1 нижнюю границу Ymin диапазона допустимых значений. Функции сравнения возвращают логические значения T или nil.
Функция and определяет есть ли выход текущих значений координат за какую-либо из границ диапазона, т.е. есть ли хотя бы одно значение nil, возвращенное какой-либо из функций сравнения. Если есть выход за границы диапазона, то функция and возвращает значение nil, которое инвертируется в T с помощью функции not. В этом случае, когда условие равно T, происходит переход к выполнению тела цикла, позволяющего пользователю повторно ввести значения. Запрос повторного ввода будет продолжатся до тех пор, пока пользователь не задаст точку находящуюся в пределах указанного диапазона.
Если при вычислении условия было получено значение nil, т.е. обе координаты точки оказались в пределах диапазона допустимых значений, тело цикла не выполняется и от пользователя не требуется повторного задания точки.
