1. 项目概述
今天要分享的是我在SOLIDWORKS PDM二次开发第四天的学习笔记。作为一款主流的产品数据管理软件,SOLIDWORKS PDM在企业级产品设计协作中扮演着重要角色。而通过C#进行的二次开发,可以让我们根据企业特定需求定制各种自动化流程和功能扩展。
特别说明:本文假设读者已具备C#基础语法知识,并已安装Visual Studio开发环境和SOLIDWORKS PDM客户端。
2. 开发环境准备
2.1 必备组件安装
在进行SOLIDWORKS PDM二次开发前,需要确保以下组件已正确安装:
- Visual Studio:推荐2017或更高版本,社区版即可满足开发需求
- .NET Framework:SOLIDWORKS PDM API主要基于.NET Framework 4.0-4.8
- SOLIDWORKS PDM API:安装SOLIDWORKS PDM客户端时会自动安装
验证安装是否成功的方法:
- 在Visual Studio中新建项目时,应能看到"SOLIDWORKS PDM Add-in"模板
- 检查引用中是否包含
EdmLib.dll、Interop.EdmLib.dll等核心库
2.2 项目创建步骤
- 打开Visual Studio,创建新的类库项目
- 添加对
EdmLib.dll的引用(通常位于[安装目录]\SOLIDWORKS PDM\Edm) - 设置目标框架为.NET Framework 4.0或更高版本
- 添加必要的using语句:
using EdmLib; using System.Runtime.InteropServices;3. 核心API解析
3.1 连接PDM库
建立与PDM库的连接是任何操作的基础。以下是典型连接代码:
IEdmVault5 vault = new EdmVault5(); bool isConnected = vault.LoginAuto("库名称", 0); if (!isConnected) { throw new Exception("无法连接到PDM库"); }参数说明:
"库名称":要连接的PDM库名称(区分大小写)0:表示使用当前Windows用户登录
3.2 文件操作API
3.2.1 获取文件对象
IEdmFile5 GetFile(string filePath) { IEdmFolder5 folder = vault.GetFolderFromPath(Path.GetDirectoryName(filePath)); return folder.GetFile(Path.GetFileName(filePath)); }3.2.2 检出/检入文件
// 检出文件 void CheckOutFile(IEdmFile5 file) { file.GetFileCopy(0, 0, null, (int)EdmGetFlag.EdmGet_Simple); } // 检入文件 void CheckInFile(IEdmFile5 file, string comment = "") { file.LockFile(0, (int)EdmLockFlag.EdmLock_OnlyLock); file.Checkin(0, comment, (int)EdmCheckinFlag.EdmCheckin_Simple); }3.3 变量操作
PDM中的变量是管理元数据的关键。以下是常用变量操作方法:
// 获取文件变量值 object GetVariableValue(IEdmFile5 file, string variableName) { IEdmVariable5 variable = vault.GetVariableByName(variableName); IEdmEnumeratorVariable8 enumVar = variable as IEdmEnumeratorVariable8; if (enumVar != null) { return enumVar.GetValue(file.ID); } return variable.Value; } // 设置文件变量值 void SetVariableValue(IEdmFile5 file, string variableName, object value) { IEdmVariable5 variable = vault.GetVariableByName(variableName); variable.SetValue(file.ID, value); file.SetVariables(0, ref variable); }4. 实战案例:自动版本管理工具
4.1 需求分析
开发一个能自动完成以下操作的插件:
- 批量检出指定文件夹下的所有文件
- 自动递增版本号
- 添加标准化的版本注释
- 批量检入更新后的文件
4.2 核心代码实现
public void BatchVersionUpdate(string folderPath) { try { IEdmFolder5 folder = vault.GetFolderFromPath(folderPath); IEdmEnumeratorVariable8 versionVar = vault.GetVariableByName("版本号") as IEdmEnumeratorVariable8; // 获取文件夹下所有文件 IEdmSearch5 search = vault.CreateSearch(); search.FindFiles = true; search.FileName = "*.*"; search.SetFolder(folder.ID); EdmSearchResult[] results = search.GetResults(); foreach (var result in results) { IEdmFile5 file = vault.GetFileFromPath(result.Path); // 检出文件 CheckOutFile(file); // 获取当前版本并递增 int currentVersion = (int)versionVar.GetValue(file.ID); versionVar.SetValue(file.ID, currentVersion + 1); // 设置版本注释 string comment = $"自动版本更新 v{currentVersion}→v{currentVersion + 1}"; SetVariableValue(file, "版本注释", comment); // 检入文件 CheckInFile(file, comment); } } catch (Exception ex) { Console.WriteLine($"操作失败: {ex.Message}"); } }5. 常见问题与解决方案
5.1 连接问题排查
问题现象:LoginAuto方法返回false
排查步骤:
- 确认PDM库名称拼写正确(区分大小写)
- 检查当前用户是否有该库的访问权限
- 确认PDM客户端服务正在运行
- 尝试使用
vault.LoginEx方法提供显式凭据
5.2 文件操作权限问题
问题现象:无法检出或检入文件
解决方案:
- 检查文件是否已被其他用户锁定
- 确认当前用户有修改权限
- 检查文件是否处于"只读"状态
- 尝试先获取文件的最新版本
5.3 变量操作异常
问题现象:变量值设置不生效
排查方法:
- 确认变量名称拼写正确
- 检查变量类型是否匹配(字符串/数字/日期等)
- 确保在设置变量后调用了
SetVariables方法 - 检查变量是否被配置为"只读"
6. 性能优化技巧
6.1 批量操作优化
当需要处理大量文件时,建议:
- 使用
IEdmBatchProcessor接口进行批量操作 - 减少不必要的文件检出/检入操作
- 在内存中缓存常用变量定义
6.2 异步处理
对于耗时操作,建议使用异步模式:
async Task ProcessFilesAsync(IEnumerable<string> filePaths) { await Task.Run(() => { foreach (var path in filePaths) { // 文件处理逻辑 } }); }6.3 日志记录
添加详细的日志记录有助于问题排查:
void Log(string message) { string logPath = @"C:\PDM_Logs\dev_log.txt"; File.AppendAllText(logPath, $"{DateTime.Now}: {message}\n"); }7. 进阶开发建议
7.1 自定义任务插件
SOLIDWORKS PDM支持创建自定义任务插件,实现更复杂的自动化流程:
- 创建继承自
IEdmAddIn5接口的类 - 实现必要的方法如
GetAddInInfo、OnCmd - 注册插件到PDM系统
7.2 与SOLIDWORKS集成
通过SOLIDWORKS API与PDM API结合,可以实现更强大的功能:
// 在SOLIDWORKS中获取当前文档的PDM信息 ModelDoc2 swModel = swApp.ActiveDoc; string filePath = swModel.GetPathName(); IEdmFile5 pdmFile = GetFile(filePath);7.3 数据库直接访问
对于复杂查询,可以直接访问PDM后台数据库:
注意:直接操作数据库需要谨慎,建议仅在必要时使用
string connectionString = "Server=PDM服务器;Database=库名称;Integrated Security=True"; using (SqlConnection conn = new SqlConnection(connectionString)) { // 执行SQL查询 }8. 调试技巧
8.1 调试附加
- 在Visual Studio中设置"附加到进程"
- 选择
explorer.exe或swShellFileExplorer.exe - 在代码中设置断点
8.2 单元测试
为关键功能创建单元测试:
[TestMethod] public void TestFileCheckout() { // 准备测试文件 string testFile = @"C:\Test\test.sldprt"; // 执行检出 IEdmFile5 file = GetFile(testFile); CheckOutFile(file); // 验证 Assert.IsTrue(file.IsLocked); }8.3 异常处理
完善的异常处理能提高插件稳定性:
try { // PDM操作代码 } catch (COMException ex) { // 处理COM异常 Log($"COM错误: {ex.ErrorCode} - {ex.Message}"); } catch (Exception ex) { // 处理一般异常 Log($"操作失败: {ex.Message}"); }9. 部署与维护
9.1 插件部署步骤
- 编译项目生成DLL文件
- 将DLL复制到
[PDM安装目录]\SOLIDWORKS PDM\AddIns - 在PDM管理控制台中启用插件
- 设置适当的权限
9.2 版本控制建议
- 使用PDM自身管理插件源代码
- 为每个版本添加清晰的变更日志
- 保持向后兼容性
9.3 用户权限配置
确保:
- 运行插件的用户有足够权限
- 必要时提升权限级别
- 考虑创建专门的"服务账户"运行自动化任务
10. 学习资源推荐
10.1 官方文档
- SOLIDWORKS PDM API帮助文档
- SOLIDWORKS开发者门户
- API参考手册(安装后本地可用)
10.2 实用工具
- PDM数据库查看器:查看PDM数据库结构
- API浏览器:快速查找API方法
- 日志分析工具:解析PDM日志文件
10.3 社区资源
- SOLIDWORKS官方论坛
- Stack Overflow上的相关标签
- GitHub上的开源项目参考
在实际开发中,我发现SOLIDWORKS PDM API虽然功能强大,但有些方法的行为与预期不符。例如,某些文件操作在不同版本的PDM中表现可能不一致。建议在关键功能实现后,在不同版本的PDM客户端上进行充分测试。另外,处理大量文件时,API的性能可能会成为瓶颈,这时候就需要考虑分批处理或使用后台任务等方式优化。