【AutoCAD LISP】LISP で図形を回転する方法

2022年2月20日

カラフル和傘のテクスチャ「コピースペース有」

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 "基点を指定:"))

ホントだ!!

クリックして指定できるようになった!!

基点を指定できるようになった

-API
-