1. 项目背景与核心需求
在机械设计领域,SolidWorks工程图是工程师交流设计意图的通用语言。传统CAD系统中,工程图的面与标注之间的关系是静态且硬编码的,这导致设计变更时标注经常需要手动调整。我最近在尝试用图神经网络(GNN)来学习这种复杂关系,目标是实现标注的智能关联与自动调整。
这个想法的核心价值在于:当设计发生变更时,系统能自动保持标注与几何特征的合理对应关系。比如修改了一个孔的直径,直径标注应该自动跟随到新的边界,而不是停留在原位置变成"悬空标注"。目前主流CAD软件处理这类问题时,要么依赖刚性规则(容易出错),要么需要完全手动调整(效率低下)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案设计思路
2.1 图结构建模
工程图本质上就是一张图(Graph):
- 节点:几何元素(直线、圆弧、剖面线区域等)
- 边:几何关系(相切、共线、同心等)或拓扑连接
- 特殊节点:标注实体(尺寸、形位公差、表面粗糙度等)
我用NetworkX构建了这样的图结构,每个节点包含以下特征:
python复制class NodeFeature:
def __init__(self):
self.geom_type = '' # LINE/ARC/CIRCLE/DIMENSION/etc.
self.bbox = [] # [x_min, y_min, x_max, y_max]
self.layer = '' # 图层信息
self.params = {} # 几何参数(半径、角度等)
2.2 图神经网络选型
经过对比测试,最终选用GraphSAGE+Attention的方案:
- GraphSAGE:适合工程图这种邻居节点数量差异大的场景
- Edge Attention:让模型学会关注重要的几何约束关系
- Hierarchical Pooling:处理大型装配体图纸时的内存优化
模型架构的核心部分:
python复制class GNNModel(nn.Module):
def __init__(self):
self.conv1 = GraphSAGEConv(in_channels=128, out_channels=256)
self.attn = EdgeAttn(in_channels=256)
self.pool = TopKPooling(256, ratio=0.8)
self.fc = nn.Linear(256, 128)
关键发现:在工程图中,标注与几何元素的最远有效距离通常不超过3跳(hop),因此设置GNN层数为3是最优选择
3. 数据准备与特征工程
3.1 SolidWorks数据提取
通过SolidWorks API获取工程图数据:
vbnet复制' 获取当前图纸的所有视图
Dim swViews As Variant
swViews = swDrawing.GetViews()
' 遍历视图中的每个注解
For Each swAnn In swView.GetAnnotations()
If swAnn.GetType() = swDimension Then
' 提取尺寸标注的关联几何
Dim swDims As Variant
swDims = swAnn.GetDimension2s()
End If
Next
3.2 标注关系标注规范
制定了一套标注规则:
- 强关联:直接测量的几何特征(如边长标注)
- 弱关联:参考基准或形位公差
- 排除项:图纸边框、标题栏等非设计元素
标注示例表格:
| 标注ID | 关联几何ID | 关系类型 | 置信度 |
|---|---|---|---|
| DIM_001 | LINE_005 | 直接测量 | 1.0 |
| GD&T_002 | CIRCLE_008 | 位置公差 | 0.8 |
4. 模型训练关键技巧
4.1 损失函数设计
采用多任务学习框架:
- 主损失:标注关联预测(带权交叉熵)
- 辅助损失1:几何特征分类
- 辅助损失2:边类型预测
python复制loss = alpha * main_loss + beta * aux1_loss + gamma * aux2_loss
4.2 数据增强策略
针对工程图的特殊性设计的增强方法:
- 几何扰动:对非关键尺寸添加±5%的随机偏差
- 视图旋转:以15°为步长生成多角度样本
- 标注位移:在合理范围内随机偏移标注位置
实测发现:适度的几何扰动能使模型鲁棒性提升37%
5. 实际应用与效果验证
5.1 部署架构
采用ONNX Runtime实现CAD插件:
code复制SolidWorks Add-in → ONNX Runtime → GNN Model → 标注调整建议
5.2 性能指标
在测试集上的表现:
| 指标 | 数值 | 行业基准 |
|---|---|---|
| 关联准确率 | 92.3% | 68%(规则引擎) |
| 推理时间 | 47ms/图 | ≤100ms合格 |
| 内存占用 | 1.2GB | - |
5.3 典型应用场景
- 设计变更时:自动保持标注与几何的关联
- 视图调整时:智能重新定位标注
- 图纸标准化检查:发现标注与几何不匹配的情况
6. 踩坑经验与优化方向
6.1 遇到的典型问题
-
长尾分布问题:
- 某些特殊标注(如焊接符号)样本极少
- 解决方案:采用Focal Loss重新加权
-
工程图比例问题:
- 不同图纸的缩放比例导致特征值域差异大
- 解决方案:添加比例归一化层
6.2 后续优化计划
- 增量学习:适应不同企业的制图规范
- 多模态输入:结合3D模型信息提升准确性
- 主动学习:让用户纠正关键样本自动迭代模型
这个项目最让我意外的是:简单的图结构表示就能捕捉工程图中80%以上的设计意图。现在每次看到模型自动调整标注位置时,仍然会觉得机器学习与工程设计的结合充满可能性。建议尝试时先从简单的零件图开始,逐步过渡到复杂装配体,这样能更好控制问题复杂度。
