2autocad2009-建筑圖學(xué)基礎(chǔ)隨書光盤3.01g ch13n_第1頁
2autocad2009-建筑圖學(xué)基礎(chǔ)隨書光盤3.01g ch13n_第2頁
2autocad2009-建筑圖學(xué)基礎(chǔ)隨書光盤3.01g ch13n_第3頁
2autocad2009-建筑圖學(xué)基礎(chǔ)隨書光盤3.01g ch13n_第4頁
2autocad2009-建筑圖學(xué)基礎(chǔ)隨書光盤3.01g ch13n_第5頁
免費預(yù)覽已結(jié)束,剩余64頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、設(shè)計的接口類型13.1在一般情況下,一個 CAD 系統(tǒng)將包括:硬件系統(tǒng)與系統(tǒng)。在硬件系統(tǒng)方面,由于不需要再去設(shè)計硬件,所以只要根據(jù) CAD 系統(tǒng)的技術(shù)要求,就可以確定 CAD 硬件系統(tǒng)應(yīng)提供的操作能力以及所需的輸入、輸出設(shè)備。而系統(tǒng)的設(shè)計就要根據(jù)不同的使用要求來進(jìn)行 CAD 系統(tǒng)的整體規(guī)劃與功能設(shè)定。按 CAD 系統(tǒng)是否具有人機接口的功能可以分為“交互式”和“自動式”兩大類?!敖换ナ健毕到y(tǒng)就是指具有人機接口功能的系統(tǒng)。它的作業(yè)過程要在人的直接參與下,以人機的交互作業(yè)方式來進(jìn)行工作。這種作業(yè)方式將以人為中心,所以很適用于那些需要先經(jīng)過人回答過問題后,才能處理的工作。因此,所謂的“交互式”事實上就

2、是“操作親和力”。換句話說,既然需要有人去輸入,那么設(shè)計一個讓操作者可以輕松輸入的接口,就是程序設(shè)計員的。“自動式”系統(tǒng)就是指不具有人機或很少有人機接口功能的系統(tǒng)。它在作業(yè)過程中無需人的參與或只要很少的人工參與。計算機將根據(jù)設(shè)計師所編寫的程序來自動地完成各個設(shè)計步驟。這種作業(yè)方式將以計算機為中心,適用于目標(biāo)明確的流程或設(shè)計條件固定的標(biāo)準(zhǔn)工件。例如,自動畫出一個標(biāo)準(zhǔn)的螺絲。13.2簡單的傳統(tǒng)型人機接口范例傳統(tǒng)型的人機接口就表現(xiàn)在詢問操作者上,這也是初學(xué)者最常用的方式。其所用的 get類函數(shù)在 5.1 節(jié)中已經(jīng)學(xué)到很多。下面,就使用一個簡單的 AutoLISP來示范這樣的接口。本范例程序名稱:XY

