using SolidWorks.Interop.swdocumentmgr;
|
using System;
|
using System.Collections.Generic;
|
using System.Runtime.InteropServices;
|
|
namespace PdmSwPlugin.Common.Util
|
{
|
public class SwDMUtil
|
{
|
/// <summary>
|
/// 公司的 DM API 授权码
|
/// </summary>
|
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";
|
|
|
/// <summary>
|
/// 获取一张工程图引用的3D图路径
|
/// </summary>
|
/// <param name="filePath"></param>
|
/// <param name="error1"></param>
|
/// <param name="error2"></param>
|
/// <returns></returns>
|
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;
|
}
|
}
|
|
|
/// <summary>
|
/// 获取一张工程图引用的3D图路径
|
/// </summary>
|
/// <param name="filePath"></param>
|
/// <param name="error1"></param>
|
/// <param name="error2"></param>
|
/// <returns></returns>
|
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<string, string> 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<string, string> datas = new Dictionary<string, string>();
|
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;
|
}
|
}
|
}
|
}
|