AutoLISP入門教學.JPG (45140 bytes)


單元八:新手上路-參數設計的關鍵技巧

一、參數設計的重要性:

您可知 參數化的設計可大大的提身原有的繪圖效率,將原本繁瑣的過程化身成程式自動化產生

沒 錯 參數化可以讓效率提昇至少十倍以上,讓複雜圖形在瞬間完成,有如變魔術一般的神奇,AutoCAD新手也能在用你的程式操作下,畫出有模有樣的圖形來

但 是 AutoLISP參數設計要做的好,除了搭配下冊的DCL交談框為程式漂亮門面外,仍得具備幾項關鍵技巧與常識,才能遊刃有餘的設計各種不同的參數模組圖形?

別 急 深呼吸,放鬆心情,保持最清楚的思緒!!!

請注意 書後有相當多的精選範例,參考並熟讀之,您一定能掌握其中的精髓!!

 

二、重要關鍵-熟知三角函數關係

LisP8-1.gif (2444 bytes)

  1. 任意三角形內角和等於180
  2. 直角三角形另二角和等於90
  3. 正三角形的3內角街等於 60
  4. 等腰三角形必有二個相同的內角
  5. 三角形外角等於二個遠內角和

三角函數

表示式

重要等級

AutoLISP支援

Sinθ

A / C

熟記

Yes

Cosθ

B / C

熟記

Yes

Tanθ

A / B

熟記

NO

Cotθ

B / A

NO

Secθ

C/B

NO

Cscθ

C/A

NO

LisP8-4.gif (3642 bytes)

 

訣竅一:對邊關係->對邊三角函數相乘等於1 (互為倒數)

Sinθ*Cscθ=1

Cosθ*Secθ=1

Tanθ*Cotθ=1

訣竅二:鄰邊關係->二邊函數相乘等於中間函數

Sinθ= Tanθ*Cosθ

Tanθ= Sinθ*Secθ= Sinθ*1/Cosθ=Sinθ/Cosθ

訣竅三:平方關係->斜線區三角形,上二頂點平方和等於下頂點平方

Sinθ平方+Cosθ平方=1 à Sinθ^2+Cosθ^2=1

Tanθ平方+1= Secθ平方 à Tanθ^2+1= Secθ^2

1+Cotθ平方= Cscθ平方 à 1+ Cotθ^2= Cscθ^2

訣竅四:反三角函數關係

三角函數

表示式

反求角度

反三角函數

重要等級

AutoLISP支援

Sinθ

A / C

θ

ASIN(A/C)

NO

Cosθ

B / C

θ

ASIN(B/C)

NO

Tanθ

A / B

θ

ASIN(A/B)

熟記

Yes

Cotθ

B / A

θ

ASIN(B/A)

NO

Secθ

C/B

θ

ASIN(C/B)

NO

Cscθ

C/A

θ

ASIN(C/A)

NO

 

三、AutoLISP三角函數&轉換相關函數

  1. (sin 徑度角)            傳回:該徑度角的SIN正弦數值
  2. (cos 徑度角)            傳回:該徑度角的COS餘弦數值
  3. (atan 數值1 [數值2]) 傳回:該數值的反正切徑度值
  4. (sqrt 數值)                     傳回:該數值的開平方根
  5. (abs 數值)                     傳回:該數值的絕對正值
  6. (strcat 字串 字串… ) 傳回:字串結合
  7. (rtos 數值 [精確度] ) 傳回:實數轉換字串&控制小數點精確度
  8. (angle 1 2)            傳回:點1至點2的徑度值
  9. (angtof 字串 <模式> )   傳回:將十進位度字串轉為徑度數值
  10. (angtos 徑度數值 <模式> <精確度> ) 傳回:將徑度數值依模式&精確度轉為數值字串
  11.  

四、精選三角函數應用技巧範例一:

預期目標:如圖,希望能在輸入左下角點後,只給直角三角形的底邊&斜邊長後,自動繪出該直角三角形

LisP8-3.gif (2723 bytes)

 

步驟一:定出程式名稱為 5test1.lsp

步驟二:構思程式流程、相關變數:

lisp8-5.gif (2769 bytes)

變數名稱設定為 papbpcwwkkhhang_pbang_pc

 

