一、问题背景
最近在做一些自动化功能的时候,经常会遇到一个需求:
用户在草图中画完东西,一退出草图,就自动触发一些操作
比如:
自动加约束
自动标注
自动检查草图是否闭合
自动生成特征
但是 SolidWorks API 里并没有一个很直观的"退出草图事件",需要自己处理。
二、思路分析
SolidWorks 的事件体系里,并没有直接提供:
❌ "OnExitSketch" 这种事件
但可以换个思路:
👉 监听 激活文档变化(ActiveDocChangeNotify) + 编辑状态变化
核心判断逻辑:
是否从 草图编辑状态 → 非草图状态
关键点:
当前是否在草图中
上一次状态是否在草图中
状态发生变化 → 就说明退出草图
三、实现步骤
- 注册应用级事件
在 Addin 里注册:
```csharp
private SldWorks _swApp;
public void InitEvents()
{
_swApp.ActiveDocChangeNotify += OnActiveDocChangeNotify;
_swApp.ActiveModelDocChangeNotify += OnActiveModelDocChangeNotify;
}
2. 定义状态缓存
```csharp
private bool _isEditingSketch = false;
- 判断当前是否在草图中
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;
}
- 退出草图后的处理
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)
五、常见坑点
- 事件不会实时触发
有些情况下:
用户只是切换命令
没真正退出草图
👉 需要多次验证状态
- Selection 不可靠
退出草图后:
SelectionManager
可能已经没有选中对象
👉 建议:
提前缓存草图
或通过 FeatureManager 获取
- 多文档问题
如果有多个窗口:
👉 一定要基于 ActiveDoc 判断
不要缓存 ModelDoc2
- 性能问题
这个事件是全局触发的:
👉 不要在里面做重操作
六、扩展玩法(重点)
这个点可以做很多事情:
✔ 自动草图检查
是否闭合
是否存在重叠线
✔ 自动标注
自动加尺寸
自动加约束
✔ 自动建模
退出草图直接:
拉伸
切除
旋转
比如:
草图分析 → 推荐特征
自动识别轮廓类型
七、总结
这个功能本质就是:
❗ 用"状态变化"模拟"事件"
SolidWorks 没给的事件,可以自己拼出来。