3、SQUARE.LSP(本書范例光盤)程序文本如下:(1)(defun C:XYSQUARE (/ x y cp ptm pt1 pt2 pt3 pt4)(2)(setq pt1 (getpon 矩形的左下角點: )196defun 函數(shù)是 LISP 程序的開頭固定語法。在此語法中,函數(shù)名稱的格式必須為C:,其中所有的字均須大寫;同時,名稱中的 C:一定要固定。至于的指令名稱部分可以自行規(guī)定,但此名稱不得與 AutoCAD 現(xiàn)有指令、內(nèi)建或外部指令名稱重復(fù)。而 setq 則是專門用來定義變量的函數(shù)。這兩條程序的意思就是說:將此程序指令的名稱定為:XYSQUARE;同時,希望操作者輸入一左下角點,

4、此點的坐標(biāo)數(shù)據(jù)將由 getpo函數(shù)擷取到之后,再將其到 pt1 變量中。(3)(setq x (getdist n 矩形的長: )(4)(setq y (getdist n 矩形的寬: )接下來,希望操作者輸入矩形的長寬數(shù)值;所以,在此須使用 getdist 函數(shù);而得到的數(shù)值,就分別到 x 與 y 變量中。這也就是傳統(tǒng)式的人機接口。(5)(setq pt2 (polar pt1 (/ pi 2) y) (6)(setq pt3 (polar pt2 0 x)(7)(setq pt4 (polar pt1 0 x)現(xiàn)在,就需要來計算各點坐標(biāo)了。要使用一個很方便的坐標(biāo)獲取方式,即使用 polar

5、 函數(shù)。由于 pt2(第二點)的坐標(biāo)值是相對于 pt1 點坐標(biāo)值的 90o 方向,所以為/2(須以弧度量表示)。其中,pi 即為 。同理,pt3 與pt4 均以相同方式算出角度方向,再配以適當(dāng)?shù)木嚯x值即到正確的點坐標(biāo)。如圖 13-1 所示。197圖 13-1 本范例相關(guān)的設(shè)計條件圖在此程序中,看見了 pi/2 的表示方式是:(/ pi 2)。(8)(d PLINE pt1 pt2 pt3 pt4 C)矩形的四個點坐標(biāo)既然已算出,那么就要使用d 函數(shù)來執(zhí)行。d 函數(shù)后所跟的,就是您下的那個 AutoCAD 指令時的實際操作流程。所以,您可以在本例中看到,當(dāng)下了 PLINE 指令后,該指令就要求操

6、作者回答點坐標(biāo)。這時程序就會自動將 pt1,pt2,pt3 與 pt4 等變量所的點坐標(biāo)值回答出來;最后,再輸入了一個“C”(表示 Close 選擇項),來讓線再畫回起點,即完成此矩形的繪制。(9)(setq cp (list (+ (car pt1) (/ x 2) (+ (cadr pt1) (/ y 2)畫出矩形后,由于要以矩形中心作為移動的起始點,所以,須先算出中心坐標(biāo)198同,pt4 坐標(biāo)點是以 pt1 點坐標(biāo)為基準(zhǔn),向右 0 ,距離為 X 處的位置意即:pt2 坐標(biāo)點是以 pt1 點坐標(biāo)為基準(zhǔn),向上 90 ( /2),距離為 Y 處的位置位置值,并將在 cp 變量中。如此,X,Y

7、距離值除以 2 之后,再分別加上由 pt1 中所獲取的 X,Y 坐標(biāo)值,即可組成中心點的坐標(biāo)值。最后,再使用那個 list 函數(shù)來將分離的數(shù)值組坐標(biāo)值(即串行)。(10)(setq ptm (getpon 新的矩形中心點位置: );點取欲移動四邊形至那點的所在位置(11)(d MOVE L cp ptm)d 函數(shù)來執(zhí)行MOVE 指令,并給予適當(dāng)?shù)臄?shù)據(jù)來自動作答復(fù);用(12);開頭defun 函數(shù)的對稱括號加載并執(zhí)行此程序后的操作,如圖 13-2 所示。矩形的左下角點:(請點取矩形左下角點)矩形的長:矩形的寬:(請鍵入矩形長數(shù)值或以點取兩點來定數(shù)值)(請鍵入矩形寬數(shù)值或以點取兩點來定數(shù)值)在上,

8、“ 求順” 的人總比“ 求逆” 的人多得多。前者,順的時候,理所當(dāng)然,不順的時候,就是打擊;后者,由于心態(tài)上就已先求逆,所以順的時候,意外歡欣,不順的時候,心里已有準(zhǔn)備,打擊的承受度較大。雖然持有這兩種不同的人生觀并無對錯問題,但是也可發(fā)現(xiàn):以逆向思考來面對人生,有時也會有不錯的效果!199圖 13-2 本范例的人機接口分析:本范例的優(yōu)點當(dāng)程序執(zhí)行后,操作非常方便,用戶不需要手動重復(fù)地去調(diào)用繪圖指令 LINE,即可自動畫出符合指定條件的圖形。1.2.3.4.本范例的缺點輸入提示文句一條一條出來,無法回頭去修正想再變更其值的設(shè)計條件。無法直接全覽并檢查所輸入的條件。當(dāng)遇到設(shè)計條件很多的狀況時,輸

9、入太多的提示文句會讓操作者感到很煩。在設(shè)計條件很多的情況下,無法一次顯示設(shè)計條件的默認(rèn)值(因為如果可以,就可以省略那些可采用預(yù)設(shè)輸入的部分而節(jié)省輸入時間)。5. 對不會程序設(shè)計的人來說,程序完成后,畫出的圖形結(jié)構(gòu)就固定了,當(dāng)要改變圖形的外形以適合自己時,除非找人寫程序,否則就無法可想。其中,第 1,2,3,4 條缺點是可以在程序設(shè)計本身范疇內(nèi)處理的,請參考 13.3.1 或13.3.2 節(jié)。而第 5 條缺點,則需要用“參數(shù)設(shè)計法”的功能來處理,請參考 13.4 節(jié)。13.3交談式的人機接口范例200傳統(tǒng)式的人機接口坦白說,提示文句式的人機接口是傳統(tǒng)過時的?,F(xiàn)在只用于設(shè)計條件簡單,要操作者輸入少

10、的狀況。在正式的程序設(shè)計里,以對 VLISP 來說,需要配合 DCL 語言來設(shè)計輸入窗口設(shè)計正是其優(yōu)勢。窗口來設(shè)計人機接口互動的方式才是主流。輸入窗口,而對 VBA 來說,可速成的13.3.1配合VLISP 所使用的DCL 語言設(shè)計框的交談式控制語言(Dialogue Control Language,DCL),是一個文字文件(ASCII 文件)。一個 DCL 文件的擴展名是.dcl。單一的.dcl 文件可以包含一個或是多個對話框的描述,或是它僅包含由其他.dcl 文件所使用的典型標(biāo)題以及副組合。換句話說,DCL文件將用來設(shè)計窗口與窗口內(nèi)容,要讓這個 DCL“活”起來,卻仍需要相匹配的 LSP

11、文件來處理。所以,在 Visual LISP 里要用到文件。窗口,就要有一個.dcl 文件與一個對應(yīng)的.lsp可以使用 DCL 來做什么使用 DCL 語言,您將可以:框是以一包含DCL 語法的文字文件來定義的。該文件中的 DCL設(shè)計框語法描述將會定義框該以什么樣的方式出現(xiàn)以及它將會包含些什么,如:按鈕、列表、文字等。在應(yīng)用程序中支持框 在某些范圍內(nèi),框的一部分可定義它的行為是如何表現(xiàn)的。例如:被提示可去按哪些按鈕,顯示出一列表,以方便操作者做一選擇等。當(dāng)您在設(shè)計一個框時,您同時也需要考慮到操作者在輸入資料時,將會變化的順序。如此,則會加強這個設(shè)計結(jié)構(gòu),而比起一般的設(shè)計要來得較不具“線性”,但可

12、反映出操作者的工作方式。所以,它在經(jīng)過一些練習(xí)后,也可變成較具性的操作方式。假如在您開始規(guī)劃和修正之前,同時也將框和應(yīng)用程序做好細(xì)節(jié)的計劃,則可節(jié)省許多時間和省去不少麻煩。應(yīng)該準(zhǔn)備什么來編寫 DCL要能順利學(xué)習(xí) DCL,您必須有以下的準(zhǔn)備:您必須要懂得一些 AutoLISP 程序設(shè)計的觀念,這也是為什么本章先要您學(xué)201AutoLISP 的原因。為什么呢?因為框的設(shè)計與 AutoLISP 是關(guān)的;您可以說:AutoCAD 使用 AutoLISP 程序來DCL。換句話說:DCL 專門是安排窗口配置的,而搭配的 AutoLISP 程序?qū)⒆屗顒悠饋怼D鷳?yīng)該會使用類似記事本、WordPad 或 Wo

13、rd 這類的字處理來編寫DCL 程序。準(zhǔn)備好之后,您就可以開始以下的實作章節(jié)了。踏出 DCL 的第一步您就要踏出第一步了,事實上很簡單。首先,您要開始做的就是使用 VLISP 集成環(huán)境來編寫文件擴展名為.DCL 的文件。在編寫之前,您心中對要設(shè)計的框配置一定要先有一個梗概。最好的方法就是用筆在一張白紙上先畫一畫;雖然畫出來的配置將來可能因為種種原因?qū)е屡c這張手繪圖不太一樣,但也至少不會太。因此,當(dāng)您要設(shè)計自己用的框時,請不要忽略了這一重要步驟。如圖 13-3 所示是完成后的畫面。如果您問我與手繪稿差多少?老實說,差很多的!不過,設(shè)計經(jīng)驗積累愈多,就會愈準(zhǔn)。要配置這樣的框界面,它的控制程序都放在

14、一文件名稱為 SLE.DCL 的文件中。這個程序是屬于的,但身為本書讀者的您可以修改來使用。下一節(jié)就是這個程序的原文。此程序的文件依附錄安裝后應(yīng)該被放在:/AutoCAD設(shè)計院/NO.7/sles 目錄中。您可調(diào)出來搭配以下的說明來研究。以下,我要對您述說的說明將摻雜在原文適當(dāng)之處,像看戲一樣,一出一出地上演?!?有所求才去做” 是人一生中為了生存最無奈的事,有很多的煩惱、計較與不滿足都因此而起。事實證明,將這種“ 為自己” 的心態(tài)降得愈低,在精神層面就會過得樂富足。所以,有很多的都會鼓勵人們要多做無求且默默付出的善事,有機會的時候,大家應(yīng)該多參與這類付出無求的公益活動。醫(yī)生:“ 腿怎會跌成這

15、樣”:“ 25 年前” 醫(yī)生:“ 我是問你現(xiàn)在,你告訴我 25 年前干嘛?”:“ 25 年前,我在一家農(nóng)場幫活,有一天晚上,農(nóng)場主人202漂亮的女兒三次來敲門,問我需要什么我都告訴她,我什么都不需要”醫(yī)生:“ 那跟你的腿關(guān)系?”:“我今天在房頂上干活時,突然明白了意思,就從屋頂上跌下來了”單擊此按鈕 圖 13-3 本范例的完成圖例LE.DCL 的原文S1. dcl_settings : default_dcl_settings audit_level = 0; 203這條程序是在 DCL 文件中第一條首先必須定義的。它將定義檢查層次。2. sle : dialog 窗口的起始定義是由這里開始的

16、,窗口的名稱是 sle,以方便以后的調(diào)用開啟或關(guān)閉。這個語法是固定的,沒什么道理。由“ ” 符號開始到下面這個 sle 窗口結(jié)束的一個對稱的“ ” 符號,就是 sle 窗口配置的全部內(nèi)容。3. label = /*MSG1*/尺寸標(biāo)示變量控制;這是聲名 sle 窗口的標(biāo)題。它的語法也是固定的。在雙引號內(nèi)的就是窗口標(biāo)題的名稱,如圖 13-4 所示。圖 13-4 窗口標(biāo)題的語法4. : boxed_column 204因為在窗口內(nèi)的項目希望用線將它們框起來,所以,在此使用框線的語法。由“ ” 符號開始到下面這個框線結(jié)束的一個對稱的“ ” 符號,就是此大框線的全部內(nèi)容。5. label = /*MS

17、G2*/尺寸標(biāo)示變量控制(開關(guān)類);這是聲名此大框線的標(biāo)題,與上面窗口標(biāo)題的表示方法一樣。不過,那個/*MSG2*/ 是批注,按順序編下來,由 1 開始編,如圖 13-5 所示。吃早餐時,他的妻子走到他后面,給他后腦一巴掌。氣沖沖地說道:“ 我在你褲袋里找到一張紙條,上面寫著二個字,你最好解釋一下!” “ 喔!Darling,冷靜點兒聽我說。那是我上到馬場去的那匹馬的名字?!?那人冷靜地答道。想不到他的妻子聽完后立刻毫不猶豫地給他后腦勺再一巴掌,并更生氣地說道:“ 剛剛那匹馬打找你來了”小框線標(biāo)題 大框線toggle(開關(guān)項) toggle(開關(guān)項) toggle(開關(guān)項) 205小框線大框線

18、標(biāo)題圖 13-5 框線標(biāo)題的效果圖例6.:row : boxed_column label = (1);: toggle label = /*MSG3*/是否要顯示兩種 key = dimalt;: toggle ?;label = /*MSG4*/外側(cè)文字是否要水平標(biāo)示?; key = dimtoh;: toggle label = /*MSG5*/用戶是否要自行放置文字?; key = dimupt;: toggle label = /*MSG6*/是否要分離箭頭圖塊?; key = dimsah;: toggle label = /*MSG7*/是否不畫第一條尺寸線?; key = di

19、mse1;: toggle label = /*MSG8*/是否不畫第二條尺寸線?; key = dimse2;這一段是此大框線內(nèi)再加一小框線,然后,是小框線內(nèi)的項目標(biāo)題與配置。由于206希望這 6 個項目能橫列排在一起,因此,使用列的語法來設(shè)計。然后,又考慮到這些項目的特性是開關(guān)。因此,就挑選方格開關(guān) toggle 來定義這些項目的特性。隨同方格開關(guān)定義的是lable 與關(guān)鍵值 key。是用來設(shè)定框線內(nèi)這一列項目的名稱,它的用法您應(yīng)該已不陌生。key 則用來定義這些尺寸標(biāo)示變量的名稱,很重要的。因為將來要靠這些 key 來檢查操作者做了哪些改變。此外,每一“ ” 符號都有一對稱的“ ” 符號

20、匹配,請不要拆散這些對“ 佳偶” ;若您少了一個或多了一個這樣的符號,計算機將替您亂配一氣。所以,程序?qū)懲暌院?,請?wù)必檢查對稱符號。7. : boxed_column label = (2);: toggle label = /*MSG9*/拖動時是否要隨時更新尺寸?; key = dimsho;: toggle label = /*MSG10*/是否不畫第一條延伸線?; key = dimsd1;: toggle label = /*MSG11*/是否不畫第二條延伸線?; key = dimsd2;: toggle label = /*MSG12*/是否不畫外側(cè)標(biāo)示線?; key = dim

21、soxd;207: toggle label = /*MSG13*/是否將文字置于延伸線內(nèi)側(cè)?; key = dimtix;: toggle label = /*MSG14*/強制尺寸線置于延伸線內(nèi)側(cè)嗎?; key = dimtofl;: boxed_column label = (3);: toggle label = /*MSG15*/是否為關(guān)聯(lián)性尺寸?; key = dimaso;: toggle label = /*MSG16*/文字在尺寸線內(nèi)是水平嗎?; key = dimtih;: toggle label = /*MSG17*/是否文字置于尺寸線上?; key = dimtad;

22、208上述道理與上一說明相同??偣苍诖丝蚓€內(nèi)配置了 3 列共 15 個項目。8. 與上面大框線起始時“ ” 符號的對稱符號。表示這部分的框線內(nèi)容到此為止。9. spacer_1;為了讓窗口看起來不會太擁擠,在此加上一的空格控件。圖 13-6 空格控件的效果圖例10. : boxed_column 這是第二個框線起始。11. label = /*MSG18*/尺寸標(biāo)示變量控制(數(shù)值類);同理,給這個框線定義標(biāo)題,如圖 13-7 所示。209圖 13-7 編輯框線的效果圖例12. :row : boxed_column label = (a);: edit_box label = /*MSG19*

23、/箭頭尺寸; key = dimasz;edit_width = 4;: edit_box label = /*MSG20*/斜紋尺寸; key = dimtsz;edit_width = 4;: edit_box label = /*MSG21*/文字尺寸; key = dimtxt;edit_width = 4;: edit_box label = /*MSG22*/中心記號尺寸; key = dimcen;210edit_width = 4;: edit_box label = /*MSG23*/尺寸線原點偏移量; key = dimexo;edit_width = 4;: edit_b

24、ox label = /*MSG24*/延伸線出頭延伸量; key = dimexe;edit_width = 4;這一段也是此大框線內(nèi)小框線的項目標(biāo)題與配置。由于也希望這些小框線項目能橫列排在一起,因此,仍使用行(row)的語法來設(shè)計。然后,再考慮到這些項目的特性是輸入數(shù)值。所以,就挑選編輯框 edit_box 來定義這些項目的特性。隨同編輯框定義的是lable、關(guān)鍵值key 與編輯寬度 edit_width,仍是用來設(shè)定框線內(nèi)這一列項目的名稱。key 則是用來定義這些尺寸標(biāo)示變量的名稱;而 edit_width 則用來設(shè)定編輯框的寬度,設(shè)定為 4 是經(jīng)嘗試后修正的結(jié)果。仍提醒您了檢查對稱符

25、號。13. : boxed_column label = (b);: edit_box label = /*MSG25*/延伸線兩邊出頭量; key = dimdle;edit_width = 4;211: edit_box label = /*MSG26*/雙 key = dimaltf; edit_width = 4;: edit_box 標(biāo)示換算值;label = /*MSG27*/連續(xù)標(biāo)示線間距; key = dimdli;edit_width = 4;: edit_box label = /*MSG28*/標(biāo)示線到文字間隙; key = dimgap;edit_width = 4;:

26、 edit_box label = /*MSG29*/線性key = dimlfac; edit_width = 4;比例系數(shù);: edit_box label = /*MSG30*/舍入值; key = dimrnd;edit_width = 4;: boxed_column label = (c);: edit_box label = /*MSG31*/整體標(biāo)示比例系數(shù);212key = dimscale;edit_width = 4;: edit_box label = /*MSG32*/公差字高比例系數(shù); key = dimtfac;edit_width = 4;: edit_box

27、label = /*MSG33*/負(fù)公差值; key = dimtm;edit_width = 4;: edit_box label = /*MSG34*/正公差值; key = dimtp;edit_width = 4;: edit_box label = /*MSG35*/線上文字垂直高度; key = dimtvp;edit_width = 4;: edit_box label = /*MSG36*/小數(shù)字?jǐn)?shù); key = dimdec;edit_width = 4;上述道理與上一說明相同。總共在此大框線內(nèi)配置了 3 列共 18 個項目。21314. 這是與上面大框線起始時“ ” 符號的

28、對稱符號。表示這部分的大框線到此為止。15. : row ok_button; cancel_button;: button label = /*MSG37*/上下限或公差標(biāo)示.; key = lort;mnemonic = /*MSG38*/L; fixed_width = true;接下來,則是定義按鈕的部分。依照,在此部分至少應(yīng)該有【OK】按鈕與【Cancel】按鈕可供操作者選擇或是放棄所做的設(shè)定。所以,ok_button 與 cancel_button 應(yīng)當(dāng)是沒有問題的固定語法。由于這些按鈕都是橫行排列,因此,一開始就使用 row 語法,如圖 13-8所示。(即會將此 3 按鈕等距分布

29、之意) 圖 13-8 row 語法的效果圖例現(xiàn)在,問題可能是在下面的這個自定義按鈕部分。這部分在一開始并沒有想到要設(shè)計,214后來根據(jù)使用 AutoCAD 的多年經(jīng)驗知道:尺寸變量中的公差開關(guān)(DIMTOL)與上下公差開關(guān) (DIMLIM) 兩者是互為開關(guān)的。也就是說,如果 DIMTOL 為 ON,則 DIMLIM 就會自動 OFF,反之亦然。所以,就為了這兩個變量特別制作這個按鈕,讓操作者點取后,還會出現(xiàn)一個窗口來選擇設(shè)定它。在 button 下面的 label 與 key 屬性應(yīng)該不用再解釋了。鍵值 mnemonic 是表示這個按鈕的鍵盤按鍵值。依此例,操作者可以經(jīng)過按下【L】或【l】鍵后

30、出現(xiàn)黑色圓點,再按下【Space】空格鍵就可選取并執(zhí)行此按鈕的功能,而不一定要經(jīng)過鼠標(biāo)或數(shù)字化儀上的鼠標(biāo)的按鍵來點取。fixed_width = true 是表示在配置區(qū)變大時,此按鈕的寬度還是固定的。16. 這是與上面窗口起始時“ ” 符號的對稱符號。表示這部分的窗口到此為止。17. lort : dialog label = /*MSG39*/一般標(biāo)示,公差標(biāo)示或上下限標(biāo)示;:boxed_column label = /*MSG40*/一般標(biāo)示,公差標(biāo)示與上下限選擇項;此處是 lort 窗口。不過,這個窗口應(yīng)該是一個副窗口。它是通過操作者點取【上下限或公差標(biāo)示】按鈕時,應(yīng)該出現(xiàn)的一個窗口,

31、如圖 13-9 所示。215圖 13-9 同心按鈕的效果圖例18. :radio_column : radio_button label = /*MSG41*/回復(fù)一般標(biāo)示; key = none;value = 1;: radio_button label = /*MSG42*/公差標(biāo)示; key = dimtol;: radio_button label = /*MSG43*/上下限標(biāo)示; key = dimlim;這一段是此框線內(nèi)項目的標(biāo)題與配置。由于,也希望這三個項目能直行排在一起;216(同心按鈕)因此,仍使用了同心行的語法來設(shè)計。為什么要使用同心行的方式來設(shè)計呢?因為考慮到這些項目

32、是三選一的開關(guān)。所以,認(rèn)為使用同心按鈕來定義這些項目的特性是最適當(dāng)不過的了。跟隨同心按鈕定義的是:您已熟悉的lable 與關(guān)鍵值 key。此外,您還看到一 value 屬性。這個屬性設(shè)定為 1 是表示這個按鈕預(yù)設(shè)為開啟的狀態(tài),所以,您看到的這個按鈕其中心部分將已經(jīng)是黑色的了;除非操作者點取其他兩個按鈕。19. 這是上面 boxed_column 的對稱符號。20. spacer_1;ok_cancel; errtile;這是設(shè)定 OK 與 Cancel 按鈕的另一種固定語法。21. 這是與上面窗口起始時 符號的對稱符號。表示這部分的副窗口到此為止。以上的程序是已經(jīng)編寫并測試好的,如果您是初次編

33、寫這樣的程序,那么您一定希望知道調(diào)試的過程。根據(jù)經(jīng)驗,要測出.dcl 文件的錯誤之處,您可以在 AutoCAD 指令提示下按下述方式進(jìn)行判斷。1)在 VLISP 集成環(huán)境中選擇【工具(T)】【界面工具(I)】【預(yù)覽編輯器中的DCL(E)】命令,如圖 13-10 所示。217圖 13-10 預(yù)覽DCL2)選擇框的名稱(因為一個 DCL 文件中可能有數(shù)個框,如圖 13-11 所示)。圖 13-11 選擇框名稱3)如果 DCL 語法有錯,則會提示出錯行號,如圖 13-12 所示。圖 13-12 出錯時的畫面可以依此進(jìn)行判斷。這個程序簡單易懂吧!現(xiàn)在,如果您回頭再去看前面幾章,保證您有然大悟的感覺。好

