C#实现CAD框选闭合图元外偏移1毫米

要实现用C#对CAD进行二次开发,通过鼠标框选闭合图元并向外偏移1毫米,核心步骤包括:获取CAD应用与文档、实现鼠标框选交互、筛选闭合图元、执行偏移操作。以下是具体实现方案。

1. 环境准备与引用

首先,在Visual Studio项目中添加对AutoCAD托管库的引用(如 acdbmgd.dll, acmgd.dll),并将它们的"复制本地"属性设置为False。

csharp 复制代码
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;

2. 核心实现代码

csharp 复制代码
public class OffsetClosedEntities
{
    [CommandMethod("OffsetSelected")]
    public void OffsetSelected()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;

        try {
            // 步骤1: 使用鼠标框选图元
            PromptSelectionResult selResult = ed.GetSelection();
            if (selResult.Status != PromptStatus.OK)
            {
                ed.WriteMessage("
未选择任何对象。");
                return;
            }

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                // 步骤2: 遍历选择集,筛选闭合图元                foreach (SelectedObject selObj in selResult.Value)
                {
                    Entity ent = tr.GetObject(selObj.ObjectId, OpenMode.ForRead) as Entity;
                    if (ent == null) continue;

                    // 判断图元是否闭合
                    if (IsClosedEntity(ent))
                    {
                        // 步骤3: 创建偏移后的新图元                        Entity offsetEnt = CreateOffsetEntity(ent, 1.0); // 偏移1毫米 if (offsetEnt != null)
                        {
                            BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                            btr.AppendEntity(offsetEnt);
                            tr.AddNewlyCreatedDBObject(offsetEnt, true);
                        }
                    }
                }
                tr.Commit();
            }
            ed.WriteMessage("
偏移操作完成。");
        }
        catch (System.Exception ex)
        {
            ed.WriteMessage($"
错误: {ex.Message}");
        }
    }

    // 判断图元是否为闭合类型
    private bool IsClosedEntity(Entity ent)
    {
        if (ent is Polyline pline)
 return pline.Closed;
        if (ent is Circle)
            return true; // 圆是闭合的 if (ent is Ellipse ellipse)
            return ellipse.Closed;
        // 可根据需要添加其他闭合图元类型,如闭合的Spline等 return false;
    }

    // 创建偏移图元    private Entity CreateOffsetEntity(Entity sourceEnt, double offsetDistance)
    {
        try {
            if (sourceEnt is Polyline pline)
            {
                // 多段线偏移 DBObjectCollection offsetCurves = pline.GetOffsetCurves(offsetDistance);
                if (offsetCurves.Count > 0)
                    return offsetCurves[0] as Entity;
            }
            else if (sourceEnt is Circle circle)
            {
                // 圆偏移:创建同心圆,半径增加                Circle offsetCircle = circle.Clone() as Circle;
                offsetCircle.Radius += offsetDistance;
                return offsetCircle;
            }
            else if (sourceEnt is Ellipse ellipse && ellipse.Closed)
            {
                // 椭圆偏移:近似处理,创建新的椭圆,长轴和短轴增加 Ellipse offsetEllipse = ellipse.Clone() as Ellipse;
                offsetEllipse.MajorRadius += offsetDistance;
                offsetEllipse.MinorRadius += offsetDistance;
                return offsetEllipse;
            }
        }
        catch { }
        return null;
    }
}

3. 关键操作说明

步骤 操作 关键方法/属性 说明
1. 鼠标框选 用户交互选择 Editor.GetSelection() 获取用户通过鼠标框选或点选的对象 。
2. 筛选闭合图元 遍历选择集并判断 IsClosedEntity() 通过图元类型和闭合属性(如 Polyline.Closed)筛选。
3. 执行偏移 生成偏移后的新图元 GetOffsetCurves() (多段线) 调整 Radius (圆) 对不同类型的闭合图元采用相应的偏移算法 。
4. 添加到模型空间 将新图元写入数据库 BlockTableRecord.AppendEntity() 将偏移生成的图元添加到当前空间。

4. 注意事项与扩展

  • 坐标系与单位 :代码中的偏移距离 1.0 默认使用CAD数据库单位(通常为毫米)。请根据实际绘图单位确认。
  • 复杂图元处理:对于样条曲线(Spline)等复杂闭合图元,可能需要更复杂的偏移计算,或调用CAD内置的偏移命令。
  • 性能优化 :当选择集很大时,建议在事务外先进行初步筛选,或使用 PromptSelectionOptions 限制选择类型。
  • 错误处理:偏移操作可能失败(如偏移距离过大),实际开发中应增加更完善的异常捕获和用户提示。

此方案直接集成了鼠标选择与图元偏移逻辑,通过判断图元的几何闭合属性实现精准筛选,并利用AutoCAD API的偏移功能生成新图元,完成了"框选-筛选-偏移"的全流程 。


参考来源

相关推荐
꒰ঌ 安卓开发໒꒱1 小时前
.NET CAP入门到入土
后端·c#·.net
逝水无殇5 小时前
C# 枚举(Enum)详解
开发语言·后端·c#
影寂ldy7 小时前
C# WinForms 窗体继承
开发语言·c#
苍狼唤19 小时前
WinForm练习知识补充(多线程)
c#
逝水无殇1 天前
C# 字符串(String)详解
开发语言·后端·c#
小巧的砖头1 天前
C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
开发语言·前端·c#
医疗信息化王工1 天前
从零到一:基于 GGUF 格式部署 Unlimited-OCR 搭建企业级证件识别服务
图像处理·c#·ocr
zyh______1 天前
C#语法糖(按照实用性排序)
unity·c#
z落落1 天前
C#五大加密算法(AES、DES、MD5、RSA、SHA)
开发语言·c#