C# + SolidWorks 二次开发 -监听退出草图事件并自动执行逻辑

一、问题背景

最近在做一些自动化功能的时候,经常会遇到一个需求:

用户在草图中画完东西,一退出草图,就自动触发一些操作

比如:

自动加约束

自动标注

自动检查草图是否闭合

自动生成特征

但是 SolidWorks API 里并没有一个很直观的"退出草图事件",需要自己处理。

二、思路分析

SolidWorks 的事件体系里,并没有直接提供:

❌ "OnExitSketch" 这种事件

但可以换个思路:

👉 监听 激活文档变化(ActiveDocChangeNotify) + 编辑状态变化

核心判断逻辑:

是否从 草图编辑状态 → 非草图状态

关键点:

当前是否在草图中

上一次状态是否在草图中

状态发生变化 → 就说明退出草图

三、实现步骤

  1. 注册应用级事件

在 Addin 里注册:

复制代码
```csharp
private SldWorks _swApp;

public void InitEvents()
{
    _swApp.ActiveDocChangeNotify += OnActiveDocChangeNotify;
    _swApp.ActiveModelDocChangeNotify += OnActiveModelDocChangeNotify;
}


2. 定义状态缓存

```csharp
private bool _isEditingSketch = false;
  1. 判断当前是否在草图中
csharp 复制代码
private bool IsInSketch(ModelDoc2 model)
{
    if (model == null) return false;

    var sketchMgr = model.SketchManager;
    return sketchMgr.ActiveSketch != null;
}
4. 核心检测逻辑
private int OnActiveModelDocChangeNotify()
{
    CheckSketchState();
    return 0;
}

private void CheckSketchState()
{
    var model = _swApp.ActiveDoc as ModelDoc2;
    if (model == null) return;

    bool currentState = IsInSketch(model);

    // 从"在草图" → "不在草图" = 退出草图
    if (_isEditingSketch && !currentState)
    {
        OnExitSketch(model);
    }

    _isEditingSketch = currentState;
}
  1. 退出草图后的处理
csharp 复制代码
private void OnExitSketch(ModelDoc2 model)
{
    // 示例:打印日志
    System.Diagnostics.Debug.WriteLine("退出草图");

    // 示例:获取最后编辑的草图
    var feat = model.ISelectionManager.GetSelectedObject6(1, -1) as Feature;

    // 这里可以扩展:
    // - 自动加尺寸
    // - 自动检查闭合
    // - 自动生成拉伸
}

四、关键代码总结

核心就一句判断:

csharp 复制代码
if (_isEditingSketch && !currentState)
{
    OnExitSketch(model);
}

本质就是:

✔ 状态变化检测(State Transition)

五、常见坑点

  1. 事件不会实时触发

有些情况下:

用户只是切换命令

没真正退出草图

👉 需要多次验证状态

  1. Selection 不可靠

退出草图后:

SelectionManager

可能已经没有选中对象

👉 建议:

提前缓存草图

或通过 FeatureManager 获取

  1. 多文档问题

如果有多个窗口:

👉 一定要基于 ActiveDoc 判断

不要缓存 ModelDoc2

  1. 性能问题

这个事件是全局触发的:

👉 不要在里面做重操作

六、扩展玩法(重点)

这个点可以做很多事情:

✔ 自动草图检查

是否闭合

是否存在重叠线

✔ 自动标注

自动加尺寸

自动加约束

✔ 自动建模

退出草图直接:

拉伸

切除

旋转

比如:

草图分析 → 推荐特征

自动识别轮廓类型

七、总结

这个功能本质就是:

❗ 用"状态变化"模拟"事件"

SolidWorks 没给的事件,可以自己拼出来。

相关推荐
游乐码2 小时前
C#Dicitionary
算法·c#
SunnyDays10112 小时前
C# 实战:如何高效地将 HTML 转换为可编辑 Word 文档
c#·html转word
用户3721574261353 小时前
C# 实战:如何高效地将 HTML 转换为可编辑 Word 文档
c#
鱼干~3 小时前
【全栈知识点】全栈开发知识点
前端·人工智能·c#
yu85939584 小时前
WinForm 嵌入 WordExcel 实现方案
开发语言·microsoft·c#
躺平的赶海人4 小时前
C# 客户端性能优化(一):CPU 利用率获取与监控
c#
rockey62711 小时前
AScript如何实现中文脚本引擎
c#·.net·script·eval·expression·function·动态脚本
我是唐青枫13 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net
unicrom_深圳市由你创科技14 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#