2021-07-03C#/CAD二次开发开发函数封装(3)

该博客介绍了在AutoCAD环境中如何通过C#进行图形创建,包括直线和点的定位,并展示了函数封装的概念和应用。通过函数封装,可以简化代码,提高效率,例如将图形添加到模型空间的操作进行了封装,支持一次性添加多个图形。此外,还提供了根据坐标创建直线的方法,以及使用弧度或角度绘制直线的功能。

代码如下:
主函数:Class1.cs

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

namespace _2图形创建
{
    public class LineExam
    {
        [CommandMethod("LineDemo")]
        public void LineDemo()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            AddEnityTool.AddEnityToModelSpace(db, new Point3d(100, 200, 0), new Point3d(200, 100, 0));
            AddEnityTool.AddEnityToModelSpace(db, new Point3d(200, 200, 0), 200, 60);
        }

    }
}

将图形添加到图形文件中 :AddEnityTool.cs

using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

namespace _2图形创建
{
    public static partial class AddEnityTool
    {
        /// <summary>
        /// 将图形对象添加到图像文件中
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="ent">图形对象</param>
        /// <returns>图形的ObjectId</returns>
        public static ObjectId AddEnityToModelSpace(Database db,Entity ent)
        {
            //声明objectId,用于返回
            ObjectId entId = ObjectId.Null;
            //开启事物处理
            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);
                //添加图形到块表记录
                entId = btr.AppendEntity(ent);
                //更新数据信息
                trans.AddNewlyCreatedDBObject(ent, true);
                //提交事物
                trans.Commit();
            }
            return entId;
        }
        /// <summary>
        /// 将图形对象添加到图形文件中
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="ent">图形对象,可变参数</param>
        /// <returns>图形的ObjectId,数组返回</returns>
        public static ObjectId[] AddEnityToModelSpace(Database db, params Entity[] ent)
        {
            //声明objectId,用于返回
            ObjectId[] entId =new ObjectId[ent.Length];
            //开启事物处理
            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);
                
                for (int i = 0; i < ent.Length; i++)
                {
                    //添加图形到块表记录
                    entId[i] = btr.AppendEntity(ent[i]);
                    //更新数据信息
                    trans.AddNewlyCreatedDBObject(ent[i], true);
                }

                //提交事物
                trans.Commit();
            }
            return entId;
        }
        /// <summary>
        /// 绘制直线
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="startPoint">起点坐标</param>
        /// <param name="endPoint">终点坐标</param>
        /// <returns>ObjectId</returns>
        public static ObjectId AddEnityToModelSpace(Database db, Point3d startPoint, Point3d endPoint)
        {
            return AddEnityTool.AddEnityToModelSpace(db, new Line(startPoint, endPoint));
        }
        /// <summary>
        /// 绘制直线
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="startPoint">起点坐标</param>
        /// <param name="lenght">直线长度</param>
        /// <param name="degree">与X轴正方向的夹角</param>
        /// <returns>ObjectId</returns>
        public static ObjectId AddEnityToModelSpace(Database db, Point3d startPoint, Double lenght, double degree)
        {
            double X = startPoint.X+lenght*Math.Cos(BaseTool.DegreeToAngle(degree));
            double Y = startPoint.X + lenght * Math.Sin(BaseTool.DegreeToAngle(degree));
            Point3d endPoint = new Point3d(X,Y,0);
            return AddEnityTool.AddEnityToModelSpace(db,new Line(startPoint, endPoint));
        }
    }
}

弧度与角度转换:BaseTool.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace _2图形创建
{
    public static partial class BaseTool
    {
        /// <summary>
        /// 角度转换弧度
        /// </summary>
        /// <param name="degree">角度值</param>
        /// <returns></returns>
        public static double DegreeToAngle(Double degree)
        {
            return degree * Math.PI / 180;
        }
        /// <summary>
        /// 弧度转换角度
        /// </summary>
        /// <param name="angle">弧度值</param>
        /// <returns></returns>
        public static double AngleToDegree(double angle)
        {
            return angle * 180 / Math.PI;
        }
    }
}

什么是函数封装?
个人理解函数封装就像“炸鸡”与“蘸料”

根据每个人的口味不同,配不同的“蘸料”:藤椒、麻辣、孜然、沙拉、番茄、秘制蘸料等,不同的蘸料就像可以进行封装的函数。

而未对“蘸料”进行封装的函数就像:我们每做一个“炸鸡”,就要自己同时做一份“蘸料”,而且做蘸料时容易被客户看到加工过程,“秘制蘸料”的配方容易被偷学。

封装后的函数:我们做“炸鸡”同时,告诉后厨需要一份“蘸料”,我们只需要给他传递一个“需要什么蘸料”的信息,他给我们“需要的蘸料”,我们不需要记住“蘸料”详细的加工步骤,所有的过程都是后厨进行,此过程相对客户来说是保密的。

我们现在要做到就是要对函数进行封装。

class1.cs

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

