Vla-copyobjects

提供:GizmoLabs - だいたい CAD LISP なサイト
構文
(vla-copyobjects vla-object Objects Owner IDPairs )


機能
複数のオブジェクトを複製する(ディープ クローニング)。


引数
  • vla-object … VLAオブジェクト(Database、Document)
  • Objects … 複写される基本オブジェクトの配列。オブジェクトの所有者はすべて同じでなければならず、また所有者はこのメソッドを呼び出すデータベースまたはドキュメントに属していなければならない。
  • Owner … 複写されたオブジェクトの新しい所有者。所有者が指定されていない場合は、Objects の配列内のオブジェクトと同じ所有者でオブジェクトが作成される。
  • IDPairs … 複写および変換処理中に発生したことに関する情報
  • 入力 : 空のバリアント
  • 出力 : IDPair オブジェクトの配列。


戻り値
新しく作成される複製オブジェクトの配列。この配列では、基本オブジェクトだけが返される。CopyObjects の処理中に発生したこと、または基本オブジェクトが持つオブジェクトのリストに関する情報は、IDpairs のパラメータを参照。


  • MEMO : オブジェクトを他の開かれている図面にコピーするには、他の図面のモデル空間に Owner パラメータを設定する。
  • CopyObjects の処理中は、Objects パラメータ内の基本オブジェクトに所有または参照されているオブジェクトも複写される。
  • 注 : コレクション内で何度も繰り返しながら、このメソッドを実行できない。このメソッドは読み書きの操作を行うが、繰り返し処理を実行すると読み出し専用の作業領域が開いてしまう。このメソッドを呼び出す前に、繰り返し処理を完了させるようにすること。


サンプル
(vl-load-com)
(defun c:Example_CopyObjects()
    ;; Circle オブジェクトを作成し、CopyObjects メソッドを使用して、新しい円のコピーを作成するサンプル。
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument acadObj))

    ;; ObjectDBX ライブラリをロード
    (if (= acLibImport nil)
	       (progn
	           (vlax-import-type-library 
                   :tlb-filename 
                   "C:\\Program Files\\Common Files\\Autodesk Shared\\axdb20enu.tlb" ; バージョンに合わせて変える
	               :methods-prefix "acdbm-"
	               :properties-prefix "acdbp-"
	               :constants-prefix "acdbc-"
	           )
            (setq acLibImport T)
        )
    )

    ;; ObjectDBX オブジェクトのリファレンスを作成
    (setq acdbObj (vlax-create-object "ObjectDBX.AxDbDocument.20"))

    ;; 参照ファイルを開く
    (acdbm-open acdbObj (findfile ".\\Sample\\copysample.dwg")) ; ファイルは準備しとく

    ;; 2つの円を作成
    (setq objCollection (vlax-make-safearray vlax-vbObject (cons 0 (- (vla-get-Count (vla-get-ModelSpace acdbObj)) 1)))
	  count 0)

    ;; オブジェクトコピー
    (vlax-for eachObj (vla-get-ModelSpace acdbObj)
        (vlax-safearray-put-element objCollection count eachObj)
        (setq count (1+ count))
    )
     
    ;; オブジェクトをコピーし、新しいオブジェクト (コピー) のコレクションを取得
    (setq retObjects (vla-CopyObjects acdbObj objCollection (vla-get-ModelSpace (vla-get-Database doc))))
    (vla-ZoomAll acadObj)
    
    (alert "モデル空間の図形をコピったよ.")

    ;; メモリーの図面ファイルを解放
    (vlax-release-object acdbObj)
)

関連事項