代码如下:
ArcExam.cs

using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;namespace _2图形创建
{public class ArcExam{[CommandMethod("ArcDemo")]public void ArcDemo(){Arc arc1 = new Arc();arc1.Center = new Point3d(0, 0, 0);arc1.StartAngle = 0;arc1.EndAngle = Math.PI;arc1.Radius = 100;double startDegree = 45;Arc arc2 = new Arc(new Point3d(500, 500, 0), 20,BaseTool.DegreeToAngle(startDegree), Math.PI);Arc arc3 = new Arc(new Point3d(100, 100, 0), new Vector3d(0, 0, 1), 20, Math.PI / 4, Math.PI / 2);Database db = HostApplicationServices.WorkingDatabase;AddEnityTool.AddEnityToModelSpace(db, arc1,arc2,arc3);}}
}

代码解析:
以上代码基本是为了介绍CAD里圆弧方法的用法

Arc arc1 = new Arc();
arc1.Center = new Point3d(0, 0, 0);
arc1.StartAngle = 0;
arc1.EndAngle = Math.PI;
arc1.Radius = 100;

Center 圆心坐标;StartAngle 开始弧度;EndAngle 结束弧度;Radius 半径;
注意此处的属性是弧度

double startDegree = 45;
Arc arc2 = new Arc(new Point3d(500, 500, 0), 20,BaseTool.DegreeToAngle(startDegree), Math.PI);

这里也是弧度值,我们通过先前创建的角度转弧度方法将45度转换为弧度
从左至右,依次是圆心、半径、开始弧度、结束弧度。
arc3涉及Vector3d,我画二维图,用不到,指的是笛卡尔坐标。

三点绘制圆弧
代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;namespace _2图形创建
{public class ArcExam{[CommandMethod("ArcDemo")]public void ArcDemo(){Database db = HostApplicationServices.WorkingDatabase;Point3d startPoint = new Point3d(100, 100, 0);Point3d endPoint = new Point3d(200, 200, 0);Point3d pointOnArc = new Point3d(150, 100, 0);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);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(center,radius,startAngle,endAngle);AddEnityTool.AddEnityToModelSpace(db, arc);}}
}

代码解释:

Database db = HostApplicationServices.WorkingDatabase;
Point3d startPoint = new Point3d(100, 100, 0);
Point3d endPoint = new Point3d(200, 200, 0);
Point3d pointOnArc = new Point3d(150, 100, 0);
CircularArc3d cArc = new CircularArc3d(startPoint,pointOnArc,endPoint);

创建了三个点,然后通过CircularArc3d方法创建了一个圆弧对象

尝试用ARC方法实现三点画圆

double radius = cArc.Radius;
Point3d center = cArc.Center;

首先获取上面圆弧的半径和中心点。

Vector3d cs = center.GetVectorTo(startPoint);
Vector3d ce = center.GetVectorTo(endPoint);

此处代码可以通过GetVectorTo方法分别获得圆心到两个点的向量。

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);

通过GetAngleTo获得两个向量之间的夹角(弧度值),因为GetAngleTo获得的夹角(此为弧度制)都为正值,通过判断来取其负值,即可画出这个圆弧

如上图,红线、绿线与X轴的夹角都是42°,GetAngleTo获得的值都是42°的弧度值(正值),所以为了区分,做一个判断,startPoint或endPoint的Y坐标为负值时返回一个负的弧度值。

对上面创建圆弧的代码页封装到AddEnityTool.cs中

首先将判断X轴夹角是在X轴上方还是下方的代码封装到BaseTool.cs中

        /// <summary>/// 获取两点成直线到X轴之间的角度(有正负)/// </summary>/// <param name="startPoint">起点</param>/// <param name="endPoint">终点</param>/// <returns></returns>public static double GetAngleToXaxis(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);}

封装为GetAngleToXaxis方法

未防止给的三个点在同一条直线上,也加了一个判断条件封装到BaseTool.cs中

        /// <summary>/// 判断三点是否在同一直线上/// </summary>/// <param name="firstPoint">第一个点</param>/// <param name="secondPoint">第二个点</param>/// <param name="thirdPoint">第三个点</param>/// <returns></returns>public static bool IsOnOneLine(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;}}

封装为IsOnOneLine方法

AddEnityTool.cs中代码

        /// <summary>/// 通过三点创建圆弧/// </summary>/// <param name="db">图形数据库</param>/// <param name="startPoint">起点</param>/// <param name="pointOnArc">圆弧上的点</param>/// <param name="endPoint">终点</param>/// <returns></returns>public static object AddArcToModelSpace(Database db, Point3d startPoint, Point3d pointOnArc, Point3d endPoint){//先判断三点是否在同一直线上if (BaseTool.IsOnOneLine(startPoint, pointOnArc, endPoint)){return ObjectId.Null;}CircularArc3d cArc = new CircularArc3d(startPoint, pointOnArc, endPoint);Arc arc = new Arc(cArc.Center, cArc.Radius, BaseTool.GetAngleToXaxis(cArc.Center,startPoint), BaseTool.GetAngleToXaxis(cArc.Center,endPoint));//加入图形数据库return AddEnityTool.AddEnityToModelSpace(db,arc);}

