cad二次開發lisp編程學習_第1頁
cad二次開發lisp編程學習_第2頁
cad二次開發lisp編程學習_第3頁
cad二次開發lisp編程學習_第4頁
cad二次開發lisp編程學習_第5頁
已閱讀5頁,還剩114頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 第1節 根本知識AutoLISP是一種針對擴充及自訂AutoCAD函數機能而產生,以LISP為根底的程序設計語言.LISP本身于50年代末期出現,是一種擅于處理串行文字(List of Processing),屬第四代人工智能(Artificial Intelligence)的計算機語言. 目的是令使用者充份利用AutoCAD進行開發,直接增加及修改AutoCAD指令. AutoLisp語言建基于普通的LISP語言上,并擴充了許多適用于CAD的特殊功能而形成. 是一種能以直譯方式(不須先行編譯)亦可于AutoCAD內部執行的直譯性程序語言. 程序容易學習及撰寫,程序即使出錯亦不會對操作系統(

2、如DOS,WINDOWS)有不良影響. 數據及程序均統一以串行 (List)結構表示. 可直接調用幾乎全部的AutoCAD命令. 既具備一般高級語言的根本結構和功能,亦有一般高級語言沒有的強大圖形處理能力. 內建于AutoCAD應用程序,不須另行購置;亦不須使用特定的編輯器或開發環境. 可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件創立對話框. 缺點 : 執行速度較ObjectArx(舊稱ARX,以C或C+程序開發,取代以前的ADS)程序慢;原程序不易保護;對低階的硬件數據不易存取.第2節 函數 (Function)在AutoLISP程序語言

3、中所有的成份都是以函數的形式出現,AutoLISP程序就是順序執行連串的函數.函數的運行過程就是對函數的求值(結果)過程;函數的根本語法如下: (函數名稱 參數1 參數2) e.g. (PRINC AutoLISP Programming) 每一個完整的函數必須包在一對小括號( )內,左邊為開括號,右邊為關括號;如有假設干數量的開括號,那么一定有同等數量的關括號對應. 左邊開括號后緊隨函數名稱. 函數名稱與參數之間,或參數與參數之間須最少留一個空格. 函數可有一個或多個參數(也可能沒有參數),視該函數而定. 函數名稱不分大小寫,即大小寫字母視為相同. 第3節 數據型態 (Data Type)整

