Cad二次开发小工具
角度转弧度
/// <summary>
/// 角度转弧度
/// </summary>
/// <param name="degree">角度</param>
/// <returns>弧度</returns>
public static double DegreeToAngle(this double degree)
{
return degree * (Math.PI / 180);
}
弧度转角度
/// <summary>
/// 弧度转角度
/// </summary>
/// <param name="angle">弧度</param>
/// <returns>角度</returns>
public static double AngleToDegree(this double angle)
{
return 180 / Math.PI * angle;
}
判断三点是否在同一条直线上
/// <summary>
/// 判断三点是否在同一条直线上
/// </summary>
/// <param name="firstPoint">第一个点</param>
/// <param name="secondPoint">第二个点</param>
/// <param name="thirdPoint">第三个点</param>
/// <returns></returns>
public static bool IsOnOneLine(this Point3d firstPoint, Point3d secondPoint, Point3d thirdPoint)
{
Vector3d v21 = secondPoint.GetVectorTo(firstPoint);
Vector3d v23 = secondPoint.GetVectorTo(thirdPoint);
if (v21.GetAngleTo(v23) == 0 || v21.GetAngleTo(v23) == Math.PI)
{
return true;
}
else
{
return false;
}
}
获取向量与X轴正方向角度
/// <summary>
/// 获取向量与X轴正方向角度
/// </summary>
/// <param name="startPoint">起点</param>
/// <param name="endPoint">终点</param>
/// <returns></returns>
public static double GetAngleToXAxis(this Point3d startPoint, Point3d endPoint)
{
//声明一个与x轴平行的量
Vector3d temp = new Vector3d(1, 0, 0);
//获取起点到终点的向量
Vector3d VsToe = startPoint.GetVectorTo(endPoint);
return VsToe.Y > 0 ? temp.GetAngleTo(VsToe) : -temp.GetAngleTo(VsToe);
}
两点之前的距离
/// <summary>
/// 两点之前的距离
/// </summary>
/// <param name="point1"></param>
/// <param name="point2"></param>
/// <returns></returns>
public static double GetDistanceBetweenTwoPoint(this Point3d point1,Point3d point2)
{
return point1.DistanceTo(point2);
}
获取两点的中心点
/// <summary>
/// 获取两点的中心点
/// </summary>
/// <param name="point1">第一个点</param>
/// <param name="point2">第二个点</param>
/// <returns>中心点</returns>
public static Point3d GetCenterPointBetweenTwoPoint(this Point3d point1, Point3d point2)
{
return new Point3d((point1.X + point2.X) / 2, (point1.Y + point2.Y) / 2, (point1.Z + point2.Z) / 2);
}
将图形对象添加到图形文件中1
/// <summary>
/// 将图形对象添加到图形文件中
/// </summary>
/// <param name="db">图形数据库</param>
/// <param name="entity">图形对象</param>
/// <returns>图形的objectid</returns>
public static ObjectId AddEntityToModelSpace(this Database db,Entity entity)
{
//声明ObjectId,用于返回
ObjectId entityId = 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);
//添加图形到块表记录
entityId = btr.AppendEntity(entity);
//更新数据信息
trans.AddNewlyCreatedDBObject(entity, true);
//提交
trans.Commit();
}
return entityId;
}
将图形对象添加到图形文件中2
/// <summary>
/// 将图形对象添加到图形文件中
/// </summary>
/// <param name="db">图形数据库</param>
/// <param name="entity">图形对象,可变参数</param>
/// <returns>图形的objectId,数组返回</returns>
public static ObjectId[] AddEntityToModelSpace(this Database db,params Entity[] entity)
{
//声明ObjectId 用于返回
ObjectId[] entityId = new ObjectId[entity.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 < entity.Length; i++)
{
//添加图形到块表记录
entityId[i] = btr.AppendEntity(entity[i]);
//更新数据消息
trans.AddNewlyCreatedDBObject(entity[i],true);
}
trans.Commit();
}
return entityId;
}
添加到Database
public static ObjectId AddToDatabase<TEntity>(this TEntity entity, Transaction host, BlockTableRecord btr)
where TEntity : Entity
{
if (entity is null) return ObjectId.Null;
var id = btr.AppendEntity(entity);
host.AddNewlyCreatedDBObject(entity, true);
return id;
}
public static List<ObjectId> AddToDatabase<TEntity>(this ICollection<TEntity> entities, Transaction host, BlockTableRecord model_space)
where TEntity : Entity
{
return entities.Select(entity =>
{
var id = model_space.AppendEntity(entity);
host.AddNewlyCreatedDBObject(entity, true);
return id;
}).ToList();
}
两点绘制直线
/// <summary>
/// 绘制直线
/// </summary>
/// <param name="db">图形数据库</param>
/// <param name="startPoint">起点坐标</param>
/// <param name="endPoint">终点坐标</param>
/// <returns>ObjectId</returns>
public static ObjectId AddLineToModelSpace(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 AddLineToModelSpace(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.AddEntityToModelSpace(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>ObjectId</returns>
public static ObjectId AddArcToModelSpace(this Database db,Point3d center,double radius,double startDegree,double endDegree)
{
return db.AddEntityToModelSpace(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>ObjectId</returns>
public static ObjectId AddArcToModelSpace(this Database db,Point3d startPoint,Point3d pointOnArc,Point3d endPoint)
{
//创建几何类对象
CircularArc3d cArc = new CircularArc3d(startPoint,pointOnArc,endPoint);
//先判断三点是否在同一条直线上
if (startPoint.IsOnOneLine(pointOnArc,endPoint))
{
return ObjectId.Null;
}
//创建圆弧对象
Arc arc = new Arc(cArc.Center,cArc.Radius,cArc.Center.GetAngleToXAxis(startPoint),cArc.Center.GetAngleToXAxis(endPoint));
// 加入图形数据库
return db.AddEntityToModelSpace(arc);
}
通过圆心、起点夹角绘制圆弧
/// <summary>
/// 通过圆心、起点夹角绘制圆弧
/// </summary>
/// <param name="db">图形数据库</param>
/// <param name="center">圆心</param>
/// <param name="startPoint">起点</param>
/// <param name="degree">夹角,角度值</param>
/// <returns>ObjectId</returns>
public static ObjectId AddArcToModelSpace(this Database db,Point3d center,Point3d startPoint,double degree)
{
//获取半径
double radius = center.GetDistanceBetweenTwoPoint(startPoint);
//获取起点角度
double startAngle = center.GetAngleToXAxis(startPoint);
//声明圆弧对象
Arc arc = new Arc(center,radius,startAngle,startAngle+degree.DegreeToAngle());
return db.AddEntityToModelSpace(arc);
}
删除图形对象
/// <summary>
/// 删除图形对象
/// </summary>
/// <param name="entId">图形对象的ObjectId</param>
public static void EraseEntity(this ObjectId entId)
{
//打开事务处理
using (Transaction trans = entId.Database.TransactionManager.StartTransaction())
{
//打开要删除的图形对象
Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
//删除
ent.Erase();
trans.Commit();
}
}
获得直线的起点坐标
/// <summary>
/// 获得直线的起点坐标
/// </summary>
/// <param name="lineId">直线对象的ObjectId</param>
/// <returns></returns>
private Point3d GetLineStartPoint(ObjectId lineId)
{
Point3d startPoint;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Line line = (Line)lineId.GetObject(OpenMode.ForRead);
startPoint = line.StartPoint;
}
return startPoint;
}
偏移曲线
/// <summary>
/// 偏移曲线
/// </summary>
/// <param name="curves">偏移曲线</param>
/// <param name="dis">偏移距离</param>
/// <returns>偏移后对象集合</returns>
public List<Curve> OffSet(List<Curve> curves,double dis)
{
List<Curve> curveList = new List<Curve>();
for (int i = 0; i < curves.Count; i++)
{
DBObjectCollection offCur = curves[i].GetOffsetCurves(dis);
foreach (var c in offCur)
{
Curve curve = (Curve)c;
curveList.Add(curve);
}
}
return curveList;
}
添加图层
/// <summary>
/// 添加图层
/// </summary>
/// <param name="layName"></param>
/// <param name="Index"></param>
public void AddLayer(string layName, int Index)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
string LayerName = "";
using (Transaction trans = db.TransactionManager.StartTransaction())
{
LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
if (lt.Has(layName))
{
ed.WriteMessage($"\n <{layName}>图层已存在!");
}
else
{
LayerName = layName;
LayerTableRecord ltr = new LayerTableRecord();
ltr.Name = LayerName;
//short indexColor = (short)(Index % 256);
short indexColor = (short)(Index);
ltr.Color = Color.FromColorIndex(ColorMethod.ByLayer, indexColor);
ObjectId layerId = lt.Add(ltr);
trans.AddNewlyCreatedDBObject(ltr, true);
db.Clayer = layerId;
}
trans.Commit();
}
}
获取所有图层名称
// 获取当前文档
Document doc = Application.DocumentManager.MdiActiveDocument;
// 获取当前数据库
Database db = doc.Database;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
// 打开图层表
var lt = trans .GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
// 遍历图层表
foreach (ObjectId id in lt)
{
var ltr = trans .GetObject(id, OpenMode.ForRead) as LayerTableRecord;
// 输出图层名称
doc.Editor.WriteMessage(ltr.Name + "\n");
}
trans .Commit();
}
更多工具源码可以到这里下载:
gitee(码云):CadDotNetTools
最近把工具做成了NuGet包
https://www.nuget.org/packages/AuotoCAD.EntityTool/1.0.2#show-readme-container