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 没给的事件,可以自己拼出来。

相关推荐
加号36 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
无风听海7 小时前
C# 隐式转换深度解析
java·开发语言·c#
LateFrames8 小时前
520 - 如何说晚安 (WPF)
c#·wpf·浪漫·ui体验
魔法阵维护师8 小时前
从零开发游戏需要学习的c#模块,第十四章(保存和加载)
学习·游戏·c#
Xin_ye1008612 小时前
C# 零基础到精通教程 - 第十一章:LINQ——语言集成查询
开发语言·c#
Xin_ye1008612 小时前
C# 零基础到精通教程 - 第十章:集合与泛型——高效管理数据
开发语言·c#
魔法阵维护师14 小时前
从零开发游戏需要学习的c#模块,第十一章(rpg小游戏入门,上篇,地图与移动)
学习·游戏·c#
雪豹阿伟14 小时前
8.C# —— 随机数、DateTime时间、字符串
c#·上位机
天下无敌笨笨熊14 小时前
C#常用三方库使用心得
开发语言·c#
魔法阵维护师16 小时前
从零开发游戏需要学习的c#模块,第十三章(rpg小游戏入门,下篇,地图敌人与战斗触发)
学习·游戏·c#