c# CAD二次开发 类库 创建各种图形、直线、圆、多段线、正方形、点等
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 _02创建图形
{
public static partial class AddEntityTool
{
///
/// 将图形对象添加到图形文件中
///
/// 图形数据库
/// 图形对象
/// 图形的ObjectId
public static ObjectId AddEnityToModelSpace(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;
}
///
/// 将图形对象添加到图形文件中
///
/// 图形数据库
/// 图形对象,可变参数
/// 图形的ObjectId,数组返回
public static ObjectId[] AddEnityToModelSpace(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;
}
///
/// 绘制直线
///
/// 图形数据库
/// 起点坐标
/// 终点坐标
/// ObjectId
public static ObjectId AddLineToModelSpace(this Database db, Point3d startPoint, Point3d endPoint)
{
return db.AddEnityToModelSpace(new Line(startPoint, endPoint));
}
///
/// 绘制直线
///
/// 图形数据库
/// 起点坐标
/// 直线长度
/// 与X轴正方向的角度
/// ObjectId
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.AddEnityToModelSpace(new Line(startPoint, endPoint));
}
///
/// 绘制圆弧
///
/// 图形数据库
/// 圆弧所在圆的圆心点
/// 圆弧的半径
/// 圆弧的起始角度
/// 圆弧的终止角度
/// ObjectId
public static ObjectId AddArcToModelSpace(this Database db, Point3d center, double radius, double startDegree, double endDegree)
{
return db.AddEnityToModelSpace(new Arc(center, radius, startDegree.DegreeToAngle(), endDegree.DegreeToAngle()));
}
///
/// 通过三点创建圆弧
///
/// 图形数据库
/// 起点
/// 圆弧上的点
/// 终点
///
public static ObjectId AddArcToModelSpace(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 radius = cArc.Radius; //半径
//Point3d center = cArc.Center; //所在圆的圆心
//Vector3d cs = center.GetVectorTo(startPoint); //圆心到起点的向量
//Vector3d ce = center.GetVectorTo(endPoint); //圆心到终点的向量
//Vector3d xVector = new Vector3d(1, 0, 0); //X正方向的向量
圆弧的起始角度
//double startAngle = cs.Y > 0 ? xVector.GetAngleTo(cs) : -xVector.GetAngleTo(cs);
圆弧的终止角度
//double endAngle = ce.Y > 0 ? xVector.GetAngleTo(ce) : -xVector.GetAngleTo(ce);

        //创建圆弧对象Arc arc = new Arc(cArc.Center, cArc.Radius, cArc.Center.GetAngleToXAxis(startPoint), cArc.Center.GetAngleToXAxis(endPoint));//加入图形数据库return db.AddEnityToModelSpace(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.AddEnityToModelSpace(arc);}/// <summary>/// 绘制圆/// </summary>/// <param name="db">图形据据库</param>/// <param name="center">圆心</param>/// <param name="radius">半径</param>/// <returns>ObjectId</returns>public static ObjectId AddCircleModelSpace(this Database db, Point3d center, double radius){return db.AddEnityToModelSpace(new Circle(center, new Vector3d(0, 0, 1), radius));}/// <summary>/// 两点绘制圆/// </summary>/// <param name="db">图形数据库</param>/// <param name="point1">第一个点</param>/// <param name="point2">第二个点</param>/// <returns>ObjectId</returns>public static ObjectId AddCircleModelSpace(this Database db, Point3d point1, Point3d point2){//获取中心点Point3d center = point1.GetCenterPointBetweenTwoPoint(point2);//获取半径double radius = point1.GetDistanceBetweenTwoPoint(center);return db.AddCircleModelSpace(center, radius);}/// <summary>/// 三点绘制圆/// </summary>///<param name="db">图形数据库</param>/// <param name="point1">第一个点</param>/// <param name="point2">第二个点</param>/// <param name="point3">第三个点</param>/// <returns>ObjectId</returns>public static ObjectId AddCircleModelSpace(this Database db, Point3d point1, Point3d point2, Point3d point3){//先判断三点是否在同一条直线上if (point1.IsOnOneLine(point2, point3)){return ObjectId.Null;}//声明几何类的CircularArc3d对象CircularArc3d cArc = new CircularArc3d(point1, point2, point3);return db.AddCircleModelSpace(cArc.Center, cArc.Radius);}/// <summary>/// 绘制折线多段线/// </summary>/// <param name="db">图形数据库</param>/// <param name="isClosed">是否闭合</param>/// <param name="constantWidth">线宽</param>/// <param name="vertices">多段线的定点,可变参数</param>/// <returns>ObjectId</returns>public static ObjectId AddPolyLineToModelSpace(this Database db, bool isClosed, double constantWidth, params Point2d[] vertices){if (vertices.Length < 2 ){return ObjectId.Null;}//声明一个多段线对象Polyline pLine = new Polyline();//添加多段线的顶点for (int i = 0; i < vertices.Length; i++){pLine.AddVertexAt(i, vertices[i], 0, 0, 0);}//判断是否闭合if (isClosed){pLine.Closed = true;}//设置多段线的线宽pLine.ConstantWidth = constantWidth;return db.AddEnityToModelSpace(pLine);}/// <summary>/// 绘制矩形/// </summary>/// <param name="db">图形数据库</param>/// <param name="point1">第一个点</param>/// <param name="point2">对角点</param>/// <returns>ObjectId</returns>public static ObjectId AddRectToModelSpace(this Database db, Point2d point1, Point2d point2){//声明多段线Polyline pLine = new Polyline();//计算矩形的四个顶点坐标Point2d p1 = new Point2d(Math.Min(point1.X, point2.X), Math.Min(point1.Y, point2.Y));Point2d p2 = new Point2d(Math.Max(point1.X, point2.X), Math.Min(point1.Y, point2.Y));Point2d p3 = new Point2d(Math.Max(point1.X, point2.X), Math.Max(point1.Y, point2.Y));Point2d p4 = new Point2d(Math.Min(point1.X, point2.X), Math.Max(point1.Y, point2.Y));//添加多段线的顶点pLine.AddVertexAt(0, p1, 0, 0, 0);pLine.AddVertexAt(0, p2, 0, 0, 0);pLine.AddVertexAt(0, p3, 0, 0, 0);pLine.AddVertexAt(0, p4, 0, 0, 0);//闭合多段线pLine.Closed = true;return db.AddEnityToModelSpace(pLine);}/// <summary>/// 绘制内接正多边形/// </summary>/// <param name="db">图形数据库</param>/// <param name="center">多边形所在圆的圆心</param>/// <param name="radius">所在圆的半径</param>/// <param name="sideNum">边数</param>/// <param name="startDegree">起始角度</param>/// <returns>ObjectId</returns>public static ObjectId AddPolygonToModelSpace(this Database db, Point2d center,double radius,int sideNum,double startDegree){//声明多段线对象Polyline pLine = new Polyline();//判断边数是否符合要求if (sideNum < 3){return ObjectId.Null;}Point2d[] point = new Point2d[sideNum];double angle = startDegree.DegreeToAngle();//计算每个顶点的坐标for (int i = 0; i < sideNum; i++){point[i] = new Point2d(center.X + radius * Math.Cos(angle), center.Y + radius * Math.Sin(angle));pLine.AddVertexAt(i, point[i], 0, 0, 0);angle += Math.PI * 2 / sideNum;}//闭合多段线pLine.Closed = true;return db.AddEnityToModelSpace(pLine);}/// <summary>/// 绘制椭圆/// </summary>/// <param name="db">图形数据库</param>/// <param name="center">椭圆中心</param>/// <param name="majorRadius">长轴长度</param>/// <param name="shortRadius">短轴长度</param>/// <param name="degere">长轴与X轴夹角,角度值</param>/// <param name="startDegree">起始角度</param>/// <param name="endDegree">终止角度</param>/// <returns>ObjectId</returns>public static ObjectId AddEllipseToModelSpace(this Database db, Point3d center, double majorRadius, double shortRadius, double degere,double startDegree,double endDegree){//计算相关参数double ratio = shortRadius/majorRadius;Vector3d majorAxis = new Vector3d(majorRadius * Math.Cos(degere.DegreeToAngle()),majorRadius * Math.Sin(degere.DegreeToAngle()),0);//(new Point3d(100, 100, 0), Vector3d.ZAxis, new Vector3d(100, 0, 0), 0.4, 0, 2*Math.PI);//声明椭圆对象Ellipse elli = new Ellipse(center, Vector3d.ZAxis, majorAxis, ratio, startDegree.DegreeToAngle(), endDegree.DegreeToAngle());return db.AddEnityToModelSpace(elli);}/// <summary>/// 绘制椭圆/// </summary>/// <param name="db">图形数据库</param>/// <param name="majorPoint1">长轴端点1</param>/// <param name="majorPoint2">长轴端点2</param>/// <param name="shortRadius">短轴的长度</param>/// <returns>ObjectId</returns>public static ObjectId AddEllipseToModelSpace(this Database db, Point3d majorPoint1, Point3d majorPoint2, double shortRadius){//椭圆的圆心Point3d center = majorPoint1.GetCenterPointBetweenTwoPoint(majorPoint2);//短轴与长轴的比double ratio = 2*shortRadius / majorPoint1.GetDistanceBetweenTwoPoint(majorPoint2);//长轴的向量Vector3d majorAxis = majorPoint2.GetVectorTo(center);Ellipse elli = new Ellipse(center, Vector3d.ZAxis,majorAxis, ratio, 0, 2 * Math.PI);return db.AddEnityToModelSpace(elli);}/// <summary>/// 绘制椭圆/// </summary>/// <param name="db">图形数据库</param>/// <param name="point1">所在矩形的顶点1</param>/// <param name="point2">所在矩形的顶点1</param>/// <returns>ObjectId</returns>public static ObjectId AddEllipseToModelSpace(this Database db, Point3d point1, Point3d point2){//椭圆的圆心Point3d center = point1.GetCenterPointBetweenTwoPoint(point2);double ratio = Math.Abs((point1.Y - point2.Y)/(point1.X - point2.X) );Vector3d majorVector = new Vector3d(Math.Abs((point1.X - point2.X)) / 2, 0, 0);//声明椭圆对象Ellipse elli = new Ellipse(center, Vector3d.ZAxis, majorVector, ratio, 0, 2 * Math.PI);return db.AddEnityToModelSpace(elli);}
}

}

