autocad中的diesel语言详解

  1. Diesel,Rudolf,1858-1913,德国工程师,所谓的DIESEL的发明者。
  2. “Dumb Interpretively Evaluated String Expression Language”的缩写,AutoCAD和AutoCAD LT中的简单编程语言

VG-Wort Access-ZählmarkeAutoCAD附带了大量API(应用程序编程接口),可以使用LISP,VBA或C ++等语言构建自定义环境。在AutoCAD的第12版中,我们突然发现产品中隐藏了另一种小编程语言。它据说自版本1.4以来一直在发布列表中,遵循Autodesk的传统:“好吧,我们可以让它变得简单,但为什么不让它可定制?” 
AutoCAD程序员使用DIESEL向菜单标签添加少量复选标记,并在命令前面取消“取消”。有些人还使用DIESEL将图纸名称添加到状态栏。在Windows发布之后,即使使用DIESEL也不见了。所以它可能在历史上逐渐消失......
但随后Autodesk发布了AutoCAD LT,并且在对AutoLISP LT产生了一些初步混淆之后 - 我们了解到DIESEL是 LT中唯一的编程语言。突然间花些时间和DIESEL玩是很有意义的。本文将教您如何使用DIESEL,何时使用它以及为什么。

专业人士,请继续阅读

专业的LISP和ADS程序员可能认为DIESEL不值得考虑。在你翻页之前,首先回答这个小测验:“向我展示从逗号分隔的关键字列表中提取第三项的最短例程。” 这是我的解决方案,这只不过是对DIESEL的调用:

(defun 3rd (string)
 (menucmd (strcat "m=$(index,2,\"" string "\")"))
)

你知道,即使你没有任何理由来处理LT,DIESEL也很有用。现在,如果您之前知道这一点,请不要再进一步阅读......否则:这里有一些DIESEL供LISPers使用

专业人士,不要忘记RText

你不做LISP,你不做菜单宏。好吧,也许DIESEL真的不适合你。但是,您是否希望AutoCAD对象显示为文本,但会根据当前环境自动更改其内容?例如,您是否希望文本字符串自动显示当前图形文件的名称和路径,或上次编辑的日期?
没问题,如果您安装了AutoCAD Release 14或更高版本的Bonus / Express工具,请查看RText命令。这会创建一个RText对象,就像我刚刚报告的那样。你如何定义变体文本字符串?您输入DIESEL表达式。

专业人士,并自己使用它

DIESEL由John Walker为Autodesk,Inc。编写。约翰和Autodesk将该程序及其源代码放在公共领域。您可以从John Walker的网站www.fourmilab.ch/diesel下载完整的源代码。这允许您将DIESEL解释器嵌入到您自己的程序中,无论是否与AutoCAD相关。如果您遇到DIESEL的其他实现,请通过dietmar@crlf.de告知我们

到目前为止,已经“知道一切”的专业人士有三个原因可供阅读。现在让我们来看看DIESEL究竟是什么以及你能用它做些什么。

字符串处理语言

DIESEL背后的基本理念很简单:“只有字符串”。
DIESEL解释器接受一个字符串,处理它,并返回一个字符串。最初,DIESEL解释器返回其输入流中的每个字符。但这很无聊。因此,DIESEL解释器在输入流中接受特殊字符序列(“函数调用”),并用函数结果替换它们。

交互式的DIESEL

没有单独的DIESEL的交互式版本,即您不能键入字符串,将其传递给DIESEL解释器并打印结果。但是建立一个DIESEL语句却相当容易。

如果使用完整版本的AutoCAD,请在命令行中直接键入以下行:

(defun c:DIESEL (/ s)
 (while (/= "" (setq s (getstring "\nDIESEL: " T)))
  (princ (menucmd (strcat "m=" s)))
 )
 (princ)
)

这将实现一个名为DIESEL的新命令(还有什么)。它会提示您输入一个字符串,将其传递给DIESEL解释器,并报告结果。

如果您使用AutoCAD LT并且更喜欢菜单,请将以下内容作为一行添加到菜单文件中,例如,按照_time命令:

[DIESEL]*^C^C_SETENV DIESEL;\_SETENV DIESEL;$M=$(EVAL,"$(GETENV,DIESEL)");

下次启动LT时,菜单将重新编译,您将在适当的下拉菜单中找到DIESEL命令。点击“DIESEL”。该命令将提示您输入一个字符串,将其传递给DIESEL解释器,并报告结果。

如果使用AutoCAD LT 97并更喜欢工具栏,请创建DIESEL工具栏按钮。要执行此操作,请右键单击任何工具,选择“新建”并输入DIESEL作为工具栏名称。DIESEL工具栏会打开,但其中没有工具。选择“自定义”,然后将“自定义”类别中的空白按钮拖到新工具栏中。在名称和帮助下输入“DIESEL Test”,宏输入:

