AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~

[討論]AUTOLISP 練習題目

上一篇主題 下一篇主題 向下

[討論]AUTOLISP 練習題目

發表 由 andychen 于 2010-05-25, 05:31



如上圖,已知三角形的三個頂點座標,如下

65.10, 84.76

9.59, 35.69

95.29, 5.27

求各邊的長度和面積和三個角的度度量?

試試看吧!

andychen
該用戶停權中
該用戶停權中

文章總數 : 187
年齡 : 33
經驗值 : 3506
威望值 : 71
注冊日期 : 2010-04-09
男 水瓶座 豬

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 leoneriol 于 2010-05-25, 17:44

代碼:
(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-25, 17:54 作了第 2 次修改 (原因 : 修改內容提問)
avatar
leoneriol
榮譽顧問
榮譽顧問

文章總數 : 816
年齡 : 33
來自 : 基隆市七堵區
職業 : 機電工程公司-繪圖(工地)
愛好 : 看小說
個性 : 不愛說話-反應慢
使用年資 : 6年
使用版本 : 2008 & 2012
積分 : 27
經驗值 : 6638
威望值 : 938
發帖精華 : 1
回帖精華 : 1
注冊日期 : 2009-03-12
經典問與答讀者 藍鵲34號
2009聚會勳章 2014聚會勳章 男 雙魚座 鼠

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 andychen 于 2010-05-25, 23:40

恭喜你 答案正確,但是
有改善的空間。

當然,程式設計,最容易引起爭議的地方,
就是 程式設計的風格的部份。

所以,接下來的一些討論,請你 一定要多多包涵。

andychen
該用戶停權中
該用戶停權中

文章總數 : 187
年齡 : 33
經驗值 : 3506
威望值 : 71
注冊日期 : 2010-04-09
男 水瓶座 豬

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 andychen 于 2010-05-26, 10:08

以下,是一些副程式,函數的寫法。
歡迎參加討論。

代碼:

; 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
該用戶停權中
該用戶停權中

文章總數 : 187
年齡 : 33
經驗值 : 3506
威望值 : 71
注冊日期 : 2010-04-09
男 水瓶座 豬

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 shenhung 于 2010-05-26, 10:20

副程式最後請加入.這一行.
(if %ang %ang)
就會回傳..ang的值..
avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5063
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 leoneriol 于 2010-05-26, 11:13

shenhung 寫到:副程式最後請加入.這一行.
(if %ang %ang)
就會回傳..ang的值..
感激不盡 讚啦!!
avatar
leoneriol
榮譽顧問
榮譽顧問

文章總數 : 816
年齡 : 33
來自 : 基隆市七堵區
職業 : 機電工程公司-繪圖(工地)
愛好 : 看小說
個性 : 不愛說話-反應慢
使用年資 : 6年
使用版本 : 2008 & 2012
積分 : 27
經驗值 : 6638
威望值 : 938
發帖精華 : 1
回帖精華 : 1
注冊日期 : 2009-03-12
經典問與答讀者 藍鵲34號
2009聚會勳章 2014聚會勳章 男 雙魚座 鼠

回頂端 向下

改天,挊個例子證明一下

發表 由 andychen 于 2010-05-26, 11:17

shenhung 寫到:副程式最後請加入.這一行.
(if %ang %ang)
就會回傳..ang的值..


正確的用法是

(eval %ang)


你使用 (if )

萬一,%ang == nil,

就會錯掉

andychen
該用戶停權中
該用戶停權中

文章總數 : 187
年齡 : 33
經驗值 : 3506
威望值 : 71
注冊日期 : 2010-04-09
男 水瓶座 豬

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 leoneriol 于 2010-05-26, 11:18

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, 11:22 作了第 1 次修改 (原因 : 增加內容)
avatar
leoneriol
榮譽顧問
榮譽顧問

文章總數 : 816
年齡 : 33
來自 : 基隆市七堵區
職業 : 機電工程公司-繪圖(工地)
愛好 : 看小說
個性 : 不愛說話-反應慢
使用年資 : 6年
使用版本 : 2008 & 2012
積分 : 27
經驗值 : 6638
威望值 : 938
發帖精華 : 1
回帖精華 : 1
注冊日期 : 2009-03-12
經典問與答讀者 藍鵲34號
2009聚會勳章 2014聚會勳章 男 雙魚座 鼠

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 andychen 于 2010-05-26, 13:42

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

是經常會用到的副程式,所以先討論

andychen
該用戶停權中
該用戶停權中

文章總數 : 187
年齡 : 33
經驗值 : 3506
威望值 : 71
注冊日期 : 2010-04-09
男 水瓶座 豬

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 shenhung 于 2010-05-27, 02:43

andychen 寫到:正確的用法是
(eval %ang)
你使用 (if )
萬一,%ang == nil,
就會錯掉

如果..%ang 的值都為nil.
(eval %ang) 和
(if %ang %ang)
都會回傳nil

用if並不會在%ang為nil的時後.產生錯誤.只是寫法上不一樣而已.

你怎麼會覺得教課書上的寫法.才是所謂正確的用法".!!
avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5063
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 Tiger&蘋果爸 于 2010-05-27, 02:49

而因應不同的需求應該有很多方法,我想能想出來的辦法都是好方法,至於方法正不正確就其次了。
所以書上及實務是有些差距~
另外透過上面幾位前輩的討論,真的是很精采呢~

認同

____________________________________________________________________________________
avatar
Tiger&蘋果爸
系統管理員
系統管理員

文章總數 : 17328
年齡 : 41
來自 : 台北市文山區
職業 : AutoCAD顧問
愛好 : 蹓狗/戶外活動/拍照
個性 : 幽默/樂觀/善良
使用年資 : 15↑
使用版本 : AutoCAD 2016
經驗值 : 65336
威望值 : 12868
注冊日期 : 2008-04-23
2D基礎函授 2D進階函授 3D基礎函授 https://i11.servimg.com/u/f11/19/71/67/71/2d3d10.png2D+3D線上 顧問外掛程式 經典問與答讀者 藍鵲1號
2009聚會勳章 2010聚會勳章 2011聚會勳章 2012聚會勳章 2013勳章-2D基礎 2014聚會勳章 2015聚會勳章 2016聚會勳章 串連貼紙成功 男 水瓶座 兔

http://mypaper.pchome.com.tw/kv1012tiger

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 pizg 于 2010-06-13, 05:31

shenhung 寫到:
...
如果..%ang 的值都為nil.
(eval %ang) 和
(if %ang %ang)
都會回傳nil
...".!!
除了 (eval %ang) 和 (if %ang %ang) 這兩種寫法之外還有第三種
==> %ang , 此種寫法通常用在一個比較不需要很嚴謹的副程式傳回值,
其好處是簡單又明瞭.

當傳回值有多種可能的情況時, 才會用到if...或 cond...,
但如果真要用if, 個人建議把式子寫完整一點會比較好,
也就是 ==> (if (條件式) 傳回值1 傳回值2)

至於eval...則大都用在評估一個具有副程式性質的變數,
用在此處顯得有點畫蛇添足,
以上是個人淺見.
avatar
pizg
高級會員
高級會員

文章總數 : 253
年齡 : 52
來自 : 桃園縣
職業 : 建築設計;程式設計
愛好 : 音樂;攝影;繪畫;棋奕;電腦
個性 : 隨和
使用年資 : 20↑
使用版本 : 2010
積分 : 10
經驗值 : 4144
威望值 : 320
發帖精華 : 1
注冊日期 : 2010-04-16
串連貼紙成功 男 摩羯座 龍

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 lsj 于 2010-07-05, 12:56

pizg 寫到:
==> %ang , 此種寫法通常用在一個比較不需要很嚴謹的副程式傳回值,
其好處是簡單又明瞭.

當傳回值有多種可能的情況時, 才會用到if...或 cond...,
但如果真要用if, 個人建議把式子寫完整一點會比較好,
也就是 ==> (if (條件式) 傳回值1 傳回值2)

至於eval...則大都用在評估一個具有副程式性質的變數,
用在此處顯得有點畫蛇添足,
以上是個人淺見.

1. %ang放在最後只是將表示式傳回主程式,的確是簡單又明瞭,但似乎與嚴不嚴謹無關
2. (if (比較式) 表示式1 表示式2) 此處用傳回值在使用觀念上有點落差
3. 看說明,eval的用法很單純,單純到不知道要用它做什麼
以上個人淺見
avatar
lsj
初級會員
初級會員

文章總數 : 43
年齡 : 52
來自 : 桃園
職業 : 營建工程
愛好 :
個性 :
使用年資 : 10↑
使用版本 : 2008
積分 : 2
經驗值 : 2968
威望值 : 104
注冊日期 : 2010-06-28
男 水瓶座 龍

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 pizg 于 2010-07-05, 17:20

lsj 寫到:
1. %ang放在最後只是將表示式傳回主程式,的確是簡單又明瞭,但似乎與嚴不嚴謹無關
2. (if (比較式) 表示式1 表示式2) 此處用傳回值在使用觀念上有點落差
3. 看說明,eval的用法很單純,單純到不知道要用它做什麼
以上個人淺見

1.隨便傳回一個型態不明的變數值是一件很危險的事, 等您把程式寫大您就能明瞭.
2.一個多功能的副程式, 會依據不同情況傳回值, 此時判斷式即需具備.
3.eval的用法很多, 請您撥空多加練習, 本人不在此多加描述.
avatar
pizg
高級會員
高級會員

文章總數 : 253
年齡 : 52
來自 : 桃園縣
職業 : 建築設計;程式設計
愛好 : 音樂;攝影;繪畫;棋奕;電腦
個性 : 隨和
使用年資 : 20↑
使用版本 : 2010
積分 : 10
經驗值 : 4144
威望值 : 320
發帖精華 : 1
注冊日期 : 2010-04-16
串連貼紙成功 男 摩羯座 龍

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 lsj 于 2010-07-05, 22:56

謝謝樓上的指教,原來我寫的程式還不夠多還不夠大,再練練
avatar
lsj
初級會員
初級會員

文章總數 : 43
年齡 : 52
來自 : 桃園
職業 : 營建工程
愛好 :
個性 :
使用年資 : 10↑
使用版本 : 2008
積分 : 2
經驗值 : 2968
威望值 : 104
注冊日期 : 2010-06-28
男 水瓶座 龍

回頂端 向下

回復: [討論]AUTOLISP 練習題目

發表 由 新手CAD 于 2010-07-28, 02:58

原來有這麼多種解法阿
參考看看^^
avatar
新手CAD
初級會員
初級會員

文章總數 : 36
年齡 : 24
來自 : 彰化
職業 : 學生
愛好 : 研究cad 和 打籃球
個性 : 活潑
使用年資 : 1個月
使用版本 : 2010
積分 : 1
經驗值 : 2956
威望值 : 6
注冊日期 : 2010-03-17
男 雙魚座 雞

回頂端 向下

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章