フォローする

.NET - DeepClone の注意点

更新 : 2017-10-17 08:29:11 UTC

IJCAD の .NET API は、AutoCAD の .NET API とソースレベルで高い互換性を持っています。

例えば、AutoCAD で作成されたプロジェクトを IJCAD に移植する際に、
Using Autodesk.AutoCAD ~ 、Imports Autodesk.AutoCAD ~ を、
Using using GrxCAD ~ 、Imports GrxCAD ~ のように、名前空間を変更するだけで、
小規模なプロジェクトは移植が完了できる場合もあります。

しかし、IJCAD は AutoCAD ではなく DWG 互換 CAD である為、API の仕様が微妙に異なる場合があり、DeepClone も IJCAD と AutoCAD で差のある関数の一つとなります。

サンプル

public void DeeoCloneSample()
{
	Document icDoc = Application.DocumentManager.MdiActiveDocument;
	Database icDb = icDoc.Database;
	Editor icEd = icDoc.Editor;
	
	PromptSelectionResult icSelRes = icEd.GetSelection();
	if (icSelRes.Status != PromptStatus.OK)
		return;
	
	using (Transaction icTrans = icDoc.TransactionManager.StartTransaction())
	{
		ObjectIdCollection icAryIds = new ObjectIdCollection();
		foreach(ObjectId id in icSelRes.Value.GetObjectIds())
		{
			icAryIds.Add(id);
		}
		for(int idx=1; idx<=10; idx++)
		{
			//ループ内でIdMappingを使用する場合はDisposeが必要です
			using (IdMapping icMapping = new IdMapping())
			{
				icDb.DeepCloneObjects(icAryIds, icDb.CurrentSpaceId, icMapping, false);
				foreach(IdPair pair in icMapping)
				{
					Entity cloneEntity = icTrans.GetObject(pair.Value, OpenMode.ForWrite) as Entity;
					cloneEntity.TransformBy(Matrix3d.Displacement(new Vector3d(0.0, 20.0 * (double)(idx), 0.0)));
				}
			}
		}
		icTrans.Commit();
	}

}

一回のトランザクション内で、ループによる複数回エンティティのディープクローンを行う場合、
IJCAD は AutoCAD と違い、必ず IdMapping を Dispose する必要があります。
Dispose を忘れている場合は、2回目以降のディープクローンに失敗してしまいます。

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

コメント