C#与SolidWorks实战:如何通过API获取三维模型参数并实现1:1自动建模

1次阅读
没有评论

共计 3334 个字符,预计需要花费 9 分钟才能阅读完成。

image.webp

背景痛点

在传统机械设计流程中,工程师常需手动操作 SolidWorks 重复建模,尤其在以下场景效率极低:

C# 与 SolidWorks 实战:如何通过 API 获取三维模型参数并实现 1:1 自动建模

  • 系列化产品设计时,仅尺寸参数不同的模型需反复修改草图
  • 客户频繁要求基于现有模型微调后重新出图
  • 批量导出模型参数时依赖手动记录易出错

我曾参与某自动化设备项目,需要根据 20 组不同尺寸参数生成对应型号的零部件。若手动操作,每个模型平均耗时 15 分钟,且后期参数调整导致 60% 工作需返工。这种低效模式促使我们研究 API 自动化方案。

技术选型

对比常见 CAD 自动化方案:

  1. AutoCAD API
  2. 优势:二维处理成熟,社区资源丰富
  3. 劣势:三维建模能力弱,特征参数提取困难

  4. Open Cascade

  5. 优势:开源免费,几何内核强大
  6. 劣势:学习曲线陡峭,工业标准兼容性差

  7. SolidWorks API

  8. 优势:
    • 原生支持特征级参数访问
    • 完善的 COM 接口文档
    • 与 SolidWorks 操作完全同步
  9. 劣势:
    • 需正版授权
    • 部分高级功能需 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. 约束处理技巧

关键约束重建逻辑:

  1. 尺寸约束优先于几何约束
  2. 按特征树顺序重建 (parent->child)
  3. 使用 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();}

避坑指南

常见错误

  1. 单位制问题
  2. SolidWorks 内部使用米制单位
  3. 解决方案:
// 转换为 API 内部单位 (米)
double valueInMeters = doc.Extension.ConvertToUnits(
    originalValue, 
    (int)swUserPreferenceUnitType_e.swUnitsLength, 
    (int)swUserPreferenceUnitType_e.swUnitsMeters);
  1. 特征依赖错误
  2. 错误示例:先创建倒角再拉伸
  3. 正确顺序:基础特征 -> 附加特征

性能优化

  1. 禁用实时更新

    doc.FeatureManager.EnableFeatureTree = false;

  2. 批量模式操作

    using (var batch = doc.CreateBatchMode()) 
    {
        // 所有建模操作放在这里
        batch.PushToDatabase();}

延伸思考

当模型存在以下复杂情况时如何处理:

  1. 环形依赖(特征 A 依赖 B,B 又依赖 A)
  2. 基于设计表的配置驱动建模
  3. 跨装配体参数传递

建议尝试使用 DesignTableManager 接口处理配置相关问题,对于复杂依赖可引入拓扑排序算法确定重建顺序。

结语

通过本文介绍的方法,我们成功将开头提到的 20 组模型生成时间从 5 小时缩短到 3 分钟。API 自动化不仅提升效率,更实现了设计参数的数字化管理。建议进一步研究:

  • 与 PDM 系统集成实现版本控制
  • 结合机器学习优化参数组合
  • 开发可视化参数编辑界面

期待看到更多工程师释放创造力,将重复工作交给代码!

正文完
 0
评论(没有评论)