CAD 复制对象

发布时间 2023-06-04 14:53:43作者: chenlight

为了复制对象,要在对象上运用已提供的Clone函数。这个函数会创建一个与原始对象的重复的新对象。一旦创建了副本对象,就可以将其添加或附加到数据库之前对其进行修改。如果不变换对象或更改它们的位置 ,则新对象将位于与原对象相同的位置。

如果你需要复制大量的对象,可以添加每个对象的ids到ObjectIdCollction对象中,然后迭代每个对象。在迭代每个对象时,可以对每个对象使用Clone函数,然后将新对象添加或追加到数据库中。

复制单一对象

以下示例创建一个新圆,然后创建该圆的直接副本来创建第二个圆。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

namespace SingleCopy
{
    public class DYCopy
    {
        [CommandMethod("SingleCopy")]
        public static void SCopy()
        { 
            //获取当前文件和数据库
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            //开始事务管理
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                //以读的方式打开块表
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
                //打开块表记录模型空间,用于写
                BlockTableRecord acBlkTblRec;
                acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                //创建圆心为(2,3),半径为4.25的圆
                Circle acCirc = new Circle();
                acCirc.SetDatabaseDefaults();
                acCirc.Center = new Point3d(2, 3, 0);
                acCirc.Radius = 4.25;
                //添加新对象到块表记录和事务
                acBlkTblRec.AppendEntity(acCirc);
                acTrans.AddNewlyCreatedDBObject(acCirc, true);
                //创建圆的副本,并改变它的半径
                Circle acCircClone = acCirc.Clone() as Circle;
                acCircClone.Radius = 1;
                //添加圆的副本
                acBlkTblRec.AppendEntity(acCircClone);
                acTrans.AddNewlyCreatedDBObject(acCircClone, true);
                //将新对象保存到数据库中
                acTrans.Commit();
            }
        }
    }
}