DIESEL入门
DIESEL语言是一种处理字符串的语言。
由于MODEMACRO系统变量是一个字符串类型的系统变量,它的内容也就是AutoCAD图形屏幕的状态行中的显示内容,所以,通过DIESEL就可以控制状态行中信息的显示。
所有DIESEL的表达式都是由组成的。一个DIESEL函数的一般调用格式如下所示:
$(function,argument1,argument2…)
函数和函数的变元都被放在圆括符中,函数名永远放在第一的位置上。这一点与AutoLISP是相同的。函数和变元之间,变元和变元之间都用逗号分隔,这一点与AutoLISP语言不同。然而,为了与AutoLISP相区别,DIESEL函数用$符号开头。
与DIESEL配合使用的系统变量:
有几个系统变量常与DIESEL配合使用,以下将列出代大家参考。
1.MODOMACRO系统变量:
它控制状态栏中显示的内容。
2.MACROTRACE系统变量:
它是DIESEL表达式的调试工具。在隐含情况下,它的值设置为0(关)。如果将它设置成1(开),就会对所有表达式进行求值,包括在菜单中和状态栏中所使用的那些表达式。
3.USERS1-USERS5系统变量:
这五个变量为字符串变量,可由用户随意定义其值。
4.MENUECHO系统变量:
它是另一个有用的DIESEL调试工具。若将它设置为8,AutoCAD显示所有菜单宏中DIESEL表达式的输入和输出。
在菜单文件中使用DIESEL表达式:
您可以在菜单文件中实现DIESEL字符串表达式,并用它们作为生成宏的补充工具。这些表达式所返回的字符串值,可以作为AutoCAD命令、AutoLISP和ADS例程以及其它菜单宏的响应。它们也可以将字符串值返回到菜单本身,从而改变菜单的外观或一个菜单标示的内容。
用在一个菜单项中的一个DIESEL表达式必须跟在$section=submenu格式之后,这里的段名(section)是M,而submenu是您想要的DIESEL表达式。一般来说,AutoLISP实现一个菜单项可能比较容易,但也并非总是如此。
下面给出两个产生相同结果的菜单项实例,其中一个用DIESEL实现,另一个用AutoLISP实现。
使用DIESEL表达式实现的这个菜单项如下:
[图纸空间/模型空间]^C^C^P$M=S(if ,$(getvar,cvport),1),mspace,pspace)
使用AutoLISP表达式实现的这个菜单项如下:
[图纸空间/模型空间]^C^C^P(if (=(getvar “cvport”) 1)(command”mspace”)+
(command “pspace”))(princ)
两个菜单项都为在模型空间与图纸空间之间切换提供了一种方法如果TILEMODE设置为0的话),但DIESEL表达式更短,而且其求值是透明的,且不需要调用AutoLISP的pronc函数。如果在这两种情况下都把专用字符^P省略(^P控制MENUECHO变量的打开和),DIESEL表达式公显示所发出的命令,而AutoLISP表达式则显示事先代码。
由于由DIESEL表达式所返回的是一个文本字符串值,所以它能用来响应AutoLISP的getxxx函数调用的请求。这就使得菜单项可以根据现行图形的条件进行求值,并返回一个值AutoLISP例程。
DIESEL表达式还能返回一个字符串值给下拉式菜单项的标示(labels),这样您就能使一个菜单项标志变成灰色或者改变菜单项的显示方式。为了在一个下拉式菜单标示中使用一个DIESEL表达式,您必须确保该菜单项标志的第一个字符为文本字符。
在下面的实例中,我们假设现行图层名设置成了ba
se,并将下面的表达式用作菜单文件中一个***popn段中的一个菜单项标示:
[ $ (e
val,”当前图层:”$(getvar,clayer))]
运行后,在该菜单项标示中就会显示:“当前图层:ba
se”,无论何时现行图层被改变时,它的内容都会被自动更新。
您也可以用这种方法交互式地改变显示在下拉式菜单中的文本。您可能将要选择的文本用AutoLISP例程写入到系统变量USERS1-USERS5中,再用一个菜单标示中的一个DIESEL宏检索相应系统变量中的值。
下面的实例中,使用相同的DIESEL表达式作为菜单项标示和菜单项的一部分,它提供了一种将现行日期和时间录入到图形中去的现实方法。
[$(edtime,$(getvar,date),DDD”,”D MON YYYY}}^C^Ctext+
\$M=$(edtime,$(getvar,date),DDD”,”D MON YYYY);
另外,使用DIESEL宏还能实现使菜单项变灰或对一个下拉式菜单项作标示。当某个命令处理激活状态时,下面的DIESEL宏使下拉式菜单中的ERASE命令变灰显示(一个菜单项变灰时,说明此时本菜单项不可选择)。
[$ (if ,$(getvar,cmdactive),~)ERASE]erase
使用类似的方法可以在一个下拉式菜单项里面放置一个标记(mark),或者交互式地改变标记所使用的字符。
在AutoLISP中使用DIESEL表达式:
通过调用menucmd函数,您可以在AutoLISP例程中DIESEL表达式。其格式类似于在菜单文件中DIESEL。
下面的代码片段将变量ctime设置成现行时间:
(setq c_time (menucmd “M = $(edtime,$(getvar,data),HH:MM a/p)”))
使用DIESEL定义状态栏:
使用AutoLISP语言可以实现对MODEMACRO变量的定义。下面给出的程序代码可以模拟AutoCAD的现行内部状态行。
(defun C:ACADMODE()
(setvar”modemacro”
(strcat
“图层 $(substr,$(getvar,clayer),1,8)”
“$ (if,$(getvar,orthomode),正交)”
“$ (if,$(getvar,snapmode), 捕捉)”
“)”
)
)
)
您可以将这个程序保存在一个名为ACADMODE。LSP文件中。然后加载并执行它,这时就可产生一个不同的状态行。然而,这并不是使用这一特性的最有用的应用方式,它仅提供了一个实例。加载并这个程序后,也许您并没有感觉到有什么不同,但如果您将图层改为L时,您就会知道MODEMACRO正在起作用。
您可以将该程序定义在ACAD.LSP文件中并定义成S::STARTUP()函数,这样在每次启动都可以启用自己定义的状态栏。
(defun s::startup()
(setvar “modemacro”
(strcat
“A$(getvar,useri1)图”
“,字型:$(getvar,textstyle)”
“,标注:$(getvar,dimstyle)”
)
)
)
作者:西部车床,如若转载,请注明出处:https://www.lathe.cc/2022/11/8051.html