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的偏移功能生成新图元,完成了"框选-筛选-偏移"的全流程 。


参考来源

相关推荐
牛哇网络工作室13 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
zlinear数据采集卡1 天前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel1 天前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡1 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
kingwebo'sZone1 天前
C# 根据公式计算的方法
开发语言·c#
阿部多瑞 ABU1 天前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D1 天前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram2 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具
头茬韭菜2 天前
第 10 篇:「Fluss 实战案例集」—— 完整解决方案与最佳实践
c#·linq·fluss
淡海水2 天前
01-05-运行时-JIT优化全景-内联去虚拟化边界检查消除
windows·c#·虚拟化·jit·内联·边界检查消除