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

相关推荐
玩泥巴的14 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
cpp_w19 小时前
C#基础3- 面向对象中级应用3
后端·c#
步步为营DotNet19 小时前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
hixiong12320 小时前
C# 使用 ZXingCpp.Angle 进行条码、二维码识别
开发语言·c#·扫码
步步为营DotNet20 小时前
System.Text.Json 源生成:三个“看起来已经生效“的静默失效
c#·.net·native aot·源生成
用户788477316341 天前
用 C# 把每周 6 小时的 PDF 录入干到 20 分钟:一份可复制的桌面 OCR 方案
c#
csdn_aspnet2 天前
C# .NetCore Swagger ISchemaFilter 处理枚举、特殊类型
c#·.netcore·swagger
滴滴答答哒2 天前
C# 技巧:优雅实现对象的“局部更新”与“字段合并”
开发语言·c#
code_long2 天前
.net core 连接打印机 使用zpl指令打印机,并且位图本地渲染zpl指令
c#·.netcore·位图·打印机·模板编辑·模板预览
csdn_aspnet2 天前
C# .NetCore Swagger ISchemaFilter Long 转 String 防精度丢失
c#·.netcore·swagger