using System;
|
using PdmSwPlugin.Common.CustomHandler;
|
using System.Reflection;
|
using PdmSwPlugin.Common.Interface;
|
using System.Windows.Controls;
|
using PdmSwPlugin.Common;
|
using System.Linq;
|
using SolidWorks.Interop.sldworks;
|
using System.Collections.Generic;
|
using PdmSwPlugin.PropertySetting;
|
using PdmSwPlugin.PDM;
|
using PdmSwPlugin.DrawApprove;
|
using PdmSwPlugin.Common.Util.Http;
|
using PdmSwPlugin.Common.Util;
|
using log4net;
|
using PdmSwPlugin.Common.Entity.System;
|
using PdmSwPlugin.MaterialSelect;
|
using PdmSwPlugin.PriceCheck;
|
using PdmSwPlugin.Common.Setting;
|
using Microsoft.Win32;
|
using System.IO;
|
using System.Diagnostics;
|
|
namespace PdmSwPlugin.Main
|
{
|
/// <summary>
|
/// 分部类,主要是与Sw插件交互的方法
|
/// </summary>
|
[PdmSwPlugin(AppId = "", Title = "物料优选", Version = "0.1")]
|
public partial class MainControl
|
{
|
public SldWorks SwApp { get; private set; }
|
|
private ILog Logger;
|
private PluginSetting GlobalConfig;
|
|
private string[] plugins = {
|
// $"C:\\Users\\cheng\\Documents\\Workspace\\PdmSw\\bin\\x64\\Debug\\Plugins\\PdmSwPlugin.MaterialSelect.dll",
|
$"C:\\Users\\cheng\\Documents\\Workspace\\PdmSwPlugin.MaterialSelect\\bin\\Debug\\PdmSwPlugin.MaterialSelect.dll",
|
//$"C:\\Users\\cheng\\Documents\\Workspace\\PdmSwPlugin.PropertySetting\\bin\\Debug\\PdmSwPlugin.PropertySetting.dll"
|
};
|
|
// 所有插件头信息,高级检查更新的程序需要这个
|
private List<PdmSwPluginAttribute> PluginInfos = new List<PdmSwPluginAttribute>();
|
|
// 激活文档变更事件
|
public event SwActiveDocChangeHandler ActiveDocChangeEvent;
|
// 文档保存事件
|
public event SwActiveDocSavedHandler ActiveDocSavedEvent;
|
// 自定义属性变更事件
|
public event SwActiveDocCustomPropertyChangeHandler ActiveDocCustomPropertyChange;
|
public event DocDestroy DocDestroy;
|
public event AfterDocDestroy AfterDocDestroy;
|
|
private HttpClientCreator clientCreator { get; set; }
|
|
private MainTab mainTab;
|
|
public MainControl(SldWorks swAddin)
|
{
|
var log = LogManager.GetLogger("Main");
|
Logger = log;
|
SwApp = swAddin;
|
GlobalConfig = PluginSetting.Instance;
|
InitializeComponent();
|
self.DataContext = this;
|
InitTcpServer();
|
try
|
{
|
CheckAutoRunRegKey();
|
StartListenerProcess();
|
}
|
catch (Exception e)
|
{
|
log.Error("Start Listener Error!", e);
|
}
|
}
|
|
/// <summary>
|
/// 设置监听器自启动
|
/// </summary>
|
private void CheckAutoRunRegKey()
|
{
|
RegistryKey root = null;
|
RegistryKey key = null;
|
try
|
{
|
root = Registry.CurrentUser;
|
key = root.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
|
string name = "SolidWorksListener";
|
if (key == null)
|
{
|
key = root.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
|
}
|
// 没有路径或者路径指向exe不对,就更新自启动路径
|
string listenerPath = key.GetValue(name)?.ToString();
|
string rootDir = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent.FullName;
|
string newPath = Path.Combine(rootDir, "Listener", "SolidWorksListener.exe");
|
if (string.IsNullOrEmpty(listenerPath) || new Uri(listenerPath) != new Uri(newPath))
|
{
|
key.SetValue(name, newPath, RegistryValueKind.String);
|
}
|
|
}
|
catch (Exception e)
|
{
|
Logger.Error("CheckAutoRunRegKey Failed!", e);
|
}
|
finally
|
{
|
try
|
{
|
if (key != null) key.Close();
|
if (root != null) root.Close();
|
}
|
catch (Exception ex)
|
{
|
Logger.Error("Reg Key Close Failed!", ex);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 启动Listener相关进程
|
/// </summary>
|
public void StartListenerProcess()
|
{
|
string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
string path1 = Path.Combine(dir, "Listener", "SolidWorksListener.exe");
|
if (File.Exists(path1))
|
{
|
ProcessStartInfo info = new ProcessStartInfo
|
{
|
FileName = path1,
|
WorkingDirectory = Path.GetDirectoryName(path1)
|
};
|
|
new Process
|
{
|
StartInfo = info
|
}.Start();
|
}
|
}
|
|
// 本地调试用,连接SolidWorks
|
public void AttachSolidWorks(SldWorks sld)
|
{
|
if (sld != null)
|
{
|
SwApp = sld;
|
}
|
}
|
|
private void AddPlugin()
|
{
|
mainTab.tabControl.Items.Clear();
|
SetPluginWithPermission();
|
//LoadPlugins();
|
//TestWeb testWeb = new TestWeb();
|
}
|
|
private void SetPluginWithPermission()
|
{
|
PdmUser currentUser = PdmUser.LoginUser;
|
if (currentUser == null)
|
{
|
return;
|
}
|
HashSet<string> permissions = currentUser.permissions;
|
if (permissions.Contains("PDM:PLUGIN:CONTROL:MaterialSelect"))
|
{
|
// 物料优选
|
MaterialSelectControl ms = new MaterialSelectControl(SwApp);
|
HandlePlugin(ms, mainTab.tabControl);
|
}
|
if (permissions.Contains("PDM:PLUGIN:CONTROL:PropertySetting"))
|
{
|
// 属性设置
|
if (CustomerSetting.Instance["customer"] == "YWT")
|
{
|
CommonSettingControl cs = new CommonSettingControl(SwApp);
|
HandlePlugin(cs, mainTab.tabControl);
|
cs.InitPropertyData();
|
}
|
else
|
{
|
PropertySettingControl ps = new PropertySettingControl(SwApp);
|
HandlePlugin(ps, mainTab.tabControl);
|
}
|
}
|
if (permissions.Contains("PDM:PLUGIN:CONTROL:PDM"))
|
{
|
// PDM
|
PdmControl pdm = new PdmControl(SwApp);
|
HandlePlugin(pdm, mainTab.tabControl);
|
}
|
if (permissions.Contains("PDM:PLUGIN:CONTROL:PriceCheck"))
|
{
|
// 加工件核价
|
PriceCheckControl priceCheck = new PriceCheckControl(SwApp);
|
HandlePlugin(priceCheck, mainTab.tabControl);
|
}
|
if (permissions.Contains("PDM:PLUGIN:CONTROL:DrawApprove"))
|
{
|
// 图纸审核
|
DrawApproveControl drawApprove = new DrawApproveControl(SwApp);
|
HandlePlugin(drawApprove, mainTab.tabControl);
|
/*UserSettingControl userSettingControl = new UserSettingControl();
|
HandlePlugin(userSettingControl, tabControl);*/
|
}
|
if (permissions.Contains("PDM:PLUGIN:CONTROL:DrawAuditHisQuery"))
|
{
|
// 图纸审核
|
DrawAuditHisControl drawAuditHisControl = new DrawAuditHisControl(SwApp);
|
HandlePlugin(drawAuditHisControl, mainTab.tabControl);
|
/*UserSettingControl userSettingControl = new UserSettingControl();
|
HandlePlugin(userSettingControl, tabControl);*/
|
}
|
}
|
|
private void SetPlugin()
|
{
|
// 物料优选
|
MaterialSelectControl ms = new MaterialSelectControl(SwApp);
|
HandlePlugin(ms, mainTab.tabControl);
|
// 属性设置
|
PropertySettingControl ps = new PropertySettingControl(SwApp);
|
HandlePlugin(ps, mainTab.tabControl);
|
// PDM
|
PdmControl pdm = new PdmControl(SwApp);
|
HandlePlugin(pdm, mainTab.tabControl);
|
// 加工件核价
|
PriceCheckControl priceCheck = new PriceCheckControl(SwApp);
|
HandlePlugin(priceCheck, mainTab.tabControl);
|
// 图纸审核
|
DrawApproveControl drawApprove = new DrawApproveControl(SwApp);
|
HandlePlugin(drawApprove, mainTab.tabControl);
|
}
|
|
private void LoadPlugins()
|
{
|
PluginInfos = new List<PdmSwPluginAttribute>();
|
foreach (string path in plugins)
|
{
|
Assembly ass = Assembly.LoadFrom(path);
|
// 找被PdmSwPluginAttribute注解过的类做插件界面
|
Type type = ass.GetTypes().Where(t => t.GetCustomAttribute<PdmSwPluginAttribute>() != null).FirstOrDefault();
|
if (type == null)
|
{
|
continue;
|
}
|
PdmSwPluginAttribute attr = type.GetCustomAttribute<PdmSwPluginAttribute>();
|
PluginLoader p = new PluginLoader(attr.Title);
|
try
|
{
|
string name = Assembly.GetAssembly(type).GetName().FullName;
|
object obj = p.appDomain.CreateInstanceAndUnwrap(name, type.FullName);
|
// p.GetInstance(type.FullName);
|
// 处理插件
|
HandlePlugin(attr, obj);
|
mainTab.tabControl.Items.Add(new TabItem
|
{
|
Header = attr.Title,
|
Content = obj
|
});
|
}
|
catch (Exception e)
|
{
|
Logger.Error($"插件加载错误!插件名:{attr.Title}!", e);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 处理插件
|
/// </summary>
|
/// <param name="obj">插件对象</param>
|
private void HandlePlugin(object obj, TabControl tab)
|
{
|
PdmSwPluginAttribute attr = obj.GetType().GetCustomAttribute<PdmSwPluginAttribute>();
|
HandlePlugin(attr, obj);
|
tab.Items.Add(new TabItem
|
{
|
Header = attr.Title,
|
Content = obj
|
});
|
if (obj is ITabControlSelectionChangeHandler handler)
|
{
|
tab.SelectionChanged += handler.OnTabControlSelectionChange;
|
}
|
}
|
|
/// <summary>
|
/// 处理插件
|
/// </summary>
|
/// <param name="attr">PdmSwPluginAttribute 注解</param>
|
/// <param name="obj">插件对象</param>
|
private void HandlePlugin(PdmSwPluginAttribute attr, object obj)
|
{
|
// 设置SwApp
|
if (obj is ISwAppSetter setter)
|
{
|
setter.SetSwApp(SwApp);
|
}
|
|
// 向主Control注册事件
|
if (obj is IActiveDocChangeHandler handler)
|
{
|
ActiveDocChangeEvent += handler.OnSwActiveDocChange;
|
ActiveDocSavedEvent += handler.OnSwActiveDocSaved;
|
ActiveDocCustomPropertyChange += handler.OnCustomPropertyChange;
|
DocDestroy += handler.OnDocDestroy;
|
AfterDocDestroy += handler.AfterDocDestroy;
|
}
|
PluginInfos.Add(attr);
|
}
|
|
/// <summary>
|
/// 连接到SolidWorks之后,激活文档发生变更后执行的操作
|
/// </summary>
|
/// <param name="oldDoc"></param>
|
/// <param name="newDoc"></param>
|
/// <param name="comp"></param>
|
public void OnActiveDocChange(ModelDoc2 oldDoc, ModelDoc2 newDoc, Component2 comp)
|
{
|
try
|
{
|
ActiveDocChangeEvent?.Invoke(oldDoc, newDoc, comp);
|
}
|
catch (Exception e)
|
{
|
Logger.Error("MainControl.OnDocChange事件执行异常", e);
|
this.Error("插件切换文件时发生异常,详情请见日志!");
|
}
|
}
|
|
/// <summary>
|
/// 连接到SolidWorks之后,激活中的文档保存后执行的操作
|
/// </summary>
|
/// <param name="doc"></param>
|
/// <param name="comp"></param>
|
public void OnDocSaved(ModelDoc2 doc, Component2 comp)
|
{
|
try
|
{
|
ActiveDocSavedEvent?.Invoke(doc, comp);
|
}
|
catch (Exception e)
|
{
|
Logger.Error("MainControl.OnDocSaved事件执行异常!", e);
|
this.Error("插件文件保存后发生异常,详情请见日志!");
|
}
|
}
|
|
public int OnDocDestroy(ModelDoc2 doc)
|
{
|
DocDestroy?.Invoke(doc);
|
return 0;
|
}
|
|
public void OnAfterDocDestroy()
|
{
|
AfterDocDestroy?.Invoke();
|
}
|
|
public void DeActiveHandler()
|
{
|
try
|
{
|
if (mainTab?.tabControl != null)
|
{
|
foreach (TabItem item in mainTab.tabControl.Items)
|
{
|
// 向主Control注册事件
|
if (item.Content is IActiveDocChangeHandler handler)
|
{
|
ActiveDocChangeEvent -= handler.OnSwActiveDocChange;
|
ActiveDocSavedEvent -= handler.OnSwActiveDocSaved;
|
ActiveDocCustomPropertyChange -= handler.OnCustomPropertyChange;
|
DocDestroy -= handler.OnDocDestroy;
|
AfterDocDestroy -= handler.AfterDocDestroy;
|
}
|
}
|
PluginInfos.Clear();
|
}
|
}
|
catch (Exception ex)
|
{
|
Logger.Error("DeActiveHandler Failed.", ex);
|
}
|
}
|
|
/// <summary>
|
/// 连接到SolidWorks之后,激活中的文档自定义属性变更的操作
|
/// </summary>
|
/// <param name="lastDoc"></param>
|
/// <param name="doc"></param>
|
/// <param name="comp"></param>
|
public void OnCustomPropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType)
|
{
|
try
|
{
|
ActiveDocCustomPropertyChange?.Invoke(propName, Configuration, oldValue, NewValue, valueType);
|
}
|
catch (Exception e)
|
{
|
Logger.Error("MainControl.OnCustomPropertyChange事件执行异常!", e);
|
this.Error("自定义属性变更发生异常,详情请见日志!");
|
}
|
}
|
|
}
|
}
|