Строковые выражения DIESEL можно использовать в файлах настройки (НПИ) в качестве дополнительного метода создания макросов.
Эти выражения могут возвращать строковые значения (текстовые строки) в ответ на стандартные команды AutoCAD, процедуры AutoLISP и ObjectARX®, а также другие макросы. Они также могут возвращать строковые значения в меню, что часто используется для изменения вида и содержимого имен пунктов.
С помощью этой строки можно переключаться из пространства листа в пространство модели и обратно (если для переменной TILEMODE установлено значение 0). Выражение вычисляется прозрачно. Если пропустить специальный символ ^P, который переключает переменную MENUECHO, выражение DIESEL будет отображать в командной строке только вызванную команду.
"$раздел=подменю", где раздел - буква M, а подменю - требуемое DIESEL-выражение. Зачастую макросы меню проще реализовать на языке AutoLISP.
При использовании DIESEL-выражений в пунктах меню требуется соблюдать форматВ следующих примерах показаны два аналогичных по назначению пункта меню, в одном из которых использован 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
princ. Если в обоих случаях пропустить специальный символ ^P, который переключает переменную MENUECHO, выражение DIESEL будет отображать в командной строке только вызванную команду, а выражение AutoLISP всю строку выражения.
Оба пункта меню позволяют переключаться из пространства листа в пространство модели и обратно (если TILEMODE равна 0), но выражение DIESEL короче и вычисляется прозрачно, не требуя вызова функции AutoLISPgetxxx. Это позволяет вычислять в пунктах меню режимы текущего чертежа и возвращать соответствующие значения в AutoLISP-процедуры.
Так как значение, возвращаемое выражением DIESEL, является текстовой строкой, его можно использовать в ответах на запросы функций 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) ; Тихий выход
)
Выражения DIESEL, приведенные ниже, умножают указанное пользователем значение на текущее значение переменной DIMSCALE и возвращают полученный масштабный коэффициент.
getxxx (например, функции getreal в предыдущем примере).
Этого невозможно достичь с помощью аналогичных кодов AutoLISP, поскольку, как правило, возвращаемые ими значения не воспринимаются в качестве ответов на запросы функций$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-макрос извлечь его и подставить в меню.
USERS3 (USERS1-5).
Если есть опасность того, что сгенерированные с помощью DIESEL пункты меню будут иметь избыточную длину, проблему можно решить с помощью описанного ниже подхода. Здесь в пункте меню отображаются первые 10 символов текущего значения системной переменной$(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
Подобный подход можно использовать для установки пометки возле имени пункта меню и для интерактивной смены символа, который служит для пометки.