You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求基于C#实现SOLIDWORKS FeatureWorks自动特征识别的示例指导

基于C#的SOLIDWORKS FeatureWorks自动识别特征示例

核心需求

实现以下四个核心操作的可运行代码:

  • 建立SOLIDWORKS连接并启动软件,打开指定.sldprt零件文件
  • 获取FeatureWorks插件对象
  • 自动识别导入的所有钣金及常规特征
  • 创建所有识别出的特征

修正后的完整可运行代码

以下是修正了原代码问题(如重复特征选项、缺失FeatureWorks加载检查等)后的完整代码:

using System;
using System.Runtime.InteropServices;
using SolidWorks.Interop.fworks;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;

namespace SolidWorksAPIExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 建立SOLIDWORKS连接
            SldWorks swApp = null;
            try
            {
                swApp = Activator.CreateInstance(Type.GetTypeFromProgID("SldWorks.Application")) as SldWorks;
                if (swApp == null)
                {
                    Console.WriteLine("无法创建SOLIDWORKS实例");
                    return;
                }
                swApp.Visible = true; // 设置SOLIDWORKS可见,方便调试
            }
            catch (Exception ex)
            {
                Console.WriteLine($"启动SOLIDWORKS失败: {ex.Message}");
                return;
            }

            // 2. 打开.sldprt文件
            ModelDoc2 swModel = null;
            string partPath = @"C:\example.sldprt"; // 使用@避免路径转义问题
            try
            {
                swModel = swApp.OpenDoc6(
                    partPath,
                    (int)swDocumentTypes_e.swDocPART,
                    (int)swOpenDocOptions_e.swOpenDocOptions_Silent,
                    "",
                    0,
                    0) as ModelDoc2;

                if (swModel == null)
                {
                    Console.WriteLine($"无法打开零件文件: {partPath}");
                    swApp.ExitApp();
                    Marshal.ReleaseComObject(swApp);
                    return;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"打开文件失败: {ex.Message}");
                swApp.ExitApp();
                Marshal.ReleaseComObject(swApp);
                return;
            }

            // 3. 获取FeatureWorks对象
            IFeatureWorksApp fw = null;
            try
            {
                // 尝试获取已加载的FeatureWorks插件
                fw = swApp.GetAddInObject("FeatureWorks.FeatureWorksApp") as IFeatureWorksApp;
                
                // 如果未加载,尝试手动加载
                if (fw == null)
                {
                    bool loadSuccess = swApp.LoadAddIn("FeatureWorks.dll");
                    if (!loadSuccess)
                    {
                        Console.WriteLine("无法加载FeatureWorks插件");
                        swApp.CloseDoc(partPath);
                        swApp.ExitApp();
                        Marshal.ReleaseComObject(swModel);
                        Marshal.ReleaseComObject(swApp);
                        return;
                    }
                    fw = swApp.GetAddInObject("FeatureWorks.FeatureWorksApp") as IFeatureWorksApp;
                }

                if (fw == null)
                {
                    Console.WriteLine("无法获取FeatureWorks对象");
                    swApp.CloseDoc(partPath);
                    swApp.ExitApp();
                    Marshal.ReleaseComObject(swModel);
                    Marshal.ReleaseComObject(swApp);
                    return;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"获取FeatureWorks对象失败: {ex.Message}");
                swApp.CloseDoc(partPath);
                swApp.ExitApp();
                Marshal.ReleaseComObject(swModel);
                Marshal.ReleaseComObject(swApp);
                return;
            }

            // 4. 自动识别导入特征(包含所有钣金及常规特征)
            int recognizeOptions = 
                (int)fwRecognizeOptions_e.fwAutoEdgeFlange |
                (int)fwRecognizeOptions_e.fwAutoHemFlange |
                (int)fwRecognizeOptions_e.fwBaseFlange |
                (int)fwRecognizeOptions_e.fwChamfers |
                (int)fwRecognizeOptions_e.fwExtrude |
                (int)fwRecognizeOptions_e.fwHoles |
                (int)fwRecognizeOptions_e.fwRevolve |
                (int)fwRecognizeOptions_e.fwRibs |
                (int)fwRecognizeOptions_e.fwSketchedBend |
                (int)fwRecognizeOptions_e.fwVolume;

            int recognizeResult = fw.RecognizeFeatureAutomatic(recognizeOptions);
            if (recognizeResult == 0)
            {
                Console.WriteLine("自动识别特征失败");
                swApp.CloseDoc(partPath);
                swApp.ExitApp();
                Marshal.ReleaseComObject(fw);
                Marshal.ReleaseComObject(swModel);
                Marshal.ReleaseComObject(swApp);
                return;
            }
            else if (recognizeResult == 1)
            {
                Console.WriteLine("未识别到任何可转换的特征");
            }
            else
            {
                Console.WriteLine($"成功识别到 {recognizeResult} 个可创建的特征");
            }

            // 5. 创建所有识别出的特征
            bool createSuccess = fw.CreateFeatures((short)fwFeatureCreationOptions_e.fwAllowFailFeatureCreation);
            if (!createSuccess)
            {
                Console.WriteLine("创建特征失败");
            }
            else
            {
                Console.WriteLine("所有识别出的特征已成功创建");
            }

            // 释放COM对象并退出(可选,根据需求保留SOLIDWORKS运行)
            swApp.CloseDoc(partPath);
            swApp.ExitApp();
            
            Marshal.ReleaseComObject(fw);
            Marshal.ReleaseComObject(swModel);
            Marshal.ReleaseComObject(swApp);
        }
    }
}

关键说明

  1. SOLIDWORKS连接优化:添加swApp.Visible = true让软件可见便于调试;增加异常捕获和COM对象释放逻辑,避免内存泄漏。
  2. FeatureWorks加载检查:补充插件未加载时的自动加载逻辑,确保能正常获取FeatureWorks对象。
  3. 特征识别选项修正:替换自定义常量为官方枚举fwRecognizeOptions_e,移除原代码中重复的fwVolume选项,避免识别逻辑错误。
  4. 结果判断完善:根据RecognizeFeatureAutomatic的返回值细化判断逻辑,区分失败、无特征、成功识别三种场景。

内容的提问来源于stack exchange,提问作者Marco Massagrande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:57:12