【AutoCAD LISP】LISP で図形を鏡像する方法

2022年2月22日

逆さ富士

LISP でオブジェクトを鏡像したいんだけど…

どうすればいいの?

こんにちは、メモだよ!!管理人です。

今回は、AutoCAD で LISP を使用して、オブジェクトを鏡像する方法を紹介します。

 

vla-mirror 関数を使用してオブジェクトを鏡像

vla-mirror 関数を使用して、オブジェクトを鏡像できます。

ここで、気をつけなければいけないのは、引数で指定する座標値は WCS ということです。

そのことを気をつけておかないと、WCS では問題なく鏡像できても、UCS では思ったように鏡像されないということになります。

では、サンプル コードを見てみましょう。

(defun c:MirrorObject ()
  ; 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オブジェクトをを選択:")
  
  ; 対称軸の 1 点目を指定(UCS で指定して、WCS に変換)
  (setq ucsPoint1 (vlax-3d-point 100.0 0.0 0.0))
  (setq wcsPoint1 (vla-TranslateCoordinates utility ucsPoint1 acUCS acWorld :vlax-false))
  
  ; 対称軸の 2 点目を指定(UCS で指定して、WCS に変換)
  (setq ucsPoint2 (vlax-3d-point 100.0 100.0 0.0))
  (setq wcsPoint2 (vla-TranslateCoordinates utility ucsPoint2 acUCS acWorld :vlax-false))
  
  ; オブジェクトを回転
  (setq mirrorObject (vla-mirror vlaObject wcsPoint1 wcsPoint2))
  
  (princ)
)

この LISP をロードして、MirrorObject コマンドを実行してみてください。

「オブジェクトを選択」と聞かれるので、鏡像したいオブジェクトを選択します。

やったー!!

選択した図形を、100,0 と 100,100 を結ぶ線を軸として鏡像できた。

鏡像できた

試しに、適当な UCS にしてからも MirrorObject コマンドを実行してみてください。

vla-TranslateCoordinates 関数で、WCS の座標値に変換しているので、UCS の 100,0 と 100,100 を結ぶ線を軸として問題なく鏡像できます。😄

 

対称軸の 2 点を vlax-3d-point で指定したけど…

クリックして指定したいときは、どうすればいいの?

クリックして指定したいときは、vla-GetPoint 関数を使用します。

vla-GetPoint 関数で取得した座標値は、もともと WCS なので、vla-TranslateCoordinates 関数で変換する必要はありません。😄

  ; 対称軸の 1 点目を指定
  (setq wcsPoint1 (vla-GetPoint utility nil "対称軸の 1 点目を指定:"))
  
  ; 対称軸の 2 点目を指定
  (setq wcsPoint2 (vla-GetPoint utility nil "対称軸の 2 点目を指定:"))

ホントだ!!

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

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

-API
-