c# CAD二次开发 类库 创建各种图形、直线、圆、多段线、正方形、点等相关推荐

  1. c# cad 二次开发 类库 netload 图层操作、创建图层、删除图层、设置当前图层等

    c# cad 二次开发 类库 netload 图层操作.创建图层.删除图层.设置当前图层等 using Autodesk.AutoCAD.ApplicationServices; using Auto ...

  2. c# cad 二次开发 类库 对话框 将frame界面添加到类库中

    c# cad 二次开发 类库 对话框 将frame界面添加到类库中 using System; using System.Collections.Generic; using System.Compo ...

  3. c# cad 二次开发 类库 块的操作

    c# cad 二次开发 类库 块的操作 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServi ...

  4. c# cad 二次开发 类库 CAD表格的操作,给CAD添加一个表格

    c# cad 二次开发 类库 CAD表格的操作,给CAD添加一个表格 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCA ...

  5. CAD二次开发之创建道路

    在CAD中一般通过先绘制道路中心线,之后对中心线的圆角化及偏移等操作达到道路绘制的效果(流程如图一).但是当需要绘制大量道路特别是道路存在交叉等情况时这种方式显然很低效,对设计人员来讲可能成为一件令人 ...

  6. CAD 二次开发之创建包含文字的线型

    1. 简介: 在CAD制图时,为了区分线条往往需要用到包含文字或特殊符号的线型,在这里就分享一个创建包含文字线型的插件. 线型的定义这里就不赘述了,大家可以看两个帖子: ObjectARX创建带文字的 ...

  7. CAD二次开发-c#创建Excel表格及其一系列简单应用

    创建Excel 创建Excel必要索引库:NetOffice 需版本对应 Excel.Application application = new Excel.Application();Excel.W ...

  8. CAD 二次开发 图层操作(1)创建图层

    CAD二次开发的资料比较少,除了李冠亿先生的<深居浅出AutoCAD二次开发>这本书之外,目前没有找到合适的参考资料.现将自己工作中用的的一些方法贴出来.方便各位网友快速入门. #regi ...

  9. CAD二次开发C#.Net编程-CAD创建右键菜单

    CAD二次开发&C#.Net编程-CAD创建右键菜单 private static ContextMenuExtension m_ContextMenu;//装载右键菜单public stat ...

