LISP で図形をコピーしたいんだけど…
どうすればできるのかなぁ?
こんにちは、メモだよ!!管理人です。
今回は、そんなあなたに、AutoCAD で LISP を使用して、オブジェクトをコピーする方法を紹介します。
vla-copy 関数でオブジェクトをコピー
vla-copy 関数で、オブジェクトをコピーできます。
でも、コピーされるのは、元のオブジェクトと同じ場所です。
普通コピーするときは、別の場所にコピーしたいですよね。
なので、コピーしたあとに vla-move 関数を使用して、移動するということになります。
-
参考【AutoCAD LISP】LISP で図形を移動する方法
AutoCAD で、LISP を使用して図形を移動する方法を紹介します。
続きを見る
では、サンプルコードを見てみましょう。
(defun c:CopyObject ()
; 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オブジェクトをを選択:")
; コピーする基点(UCS で指定して、WCS に変換)
(setq ucsBasePoint (vlax-3d-point 0 0 0))
(setq wcsBasePoint (vla-TranslateCoordinates utility ucsBasePoint acUCS acWorld :vlax-false))
; コピーする目的点(UCS で指定して、WCS に変換)
(setq ucsDistPoint (vlax-3d-point 100. 50.0 0))
(setq wcsDistPoint (vla-TranslateCoordinates utility ucsDistPoint acUCS acWorld :vlax-false))
; オブジェクトをコピー
(setq copiedObject (vla-copy vlaObject))
(vla-move copiedObject wcsBasePoint wcsDistPoint)
(princ)
)
このコードをロードして、CopyObject コマンドを実行してみてください。
「オブジェクトを選択」と聞かれるので、コピーしたいオブジェクトを選択します。
やったー!!
図形をコピーできた!!
ここで、気をつけなければいけないのは、引数で指定する座標値は WCS ということです。
そのことを気をつけておかないと、WCS では問題なくコピーできても、UCS では思ったようにコピーされないということになります。
以下の部分で、vla-TranslateCoordinates 関数を使用して、指定した UCS の座標値を WCS に変換しています。
; コピーする基点(UCS で指定して、WCS に変換)
(setq ucsBasePoint (vlax-3d-point 0 0 0))
(setq wcsBasePoint (vla-TranslateCoordinates utility ucsBasePoint acUCS acWorld :vlax-false))
; コピーする目的点(UCS で指定して、WCS に変換)
(setq ucsDistPoint (vlax-3d-point 100. 50.0 0))
(setq wcsDistPoint (vla-TranslateCoordinates utility ucsDistPoint acUCS acWorld :vlax-false))
コピーするときの基点と目的点を、クリックして指定したいときは vla-GetPoint 関数を使用します。
vla-GetPoint 関数で取得した座標値は、もともと WCS なので、vla-TranslateCoordinates 関数で変換する必要はありません。😄
サンプルコードは、以下になります。
(defun c:CopyObject2 ()
; 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オブジェクトをを選択:")
; コピーする基点
(setq wcsBasePoint (vla-GetPoint utility nil "基点を指定:"))
; コピーする目的点
(setq wcsDistPoint (vla-GetPoint utility nil "目的点を指定:"))
; オブジェクトをコピー
(setq copiedObject (vla-copy vlaObject))
(vla-move copiedObject wcsBasePoint wcsDistPoint)
(princ)
)
このコードをロードして、CopyObject2 コマンドを実行してみてください。
「オブジェクトを選択」と聞かれるので、コピーしたいオブジェクトを選択します。
そして、基点と目的点を指定してみてください。
ホントだ!!
基点と目的点をクリックしてコピーできた!!