Хранение пользовательских типов данных. Часть 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 не выполняется.

Лично я несколько раз "обжигался" на небольшой логической ошибке: я сначала устанавливал значение внедокументной переменной, и лишь потом пытался выполнить действия. Это не всегда критично, но жизнь подпортить может.

Размещено в Код LISP, Новости, Функции LISP · Метки: ,



Поделитесь своим мнением


Я не робот.