[心得] DIESEL語言簡介
為了補充上一篇回文有關於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
推
05/13 05:52, , 1F
05/13 05:52, 1F
Cad_Cae 近期熱門文章
PTT數位生活區 即時熱門文章
11
12