Разработка программы – генератора параметрических моделей и чертежей, страница 2

Третья строка выполняет запрос данных у пользователя. Функция getpoint выводит в зону подсказки содержимое строковой переменной szP1, информируя пользователя о требуемых действиях с его стороны и предлагая в угловых скобках значение по умолчанию. После этого функция getpoint ожидает действий пользователя. Если пользователь согласится со значениями по умолчанию, то он должен нажать клавишу [Enter]. Это действие будет воспринято как отказ от ввода данных и функция getpoint возвратит значение nil. Если пользователь не согласен со значением по умолчанию, то он должен указать точку с помощью мыши или ввести ее координаты с клавиатуры. В этом случае функция getpoint возвратит список с координатами введенной точки. Результат выполнения функции getpoint будет сохранен во вспомогательной переменной Paux.

В четвертой строке проводится анализ ответа пользователя. Если пользователь ввел значения координат точки в ответ на запрос функции getpoint, то они были сохранены в переменной Paux и, в случае подстановки этой переменной в качестве условия в функцию if, она будет трактоваться как значение T (истинно). Поскольку эта же переменная стоит в качестве выражения выполняемого в случае выполнения условия в функции if, то ее же значение и будет возвращено функцией if, а затем сохранено в качестве нового значения переменной p1. Если пользователь согласился со значениями по умолчанию, отказавшись от ввода других значений, то переменная Paux  в качестве условия будет трактоваться как nil (ложно) и в качестве возвращаемого значения функции if будут переданы неизмененные координаты точки p1.

Таким образом, в зависимости от предыстории работы программы и действий пользователя в результате выполняемого фрагмента кода может реализоваться одна из трех ситуаций:

1)  точка p1 инициализируется координатами 0,0;

2)  точка p1 сохраняет свои координаты без изменений;

3)  пользователь задает мышью или с клавиатуры новые значения координат точки p1.

  1. Проверка значений на соответствие их допустимому диапазону:

Листинг 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. Она имеет следующий формат: