Введение в Автолисп | страница 14




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. Кроме них в программу включен еще один функциональный модуль, позволяющий установить границы экрана, не выводя форматные рамки. Особенно это удобно при работе над объектами большой протяженности (например, в строительных или геоинформационных чертежах). Поскольку Автокад допускает применение аббревиатур при вводе многих опций, это обстоятельство частично использовано при написании программы.