・ 変換マトリックス(4x4)で図形を変換する 《 VLISP 》
変換マトリックスを使って、図形を変換するのは、その図形のエンティティーの定義点を変換して、エンティティーを書換えて、(entmod)
もしくは (entmake) ということになります
しかし、これでは、図形のタイプごとにコーディングが必要ですね
そこで、Visual Lisp の (vla-TransformBy)
をつかって楽してみましょう
Visual Lisp は AutoCAD2000 から以後のバージョンで利用可能です
;///////////////////////////////////////////////////////////////////////////////
;INSERT図形にネストされたオブジェクトをWCSに再現
; Visual Lisp 用
;///////////////////////////////////////////////////////////////////////////////
(defun Jov_trans_bobj ( / ent en ed et mat Jof_mat_3to4 )
;*******************************************************************************
;サブルーチン 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
)
;*******************************************************************************
; メインルーチン (Jov_trans_bobj) ;
(vl-load-com) ;LispでActiveXを使うには必ず必要
(while (not en)
(setq ent (nentsel "\nネストされたオブジェクトを選択:"))
(if (= 4 (length ent))
(progn
(setq mat (Jof_mat_3to4 (caddr ent)));4x4のマトリックスに変換 ;
(setq et (cdr (assoc 0 (setq ed (entget (car
ent))))))
(cond
((= et "VERTEX")(setq ed nil))
((= et "ATTRIB")(setq ed nil))
)
(if ed
(setq en (if (entmake ed) (entlast) nil));ネストされたオブジェクトの複製 ;
(princ "\nそれはダメ・・m(__)m")
)
)
(princ "\nネストされたオブジェクトを選んでね")
)
)
(if (and mat en)
(progn
(setq v_obj (vlax-ename->vla-object en));図形名を vla-object に;
(vla-TransformBy v_obj (vlax-tmatrix mat));図形の WCS への変換>>>>> X Y Z の尺度が違うとエラーになる;
(vla-Update v_obj)
(setq en (vlax-vla-object->ename v_obj));vla-object を図形名に;
)
)
(redraw en 3);WCSに複製されたオブジェクトをハイライト表示;
(princ)
)
驚くほど簡単ですね
ただし、X,Y,Z で尺度の違う変換はかけられません
まあ、その場合、定義点を変換して(entmod) or (entmake)
するとしても、円や円弧はとても大変です
異尺度で変換したら、円・円弧は楕円に 楕円はSPLINE?にしなくてはならないので・・・(私にはできません)
参考文献: http://www1.harenet.ne.jp/~hanafusa/memo/matrix.htm