オブジェクトをコピーするには、そのオブジェクトの Clone メソッドを使用します。このメソッドは、同じデータベース内で元のオブジェクトを複製して新規オブジェクトを作成します。複製オブジェクトの作成後は、データベースに追加する前に修正することができます。オブジェクトを変換するか、またはその位置を変更しない場合、新しいオブジェクトは元のオブジェクトと同じ位置に配置されます。Clone メソッドでは新しいオブジェクトを作成できますが、CopyFrom メソッドを使用すると、あるオブジェクトから別のオブジェクトにプロパティをコピーすることができます。
コピーするオブジェクトが多数ある場合は、ObjectIdCollection オブジェクトにそれぞれのオブジェクト ID を追加した後で、コレクション内の各オブジェクト ID を反復処理します。各オブジェクト ID を反復処理する際は、読み取り用に開いた後 Clone 関数を使用して、新しいオブジェクトをデータベースに追加します。
次の例では、新しい円を作成し、その円を直接コピーして 2 つ目の円を作成します。
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[CommandMethod("SingleCopy")]
public static void SingleCopy()
{
// Get the current document and database
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
// Start a transaction
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// Open the Block table record Model space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
// Create a circle that is at 2,3 with a radius of 4.25
using (Circle acCirc = new Circle())
{
acCirc.Center = new Point3d(2, 3, 0);
acCirc.Radius = 4.25;
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acCirc);
acTrans.AddNewlyCreatedDBObject(acCirc, true);
// Create a copy of the circle and change its radius
Circle acCircClone = acCirc.Clone() as Circle;
acCircClone.Radius = 1;
// Add the cloned circle
acBlkTblRec.AppendEntity(acCircClone);
acTrans.AddNewlyCreatedDBObject(acCircClone, true);
}
// Save the new object to the database
acTrans.Commit();
}
}
次の例では、コピーする必要のあるオブジェクトを追跡するために ObjectIdCollection オブジェクトを使用します。コレクションにオブジェクト ID を追加した後で、コレクションが反復処理されます。Clone メソッドを使用して新しいオブジェクトを作成し、次にモデル空間に追加します。
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[CommandMethod("MultipleCopy")]
public static void MultipleCopy()
{
// Get the current document and database
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
// Start a transaction
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// Open the Block table record Model space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
// Create a circle that is at (0,0,0) with a radius of 5
using (Circle acCirc1 = new Circle())
{
acCirc1.Center = new Point3d(0, 0, 0);
acCirc1.Radius = 5;
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acCirc1);
acTrans.AddNewlyCreatedDBObject(acCirc1, true);
// Create a circle that is at (0,0,0) with a radius of 7
using (Circle acCirc2 = new Circle())
{
acCirc2.Center = new Point3d(0, 0, 0);
acCirc2.Radius = 7;
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acCirc2);
acTrans.AddNewlyCreatedDBObject(acCirc2, true);
// Add all the objects to clone
DBObjectCollection acDBObjColl = new DBObjectCollection();
acDBObjColl.Add(acCirc1);
acDBObjColl.Add(acCirc2);
foreach (Entity acEnt in acDBObjColl)
{
Entity acEntClone;
acEntClone = acEnt.Clone() as Entity;
acEntClone.ColorIndex = 1;
// Create a matrix and move each copied entity 15 units
acEntClone.TransformBy(Matrix3d.Displacement(new Vector3d(15, 0, 0)));
// Add the cloned object
acBlkTblRec.AppendEntity(acEntClone);
acTrans.AddNewlyCreatedDBObject(acEntClone, true);
}
}
}
// Save the new object to the database
acTrans.Commit();
}
}