可以将自定义 (CUI) 文件中的 DIESEL 字符串表达式用作创建宏的另一种方法。
这些表达式可以返回字符串值(文字字符串),以响应标准 AutoCAD 命令、AutoLISP 和 ObjectARX® 例程以及其他宏。它们也可以将字符串值返回菜单本身,从而改变菜单标签的外观或内容。
此字符串提供了 TILEMODE 设置为 0 时在图纸空间和模型空间之间进行切换的方法。此表达式是以透明方式进行计算的。如果省略特殊字符 ^P(用于切换 MENUECHO 的开关状态),则表达式仅显示已执行的命令。
菜单项中使用的 DIESEL 表达式必须遵循 $section=submenu 格式。其中,部分名称为 M,子菜单为要使用的 DIESEL 表达式。通常,使用 AutoLISP 实现宏更为简单。
下例显示了可产生同样结果的两个菜单项;其中一个使用 DIESEL,另一个使用 AutoLISP。
^C^C^P$M=$(if,$(=,$(getvar,cvport),1),mspace,pspace)
^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 例程已经加载到内存中。
- CUI 摘录包含在当前自定义文件中。
- 要插入的符号的宽度和高度均为一个单位。
- DIMSCALE 变量已设置为图形的比例因子(即,如果要打印的图形的比例为 1" = 10',则其比例因子为 120;如果比例为 1/4" = 1',则其比例因子为 48)。
如果要加载和执行 AutoLISP 例程样例,AutoCAD 将按指定大小在指定位置插入符号。打印时,符号为指定大小(如果图形按 DIMSCALE 指定的比例打印)。
(defun C:SYMIN ( )
(setq sym
(getstring
"\nEnter symbol name: ") ; Prompts for a symbol name
)
(menucmd "s=symsize") ; Switches the screen menu
; to the symsize submenu
(setq
siz (getreal
"\nSelect symbol size: ") ; Prompts for a symbol size
p1 (getpoint
"\nInsertion point: ") ; Prompts for insertion point
)
(command "insert" ; Issues the INSERT command
sym ; using the desired symbol
p1 siz siz 0) ; insertion point, and size
(menucmd "s=") ; Switches to the previous
; screen menu
(princ) ; Exits quietly
)
下例中的 DIESEL 表达式将 DIMSCALE 的当前值与指定值相乘,并返回相应的比例因子。
这无法使用类似的 AutoLISP 代码来完成,因为 AutoLISP 表达式返回的值通常无法用作 getxxx 函数调用(例如,上例中的 getreal 函数)的响应。
$M=$(*,$(getvar,dimscale),0.375)
$M=$(*,$(getvar,dimscale),0.5)
$M=$(*,$(getvar,dimscale),0.625)
DIESEL 表达式也可将字符串值返回给下拉菜单项标签,因此用户可以禁用菜单或改变菜单显示的方式。要在下拉菜单标签中使用 DIESEL 表达式,必须确保标签的第一个字符为 $ 字符。
下例中,当前图层设置为 BASE,以下 DIESEL 表达式将用作标签。
$(eval,"Current layer: " $(getvar,clayer))
结果将显示适当的下拉菜单,并且该菜单随着当前图层的更改而更新。
Current Layer: BASE
此方法也可用于交互地更改下拉菜单中显示的文字。可以使用 AutoLISP 例程将 USERS1-5 系统变量设置为选定文字,然后在菜单标签中用 DIESEL 宏进行检索。
如果预计到 DIESEL 生成的菜单标签将过宽,则可用下例来确保菜单宽度能容纳该标签。本例显示 USERS3 (USERS1-5) 系统变量当前值的前 10 个字符。
$(eval,"Current value: " $(getvar,users3))+
$(if, $(eq,$(getvar,users3),""), 10 spaces )^C^Cusers3
不能在菜单标签中使用后续空格来增加菜单的宽度,因为加载菜单时后续空格将被忽略。任何用于增加菜单标签宽度的空格都必须包含在 DIESEL 表达式中。
下例使用相同的 DIESEL 表达式作为菜单项的标签和显示部分。它提供了在图形中输入当前日期的有效方法。
$(edtime,$(getvar,date),DDD", "D MON YYYY)^C^Ctext +
\\\ $M=$(edtime,$(getvar,date),DDD", "D MON YYYY);
也可以使用 DIESEL 宏来标记或禁用下拉菜单标签。下面的下拉菜单标签在命令处于活动状态时显示 ERASE 不可用。文字通常是在命令未激活时显示。
$(if,$(getvar,cmdactive),~)ERASE