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

相关推荐
mudtools3 小时前
在.NET现有系统中快速集成飞书任务分配能力
后端·c#·.net
工具派6 小时前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
潜龙95276 小时前
需求文档一键变测试用例:手工用例智能生成平台
开发语言·c#
Lost of 程序猿6 小时前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
淡海水6 小时前
16-01-C#数据结构源码-附录A-术语表
unity·c#·游戏引擎·il2cpp
小羊没烦恼!7 小时前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
波力海苔夹心脆6757 小时前
C# 海康威视摄像头二次开发入门:HCNetSDK 登录、实时预览、云台控制、录像与抓图(WinForms 实战)
开发语言·windows·经验分享·tcp/ip·c#
淡海水7 小时前
16-03-C#数据结构源码-附录C-参考资源
unity·c#·游戏引擎·il2cpp
asdzx678 小时前
Excel 水印方案对比:页眉图片 vs 背景图片(附 C# 实现)
c#·excel
影寂ldy8 小时前
C# TCP转串口Modbus网关终极完整版笔记(队列防抖+一问一答+帧解析+双客户端轮询)
笔记·tcp/ip·c#