宏中的 DIESEL 表达式 (概念)

AutoCAD 2008

 
宏中的 DIESEL 表达式
概念 快速参考
 
 
 

可以将自定义 (CUI) 文件中的 DIESEL 字符串表达式用作创建宏的另一种方法。

这些表达式可以返回字符串值(文字字符串),以响应标准 AutoCAD 命令、AutoLISP 和 ObjectARX® 例程以及其他宏。它们也可以将字符串值返回菜单本身,从而改变菜单标签的外观或内容。

此字符串提供了 TILEMODE 设置为 0 时在图纸空间和模型空间之间进行切换的方法。此表达式是以透明方式进行计算的。如果省略特殊字符 ^P(用于切换 MENUECHO 的开关状态),则表达式仅显示已执行的命令。

菜单项中使用的 DIESEL 表达式必须遵循 $section=submenu 格式。其中,部分名称为 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 例程已经加载到内存中。
  • CUI 摘录包含在当前自定义文件中。
  • 要插入的符号的宽度和高度均为一个单位。
  • DIMSCALE 变量已设置为图形的比例因子(即,如果要打印的图形的比例为 1" = 10',则其比例因子为 120;如果比例为 1/4" = 1',则其比例因子为 48)。

如果要加载和执行 AutoLISP 例程样例,AutoCAD 将按指定大小在指定位置插入符号。打印时,符号为指定大小(如果图形按 DIMSCALE 指定的比例打印)。

下例展示了 AutoLISP 例程样例:

(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 
)
注意常用的 AutoLISP 例程应该包括错误检查,以验证用户输入的正确性。

下例中的 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 表达式生成或更改的菜单标签都将被截断以符合现有菜单的宽度。

如果预计到 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

可以使用类似的方法在下拉菜单项旁边作标记或者交互更改标记所使用的字符。