*^C^C_SETENV DIESEL;\_SETENV DIESEL;$M=$(EVAL,"$(GETENV,DIESEL)")

关闭所有工具栏对话框。LT将重新编译菜单,现在您有一个DIESEL测试命令按钮。它将再次提示您输入一个字符串,将其传递给DIESEL解释器,并报告结果。

在较新版本的AutoCAD LT中,您使用相同的宏,只有创建按钮的方式有点不同。使用工具>自定义>工具栏。使用“工具栏”选项卡创建DIESEL工具栏,使用“命令”选项卡将用户定义的按钮拖动到此新工具栏,然后使用“属性”选项卡输入名称,帮助字符串和宏。

DIESEL基础知识

让我们开始尝试我们的定制DIESEL命令。

DIESEL: Hello,world!
Hello,world!

DIESEL刚刚通过了任何编程语言的基本测试。它打印出“Hello,world!”字样。但是,你说这不是证据吗?也许它没有解释输入线?好的,测试#2:

DIESEL: "Hello,world!"
Hello,world!

你看?它真的做到了。它会抑制测试字符串周围的引号。由于DIESEL中的所有内容都是字符串,因此有时您需要明确地说“这是一个字符串,而这不是!” 与其他所有编程语言一样,一对引号表示“这是一个字符串!”。DIESEL解释器将此接受为输入字符串,而返回的结果是没有引号的字符串,如您所料。
那么,如何将引号放入字符串中?简单地说,使用两个引号来表示一个, 加上一对周围的引号告诉DIESEL“这只是一个字符串!”:

DIESEL: """Hello,world!"""
"Hello,world!"

DIESEL函数

正如前面所说的,字符串传递给DIESEL解释还不是常有趣。因此,Autodesk为DIESEL添加了许多有用的功能。我们可以计算“Hello,world!”的长度。串:

DIESEL: $(strlen,"Hello,world!")
12

DIESEL中的函数调用以美元符号为前缀,并用括号括起来。逗号充当函数名称及其参数之间的分隔符。参数一直运行到下一个逗号或右括号。您不必在参数中添加引号,除非它们包含逗号,就像在此示例中一样。如果你不在这里添加引号,“Hello”和“world”之间的逗号将结束strlen参数,因此返回5. 
在DIESEL函数中使用引号要比看起来困难得多。因此,我们改为更简单的测试字符串。

DIESEL: $(strlen,aDIESELteststring)
17

只返回任何不属于函数调用的字符 - 而不是引号。因此,您可以轻松地以您需要的任何方式连接单词,命令名称和选项。

DIESEL: SNAP;$(strlen,aDIESELteststring).0
SNAP;17.0

DIESEL计算

永远记住DIESEL只接受字符串并返回字符串。但是,您可以使用字符串计算,只要它们看起来像数字:

DIESEL: $(+,1,1)
2

DIESEL中的数学函数是+, - ,*和/。DIESEL函数fixrtosangtosedtime 取一个字符串,将其解释为实数,并将其格式化为整数,长度,角度或日期/时间。

DIESEL函数调用

与任何其他编程语言一样,您可以“嵌套”函数调用,即使用一个函数调用来计算外部函数调用的参数。

DIESEL: $(+,$(strlen,aDIESELteststring),$(strlen,anotherstring))
30

一旦开始编写嵌套函数调用的DIESEL表达式, 评估哪个函数以及如何评估函数就会感兴趣。AutoCAD和AutoCAD LT都可以报告评估顺序和结果。只需将系统变量MACROTRACE设置为1.这是最后一次评估的打印输出:

DIESEL: $(+,$(strlen,aDIESELteststring),$(strlen,anotherstring))
Eval: $(+, $(strlen,aDIESELteststring), $(strlen,anotherstring))
Eval: $(strlen,aDIESELteststring)
===> 17
Eval: $(strlen,anotherstring)
===> 13
===> 30

如果您创建DIESEL程序,请始终打开宏跟踪。这很容易指出最终的错误。

DIESEL变量

如果DIESEL不允许您使用某种变量来存储和检索数据,它将不是一种“真正的”编程语言。DIESEL变量只能包含字符串 - 正如您所期望的那样。
DIESEL不知道任何“内部”变量,但它使用AutoCAD的变量。要检索AutoCAD变量的值,请使用getvar函数:

DIESEL: $(getvar,viewctr)
261.70086705,176.04582323,0

点类型变量成为逗号分隔的字符串,整数类型和实型变量成为字符串。索引 函数是很方便的用于求出x或y的点的坐标,像在本例中:

DIESEL: $(rtos,$(index,1,$(getvar,viewctr)),2,3)
Eval: $(RTOS, $(index,1,$(getvar,viewctr)), 2, 3)
Eval: $(INDEX, 1, $(getvar,viewctr))
Eval: $(GETVAR, viewctr)
===> 261.70086705,176.04582323,0
===> 176.04582323
===> 176.046
176.046

