Выражения DIESEL в макросах
 
 
 

Строковые выражения DIESEL можно использовать в файлах настройки (НПИ) в качестве дополнительного метода создания макросов.

Эти выражения могут возвращать строковые значения (текстовые строки) в ответ на стандартные команды AutoCAD, процедуры AutoLISP и ObjectARX®, а также другие макросы. Они также могут возвращать строковые значения в меню, что часто используется для изменения вида и содержимого имен пунктов.

С помощью этой строки можно переключаться из пространства листа в пространство модели и обратно (если для переменной TILEMODE установлено значение 0). Выражение вычисляется прозрачно. Если пропустить специальный символ ^P, который переключает переменную MENUECHO, выражение DIESEL будет отображать в командной строке только вызванную команду.

При использовании DIESEL-выражений в пунктах меню требуется соблюдать формат "$раздел=подменю", где раздел - буква M, а подменю - требуемое DIESEL-выражение. Зачастую макросы меню проще реализовать на языке AutoLISP.

В следующих примерах показаны два аналогичных по назначению пункта меню, в одном из которых использован DIESEL, а в другом AutoLISP.

DIESEL-выражение в пункте меню:

^C^C^P$M=$(if,$(=,$(getvar,cvport),1),mspace,pspace)

AutoLISP-выражение в пункте меню:

^C^C^P(if (= (getvar "cvport") 1)(command "mspace")+
(command "pspace"))(princ) ^P

Оба пункта меню позволяют переключаться из пространства листа в пространство модели и обратно (если TILEMODE равна 0), но выражение DIESEL короче и вычисляется прозрачно, не требуя вызова функции AutoLISP princ. Если в обоих случаях пропустить специальный символ ^P, который переключает переменную MENUECHO, выражение DIESEL будет отображать в командной строке только вызванную команду, а выражение AutoLISP всю строку выражения.

Так как значение, возвращаемое выражением DIESEL, является текстовой строкой, его можно использовать в ответах на запросы функций AutoLISP getxxx. Это позволяет вычислять в пунктах меню режимы текущего чертежа и возвращать соответствующие значения в AutoLISP-процедуры.

Приведенный в примере ниже фрагмент меню включен в текущее меню.

Если загрузить и выполнить приведенный пример процедуры AutoLISP, AutoCAD вставит символ заданного размера в указанную точку. Символы будут выведены на печать с нужным размером (при условии вычерчивания в масштабе, указанном в переменной DIMSCALE).

Процедура на AutoLISP выглядит так:

(defun C:SYMIN ( )
  (setq sym 
	(getstring 
	"\nВведите имя символа: ") ; Запрос имени символа
  ) 
  (menucmd "s=symsize") ; Переключение экранного меню 
							 ; на подменю symsize 
  (setq 
	siz (getreal 
	"\nВыберите размер символа: ") ; Запрос размера символа
	p1 (getpoint 
	"\nТочка вставки: ") ; Запрос точки вставки
  ) 
  (command "insert" ; Команда ВСТАВИТЬ
	sym ; с указанными
	p1 siz siz 0) ; параметрами
  (menucmd "s=") ; Возврат к предыдущему
							 ; экранному меню
  (princ) ; Тихий выход 
)
ПримечаниеРеальный вариант AutoLISP-процедуры должен включать в себя контроль ошибок для проверки корректности введенных пользователем данных.

Выражения DIESEL, приведенные ниже, умножают указанное пользователем значение на текущее значение переменной DIMSCALE и возвращают полученный масштабный коэффициент.

Этого невозможно достичь с помощью аналогичных кодов AutoLISP, поскольку, как правило, возвращаемые ими значения не воспринимаются в качестве ответов на запросы функций getxxx (например, функции getreal в предыдущем примере).

$M=$(*,$(getvar,dimscale),0.375)
$M=$(*,$(getvar,dimscale),0.5)
$M=$(*,$(getvar,dimscale),0.625)

DIESEL-выражения могут также возвращать строковые значения в имена пунктов раскрывающихся меню, что позволяет делать пункты недоступными или каким-либо другим способом менять их внешний вид. При использовании DIESEL-выражения в раскрывающемся меню следует убедиться, что первым символом пункта является $.

Пусть текущим слоем чертежа является BASE, а в качестве метки используется следующее выражение DIESEL.

$(eval,"Текущий слой: " $(getvar,clayer))

В результате данный пункт раскрывающегося меню будет отображать имя текущего слоя (с немедленным обновлением при его смене).

Текущий слой: BASE

Такой же способ можно использовать для интерактивной модификации имен пунктов раскрывающихся меню. Процедура, написанная на AutoLISP, может, например, присвоить текст с нужным именем одной из переменных USERS1-5, а DIESEL-макрос извлечь его и подставить в меню.

ПримечаниеШирина раскрывающихся и контекстных меню определяется в момент загрузки файла настройки. Имена пунктов, генерируемые или изменяемые с помощью DIESEL-выражений после загрузки меню, будут усекаться до длины строки меню.

Если есть опасность того, что сгенерированные с помощью DIESEL пункты меню будут иметь избыточную длину, проблему можно решить с помощью описанного ниже подхода. Здесь в пункте меню отображаются первые 10 символов текущего значения системной переменной USERS3 (USERS1-5).

$(eval,"Текущее значение: " $(getvar,users3))+
 $(if, $(eq,$(getvar,users3),""), 10 пробелов )^C^Cusers3 

Для увеличения ширины меню нельзя добавлять пробелы в конец имен пунктов, т.к. завершающие пробелы игнорируются при загрузке меню. Пробелы, используемые для увеличения ширины меню, должны находиться исключительно внутри DIESEL-выражений.

В следующем примере одно и то же DIESEL-выражение применено и в имени пункта меню, и в его макросе. Таким образом можно, например, ввести в чертеж текущие значения даты и времени.

$(edtime,$(getvar,date),DDD", "Д М ГГГГ)^C^Ctext +
\\\ $M=$(edtime,$(getvar,date),DDD", "Д М ГГГГ);

Макросы на языке DIESEL можно использовать также для установки пометки на пунктах меню и для перевода их в недоступное состояние. Ниже приведен пример отключения вызова команды СТЕРЕТЬ на время действия всех других команд. После завершения их выполнения пункт возвращается в нормальное состояние.

$(if,$(getvar,cmdactive),~)ERASE

Подобный подход можно использовать для установки пометки возле имени пункта меню и для интерактивной смены символа, который служит для пометки.