using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; using System.Collections; namespace PdmSw { /// /// ͨÓÃÎĵµÊ¼þ´¦ÀíÆ÷ /// public class DocumentEventHandler { protected ISldWorks iSwApp; protected ModelDoc2 document; protected SwAddin userAddin; protected Hashtable openModelViews; public DocumentEventHandler(ModelDoc2 modDoc, SwAddin addIn) { document = modDoc; iSwApp = addIn.SwApp; userAddin = addIn; openModelViews = new Hashtable(); } /// /// ¸½¼Óʼþ /// /// virtual public bool AttachEventHandlers() { return true; } /// /// ÒÆ³ýʼþ /// /// virtual public bool DetachEventHandlers() { return true; } /// /// ¸½¼ÓÊÓͼʼþ /// /// public bool ConnectModelViews() { IModelView mView; mView = (IModelView)document.GetFirstModelView(); while (mView != null) { if (!openModelViews.Contains(mView)) { DocViewEventHandler dView = new DocViewEventHandler(userAddin, mView, this); dView.AttachEventHandlers(); openModelViews.Add(mView, dView); } mView = (IModelView)mView.GetNext(); } return true; } /// /// ÒÆ³ýÊÓͼʼþ /// /// public bool DisconnectModelViews() { //Close events on all currently open docs DocViewEventHandler dView; int numKeys; numKeys = openModelViews.Count; if (numKeys == 0) { return false; } object[] keys = new object[numKeys]; //Remove all ModelView event handlers openModelViews.Keys.CopyTo(keys, 0); foreach (ModelView key in keys) { dView = (DocViewEventHandler)openModelViews[key]; dView.DetachEventHandlers(); openModelViews.Remove(key); dView = null; } return true; } public bool DetachModelViewEventHandler(ModelView mView) { DocViewEventHandler dView; if (openModelViews.Contains(mView)) { dView = (DocViewEventHandler)openModelViews[mView]; openModelViews.Remove(mView); mView = null; dView = null; } return true; } } /// /// Áã¼þʼþ´¦ÀíÆ÷ /// public class PartEventHandler : DocumentEventHandler { PartDoc doc; SwAddin swPlugin; public PartEventHandler(ModelDoc2 modDoc, SwAddin addin) : base(modDoc, addin) { doc = (PartDoc)document; swPlugin = addin; } override public bool AttachEventHandlers() { doc.DestroyNotify += new DPartDocEvents_DestroyNotifyEventHandler(OnDestroy); doc.NewSelectionNotify += new DPartDocEvents_NewSelectionNotifyEventHandler(OnNewSelection); // ×Ô¶¨ÒåÊôÐÔ±ä¸üʼþ doc.ChangeCustomPropertyNotify += new DPartDocEvents_ChangeCustomPropertyNotifyEventHandler(swPlugin.OnActiveDocCustomPropertyChanged); ConnectModelViews(); return true; } override public bool DetachEventHandlers() { doc.DestroyNotify -= new DPartDocEvents_DestroyNotifyEventHandler(OnDestroy); doc.NewSelectionNotify -= new DPartDocEvents_NewSelectionNotifyEventHandler(OnNewSelection); doc.ChangeCustomPropertyNotify -= new DPartDocEvents_ChangeCustomPropertyNotifyEventHandler(swPlugin.OnActiveDocCustomPropertyChanged); DisconnectModelViews(); userAddin.DetachModelEventHandler(document); return true; } //Event Handlers public int OnDestroy() { DetachEventHandlers(); return 0; } public int OnNewSelection() { return 0; } } public class AssemblyEventHandler : DocumentEventHandler { AssemblyDoc doc; SwAddin swAddin; public AssemblyEventHandler(ModelDoc2 modDoc, SwAddin addin) : base(modDoc, addin) { doc = (AssemblyDoc)document; swAddin = addin; } override public bool AttachEventHandlers() { doc.DestroyNotify += new DAssemblyDocEvents_DestroyNotifyEventHandler(OnDestroy); doc.NewSelectionNotify += new DAssemblyDocEvents_NewSelectionNotifyEventHandler(OnNewSelection); // ×é¼þ״̬±ä¸ü doc.ComponentStateChangeNotify3 += new DAssemblyDocEvents_ComponentStateChangeNotify3EventHandler(ComponentStateChangeNotify3); doc.ComponentVisualPropertiesChangeNotify += new DAssemblyDocEvents_ComponentVisualPropertiesChangeNotifyEventHandler(ComponentVisualPropertiesChangeNotify); doc.ComponentDisplayStateChangeNotify += new DAssemblyDocEvents_ComponentDisplayStateChangeNotifyEventHandler(ComponentDisplayStateChangeNotify); ConnectModelViews(); return true; } override public bool DetachEventHandlers() { doc.DestroyNotify -= new DAssemblyDocEvents_DestroyNotifyEventHandler(OnDestroy); doc.NewSelectionNotify -= new DAssemblyDocEvents_NewSelectionNotifyEventHandler(OnNewSelection); doc.ComponentStateChangeNotify3 -= new DAssemblyDocEvents_ComponentStateChangeNotify3EventHandler(ComponentStateChangeNotify3); doc.ComponentVisualPropertiesChangeNotify -= new DAssemblyDocEvents_ComponentVisualPropertiesChangeNotifyEventHandler(ComponentVisualPropertiesChangeNotify); doc.ComponentDisplayStateChangeNotify -= new DAssemblyDocEvents_ComponentDisplayStateChangeNotifyEventHandler(ComponentDisplayStateChangeNotify); DisconnectModelViews(); userAddin.DetachModelEventHandler(document); return true; } //Event Handlers public int OnDestroy() { // DetachEventHandlers(); return 0; } public int OnNewSelection() { return 0; } //attach events to a component if it becomes resolved protected int ComponentStateChange(object componentModel, short newCompState) { ModelDoc2 modDoc = (ModelDoc2)componentModel; swComponentSuppressionState_e newState = (swComponentSuppressionState_e)newCompState; switch (newState) { case swComponentSuppressionState_e.swComponentFullyResolved: { if ((modDoc != null) & !this.swAddin.OpenDocs.Contains(modDoc)) { this.swAddin.AttachModelDocEventHandler(modDoc); } break; } case swComponentSuppressionState_e.swComponentResolved: { if ((modDoc != null) & !this.swAddin.OpenDocs.Contains(modDoc)) { this.swAddin.AttachModelDocEventHandler(modDoc); } break; } } return 0; } protected int ComponentStateChange(object componentModel) { ComponentStateChange(componentModel, (short)swComponentSuppressionState_e.swComponentResolved); return 0; } public int ComponentStateChangeNotify3(object componentModel, string CompName, short oldCompState, short newCompState) { return ComponentStateChange(componentModel, newCompState); } int ComponentDisplayStateChangeNotify(object swObject) { Component2 component = (Component2)swObject; ModelDoc2 modDoc = (ModelDoc2)component.GetModelDoc(); return ComponentStateChange(modDoc); } int ComponentVisualPropertiesChangeNotify(object swObject) { Component2 component = (Component2)swObject; ModelDoc2 modDoc = (ModelDoc2)component.GetModelDoc(); return ComponentStateChange(modDoc); } } /// /// ¹¤³Ìͼʼþ´¦ÀíÆ÷ /// public class DrawingEventHandler : DocumentEventHandler { DrawingDoc doc; SwAddin swPlugin; public DrawingEventHandler(ModelDoc2 modDoc, SwAddin addin) : base(modDoc, addin) { doc = (DrawingDoc)document; swPlugin = addin; } override public bool AttachEventHandlers() { doc.DestroyNotify += new DDrawingDocEvents_DestroyNotifyEventHandler(OnDestroy); doc.NewSelectionNotify += new DDrawingDocEvents_NewSelectionNotifyEventHandler(OnNewSelection); doc.ChangeCustomPropertyNotify += new DDrawingDocEvents_ChangeCustomPropertyNotifyEventHandler(swPlugin.OnActiveDocCustomPropertyChanged); ConnectModelViews(); return true; } override public bool DetachEventHandlers() { doc.DestroyNotify -= new DDrawingDocEvents_DestroyNotifyEventHandler(OnDestroy); doc.NewSelectionNotify -= new DDrawingDocEvents_NewSelectionNotifyEventHandler(OnNewSelection); doc.ChangeCustomPropertyNotify -= new DDrawingDocEvents_ChangeCustomPropertyNotifyEventHandler(swPlugin.OnActiveDocCustomPropertyChanged); DisconnectModelViews(); userAddin.DetachModelEventHandler(document); return true; } //Event Handlers public int OnDestroy() { DetachEventHandlers(); return 0; } public int OnNewSelection() { return 0; } } public class DocViewEventHandler { ISldWorks iSwApp; SwAddin userAddin; ModelView mView; DocumentEventHandler parent; public DocViewEventHandler(SwAddin addin, IModelView mv, DocumentEventHandler doc) { userAddin = addin; mView = (ModelView)mv; iSwApp = userAddin.SwApp; parent = doc; } public bool AttachEventHandlers() { mView.DestroyNotify2 += new DModelViewEvents_DestroyNotify2EventHandler(OnDestroy); mView.RepaintNotify += new DModelViewEvents_RepaintNotifyEventHandler(OnRepaint); return true; } public bool DetachEventHandlers() { mView.DestroyNotify2 -= new DModelViewEvents_DestroyNotify2EventHandler(OnDestroy); mView.RepaintNotify -= new DModelViewEvents_RepaintNotifyEventHandler(OnRepaint); parent.DetachModelViewEventHandler(mView); return true; } //EventHandlers public int OnDestroy(int destroyType) { return 0; } public int OnRepaint(int repaintType) { return 0; } } }