最新文章

  1. ArXiv 2020 | 抖音“变身漫画”滤镜背后的技术,难道来自这篇论文?
  2. redis php异步队列,基于workerman的redis-queue实现异步邮件队列
  3. 创建细分客户的无监督学习项目
  4. Eclipse Open J9:Eclipse OMR项目提供的开源JVM
  5. 登录界面设计及功能实现
  6. php实例之简单的留言板,PHP实例一之简单的留言板
  7. TCP流量控制与拥塞控制区别
  8. 验证日期时间的正则表达式
  9. python删除特定的几行数据_Python:分成几行,并根据搜索删除特定行 - python
  10. JavaScript - 理解面向对象编程
  11. 各大网站的wap站页面
  12. 智能马桶盖FCC认证 家电检测认证标准及要求
  13. 爬取新型冠状病毒的历史数据
  14. OpenCV图像运算+Moviepy实现视频旋转叠加
  15. 如何解决浏览器的兼容性
  16. 格式工厂去广告版|格式工厂(Format Factory)免费版下载 v4.8.0
  17. 王半仙儿的日记-0004
  18. 微型计算机中奇偶校验,奇偶校验
  19. 小说文学行业之“盛大文学”
  20. 疯狂动物城 zootopia

热门文章

  1. 从事MG动画行业还有前途吗?
  2. IBM LSF解决方案客户案例—— EDA三巨头之 Mentor Graphics(明导)
  3. 所有开源项目免费使用,GitHub 内置 CI/CD 终于来了!
  4. 你为什不是富人? 富人不说穷人不懂
  5. 110米栏排名:刘翔被梅里特超越 让出榜首位置
  6. custom validator check failed for prop “index“.
  7. 计算机科学与技术同等学力考试试题及答案
  8. TFN DC700S手持式无线电监测接收机
  9. 机械臂运动空间的计算_机械臂运动规划(Motion Planning)
  10. 快速比对两份合同差异——免费使用的合同比对工具