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
在这里插入图片描述

《Asuo二维绘图控件v2.0》=============================================================================软件名称:《Asuo二维绘图控件》软件版本: V2.0软件作者:asuo作者邮箱:asuo@263.net软件网站:http://www.asuo.com下载地址:http://www.asuo.com/down/as2d.rar 下载软件语言:vc++授权形式:(ActiveX控件)应用平台:win9x/me/2000/xp界面预览:http://www.asuo.com/as2d_active.htm软件简介:平面图形控件,可以创建和编辑矢量图形以及便捷的显示操作。 文字和尺寸标注;元素属性设置;长度、角度、面积的查询; DXF输出;提供交换文件和二次开发接口。适用于 CAD/CAM/GIS/GPS等相关图形软件开发。软件价格:试用版本免费相关文档:--发布日期:2003.07.29============================================================================== 1.库文件清单: MFC42.DLL MSVCIRT.DLL MSVCRT.DLL ASBASE.DLL ASCSTR.DLL ASDRAW.DLL ASINTR.DLL ASKERN.DLL ASLAW.DLL ASOCX.OCX ASSPLINE.DLL2.控件注册: 控件注册,命令为: regsvr32 Asocx.ocx 解除注册: regsvr32 Asocx.ocx /u3.功能说明:选择:单击鼠标左键选择元素; 框选:在选择状态下,按住鼠标托动进入框选状态; 选择移动元素:在选择状态下,如果当前捕捉到元素,按住鼠标托动元素; 重画(REDRAW):刷新绘图区域; 显示平移(PAN):移动视点,调整看图位置; 框选放大(ZOOM):选择一个放大区域,需要点两点; 显示放大缩小:显示放大为1.2倍,显示缩小为0.8倍; 创建点:选点创建; 创建直线:两点创建直线; 圆心+圆上一点:需要两点创建; 两点圆:需要两点,此两点为圆上点且它们之间距离为直径; 3点圆:需三点,创建过三点的圆,三点共线时创建失败; 圆弧:圆心+起点+终点,需要三点,第一点为圆心,第二点为弧的起点,第三点为弧的终点,弧以逆时针方向; 半圆弧:类似两点圆,逆时针方向; 三点弧:需要三点,创建出过此三点的圆弧;逆时针方向; 椭圆:先给出长轴,然后给椭圆上一点; 样条:依次给出样条线的控制点,双击鼠标左键结束创建样条,样条线必须有三个以上的控制点; 矩形:给出矩形对角两点创建矩形; 删除:删除当前选择到的元素; 复制:复制当前选择到的元素; ...4.开发帮助: 如果用户需要进行特殊的功能扩充,请参考《用户开发手册 index.htm》
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周杰伦fans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值