AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~
AutoCAD顧問
Would you like to react to this message? Create an account in a few clicks or log in to continue.
[討論]尋找交點的問題-intersectwith與點座標轉換 Io15010 [討論]尋找交點的問題-intersectwith與點座標轉換 Easase10 [討論]尋找交點的問題-intersectwith與點座標轉換 Oiu15010 [討論]尋找交點的問題-intersectwith與點座標轉換 2020-211 [討論]尋找交點的問題-intersectwith與點座標轉換 Oo-2-110 [討論]尋找交點的問題-intersectwith與點座標轉換 BPl3tjj

[討論]尋找交點的問題-intersectwith與點座標轉換

向下

[討論]尋找交點的問題-intersectwith與點座標轉換 Empty [討論]尋找交點的問題-intersectwith與點座標轉換

發表 由 windqqqq 于 2010-10-23, 14:28

各位先進好,最近看魔法祕笈中的例題:取得任意二物件的交點(例題是一圓一線),裡面介紹到intersectwith的語法,有幾個問題想請教大家(程式如下):

1.第10行 用檢查器查intvar的回應是變式資料#;若要取得autocad點座標,只能用第11行的vlax-safearray->list去求嗎?

2.若兩物件只有一個交點時,使用第11行的vlax-safearray->list後,就是可用的點座標了;但例題中有兩交點,經過第12~24行後的轉換程式後,要如何取出其中一點座標來使用?

3.第12行的意思是先給i=1,xyzlist=nil,intpp_list=nil嗎?nil在這個地方是指0嗎?

4.第14~23行都是第13行foreach的表示式嗎?看不懂這整個轉換程式的意思,雖然其中的cons,if,foreach,rem,reverse都查過意思了,但整個還是不瞭解,希望了解的先進能開通指導一下,謝謝.

代碼:

01 (defun c:getenint ()
02  (setq acadobj(vlax-get-acad-object))
03  (setq dwgobj(vla-get-ActiveDocument acadobj))
04  (setq mspace(vla-get-ModelSpace dwgobj))
05  (setvar "cmdecho" 0)
06  (setq en1 (car (entsel "第一個圖元:")))
07  (setq cirobj (vlax-ename->vla-object en1))
08  (setq en2 (car (entsel "第二個圖元:")))
09  (setq lineobj (vlax-ename->vla-object en2))
10  (setq intvar (vla-IntersectWith cirobj lineobj acExtendNone))
11  (setq listpp(vlax-safearray->list (vlax-variant-value intvar)))
12  (setq   i 1  xyzlist nil intpp_list nil)
13  (foreach val listpp
14    (setq xyzlist (cons val xyzlist))
15    (if   (= (rem i 3) 0)
16      (progn
17    (setq xyzlist (reverse xyzlist))
18      (setq intpp_list (cons xyzlist intpp_list))
19    (setq xyzlist nil)
20      )
21    )
22    (setq i (1+ i))
23  )
24  (setq intpp_list (reverse intpp_list))
25  (foreach pp intpp_list
26    (command "donut" 0 3 pp "")
27  )
28  (prin1)
29 )


Tiger&蘋果爸 在 2010-11-17, 14:40 作了第 1 次修改 (原因 : 改為討論類型)
windqqqq
windqqqq
一般會員
一般會員

文章總數 : 11
年齡 : 41
來自 : 台中
職業 : 機械製圖
愛好 : 游泳
個性 : 隨和
使用年資 : 3
使用版本 : 2002
經驗值 : 3904
威望值 : 0
注冊日期 : 2010-03-02
男 巨蟹座 羊

回頂端 向下

[討論]尋找交點的問題-intersectwith與點座標轉換 Empty 回復: [討論]尋找交點的問題-intersectwith與點座標轉換

發表 由 pizg 于 2010-11-13, 13:23

1.第10行的 vla-IntersectWith 函數是用來求取交點的,而後將值放入變數 intvar,我們可以使用 (type intvar) 會傳回 varient,這表示 vla-IntersectWith 函數傳回值的型態是 varient,而 (vlax-variant-value intvar) 則是將 varient 資料型態轉換為 safearray,最後再透過 vlax-safearray->list 函數將資料型態轉換為 AutoCAD 可接受的 LIST,而後將值放入變數 listpp,我們可以使用 (type listpp) 會傳回 LIST。
這整個過程都是在將 VisualLISP 的資料型態轉換為 AutoCAD 可接受的資料型態。

2.經過第11行的vlax-safearray->list求取交點並轉換資料型態後,變數 listpp 可能有交點,也有可能沒有交點,如果沒有交點時,程式執行到 vlax-safearray->list 這個函數時將會出現錯誤(註1),當然變數 listpp 也就不會有交點。

3.由於變數 listpp 的值是 '(X1 Y1 Z1 X2 Y2 Z2 ...),你要直接一次取3個值出來當作一個座標點也可以,但是如果將它轉換為 '((X1 Y1 Z1) (X2 Y2 Z2) ...)格式,將會更方便使用(註2),第12~24即是把這內容處理為以待後續使用。