通过通过圆心、起点、夹角绘制圆(AddEnityTool.cs)

        /// <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(Database db, Point3d center, Point3d startPoint, double degree) {//获取半径double radius = BaseTool.GetDistanceBetweenTwoPoint(center, startPoint);//获取起点角度double startAngle = BaseTool.GetAngleToXaxis(center, startPoint);//声明圆弧对象Arc arc = new Arc(center, radius, startAngle, startAngle + BaseTool.DegreeToAngle(degree));return AddEnityTool.AddEnityToModelSpace(db, arc);}

获取半径的代码如下(BaseTool.cs)

        /// <summary>/// 获取两点之间的距离/// </summary>/// <param name="point1"></param>/// <param name="point2"></param>/// <returns></returns>public static double GetDistanceBetweenTwoPoint(Point3d point1, Point3d point2) {return Math.Sqrt((point1.X - point2.X) * (point1.X - point2.X) + (point1.Y - point2.Y) * (point1.Y - point2.Y) + (point1.Z - point2.Z) * (point1.Z - point2.Z));}

2021-07-05C#/CAD二次开发创建圆弧(4)相关推荐

  1. UG二次开发 创建圆弧 UF_CURVE_create_arc

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG二次开发 创建圆弧 UF_CURVE_create_arc 代码: //圆心 d ...

  2. CAD二次开发 创建椭圆

    创建椭圆 找到椭圆的圆心 长轴和短轴比 长轴向量 声明椭圆形并添加到图形文件中 将图形对象添加到图形文件中(AddEntityToModelSpace) 完整代码 调用 找到椭圆的圆心 Point3d ...

  3. 2021-07-19C#CAD二次开发创建多线段

    代码如下: /// <summary>/// 绘制折线多线段/// </summary>/// <param name="db">图形数据库&l ...

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

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

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

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

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

    c# CAD二次开发 类库 创建各种图形.直线.圆.多段线.正方形.点等 using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD ...

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

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

  8. cad 二次开发 插入图片_C#之CAD二次开发(2) 直线对象创建及添加

    0. 前言 从本文开始就正式登上开往CAD二次开发幼儿园的大巴车了!你准备好了吗?车门已经焊死! 还有,本系列笔记是默认大家都有C#的基础的了.这个系列笔记是我自己学习CAD二次开发的一些记录,可能存 ...

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

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

  10. 用ObjectArx进行CAD二次开发的准备工作

    用ObjectArx进行CAD二次开发的准备工作 1.CAD二次开发工具介绍: 2.本文主要介绍ObjectArx工具安装及下载,故此处不讲解VS和CAD的安装 3.有2中下载的资源,并且有安装好的V ...

最新文章

  1. 分享Silverlight/WPF/Windows Phone一周学习导读(07月18日-07月24日)
  2. Guava库学习:学习Collections(二)Lists
  3. C++11获取double类型的最大最小值
  4. 使用Hybris commerce的promotion rule进行促销活动
  5. Teams团队的成员列表API的已知问题
  6. 【算法刷题3】二叉树的最大深度
  7. 数组对象的reduce方法
  8. 《设计模式之禅》--摘要
  9. 比特币蒸发 1 万亿;中兴入局无人驾驶;特斯拉 Model 3 在华降价 | 极客头条
  10. 考虑SOC蓄电池 双向DC/DC 充放电控制 matlab仿真模型 buck boost
  11. HDUOJ 6555 The Fool
  12. 10.2.2.7 -DHCP 和 DNS 服务
  13. imperva 获取gti文档
  14. echarts地图省份按顺序依次高亮demo(源码)
  15. androidx依赖aar报错
  16. 年薪201万!华中科大CV博士生入选华为天才少年计划!
  17. C语言经典算法100例-结束语
  18. 数据结构与常用集合总结
  19. HDU-2036 改革春风吹满地(计算几何)
  20. 俄罗斯资源网站RuTracker的使用教程

热门文章

  1. python游戏解法图_python 游戏(记忆拼图Memory_Puzzle)
  2. 全脑地图:单个记忆被拆分存储在多个相连的大脑区域
  3. 计算机安装xp蓝屏怎么办,xp系统装win7系统蓝屏怎么办
  4. Shell编程 单引号双引号反引号的区别
  5. 51 单片机晶振电路原理
  6. mp4数据恢复:mp4视频格式化怎么恢复
  7. Ubuntu安装Google拼音
  8. TP4101充电IC与锂电池保护二合一IC
  9. 以色列宣布启动“创世纪2”号登月计划;我国粮食生产实现“十七连丰”丨科技新闻...
  10. [Azure - VNet] 解决办法:Azure P2S VNet无法建立网络连接。“parameter is incorrect“ (Error 87 参数错误)