# 0. 引言
由于很多代码都是重复性的,比如之前我们封装在.cs类文件中的工具性代码,包括用于添加图形实体的AddEntityTools.cs、填充工具类HatchTools.cs、以及基本工具类BaseTools.cs
这些类文件我们可以进一步封装成一个dll库文件,这样使用的时候添加进来,然后在头文件中添加命名空间即可!
这样会方便很多!
# 1. 封装dll库
新建一个项目,添加引用
新建三个类:添加图形实体的类AddEntityTools.cs、填充工具类HatchTools.cs、以及基本工具类BaseTools.cs
然后把之前的代码都加进来
AddEntityTools.cs
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 AcDoNetTools
{
public static partial class AddEntityTools
{
/// <summary>
/// 将图形对象添加到图形文件中
/// </summary>
/// <param name="db">图形数据库</param>
/// <param name="ent">图形对象</param>
/// <returns>图形的ObjectId</returns>
public static ObjectId AddEntityToModeSpace(this 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[] AddEntityToModeSpace(this 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></returns>
public static ObjectId AddLineToModeSpace(this Database db, Point3d startPoint, Point3d endPoint)
{
return db.AddEntityToModeSpace(new Line(startPoint, endPoint));
}
/// <summary>
/// 起点坐标,角度,长度 绘制直线
/// </summary>
/// <param name="db">图形数据库</param>
/// <param name="startPoint">起点</param>
/// <param name="length">长苏</param>
/// <param name="degree">角度</param>
/// <returns></returns>
public static ObjectId AddLineToModeSpace(this Database db, Point3d startPoint, Double length, Double degree)
{
// 利用长度和角度以及起点 计算终点坐标
double X = startPoint.X + length * Math.Cos(degree.DegreeToAngle());
double Y = startPoint.Y + length * Math.Sin(degree.DegreeToAngle());
Point3d endPoint = new Point3d(X, Y, 0);
return db.AddEntityToModeSpace(new Line(startPoint, endPoint));
}
// 封装圆弧对象函数
/// <summary>
/// 绘制圆弧
/// </summary>
/// <param name="db">图形数据库</param>
/// <param name="center">中心</param>
/// <param name="radius">半径</param>
/// <param name="startDegree">起始角度</param>
/// <param name="endDegree">终止角度</param>
/// <returns></returns>
public static ObjectId AddArcToModeSpace(this Database db, Point3d center, double radius, double startDegree, double endDegree)
{
return db.AddEntityToModeSpace(new Arc(center, radius, startDegree.DegreeToAngle(), endDegree.DegreeToAngle()));
}
/// <summary>
/// 三点画圆弧
/// </summary>
/// <param name="db">数据库对象</param>
/// <param name="startPoint">起点</param>
/// <param name="pointOnArc">圆弧上一点</param>
/// <param name="endPoint">终点</param>
/// <returns></returns>
public static ObjectId AddArcToModeSpace(this Database db, Point3d startPoint, Point3d pointOnArc, Point3d endPoint)
{
// 先判断是否在同一条直线上
if (startPoint.IsOnOneLine(pointOnArc, endPoint))
{
return ObjectId.Null;
}
// 创建几何对象
CircularArc3d cArc = new CircularArc3d(startPoint, pointOnArc, endPoint);
// 通过几何对象获取其属性
double r