34、,讓再繼續(xù)“向前行”吧!218DIMDIA.LSP 的原文與現(xiàn)在要談的 VLISP 程序比起來,一個 DCL 文件真像布袋戲里的傀儡。因為真正讓 DCL 文件“活”起來的是 VLISP 程序?,F(xiàn)在,就讓來看看這個操作 DCL 程序的原文內(nèi)容。此文件依附錄安裝后應(yīng)該被放在:/AutoCAD 設(shè)計院/NO.7/sles 目錄中。其文件名為 DIMDIA.LSP。以下就是這個程序的原文。我要對您述說的說明將摻雜在原文適當(dāng)之處。1. ;= 以下是加載時的錯誤檢查 =(defun ai_abort (app msg) (defun *error* (s)(if old_error (setq *erro

35、r* old_error) (princ)(if msg(alert (strcat Application error: app nn msg n)(exit); 這是要查看 AI_UTILS 是否已加載。如果沒有,那么就嘗試找到它并; 將之加載。如果找不到或找到但無法加載,那么就立刻放棄加載這個; 文件并且保留 (autoload) 的殘留功能。(cond(and ai_dcl (listp ai_dcl) ; 它已經(jīng)被加載了(not (findfile ai_utils.lsp) ; 搜尋之(ai_abort sle219(strcat Cant locate file AI_UTILS

36、.LSP.n Check support directory.)(eq failed (load ai_utils failed); 加載之(ai_abort s)le Cant load file AI_UTILS.LSP)(if (not (ai_acadapp) ; 定義一個在 AI_UTILS.LSP 文件中的(ai_abort s)le nil) ; Nil 來抑制 ai_abort 的警; 告窗口。220AI_UTILS.LSP 文件是 AutoCAD 本身提供的一個智能型公用程序文件。在此文件中將有許多好用的公用程序指令。例如,自動加載您自行設(shè)計的 LISP 程序或錯誤訊息程序集

37、等,以提供程序設(shè)計編寫者一些工具程序。當(dāng)寫好這個程序以后,將來還要將這個DIMDIA.LSP 的 LISP 程序在一進(jìn)入 AutoCAD 2000 時就被自動加載。而且,還要它自動去判斷是不是這個 DIMDIA.LSP 文件已經(jīng)加載過了,如果已加載,就直接執(zhí)行,以節(jié)省每一 LISP 程序第二次調(diào)用過程的執(zhí)行時間,同時又節(jié)省內(nèi)存空間。這樣的功能在以前的版本中,我是自己寫一個 LISP 程序來解決的。而現(xiàn)在,AI_UTILS.LSP 中的程序已提供了。因此,像上述的程序語法,您可以將其視為固定的。每一次當(dāng)您編寫一個新的 LISP 程序時,都可以“ 依樣畫葫蘆” 。2. ;= 正式程序?qū)⒂纱碎_始 =

38、(setq lin_(-1 -1);設(shè)定窗口的遇設(shè)初始位置()(defun c:dimdia (/ done onoroff vallist tol lim next_d next_d1)激活本程序的指令就是 dimdia。在括號中的變量名稱是表示這些變量屬于局部變量,也就是當(dāng)此程序執(zhí)行完后,這些變量將被。3. (setq tol 0)(setq lim 0);以下開始加載 sle.dcl 文件(setq lin_dcl (load_dialog sle.dcl)221(if ( lin_dcl 0) (exit)load_dialog 是加載.dcl 文件的函數(shù)語法。如果所欲加載的 .dcl

39、 文件有問題或找不到,則上述 if 語法做出將判別,中斷此程序的執(zhí)行并跳出。4. ;= 控制主窗口的子程序?qū)⒂纱碎_始 =(defun main_dia () (setq next_d 5) (setq next_d1 nil); 以下將顯示主窗口;(while ( 1 next_d)(if (not (new_dialog sle lin_dcl lin_) (exit)因為會有兩個窗口在,所以使用 while 函數(shù)語法來控制這兩個窗口在一條件下。if 函數(shù)語法用來判別 sle 窗口(在 sle.dcl 文件中的)是否可以加載,如果可以,就加載;反之,則中斷此程序的執(zhí)行并跳出。5. ;以下則將

40、 sle 窗口中第一部分的 AutoCAD 變量(開關(guān)變量)名稱;放到以串行形態(tài)存在的 onoroff 變量中,以供稍后使用。;(setq onoroff (dimalt dimtoh dimupt dimsah dimse1 dimse2 dimsho dimsd1 dimsd2 dimsoxd dimtix dimtofl dimaso dimtih dimtad)這些變量名稱的順序必須與在 .dcl 文件中的順序相同。2226. ;以下則將 sle 窗口中第二部分的 AutoCAD 變量(數(shù)值變量)名稱;放到以串行型態(tài)存在的 vallist 變量中,以供稍待取用。;(setq valli

41、st (dimasz dimtsz dimtxt dimcen dimexo dimexe dimdle dimaltf dimdli dimgap dimlfac dimrnd dimscale dimtfac dimtm dimtp dimtvp dimdec)這些變量名稱的順序必須與在 .dcl 文件中的順序相同。7. ;以下是要將目前 AutoCAD 的預(yù)設(shè)變量值放到 s;le 窗口中(mapcar set_on_off onoroff)(mapcar set_value vallist)希望 sle 窗口在一開始的中,開關(guān)變量與數(shù)值變量的預(yù)設(shè)目標(biāo)值就表現(xiàn)在窗口內(nèi)。所以,就設(shè)計了這個

42、mapcar 函數(shù)。由于并沒有適當(dāng)?shù)暮瘮?shù)語法可以做這種轉(zhuǎn)換,就必須自行設(shè)計 set_on_off 與 set_value 這兩個子程序來做這個擷取并顯示預(yù)設(shè)設(shè)定的動作。這兩個副程序?qū)⒃谙旅嬲f明。8. ;接下來,;要考慮如果操作者點取了窗口中的按鈕時要如何處理?(action_tile accept (ok)(setq done 1)(done_dialog)(action_tile cancel (done_dialog)(setq done 1)223(action_tile lort (show_lort)action_tile 是專門處理操作者的單擊動作的。accept 那一行是表示當(dāng)操

43、作者按下【Enter】鍵時就相當(dāng)于單擊了【OK】按鈕(反之亦然),并于執(zhí)行 OK 子程序的同時,又結(jié)束窗口的操作。OK 子程序?qū)⒃谙旅嬲f明,它用來執(zhí)行操作者所做的設(shè)定改變。“ cancel” 那一行程序是表示放棄操作者所作的設(shè)定改變并結(jié)束窗口的執(zhí)行。lort 那一行則表示當(dāng)操作者單擊【上下限或公差標(biāo)示】按鈕時,顯示 show_lort 的副窗口。show_lort 子程序?qū)⒃谙旅嫣峒啊?. (cond(= next_d1 3) (show_lort)(if (/= 3 next_d1)(setq next_d (start_dialog)(T (setq next_d (start_dialo

44、g)上面這一段程序是設(shè)定一執(zhí)行條件來執(zhí)行 show_lort 子程序。next_d 與 next_d1 變量都是為條件控制而設(shè)計的,以方便判別。10. )while 循環(huán)的終點對稱括號。11. )main_dia 子程序的終點對稱括號。22412. ;= ok 子程序?qū)⒂纱碎_始 =;如果操作者單擊了【OK】按鈕或【Enter】鍵,將執(zhí)行此程序以;所做的設(shè)定改變;操作者(defun ok ();以下將由窗口中將值擷取出以更新對應(yīng)的 AutoCAD 尺寸標(biāo)示變量;(mapcar get_on_off onoroff)(mapcar get_value vallist)get_on_off 與 ge

45、t_value 這兩個子程序是用來執(zhí)行更新動作的。它們將在下面說明。13. (setq lin_(done_dialog 1)若系統(tǒng)返回 1 將激活此 ok 子程序?!啊?將包含窗口的位置。下一個調(diào)用將會使lin_用此位置。14. )ok 子程序的終點對稱括號。15. ;= set_on_off 子程序?qū)⒂纱碎_始 =(defun set_on_off (varname)(setq d(getvar varname) (set_tile varname (itoa d )225這個子程序會將 AutoCAD 的尺寸標(biāo)示開關(guān)變量默認(rèn)值傳送至窗口中的對應(yīng)位置上。其中,set_tile 是關(guān)鍵函數(shù)。1

46、6. ;= set_value 子程序?qū)⒂纱碎_始 =(defun set_value (varname) (setq dreal (getvar varname) (set_tile varname (rtos dreal)這個子程序?qū)?AutoCAD 的尺寸標(biāo)示數(shù)值變量默認(rèn)值傳送至窗口中的對應(yīng)位置上。同樣,set_tile 是關(guān)鍵函數(shù)。17. ;= get_on_off 子程序?qū)⒂纱碎_始 =(defun get_on_off (varname)(setvar varname (atoi (get_tile varname)這個子程序會依操作者在窗口中所改變過的AutoCAD 尺寸標(biāo)示開關(guān)狀態(tài)

47、設(shè)定它。其中,get_tile 是關(guān)鍵函數(shù)。18. ;= get_value 子程序?qū)⒂纱碎_始 =(defun get_value (varname)(setvar varname (distof (get_tile varname)這個子程序會根據(jù)操作者在窗口中所改變過的 AutoCAD 尺寸標(biāo)示數(shù)值狀態(tài)設(shè)定。同樣,get_tile 是關(guān)鍵函數(shù)。22619. ;= show_lort 子程序?qū)⒂纱碎_始 =(defun show_lort()(if (not (new_dialog lort lin_dcl) (exit)這也是要測試在 sle.dcl 文件中的 lort 窗口定義是否可加載。

48、如果可以,就加載激活;反之,則中斷此程序的執(zhí)行并跳出。20. (action_tile none (setq tol 0)(setq lim 0) (action_tile dimtol (setq tol 1) (action_tile dimlim (setq lim 1) (action_tile accept (ok1)(done_dialog)(action_tile cancel (done_dialog)與上述相同,仍將使用 action_tile 來處理在此副窗口中操作者的單擊動作。由于在此副窗口中使用了同心按鈕架構(gòu),所以當(dāng)操作者單擊了三個同心按鈕中的一個時,就會激活上述的一個

49、動作。“ none” ,“ dimtol” 或“ dimlim” 都是在 sle.dcl 文件中,lort窗口定義內(nèi)的各 radio_button 所定義的 key 值。所以,兩方面都必須一致,不能打錯字。在它們之后的是:設(shè)定 tol 或lim 變量值為 1 (開)或 0(關(guān)),以方便稍后 ok1 的執(zhí)行設(shè)定。“ accept” 那一行是表示當(dāng)操作者按下了鍵盤上的【Enter】鍵時,就相當(dāng)于單擊了【OK】鈕(反之亦然),并執(zhí)行 OK1 子程序,同時也結(jié)束此副窗口的操作。OK1 子程序?qū)⒃谙旅嬲f明,它是用來執(zhí)行操作者所作的設(shè)定改變?!?cancel” 那一行是表示放棄操作者所做的設(shè)定改變并結(jié)束此

50、副窗口的執(zhí)行。22721. (setq next_d1 (start_dialog) (if (= 3 next_d1) (done_dialog 2)上面這一段程序是制造一個條件來執(zhí)行返回主窗口的程序。22. )這是 show_lort 子程序的終點對稱括號。23. ;= ok1 子程序?qū)⒂纱碎_始 =(defun ok1 () (setvar dimtol tol)(setvar dimlim lim)這段子程序?qū)⒂脕碓O(shè)定操作者在 lort 副窗口中所作的改變。24. ;= dimmod_main 子程序?qū)⒂纱碎_始 =(defun (setq(whiledimmod_main() done

51、0)(/= done 1)(main_dia);= 子程序區(qū)至此結(jié)束 =這段子程序是用來在一條件下調(diào)用上面的 main_dia 子程序的。可能您會認(rèn)為只有一個副窗口似乎不需使用此子程序。不過,這個程序是用來為將來有多個復(fù)合窗口時所考慮228設(shè)計的架構(gòu),可以未雨綢繆。25. ;設(shè)定錯誤函數(shù)(setq old_cmd (getvar cmdecho) ;目前的 cmdecho 系統(tǒng)變量設(shè)定old_error*error* ;*error* ai_error)(setvar cmdecho 0) (cond目前的錯誤函數(shù); 新的錯誤函數(shù)(not (setq dcl_id (ai_dcl s (T(d

52、immod_main)le);.DCL 文件是否已加載?(setq *error* old_error) (setvar cmdecho old_cmd)(princ)(unload_dialog lin_dcl) ;由內(nèi)存中DCL;=26. )這是 sle 程序的終點對稱括號。229更進(jìn)階的范例承 13.2 節(jié)范例,若要將之設(shè)計成更進(jìn)階的式人機接口,那就最好用“圖”的方式來引導(dǎo)操作者操作!其技巧在于使用了 .sld 的幻燈片文件。請按下面步驟來設(shè)計。如圖13-13 所示。DCL 范例程序名稱:SQUARE.DCL(本書范例光盤)圖 13-13 SQUARE.DCL 的程序本文與效果LSP 范

53、例程序名稱:SQUARE.LSP(本書范例光盤)配合文件名稱:SQUARE.SLD(本書范例光盤)程序文本如下:(1)(defun c:square (/ Image_ID sldname width heigh)(2)(setvar cmdecho 0) ;設(shè)定 cmdecho 系統(tǒng)變量以避免執(zhí)行指令的顯示(3)(setq Image_ID (load_dialog square.dcl) ;擷取 DCL 的 ID 碼 (4)(if ( Image_ID 0) ;如果 DCL 的影像 ID 碼不存在就跳出 (5)(exit)(6)(7)(new_dialog square Image_ID)

54、; 激活 DCL 文件(8);開始幻燈片文件的程序段(9)(setq sldname (strcat square.SLD) ;擷取幻燈片文件的名稱230(10)(11)(setq width(dimx_tile image)(12)height (dimy_tile image) ;擷取幻燈片尺寸 (13)(start_image image) ;初始幻燈片 (14)(fill_image 0 0 WIDTH HEIGHT 0) ;填滿幻燈片(15)(slide_image0 0 WIDTH HEIGHT SLDNAME) ;填滿方框(16)(end_image)(17);結(jié)束幻燈片文件的程

55、序段(18)(set_tile da 100) ;設(shè)定顯示于輸入窗口里的 a 默認(rèn)值為 100(19)(set_tile db 50);設(shè)定顯示于輸入窗口里的 b 默認(rèn)值為 50(20)(action_tile accept (get_xy)(done_dialog)(21)(action_tile cancel (done_dialog);define button-presion(22)(start_dialog) (23)(unload_dialog Image_ID) (24);end dialog (25)(draw);call draw function (26)(princ)(2

56、7)(28)(defun draw (/ pt1 pt2 pt3 pt4 Po s Pt1stlen poDataA po data plineobj cp ptm)(29)() ;加載 activeX 支持(30)(setq *acadObject* (vlax-get-acad-object)(31)(setq *acad* (vla-get-Active*acadObject*)*)(32)(setq *mSpace* (vla-get-MSpace *acad(33);以上三條程序是用來設(shè)定一些整體變量(34)(setq pt1 (getpon 矩形的左下角點:)(35)(setq p

57、t2 (polar pt1 (/ pi 2) db)(36)(setq pt3 (polar pt2 0 da)231(37)(setq pt4 (polar pt1 0 da)(38);以上三條程序是用來計算出這三個點的方位(39)(setq Po s (mapcar float (append pt1 pt2 pt3 pt4) (40)(setq Pt1stlen (length Po s)(41)(setq Po DataA(vlax-make-safearrayvlax-vbDouble(cons 0 (1- pt1stlen)(45) ) (46)(47)(vlax-safearra

58、y-fill Po DataA Po s)(48)(setq Po Data (vlax-make-variant(49)(50)(51)(52)Po DataA(logior vlax-vbarray vlax-vbDouble)(53);以上程序用來為即將畫出的聚合線改變 4 點為變式(54)(setq plineobj (vla-Addpolyline *mspace* Po Data)(55)(vla-plosed plineobj T)(56);以上程序用來畫出聚合線(57)(setq cp (list (+ (car pt1) (/ da 2) (+ (cadr pt1) (/ d

59、b 2) (58)(setq ptm (getpon 新的矩形中心點位置:)(59)(vla-move plineobj (vlax-3d-pocp) (vlax-3d-poptm);move square t (60)(princ)(61)(62)(defun get_xy ()(63)(setq da (atoi (get_tile da) (64)db (atoi (get_tile db) (65)(66)ition232(67);以上程序用來將聚合線移到指定的新位置上分析:從圖 13-13 可看出,這樣的接口不但清楚地以圖標(biāo)方式來告訴操作者輸入值的,都可以更改 a 與 b 的值,同時

60、常用的 a 與 b 的值意義,同時只要在單擊【確定】也會預(yù)設(shè)地顯示在輸入框中。這在輸入項目多的時候,對操作者來說就會很方便實用。在此范例最后的點與新位置的輸入部分,仍然使用傳統(tǒng)的問答方式。這部分當(dāng)然也可以將之并入圖 13-13 里,不過,這是要留到習(xí)題里做的。13.3.2VBA 的做法對接口來講,VBA 就不用那么麻煩了。在 AutoLISP/VLISP 里的原始寫法,是利用一個 LISP 程序再搭配一個 DCL 語言所寫的程序來寫,那就簡單了,只要一個.DVB 程序就搞定了。的。但是,如果要換成 VBA 來將 DIMDIA.LSP 與 SLE.DCL 改用 VBA 的寫法范例程序文件名稱:D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論