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回目以降のディープクローンに失敗してしまいます。