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


参考来源

相关推荐
Chen—LSN9 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
淡海水12 小时前
00-Unity和C#的GC剖析与对比-全篇导览
unity·c#·游戏引擎·gc
fogota12 小时前
C# `string.Join` 处理 `List<int>`
windows·c#
Behavior15 小时前
Unity 手游动态更换 App 图标 — Android 与 iOS 双端技术方案
c#·unity3d·游戏开发
周杰伦fans15 小时前
构建真正智能的CAD AI绘图代理
开发语言·人工智能·c#
UIU11419 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
CSharp精选营1 天前
我用 ASP.NET Core 做了个水稻病虫害检查系统
c#·毕业设计·.net core·码农刚子
唐青枫1 天前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
下页、再停留1 天前
【C#桌面客户端系列学习-2】在原来窗口基础上打开新窗口
c#·visual studio
Behavior1 天前
Unity 手游 iOS Deep Link 唤醒全流程:从 URL Scheme / Universal Links 到 C# 层参数投递
c#·unity3d·游戏开发