【AutoCAD LISP】LISP でオブジェクトをコピーする方法

2022年3月11日

【AutoCAD LISP】LISP でオブジェクトをコピーする方法

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 コマンドを実行してみてください。

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

そして、基点と目的点を指定してみてください。

ホントだ!!

基点と目的点をクリックしてコピーできた!!

基点と目的点を指定して、コピーできた

-API
-