一、參數設計的重要性:單元八:新手上路-參數設計的關鍵技巧
二、重要關鍵-熟知三角函數關係您可知 參數化的設計可大大的提身原有的繪圖效率,將原本繁瑣的過程化身成程式自動化產生
沒 錯 參數化可以讓效率提昇至少十倍以上,讓複雜圖形在瞬間完成,有如變魔術一般的神奇,讓AutoCAD新手也能在用你的程式操作下,畫出有模有樣的圖形來
但 是 AutoLISP參數設計要做的好,除了搭配下冊的DCL交談框為程式漂亮門面外,仍得具備幾項關鍵技巧與常識,才能遊刃有餘的設計各種不同的參數模組圖形?
別 急 深呼吸,放鬆心情,保持最清楚的思緒!!!
請注意 書後有相當多的精選範例,參考並熟讀之,您一定能掌握其中的精髓!!
- 熟記畢氏定理-直角三角形二股平方和等於寫邊平方 A*A+B*B=C*C
- 熟記三角形內外角關係
任意三角形內角和等於180度
直角三角形另二角和等於90度 正三角形的3內角街等於 60 度 等腰三角形必有二個相同的內角 三角形外角等於二個遠內角和
- 熟記基本三角函數:
![]()
三角函數
表示式
重要等級
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
- 熟記三角函數之間的訣竅:
訣竅一:對邊關係->對邊三角函數相乘等於1 (互為倒數)Sinθ*Cscθ=1Cos
θ*Secθ=1
Tanθ*Cotθ=1
訣竅二:鄰邊關係->二邊函數相乘等於中間函數
Sinθ= Tanθ*Cosθ Tanθ= Sinθ*Secθ= Sinθ*1/Cosθ=Sinθ/Cosθ訣竅三:平方關係->斜線區三角形,上二頂點平方和等於下頂點平方
Sinθ平方+Cosθ平方=1 à Sinθ^2+Cosθ^2=1Tan
θ平方+1= Secθ平方 à Tanθ^2+1= Secθ^21+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三角函數&轉換相關函數
四、精選三角函數應用技巧範例一:
- (sin 徑度角) 傳回:該徑度角的SIN正弦數值
- (cos 徑度角) 傳回:該徑度角的COS餘弦數值
- (atan 數值1 [數值2]) 傳回:該數值的反正切徑度值
- (sqrt 數值) 傳回:該數值的開平方根
- (abs 數值) 傳回:該數值的絕對正值
- (strcat 字串 字串… ) 傳回:字串結合
- (rtos 數值 [精確度] ) 傳回:實數轉換字串&控制小數點精確度
- (angle 點1 點2) 傳回:點1至點2的徑度值
- (angtof 字串 <模式> ) 傳回:將十進位度字串轉為徑度數值
- (angtos 徑度數值 <模式> <精確度> ) 傳回:將徑度數值依模式&精確度轉為數值字串
預期目標:如圖,希望能在輸入左下角點後,只給直角三角形的底邊&斜邊長後,自動繪出該直角三角形![]()
步驟一:定出程式名稱為 5test1.lsp 步驟二:構思程式流程、相關變數:
變數名稱設定為 pa、pb、pc、ww、kk、hh、ang_pb、ang_pc
(defun c:5test1());以下 pa、ww、kk 值須由使用者輸入
(setq pa (請求輸入左下角點))
(setq ww (請求輸入直角三角形底邊長度))
(setq kk (請求輸入直角三角形斜邊長度))
;以下pb、pc、hh值須由程式依據pa、ww、kk求出
(setq pb (依據相對極座標法求出右下角pb點座標))
(setq hh (依據ww&kk值,以畢氏定理求出hh值))
(setq pc (依據相對極座標法求出左上角pc點座標值))
;以下依據 pa、pb、pc 點畫出直角三角形
(將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();以下 pa、ww、kk 值須由使用者輸入
(setq pa (getpoint “請輸入直角三角形左下角點:”))
(setq ww (getreal ”\n請輸入直角三角形底邊長度:”))
(setq kk (getreal ”\n請輸入直角三角形斜邊長度:”))
;以下pb、pc、hh值須由程式依據pa、ww、kk求出
(setq pb (polar pa 0 ww))
(setq hh (sqrt (- (* kk kk) (* ww ww))))
(setq pc (polar pa (/ pi 2) hh))
;以下依據 pa、pb、pc 點畫出直角三角形
(princ "\n另一邊hh的長度=")(princ hh)
(command “line” pa 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度
執行結果:
步驟四:程式改良&注意重點五、精選三角函數應用技巧範例二:重點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
- 自動繪出多個等半徑圓相切
步驟一:定出程式名稱為 5test2.lsp
步驟二:構思程式流程、相關變數:
變數名稱設定為 baspt、rad、num、midpt、cenpt、kk、ang1、ang2
(defun c:5test2()
;以下 baspt、rad、num 值須由使用者輸入
(setq baspt (請求輸入基準點))
(setq rad (請求輸入小圓半徑))
(setq num (請求輸入欲相切的小圓數量))
;只要能求得 cenpt 點,再以 array 指令配合就萬事OK了
;以下ang1、kk、cenpt值須由程式依據baspt、rad、num求出
(setq ang1 (依據全圓周除以num等分,再除以2求得))
(setq kk (依據rad & sin<ang1>相除求得該值))
(setq ang2 (依據 pi/2 減去 ang1求得))
(setq cenpt (依據相對極座標法ang2 & kk求出座標值))
;以下依據 cenpt、num 配合環形array畫出多圓相切
(自動畫出多圓相切)
(prin1)
)
步驟三:撰寫 5test2.lsp 並儲存到 C:\LISPTOOL資料夾內
(defun c:5test2();以下 baspt、rad、num 值須由使用者輸入
(setq baspt (getpoint “請求輸入基準點:”))
(setq rad (getdist baspt “\n請求輸入小圓半徑:”))
(setq num (getint “\n請求輸入欲相切的小圓數量:”))
;只要能求得 cenpt 點,再以 array 指令配合就萬事OK了
;以下ang1、kk、cenpt值須由程式依據baspt、rad、num求出
(setq ang1 (/ (* pi 2) (* num 2)))
(setq kk (/ rad (sin ang1)))
(setq ang2 (- (/ pi 2) ang1))
(setq cenpt (polar baspt ang2 kk))
;以下依據 cenpt、num 配合環形array畫出多圓相切
(command “circle” baspt rad) ;;先畫一個圓,才能array
(command “array” (entlast) “” “p” cenpt num 360 “Y”)
(prin1)
) (prompt “\n << 5TEST2>>自動等圓相切繪製”)(prin1)
步驟四:執行程式 5test2.lsp指令:(load "5test2") <-- 載入程式<< 5TEST2>> 自動等圓相切繪製 <-- 傳回之訊息
指令:5test2
請求輸入基準點: <-- 請給小圓基準點
請求輸入小圓半徑: <-- 請給一實數 30
請求輸入欲相切的小圓數量: <-- 請給一整數 8 個
執行結果:
步驟五:程式改良&注意重點重點1. (setq ang1 (/ (* pi 2) (* num 2)))亦可直接寫為 (setq ang1 (/ pi num)) 重點2. (setq kk (/ rad (sin ang1))) 來由推算方式如下重點3. 因為 ang1 + ang2 = pi / 2 來由推算因為 Sin(ang1) = 對邊 / 斜邊 = rad / kk
所以 kk = rad / Sin(ang1)
改成LISP表示式->(setq kk (/ rad (sin ang1)))
重點4. 因為rad的取得,乃以getdist方式所以在問半徑時,亦可由螢幕中給一段距離當半徑所以 (setq ang2 (- (/ pi 2) ang1))
或 (setq ang2 (- (* pi 0.5) ang1))
七、本章結語:重點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功力一定是花拳繡腿,不堪一擊!!!