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; namespace PdmSwPlugin.Main { /// /// 分部类,主要是与Sw插件交互的方法 /// [PdmSwPlugin(AppId = "", Title = "物料优选", Version = "0.1")] public partial class MainControl { public SldWorks SwApp { get; private set; } private ILog Logger = LogManager.GetLogger("Main"); 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 TabControl tabControl; public MainControl(SldWorks swAddin) { SwApp = swAddin; GlobalConfig = PluginSetting.Instance; InitializeComponent(); self.DataContext = this; } // 本地调试用,连接SolidWorks public void AttachSolidWorks(SldWorks sld) { if (sld != null) { SwApp = sld; } } private void AddPlugin() { 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, tabControl); } if (permissions.Contains("PDM:PLUGIN:CONTROL:PropertySetting")) { // 属性设置 if (CustomerSetting.Instance["customer"] == "YWT") { CommonSettingControl cs = new CommonSettingControl(SwApp); HandlePlugin(cs, tabControl); } else { PropertySettingControl ps = new PropertySettingControl(SwApp); HandlePlugin(ps, tabControl); } } if (permissions.Contains("PDM:PLUGIN:CONTROL:PDM")) { // PDM PdmControl pdm = new PdmControl(SwApp); HandlePlugin(pdm, tabControl); } if (permissions.Contains("PDM:PLUGIN:CONTROL:PriceCheck")) { // 加工件核价 PriceCheckControl priceCheck = new PriceCheckControl(SwApp); HandlePlugin(priceCheck, tabControl); } if (permissions.Contains("PDM:PLUGIN:CONTROL:DrawApprove")) { // 图纸审核 DrawApproveControl drawApprove = new DrawApproveControl(SwApp); HandlePlugin(drawApprove, tabControl); /*UserSettingControl userSettingControl = new UserSettingControl(); HandlePlugin(userSettingControl, tabControl);*/ } if (permissions.Contains("PDM:PLUGIN:CONTROL:DrawAuditHisQuery")) { // 图纸审核 DrawAuditHisControl drawAuditHisControl = new DrawAuditHisControl(SwApp); HandlePlugin(drawAuditHisControl, tabControl); /*UserSettingControl userSettingControl = new UserSettingControl(); HandlePlugin(userSettingControl, tabControl);*/ } } private void SetPlugin() { // 物料优选 MaterialSelectControl ms = new MaterialSelectControl(SwApp); HandlePlugin(ms, tabControl); // 属性设置 PropertySettingControl ps = new PropertySettingControl(SwApp); HandlePlugin(ps, tabControl); // PDM PdmControl pdm = new PdmControl(SwApp); HandlePlugin(pdm, tabControl); // 加工件核价 PriceCheckControl priceCheck = new PriceCheckControl(SwApp); HandlePlugin(priceCheck, tabControl); // 图纸审核 DrawApproveControl drawApprove = new DrawApproveControl(SwApp); HandlePlugin(drawApprove, 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); 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(); } /// /// 连接到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("自定义属性变更发生异常,详情请见日志!"); } } } }