CAD二次开发(2)-将直线对象添加到CAD图形文件

1. 准备工作

创建一个类库项目,如下:

2. 分析Line对象

Line类的初始化方法和参数

csharp 复制代码
using Autodesk.AutoCAD.DatabaseServices;
Line line = new Line();

Line 继承Curve 继承Entity 继承DBObject 继承Drawable 继承RXObject

初始化方法有两个:

3. 启动项目

我们创建一个line对象,然后打上断点,生成.dll文件,加载到CAD中,然后执行命令。

我们就会发现,自动跳到了VS界面,代码走到了断点处,代码继续往下走,我们就会看到:

透过参数,我们就会发现默认Line创建了一个起点为(0,0),终点为(0,0)的直线。

4. 如何将线条写到CAD中

4.1 数据交互原理

首先我们要明白一个事情,就是我们在代码中创建的线条目前是写到内存当中,而CAD的图纸数据是以自己的某种方式,比如文件数据库等等,存储在磁盘中,所以我们就得需要把内存中的数据想办法按照CAD的API调用写到CAD的文件数据库中。

如上图的右边,就是CAD的文件数据存储的过程:Database(数据库)-》BlockTable(块表)-》BlockTableRecord(块表记录)-》Entity(实体数据)。

4.2 代码实现

所以代码如下:

csharp 复制代码
using Autodesk.AutoCAD.ApplicationServices;
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;

namespace LineTest01
{
    public class LineTest
    {
        [CommandMethod("LineDemo")]
        public void LineDemo() {
            //创建线条对象
            Line line = new Line();
            //创建坐标对象
            Point3d start = new Point3d(200, 200, 200);
            Point3d end = new Point3d(430, 400, 400);
            //设置属性
            line.StartPoint = start;
            line.EndPoint = end;
            //声明图形数据库对象
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database database = doc.Database;
            //开启事务处理
            using (Transaction trans = database.TransactionManager.StartTransaction()) {
                //打开块表
                BlockTable  blockTable = (BlockTable)trans.GetObject(database.BlockTableId, OpenMode.ForRead);
                // 打开块表记录
                BlockTableRecord blockTableRecord = (BlockTableRecord)trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                //加直线到块表记录
                blockTableRecord.AppendEntity(line);
                //更新数据
                trans.AddNewlyCreatedDBObject(line, true);
                //事务提交
                trans.Commit();

            }
        }
       
    }
}

然后我们启动服务,加载CAD程序。

4.3 CAD加载.dll程序

csharp 复制代码
输入:NETLOAD

选择.dll文件。

csharp 复制代码
输入:LineDemo

就可以看到我们已经成功地将线条对象写入到CAD中了。

5. 封装工具类

从上面可以看到,其实我们可以将一些常用的方法,封装成公共方法,提高代码的复用性,这里我为大家封装了两个类,分别如下:

BaseTool.cs

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LineTest01
{
    internal static class BaseTool
    {
        /// <summary>
        /// 角度转成弧度
        /// </summary>
        /// <param name="degree">角度参数</param>
        /// <returns>弧度</returns>
        public static Double DegreeToAngle(this Double degree)
        {
            return degree * Math.PI / 180;
        }

        /// <summary>
        /// 弧度转成角度
        /// </summary>
        /// <param name="degree">弧度参数</param>
        /// <returns>角度</returns>
        public static Double AngleToDegree(this Double angle)
        {
            return angle * 180 / Math.PI;
        }
    }
}

AddEntityTool.cs

csharp 复制代码
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LineTest01
{

    //internal 表示只有在同一程序集的文件中才能访问
    internal static class AddEntityTool
    {
        /// <summary>
        /// 将图形对象添加到图形文件中
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="entity">图形对象</param>
        /// <returns></returns>
        public static ObjectId AddEntityToModelSpace(this Database db, Entity entity) {

            //声明ObjectId,用于返回
            ObjectId objectId = ObjectId.Null;
            //开启事务
            using (Transaction trans = db.TransactionManager.StartTransaction()) {

                //打开块表
                BlockTable blockTable = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                //打开块表记录
                BlockTableRecord blockTableRecord= (BlockTableRecord)trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                //添加图形到块表记录
                objectId = blockTableRecord.AppendEntity(entity);
                //更新数据信息
                trans.AddNewlyCreatedDBObject(entity, true);
                //提交事务
                trans.Commit();

            }
            return objectId;
        }


        /// <summary>
        /// 将图形对象添加到图形文件中
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="entity">图形对象 可变参数</param>
        /// <returns>ObjectId</returns>
        public static ObjectId[] AddEntityToModelSpace(this Database db, params Entity[] entities)
        {

            //声明ObjectId,用于返回
            ObjectId[] objectId = new ObjectId[entities.Length];
            //开启事务
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {

                //打开块表
                BlockTable blockTable = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                //打开块表记录
                BlockTableRecord blockTableRecord = (BlockTableRecord)trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                
                for (int i = 0; i < entities.Length; i++)
                {
                    //添加图形到块表记录
                    objectId[i] = blockTableRecord.AppendEntity(entities[i]);
                    //更新数据信息
                    trans.AddNewlyCreatedDBObject(entities[i], true);
                }
                //提交事务
                trans.Commit();

            }
            return objectId;
        }

        /// <summary>
        /// 将图形对象添加到图形文件中
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="startPoint">起点坐标</param>
        /// <param name="endPoint">终点坐标</param>
        /// <returns>ObjectId</returns>
        public static ObjectId AddEntityToModelSpace(this Database db, Point3d startPoint,Point3d endPoint)
        {
            return db.AddEntityToModelSpace(new Line(startPoint, endPoint));
        }

        /// <summary>
        /// 将图形对象添加到图形文件中
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="startPoint">起点坐标</param>
        /// <param name="length">直线长度</param>
        /// <param name="degree">与X轴正方向的夹角</param>
        /// <returns>ObjectId</returns>
        public static ObjectId AddEntityToModelSpace(this Database db, Point3d startPoint, Double length,Double degree)
        {
            //计算终点坐标
            double X = startPoint.X + length * Math.Cos(degree.DegreeToAngle());
            double Y = startPoint.X + length * Math.Sin(degree.DegreeToAngle());
            Point3d endPoint = new Point3d(X, Y, 0);
            return db.AddEntityToModelSpace(new Line(startPoint, endPoint));
        }
    }
}

封装类的使用

csharp 复制代码
        [CommandMethod("LineAdd")]
        public void LineAdd()
        {
            Database workingDatabase = HostApplicationServices.WorkingDatabase;

            Line line = new Line(new Point3d(100, 100, 0), new Point3d(200, 100, 0));
            workingDatabase.AddEntityToModelSpace(line);

            Line line1 = new Line(new Point3d(200, 100, 0), new Point3d(200, 200, 0));
            Line line2 = new Line(new Point3d(200, 100, 0), new Point3d(100, 100, 0));
            workingDatabase.AddEntityToModelSpace(line1,line2);


        }
相关推荐
△曉風殘月〆7 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風8 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_6569747411 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo12 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo14 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发14 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术14 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒15 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
平凡シンプル17 小时前
C# EF 使用
c#
丁德双17 小时前
winform 加载 office excel 插入QRCode图片如何设定位置
c#·excel