・ 変換マトリックス(4x4)で点を変換する
変換マトリックスを使って、点座標を変換するのは、座標系を変えたり、ネストされたオブジェクトのWCSでの位置を得るのに有効です。
その際 (nentsel) が返す変換マトリックスは特別で 3x4
ですから、あらかじめ 4x4 に変換が必要です。
;///////////////////////////////////////////////////////////////////////////////
;INSERT図形にネストされた線分の始点と終点をWCSで取得する
;///////////////////////////////////////////////////////////////////////////////
(defun Jo_trans_line( / ent en ed et mat pt_l
Jof_mat_3to4 Jof_trans Jof_del_last Jof_ch_3dpt )
;*******************************************************************************
;サブルーチン 4x3のマトリックスを4x4に変換 ;
(defun Jof_mat_3to4 ( mat / a b i mat_col x mat4)
(setq mat (mapcar '(lambda (a b) (append a (list b))) mat '(0.0 0.0 0.0 1.0)))
(setq i 0)
(repeat (length mat)
(setq mat_col (list (mapcar '(lambda (x) (nth i x)) mat)))
(setq mat4 (append mat4 mat_col))
(setq i (1+ i))
)
mat4
)
;*******************************************************************************
;サブルーチン マトリックス変換 ;
(defun Jof_trans ( pt mat / x )
(setq pt (append pt '(1.0)))
(mapcar '(lambda (x) (apply '+ (mapcar '* pt x))) mat)
)
;*******************************************************************************
;サブルーチン リストの最後の要素を削除 ;
(defun Jof_del_last (lst)
(reverse (cdr (reverse lst)))
)
;*******************************************************************************
; サブルーチン 点座標リストの変換 3D_point ;
(defun Jof_ch_3dpt( ed mat no_l / x pt_l i )
(setq pt_l (mapcar '(lambda (x) (cdr (assoc x ed))) no_l))
(setq pt_l (mapcar '(lambda (x) (Jof_del_last (Jof_trans x mat))) pt_l))
)
;*******************************************************************************
; メインルーチン (Jo_trans_line) ;
(while (not ent)
(setq ent (nentsel "\ネストされた線分を選択 :"))
(if (= 4 (length ent))
(progn
(setq en (car ent))
(setq mat (Jof_mat_3to4 (caddr ent)));4x4のマトリックスに変換 ;
(setq et (cdr (assoc 0 (setq ed (entget en)))))
(if (= et "LINE")
(setq pt_l (Jof_ch_3dpt ed mat '(10 11)))
(princ "\n線分を選んでね")
)
)
(princ "\nブロック図形を選んでね")
)
)
(if pt_l
(progn
(princ "\n始点:")
(princ (car pt_l))
(princ "\n / 終点:")
(princ (cadr pt_l))
)
)
(princ)
)
参考文献: http://www1.harenet.ne.jp/~hanafusa/memo/matrix.htm