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;
}
}
}
}