[討論]AUTOLISP 練習題目
+3
shenhung
leoneriol
andychen
7 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
[討論]AUTOLISP 練習題目
如上圖,已知三角形的三個頂點座標,如下
65.10, 84.76
9.59, 35.69
95.29, 5.27
求各邊的長度和面積和三個角的度度量?
試試看吧!
andychen- 該用戶停權中
- 文章總數 : 186
年齡 : 40
經驗值 : 6032
威望值 : 71
注冊日期 : 2010-04-09
回復: [討論]AUTOLISP 練習題目
- 代碼:
(defun c:tmp()
(setq p1 (getpoint "\n請輸入第一點"))
(setq p2 (getpoint "\n請輸入第二點"))
(setq p3 (getpoint "\n請輸入第三點"))
(3pRequestAng p1 p2 p3)
(setq ang1(abs %ang))
(3pRequestAng p2 p1 p3)
(setq ang2(abs %ang))
(3pRequestAng p3 p1 p2)
(setq ang3(abs %ang))
(princ (strcat "\nANG1=" (rtos ang1) "\nANG2=" (rtos ang2) "\nANG3=" (rtos ang3)))
(prin1)
)
(defun 3pRequestAng(%p1 %p2 %p3)
(setq %a11 (/(*(angle %p1 %p2)180)pi)
%a12 (/(*(angle %p1 %p3)180)pi))
(setq %ang(- %a11 %a12))
(if (and(and(> %a12 180)(< %a11 180))(>(abs (- %a11 %a12))180)) (setq %ang(+(- 360 %a12)%a11)))
(if (and(and(> %a11 180)(< %a12 180))(>(abs (- %a11 %a12))180)) (setq %ang(+(- 360 %a11)%a12)))
)
夜深了....實在懶得再測試有沒有漏洞了Orz
PS:拜託請高手們指點一下副程式回傳的部分,
我本來希望主程式是寫成這樣 (setq ang1(abs (3pRequestAng p1 p2 p3)))
而不是像下面這樣兩行,而且還要記住變數是%ang
(3pRequestAng p1 p2 p3)
(setq ang1(abs %ang))
leoneriol 在 2010-05-26, 00:54 作了第 2 次修改 (原因 : 修改內容提問)
leoneriol- 榮譽顧問
- 文章總數 : 818
年齡 : 40
來自 : 基隆市七堵區
職業 : 機電工程公司-繪圖(工地)
愛好 : 看小說
個性 : 不愛說話-反應慢
使用年資 : 6年
使用版本 : 2008 & 2012
積分 : 27
經驗值 : 9199
威望值 : 960
發帖精華 : 1
回帖精華 : 1
注冊日期 : 2009-03-12
回復: [討論]AUTOLISP 練習題目
恭喜你 答案正確,但是
有改善的空間。
當然,程式設計,最容易引起爭議的地方,
就是 程式設計的風格的部份。
所以,接下來的一些討論,請你 一定要多多包涵。
有改善的空間。
當然,程式設計,最容易引起爭議的地方,
就是 程式設計的風格的部份。
所以,接下來的一些討論,請你 一定要多多包涵。
andychen- 該用戶停權中
- 文章總數 : 186
年齡 : 40
經驗值 : 6032
威望值 : 71
注冊日期 : 2010-04-09
回復: [討論]AUTOLISP 練習題目
以下,是一些副程式,函數的寫法。
歡迎參加討論。
歡迎參加討論。
- 代碼:
; file: test-0446.LSP
(defun dtor(d1 / )
(* (/ d1 180.0) pi)
); end of dtor()
; ---------------------------------------------------------
(defun rtod(r1 / )
(* (/ r1 pi) 180.0)
); end of rtod()
; ---------------------------------------------------------
(defun sqr(x / )
(* x x)
); end of sqr()
; ---------------------------------------------------------
; 這是主程式
(defun c:test-0448( / d1 r1 x y s r2 d2)
(setq d1 (getreal "\n 請輸入一個 度度量的 角度: "))
(setq r1 (dtor d1))
(setq x (cos r1))
(setq y (sin r1))
(setq s (sqrt (+ (sqr x) (sqr y))))
; tan(theta)= (y/x)
(setq r2 (atan (/ y x)))
(setq d2 (rtod r2))
(princ (strcat "\n x= " (rtos x 2 6) "\n"))
(princ (strcat " y= " (rtos y 2 6) "\n"))
(princ (strcat " s= " (rtos s 2 6) "\n"))
(princ (strcat "\n d2= " (rtos d2 2 6) "\n"))
(princ)
); end of c:test-0448()
(princ); 每一個檔案,副程式和函數的最後一行,
; 除非有特殊理由,否則 最好是 (princ)
; end of file
andychen- 該用戶停權中
- 文章總數 : 186
年齡 : 40
經驗值 : 6032
威望值 : 71
注冊日期 : 2010-04-09
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8074
威望值 : 1188
注冊日期 : 2009-06-03
回復: [討論]AUTOLISP 練習題目
感激不盡shenhung 寫到:副程式最後請加入.這一行.
(if %ang %ang)
就會回傳..ang的值..
leoneriol- 榮譽顧問
- 文章總數 : 818
年齡 : 40
來自 : 基隆市七堵區
職業 : 機電工程公司-繪圖(工地)
愛好 : 看小說
個性 : 不愛說話-反應慢
使用年資 : 6年
使用版本 : 2008 & 2012
積分 : 27
經驗值 : 9199
威望值 : 960
發帖精華 : 1
回帖精華 : 1
注冊日期 : 2009-03-12
改天,挊個例子證明一下
shenhung 寫到:副程式最後請加入.這一行.
(if %ang %ang)
就會回傳..ang的值..
正確的用法是
(eval %ang)
你使用 (if )
萬一,%ang == nil,
就會錯掉
andychen- 該用戶停權中
- 文章總數 : 186
年齡 : 40
經驗值 : 6032
威望值 : 71
注冊日期 : 2010-04-09
回復: [討論]AUTOLISP 練習題目
感覺有些錯愕andychen 寫到:以下,是一些副程式,函數的寫法。
歡迎參加討論。
- Spoiler(用來隱藏帖子內容):
- 代碼:
; file: test-0446.LSP
(defun dtor(d1 / )
(* (/ d1 180.0) pi)
); end of dtor()
; ---------------------------------------------------------
(defun rtod(r1 / )
(* (/ r1 pi) 180.0)
); end of rtod()
; ---------------------------------------------------------
(defun sqr(x / )
(* x x)
); end of sqr()
; ---------------------------------------------------------
; 這是主程式
(defun c:test-0448( / d1 r1 x y s r2 d2)
(setq d1 (getreal "\n 請輸入一個 度度量的 角度: "))
(setq r1 (dtor d1))
(setq x (cos r1))
(setq y (sin r1))
(setq s (sqrt (+ (sqr x) (sqr y))))
; tan(theta)= (y/x)
(setq r2 (atan (/ y x)))
(setq d2 (rtod r2))
(princ (strcat "\n x= " (rtos x 2 6) "\n"))
(princ (strcat " y= " (rtos y 2 6) "\n"))
(princ (strcat " s= " (rtos s 2 6) "\n"))
(princ (strcat "\n d2= " (rtos d2 2 6) "\n"))
(princ)
); end of c:test-0448()
(princ); 每一個檔案,副程式和函數的最後一行,
; 除非有特殊理由,否則 最好是 (princ)
; end of file
您定下的題目不是給三點求角度跟長度嗎??
怎麼您的程式是反過來寫的?
andychen 寫到:
(eval %ang)
瞭解了.....原來也可以這樣 感恩~
leoneriol 在 2010-05-26, 18:22 作了第 1 次修改 (原因 : 增加內容)
leoneriol- 榮譽顧問
- 文章總數 : 818
年齡 : 40
來自 : 基隆市七堵區
職業 : 機電工程公司-繪圖(工地)
愛好 : 看小說
個性 : 不愛說話-反應慢
使用年資 : 6年
使用版本 : 2008 & 2012
積分 : 27
經驗值 : 9199
威望值 : 960
發帖精華 : 1
回帖精華 : 1
注冊日期 : 2009-03-12
回復: [討論]AUTOLISP 練習題目
http://en.wikipedia.org/wiki/Top-down_and_bottom-up_design
請參考上面的 WIKI 百科,關於程式設計,
系統分析與設計的策略,
TOP DOWN
AND BOTTOM- UP
當我們在分析問題,或是設計一個系統的架構的時候,
通常都是採用 TOP- DOWN
不用管 底層的 副程式的 細節。
但是,當我們 真正的 要開始寫程式的時候,
通常會採用 BOTTOM- UP 的方式,
先把 每一個要用到的 副程式先寫好,分開測試妥當,
再來寫 比較上面的東西,最後再來寫 最上面的主程式。
(rtod r1) --> d1
(dtor d1) --> r1
是經常會用到的副程式,所以先討論
請參考上面的 WIKI 百科,關於程式設計,
系統分析與設計的策略,
TOP DOWN
AND BOTTOM- UP
當我們在分析問題,或是設計一個系統的架構的時候,
通常都是採用 TOP- DOWN
不用管 底層的 副程式的 細節。
但是,當我們 真正的 要開始寫程式的時候,
通常會採用 BOTTOM- UP 的方式,
先把 每一個要用到的 副程式先寫好,分開測試妥當,
再來寫 比較上面的東西,最後再來寫 最上面的主程式。
(rtod r1) --> d1
(dtor d1) --> r1
是經常會用到的副程式,所以先討論
andychen- 該用戶停權中
- 文章總數 : 186
年齡 : 40
經驗值 : 6032
威望值 : 71
注冊日期 : 2010-04-09
回復: [討論]AUTOLISP 練習題目
andychen 寫到:正確的用法是
(eval %ang)
你使用 (if )
萬一,%ang == nil,
就會錯掉
如果..%ang 的值都為nil.
(eval %ang) 和
(if %ang %ang)
都會回傳nil
用if並不會在%ang為nil的時後.產生錯誤.只是寫法上不一樣而已.
你怎麼會覺得教課書上的寫法.才是所謂正確的用法".!!
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8074
威望值 : 1188
注冊日期 : 2009-06-03
回復: [討論]AUTOLISP 練習題目
而因應不同的需求應該有很多方法,我想能想出來的辦法都是好方法,至於方法正不正確就其次了。
所以書上及實務是有些差距~
另外透過上面幾位前輩的討論,真的是很精采呢~
所以書上及實務是有些差距~
另外透過上面幾位前輩的討論,真的是很精采呢~
____________________________________________________________________________________
👉快速比例設定與出圖技巧-線上課程(點我)👈
回復: [討論]AUTOLISP 練習題目
除了 (eval %ang) 和 (if %ang %ang) 這兩種寫法之外還有第三種shenhung 寫到:
...
如果..%ang 的值都為nil.
(eval %ang) 和
(if %ang %ang)
都會回傳nil
...".!!
==> %ang , 此種寫法通常用在一個比較不需要很嚴謹的副程式傳回值,
其好處是簡單又明瞭.
當傳回值有多種可能的情況時, 才會用到if...或 cond...,
但如果真要用if, 個人建議把式子寫完整一點會比較好,
也就是 ==> (if (條件式) 傳回值1 傳回值2)
至於eval...則大都用在評估一個具有副程式性質的變數,
用在此處顯得有點畫蛇添足,
以上是個人淺見.
回復: [討論]AUTOLISP 練習題目
pizg 寫到:
==> %ang , 此種寫法通常用在一個比較不需要很嚴謹的副程式傳回值,
其好處是簡單又明瞭.
當傳回值有多種可能的情況時, 才會用到if...或 cond...,
但如果真要用if, 個人建議把式子寫完整一點會比較好,
也就是 ==> (if (條件式) 傳回值1 傳回值2)
至於eval...則大都用在評估一個具有副程式性質的變數,
用在此處顯得有點畫蛇添足,
以上是個人淺見.
1. %ang放在最後只是將表示式傳回主程式,的確是簡單又明瞭,但似乎與嚴不嚴謹無關
2. (if (比較式) 表示式1 表示式2) 此處用傳回值在使用觀念上有點落差
3. 看說明,eval的用法很單純,單純到不知道要用它做什麼
以上個人淺見
lsj- 初級會員
- 文章總數 : 43
年齡 : 59
來自 : 桃園
職業 : 營建工程
愛好 : 閒
個性 : 懶
使用年資 : 10↑
使用版本 : 2008
積分 : 2
經驗值 : 5505
威望值 : 110
注冊日期 : 2010-06-28
回復: [討論]AUTOLISP 練習題目
lsj 寫到:
1. %ang放在最後只是將表示式傳回主程式,的確是簡單又明瞭,但似乎與嚴不嚴謹無關
2. (if (比較式) 表示式1 表示式2) 此處用傳回值在使用觀念上有點落差
3. 看說明,eval的用法很單純,單純到不知道要用它做什麼
以上個人淺見
1.隨便傳回一個型態不明的變數值是一件很危險的事, 等您把程式寫大您就能明瞭.
2.一個多功能的副程式, 會依據不同情況傳回值, 此時判斷式即需具備.
3.eval的用法很多, 請您撥空多加練習, 本人不在此多加描述.
回復: [討論]AUTOLISP 練習題目
謝謝樓上的指教,原來我寫的程式還不夠多還不夠大,再練練
lsj- 初級會員
- 文章總數 : 43
年齡 : 59
來自 : 桃園
職業 : 營建工程
愛好 : 閒
個性 : 懶
使用年資 : 10↑
使用版本 : 2008
積分 : 2
經驗值 : 5505
威望值 : 110
注冊日期 : 2010-06-28
回復: [討論]AUTOLISP 練習題目
原來有這麼多種解法阿
參考看看^^
參考看看^^
新手CAD- 初級會員
- 文章總數 : 36
年齡 : 31
來自 : 彰化
職業 : 學生
愛好 : 研究cad 和 打籃球
個性 : 活潑
使用年資 : 1個月
使用版本 : 2010
積分 : 1
經驗值 : 5487
威望值 : 6
注冊日期 : 2010-03-17
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章