AutoCAD附带了大量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使用。
你不做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的其他实现,请通过[email protected]告知我们。
到目前为止,已经“知道一切”的专业人士有三个原因可供阅读。现在让我们来看看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:
Hello,world!
Hello,world!
DIESEL刚刚通过了任何编程语言的基本测试。它打印出“Hello,world!”字样。但是,你说这不是证据吗?也许它没有解释输入线?好的,测试#2:
DIESEL: "Hello,world!"
Hello,world!
你看?它真的做到了。它会抑制测试字符串周围的引号。由于DIESEL中的所有内容都是字符串,因此有时您需要明确地说“这是一个字符串,而这不是!” 与其他所有编程语言一样,一对引号表示“这是一个字符串!”。DIESEL解释器将此接受为输入字符串,而返回的结果是没有引号的字符串,如您所料。
那么,如何将引号放入字符串中?简单地说,使用两个引号来表示一个, 加上一对周围的引号告诉DIESEL“这只是一个字符串!”:
DIESEL: """Hello,world!"""
"Hello,world!"
正如前面所说的,字符串传递给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: $(+,1,1)
2
DIESEL中的数学函数是+, - ,*和/。DIESEL函数fix,rtos,angtos和edtime 取一个字符串,将其解释为实数,并将其格式化为整数,长度,角度或日期/时间。
与任何其他编程语言一样,您可以“嵌套”函数调用,即使用一个函数调用来计算外部函数调用的参数。
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不知道任何“内部”变量,但它使用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中使用变量时一个典型的问题是当 该变量被设置或读取。对此至关重要的是宏求值序列。
LT宏还显示了如何使用eval DIESEL函数。输入的字符串将保存到DIESEL环境变量中,该变量是ACLT.INI文件的一部分。Windows注册表。接下来,我们使用getenv检索字符串。然而,这只给我们输入的字符串。我们需要明确强制DIESEL来评估getenv返回的字符串。
要创建条件宏,DIESEL包含if 和nth函数,其中nth类似于其他编程语言的case语句。条件也使用字符串:字符串“0”等于false,字符串“1”或除“0”以外的任何值等于true。
要编写表达式,您可以使用=,<,>,!=,<=,> =和eq函数。要组合条件,请使用and, or和xor函数。有没有不 工作,但你可以很容易地使用,如果函数完成这个任务:
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的主要来源是John Walker的网站www.fourmilab.ch/diesel。在这里,您不仅可以找到有关该语言的详细信息,还可以下载完整的C语言源代码,将DIESEL嵌入到您自己的程序中。
为方便起见,我添加了所有DIESEL命令的参考。
有关DIESEL及其用途的更多信息,请阅读:
Dietmar Rudolph在德国埃森担任 CR / LF公司负责人。他是CAD顾问,应用程序开发人员和备受尊敬的AutoCAD专家。在业余时间,他撰写了几本CAD书籍,数百篇杂志文章和各种CAD手册。Dietmar已将各种Autodesk产品和其他程序本地化,以用于德语市场。