フォローする

.NET - WblockCloneとDeepClone

更新 : 2017-10-18 07:33:38 UTC

.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 関数で、コピー元の図形の状態が特殊な場合に限りますが、
オブジェクトに関連付けられたデータの複製に、失敗する不具合が確認されております。

 

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています
他にご質問がございましたら、リクエストを送信してください

コメント