要保存变量值,只需调用setvar 命令或AutoLISP函数即可。AutoCAD Release 12引入了USERS *字符串类型变量,用于与DIESEL连接。AutoCAD LT错过了这些变量,但您可以使用setenv 命令和getenv DIESEL函数作为替换。有关示例,请参阅我们的初始LT宏。
在DIESEL中使用变量时一个典型的问题是 该变量被设置或读取。对此至关重要的是宏求值序列

强制DIESEL求值

LT宏还显示了如何使用eval DIESEL函数。输入的字符串将保存到DIESEL环境变量中,该变量是ACLT.INI文件的一部分。Windows注册表。接下来,我们使用getenv检索字符串。然而,这只给我们输入的字符串。我们需要明确强制DIESEL来评估getenv返回的字符串。

条件表达式

要创建条件宏,DIESEL包含if 和nth函数,其中nth类似于其他编程语言的case语句。条件也使用字符串:字符串“0”等于false,字符串“1”或除“0”以外的任何值等于true
要编写表达式,您可以使用=,<,>,!=,<=,> =和eq函数。要组合条件,请使用and, orxor函数。有没有 工作,但你可以很容易地使用,如果函数完成这个任务:

DIESEL: $(if,$(getvar,tilemode),,Tilemode is not set)
Tilemode is not set

循环

与其他编程语言不同,DIESEL没有重复某些操作的命令。
如果你在LISP工作,这当然没问题,因为LISP本身有足够的控制结构来创建循环。
如果您使用的是AutoCAD LT,则可以使用菜单宏的自动重复来实现循环。如果您的菜单宏以星号(*)开头,AutoCAD将永远重复它(或直到您或宏强制中断)。使用变量,您可以构建运行预定义次数的循环,甚至可以循环遍历字符串中的字符。在Robert Freeman的Text on Arc宏中可以找到这种技术的一个非常复杂和精细的例子。

DIESEL应用程序

对于DIESEL的几种用途,请参阅:

我相信你会找到其他人。主要的DIESEL应用是:

  • AutoLISP中的字符串格式。编写DIESEL'程序',前缀为“m =”,并将其作为参数传递给(menucmd)函数。AutoLISP将返回DIESEL解释器计算的字符串。
  • 状态行格式。每次应答命令提示时,AutoCAD都会将MODEMACRO系统变量传递给DIESEL解释器。DIESEL结果显示在状态行中。这对于在AutoCAD / DOS中显示DWGNAME变量,在AutoCAD LT中显示提示或在版本13中显示正在运行的对象捕捉非常方便。请注意,永久MODEMACRO字符串会覆盖AutoCAD / Win Release 12中工具栏的重要部分。 LT 1/2,所以不建议这样做。
  • 说话菜单标签。您可以根据外部设置向菜单标签添加变量,添加复选标记或灰色菜单标签。请注意,如果要对其进行解释,则菜单标签必须以DIESEL函数开头。另请注意,某些环境不允许在菜单标签中使用DIESEL表达式,例如Macintosh或DOS版本的屏幕菜单。其他人在初始加载后不更新菜单标签,例如AutoCAD / Win Release 12。
  • 条件菜单宏。这是最常用的DIESEL应用程序。甚至标准菜单都可以使用它。侧边栏有几个例子。要在菜单宏中使用DIESEL,请在DIESEL表达式前加上“$ M =”。后面的所有内容都发送到DIESEL解释器,结果用作宏。
  • 使用AutoCAD Release 14及更高版本中的RText命令自行修改注释对象。

参考

DIESEL的主要来源是John Walker的网站www.fourmilab.ch/diesel。在这里,您不仅可以找到有关该语言的详细信息,还可以下载完整的C语言源代码,将DIESEL嵌入到您自己的程序中。

为方便起见,我添加了所有DIESEL命令参考

有关DIESEL及其用途的更多信息,请阅读:

  • “状态行配置和DIESEL字符串表达式语言” - 在:AutoCAD自定义和AutoCAD LT手册中,Autodesk
  • Beat Fehr:“Turbo DIESEL的力量” - 载于:CAMP ADGE会议录,1994年5月,ADGE
  • Rusty Gesner和Joseph Smith:“在DIESEL上运行” - 在:最大化AutoCAD Release 12,New Riders
  • Jeremy Tammik:“DIESEL” - 位于:AutoCAD开发系统“ADS”,Rossipaul Medien

Dietmar Rudolph在德国埃森担任 CR / LF公司负责人。他是CAD顾问,应用程序开发人员和备受尊敬的AutoCAD专家。在业余时间,他撰写了几本CAD书籍,数百篇杂志文章和各种CAD手册。Dietmar已将各种Autodesk产品和其他程序本地化,以用于德语市场。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值