[討論]尋找交點的問題-intersectwith與點座標轉換
3 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
[討論]尋找交點的問題-intersectwith與點座標轉換
各位先進好,最近看魔法祕笈中的例題:取得任意二物件的交點(例題是一圓一線),裡面介紹到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都查過意思了,但整個還是不瞭解,希望了解的先進能開通指導一下,謝謝.
1.第10行 用檢查器查intvar的回應是變式資料#
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&蘋果爸 在 周三 17 11月 2010 - 14:40 作了第 1 次修改 (原因 : 改為討論類型)
windqqqq- 一般會員
- 文章總數 : 12
年齡 : 45
來自 : 台中
職業 : 機械製圖
愛好 : 游泳
個性 : 隨和
使用年資 : 3
使用版本 : 2002
經驗值 : 5423
威望值 : 0
注冊日期 : 2010-03-02
回復: [討論]尋找交點的問題-intersectwith與點座標轉換
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:對於類似這樣常用的資料格式轉換,我們可以自訂一個函數,專門處理這樣的問題,一方面程式碼將會更加簡潔,另一方面執行效率也會提高不少。
這整個過程都是在將 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 在 周二 16 11月 2010 - 12:48 作了第 3 次修改 (原因 : 加分囉~)
回復: [討論]尋找交點的問題-intersectwith與點座標轉換
謝謝pizg的詳細的解釋和建議,讓我更進一步理解這部分
感覺lisp要常去寫,卡住一段時間的lisp,很多細節和函數都忘記了
程式內容也如pizg所提要簡潔,以往的習慣都是照平常畫圖的步驟去寫
雖然有加上註解,但是在找交點這部分的內容就很雜亂
現在我想應該事先就要鋪陳好;把每個畫圖步驟所需的函數和變數都整理好,比較不會亂掉
再次謝謝pizg的指導
感覺lisp要常去寫,卡住一段時間的lisp,很多細節和函數都忘記了
程式內容也如pizg所提要簡潔,以往的習慣都是照平常畫圖的步驟去寫
雖然有加上註解,但是在找交點這部分的內容就很雜亂
現在我想應該事先就要鋪陳好;把每個畫圖步驟所需的函數和變數都整理好,比較不會亂掉
再次謝謝pizg的指導
windqqqq- 一般會員
- 文章總數 : 12
年齡 : 45
來自 : 台中
職業 : 機械製圖
愛好 : 游泳
個性 : 隨和
使用年資 : 3
使用版本 : 2002
經驗值 : 5423
威望值 : 0
注冊日期 : 2010-03-02
回復: [討論]尋找交點的問題-intersectwith與點座標轉換
windqqqq 你好,
不客氣.
寫好程式的不二法門:
1. 多看 -- 多看看別人所寫的範例.
2. 多寫 -- 要把寫程式當成寫日記那樣每天都寫.
3. 多聽 -- 多聽聽使用者的意見.
以上共勉之.
不客氣.
寫好程式的不二法門:
1. 多看 -- 多看看別人所寫的範例.
2. 多寫 -- 要把寫程式當成寫日記那樣每天都寫.
3. 多聽 -- 多聽聽使用者的意見.
以上共勉之.
pizg 在 周一 29 11月 2010 - 9:29 作了第 1 次修改
回復: [討論]尋找交點的問題-intersectwith與點座標轉換
這些真的很重要~pizg 寫到:windqqqq 你好,
不客氣.
寫好程式的不二法門:
1. 多看 -- 多看看別人所寫的範例.
2. 多寫 -- 要把寫程式當成寫日記那樣每天都寫.
3. 多聽 -- 多聽聽使用者的需求.
以上共勉之.
謝謝分享啦!
____________________________________________________________________________________
👉快速比例設定與出圖技巧-線上課程(點我)👈
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章