2014年6月16日 星期一

Visual Lisp 的點資料

   既然是 AutoCAD,必然牽涉到點的輸出入,程式或使用者給你一個點資料,如何取出點的 x, y , z 三軸座標數值;程式計算出的數值,如何交回給 CAD 讓它畫出來。
    先來看怎們取出點資料,如果你在命令列輸入 (getpoint),再螢幕上點選一點,這時程式會回應一個像下面的資料 (串列)

    (982.466 568.978 0.0)

    直覺的,它一定是 x, y , z 值,那怎麼拿出來,先得講 LISP 如何操作串列,基本上先認識 (car) (cadr) (caddr) 三個兄弟函數,老大 car 取出串列第一個內容,所以一個點 pt 的內容為 (1 2 3),那麼 (car pt) 便傳回 1,同理 (cadr pt) 傳回 2,同理 (caddr pt) 傳回 3,此時再設定變數,便可以得到 x, y ,z 參數

   (setq x (car pt)
       y (cadr pt)
       z (caddr pt)
   )

    便可對 x, y, z 三個變數進行運算,但要說明的是在 LISP 語言內不只以上三個函數,例如 (cdr pt) 傳回 (2 3),很明顯的是傳回第二個到最後一個串列內容;(nth 2 pt) 傳回 3(nth) 函數則依據 index 2 傳回內容 3,當然串列的第一個 index 0


    當有了新的 x y z 值,要將其組合成一個點資料傳給函數,一樣是 LISP 語言內串列的操作函數 (list),沒啥技巧

(list x y z)

   就可以了,如果在 2D 環境繪圖,那麼 z 可以省略,不需再設定。

   下面一個例子,程式要求使用者輸入一點,然後程式劃出由輸入點開始長度 10030 度角的直線

(defun c:aline( / pt x y _osmode)
    (setq _osmode (getvar "OSMODE"))
    (setvar "OSMODE" 0)
 
    // 取得起始點
    (setq pt (getpoint "輸入起始點\n")
          x (car pt)
          y (cadr pt)
    )
    // 計算終點
    (setq x (+ x (* 100 (cos (/ pi 6))))
        y (+ y (* 100 (sin (/ pi 6))))
    )
    // 繪出
    (command "LINE" pt (list x y) "")

    (setvar "OSMODE" _osmode) 
)

當然,實際程式設計時會使用 (polar) 函數
    (command  "LINE" pt (polar pt (/ pi 6) 100) "")

沒有留言:

張貼留言