共计 3334 个字符,预计需要花费 9 分钟才能阅读完成。
背景痛点
在传统机械设计流程中,工程师常需手动操作 SolidWorks 重复建模,尤其在以下场景效率极低:

- 系列化产品设计时,仅尺寸参数不同的模型需反复修改草图
- 客户频繁要求基于现有模型微调后重新出图
- 批量导出模型参数时依赖手动记录易出错
我曾参与某自动化设备项目,需要根据 20 组不同尺寸参数生成对应型号的零部件。若手动操作,每个模型平均耗时 15 分钟,且后期参数调整导致 60% 工作需返工。这种低效模式促使我们研究 API 自动化方案。
技术选型
对比常见 CAD 自动化方案:
- AutoCAD API
- 优势:二维处理成熟,社区资源丰富
-
劣势:三维建模能力弱,特征参数提取困难
-
Open Cascade
- 优势:开源免费,几何内核强大
-
劣势:学习曲线陡峭,工业标准兼容性差
-
SolidWorks API
- 优势:
- 原生支持特征级参数访问
- 完善的 COM 接口文档
- 与 SolidWorks 操作完全同步
- 劣势:
- 需正版授权
- 部分高级功能需 Premium 版本
最终选择 SolidWorks API 的核心原因是其能直接操作特征树 (FeatureTree),这对参数化建模至关重要。例如获取一个拉伸特征的深度参数,用 API 只需两行代码:
var extrude = (Feature)part.FeatureByName("拉伸 1");
double depth = ((ISurfaceExtrudeFeatureData)extrude.GetDefinition()).Depth;
核心实现
1. 连接 SolidWorks 进程
推荐使用 Marshal.GetActiveObject 方式连接已有实例,避免多次启动消耗资源:
using SolidWorks.Interop.sldworks;
using System.Runtime.InteropServices;
public class SwController : IDisposable
{
private ISldWorks _app;
public void Connect(bool createNew = false)
{
try
{_app = (ISldWorks)Marshal.GetActiveObject("SldWorks.Application");
}
catch(COMException)
{if(createNew)
{var type = Type.GetTypeFromProgID("SldWorks.Application");
_app = (ISldWorks)Activator.CreateInstance(type);
_app.Visible = true;
}
else throw;
}
}
}
2. 参数提取关键技术
遍历模型参数
通过 ModelDoc2 接口获取三种核心参数:
public Dictionary<string, object> GetAllParameters(IModelDoc2 doc)
{var parameters = new Dictionary<string, object>();
// 1. 获取自定义属性
var propMgr = doc.Extension.CustomPropertyManager[""];
propMgr.GetAll(out string[] propNames, out string[] propValues, out string[] propResolved);
// 2. 获取特征参数
foreach (Feature feat in (object[])doc.FeatureManager.GetFeatures())
{if(feat.GetDefinition() is ISurfaceExtrudeFeatureData extrude)
{parameters.Add($"{feat.Name}_Depth", extrude.Depth);
}
}
// 3. 获取草图尺寸
var sketch = (ISketch)doc.FeatureByName("草图 1");
foreach (DisplayDimension dim in (object[])sketch.GetDisplayDimensions())
{parameters.Add(dim.Name, dim.GetValue());
}
return parameters;
}
参数数据结构
典型返回数据结构示例:
{
"Material": "6061 铝合金",
"Weight": 2.34,
"拉伸 1_Depth": 50.0,
"草图 1_D1": 30.0
}
建模还原
1. 基础模型重建
以下代码演示根据参数重建拉伸特征:
public void RebuildExtrude(IModelDoc2 doc, Dictionary<string, object> parameters)
{
// 创建基准面
var plane = (IFeature)doc.FeatureByName("前视基准面");
// 创建草图
doc.SketchManager.InsertSketch(true);
doc.SketchManager.CreateCenterRectangle(0, 0, 0,
(double)parameters["Width"]/2, (double)parameters["Height"]/2);
// 添加拉伸特征
var feat = (IFeature)doc.FeatureManager.FeatureExtrusion2(
true, false, false, 0, 0,
(double)parameters["Depth"], 0.01,
false, false, false, false, 0, 0, false);
feat.Name = "主体拉伸";
}
2. 约束处理技巧
关键约束重建逻辑:
- 尺寸约束优先于几何约束
- 按特征树顺序重建 (parent->child)
- 使用 SetParametersAPI 批量应用尺寸:
public void ApplyDimensions(IModelDoc2 doc, Dictionary<string, double> dims)
{
doc.Extension.SetUserPreferenceToggle((int)swUserPreferenceToggle_e.swInputDimValOnCreate, true);
foreach(var dim in dims)
{var param = (IParameter)doc.Parameter(dim.Key);
param.SetSystemValue2(dim.Value, (int)swInConfigurationOpts_e.swThisConfiguration, "");
}
doc.EditRebuild3();}
避坑指南
常见错误
- 单位制问题
- SolidWorks 内部使用米制单位
- 解决方案:
// 转换为 API 内部单位 (米)
double valueInMeters = doc.Extension.ConvertToUnits(
originalValue,
(int)swUserPreferenceUnitType_e.swUnitsLength,
(int)swUserPreferenceUnitType_e.swUnitsMeters);
- 特征依赖错误
- 错误示例:先创建倒角再拉伸
- 正确顺序:基础特征 -> 附加特征
性能优化
-
禁用实时更新
doc.FeatureManager.EnableFeatureTree = false; -
批量模式操作
using (var batch = doc.CreateBatchMode()) { // 所有建模操作放在这里 batch.PushToDatabase();}
延伸思考
当模型存在以下复杂情况时如何处理:
- 环形依赖(特征 A 依赖 B,B 又依赖 A)
- 基于设计表的配置驱动建模
- 跨装配体参数传递
建议尝试使用 DesignTableManager 接口处理配置相关问题,对于复杂依赖可引入拓扑排序算法确定重建顺序。
结语
通过本文介绍的方法,我们成功将开头提到的 20 组模型生成时间从 5 小时缩短到 3 分钟。API 自动化不仅提升效率,更实现了设计参数的数字化管理。建议进一步研究:
- 与 PDM 系统集成实现版本控制
- 结合机器学习优化参数组合
- 开发可视化参数编辑界面
期待看到更多工程师释放创造力,将重复工作交给代码!
正文完
