C#之CAD二次开发(7) 图形编辑

# 0. 引言

 

学习了如何创建图形后,需要分析如何对图形进一步操作,如:颜色改变、移动、复制、旋转、镜像、删除等,这些都是一些基本操作。

还是同样的配方,我们将这些操作都封装成一个一个的方法,以后需要的时候调用即可!

 

# 1. 封装

 

这里需要说明的是,对图形操作如改变颜色、移动、复制等这些操作需要分为图形是否已经添加到图形数据库中,也就是图形是不是新创建的。

用代码说话,看代码就明白了:

 

## (1)改变颜色

 

如果图形已经在图形数据库中:

我们传入图形对象的ObjectId就行了,因为图形已经在图形数据库中了,后面的一个参数colorIndex是颜色索引,用来传入颜色

颜色编辑完整代码:

        /// 
        /// 改变图形颜色
        /// 
        /// 图形的ObjectId
        /// 颜色索引
        /// 图形的ObjectId 图形已经添加图形数据库

        public static ObjectId ChangeEntityColor(this ObjectId c1Id, short colorIndex)
        {
            // 图形数据库
            Database db = HostApplicationServices.WorkingDatabase;
            // 开启事务处理
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 打开块表
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                // 打开块表记录
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                // 获取图形对象
                Entity ent1 = (Entity)c1Id.GetObject(OpenMode.ForWrite);
                // 设置颜色
                ent1.ColorIndex = colorIndex;
                trans.Commit();
            }
            return c1Id;
        }

 

如果图形没有添加到图形数据库中:

与上面不同的是这时候我们直接传入图形对象作为参数

 

此外我们需要判断图形是不是新建对象,完整代码:

        /// 
        /// 改变图形颜色  图形没有添加到图形数据库
        /// 
        /// 图形对象
        /// 颜色索引
        /// 
        public static void ChangeEntityColor(this Entity ent, short colorIndex)
        {
            // 判断图形的IsNewlyObject
            if (ent.IsNewObject)
            {
                ent.ColorIndex = colorIndex;
            }
            // 不是新图形就调用上面的方法
            else
            {
                ent.ObjectId.ChangeEntityColor(colorIndex);
            }
        }

 

如果说图形是新建对象,那么对齐颜色进行赋值就行了,如果不是,调用上面函数即可!

测试代码:

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AcDoNetTools;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Colors;

namespace _03_EntityEdit
{
    public class ColorExam
    {
        [CommandMethod("EditDemo")]
        public void EditDemo()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            //db.AddCircleModeSpace(new Point3d(100, 100, 0), 50);
            Circle c1 = new Circle(new Point3d(100, 100, 0), new Vector3d(0, 0, 1), 50);
            Circle c2 = new Circle(new Point3d(200, 100, 0), new Vector3d(0, 0, 1), 50);
            c1.ColorIndex = 1;
            c2.Color = Color.FromRgb(23, 156, 255);
            db.AddEntityToModeSpace(c1, c2);                 
        }

    }
}

 

 

## (2) 复制图形

 

和上面同样的配方,我就不再细讲!注释已经很详细了

图形已经添加到图形数据库:

 

        /// 
        ///  复制图形 图形已经加入到图形数据库中
        /// 
        /// 图形对象的ObjectId
        /// 参考原点
        /// 参考目标点
        public static Entity CopyEntity(this ObjectId entId, Point3d sourcePoint, Point3d targetPoint)
        {
            // 声明一个图形对象
            Entity entR;
            // 当前图形数据库
            Database db = HostApplicationServices.WorkingDatabase; 
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 打开块表
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                // 打开块表记录
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
                // Entity ent = (Entity)trans.GetObject(entId, OpenMode.ForWrite);
                // 打开图形
                Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
                // 计算变换矩阵
                Vector3d vectoc = sourcePoint.GetVectorTo(targetPoint);
                Matrix3d mt = Matrix3d.Displacement(vectoc);
                entR = ent.GetTransformedCopy(mt);
                // 提交事务处理
                trans.Commit();
            }
            return entR;
        }

 