(defun c:5test1()

;以下 pawwkk 值須由使用者輸入

(setq pa (請求輸入左下角點))

(setq ww (請求輸入直角三角形底邊長度))

(setq kk (請求輸入直角三角形斜邊長度))

;以下pbpchh值須由程式依據pawwkk求出

(setq pb (依據相對極座標法求出右下角pb點座標))

(setq hh (依據ww&kk,以畢氏定理求出hh))

(setq pc (依據相對極座標法求出左上角pc點座標值))

;以下依據 papbpc 點畫出直角三角形

(hh 的結果回應在指令區)

(畫出直角三角形)

;以下將三角形二夾角自動求出,並顯示在指令區

(setq ang_pb (依據反正切求pb夾角弳度值))

(setq ang_pb (ang_pb改推算成十進位角度值))

(setq ang_pc (依據90度減去ang_pb求得ang_pc夾角))

(PB的夾角回應在指令區)

(PC的夾角回應在指令區)

(prin1)

)

步驟三:撰寫 5test1.lsp 並儲存到 C:\LISPTOOL資料夾內

(defun c:5test1()

;以下 pawwkk 值須由使用者輸入

(setq pa (getpoint “請輸入直角三角形左下角點:))

(setq ww (getreal \n請輸入直角三角形底邊長度:))

(setq kk (getreal \n請輸入直角三角形斜邊長度:))

;以下pbpchh值須由程式依據pawwkk求出

(setq pb (polar pa 0 ww))

(setq hh (sqrt (- (* kk kk) (* ww ww))))

(setq pc (polar pa (/ pi 2) hh))

;以下依據 papbpc 點畫出直角三角形

(princ "\n另一邊hh的長度=")(princ hh)

(command linepa pb pc c) ;;;PLINE也可以

;以下將三角形二夾角自動求出,並顯示在指令區

(setq ang_pb (atan (/ hh ww)))

(setq ang_pb (* ang_pb (/ 180 pi)))

(setq ang_pc (- 90 ang_pb))

(princ "\nPB的夾角=")(princ ang_pb)(princ "")

(princ "\nPC的夾角=")(princ ang_pc)(princ "")

(prin1)

)

(prompt \n << 5TEST1>>自動直角三角形繪製”)

(prin1)

 

步驟四:執行程式 5test1.lsp

指令: (load "5test1") <--載入程式

<< 5TEST1>> 自動直角三角形繪製   <-- 傳回之訊息

指令:5test1

請輸入直角三角形左下角點: <-- 請給一左下角點

請輸入直角三角形底邊長度: <--請給一實數 80

請輸入直角三角形斜邊長度: <--請給一實數 95

<除自動畫出該直角三角形外,又傳回以下三項訊息>

另一邊hh的長度=51.2348

PB的夾角=32.6369

PC的夾角=57.3631

執行結果:

lisp8-6.GIF (1463 bytes)

 

步驟四:程式改良&注意重點

重點1. AutoLISP ,並無 ASIN 反正弦& ACOS反餘弦函數,所以無法透過 kk & ww 求出 ang_pb 反正弦角也無法透過 kk & hh 求出 ang_pc 反餘弦角

重點2. (setq ang_pb (atan (/ hh ww))) 可改寫成 (setq ang_pb (atan hh ww)) 結果一樣

重點3.    (princ "\nPB的夾角=")(princ ang_pb)(princ "")

(princ "\nPC的夾角=")(princ ang_pc)(princ "")

可用 strcat 函數結合成同一字串,改寫如下

(princ (strcat "\nPB的夾角=" (rtos ang_pb) “度”))

(princ (strcat "\nPC的夾角=" (rtos ang_pc) “度”))

但需特別留意,strcat 只接受字串格式的結合而 princ 卻可回應任意型態的變數

 

五、精選三角函數應用技巧範例二:

預期目標:如圖,希望能自動畫出多個等半徑圓相切,執行順序如下:

  • 輸入基準點 baspt
  • 輸入小圓半徑 rad
  • 輸入欲相切的等圓數量 num
  • 自動繪出多個等半徑圓相切

lisp8-7.gif (3214 bytes)

步驟一:定出程式名稱為 5test2.lsp

步驟二:構思程式流程、相關變數:

lisp8-8.gif (5826 bytes)

變數名稱設定為 basptradnummidptcenptkkang1ang2

 

(defun c:5test2()

;以下 basptradnum 值須由使用者輸入

(setq baspt (請求輸入基準點))

(setq rad (請求輸入小圓半徑))

(setq num (請求輸入欲相切的小圓數量))

;只要能求得 cenpt ,再以 array 指令配合就萬事OK

;以下ang1kkcenpt值須由程式依據basptradnum求出

(setq ang1 (依據全圓周除以num等分,再除以2求得))

(setq kk (依據rad & sin<ang1>相除求得該值))

(setq ang2 (依據 pi/2 減去 ang1求得))

(setq cenpt (依據相對極座標法ang2 & kk求出座標值))

;以下依據 cenptnum 配合環形array畫出多圓相切

(自動畫出多圓相切)

(prin1)

)

 

