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

相关推荐
用户395240998802 小时前
SqlSugar 连接 PostgreSQL 报错 42P01: relation does not exist 的排查与修复
c#
2601_961875243 小时前
法考考试时间安排及科目|时间表|资料已整理
开发语言·c#·inverted-index·suffix-tree·sstable·r-tree·lsm-tree
ServBay3 小时前
你跟高级 C# 工程师的区别,就是这8个开发技巧
后端·c#·.net
2601_961875248 小时前
法考备考计划表|学习计划|资料已整理
java·开发语言·学习·eclipse·tomcat·c#·hibernate
Y学院9 小时前
C#游戏脚本开发全流程(Unity通用完整版)
游戏·unity·c#
淡海水11 小时前
38-Hybrid生态-LeanCLR总览
unity·架构·c#·热更新·clr·hybrid·leanclr
iCxhust11 小时前
C# 生成命令行程序 将hex格式烧录程序转换成bin烧录格式
开发语言·汇编·单片机·嵌入式硬件·c#·微机原理
xiaoshuaishuai812 小时前
C# 封装与继承
开发语言·c#
FL162386312912 小时前
基于C#winform使用纯opencv部署ppocrv5和ppocrv6的onnx模型进行OCR文件检测识别
opencv·c#·ocr
小满Autumn17 小时前
log4net 日志框架 — 从配置到实战速查手册
笔记·c#·.net·wpf·上位机·log4net