LISP でオブジェクトを回転したいんだけど…
どうすればいいの?
こんにちは、メモだよ!!管理人です。
今回は、AutoCAD で LISP を使用して、オブジェクトを回転する方法を紹介します。
vla-Rotate 関数を使用してオブジェクトを回転
vla-Rotate 関数を使用して、オブジェクトを回転できます。
ここで、気をつけなければいけないのは、引数で指定する座標値は WCS ということです。
そのことを気をつけておかないと、WCS では問題なく回転できても、UCS では思ったように回転されないということになります。
では、サンプル コードを見てみましょう。
(defun c:RotateObject ()
; AutoCAD のオブジェクトを取得
(setq acadObject (vlax-get-acad-object))
; アクティブなドキュメントを取得
(setq activeDocument (vla-get-activedocument acadObject))
; ドキュメントの Utilyty オブジェクトを取得
(setq utility (vla-get-utility activeDocument))
; 選択した図形の VLA オブジェクトを取得
(vla-getentity utility 'vlaObject 'pickedPoint "\nオブジェクトをを選択:")
; 回転角度を設定(45 度回転)
(setq rotateAngle (/ (* 45 pi) 180))
; 回転の基点を設定(UCS で指定して、WCS に変換)
(setq ucsBasePoint (vlax-3d-point 100.0 50.0 0.0))
(setq wcsBasePoint (vla-TranslateCoordinates utility ucsBasePoint acUCS acWorld :vlax-false))
; オブジェクトを回転
(vla-rotate vlaObject wcsBasePoint rotateAngle)
(princ)
)
この LISP をロードして、RotateObject コマンドを実行してみてください。
「オブジェクトを選択」と聞かれるので、回転したいオブジェクトを選択します。
やったー!!
選択した四角形を 100,50 を基点にして 45 度回転できた。
試しに、適当な UCS にしてからも RotateObject コマンドを実行してみてください。
vla-TranslateCoordinates 関数で、WCS の座標値に変換しているので、問題なく回転できます。😄
回転する基点を vlax-3d-point で指定したけど…
クリックして指定したいときは、どうすればいいの?
クリックして指定したいときは、vla-GetPoint 関数を使用します。
vla-GetPoint 関数で取得した座標値は、もともと WCS なので、vla-TranslateCoordinates 関数で変換する必要はありません。😄
; 回転の基点を設定
(setq wcsBasePoint (vla-GetPoint utility nil "基点を指定:"))
ホントだ!!
クリックして指定できるようになった!!