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("自定义属性变更发生异常,详情请见日志!");
}
}
}
}