Cad二次开发直线

该代码示例展示了在AutoCAD环境中使用C#编写的一个命令LineDemo,用户可以交互式地绘制直线,支持闭合和放弃操作。用户首先指定第一个点,然后继续添加点,或者选择闭合当前线段或放弃当前线。代码涉及数据库操作、点的获取以及图形对象的添加和管理。
摘要由CSDN通过智能技术生成

LineDemo

[CommandMethod("LineDemo")]
public void LineDemo()
{
    Database db = HostApplicationServices.WorkingDatabase;
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

    List<ObjectId> lineList = new List<ObjectId>();

    Point3d pointStart = new Point3d(100, 100, 0);
    Point3d pointPre = pointStart;
    PromptPointResult ppr = ed.GetPoint2("\n 指定第一个点:");
    if (ppr.Status == PromptStatus.Cancel)
    {
        return;
    }
    if (ppr.Status == PromptStatus.None)
    {
        pointPre = pointStart;
    }
    if (ppr.Status == PromptStatus.OK)
    {
        pointStart = ppr.Value;
        pointPre = pointStart;
    }
    bool isContinue = true;
    while (isContinue)
    {
        if (lineList.Count > 1)
        {
            ppr = ed.GetPoint("\n 指定下一点或 [闭合(C)/放弃(U)]:", pointPre, new string[] { "C", "U" });
        }
        else
        {
            ppr = ed.GetPoint("\n 指定下一点或 [放弃(U)]:", pointPre, new string[] { "U" });
        }

        Point3d pointNext = new Point3d();
        if (ppr.Status == PromptStatus.Cancel)
        {
            return;
        }
        if (ppr.Status == PromptStatus.None)
        {
            return;
        }
        if (ppr.Status == PromptStatus.OK)
        {
            pointNext = ppr.Value;
            ObjectId lId = db.AddLineToModelSpace(pointPre, pointNext);
            lineList.Add(lId);

            pointPre = pointNext;
        }
        if (ppr.Status == PromptStatus.Keyword)
        {
            switch (ppr.StringResult)
            {
                case "U":
                    if (lineList.Count == 0)
                    {
                        pointStart = new Point3d(100, 100, 0);
                        pointPre = pointStart;
                        ppr = ed.GetPoint2("\n 指定第一个点:");
                        if (ppr.Status == PromptStatus.Cancel)
                        {
                            return;
                        }
                        if (ppr.Status == PromptStatus.None)
                        {
                            pointPre = pointStart;
                        }
                        if (ppr.Status == PromptStatus.OK)
                        {
                            pointStart = ppr.Value;
                            pointPre = pointStart;
                        }

                    }
                    else if (lineList.Count > 0)
                    {
                        int count = lineList.Count;
                        ObjectId lId = lineList.ElementAt(count - 1);
                        pointPre = this.GetLineStartPoint(lId);
                        lineList.RemoveAt(count - 1);
                        lId.EraseEntity();
                    }
                    break;
                case "C":
                    ObjectId i = db.AddLineToModelSpace(pointStart, pointPre);
                    lineList.Add(i);
                    isContinue = false;
                    break;
                case " ":
                    isContinue = false;
                    break;
                default:
                    break;
            }
        }
    }
}

获取点

/// <summary>
/// 获取点
/// </summary>
/// <param name="ed">命令行对象</param>
/// <param name="promptStr">提示信息</param>
/// <returns>PromptPointResult</returns>
public static PromptPointResult GetPoint2(this Editor ed, string promptStr)
{
    PromptPointOptions ppo = new PromptPointOptions(promptStr);
    ppo.AllowNone = true;
    PromptPointResult ppr = ed.GetPoint(ppo);

    return ppr;
}

获取点或关键字

/// <summary>
/// 获取点或关键字
/// </summary>
/// <param name="ed">命令行</param>
/// <param name="prompt">提示显示</param>
/// <param name="pointBase">基准点</param>
/// <param name="keyWord">关键字</param>
/// <returns>PromptPointResult</returns>
public static PromptPointResult GetPoint(this Editor ed, string prompt, Point3d pointBase, params string[] keyWord)
{
    PromptPointOptions ppo = new PromptPointOptions(prompt);
    ppo.AllowNone = true;
    for (int i = 0; i < keyWord.Length; i++)
    {
        ppo.Keywords.Add(keyWord[i]);
    }
    ppo.AppendKeywordsToMessage = false;
    ppo.BasePoint = pointBase;
    ppo.UseBasePoint = true;
    PromptPointResult ppr = ed.GetPoint(ppo);
    return ppr;
}

添加直线到图形数据库

/// <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="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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

周杰伦fans

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

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

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

打赏作者

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

抵扣说明:

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

余额充值