autocad中的diesel语言详解
AutoCAD附帶了大量API(應(yīng)用程序編程接口),可以使用LISP,VBA或C ++等語言構(gòu)建自定義環(huán)境。在AutoCAD的第12版中,我們突然發(fā)現(xiàn)產(chǎn)品中隱藏了另一種小編程語言。它據(jù)說自版本1.4以來一直在發(fā)布列表中,遵循Autodesk的傳統(tǒng):“好吧,我們可以讓它變得簡單,但為什么不讓它可定制?”?
AutoCAD程序員使用DIESEL向菜單標(biāo)簽添加少量復(fù)選標(biāo)記,并在命令前面取消“取消”。有些人還使用DIESEL將圖紙名稱添加到狀態(tài)欄。在Windows發(fā)布之后,即使使用DIESEL也不見了。所以它可能在歷史上逐漸消失......
但隨后Autodesk發(fā)布了AutoCAD LT,并且在對AutoLISP LT產(chǎn)生了一些初步混淆之后 - 我們了解到DIESEL是?LT中唯一的編程語言。突然間花些時(shí)間和DIESEL玩是很有意義的。本文將教您如何使用DIESEL,何時(shí)使用它以及為什么。
專業(yè)人士,請繼續(xù)閱讀
專業(yè)的LISP和ADS程序員可能認(rèn)為DIESEL不值得考慮。在你翻頁之前,首先回答這個(gè)小測驗(yàn):“向我展示從逗號(hào)分隔的關(guān)鍵字列表中提取第三項(xiàng)的最短例程。”?這是我的解決方案,這只不過是對DIESEL的調(diào)用:
(defun 3rd (string)(menucmd (strcat "m=$(index,2,\"" string "\")")) )你知道,即使你沒有任何理由來處理LT,DIESEL也很有用。現(xiàn)在,如果您之前知道這一點(diǎn),請不要再進(jìn)一步閱讀......否則:這里有一些DIESEL供LISPers使用。
專業(yè)人士,不要忘記RText
你不做LISP,你不做菜單宏。好吧,也許DIESEL真的不適合你。但是,您是否希望AutoCAD對象顯示為文本,但會(huì)根據(jù)當(dāng)前環(huán)境自動(dòng)更改其內(nèi)容?例如,您是否希望文本字符串自動(dòng)顯示當(dāng)前圖形文件的名稱和路徑,或上次編輯的日期?
沒問題,如果您安裝了AutoCAD Release 14或更高版本的Bonus / Express工具,請查看RText命令。這會(huì)創(chuàng)建一個(gè)RText對象,就像我剛剛報(bào)告的那樣。你如何定義變體文本字符串?您輸入DIESEL表達(dá)式。
專業(yè)人士,并自己使用它
DIESEL由John Walker為Autodesk,Inc。編寫。約翰和Autodesk將該程序及其源代碼放在公共領(lǐng)域。您可以從John Walker的網(wǎng)站www.fourmilab.ch/diesel下載完整的源代碼。這允許您將DIESEL解釋器嵌入到您自己的程序中,無論是否與AutoCAD相關(guān)。如果您遇到DIESEL的其他實(shí)現(xiàn),請通過dietmar@crlf.de告知我們。
到目前為止,已經(jīng)“知道一切”的專業(yè)人士有三個(gè)原因可供閱讀。現(xiàn)在讓我們來看看DIESEL究竟是什么以及你能用它做些什么。
字符串處理語言
DIESEL背后的基本理念很簡單:“只有字符串”。
DIESEL解釋器接受一個(gè)字符串,處理它,并返回一個(gè)字符串。最初,DIESEL解釋器返回其輸入流中的每個(gè)字符。但這很無聊。因此,DIESEL解釋器在輸入流中接受特殊字符序列(“函數(shù)調(diào)用”),并用函數(shù)結(jié)果替換它們。
交互式的DIESEL
沒有單獨(dú)的DIESEL的交互式版本,即您不能鍵入字符串,將其傳遞給DIESEL解釋器并打印結(jié)果。但是建立一個(gè)DIESEL語句卻相當(dāng)容易。
如果使用完整版本的AutoCAD,請?jiān)诿钚兄兄苯渔I入以下行:
(defun c:DIESEL (/ s)(while (/= "" (setq s (getstring "\nDIESEL: " T)))(princ (menucmd (strcat "m=" s))))(princ) )這將實(shí)現(xiàn)一個(gè)名為DIESEL的新命令(還有什么)。它會(huì)提示您輸入一個(gè)字符串,將其傳遞給DIESEL解釋器,并報(bào)告結(jié)果。
如果您使用AutoCAD LT并且更喜歡菜單,請將以下內(nèi)容作為一行添加到菜單文件中,例如,按照_time命令:
[DIESEL]*^C^C_SETENV DIESEL;\_SETENV DIESEL;$M=$(EVAL,"$(GETENV,DIESEL)");下次啟動(dòng)LT時(shí),菜單將重新編譯,您將在適當(dāng)?shù)南吕藛沃姓业紻IESEL命令。點(diǎn)擊“DIESEL”。該命令將提示您輸入一個(gè)字符串,將其傳遞給DIESEL解釋器,并報(bào)告結(jié)果。
如果使用AutoCAD LT 97并更喜歡工具欄,請創(chuàng)建DIESEL工具欄按鈕。要執(zhí)行此操作,請右鍵單擊任何工具,選擇“新建”并輸入DIESEL作為工具欄名稱。DIESEL工具欄會(huì)打開,但其中沒有工具。選擇“自定義”,然后將“自定義”類別中的空白按鈕拖到新工具欄中。在名稱和幫助下輸入“DIESEL Test”,宏輸入:
*^C^C_SETENV DIESEL;\_SETENV DIESEL;$M=$(EVAL,"$(GETENV,DIESEL)")關(guān)閉所有工具欄對話框。LT將重新編譯菜單,現(xiàn)在您有一個(gè)DIESEL測試命令按鈕。它將再次提示您輸入一個(gè)字符串,將其傳遞給DIESEL解釋器,并報(bào)告結(jié)果。
在較新版本的AutoCAD LT中,您使用相同的宏,只有創(chuàng)建按鈕的方式有點(diǎn)不同。使用工具>自定義>工具欄。使用“工具欄”選項(xiàng)卡創(chuàng)建DIESEL工具欄,使用“命令”選項(xiàng)卡將用戶定義的按鈕拖動(dòng)到此新工具欄,然后使用“屬性”選項(xiàng)卡輸入名稱,幫助字符串和宏。
DIESEL基礎(chǔ)知識(shí)
讓我們開始嘗試我們的定制DIESEL命令。
DIESEL: Hello,world! Hello,world!DIESEL剛剛通過了任何編程語言的基本測試。它打印出“Hello,world!”字樣。但是,你說這不是證據(jù)嗎?也許它沒有解釋輸入線?好的,測試#2:
DIESEL: "Hello,world!" Hello,world!你看?它真的做到了。它會(huì)抑制測試字符串周圍的引號(hào)。由于DIESEL中的所有內(nèi)容都是字符串,因此有時(shí)您需要明確地說“這是一個(gè)字符串,而這不是!”?與其他所有編程語言一樣,一對引號(hào)表示“這是一個(gè)字符串!”。DIESEL解釋器將此接受為輸入字符串,而返回的結(jié)果是沒有引號(hào)的字符串,如您所料。
那么,如何將引號(hào)放入字符串中?簡單地說,使用兩個(gè)引號(hào)來表示一個(gè), 加上一對周圍的引號(hào)告訴DIESEL“這只是一個(gè)字符串!”:
DIESEL函數(shù)
正如前面所說的,字符串傳遞給DIESEL解釋還不是常有趣。因此,Autodesk為DIESEL添加了許多有用的功能。我們可以計(jì)算“Hello,world!”的長度。串:
DIESEL: $(strlen,"Hello,world!") 12DIESEL中的函數(shù)調(diào)用以美元符號(hào)為前綴,并用括號(hào)括起來。逗號(hào)充當(dāng)函數(shù)名稱及其參數(shù)之間的分隔符。參數(shù)一直運(yùn)行到下一個(gè)逗號(hào)或右括號(hào)。您不必在參數(shù)中添加引號(hào),除非它們包含逗號(hào),就像在此示例中一樣。如果你不在這里添加引號(hào),“Hello”和“world”之間的逗號(hào)將結(jié)束strlen參數(shù),因此返回5.?
在DIESEL函數(shù)中使用引號(hào)要比看起來困難得多。因此,我們改為更簡單的測試字符串。
只返回任何不屬于函數(shù)調(diào)用的字符 - 而不是引號(hào)。因此,您可以輕松地以您需要的任何方式連接單詞,命令名稱和選項(xiàng)。
DIESEL: SNAP;$(strlen,aDIESELteststring).0 SNAP;17.0DIESEL計(jì)算
永遠(yuǎn)記住DIESEL只接受字符串并返回字符串。但是,您可以使用字符串計(jì)算,只要它們看起來像數(shù)字:
DIESEL: $(+,1,1) 2DIESEL中的數(shù)學(xué)函數(shù)是+, - ,*和/。DIESEL函數(shù)fix,rtos,angtos和edtime?取一個(gè)字符串,將其解釋為實(shí)數(shù),并將其格式化為整數(shù),長度,角度或日期/時(shí)間。
DIESEL函數(shù)調(diào)用
與任何其他編程語言一樣,您可以“嵌套”函數(shù)調(diào)用,即使用一個(gè)函數(shù)調(diào)用來計(jì)算外部函數(shù)調(diào)用的參數(shù)。
DIESEL: $(+,$(strlen,aDIESELteststring),$(strlen,anotherstring)) 30一旦開始編寫嵌套函數(shù)調(diào)用的DIESEL表達(dá)式,在?評(píng)估哪個(gè)函數(shù)以及如何評(píng)估函數(shù)時(shí)就會(huì)感興趣。AutoCAD和AutoCAD LT都可以報(bào)告評(píng)估順序和結(jié)果。只需將系統(tǒng)變量MACROTRACE設(shè)置為1.這是最后一次評(píng)估的打印輸出:
DIESEL: $(+,$(strlen,aDIESELteststring),$(strlen,anotherstring)) Eval: $(+, $(strlen,aDIESELteststring), $(strlen,anotherstring)) Eval: $(strlen,aDIESELteststring) ===> 17 Eval: $(strlen,anotherstring) ===> 13 ===> 30如果您創(chuàng)建DIESEL程序,請始終打開宏跟蹤。這很容易指出最終的錯(cuò)誤。
DIESEL變量
如果DIESEL不允許您使用某種變量來存儲(chǔ)和檢索數(shù)據(jù),它將不是一種“真正的”編程語言。DIESEL變量只能包含字符串 - 正如您所期望的那樣。
DIESEL不知道任何“內(nèi)部”變量,但它使用AutoCAD的變量。要檢索AutoCAD變量的值,請使用getvar函數(shù):
點(diǎn)類型變量成為逗號(hào)分隔的字符串,整數(shù)類型和實(shí)型變量成為字符串。索引?函數(shù)是很方便的用于求出x或y的點(diǎn)的坐標(biāo),像在本例中:
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要保存變量值,只需調(diào)用setvar?命令或AutoLISP函數(shù)即可。AutoCAD Release 12引入了USERS *字符串類型變量,用于與DIESEL連接。AutoCAD LT錯(cuò)過了這些變量,但您可以使用setenv?命令和getenv?DIESEL函數(shù)作為替換。有關(guān)示例,請參閱我們的初始LT宏。
在DIESEL中使用變量時(shí)一個(gè)典型的問題是當(dāng)?該變量被設(shè)置或讀取。對此至關(guān)重要的是宏求值序列。
強(qiáng)制DIESEL求值
LT宏還顯示了如何使用eval?DIESEL函數(shù)。輸入的字符串將保存到DIESEL環(huán)境變量中,該變量是ACLT.INI文件的一部分。Windows注冊表。接下來,我們使用getenv檢索字符串。然而,這只給我們輸入的字符串。我們需要明確強(qiáng)制DIESEL來評(píng)估getenv返回的字符串。
條件表達(dá)式
要?jiǎng)?chuàng)建條件宏,DIESEL包含if?和nth函數(shù),其中nth類似于其他編程語言的case語句。條件也使用字符串:字符串“0”等于false,字符串“1”或除“0”以外的任何值等于true。
要編寫表達(dá)式,您可以使用=,<,>,!=,<=,> =和eq函數(shù)。要組合條件,請使用and,?or和xor函數(shù)。有沒有不?工作,但你可以很容易地使用,如果函數(shù)完成這個(gè)任務(wù):
循環(huán)
與其他編程語言不同,DIESEL沒有重復(fù)某些操作的命令。
如果你在LISP工作,這當(dāng)然沒問題,因?yàn)長ISP本身有足夠的控制結(jié)構(gòu)來創(chuàng)建循環(huán)。
如果您使用的是AutoCAD LT,則可以使用菜單宏的自動(dòng)重復(fù)來實(shí)現(xiàn)循環(huán)。如果您的菜單宏以星號(hào)(*)開頭,AutoCAD將永遠(yuǎn)重復(fù)它(或直到您或宏強(qiáng)制中斷)。使用變量,您可以構(gòu)建運(yùn)行預(yù)定義次數(shù)的循環(huán),甚至可以循環(huán)遍歷字符串中的字符。在Robert Freeman的Text on Arc宏中可以找到這種技術(shù)的一個(gè)非常復(fù)雜和精細(xì)的例子。
DIESEL應(yīng)用程序
對于DIESEL的幾種用途,請參閱:
- DIESEL為LISPers
- 一些有用的DIESEL宏
- DIESEL編程實(shí)例
我相信你會(huì)找到其他人。主要的DIESEL應(yīng)用是:
- AutoLISP中的字符串格式。編寫DIESEL'程序',前綴為“m =”,并將其作為參數(shù)傳遞給(menucmd)函數(shù)。AutoLISP將返回DIESEL解釋器計(jì)算的字符串。
- 狀態(tài)行格式。每次應(yīng)答命令提示時(shí),AutoCAD都會(huì)將MODEMACRO系統(tǒng)變量傳遞給DIESEL解釋器。DIESEL結(jié)果顯示在狀態(tài)行中。這對于在AutoCAD / DOS中顯示DWGNAME變量,在AutoCAD LT中顯示提示或在版本13中顯示正在運(yùn)行的對象捕捉非常方便。請注意,永久MODEMACRO字符串會(huì)覆蓋AutoCAD / Win Release 12中工具欄的重要部分。 LT 1/2,所以不建議這樣做。
- 說話菜單標(biāo)簽。您可以根據(jù)外部設(shè)置向菜單標(biāo)簽添加變量,添加復(fù)選標(biāo)記或灰色菜單標(biāo)簽。請注意,如果要對其進(jìn)行解釋,則菜單標(biāo)簽必須以DIESEL函數(shù)開頭。另請注意,某些環(huán)境不允許在菜單標(biāo)簽中使用DIESEL表達(dá)式,例如Macintosh或DOS版本的屏幕菜單。其他人在初始加載后不更新菜單標(biāo)簽,例如AutoCAD / Win Release 12。
- 條件菜單宏。這是最常用的DIESEL應(yīng)用程序。甚至標(biāo)準(zhǔn)菜單都可以使用它。側(cè)邊欄有幾個(gè)例子。要在菜單宏中使用DIESEL,請?jiān)贒IESEL表達(dá)式前加上“$ M =”。后面的所有內(nèi)容都發(fā)送到DIESEL解釋器,結(jié)果用作宏。
- 使用AutoCAD Release 14及更高版本中的RText命令自行修改注釋對象。
參考
DIESEL的主要來源是John Walker的網(wǎng)站www.fourmilab.ch/diesel。在這里,您不僅可以找到有關(guān)該語言的詳細(xì)信息,還可以下載完整的C語言源代碼,將DIESEL嵌入到您自己的程序中。
為方便起見,我添加了所有DIESEL命令的參考。
有關(guān)DIESEL及其用途的更多信息,請閱讀:
- “狀態(tài)行配置和DIESEL字符串表達(dá)式語言” - 在:AutoCAD自定義和AutoCAD LT手冊中,Autodesk
- Beat Fehr:“Turbo DIESEL的力量” - 載于:CAMP ADGE會(huì)議錄,1994年5月,ADGE
- Rusty Gesner和Joseph Smith:“在DIESEL上運(yùn)行” - 在:最大化AutoCAD Release 12,New Riders
- Jeremy Tammik:“DIESEL” - 位于:AutoCAD開發(fā)系統(tǒng)“ADS”,Rossipaul Medien
Dietmar Rudolph在德國埃森擔(dān)任?CR / LF公司負(fù)責(zé)人。他是CAD顧問,應(yīng)用程序開發(fā)人員和備受尊敬的AutoCAD專家。在業(yè)余時(shí)間,他撰寫了幾本CAD書籍,數(shù)百篇雜志文章和各種CAD手冊。Dietmar已將各種Autodesk產(chǎn)品和其他程序本地化,以用于德語市場。
總結(jié)
以上是生活随笔為你收集整理的autocad中的diesel语言详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自然语言处理系列之:中文分词技术
- 下一篇: oracle hugepage设置,Li