using log4net; using log4net.Appender; using log4net.Config; using log4net.Core; using PdmSwPlugin.Common; using PdmSwPlugin.Common.Setting; using PdmSwPlugin.Main; using PdmSwPlugin.Main.EventHandler; using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; using SolidWorks.Interop.swpublished; using SolidWorksTools; using SolidWorksTools.File; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Windows.Forms.Integration; namespace PdmSw { /// /// ... /// [Guid("DF23E96F-A469-4302-8367-7FA2F798CD09"), ComVisible(true)] [SwAddin( Description = "SolidWorks²å¼þ", Title = "PdmSwPlugin", LoadAtStartup = true )] public partial class SwAddin : ISwAddin { static SwAddin() { // AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; // AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_AssemblyResolve; /// ÉèÖÃlog4netÅäÖà string dllLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string file = Path.Combine(dllLocation, "log4net.config"); FileInfo info = new FileInfo(file); XmlConfigurator.Configure(info); var curPath = LogManager.GetRepository(); var appenders = curPath.GetAppenders(); if (appenders == null) return; foreach (var appender in appenders) { var rollingFileAppender = appender as RollingFileAppender; if (rollingFileAppender == null) continue; rollingFileAppender.File = dllLocation + "/Log/"; rollingFileAppender.ActivateOptions(); } } /// /// ÍüÁË /// /// /// /// /// private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { string dir = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent.FullName; dir = Path.Combine(dir, @"Libs"); if (args.Name.Contains(".resources")) { return default; } //if (AppDomain.CurrentDomain.GetAssemblies() // .Where(x => !x.IsDynamic) // .First(x => x.FullName == args.Name) is Assembly alreadyLoaded) //{ // return alreadyLoaded; //} string s = null; string name = new AssemblyName(args.Name).Name; foreach (var ss in Directory.EnumerateFiles(dir)) { string sss = Path.GetFileNameWithoutExtension(ss); if (sss == name) { s = ss; break; } } if (s != null) { return Assembly.LoadFile(s); } throw new DllNotFoundException(); } #region Local Variables ÊôÐÔ ICommandManager iCmdMgr = null; int addinID = 0; BitmapHandler iBmp; public const int mainCmdGroupID = 5; public const int mainItemID1 = 0; public const int mainItemID2 = 1; public const int mainItemID3 = 2; public const int flyoutGroupID = 91; /// /// ÉϴεĻÎĵµ /// private ModelDoc2 lastActiveDoc = null; private ILog Logger; /// /// ²å¼þÖ÷Ìå /// private MainControl mainControl = null; private PluginSetting GlobalConfig; #region Property Manager Variables UserPMPage ppage = null; #endregion private BaseAttacher attacher; private ISldWorks swApp; // Public Properties public ISldWorks SwApp { get => swApp; } public ICommandManager CmdMgr { get { return iCmdMgr; } } #endregion #region SolidWorks Registration ×¢²á±íÏà¹Ø /// /// дע²á±í /// /// [ComRegisterFunctionAttribute] public static void RegisterFunction(Type t) { #region Get Custom Attribute: SwAddinAttribute »ñÈ¡³£Á¿ SwAddinAttribute SWattr = null; Type type = typeof(SwAddin); foreach (System.Attribute attr in type.GetCustomAttributes(false)) { if (attr is SwAddinAttribute) { SWattr = attr as SwAddinAttribute; break; } } #endregion try { Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine; string keyId = t.GUID.ToString(); string keyname = $"SOFTWARE\\SolidWorks\\Addins\\{{{keyId}}}"; Microsoft.Win32.RegistryKey addinkey = hklm.CreateSubKey(keyname); addinkey.SetValue(null, 0); addinkey.SetValue("Description", SWattr.Description); addinkey.SetValue("Title", SWattr.Title); Microsoft.Win32.RegistryKey hkcu = Microsoft.Win32.Registry.CurrentUser; keyname = $"Software\\SolidWorks\\AddInsStartup\\{{{keyId}}}"; addinkey = hkcu.CreateSubKey(keyname); addinkey.SetValue(null, Convert.ToInt32(SWattr.LoadAtStartup), Microsoft.Win32.RegistryValueKind.DWord); } catch (System.NullReferenceException nl) { Console.WriteLine("There was a problem registering this dll: SWattr is null. \n\"" + nl.Message + "\""); System.Windows.Forms.MessageBox.Show("There was a problem registering this dll: SWattr is null.\n\"" + nl.Message + "\""); } catch (System.Exception e) { Console.WriteLine(e.Message); System.Windows.Forms.MessageBox.Show("There was a problem registering the function: \n\"" + e.Message + "\""); } } /// /// ɾע²á±í /// /// [ComUnregisterFunctionAttribute] public static void UnregisterFunction(Type t) { try { Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine; Microsoft.Win32.RegistryKey hkcu = Microsoft.Win32.Registry.CurrentUser; string keyId = t.GUID.ToString(); string keyname = $"SOFTWARE\\SolidWorks\\Addins\\{{{keyId}}}"; hklm.DeleteSubKey(keyname); keyname = $"Software\\SolidWorks\\AddInsStartup\\{{{keyId}}}"; hkcu.DeleteSubKey(keyname); } catch (System.NullReferenceException nl) { Console.WriteLine("There was a problem unregistering this dll: " + nl.Message); System.Windows.Forms.MessageBox.Show("There was a problem unregistering this dll: \n\"" + nl.Message + "\""); } catch (System.Exception e) { Console.WriteLine("There was a problem unregistering this dll: " + e.Message); System.Windows.Forms.MessageBox.Show("There was a problem unregistering this dll: \n\"" + e.Message + "\""); } } #endregion #region ISwAddin Implementation ²å¼þ¾ßÌåʵÏÖ public SwAddin() { Logger = BaseAttacher.Logger; // Çл»ÅäÖÃÎļþµØÖ· // ChangeAppConfig(); GlobalConfig = PluginSetting.Instance; } public bool ConnectToSW(object ThisSW, int cookie) { swApp = (ISldWorks)ThisSW; addinID = cookie; //Setup callbacks SwApp.SetAddinCallbackInfo2(0, this, addinID); #region Setup the Command Manager iCmdMgr = SwApp.GetCommandManager(cookie); // AddCommandMgr(); #endregion // ¼ÓÔØ²å¼þ SetPlugins(); attacher = new BaseAttacher(swApp, mainControl); attacher.AttachEventHandlers(); #region Setup Sample Property Manager AddPMP(); #endregion // GlobalExceptionHandler(); //LoadPlugins(); return true; } private void SetPlugins() { // ¶Áͼ£¬¹À¼ÆÊÇpanelµÄͼ±ê string location = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string imageFolder = Path.Combine(location, @"Images"); string[] bitmaps = new string[] { Path.Combine(imageFolder, @"MatChooser_20X20.png"), Path.Combine(imageFolder, @"MatChooser_32X32.png"), Path.Combine(imageFolder, @"MatChooser_40X40.png"), Path.Combine(imageFolder, @"MatChooser_64X64.png"), Path.Combine(imageFolder, @"MatChooser_96X96.png"), Path.Combine(imageFolder, @"MatChooser_128X128.png") }; // ´´½¨Panel TaskpaneView panel = SwApp.CreateTaskpaneView3(bitmaps, "PdmSwPlugin" + PluginConst.Version); mainControl = new MainControl((SldWorks)SwApp); // Ö»ÄÜÓÃwinform£¬´úÀíwpf ElementHost host = new ElementHost { Child = mainControl, AutoSize = true, Dock = DockStyle.Fill }; Form form = new Form { Text = "PdmSwPlugin", ControlBox = false, FormBorderStyle = FormBorderStyle.None, KeyPreview = true, Dock = DockStyle.Fill }; form.Controls.Add(host); IntPtr ptr = form.Handle; // IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "Window1"); panel.DisplayWindowFromHandlex64(ptr.ToInt64()); } private void LoadPlugins() { // ¶Áͼ£¬¹À¼ÆÊÇpanelµÄͼ±ê string location = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string imageFolder = Path.Combine(location, @"Images"); string[] bitmaps = new string[] { Path.Combine(imageFolder, @"MatChooser_20X20.png"), Path.Combine(imageFolder, @"MatChooser_32X32.png"), Path.Combine(imageFolder, @"MatChooser_40X40.png"), Path.Combine(imageFolder, @"MatChooser_64X64.png"), Path.Combine(imageFolder, @"MatChooser_96X96.png"), Path.Combine(imageFolder, @"MatChooser_128X128.png") }; // ´´½¨Panel TaskpaneView panel = SwApp.CreateTaskpaneView3(bitmaps, "ÎïÁϲéѯ" + PluginConst.Version); PluginLoader pl = new PluginLoader("ms"); long res = (long)pl.ExecuteMothod("PdmSwPlugin.MaterialSelect.MaterialSelectControl", "GetWindowHandle", new object[] { (SldWorks)SwApp }); panel.DisplayWindowFromHandlex64(res); } /// /// ¶Ï¿ªÓëSolidWorksÁ¬½Ó /// /// public bool DisconnectFromSW() { RemoveCommandMgr(); RemovePMP(); mainControl.StopTcpServer(); attacher.DetachEventHandlers(); attacher = null; System.Runtime.InteropServices.Marshal.ReleaseComObject(iCmdMgr); iCmdMgr = null; System.Runtime.InteropServices.Marshal.ReleaseComObject(SwApp); swApp = null; //The addin _must_ call GC.Collect() here in order to retrieve all managed code pointers GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); return true; } #endregion #region Ä£°å×Ô´øµÄÓò»µ½µÄ·½·¨£¬±ðɾÍòÒ»ÓÐÓà #region UI Methods public void AddCommandMgr() { ICommandGroup cmdGroup; if (iBmp == null) iBmp = new BitmapHandler(); Assembly thisAssembly; int cmdIndex0, cmdIndex1; string Title = "LHJ²å¼þ", ToolTip = "LHJ²å¼þ"; int[] docTypes = new int[]{(int)swDocumentTypes_e.swDocASSEMBLY, (int)swDocumentTypes_e.swDocDRAWING, (int)swDocumentTypes_e.swDocPART}; thisAssembly = System.Reflection.Assembly.GetAssembly(this.GetType()); int cmdGroupErr = 0; bool ignorePrevious = false; object registryIDs; //get the ID information stored in the registry bool getDataResult = iCmdMgr.GetGroupDataFromRegistry(mainCmdGroupID, out registryIDs); int[] knownIDs = new int[2] { mainItemID1, mainItemID2 }; if (getDataResult) { if (!CompareIDs((int[])registryIDs, knownIDs)) //if the IDs don't match, reset the commandGroup { ignorePrevious = true; } } cmdGroup = iCmdMgr.CreateCommandGroup2(mainCmdGroupID, Title, ToolTip, "", -1, ignorePrevious, ref cmdGroupErr); cmdGroup.LargeIconList = iBmp.CreateFileFromResourceBitmap("PdmSw.Images.ToolbarLarge.bmp", thisAssembly); cmdGroup.SmallIconList = iBmp.CreateFileFromResourceBitmap("PdmSw.Images.ToolbarSmall.bmp", thisAssembly); cmdGroup.LargeMainIcon = iBmp.CreateFileFromResourceBitmap("PdmSw.Images.MainIconLarge.bmp", thisAssembly); cmdGroup.SmallMainIcon = iBmp.CreateFileFromResourceBitmap("PdmSw.Images.MainIconSmall.bmp", thisAssembly); int menuToolbarOption = (int)(swCommandItemType_e.swMenuItem | swCommandItemType_e.swToolbarItem); cmdIndex0 = cmdGroup.AddCommandItem2("CreateCube", -1, "Create a cube", "Create cube", 0, "CreateCube", "", mainItemID1, menuToolbarOption); cmdIndex1 = cmdGroup.AddCommandItem2("Show PMP", -1, "Display sample property manager", "Show PMP", 2, "ShowPMP", "EnablePMP", mainItemID2, menuToolbarOption); cmdGroup.HasToolbar = true; cmdGroup.HasMenu = true; cmdGroup.Activate(); bool bResult; FlyoutGroup flyGroup = iCmdMgr.CreateFlyoutGroup(flyoutGroupID, "Dynamic Flyout", "Flyout Tooltip", "Flyout Hint", cmdGroup.SmallMainIcon, cmdGroup.LargeMainIcon, cmdGroup.SmallIconList, cmdGroup.LargeIconList, "FlyoutCallback", "FlyoutEnable"); flyGroup.AddCommandItem("FlyoutCommand 1", "test", 0, "FlyoutCommandItem1", "FlyoutEnableCommandItem1"); flyGroup.FlyoutType = (int)swCommandFlyoutStyle_e.swCommandFlyoutStyle_Simple; foreach (int type in docTypes) { CommandTab cmdTab; cmdTab = iCmdMgr.GetCommandTab(type, Title); if (cmdTab != null & !getDataResult | ignorePrevious)//if tab exists, but we have ignored the registry info (or changed command group ID), re-create the tab. Otherwise the ids won't matchup and the tab will be blank { bool res = iCmdMgr.RemoveCommandTab(cmdTab); cmdTab = null; } //if cmdTab is null, must be first load (possibly after reset), add the commands to the tabs if (cmdTab == null) { cmdTab = iCmdMgr.AddCommandTab(type, Title); CommandTabBox cmdBox = cmdTab.AddCommandTabBox(); int[] cmdIDs = new int[3]; int[] TextType = new int[3]; cmdIDs[0] = cmdGroup.get_CommandID(cmdIndex0); TextType[0] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal; cmdIDs[1] = cmdGroup.get_CommandID(cmdIndex1); TextType[1] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal; cmdIDs[2] = cmdGroup.ToolbarId; TextType[2] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal | (int)swCommandTabButtonFlyoutStyle_e.swCommandTabButton_ActionFlyout; bResult = cmdBox.AddCommands(cmdIDs, TextType); CommandTabBox cmdBox1 = cmdTab.AddCommandTabBox(); cmdIDs = new int[1]; TextType = new int[1]; cmdIDs[0] = flyGroup.CmdID; TextType[0] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextBelow | (int)swCommandTabButtonFlyoutStyle_e.swCommandTabButton_ActionFlyout; bResult = cmdBox1.AddCommands(cmdIDs, TextType); cmdTab.AddSeparator(cmdBox1, cmdIDs[0]); } } thisAssembly = null; } public void RemoveCommandMgr() { iBmp?.Dispose(); iCmdMgr?.RemoveCommandGroup(mainCmdGroupID); iCmdMgr?.RemoveFlyoutGroup(flyoutGroupID); } public bool CompareIDs(int[] storedIDs, int[] addinIDs) { List storedList = new List(storedIDs); List addinList = new List(addinIDs); addinList.Sort(); storedList.Sort(); if (addinList.Count != storedList.Count) { return false; } else { for (int i = 0; i < addinList.Count; i++) { if (addinList[i] != storedList[i]) { return false; } } } return true; } public Boolean AddPMP() { ppage = new UserPMPage(this); return true; } public Boolean RemovePMP() { ppage = null; return true; } #endregion #region UI Callbacks public void CreateCube() { System.Windows.Forms.MessageBox.Show("There is no part template available. Please check your options and make sure there is a part template selected, or select a new part template."); } public void ShowPMP() { if (ppage != null) ppage.Show(); } public int EnablePMP() { if (SwApp.ActiveDoc != null) return 1; else return 0; } public void FlyoutCallback() { FlyoutGroup flyGroup = iCmdMgr.GetFlyoutGroup(flyoutGroupID); flyGroup.RemoveAllCommandItems(); flyGroup.AddCommandItem(System.DateTime.Now.ToLongTimeString(), "test", 0, "FlyoutCommandItem1", "FlyoutEnableCommandItem1"); } public int FlyoutEnable() { return 1; } public void FlyoutCommandItem1() { SwApp.SendMsgToUser("Flyout command 1"); } public int FlyoutEnableCommandItem1() { return 1; } #endregion #endregion } }