using SolidWorks.Interop.swdocumentmgr; using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace PdmSwPlugin.Common.Util { public class SwDMUtil { /// /// 公司的 DM API 授权码 /// public static string LinktronLicenseKey = @"SuzhouLinktronSystemsCoLtd:swdocmgr_general-11785-02051-00064-33793-08629-34307-00007-05128-58478-32321-57480-30765-00622-59999-16385-62752-47753-50558-31076-40652-29868-22926-54604-41449-54717-42289-44473-51665-47549-58701-53709-46485-03533-12733-37329-14337-29280-51290-50890-25690-25696-964"; /// /// 获取一张工程图引用的3D图路径 /// /// /// /// /// public static string GetDrawingRef(string filePath, out string errMsg) { errMsg = null; try { string originalExt; SwDmDocumentType docType = DMSldFileExtentionChecker.CheckDM(filePath, out originalExt); if (docType != SwDmDocumentType.swDmDocumentDrawing) { errMsg = "给定的文档不是一张工程图"; throw null; } SwDMClassFactory swDMClassFactory = new SwDMClassFactory(); SwDMApplication swDMApp = swDMClassFactory.GetApplication(LinktronLicenseKey); if (swDMApp == null) { Marshal.ReleaseComObject(swDMClassFactory); errMsg = "SwDM 初始化失败"; return null; } SwDMDocument23 swDoc = (SwDMDocument23)swDMApp.GetDocument(filePath, docType, true, out var error1); if (swDoc == null) { Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"SwDM 加载文档失败,异常【{error1}】"; return null; } var swSearchOpt = swDMApp.GetSearchOptionObject(); object vBrokenRefs = null; object vIsVirtuals = null; object vTimeStamps = null; object vIsImported = null; string[] views = (string[])swDoc.GetAllExternalReferences5(swSearchOpt, out vBrokenRefs, out vIsVirtuals, out vTimeStamps, out vIsImported); if (views == null || views.Length <= 0) { Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"选定的工程图不包含有效的视图"; return null; } string result = views[0]; Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); return result; } catch (Exception ex) { errMsg = ex.Message; return null; } } /// /// 获取一张工程图引用的3D图路径 /// /// /// /// /// public static string[] GetDrawingRef2(string filePath, out string errMsg, out int[] status) { errMsg = null; status = null; try { string originalExt; SwDmDocumentType docType = DMSldFileExtentionChecker.CheckDM(filePath, out originalExt); if (docType != SwDmDocumentType.swDmDocumentDrawing) { errMsg = "给定的文档不是一张工程图"; throw null; } SwDMClassFactory swDMClassFactory = new SwDMClassFactory(); SwDMApplication swDMApp = swDMClassFactory.GetApplication(LinktronLicenseKey); if (swDMApp == null) { Marshal.ReleaseComObject(swDMClassFactory); errMsg = "SwDM 初始化失败"; return null; } SwDMDocument23 swDoc = (SwDMDocument23)swDMApp.GetDocument(filePath, docType, true, out var error1); if (swDoc == null) { Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"SwDM 加载文档失败,异常【{error1}】"; return null; } var swSearchOpt = swDMApp.GetSearchOptionObject(); object vBrokenRefs = null; object vIsVirtuals = null; object vTimeStamps = null; object vIsImported = null; string[] views = (string[])swDoc.GetAllExternalReferences5(swSearchOpt, out vBrokenRefs, out vIsVirtuals, out vTimeStamps, out vIsImported); if (views == null || views.Length <= 0) { Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"选定的工程图不包含有效的视图"; return null; } Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); status = (int[])vBrokenRefs; return views; } catch (Exception ex) { errMsg = ex.Message; return null; } } public static double[] GetMassProperty(string filePath, out string errMsg) { try { errMsg = null; string originalExt; SwDmDocumentType docType = DMSldFileExtentionChecker.CheckDM(filePath, out originalExt); if (docType == SwDmDocumentType.swDmDocumentUnknown) { errMsg = "未知的文档类型"; return null; } SwDMClassFactory swDMClassFactory = new SwDMClassFactory(); SwDMApplication swDMApp = swDMClassFactory.GetApplication(LinktronLicenseKey); if (swDMApp == null) { Marshal.ReleaseComObject(swDMClassFactory); errMsg = "SwDM 初始化失败"; return null; } SwDMDocument17 swDoc = (SwDMDocument17)swDMApp.GetDocument(filePath, docType, true, out var error1); if (swDoc == null) { Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"SwDM 加载文档失败,异常【{error1}】"; return null; } SwDMConfigurationMgr dmConfigMgr = swDoc.ConfigurationManager; if (dmConfigMgr == null) { Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"获取 ConfigurationManager 失败"; return null; } string configName = dmConfigMgr.GetActiveConfigurationName(); SwDMConfiguration dmConfig = dmConfigMgr.GetConfigurationByName(configName); if (dmConfig == null) { Marshal.ReleaseComObject(dmConfigMgr); Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"获取 Configuration 失败"; return null; } double[] datas = dmConfig.GetMassProperties(out SwDmMassPropError error2); errMsg = $"读取质量参数失败,【{error2}】"; swDoc.CloseDoc(); Marshal.ReleaseComObject(dmConfig); Marshal.ReleaseComObject(dmConfigMgr); Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); return datas; } catch (Exception ex) { errMsg = ex.Message; return null; } } public static Dictionary GetProperty(string filePath, out string errMsg) { try { errMsg = null; string originalExt; SwDmDocumentType docType = DMSldFileExtentionChecker.CheckDM(filePath, out originalExt); if (docType == SwDmDocumentType.swDmDocumentUnknown) { errMsg = "未知的文档类型"; return null; } SwDMClassFactory swDMClassFactory = new SwDMClassFactory(); SwDMApplication swDMApp = swDMClassFactory.GetApplication(LinktronLicenseKey); if (swDMApp == null) { Marshal.ReleaseComObject(swDMClassFactory); errMsg = "SwDM 初始化失败"; return null; } SwDMDocument17 swDoc = (SwDMDocument17)swDMApp.GetDocument(filePath, docType, true, out var error1); if (swDoc == null) { Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"SwDM 加载文档失败,异常【{error1}】"; return null; } SwDMConfigurationMgr dmConfigMgr = swDoc.ConfigurationManager; if (dmConfigMgr == null) { Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"获取 ConfigurationManager 失败"; return null; } string configName = dmConfigMgr.GetActiveConfigurationName(); SwDMConfiguration dmConfig = dmConfigMgr.GetConfigurationByName(configName); if (dmConfig == null) { Marshal.ReleaseComObject(dmConfigMgr); Marshal.ReleaseComObject(swDoc); Marshal.ReleaseComObject(swDMApp); Marshal.ReleaseComObject(swDMClassFactory); errMsg = $"获取 Configuration 失败"; return null; } Dictionary datas = new Dictionary(); string[] names = dmConfig.GetCustomPropertyNames(); names = swDoc.GetCustomPropertyNames(); foreach (string name in names) { string val = swDoc.GetCustomProperty2(name, out var type); datas.Add(name, val); } return datas; } catch (Exception ex) { errMsg = ex.Message; return null; } } } }