4.函數 foreach 的功用是逐一取出集合中的元素,以此程式而言,它會從 listpp 中逐一取出值放入變數 val。變數 i 是用來計數讀到第幾個值,變數 xyzlist 是用來暫時存放X/Y/Z座標,變數 intpp_list 則是用來存放處理後的座標點。判斷式 (= (rem i 3) 0) 是用來判定變數 i 是否為 3 的倍數,如果是的話,就表示 xyzlist 已完整存放 X/Y/Z 座標。另外,由於 xyzlist 的值是以 Z/Y/X 格式存放,因此在存入到 intpp_list 前必須先用函數 reverse 將它反轉為 X/Y/Z。

註1:經過函數處理過的東東,它未必一定會有值,也有可能是無(nil),如果未對這值做錯誤處理或適當的判讀,就冒然使用這個值,將會產生嚴重後果。

註2:對於類似這樣常用的資料格式轉換,我們可以自訂一個函數,專門處理這樣的問題,一方面程式碼將會更加簡潔,另一方面執行效率也會提高不少。

Tiger&蘋果爸 寫到:讚啦!! 謝謝熱心回覆~< 積分 +1>
[公告]關於團隊成員的回文及貢獻


pizg 在 2010-11-16, 12:48 作了第 3 次修改 (原因 : 加分囉~)
pizg
pizg
高級會員
高級會員

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

https://pizgchen.blogspot.com/

回頂端 向下

[討論]尋找交點的問題-intersectwith與點座標轉換 Empty 回復: [討論]尋找交點的問題-intersectwith與點座標轉換

發表 由 windqqqq 于 2010-11-27, 09:12

謝謝pizg的詳細的解釋和建議,讓我更進一步理解這部分
感覺lisp要常去寫,卡住一段時間的lisp,很多細節和函數都忘記了

頭暈目眩

程式內容也如pizg所提要簡潔,以往的習慣都是照平常畫圖的步驟去寫
雖然有加上註解,但是在找交點這部分的內容就很雜亂
現在我想應該事先就要鋪陳好;把每個畫圖步驟所需的函數和變數都整理好,比較不會亂掉

再次謝謝pizg的指導

windqqqq
windqqqq
一般會員
一般會員

文章總數 : 11
年齡 : 41
來自 : 台中
職業 : 機械製圖
愛好 : 游泳
個性 : 隨和
使用年資 : 3
使用版本 : 2002
經驗值 : 3904
威望值 : 0
注冊日期 : 2010-03-02
男 巨蟹座 羊

回頂端 向下

[討論]尋找交點的問題-intersectwith與點座標轉換 Empty 回復: [討論]尋找交點的問題-intersectwith與點座標轉換

發表 由 pizg 于 2010-11-29, 09:15

windqqqq 你好,

不客氣.

寫好程式的不二法門:
1. 多看 -- 多看看別人所寫的範例.
2. 多寫 -- 要把寫程式當成寫日記那樣每天都寫.
3. 多聽 -- 多聽聽使用者的意見.
以上共勉之.


pizg 在 2010-11-29, 09:29 作了第 1 次修改
pizg
pizg
高級會員
高級會員

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

https://pizgchen.blogspot.com/

回頂端 向下

[討論]尋找交點的問題-intersectwith與點座標轉換 Empty 回復: [討論]尋找交點的問題-intersectwith與點座標轉換

發表 由 Tiger&蘋果爸 于 2010-11-29, 09:18

pizg 寫到:windqqqq 你好,

不客氣.

寫好程式的不二法門:
1. 多看 -- 多看看別人所寫的範例.
2. 多寫 -- 要把寫程式當成寫日記那樣每天都寫.
3. 多聽 -- 多聽聽使用者的需求.
以上共勉之.
這些真的很重要~
謝謝分享啦!
竊喜

____________________________________________________________________________________
[討論]尋找交點的問題-intersectwith與點座標轉換 Oo-2-110 [討論]尋找交點的問題-intersectwith與點座標轉換 Ia15010 [討論]尋找交點的問題-intersectwith與點座標轉換 Ziao1510 [討論]尋找交點的問題-intersectwith與點座標轉換 BPl3tjj
Tiger&蘋果爸
Tiger&蘋果爸
系統管理員
系統管理員

文章總數 : 19338
年齡 : 44
來自 : 台北市文山區
職業 : AutoCAD顧問
愛好 : 蹓狗/戶外活動/拍照
個性 : 幽默/樂觀/善良
使用年資 : 15↑
使用版本 : AutoCAD 2016
經驗值 : 76555
威望值 : 14627
注冊日期 : 2008-04-23
2D基礎函授 2D進階函授 3D基礎函授 https://i.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

回頂端 向下

回頂端


 
這個論壇的權限:
無法 在這個版面回復文章
[討論]尋找交點的問題-intersectwith與點座標轉換 Uos15010 [討論]尋找交點的問題-intersectwith與點座標轉換 BPl3tjj [討論]尋找交點的問題-intersectwith與點座標轉換 Ziao1510 [討論]尋找交點的問題-intersectwith與點座標轉換 Oo-2-110 [討論]尋找交點的問題-intersectwith與點座標轉換 Oooo-110 [討論]尋找交點的問題-intersectwith與點座標轉換 2020-211