4、數 (INT)沒有小數字的數值,32位有號數,范圍從+2,147,483,647到-2,147,483,648實數 (REAL)帶小數字的數值,以倍精度浮點格式儲存(最少14位小數 當數值在1與-1之間時,必須加上前導零 可以科學記號表示 : 在E或e后加上次方值 字符串 (STR)一般文字,其前后必須加上雙引號 e.g. AutoCAD 控制字符或脫逸碼必須為小寫,且須在字符前加上反斜線 e.g. AutoCAD 像素名稱 (ENAME)是指定給圖文件內對象的指針(Pointer,為16進位的數字卷標) e.g. 像素名稱在圖文件內是唯一的,不會重復對象的像素名稱只在目前作業中有效,再開啟圖

5、檔時,會指定新的像素名稱予該對象檔案 (FILE)以OPEN函數所開啟檔案的指針,作為其它函數(讀寫該檔案)的自變量選集 (PICKSET)用SSGET等函數建立的一個或多個對象的集合或群組轉化 (VARIANT)可將像素名稱轉換為可與ActiveX配搭使用的VLA-Object對象符號 (SYM) 用以儲存靜態數據的名稱;例如內建或使用者定義的函數 符號名稱不分大小寫,可由任意長度的可打印字符組成;但以下的字符除外: 左括號 ( 右括號 ) 句點 . 單引號 雙引號 分號 ; 表 (LIST) 亦稱為串行,是放在一對小括號 ( ) 內,一個或多個元素的有序集合 e.g. (1.0 Lisp

6、( ) (5.6 7) 元素可以是字符串,符號,整數或實數;也可以是另一個表 元素與元素之間要用空格隔開,但元素與小括號之間那么可以不隔空格 為便于存取表內各元素,每個元素均有其序號;從表的左邊開始,第一個元素序號為0,依此類推 表的大小即為其頂層元素的數量(內層嵌套式的表,視為單一元素) 點對(Dotted Pair)亦是表的一種;表內有2個元素,中間以一圓點分隔,且元素與圓點之間亦須以空格分開 假設表內沒有任何元素,稱為空串行或空表;以 ( ) 或 (NIL) 表示第4節 變數 (Variable)為程序執行中動態儲存數據的符號名稱;主要分為2類:區域(Local)變量 又稱為局部變量;該

7、變量只在該程序段落中有效,不能為其它程序使用全域(Global)變量 又稱為整體變量;變量在所有程序段落中均可使用 變量名稱與符號的限制相同,使用時宜采用有意義及易于區分的名稱 變量在賦值或使用前無須先行設定 相同的變量可以儲存不同型態的數據(但同一時間內只可儲存一種型態) 在指定新的數據之前,變量儲存的內容會保持不變 賦值 將數據給予指定的變量儲存 以內建函數SETQ進行(可用于繪圖模式的指令行或AutoLISP程序),其語法如下: (SETQ 變量名稱1 資料1 變量名稱2 資料2 ) e.g. (SETQ NAME David AGE 37 WEIGHT 72.5 POINT (LIST

8、 10 20) 在函數名稱之后,各參數以兩個一組,每組左邊為變量名稱,右邊為存入變量的數據 亦可將變量名稱賦以空值(NIL) : e.g. (SETQ OCCUPATION NIL) 要顯示變量所儲存的數據,可以使用內建函數PRINC(可用于繪圖模式的指令行或AutoLISP程序),其語法如下 : (PRINC 變量名稱 ) e.g. COMMAND : (PRINC NAME) Result : DavidDavid 在繪圖模式中,亦可于指令行中使用感慨號 ! 來顯示變量內容,或作為指令選項的輸入值;語法如下 : !變量名稱 e.g. COMMAND : !NAME Result : Dav

9、id 在Visual LISP的主控臺窗口中,于提示符號 _$ 后鍵入要顯示的變量名稱 _$變量名稱 e.g. _$NAME 要檢查變量所儲存的數據型態,可使用內建函數TYPE;語法如下: (TYPE 變量名稱) e.g. COMMAND : (TYPE NAME) Result : STR 假設檢查的變量沒有儲存數據,那么會傳回NIL第5節 練習 (Exercises) 將四個坐標分別存入四個變量中,并以LINE或PLINE指令,配合四個坐標變量,畫出正四邊形. COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST

10、 10 10) POINT4 (LIST 10 0) COMMAND : LINE ;直線段指令 COMMAND : !POINT1 ;第一點(左下角起點) COMMAND : !POINT2 ;第二點(左上角) COMMAND : !POINT3 ;第三點(右上角) COMMAND : !POINT4 ;第四點(右下角) COMMAND : C ;自動聯機至起點以關閉四邊形 畫圓 : 將圓心坐標及半徑長度分別存入兩個變量中(變量名稱及數據型態自訂) COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;將圓心點設為坐標0,0;半徑為20 COMMAND : CIRC

11、LE ;執行劃圓指令 Specify center : !CEN ;在提示后以變量CEN響應輸入 Specify radius : !RAD ;在提示后以變量RAD響應輸入 將不同型態的數據,分屢次存入相同的變數內;每次均以PRINC及TYPE函數顯示變量內容及其數據型態 COMMAND : (SETQ TEMP 1.2) ;將實數存入變數TEMP COMMAND : !TEMP Result : 1.2 COMMAND : (TYPE TEMP) Result : REAL COMMAND : (SETQ TEMP AutoLISP) ;將字符串存入變量TEMP COMMAND : !TEM

12、P Result : AutoLISP COMMAND : (TYPE TEMP) Result : STR 第1節 根本運算加函數 (+ 數值參數1 數值參數2 ) e.g. (+ 2.5 4 6) Result : 12.5 函數的結果為各參數之總和 假設僅提供一個參數,那么以0加上此參數的結果為返回值 假設沒有提供任何參數那么傳回0;各參數須為整數或實數型態 假設所有參數均為整數,結果亦為整數;假設其中一個參數為實數型態,結果會轉換為實數 減函數 (- 數值參數1 數值參數2 ) e.g. (- 10 2 3) Result : 5 結果為第一個(最左邊)參數減去其右邊各參數的總和 假設

13、只提供一個參數,返回值為0減去該參數的結果 假設沒有提供任何參數那么傳回0;各參數須為整數或實數型態 假設所有參數均為整數,結果亦為整數;假設其中一個參數為實數型態,結果會轉換為實數 乘函數 (* 數值參數1 數值參數2 ) e.g. (* 2 3 4) Result : 24 結果為所有參數的乘積 假設只提供一個參數,那么返回值為該參數乘以1的結果 假設沒有提供任何參數那么傳回0;各參數須為整數或實數型態 假設所有參數均為整數,結果亦為整數;假設其中一個參數為實數型態,結果會轉換為實數 除函數 (/ 數值參數1 數值參數2 ) e.g. (/ 24 2 3) Result : 4 結果為第一

14、個(最左邊)參數除以其右邊各參數的乘積 假設僅提供一個參數,那么返回值為該參數除以1的結果 假設沒有提供任何參數那么傳回0;各參數須為整數或實數型態 假設所有參數均為整數,結果亦為整數;假設其中一個參數為實數型態,結果會轉換為實數 注意 : 在本篇教程中,各函數的數值參數,均可以變量(儲存值只可以是整數或實數,且不可以是空值 nil)取代第2節 練習 (Exercises)計算式 (2+4)*3 COMMAND : (* 3 (+ 2 4) Result : 18 計算式 (50-8*5)/4 COMMAND : (/ (- 50 (* 8 5) 4) Result : 2 注意 : 上式的正

15、確答案應是2.5,因為函數中的各參數均為整數,所以傳回的結果亦為整數遞增及遞減遞增 (1+ 數值參數 ) e.g. (1+ 2) Result : 3 遞減 (1- 數值參數 ) e.g. (1- 4) Result : 3 三角函數 (Trinagular Function)正弦值 (SIN 弧度參數) e.g. (SIN 1) Result : 0.841471 余弦值 (COS 弧度參數) e.g. (COS 1) Result : 0.540302 反正切值 (ATAN 弧度參數) e.g. (ATAN 1) Result : 0.785398 第3節 其它數值處理次方值 (EXPT

16、數值參數 次方值 ) e.g. (EXPT 2 4) Result : 16 假設參數及次方值兩個均為整數,返回值亦是整數;假設其中一個為實數,結果為實數 開方根 (SQRT 數值參數 ) e.g. (SQRT 30) Result : 5.47723 絕對值 (ABS 數值參數 ) e.g. (ABS -123) Result : 123 余數 (REM 數值參數1 數值參數2 ) e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4 將參數1整除參數2的余數 假設參數多于2個時,那么會將余數再整除下一個參數,再得出余數;依此類推 假設其中一

17、個參數為實數時,那么結果為實數;否那么為整數 最大公約數 (GCD 數值參數1 數值參數2 ) e.g. (GCD 81 57) Result : 3 兩個參數均必須為整數值型態 自然對數 (LOG 數值參數 ) e.g. (LOG 3.5) Result : 1.25276 是EXP函數的反函數;傳回值為實數型態 自然反對數 (EXP 數值參數 ) e.g. (EXP 1.25276) Result : 3.49999 是LOG函數的反函數;傳回值為實數型態 第4節 數值資料轉型實數轉整數 (FIX 數值參數 ) e.g. (FIX 12.56) Result : 12 只會截去小數部份(小

18、數字不會4舍5入) 整數轉實數 (FLOAT 數值參數 ) e.g. (FLOAT 12) Result : 12.0 整數轉字符串 (ITOA 數值參數 ) e.g. (ITOA -17) Result : -17 數值轉字符串 (RTOS 數值參數 模式 小數字 ) e.g. (RTOS 17.23333 2 3) Result : 12.266 假設不設定模式,那么依系統變量 LUNITS 的設定值轉換數值為字符串 假設不設定小數字,那么依系統變量 LUPREC 的設定值轉換 模式設定值可以是以下數值之一 : 1 = 科學記號 2 = 十進制 3 = 英呎及十進制英吋 4 = 英呎及分數

19、位英吋 5 = 分數 中選用的模式為3,4或5,那么傳回的字符串受系統變量UNITMODE影響 弳度轉字符串 (ANGTOS 角度參數 模式 小數字 ) e.g. (ANGTOS 0.785398 0) Result : 45 e.g. (ANGTOS 0.785398 4) Result : N 45d E 假設不設定模式,那么依系統變量AUNITS的設定值轉換數值為字符串 假設不設定小數字,那么依系統變量AUPREC的設定值轉換 模式設定值可以是以下數值之一 : 0 = 度 1 = 度/分/秒 2 = 分度量 3 = 弳度 4 = 土地測量單位 中選用的模式為4,那么傳回的字符串受系統變量

20、UNITMODE影響 反函數為ANGTOF;參閱第5篇教程 第5節 數值資料檢查數值 (NUMBERP 數值參數 ) e.g. (NUMBERP -3.45) Result : T e.g. (NUMBERP AutoLISP) Result : nil 注意 : 在范例的傳回值中,T表示函數的結果為真(成立),nil表示結果為假(不成立)負數值 (MINUSP 數值參數 ) e.g. (MINUSP -3.45) Result : T e.g. (MINUSP 0) Result : nil e.g. (MINUSP 3.45) Result : nil 零值 (ZEROP 數值參數 ) e

21、.g. (ZEROP 0) Result : T e.g. (ZEROP 3.45) Result : nil 其它應用最大值 (MAX 數值參數1 數值參數2 ) e.g. (MAX -88 5 2) Result : 5 假設沒有提供任何參數,那么傳回值為0最小值 (MIN 數值參數1 數值參數2 ) e.g. (MIN -88 5 2) Result : -88 假設沒有提供任何參數,那么傳回值為0第6節 練習 (Exercises)計算以下算式 : (+ 1234567890 1234567890) Result : -1825831516 上式中兩個數值參數均為整數,而結果值大于整數

22、型態所能容許之范圍;固導致發生溢位問題,產生無效的結果.修正算式如下 : 只要將其中一個參數改為實數型態即可.(+ 1234567890.0 1234567890) Result : 2.46914e+009 計算以下算式 : (+ 9876543210 1234567890) Result : 1.11111e+010 上式中兩個數值參數均為整數,但其中一個(第一個)參數巳大于整數型態所能容許之范圍;系統會自動將此參數先行轉為實數型態才計算.計算以下算式 : (FIX (SQRT (+ 1 (MAX 20 10 40 30) Result : 6 最先執行的是最內層的算式 (MAX 20 1

23、0 40 30) ,求出最大值為40 其次執行加函數,將MAX函數所得的最大值加1,結果為41 再利函數SQRT,將41開方根,結果為 最后使用FIX函數,截去其小數字,得到最后的結果為6第1節 使用者定義函數 是將一群表示式組合成一個函數或指令 可應用于繪圖模式的指令行提示,Visual LISP主控臺,或供其它自定義函數內的表示式呼叫使用 AutoLISP原始程序代碼均以純文字格式存盤,擴展名為LSP(2000版可編譯成擴展名為FAS的檔案 可以一般文字編輯器進行開發,如DOS的EDIT,WINDOWS的WORD或WORDPAD等 一個自定函數內最少要有一個表達式 在原程序文件(LSP)里

24、,自定義函數以DEFUN函數開始;其語法如下 : (DEFUN C: 函數名稱 ( 自變量串行 . / 局部變數串行 . ) 表達式 .) 在呼叫帶有自變量的自定函數時,必須同時提供與定義函數時,同等數量的參數,使各參數傳入自定函數的各自變量中 自變量被視為一種特殊類型的局部變量,無法用于該自定函數以外的其它函數 假設自定函數中無須設定任何自變量,亦必須以空串行 ( )加在函數名稱之后 假設有提供局部變量,必須以斜線 / 加在局部變量的開頭(即使前面沒有自變量串行) 各自變量,斜線,局部變量之間要以空格分隔;但與左右小括號之間那么不須以空格分開 假設自變量串行中有相同名稱的自變量出現,那么會忽

25、略第一個以后的相同自變量;變數亦是一樣 假設在函數名稱前加上C:,表示該函數可以在繪圖模式的指令行提示下,其執行方式與內建函數相同;亦可以在任何內建命令(執行中)的提示后,以通透方式執行(但須將函數名稱包在一對小括號中) 假設在函數名稱前沒有加上C:,在指令行提示下,必須將函數名稱包在一對小括號中才可執行 不可以在執行一自定函數時,以通透方式執行另一自定函數 第2節 加載程序 自定函數在使用前,都要將其所在的程序文件(擴展名為LSP)加載才可執行 程序文件(預設在SUPPORT子目錄內)會在啟動AutoCAD時自動加載 (LOAD 程序文件名稱 加載失敗 ) e.g. (LOAD TEST)

26、假設程序文件之文件名為LSP,那么在程序文件名稱之后,可以不加上擴展名 假設有需要,系統會順序嘗試其它的擴展名 : VLX FAS LSP 假設程序文件不在系統的支持目錄下,那么需在文件名前加上目錄路徑注意 : 必須以正斜線 / 或兩個反斜線 作為目錄的分隔符 可以在加載失敗的參數中提供字符串,以供加載失敗時顯示;亦可提供有效的自定函數,該函數在加載程序文件失敗時會被執行 e.g. (LOAD TEST Load Fail) 或 (LOAD TEST (DOERROR)注意 : 在程序文件加載后,在提示行顯示的返回值,一般是該程序文件中,最后被定義的函數名稱 或是在程序文件內沒有包含在自定函數

27、中,最后一個表達式的執行結果 第3節 練習 (Exercises) 啟動文字編輯器,編寫一AutoLISP程序作兩個同心圓 (第1個圓半徑為50,第2個圓半徑為80),程序代碼如下所示 : (DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50) (COMMAND CIRCLE CEN RAD) (COMMAND CIRCLE CEN (+ RAD 30) 輸入后以純文字格式存盤(C:TEST.LSP) 在AutoCAD繪圖模式的指令行提示后,用LOAD函數將程序文件加載 COMMAND : (LOAD C:/TEST) 在指令行提示后,輸入程序(函數

28、)名稱執行 COMMAND : 2CIRCLE 程序說明1 使用DEFUN建立自定函數的名稱,并用SETQ函數將中心點(LIST 0 0)存入變數CEN,半徑(50)存入變數RAD中 2 使用COMMAND函數執行AutoCAD內建指令CIRCLE,并以變量CEN(圓的中心點)及變數RAD(圓的半徑)回應 3 與第2行大致相同,但在指定其半徑時,先將儲存半徑的變量加30,使劃出半徑為80的圓;注意最右邊的關括號,與第1行DEFUN左邊的開括號是一對的 啟動文字編輯器,開啟程序文件,復制2CIRCLE至新程序2C,并改為傳入自變量方式執行;程序代碼如下 : (DEFUN 2C (CEN RAD)

29、 (COMMAND CIRCLE CEN RAD) (COMMAND CIRCLE CEN (+ RAD 30) 輸入后以純文字格式存盤 在AutoCAD繪圖模式的指令行提示后,用LOAD函數將程序文件重新加載 在指令行提示后,輸入程序(函數)名稱執行 COMMAND : (2C (LIST 0 0) 50) 第4節 批注單行批注 分號 ;表示在分號右邊(同一行)的字符均為批注,程序執行時會將其忽略多行批注 ;| |;表示在兩個批注符號中間所有字符皆為批注,即使字符跨越多行關系運算 在各個關系運算中,都會傳回一邏輯值;假設關系成立,傳回 T,否那么會傳回 nil 各參數可以是字符串,整數或實數

30、型態;假設以字符串進行比擬,那么會以字符串的ASCII碼為準 假設函數中只有一個參數,傳回值恒為 T 等于函數 (= 參數1 參數2 )會將參數1與其后各個參數比擬,假設全部相等那么傳回 T,否那么傳回 nil e.g. (= 2 2.0) Result : T e.g. (= A CHR(65) Result : T 不等于函數 (/= 參數1 參數2 )假設參數1不等于其后任何一個參數,即傳回 T e.g. (/= 1 2.0) Result : T e.g. (/= a CHR(65) Result : T e.g. (/= 10 30 40 10 20) Result : T 小于函數

31、 ( 參數1 參數2 ) 各參數順序以2個為一組比擬,假設各組左邊的參數均小于右邊的參數,即傳回 T e.g. ( 1 2) Result : T e.g. ( 參數1 參數2 ) 各參數順序以2個為一組比擬,假設各組左邊的參數均大于右邊的參數,即傳回 T e.g. ( 1 2) Result : nil e.g. ( a CHR(65) Result : nil 小于或等于函數 (= 參數1 參數2 ) 各參數順序以2個為一組比擬,假設各組左邊的參數均小于或等于右邊的參數,即傳回 T e.g. (= 1 2) Result : T e.g. (= 2 2) Result : T e.g. (

32、= 參數1 參數2 ) 各參數順序以2個為一組比擬,假設各組左邊的參數均大于或等于右邊的參數,即傳回 T e.g. (= 1 2) Result : nil e.g. (= 2 2) Result : T e.g. (= a CHR(65) Result : nil 第5節 邏輯運算且運算 (AND 表達式 ) 假設各表達式的傳回值均為 T,函數即返回 T 值;假設其中一個傳回值為 nil,函數傳回 nil e.g. (AND ( 8 5) Result : T 或運算 (OR 表達式 ) 假設各表達式的傳回值均為 nil,函數即返回 nil 值;假設其中一個傳回值為 T,函數傳回 T e.g

33、. (OR ( 1 2) ( 8 5) Result : T 否認運算 (NOT 表達式 ) 假設表達式的傳回值為 T,函數即返回 nil 值;相反假設表達式傳回值為 nil,函數傳回 T 可用于檢查傳回值是否為 nil 另有一NULL函數與NOT函數功能相似 e.g. (NOT ( NUM 200) 輸入后存盤(純文字格式) 在AutoCAD繪圖模式的指令行提示符號后,使用LOAD函數重新加載程序文件 COMMAND : (LOAD C:/TEST) 在AutoCAD繪圖模式的指令行提示符號后,輸入自定函數名稱及參數執行 COMMAND : (AIR 175) Result : nil CO

34、MMAND : (AIR 215) Result : T 第1節 條件判斷是利用條件函數,配合關系及邏輯運算所設定的一些準那么,令程序自行分析,因應情況作出適當行動.單一條件 (IF 條件表達式 是表達式 否表達式 ) 函數先檢查條件表達式,假設其傳回值為 T,便會執行其后的是表達式 假設有提供否表達式,且條件表達式的傳回值為 nil,函數將不會執行(跳過)是表達式而執行否表達式 假設沒有提供否表達式,且條件表達式的傳回值為 nil時,函數將不作任何事情 IF函數可以巢狀方式嵌套,即在是或否的表達式中參加另一個IF函數 練習 (Exercises) 判斷空氣污染指數 : 大于100 = Ver

35、y High, 51至100 = High, 26至50 = Medium, 25或以下 = Low 啟動編輯器,開啟程序文件;新增AIR-1自定函數,程序代碼如下 : (DEFUN AIR-1 (NUM) (IF ( NUM 100) (PRINC Very High) (IF (AND ( NUM 50) ( NUM 25) (= NUM 50) (PRINC Medium) (IF ( NUM 50) (PRINC (IF ( NUM 100) Very high High) (PRINC (IF ( NUM 25) Medium Low) (PRINC) 程序說明1 設定函數名稱,并將

36、數據存入自變量NUM內;用IF函數判斷變量NUM是否大于50;假設條件成立(變量NUM大于50)時,再用另一個IF函數判斷變量是否大于100;假設條件成立(變量NUM大于100)時,使用PRINC函數顯示字符串Very High,否那么顯示High 2 假設在第1個IF函數判斷中,條件不成立(變量NUM不大于50)時;再用另一個IF函數判斷變量是否大于25;假設條件成立(NUM大于25)時,顯示字符串Medium,否那么顯示字符串Low 3 是一個沒有提供任何自變量的PRINC函數;用以抑制顯示答案時尾部符加的 nil 或重復的傳回值;而最右一個關括號,是用以對應第1行最左邊的開括號 注意 :

37、 第1行最后一個關括號是對應前面的PRINC函數,尾2的關括號那么是對應IF函數 (判斷NUM是否大于100) 第2行最后一個關括號是對應第1行的IF函數 (判斷NUM是否大于50),尾2的關括號那么是對應PRINC函數,尾3的關括號那么是對應IF函數 (判斷NUM是否大于25) 最右邊的關括號是對應第1行最左邊的開括號 PROGN 函數 在以上各范例中,執行的表達式均為單一的函數運算;假設要在表達式中順序執行一連串的函數,便要將各函數包含在一個PROGN函數內;函數的傳回值會是該PROGN函數中,最后一個表達式的運算結果 修改程序文件的AIR-1程序,第1個IF函數如下,其余的IF函數請自行

38、修改 e.g. (IF ( NUM 100) (PROGN (SETQ DISP Very High) (PRINC DISP)注意 : 最后一個關括號是對應前面的IF函數 (判斷變量NUM是否大于100) 尾2的關括號是對應PROGN函數 (用以包含SETQ及PRINC函數) 尾3的關括號是對應PRINC函數的 第2節 條件判斷多重條件 (COND (條件表達式 是表達式) ) 函數會順序檢查各條件表達式;直到其中一個條件成立(傳回 T),即執行該條件式所對應的是表達式 每個條件表達式只對應一個是表達式,而沒有否表達式 假設條件式成立且執行對應的是表達式后,那么不會再對余下的其它條件表達式進

39、行檢查 假設只有條件表達式而沒有對應之是表達式,那么只會傳回條件表達式的邏輯值 假設沒有提供任何條件表達式及是表達式,函數傳回值恒為 nil 練習 (Exercises) 新增程序AIR-3,以改善上一課AIR-1程序;用一個COND函數判斷多個條件表達式 DEFUN AIR-3 (NUM) (COND ( NUM 200) (PRINC Severe) ( NUM 100) (PRINC Very High) ( NUM 50) (PRINC High) ( NUM 25) (PRINC Medium) ( NUM 0) (PRINC Low) (T (PRINC Cannot Check)

40、 (PRINC) 程序說明1 設定函數名稱,并將數據存入自變量NUM內;用COND函數進行多重判斷 2 判斷變量NUM是否大于200,假設條件成立,那么顯示 Severe 訊息;第3至6行依此類推 7 注意條件式為一個 T 字母,表示條件式恒為真(成立),顯示訊息 Cannot Check作用是當以上各條件式均不成立時(變量小于或等于0),即執行此一表達式 第3節 循環 (Loop) 配合條件判斷,關系及邏輯運算,令程序不斷重復一些動作,以提高效率及減少重復動作時的人為錯誤 可以多個循環形成巢狀(嵌套式)循環,即在一個循環內嵌套另一個(或多個)循環 指定的重復次數必須為正整數,亦可以是儲存正整

41、數的變量名稱 重復指定次數 (REPEAT 重復次數 表達式 ) e.g. (REPEAT 10 (PRINC David) ;重復顯示David字符串10次 重復 (WHILE 條件表達式 是表達式 ) 假設條件表達式的傳回值為 T,即會順序執行函數內各表達式 各表達式順序執行完后,程序會返回函數的開頭,重新檢查條件表達式的傳回值 假設條件表達式的傳回值為 nil,函數內各表達式將不會被執行 e.g. (SETQ COUNT 1) ;將1存入變數COUNT (WHILE (= COUNT 10) ;WHILE函數并檢查變量COUNT是否=10 (PRINC David) ;假設條件成立那么以

42、PRINC函數顯示David字符串 (SETQ COUNT (1+ COUNT) ;變量COUNT遞增1,并將新值重新存入變量COUNT中取代原值 注意 : 第4行最右邊的關括號,是對應第2行WHILE函數的開括號無限循環 又稱為死循環,即循環的條件判斷式傳回值恒為 T,令循環不斷重復而無法結束;在上例中 : 假設WHILE函數的條件表達式設定為 (T) ;即條件永遠成立 不作SETQ函數,或不將變量COUNT遞增 ;變量COUNT儲存值恒久不變,導致條件式永遠成立 第4節 練習 (Exercises) 編寫一程序SUM并將自變量存在NUM變量內,計算1+2+3+4 至變數NUM的總和 (DE

43、FUN SUM (NUM) (SETQ COUNT 1 TOTAL 0) (WHILE (= COUNT NUM) (SETQ TOTAL (+ TOTAL COUNT) COUNT (1+ COUNT) ) (PRINC TOTAL) (PRINC) 程序說明1 設定函數SUM并將自變量存入變量NUM,設定變量COUNT以將數目由1開始遞增,變量TOTAL(儲存總和)初始值為0 2 WHILE循環函數,并設定進入循環的條件式(變量COUNT小于或等于變量NUM) 3 假設條件成立即進入循環內部,先將變量TOTAL加上變量COUNT,再用SETQ函數存回變量TOTAL中,覆蓋原值 4 將變量C

44、OUNT遞增1,存回變數COUNT并覆蓋原值 5 關括號與第2行的WHILE函數左邊的開括號對應 6 循環結束后,用PRINC函數顯示變量TOTAL(總和)的內容 程序流程 假設執行程序時傳入變量NUM的數值為10 變數初始值 COUNT = 1 TOTAL = 0 判斷變量COUNT是否=變量NUM COUNT = 1 TOTAL = 0 變量COUNT(現值1)小于NUM,進入循環;將TOTAL(現值0)加上COUNT,存回變數TOTAL COUNT = 1 TOTAL = 1 變數COUNT(現值1)遞增1變為2,存回變數COUNT COUNT = 2 TOTAL = 1 返回WHILE

45、函數的開頭,重新判斷條件式 變量COUNT(現值2)小于NUM,進入循環;將TOTAL(現值1)加上COUNT,存回變數TOTAL COUNT = 2 TOTAL = 3 變數COUNT(現值2)遞增1變為3,存回變數COUNT COUNT = 3 TOTAL = 3 返回WHILE函數的開頭,重新判斷條件式 變量COUNT(現值3)小于NUM,進入循環;將TOTAL(現值3)加上COUNT,存回變數TOTAL COUNT = 3 TOTAL = 6 部 份 過 程 省 略 返回WHILE函數的開頭,重新判斷條件式 變量COUNT(現值10)仍等于NUM,進入循環;將TOTAL(現值45)加上

46、COUNT,存回變數TOTAL COUNT = 10 TOTAL = 55 變數COUNT(現值10)遞增1變為11,存回變數COUNT COUNT = 11 TOTAL = 55 返回WHILE函數的開頭,重新判斷條件式 變量COUNT(現值11)巳大于NUM(本范例假設為10),條件判斷不成立,循環結束 COUNT = 11 TOTAL = 55 顯示變量TOTAL的現存值,程序結束 嘗試用IF函數檢查輸入的自變量是否小于或等于0;假設條件成立那么不執行余下的程序(DEFUN SUM (NUM) (IF (= NIM 0) (PRINC Input Error) (PROGN 略 過 WH

47、ILE 及 PRINC 函數 ) ) (PRINC) 程序說明1 設定函數SUM并將自變量存入變量NUM,并用IF函數判斷是否=0,假設條件成立那么顯示錯誤訊息 2 假設條件不成立,即以PROGN函數包含上例中的循環及顯示答案部份 3 尾3行的關括號是對應第2行的PROGN函數 4 尾2行的關括號是對應第1行的IF函數 5 最后一行最右邊的關括號是對應第1行的DEFUN函數 第1節 輸入函數 讓AutoCAD應用程序可以提示使用者輸入程序所需的數據;這些輸入函數一般都是以GET開頭;當程序執行至輸入函數時,程序便會暫停,等待使用者輸入指定類型的數據后,程序即會繼續執行.亦可在函數內指定要顯示的

48、提示字符串,假設不提供那么沒有任何提示.輸入整數 (GETINT 提示字符串 ) e.g. (GETINT Input Number : ) 輸入的范圍從-32,768到+32,767之間;假設超出范圍,會有警告訊息 假設輸入的數據不是整數型態,如文字或是實數,會顯示警告訊息 假設輸入空格或按下ENTER鍵響應,輸入值為 nil 輸入實數 (GETREAL 提示字符串 ) e.g. (GETREAL Input Number : ) 假設輸入的數據是字符串型態,會顯示警告訊息;假設輸入整數,那么會自動轉為實數 假設輸入空格或按下ENTER鍵響應,輸入值為 nil 輸入字符串 (GETSTRIN

49、G 模式 提示字符串 ) e.g. (GETSTRING T Input Name : ) 假設有提供模式參數且不是 nil 值,使用者即可在輸入的字符串中包含空格;但此時必須按ENTER鍵結束輸入 假設沒有提供模式參數或該參數為 nil 值,要在字符串中包含空格時,必須在字符串的前后加上雙引號 輸入時不須在字符串的前后加上雙引號(上述的情況例外) 假設輸入空格(沒有模式參數或為 nil 值時)或按ENTER鍵響應時,輸入值為,即空字符串 輸入選取點 (GETPOINT 基準點 提示字符串 ) e.g. (GETPOINT (LIST 0 0) Select Point : ) 可以在屏幕以指

50、向設備(一般是鼠標)選取,或以鍵盤直接輸入坐標值亦可 假設有提供基準點(目前UCS的2D或3D坐標),會從基準點出現伸縮線到十字光標所在位置 可接受單一整數或實數作為長度,代替基準點參數;此時會以系統變量LASTPOINT為基準點,以目前十字光標的位置與LASTPOINT的角度為方向,以長度為距離,求出新的輸入點 傳回值為目前UCS的三維坐標;假設輸入空格或按下ENTER鍵響應,輸入值為 nil輸入角度 (GETANGLE 基準點 提示字符串 ) e.g. (GETANGLE (LIST 0 0) Select Point : ) 假設有提供基準點(目前UCS的2D坐標),會從基準點出現伸縮線

51、到十字光標所在位置 假設沒有提供基準點,可以在屏幕以指向設備(一般是鼠標)選取兩點,以第一點作為基準點 可從鍵盤直接輸入角度值;不管是用指向設備選取或鍵盤輸入,均自動轉為弳度傳回 弳度以0弳度方向(由系統變量ANGBASE設定)算起,沿反時鐘方向增加 輸入角度 (GETORIENT 基準點 提示字符串 ) e.g. (GETORIENT (LIST 0 0) Select Point : ) 唯一不同于GETANGLE函數的是 : 以正右方為0弳度,不受 ANGDIR 及 ANGBASE 系統變量影響 輸入對角點 (GETCORNER 基準點 提示字符串 ) e.g. (GETCORNER (

52、LIST 0 0) Select Point : ) 必須提供以目前UCS為準的基準點參數;與目前十字光標位置構成伸縮的矩形 傳回值為目前UCS的三維坐標;假設輸入空格或按下ENTER鍵響應,輸入值為 nil 可直接從鍵盤輸入坐標值,以代替從屏幕點選 輸入距離 (GETDIST 基準點 提示字符串 ) e.g. (GETDIST (LIST 0 0) Select Point : ) 會從基準點(目前UCS的2D坐標)出現伸縮線到十字光標所在位置 假設沒有提供基準點,可以在屏幕以指向設備(一般是鼠標)選取兩點,以第一選取點作為基準點 假設提供3D的點坐標,那么傳回值是3D的距離;但假設設定了I

53、NITGET函數第64位,那么會忽略Z坐標而傳回2D距離輸入關鍵詞 (GETKWORD 提示字符串 ) e.g. (GETKWORD Yes or No (Y/N) 有效的關鍵詞必須在此函數使用前,先行以INITGET函數來設定 假設輸入一個無效的關鍵詞時,系統會顯示警告訊息并提示再次輸入 輸入關鍵詞后,會傳回輸入的關鍵詞的字符串;假設按ENTER鍵那么傳回 nil 標準檔案對話框 (GETFILED 標題 預設檔名 預設擴展名 模式) e.g. (GETFILED Select file C:/TEST DWG 8) 預設文件名可包含目錄路徑,假設為空字符串,那么會是AutoCAD啟動目錄的

54、全部檔案 假設預設擴展名為空字符串,那么顯示所有類型的檔案;假設擴展名為DWG,會在對話框中顯示預覽影像 假設對話框取得文件名稱,函數會傳回指定的文件名稱及目錄路徑,否那么傳回 nil 模式是控制對話框行為的整數值;假設要一次過設定多種模式,可將其模式對應的數值累加 1 (0位) 建立新的檔案;假設是要開啟舊檔那么切勿使用;假設檔案巳存在會顯示錯誤訊息 4 (2位) 此位假設未設定,那么只會接受指定的預設擴展名,假設檔案不加擴展名,那么自動加上預設的擴展名 8 (3位) 假設設定此位且未設定0位,檔案會依支持路徑搜尋;假設找到那么只會傳回文件名稱,不會傳回路徑.假設未設定此位,那么會傳回完整的

55、目錄路徑文件名 16 (4位) 假設設定此位,或是預設文件名以路徑分隔元結尾,那么僅顯示該目錄路徑的檔案,且文件名稱輸入框會變為空白 32 (5位) 假設設定此位及0位,假設指定的檔案巳經存在那么會被覆蓋,且覆蓋前不會有警告訊息 64 (6位) 假設指定了URL,那么請勿傳輸遠程檔案 128 (7位) 完全不允許使用URL 第2節 設定關鍵詞 (INITGET 模式 關鍵詞串 ) e.g. (INITGET 7 Yes No) 假設使用者的輸入符合某個關鍵詞,那么會傳回整個關鍵詞串;否那么會顯示提示重試 每個關鍵詞僅可以含有字母,數字及連字符號 (-);有以下兩種方式縮寫關鍵詞 : 關鍵詞的必

56、要部份用大寫,其余用小寫 e.g. Yes No 整個關鍵詞全部為大寫,以逗號分隔,再重復簡寫的部份 e.g. YES,Y NO,N 假設關鍵詞全部為小寫或大寫,且沒有逗號及縮寫部份,那么使用者必須輸入整個關鍵詞才能辨析 每個關鍵詞之間必須以空格分開 本函數適用于除GETSTRING以外的其它輸入函數(但各函數可設定的模式略有不同) 模式的作用為控制使用者的輸入,為整數值;假設要一次過設定多個模式,可將該模式對應的數值累加 1 (0位) 不接受使用者按下ENTER鍵作為響應 2 (1位) 不接受使用者輸入0作為響應 4 (2位) 不接受使用者輸入負數作為響應 8 (3位) 允許輸入超出圖面范圍

57、以外的坐標點(即使目前系統數數LIMCHECK設定為ON) 16 (4位) 目前并未使用 32 (5位) 使用虛線繪制伸縮線或方框;但如果POPUPS系統變量設定為0,那么會忽略此位的設定 64 (6位) 假設設定此位,那么各輸入函數只傳回2D的坐標;否那么會傳回3D的坐標 128 (7位) 允許任意的輸入;這位優先于0位的設定值;假設輸入時按ENTER響應,那么會傳回空字符串 第3節 輸出函數顯示或寫入檔案 (PRIN1 字符串 / 表達式 檔案指標 ) e.g. (PRIN1 David) 所有包含在字符串中的控制字符會當為普通字符顯示 假設沒有提供字符串或表達式,那么函數將不作任何事情

58、結果會在屏幕顯示兩次,第一次為函數功能所顯示的,第二次為系統的傳回值 檔案指針必須是以OPEN函數,開啟檔案后傳回的指標;假設沒有提供,所有傳回值均顯示在屏幕上;假設有提供,字符串將寫入該檔案內 e.g. (PRIN1 David FILE_ID)顯示或寫入檔案 (PRINC 字符串 / 表達式 檔案指標 ) e.g. (PRINC David) 所有包含在字符串中的控制字符會正常運作 其它與PRIN1函數相同 顯示 (PROMPT 字符串參數 ) e.g. (PROMPT David) 在雙屏幕規劃中,可將字符串顯示在兩個屏幕上 字符串顯示后,傳回值恒為 nil 顯示 (ALERT 字符串參

59、數 ) e.g. (ALERT David) 字符串參數會顯示在對話框中 可配合換行控制字符 顯示多行文字 在對話框中,可顯示的列數量及每列可顯示的字符數量,受平臺設備,窗口大小及解像度影響 第4節 練習 (Exercises) 在程序文件中,新增程序2C-1,以修改第三篇課程的2C程序 : 在新增的程序中,使用輸入函數取得使用者輸入,取代在呼叫舊程序時同時傳入自變量的做法 (DEFUN C:2C-1 ( ) (SETQ CEN (GETPOINT Select center point : ) (COMMAND CIRCLE CEN (GETDIST CEN Input radius : )

60、 (PRINC) 程序說明1 設定函數2C-1,并用GETPOINT函數取得使用者選取的坐標點(圓心)再用SETQ函數將坐標存入變量CEN中 2 用COMMAND函數執行CIRCLE指令,隨即以變量CEN響應以設定圓心點位置,再使用GETDIST函數,取得使用者輸入的長度作為半徑響應CIRCLE指令 在程序文件中,新增程序RECT,以對角的兩點建立矩形(聚合線),再詢問是否在矩形中加上對角線,最后將圖形以輸入的角度旋轉.在程序中要等別注意如何將坐標分解及重組(第3,4行的程序代碼) (DEFUN C:RECT ( ) (SETQ PT_START (GETPOINT Select first

溫馨提示

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

評論

0/150

提交評論