步驟三:撰寫 5test2.lsp 並儲存到 C:\LISPTOOL資料夾內

(defun c:5test2()

;以下 basptradnum 值須由使用者輸入

(setq baspt (getpoint “請求輸入基準點:))

(setq rad (getdist baspt \n請求輸入小圓半徑:))

(setq num (getint \n請求輸入欲相切的小圓數量:))

;只要能求得 cenpt ,再以 array 指令配合就萬事OK

;以下ang1kkcenpt值須由程式依據basptradnum求出

(setq ang1 (/ (* pi 2) (* num 2)))

(setq kk (/ rad (sin ang1)))

(setq ang2 (- (/ pi 2) ang1))

(setq cenpt (polar baspt ang2 kk))

;以下依據 cenptnum 配合環形array畫出多圓相切

(command circlebaspt rad) ;;先畫一個圓,才能array

(command array(entlast) “” “pcenpt num 360 Y)

(prin1)

)

(prompt \n << 5TEST2>>自動等圓相切繪製)

(prin1)

 

步驟四:執行程式 5test2.lsp

指令:(load "5test2") <-- 載入程式

<< 5TEST2>> 自動等圓相切繪製  <-- 傳回之訊息

指令:5test2

請求輸入基準點: <-- 請給小圓基準點

請求輸入小圓半徑: <-- 請給一實數 30

請求輸入欲相切的小圓數量<-- 請給一整數 8

執行結果:

lisp8-9.gif (2565 bytes)

 

步驟五:程式改良&注意重點

重點1. (setq ang1 (/ (* pi 2) (* num 2)))亦可直接寫為 (setq ang1 (/ pi num))

重點2. (setq kk (/ rad (sin ang1))) 來由推算方式如下

因為 Sin(ang1) = 對邊 / 斜邊 = rad / kk

所以 kk = rad / Sin(ang1)

改成LISP表示式->(setq kk (/ rad (sin ang1)))

重點3. 因為 ang1 + ang2 = pi / 2 來由推算

所以 (setq ang2 (- (/ pi 2) ang1))

(setq ang2 (- (* pi 0.5) ang1))

重點4. 因為rad的取得,乃以getdist方式所以在問半徑時,亦可由螢幕中給一段距離當半徑

重點5. Array 指令後的七個運算子引數必須配合正常執行之順序給與,是相當嚴謹而不是亂湊的!!!

指令: ARRAY

選取物件: (entlast) 找到 1 <-前一個動作,剛畫的小圓

選取物件: <-[Enter] 結束選取

矩形陣列(R)/環形陣列(P) <P>: P <-環形陣列選項

基準(B)/<指定陣列的中心點>:<-給陣列的中心基準點

5.項目個數:                       <-給一整數

6.要佈滿的角度 (+=逆時鐘, -=順時鐘) <360>:

                                            <-內定360

7.複製時旋轉物件? <Y>   <-是否旋轉,內定Yes

所以才有以 command 函數呼叫 AutoCAD 指令產生

(command  "array" (entlast)   "" "p" cenpt num 360 "Y")

或改寫成

(command  "array" "L" "" "p" cenpt num "" "")

  • 指令一定要加雙引號,"array"
  • 複選項一定要加雙引號,"L""P""Y"
  • 用內定值,務必要加上連續二個雙引號,""
  • (entlast) AutoLISP標準函數,可抓取圖面中最後完成的體元是很好用的技巧,請多加注意

七、本章結語:

AutoLISP作參數設計是相當重要的入門課題,讓原本辛辛苦苦畫半天的圖,經由您的AutoLISP妙手,短短幾十行LISP程式,竟在瞬間完成,那種喜悅與成就感相當令人感動的,當然對提昇設計及繪圖效率更是顯而卓著的至於離記憶中很久久以前的三角函數,您當然得再重新呼喚回來,相信經過本章的訣竅分析,您將不再害怕面對三角函數了,甚至將因三角函數在您程式中的發威,而使您開始喜歡三角函數了,果真如此,相信爾後其他再多再複雜的參數設計圖形也難不倒您了,筆者在此先恭喜您參數設計若要有專業的水準,務必要配合DCL交談框設計,有一個漂亮且容易輸入各種資料的交談界面,此部份請參考【AutoLISP& DCL精華寶典下冊】中有詳細的技巧解說希望您在進入下一章之前,務必務必把第六單元的二題舉一反三作完確定完全沒問題後再向下一關挑戰,否則基礎沒打穩,眼高手低,或光看不練,那到時您的AutoLISP功力一定是花拳繡腿,不堪一擊!!!