Пример программы генерации 3D твердотельной модели и рабочего чертежа.




 

  1. Запрос координат точки:

Листинг 1.1 Запрос координат 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))

 

Листинг1.1 показывает как запрашивать в цикле координаты 2D точки с использованием динамически формируемой строки запроса.

Первая строчка фрагмента, представленного в Листиге 1.1, проверяет существует ли точечная переменная p1, т.к. она могла быть создана в момент предыдущей итерации цикла или предыдущего запуска программы в текущем сеансе работы с AutoCAD. Функция if, если переменная p1 уже существует, возвращает ее значения без изменения, если переменная p1 имеет значение nil (не существует), вызывает функцию list для формирования списка из координат точки (0, 0). Результат выполнения функции if (предыдущее значение переменной p1 или точка (0, 0)) присваивается в качестве нового значения переменной p1.

Вторая строка в рассматриваемом фрагменте динамически формирует строку подсказки и сохраняет ее в строковой переменной szP1. Например, если к этому моменту переменная p1 хранит значения координат точки (5 7), то в переменной szP1 будет сохранена строка “Enter point 1 <5, 7>:”. Этот текст будет появляться в зоне подсказки AutoCAD после выполнения рассматриваемой строки кода. Согласно используемым в командной строке AutoCAD соглашениям, значения приведенные в угловых скобках, являются значениями предлагаемыми по умолчанию, и пользователь может их выбрать, просто нажав клавишу Enter. Так как от итерации к итерации значение точки p1 может меняться, то текст подсказки должен формироваться динамически, что и достигается в коде рассматриваемой строки. Функции car и cadr возвращают соответственно координаты x, y точки p1 (в формате с плавающей точкой). Функция rtos преобразует число в строку текста. Для рассматриваемого листинга вызовы (rtos (car p1)) и (rtos (cadr p1)) возвратят строки “5” и “7”. Функция strcat выполняет слияние строк в одну строку текста. В нашем примере строки “Enter point 1 <”, “5”, “, ”, “7” и “>:” преобразуются в строку “Enter point 1 <5, 7>:”, которая записывается в качестве значения переменной szP1 и будет использована для вывода текста подсказки во время запроса.

Третья строка выполняет запрос данных у пользователя. Функция 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. Она имеет следующий формат:

(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, т.е. обе координаты точки оказались в пределах диапазона допустимых значений, тело цикла не выполняется и от пользователя не требуется повторного задания точки.

  1. Расчет параметров модели и чертежа на основе данных, полученных от пользователя:
  2. Построение 3D твердотельной модели.
  3. Подготовка шаблона чертежа.

 

 

 




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: