作者suny999 (满20篇了...)
看板Cad_Cae
标题[心得] DIESEL语言简介
时间Wed May 13 01:21:57 2009
为了补充上一篇回文有关於autocad巨集,
於是google了一下DIESEL的介绍与语法
自己想学也顺便整理给大家。
-------------------------------------------------------
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显示所有选单Marco
中DIESEL表达式的输入和输出。
在选单文件中使用DIESEL表达式:
您可以在选单文件中实现DIESEL字符串表达式,并用它们作为生成Marco的补充工具
。这些表达式所返回的字符串值,可以作为AutoCAD命令、AutoLISP和ADS例程以及其
它选单Marco的响应。它们也可以将字符串值返回到选单本身,从而改变选单的外观
或一个选单标示的内容。
用在一个选单项中的一个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表达式,您必须确保该选单项标志的第一个字符为文本字符。
在下面的实例中,我们假设现行图层名设置成了BASE,并将下面的表达式用作选
单文件中一个***popn段中的一个选单项标示:
[ $ (eval,"当前图层:"$(getvar,clayer))]
运行後,在该选单项标示中就会显示:「当前图层:BASE」,无论何时现行图层
被改变时,它的内容都会被自动更新。
您也可以用这种方法交互式地改变显示在下拉式选单中的文本。您可能将要选择
的文本用AutoLISP例程写入到系统变量USERS1-USERS5中,再用一个选单标示中的一
个DIESELMarco检索相应系统变量中的值。
下面的实例中,使用相同的DIESEL表达式作为选单项标示和选单项的一部分,它
提供了一种将现行日期和时间录入到图形中去的现实方法。
[$(edtime,$(getvar,date),DDD","D MON YYYY}}^C^Ctext+
\\\$M=$(edtime,$(getvar,date),DDD","D MON YYYY);
另外,使用DIESELMarco还能实现使选单项变灰或对一个下拉式选单项作标示。当
某个命令处理激活状态时,下面的DIESELMarco使下拉式选单中的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)"
)
)
)
-------------------------------------------------------
DIESEL的概念及其函数_autocad教程
-------------------------------------------------------
DIESEL(Direct Interpretively Evaluated String Expression Language)
是指「直接解释求值的字符串表达式语言」。使用的DIESEL能控制AutoCAD系统
变量MODEMACRO的值,也可用来编写菜单Marco,但只能用来处理字符串。
DIESEL的Marco表达式格式如下:
$(字符串函数名,函数参数1,函数参数2…)
其中,根据函数的不同,函数参数的个数能为零或多个,但最多为9个。
在Marco表达式的不同元素之间,不能有所有空格。所有的Marco表达式都必须以
「$」符号开头。能在DIESEL中使用的函数如下表1:
表1:DIESEL函数一览表
函数名 格式 说明
==========================================================================
"空白" $( ,val1,val2,…) 返回字符串为全部数字之和
- $(-,val1,val2,…) 返回字符串为val1减去其他所有数字之差
* $(*,val1,val2,…) 返回字符串为全部数字之积
/ $(/,val1,val2,…) 返回字符串为val1除以其他所有数字之商
= $(=,val1,val2) 如果val1 = val2,则返回字符串为1,否则为0
< $(<,val1,val2) 如果val1 < val2,则返回字符串为1,否则为0
> $(>,val1,val2) 如果val1 > val2,则返回字符串为1,否则为0
!= $(!=,val1,val2) 如果val1 ≠val2,则返回字符串为1,否则为0
<= $(<=,val1,val2) 如果val1 ≦val2,则返回字符串为1,否则为0
>= $(>=,val1,val2) 如果val1 ≧val2,则返回字符串为1,否则为0
and $(and,val1[,val2,...,val9]) 返回整数val1~val9的按位逻辑和
angtos $(angtos,value[,mode,precision])按指定的格式和精度返回角度值(表2)
edtime $(edtime,time,picture) 返回基於指定图片的格式化的日期和时间(注1)
eq $(eq,str1,str2) 如果字串str1=str2,则字符串返回1;否则返回0
eval $(eval,str) 将一个字符串传给DIESEL计算器并返回计算结果
fix $(fix,value) 返回一个实数数字的整数部分
getvar $(getvar,varname) 返回系统变量varname的值
getenv $(getenv,varname) 返回环境变量varname的当前值;对於未定义的
环境变量,则返回空字符串
if $(if,expr,dotrue[,dofalse]) 如果expr非零,则计算并返回dotrue的
值;否则,计算并返回dofalse的值
index $(index,which,string) 返回由which选定的、以逗号分隔的字符串中指
定的成员,其中第一项编号为0
linelen $(linelen) 返回用户所能见到的最长状态栏的字符长度。
nth $(nth,which,arg0[,arg1,...,arg7])计算并返回由which选定的参数的值,
其中第一项编号为0
or $(or,val1[,val2,...,val9]) 返回整数val1~val9的按位逻辑或
rtos $(rtos,value[,mode,precision]) 按指定的格式和精度返回实数值
strlen $(strlen,string) 回字符串的字符长度
substr $(substr,string,tart[,length]) 返回字符串string的子串,该子串从字
符start开始,长度为length。(字符串中的字符
从1开始编号;如果length被省略,则返回从字
符start开始、到string末尾为止的子串)
upper $(upper,string) 返回字符串string的大写
xor $(xor,val1[,val2,...,val9])返回整数val1~val9的按位逻辑异或(注1该
函数根据参数「mode」和「precision」指定的
格式,给定的参数「value」作为角度值进行编
辑,如果参数「mode」和「precision」被省略
,则使用由「unites」命令指定的当前值。参数
「mode」的取值及其含义见表2。)
表2:「mode」的取值及其含义
==========================================================================
Mode值 字符串格式
0 度
1 度/分/秒
2 百分度
3 弧度
4 勘测单位
注1:该函数返回基於指定图片的格式化的日期和时间。
其中,「time」参数为给定的AutoCAD日期,通常使用函数「$(getvar,date)」来
获取;「picture」参数由日期和时间的特定表示法替代的格式短语组成。格式短语
的定义如表3所示。所有不能解释为格式短语的字符将被完整地复制到函数返回结果
中。
表3:「edtime」函数格式短语定义
==========================================================================
格式 输出示例
D 9
H 5
DD 09
HH 05
DDD Tue
MM 47
DDDD Tuesday
SS 17
^M 6
MSEC 506
MO 06
AM/PM AM
MON Jun
am/pm pm
MONTH June
A/P P
YY 01
a/p p
YYYY 2001
例如以如下格式使用该函数:下例使用上表中的日期和时间。
$(edtime,$(getvar,date),DDD","DDMONYYYY-H:MMam/pm)
他可能的返回结果为:
Tue,9Jun2001-5:47pm
注意「picture」参数中逗号必须放在引号中,否则他将被当作参数分隔符。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.169.194.164
1F:推 sjgau:^C^C 的意思是 cancel, 就是按 CTRL+C 的意思,就是 Esc 05/13 05:52