Выбрать главу

Процедура создания слоев может быть осуществлена автоматически при загрузке формата. В функции sloy, описанной далее, устанавливаются слои CONTUR, CENTER, DIM и HIDDEN, которым присваиваются соответственно цвета: белый, красный, зеленый и желтый, а в слои CENTER и HlDDEN загружаются соответственно типы линий AcadISO04w100 и AcadISO02w100. Поскольку любая функция может записываться в несколько строк, воспользуемся этим для построения программы.

(defun sloy ()

(command “linetype” “load” “AcadISO04w100” “acadiso.lin”

“load” “AcadISO02w100” “” “”)

(command “layer” “new” “contur”

“new” “center”

“new” “dim”

“new” “hidden”

“Itype” “AcadISO04w100” “center”

“Itype” “AcadlSO02w100” “hidden”

“color” “red” “center”

“color” “green” “dim”

“color” “yellow” “hidden”

“set” “contur” ""

) ; конец command

) ; конец defun

Последняя команда устанавливает в качестве текущего слой CONTUR.

3.3.3. Организация поля изображения

Поле изображения чертежа можно ограничить внешней рамкой. Но это неудобно, если в процессе работы над чертежом необходимо осуществить к внешней рамке объектную привязку. Поэтому многие пользователи предпочитают, чтобы размеры поля изображения превосходили размеры рамки. Организуем границы поля изображения таким образом, чтобы между рамкой и границами экрана оставалось не менее 10 мм. Для этого укажем координаты левого нижнего p1 и правого верхнего рЗ углов поля.

(defun pole ()

(setq p1 (polar pt1 (+ pi (/ pi 4)) 15))

(setq рЗ (polar pt3 (/ pi 4) 15))

(command “limits” p1 рЗ)

(command “zoom” “all”)

)

Дальнейших пояснений функция не требует.

3.3.4. Работа с системными переменными

Создание программы на любом языке требует определенной культуры программирования. Применительно к Автолиспу это, в первую очередь, означает, что при работе программ не должна без нужды нарушаться исходная конфигурация, во всяком случае ее следует восстановить после выполнения всех операций, предусмотренных программой.

Восстановление исходной конфигурации возможно, если изменяемые функцией параметры закреплены в памяти. Обычно пользователь сталкивается с такой ситуацией, когда некоторые системные переменные должны принять определенные значения. При этом текущие значения таковых могут и соответствовать требуемым, но проверка их значений - задача кропотливая и длительная. Проще, не задумываясь о конфигурации, сохранить текущие значения тех переменных, которые должны быть регламентированы для работы программы. Несколько позже (разд. 6.6) будет рассмотрена возможность сохранения любого количества системных переменных, здесь же ограничился сохранением значения только одной из них.

В Автокаде существует системная переменная CMDECHO. Если ей присвоено значение, равное единице, все команды, воспринимаемые Автокадом, отражаются в командной строке. Поэтому в течение всего времени работы программы будет происходить непрерывное мелькание команд в поле сообщений. Чтобы избавиться от этого не совсем приятного явления, целесообразно вывод команд подавить, установив CMDECHO в ноль, а после окончания работы программы восстановить исходное значение. Сохранение текущей установки осуществляется присваиванием значения переменной некоторому идентификатору. В рассматриваемом случае это может быть осуществлено следующим образом:

(defun sysvar()

(setq svarold (getvar “cmdecho”))

(setvar “cmdecho” 0)

).

Здесь использованы две не описанные ранее функции: getvar и setvar. Обе они предназначены для работы только с системными переменными. Первая извлекает текущее значение системной переменной, вторая - приписывает ей значение заданное.

На этом подготовительная работа заканчивается и можно записать программу полностью.

3.3.5.  Объединение нескольких команд

Мы рассмотрели составление программы, вычерчивающей рамку формата A1. Аналогично можно написать программы и для других форматов. Например, применительно к формату АЗ основная программа выглядит следующим образом:

(defun C:A3 ()

(setq pt1 '(-20 -5))

(setq pt2 '(400 292))

(setq pt3 '(0 0))

(setq pt4 '(395 287))

)

Написав подобные функции для всех форматов (А0 ... A4), можно объединить их в одном файле. Далее приводится пример объединения двух команд обрисовки рамок форматов A2 и A4. Кроме них в программу включен еще один функциональный модуль, позволяющий установить границы экрана, не выводя форматные рамки. Особенно это удобно при работе над объектами большой протяженности (например, в строительных или геоинформационных чертежах). Поскольку Автокад допускает применение аббревиатур при вводе многих опций, это обстоятельство частично использовано при написании программы.