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 { /// /// 分部类,主要是与Sw插件交互的方法 /// [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 PluginInfos = new List(); // 激活文档变更事件 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); } } /// /// 设置监听器自启动 /// 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); } } } /// /// 启动Listener相关进程 /// 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 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(); foreach (string path in plugins) { Assembly ass = Assembly.LoadFrom(path); // 找被PdmSwPluginAttribute注解过的类做插件界面 Type type = ass.GetTypes().Where(t => t.GetCustomAttribute() != null).FirstOrDefault(); if (type == null) { continue; } PdmSwPluginAttribute attr = type.GetCustomAttribute(); 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); } } } /// /// 处理插件 /// /// 插件对象 private void HandlePlugin(object obj, TabControl tab) { PdmSwPluginAttribute attr = obj.GetType().GetCustomAttribute(); HandlePlugin(attr, obj); tab.Items.Add(new TabItem { Header = attr.Title, Content = obj }); if (obj is ITabControlSelectionChangeHandler handler) { tab.SelectionChanged += handler.OnTabControlSelectionChange; } } /// /// 处理插件 /// /// PdmSwPluginAttribute 注解 /// 插件对象 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); } /// /// 连接到SolidWorks之后,激活文档发生变更后执行的操作 /// /// /// /// 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("插件切换文件时发生异常,详情请见日志!"); } } /// /// 连接到SolidWorks之后,激活中的文档保存后执行的操作 /// /// /// 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; handler.DisabledHandler(); } } PluginInfos.Clear(); } } catch (Exception ex) { Logger.Error("DeActiveHandler Failed.", ex); } } /// /// 连接到SolidWorks之后,激活中的文档自定义属性变更的操作 /// /// /// /// 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("自定义属性变更发生异常,详情请见日志!"); } } } }