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;
}
}
}