namespace _2图形创建
{
    public class LineExam
    {
        [CommandMethod("LineDemo")]
        public void LineDemo()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Line line1 = new Line(new Point3d(100, 100, 0), new Point3d(200, 200, 0));
            AddEnityTool add =new AddEnityTool();
            add.AddEnityToModelSpace(db, line1);
        }
    }
}

AddEnityTool.cs

using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

namespace _2图形创建
{
    public  partial class AddEnityTool
    {
        /// <summary>
        /// 将图形对象添加到图像文件中
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="ent">图形对象</param>
        /// <returns>图形的ObjectId</returns>
        public  ObjectId AddEnityToModelSpace(Database db,Entity ent)
        {
            //声明objectId,用于返回
            ObjectId entId = ObjectId.Null;
            //开启事物处理
            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);
                //添加图形到块表记录
                entId = btr.AppendEntity(ent);
                //更新数据信息
                trans.AddNewlyCreatedDBObject(ent, true);
                //提交事物
                trans.Commit();
            }
            return entId;
        }
    }
}

代码解释:

public  partial class AddEnityTool

首先我们创建了一个新的类AddEnityTool

public  ObjectId AddEnityToModelSpace(Database db,Entity ent)

创建一个方法,以及db与ent两个对象用来传参

Database db = HostApplicationServices.WorkingDatabase;

获取或设置在具有焦点的文档(窗口)中打开的主数据库。个人理解HostApplicationServices为CAD程序,WorkingDatabase为当前数据库。

add.AddEnityToModelSpace(db, line1);

向AddEnityToModelSpace方法传递参数

//声明objectId,用于返回
ObjectId entId = ObjectId.Null;

声明一个对象,用来返回值

代码改进:

①不用new()db

public  static ObjectId AddEnityToModelSpace(Database db,Entity ent)

我们将这里的方法设置为静态

Line line1 = new Line(new Point3d(100, 100, 0), new Point3d(200, 200, 0));
AddEnityTool.AddEnityToModelSpace(db, line1);

就可以不用去new一个对象add,再调用AddEnityToModelSpace方法了

Line line1 = new Line(new Point3d(100, 100, 0), new Point3d(200, 200, 0));
Line line2 = new Line(new Point3d(100, 100, 0), new Point3d(100, 200, 0));
AddEnityTool.AddEnityToModelSpace(db, line1);
AddEnityTool.AddEnityToModelSpace(db, line2);

②传递多个参数

但我们需要添加多条线段时可能需要多次调用AddEnityToModelSpace方法,每次调用方法都要进行一次事物处理,那用什么方法可以一次性传递多个参数呢?

public static ObjectId[] AddEnityToModelSpace(Database db, params Entity[] ent)

我们重新写了一个方法,这里要介绍一下什么是方法重载:
以下转自https://m.jb51.net/article/36735.htm

首先解释一下什么是方法重载?

方法重载是指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与他匹配的方法执行操作的一种技术。

这里所说的参数不同是指以下几种情况:

① 参数的类型不同
② 参数的个数不同
③ 参数的个数相同时他们的先后顺序不同

注意:系统会认为是同一个方法的两种情况,这样的两个方法不可以在同一个类里,否则系统会报错。

⑴返回类型不同,方法名和参数个数、顺序、类型都相同的两个方法
⑵返回类型相同,方法名和参数的个数、顺序、类型都相同的两个方法,但是参数的名字不同

上文中params 是C#的关键字, params主要是在声明方法时参数类型或者个数不确定时使用
将ent定义为数组类型,用来接收多个参数

ObjectId[] entId = new ObjectId[ent.Length];

定义entId为数组形式,用来返回

for (int i = 0; i < ent.Length; i++)
{
    //添加图形到块表记录
    entId[i] = btr.AppendEntity(ent[i]);
    //更新数据信息
    trans.AddNewlyCreatedDBObject(ent[i], true);
}

通过for循环来实现多次的图形添加到快表与更新

Database db = HostApplicationServices.WorkingDatabase;
Line line1 = new Line(new Point3d(100, 100, 0), new Point3d(200, 200, 0));
Line line2 = new Line(new Point3d(100, 100, 0), new Point3d(100, 200, 0));
Line line3 = new Line(new Point3d(100, 100, 0), new Point3d(400, 200, 0));
AddEnityTool.AddEnityToModelSpace(db, line1,line2,line3);

如何我们就可以同时传递多个参数,但又无需多次开关事物处理了。

③不在函数里创建直线,只给封装函数传递点

不在主函数里创建直线,直接给封装好的函数里传递起始坐标和终点坐标。

AddEnityTool.AddEnityToModelSpace(db,new Point3d(100, 100, 0), new Point3d(200, 200, 0));

向AddEnityToModelSpace传递坐标

public static ObjectId AddEnityToModelSpace(Database db, Point3d startPoint, Point3d endPoint)
{
    return AddEnityTool.AddEnityToModelSpace(db, new Line(startPoint, endPoint));
}

当前方法接收到参数后将返回值传递给

public  static ObjectId AddEnityToModelSpace(Database db,Entity ent)

进行最开始的运行

通过弧度或角度画直线

此方法没有什么可以讲的,仅仅只是涉及了几个数学公式,略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值