前言
Solidworks是一款功能十分强大的三维CAD解决方案,本人使用过一段时间的Solidworks,可以画一些简单的零件。这段时间一直在尝试对其二次开发,做了一个小软件,可以实现几个很基础的功能,谨以此帖记录一下开发过程。
1、环境搭建
因为Solidworks提供了C#的API接口,所以选用C#编程的Winform界面设计作为开发基础。
Solidworks版本:2022
Visual Studio版本:2022
框架:.NET Framework 4.8
创建好以后需要在 VS的 工具---NuGet包管理器---管理解决方案的NuGet程序包中添加两个程序集,分别是 SolidWorks.Interop.sldworks 和 SolidWorks.Interop.swconst。
其中,Solidworks.Interop.sldworks 包含 SolidWorks API 的主要接口和类,允许你通过代码与 SolidWorks 应用程序进行交互。SolidWorks.Interop.swconst 包含 SolidWorks API 中使用的常量。这些常量用于指定各种参数和选项,比如文档类型、特征类型、选择类型等。通过引用这两个程序集,可以在C# 项目中调用 SolidWorks 的 API,从而实现对 SolidWorks 的自动化和定制操作。
在Form1.cs引入这两个程序集。
2、实现打开sld文件
定义不同功能的方法
1、连接solidworks程序
这部分参考了https://blog.csdn.net/zengqh0314/article/details/100690000的方法。因为该程序的运行基础是线程进行中的Solidworks,所以需要新建Solidworks的连接检测方法,以下为示例代码:
public Form1()
{
InitializeComponent();
swApp = ConnectToSolidWorks();
}
private string filePath; // 存储选择的文件路径
public ISldWorks swApp { get; private set; }
public ModelDoc2 swModel { get; private set; } // 存储当前打开的模型
public static ISldWorks ConnectToSolidWorks()
{
SldWorks SwApp = null;
try
{
Process[] processArr = Process.GetProcessesByName("SLDWORKS");
if (processArr.Length > 0)
{
SwApp = (SldWorks)Marshal.GetActiveObject("sldWorks.Application");
}
else
{
MessageBox.Show("SolidWorks 未运行,请先启动 SolidWorks。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(0); // 如果SolidWorks未运行则强制退出
}
}
catch (COMException)
{
try
{
SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application");
}
catch (COMException)
{
try
{
SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application.30");
}
catch (COMException)
{
SwApp = null;
}
}
}
if (SwApp != null)
{
SwApp.Visible = true;
}
return SwApp;
}
尝试连接到已经运行的 SolidWorks 应用程序实例。首先检查是否有名为 "SLDWORKS" 的进程在运行,如果有,则使用 Marshal.GetActiveObject 方法获取运行的 SolidWorks 应用程序对象,否则显示错误消息并退出应用程序。
2、获取文档类型
private int GetDocumentType(string filePath)
{
string extension = System.IO.Path.GetExtension(filePath).ToLower();
switch (extension)
{
case ".sldprt":
return (int)swDocumentTypes_e.swDocPART;
case ".sldasm":
return (int)swDocumentTypes_e.swDocASSEMBLY;
case ".slddrw":
return (int)swDocumentTypes_e.swDocDRAWING;
default:
return -1;
}
}
根据文件扩展名返回文档类型。.sldprt 对应零件文件,.sldasm 对应装配体文件,.slddrw 对应工程图文件。如果文件扩展名不匹配任何已知类型,则返回 -1。
3、打开Solidworks文件
private ModelDoc2 OpenSolidWorksFile(string filePath)
{
if (swApp == null)
{
MessageBox.Show("SolidWorks 应用程序未连接。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
try
{
int errors = 0;
int warnings = 0;
swModel = swApp.OpenDoc6(filePath, GetDocumentType(filePath), (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref errors, ref warnings) as ModelDoc2;
if (swModel == null || errors != 0)
{
MessageBox.Show("无法打开文件。错误代码: " + errors, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
else
{
MessageBox.Show("文件已成功打开: " + filePath, "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
return swModel;
}
}
catch (Exception ex)
{
MessageBox.Show("打开文件时发生错误: " + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
尝试打开指定路径的 SolidWorks 文件。首先检查是否连接到 SolidWorks 应用程序,然后调用 OpenDoc6 方法打开文件,OpenDoc6 是 SolidWorks API 提供的一种方法,用于打开指定路径的 SolidWorks 文件。它可以打开零件文件、装配体文件和工程图文件。可以指定打开文件的选项,如以静默方式打开文件,忽略某些警告等。如果成功打开文件,显示成功消息,否则提示错误消息。
4、处理按钮点击事件
一开始想用textbox去获取用户复制粘贴的文件地址,但是操作起来有点复杂,所以想实现以对话框的形式弹出供用户自行选择。在Form1的设计界面添加button:“打开文件”
双击按钮进入点击事件,编辑代码:
private void OpenFile_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "SolidWorks 文件 (*.sldprt;*.sldasm;*.slddrw)|*.sldprt;*.sldasm;*.slddrw|所有文件 (*.*)|*.*";
openFileDialog.Title = "打开 SolidWorks 文件";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = openFileDialog.FileName;
OpenSolidWorksFile(filePath);
}
}
}
使用 OpenFileDialog 显示文件选择对话框,允许用户选择一个 SolidWorks 文件。如果用户选择了文件并点击“确定”,则获取用户选择的文件路径并调用 OpenSolidWorksFile 方法打开文件。
3、测试
如果没有运行Solidworks,运行程序以后会有如下报错
并且强行结束进程。
再打开Solidworks 2022
运行程序点击打开文件按钮,会弹出选择文件的对话框
顺利打开,弹出打开成功提示框。