代码如下:
主函数: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)
进行最开始的运行
通过弧度或角度画直线
此方法没有什么可以讲的,仅仅只是涉及了几个数学公式,略
该博客介绍了在AutoCAD环境中如何通过C#进行图形创建,包括直线和点的定位,并展示了函数封装的概念和应用。通过函数封装,可以简化代码,提高效率,例如将图形添加到模型空间的操作进行了封装,支持一次性添加多个图形。此外,还提供了根据坐标创建直线的方法,以及使用弧度或角度绘制直线的功能。
&spm=1001.2101.3001.5002&articleId=118438105&d=1&t=3&u=8ffdfae85a674669b524ca3aecf00530)
2267

被折叠的 条评论
为什么被折叠?



