Хранение пользовательских типов данных. Часть 2. Данные между документами
Как было обещано здесь, сейчас поговорим о данных, хранимых внутри сессии AutoCAD'a. В принципе, все просто и незатейливо (если есть понимание, зачем это надо ;))
За примерами далеко ходить не надо. Например, некое сообщение должно появляться только в первом файле, а в открываемых его отображать уже не надо. Или настройки dcl-окна...
Для работы с такими данными в VisualLISP есть две функции - vl-bb-set и vl-bb-ref. Несмотря на стремление Autodesk "удалить" vl*-функции из справки, в 2011 версии описание именно этих функций есть.
vl-bb-set: записывает в переменную значение. Формат вызова прост:
1 | (vl-bb-set 'переменная значение) |
Обратите внимание на апостроф перед именем переменной. Значение может быть любым, кроме (как заявлено) функции. Хотя, справедливости ради надо заметить, что это не совсем так: можно сохранить в переменной текстовое описание функции, а потом ее вычислить, выполнив пару eval - read.
В применении vl-bb-set без vl-bb-ref немного смысла. vl-bb-ref читает из переменной значение:
1 | (vl-bb-ref 'переменная) |
И здесь нужен апостроф, не забывайте про него
Ну и, наконец, небольшой пример использования:
1 2 3 4 5 6 7 8 9 10 | (defun _lispru-make-alert () (if (not (vl-bb-ref '*lispru-bb-alert*)) (progn (alert "А вот и стартовое сообщение") (vl-bb-set '*lispru-bb-alert* t) ) ;_ end of progn ) ;_ end of if ) ;_ end of defun (_lispru-make-alert) |
Тут все просто: сначала проверяется, какое значение хранится во внедокументной переменной *lispru-bb-alert*. Если там ничего нет (то есть конструкция (vl-bb-ref '*lispru-bb-alert*) возвращаает nil), то вызываем alert (или делаем какие-то другие действия) и устанавливаем значение переменной в t. При повторном вызове (_lispru-make-alert) значение в *lispru-bb-alert* уже t, так что захода "внутрь" if не выполняется.
Лично я несколько раз "обжигался" на небольшой логической ошибке: я сначала устанавливал значение внедокументной переменной, и лишь потом пытался выполнить действия. Это не всегда критично, но жизнь подпортить может.