autolist详解.docx
- 文档编号:5859394
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:109
- 大小:129.04KB
autolist详解.docx
《autolist详解.docx》由会员分享,可在线阅读,更多相关《autolist详解.docx(109页珍藏版)》请在冰豆网上搜索。
autolist详解
警告
你現在所觀看的,將是一個沉悶無比的網頁,裡面沒有甚麼精美漂亮的圖片,有的絕大部份都是文字;但如果你是一個想學習使用AutoLISP程式設計的人,則本網頁將是你不容錯過的.
如果你是個初學者,則強烈建議你到課程教室去;在這裡你將可以由淺至深,學習如何使用AuotLISP作程式設計,並附有練習.
若你需要一些實用的程式作為參考,則可到程式下載去,這裡有多個實用性甚高的程式可供下載;只要略作修改,即可附合不同情況的需要.
如果你巳對AutoLISP相當熟識,又想學習如何建立及使用對話框,則可到對話方框去,在這裡你可以學習使用DCL語言,並配合AutoLISP程式來開發對話框.
第一课
基本知識
AutoLISP是一種針對擴充及自訂AutoCAD函數機能而產生,以LISP為基礎的程式設計語言.LISP本身於50年代末期出現,是一種擅於處理串列文字(ListofProcessing),屬第四代「人工智能(ArtificialIntelligence)」的電腦語言.
目的是令使用者充份利用AutoCAD進行開發,直接增加及修改AutoCAD指令.
AutoLisp語言建基於普通的LISP語言上,並擴充了許多適用於CAD的特殊功能而形成.
是一種能以直譯方式(不須先行編譯)亦可於AutoCAD內部執行的直譯性程序語言.
程式容易學習及撰寫,程式即使出錯亦不會對作業系統(如DOS,WINDOWS)有不良影響.
數據及程式均統一以串列(List)結構表示.
可直接調用幾乎全部的AutoCAD命令.
既具備一般高級語言的基本結構和功能,亦有一般高級語言沒有的強大圖形處理能力.
內建於AutoCAD應用程式,不須另行購買;亦不須使用特定的編輯器或開發環境.
可配合AutoCAD提供的PDB,建立DCL(DialogControlLanguage)文件創建對話方塊.
缺點:
執行速度較ObjectArx(舊稱ARX,以C或C++程式開發,取代以前的ADS)程式慢;原程式不易保護;對低階的硬體資料不易存取.
第二课
資料型態(DataType)
整數(INT)
沒有小數位的數值,32位元有號數,範圍從+2,147,483,647到-2,147,483,648
實數(REAL)
帶小數位的數值,以倍精度浮點格式儲存(最少14位小數)e.g.12.5
當數值在1與-1之間時,必須加上前導零e.g.0.05
可以科學記號表示:
在E或e後加上次方值e.g.4.1e-6
字串(STR)
一般文字,其前後必須加上雙引號"e.g."AutoCAD"
控制字元或脫逸碼必須為小寫,且須在字元前加上反斜線\e.g."\AutoCAD"
圖元名稱(ENAME)
是指定給圖檔內物件的指標(Pointer,為16進位的數字標籤)
e.g. 14e5180> 圖元名稱在圖檔內是唯一的,不會重複 物件的圖元名稱只在目前作業中有效,再開啟圖檔時,會指定新的圖元名稱予該物件 檔案(FILE) 以OPEN函數所開啟檔案的指標,作為其它函數(讀寫該檔案)的引數 續下一課.... 第三课 續上一課.... 資料型態(DataType) 選集(PICKSET) 用SSGET等函數建立的一個或多個物件的集合或群組 轉化(VARIANT) 可將圖元名稱轉換為可與ActiveX配搭使用的VLA-Object物件 符號(SYM) 用以儲存靜態資料的名稱;例如內建或使用者定義的函數 符號名稱不分大小寫,可由任意長度的可列印字元組成;但下列的字元除外: 左括號(右括號)句點.單引號'雙引號"分號; 表(LIST) 亦稱為串列,是放在一對小括號()內,一個或多個元素的有序集合 e.g.(1.0"Lisp"()(5.67)) 元素可以是字串,符號,整數或實數;也可以是另一個表 元素與元素之間要用空格隔開,但元素與小括號之間則可以不隔空格 為便於存取表內各元素,每個元素均有其序號;從表的左邊開始,第一個元素序號為0,依此類推 表的大小即為其頂層元素的數量(內層嵌套式的表,視為單一元素) 點對(DottedPair)亦是表的一種;表內有2個元素,中間以一圓點分隔,且元素與圓點之間亦須以空格分開 若表內沒有任何元素,稱為空串列或空表;以()或(NIL)表示 第四课 變數(Variable) 為程式執行中動態儲存資料的符號名稱;主要分為2類: 區域(Local)變數又稱為局部變數;該變數只在該程式段落中有效,不能為其它程式使用 全域(Global)變數又稱為整體變數;變數在所有程式段落中均可使用 變數名稱與符號的限制相同,使用時宜採用有意義及易於辨別的名稱 變數在賦值或使用前無須先行設定 相同的變數可以儲存不同型態的資料(但同一時間內只可儲存一種型態) 在指定新的資料之前,變數儲存的內容會保持不變 賦值 將資料給予指定的變數儲存 以內建函數SETQ進行(可用於繪圖模式的指令行或AutoLISP程式),其語法如下: (SETQ變數名稱1資料1[變數名稱2資料2....]) e.g.(SETQNAME"David"AGE37WEIGHT72.5POINT(LIST1020)) 在函數名稱之後,各參數以兩個一組,每組左邊為變數名稱,右邊為存入變數的資料 亦可將變數名稱賦以空值(NIL): e.g.(SETQOCCUPATIONNIL) 要顯示變數所儲存的資料,可以使用內建函數PRINC(可用於繪圖模式的指令行或AutoLISP程式),其語法如下: (PRINC變數名稱) e.g.COMMAND: (PRINCNAME)Result: David"David" 在繪圖模式中,亦可於指令行中使用感嘆號! 來顯示變數內容,或作為指令選項的輸入值;語法如下: ! 變數名稱 e.g.COMMAND: ! NAMEResult: "David" 在VisualLISP的主控台視窗中,於提示符號_$後鍵入要顯示的變數名稱 _$變數名稱 e.g._$NAME 要檢查變數所儲存的資料型態,可使用內建函數TYPE;語法如下: (TYPE變數名稱) e.g.COMMAND: (TYPENAME)Result: STR 若檢查的變數沒有儲存資料,則會傳回NIL 第五课 練習(Exercises) 將四個座標分別存入四個變數中,並以LINE或PLINE指令,配合四個座標變數,畫出正四邊形. COMMAND: (SETQPOINT1(LIST00)POINT2(LIST010)POINT3(LIST1010)POINT4(LIST100))COMMAND: LINE;直線段指令 COMMAND: ! POINT1;第一點(左下角起點) COMMAND: ! POINT2;第二點(左上角) COMMAND: ! POINT3;第三點(右上角) COMMAND: ! POINT4;第四點(右下角) COMMAND: C;自動連線至起點以關閉四邊形 畫圓: 將圓心座標及半徑長度分別存入兩個變數中(變數名稱及資料型態自訂) COMMAND: (SETQCEN(LIST00)RAD20);將圓心點設為座標0,0;半徑為20 COMMAND: CIRCLE;執行劃圓指令 Specifycenter....: ! CEN;在提示後以變數CEN回應輸入 Specifyradius....: ! RAD;在提示後以變數RAD回應輸入 將不同型態的資料,分多次存入相同的變數內;每次均以PRINC及TYPE函數顯示變數內容及其資料型態 COMMAND: (SETQTEMP1.2);將實數1.2存入變數TEMP COMMAND: ! TEMPResult: 1.2 COMMAND: (TYPETEMP)Result: REAL COMMAND: (SETQTEMP"AutoLISP");將字串存入變數TEMP COMMAND: ! TEMPResult: "AutoLISP" COMMAND: (TYPETEMP)Result: STR 第六课 基本運算 加函數 (+[數值參數1數值參數2....]) e.g.(+2.546)Result: 12.5 函數的結果為各參數之總和 若僅提供一個參數,則以0加上此參數的結果為返回值 若沒有提供任何參數則傳回0;各參數須為整數或實數型態 若所有參數均為整數,結果亦為整數;若其中一個參數為實數型態,結果會轉換為實數 減函數 (-[數值參數1數值參數2....]) e.g.(-1023)Result: 5 結果為第一個(最左邊)參數減去其右邊各參數的總和 若只提供一個參數,返回值為0減去該參數的結果 若沒有提供任何參數則傳回0;各參數須為整數或實數型態 若所有參數均為整數,結果亦為整數;若其中一個參數為實數型態,結果會轉換為實數 乘函數 (*[數值參數1數值參數2....]) e.g.(*234)Result: 24 結果為所有參數的乘積 若只提供一個參數,則返回值為該參數乘以1的結果 若沒有提供任何參數則傳回0;各參數須為整數或實數型態 若所有參數均為整數,結果亦為整數;若其中一個參數為實數型態,結果會轉換為實數 除函數 (/[數值參數1數值參數2....]) e.g.(/2423)Result: 4 結果為第一個(最左邊)參數除以其右邊各參數的乘積 若僅提供一個參數,則返回值為該參數除以1的結果 若沒有提供任何參數則傳回0;各參數須為整數或實數型態 若所有參數均為整數,結果亦為整數;若其中一個參數為實數型態,結果會轉換為實數 注意: 在本篇教程中,各函數的數值參數,均可以變數(儲存值只可以是整數或實數,且不可以是空值nil)取代. 第七课 練習(Exercises) 計算式(2+4)*3 COMMAND: (*3(+24))Result: 18 計算式(50-8*5)/4 COMMAND: (/(-50(*85))4)Result: 2 注意: 上式的正確答案應是2.5,因為函數中的各參數均為整數,所以傳回的結果亦為整數 遞增及遞減 遞增 (1+數值參數) e.g.(1+2)Result: 3 遞減 (1-數值參數) e.g.(1-4)Result: 3 三角函數(TrinagularFunction) 正弦值 (SIN弧度參數) e.g.(SIN1)Result: 0.841471 餘弦值 (COS弧度參數) e.g.(COS1)Result: 0.540302 反正切值 (ATAN弧度參數) e.g.(ATAN1)Result: 0.785398 第八课 其它數值處理 次方值 (EXPT數值參數次方值) e.g.(EXPT24)Result: 16 若參數及次方值兩個均為整數,返回值亦是整數;若其中一個為實數,結果為實數 開方根 (SQRT數值參數) e.g.(SQRT30)Result: 5.47723 絕對值 (ABS數值參數) e.g.(ABS-123)Result: 123 餘數 (REM[數值參數1數值參數2....]) e.g.(REM50265)=(REM(REM5026)5)Result: 4 將參數1整除參數2的餘數 若參數多於2個時,則會將餘數再整除下一個參數,再得出餘數;依此類推 若其中一個參數為實數時,則結果為實數;否則為整數 最大公約數 (GCD數值參數1數值參數2) e.g.(GCD8157)Result: 3 兩個參數均必須為整數值型態 自然對數 (LOG數值參數) e.g.(LOG3.5)Result: 1.25276 是EXP函數的反函數;傳回值為實數型態 自然反對數 (EXP數值參數) e.g.(EXP1.25276)Result: 3.49999 是LOG函數的反函數;傳回值為實數型態 第九课 數值資料轉型 實數轉整數 (FIX數值參數) e.g.(FIX12.56)Result: 12 只會截去小數部份(小數位不會4捨5入) 整數轉實數 (FLOAT數值參數) e.g.(FLOAT12)Result: 12.0 整數轉字串 (ITOA數值參數) e.g.(ITOA-17)Result: "-17" 數值轉字串 (RTOS數值參數[模式[小數位]]) e.g.(RTOS17.2333323)Result: 12.266 若不設定模式,則依係統變數LUNITS的設定值轉換數值為字串 若不設定小數位,則依係統變數LUPREC的設定值轉換 模式設定值可以是下列數值之一: 1=科學記號 2=十進位 3=英呎及十進位英吋 4=英呎及分數位英吋 5=分數 當選用的模式為3,4或5,則傳回的字串受係統變數UNITMODE影響 弳度轉字串 (ANGTOS角度參數[模式[小數位]]) e.g.(ANGTOS0.7853980)Result: "45" e.g.(ANGTOS0.7853984)Result: "N45dE" 若不設定模式,則依係統變數AUNITS的設定值轉換數值為字串 若不設定小數位,則依係統變數AUPREC的設定值轉換 模式設定值可以是下列數值之一: 0=度 1=度/分/秒 2=分度量 3=弳度 4=土地測量單位 當選用的模式為4,則傳回的字串受係統變數UNITMODE影響 反函數為ANGTOF;參閱第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.(MINUSP0)Result: nil e.g.(MINUSP3.45)Result: nil 零值 (ZEROP數值參數) e.g.(ZEROP0)Result: T e.g.(ZEROP3.45)Result: nil 其它應用 最大值 (MAX[數值參數1數值參數2....]) e.g.(MAX-8852)Result: 5 若沒有提供任何參數,則傳回值為0 最小值 (MIN[數值參數1數值參數2....]) e.g.(MIN-8852)Result: -88 若沒有提供任何參數,則傳回值為0 第十一课 練習(Exercises) 計算下列算式: (+12345678901234567890)Result: -1825831516 上式中兩個數值參數均為整數,而結果值大於整數型態所能容許之範圍;固導致發生溢位問題,產生無效的結果.修正算式如下: 只要將其中一個參數改為實數型態即可. (+1234567890.01234567890)Result: 2.46914e+009 計算下列算式: (+98765432101234567890)Result: 1.11111e+010 上式中兩個數值參數均為整數,但其中一個(第一個)參數巳大於整數型態所能容許之範圍;系統會自動將此參數先行轉為實數型態才計算. 計算下列算式: (FIX(SQRT(+1(MAX20104030))))Result: 6 ----最先執行的是最內層的算式(MAX20104030),求出最大值為40 ----其次執行加函數,將MAX函數所得的最大值加1,結果為41 ----再利函數SQRT,將41開方根,結果為6.4031 ----最後使用FIX函數,截去其小數位,得到最後的結果為6 第十二课 使用者定義函數 是將一群表示式組合成一個函數或指令 可應用於繪圖模式的指令行提示,VisualLISP主控台,或供其它自定義函數內的表示式呼叫使用 AutoLISP原始程式碼均以純文字格式存檔,副檔名為LSP(2000版可編譯成副檔名為FAS的檔案 可以一般文字編輯器進行開發,如DOS的EDIT,WINDOWS的WORD或WORDPAD等 一個自定函數內最少要有一個表達式 在原程式檔(LSP)裡,自定義函數以DEFUN函數開始;其語法如下: (DEFUN[C: ]函數名稱([引數串列...][/局部變數串列...])表達式...) 在呼叫帶有引數的自定函數時,必須同時提供與定義函數時,同等數量的參數,使各參數傳入自定函數的各引數中 引數被視為一種特殊類型的局部變數,無法用於該自定函數以外的其它函數 若自定函數中無須設定任何引數,亦必須以空串列()加在函數名稱之後 若有提供局部變數,必須以斜線/加在局部變數的開頭(即使前面沒有引數串列) 各引數,斜線,局部變數之間要以空格分隔;但與左右小括號之間則不須以空格分開 若引數串列中有相同名稱的引數出現,則會忽略第一個以後的相同引數;變數亦是一樣 若在函數名稱前加上C: 表示該函數可以在繪圖模式的指令行提示下,其執行方式與內建函數相同;亦可以在任何內建命令(執行中)的提示後,以通透方式執行(但須將函數名稱包在一對小括號中) 若在函數名稱前沒有加上C: 在指令行提示下,必須將函數名稱包在一對小括號中才可執行 不可以在執行一自定函數時,以通透方式執行另一自定函數 第十三课 載入程式 自定函數在使用前,都要將其所在的程式檔(副檔名為LSP)載入才可執行 ACAD.LSP程式檔(預設在SUPPORT子目錄內)會在啟動AutoCAD時自動載入 (LOAD"程式檔名稱"[載入失敗]) e.g.(LOAD"TEST") 若程式檔之檔名為LSP,則在程式檔名稱之後,可以不加上副檔名 若有需要,系統會順序嚐試其它的副檔名: VLXFASLSP 若程式檔不在系統的支援目錄下,則需在檔名前加上目錄路徑 注意: 必須以正斜線/或兩個反斜線\\作為目錄的分隔符號 可以在載入失敗的參數中提供字串,以供載入失敗時顯示;亦可提供有效的自定函數,該函數在載入程式檔失敗時會被執行 e.g.(LOAD"TEST""LoadFail")或(LOAD"TEST"(DOERROR)) 注意: 在程式檔載入後,在提示行顯示的返回值,一般是該程式檔中,最後被定義的函數名稱 或是在程式檔內沒有包含在自定函數中,最後一個表達式的執行結果 第十四课 練習(Exercises) 啟動文字編輯器,編寫一AutoLISP程式作兩個同心圓(第1個圓半徑為50,第2個圓半徑為80),程式碼如下所示: (DEFUNC: 2CIRCLE()(SETQCEN(LIST00)RAD50) (COMMANDCIRCLECENRAD) (COMMANDCIRCLECEN(+RAD30))) ----輸入後以純文字格式存檔(C: \TEST.LSP) ----在AutoCAD繪圖模式的指令行提示後,用LOAD函數將程式檔載入 COMMAND: (LOAD"C: /TEST") ----在指令行提示後,輸入程式(函數)名稱執行 COMMAND: 2CIRCLE 程式說明 1使用DEFUN建立自定函數的名稱,並用SETQ函數將中心點(LIST00)存入變數CEN,半徑(50)存入變數RAD中 2使用COMMAND函數執行AutoCAD內建指令CIRCLE,並以變數CEN(圓的中心點)及變數RAD(圓的半徑)回應 3與第2行大致相同,但在指定其半徑時,先將儲存半徑的變數加30,使劃出半徑為80的圓;注意最右邊的關括號,與第1行DEFUN左邊的開括號是一對的 啟動文字編輯器,開啟TEST.LSP程式檔,複製2CIRCLE至新程式2C,並改為傳入引數方式執行;程式碼如下: (DEFUN2C(CENRAD)(COMMANDCIRCLECENRAD) (COMMANDCIRCLECEN(+RAD30))) ----輸入後以純文字格式存檔 ----在AutoCAD繪圖模式的指令行提示後,用LOAD函數將程式檔重新載入 ----在指令行提示後,輸入程式(函數)名稱執行 COMMAND: (2C(LIST00)50) 第十五课 註解 單行註解分號; 表示在分號右邊(同一行)的字元均為註解,程式執行時會將其忽略 多行註解;||; 表示在兩個註解符號中間所有字元皆為註解,即使字元跨越多行 關係運算 在各個關係運算中,都會傳回一邏輯值;若關係成立,傳回T,否則會傳回nil 各參數可以是字串,整數或實數型態;若以字串進行比較,則會以字串的ASCII碼為準 若函數中只有一個參數,傳回值恆為T 等於函數 (=參數1[參數2....]) 會將參數1與其後各個參數比較,若全部相等則傳回T,否則傳回nile.g.(=22.0)Result: T e.g.(="A"CHR(65))Result: T 不等於函數 (/=參數1[參數2....]) 若參數1不等於其後任何一個參數,即傳回Te.g.(/=12.0)Result: T e.g.(/="a"CHR(65))Result: T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- autolist 详解