.NET API では、異なる図面間でコピーを行う場合は、WblockCloneObjects 関数を使用し、
同一の図面内でのコピーを行う場合は、DeepCloneObjects 関数を使用します。
Clone 関数を使用して、オブジェクトの複製を作成しコピーを行う事が可能ですが、
開いている他の図面に対して、モデル空間上のオブジェクトを選択してコピーする場合や、
同一の図面内でも一部のオブジェクトは Clone 関数でコピーすると失敗してしまいます。
異なる図面間でオブジェクトをコピーする場合に、失敗してしまう主な原因としては、
ブロック参照ではブロック定義を、寸法では寸法スタイルを図形が参照している為、
コピー先の図面にコピー元の図面のように、参照先が存在しない場合に失敗します。
同一図面でのコピーの場合は、参照先が存在しているので基本的には失敗しませんが、
従属するエンティティをもつ、一部のオブジェクトで Clone 関数を使用した場合、
従属するエンティティは複製されないので結果失敗してしまいます。
そこでこれらの問題を回避してオブジェクトのコピーを行う関数として、
WblockCloneObjects 関数と、DeepCloneObjects 関数が存在しています。
下の例では、選択したオブジェクトを、新しく作成した図面にコピーしています。
VB.NET
-
<CommandMethod("WBLOCKCLONE", CommandFlags.Session)> Public Sub WBlockClone() Dim icDocMgr = Application.DocumentManager Dim icDoc = icDocMgr.MdiActiveDocument Dim icDb = icDoc.Database Dim icEd = icDoc.Editor Dim icRes = icEd.GetSelection() If icRes.Status <> PromptStatus.OK Then Return Dim icTargetDoc = icDocMgr.Add("") icDocMgr.MdiActiveDocument = icTargetDoc Dim icTargetDb = icTargetDoc.Database Dim icTargetEd = icTargetDoc.Editor Using icTrans = icDb.TransactionManager.StartTransaction() Using icDocLock = icTargetDoc.LockDocument() Dim icObjIdColl = New ObjectIdCollection(icRes.Value.GetObjectIds()) Using icMap = New IdMapping() icDb.WblockCloneObjects( icObjIdColl, SymbolUtilityServices.GetBlockModelSpaceId(icTargetDb), icMap, DuplicateRecordCloning.Ignore, False) End Using End Using icTrans.Commit() End Using End Sub
- C#
-
[CommandMethod("WBLOCKCLONE", CommandFlags.Session)] public void WBlockClone() { var icDocMgr = Application.DocumentManager; var icDoc = icDocMgr.MdiActiveDocument; var icDb = icDoc.Database; var icEd = icDoc.Editor; var icRes = icEd.GetSelection(); if (icRes.Status != PromptStatus.OK) return; var icTargetDoc = icDocMgr.Add(""); icDocMgr.MdiActiveDocument = icTargetDoc; var icTargetDb = icTargetDoc.Database; var icTargetEd = icTargetDoc.Editor; using (var icTrans = icDb.TransactionManager.StartTransaction()) using (var icDocLock = icTargetDoc.LockDocument()) { var icObjIdColl = new ObjectIdCollection(icRes.Value.GetObjectIds()); using (var icMap = new IdMapping()) { icDb.WblockCloneObjects( icObjIdColl, SymbolUtilityServices.GetBlockModelSpaceId(icTargetDb), icMap, DuplicateRecordCloning.Ignore, false); } icTrans.Commit(); } }
DeepCloneObjects 関数のサンプルに関しましては、
添付されているサンプルプロジェクトの内容を参考にしてください。
※また、現在 IJCAD の Clone 関数で、コピー元の図形の状態が特殊な場合に限りますが、
オブジェクトに関連付けられたデータの複製に、失敗する不具合が確認されております。