图形没有添加到图形数据库中:

        /// 
        ///  复制图形 图形没有加到图形数据库中
        /// 
        /// 图形对象
        /// 参考原点
        /// 参考目标点
        public static Entity CopyEntity(this Entity ent, Point3d sourcePoint, Point3d targetPoint)
        {
            //声明一个图形对象
            Entity entR;
            // 判断图形对象的IsNewlyObject属性
            if (ent.IsNewObject)
            {
                // 计算变换矩阵
                Vector3d vector = sourcePoint.GetVectorTo(targetPoint);
                Matrix3d mt = Matrix3d.Displacement(vector);
                entR = ent.GetTransformedCopy(mt);
            }
            else
            {
                entR = ent.ObjectId.CopyEntity(sourcePoint, targetPoint);
            }
            return entR;
        }

 

## (3)旋转图形

图形已经添加到图形数据库:

        /// 
        /// 旋转图形 图形在数据库中
        /// 
        /// 图形对象
        /// 旋转中心
        /// 旋转角度
        public static void RotateEntity(this ObjectId entId, Point3d center, double degree)
        {
            // 当前图形数据库
            Database db = HostApplicationServices.WorkingDatabase;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 打开块表
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                // 打开块表记录
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
                //Entity ent = (Entity)trans.GetObject(entId, OpenMode.ForWrite);
                // 打开图形
                Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
                // 计算变换矩阵
                Matrix3d mt = Matrix3d.Rotation(degree.DegreeToAngle(), Vector3d.ZAxis, center);
                ent.TransformBy(mt);
                // 提交事务处理
                trans.Commit();
            }
        }

 

图形没有添加到图形数据库中:

        /// 
        /// 旋转图形 图形不在数据库中
        /// 
        /// 图形对象
        /// 旋转中心
        /// 旋转角度
        public static void RotateEntity(this Entity ent, Point3d center, double degree)
        {
            // 判断图形对象的IsNewlyObject属性
            if (ent.IsNewObject)
            {
                // 计算变换矩阵

                Matrix3d mt = Matrix3d.Rotation(degree.DegreeToAngle(), Vector3d.ZAxis, center);
                ent.TransformBy(mt);
            }
            else
            {
                ent.ObjectId.RotateEntity(center, degree);
            }
        }

 

旋转和复制的测试代码:

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AcDoNetTools;   // 我们之前自己封装的那个dll

namespace _03_EntityEdit
{
    public class CopyExam
    {
        // 复制图形
        [CommandMethod("CopyDemo")]
        public void CopyDemo()
        {
            Database db = HostApplicationServices.WorkingDatabase;

            Circle c1 = new Circle(new Point3d(100, 100, 0), Vector3d.ZAxis, 100);
            Circle c2 = (Circle)c1.CopyEntity(new Point3d(100, 100, 0), new Point3d(100, 200, 0));
            db.AddEntityToModeSpace(c1);
            Circle c3 = (Circle)c1.CopyEntity(new Point3d(0, 0, 0), new Point3d(-100, 0, 0));
            db.AddEntityToModeSpace(c3);
        }

        // 旋转图形
        [CommandMethod("RotateDemo")]
        public void RotateDemo()
        {
            Database db = HostApplicationServices.WorkingDatabase;

            Line l1 = new Line(new Point3d(100, 100, 0), new Point3d(300, 100, 0));
            Line l2 = new Line(new Point3d(100, 100, 0), new Point3d(300, 100, 0));
            Line l3 = new Line(new Point3d(100, 100, 0), new Point3d(300, 100, 0));

            l1.RotateEntity(new Point3d(100, 100, 0), 30);
            db.AddEntityToModeSpace(l1, l2, l3);

            l2.RotateEntity(new Point3d(0, 0, 0), 60);

            l3.RotateEntity(new Point3d(200, 500, 0), 90);
        }

    }
}

 

using AcDoNetTools; 是我们之前(https://blog.csdn.net/yzk1062913581/article/details/105050928)自己封装的那个dll,就是那一堆堆的添加图形的东西和一些基本操作方法的封装,在引用里面添加进行即可!

还有几个操作就贴了,内容颇多,代码自己去下载,下面会给出链接,大同小异!

 

完整代码下载地址:

https://gitee.com/yuzhaokai/cad_secondary_development_code.git

 

原文请关注公众号:数据智能笔记

 

C#之CAD二次开发(7) 图形编辑_第1张图片

你可能感兴趣的:(C#之CAD二次开发笔记)