/// <summary> /// 判断是否存在元素 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配的名称</param> /// <param name="EventType">事件枚举类型</param> /// <param name="Helper">事件帮助类</param> /// <returns>是否存在</returns> public bool ContainsKey(object Key, string MatchName, SEEvent EventType, out SolidEdgeDocumentEventHelper Helper) { Helper = null; if (_mDicOccurrenceEvent.TryGetValue(Key, out var Lists)) { if (Lists.Count == 0) { return(false); } var list = Lists.Where(x => MatchName.Equals(x[0] + "") && EventType == (SEEvent)x[1]).FirstOrDefault(); if (list == null) { return(false); } if (list.Count < 3) { throw new Exception("元素不匹配"); } else { Helper = (SolidEdgeDocumentEventHelper)list[2]; } return(true); } return(false); }
/// <summary> /// 移除事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配的名称</param> /// <param name="EventType">事件枚举类型</param> internal void Remove(object Key, string MatchName, SEEvent EventType) { lock (_mLock) { if (_mOccurrenceEventStorage.ContainsKey(Key, MatchName, EventType, out var Helper)) { Helper.UnregisterSolidEdgeEvent(); _mOccurrenceEventStorage.RemoveElement(Key, MatchName, EventType); } } }
/// <summary> /// 移除元素 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配的名称</param> /// <param name="EventType">事件枚举类型</param> public void RemoveElement(object Key, string MatchName, SEEvent EventType) { if (_mDicOccurrenceEvent.TryGetValue(Key, out var Lists)) { if (Lists.Count != 0) { var list = Lists.Where(x => MatchName.Equals(x[0] + "") && EventType == (SEEvent)x[1]).FirstOrDefault(); if (list != null) { _mDicOccurrenceEvent[Key].Remove(list); } } } }
/// <summary> /// 索引器,根据唯一键,匹配名称,事件枚举类型获取事件帮助类 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配的名称</param> /// <param name="EventType">事件枚举类型</param> /// <returns><see cref="SEEventMethodHelper"/></returns> public SolidEdgeDocumentEventHelper this[object Key, string MatchName, SEEvent EventType] { get { if (ContainsKey(Key, MatchName, EventType, out var Helper)) { return(Helper); } return(null); } set { if (ContainsKey(Key, MatchName, EventType, out var Helper)) { Helper = value; } } }
/// <summary> /// 添加事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配的名称</param> /// <param name="EventType">事件枚举类型</param> /// <param name="RegisterMethod">事件注册的方法</param> /// <param name="NeedRemove">是否先移除</param> internal void Add(object Key, string MatchName, SEEvent EventType, Action <object[]> RegisterMethod, bool NeedRemove = false) { lock (_mLock) { if (NeedRemove) { Remove(Key, MatchName, EventType); } if (!_mOccurrenceEventStorage.ContainsKey(Key, MatchName, EventType, out SolidEdgeDocumentEventHelper Helper)) { _mOccurrenceEventStorage.AddElement(Key, MatchName, EventType, Helper = new SolidEdgeDocumentEventHelper(EventType, RegisterMethod)); } else { throw new ArgumentException("重复添加事件:" + EventType.ToString()); } Helper.RegisterSolidEdgeEvent(GetActiveObjectDocument(MatchName)); } }
/// <summary> /// 添加元素 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配的Occurrence名称</param> /// <param name="EventType">事件枚举类型</param> /// <param name="Helper">文档事件帮助类</param> public void AddElement(object Key, string MatchName, SEEvent EventType, SolidEdgeDocumentEventHelper Helper) { if (_mDicOccurrenceEvent.TryGetValue(Key, out var Lists)) { Lists.Add(new List <object>() { MatchName, EventType, Helper }); } else { _mDicOccurrenceEvent.Add(Key, new List <List <object> >() { new List <object>() { MatchName, EventType, Helper } }); } }
/// <summary> /// 添加事件 /// </summary> /// <param name="key">唯一键(如果Key是字符串类型,则寻找当前ASM下面匹配的ASM文档)</param> /// <param name="EventType">事件枚举值</param> /// <param name="RegisterMethod">事件执行方法</param> /// <param name="NeedRemove">是否需要移除已存在事件</param> internal void Add(object Key, SEEvent EventType, Action <object[]> RegisterMethod, bool NeedRemove = false) { lock (_mLock) { //系统事件 if (CheckSolidEdgeApplicationEvent(Key, EventType, RegisterMethod, true, NeedRemove)) { return; } //文档事件 if (NeedRemove) { Remove(Key, EventType); } SolidEdgeDocumentEventHelper Helper = new SolidEdgeDocumentEventHelper(EventType, RegisterMethod); if (!_mDicHelperOfDoc.ContainsKey(Key)) { _mDicHelperOfDoc.Add(Key, new Dictionary <SEEvent, SolidEdgeDocumentEventHelper>(new EnumComparer <SEEvent>()) { [EventType] = Helper }); } else { if (!_mDicHelperOfDoc[Key].ContainsKey(EventType)) { _mDicHelperOfDoc[Key].Add(EventType, Helper); } else { throw new ArgumentException("重复添加事件:" + EventType.ToString()); } } Helper.RegisterSolidEdgeEvent(GetActiveObjectDocument()); } }
/// <summary> /// 移除事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="EventType">事件枚举值</param> internal void Remove(object Key, SEEvent EventType) { lock (_mLock) { //系统事件 if (CheckSolidEdgeApplicationEvent(Key, EventType)) { return; } //文档事件 if (_mDicHelperOfDoc.TryGetValue(Key, out var CurrentDic)) { if (CurrentDic.TryGetValue(EventType, out var Helper)) { Helper.UnregisterSolidEdgeEvent(); CurrentDic.Remove(EventType); } } } }
/// <summary> /// 构造函数 /// </summary> /// <param name="EvenType">事件枚举</param> /// <param name="RegisterMethod">事件方法</param> internal SolidEdgeDocumentEventHelper(SEEvent EvenType, Action <object[]> RegisterMethod) { _mSEEventType = EvenType; _mRegisterMethod = RegisterMethod; }
/// <summary> /// Application相关事件 /// </summary> /// <param name="ObjectKey">唯一键</param> /// <param name="EventType">事件枚举类型</param> /// <param name="RegisterAction">事件注册方法</param> internal SolidEdgeSystemEventHelper(object ObjectKey, SEEvent EventType, Action <object[]> RegisterAction) { _mObjKey = ObjectKey; _mSEEventType = EventType; _mRegisterMethod = RegisterAction; }
/// <summary> /// 添加或者替换事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchaName">匹配的名称</param> /// <param name="EventType">事件枚举类型</param> /// <param name="RegisterMethod">事件注册方法</param> public void AddOrReplaceEvent(object Key, string MatchaName, SEEvent EventType, Action <object[]> RegisterMethod) { Add(Key, MatchaName, EventType, RegisterMethod, true); }
/// <summary> /// 移除Occurrence事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配的名称</param> /// <param name="EventType">事件枚举类型</param> public void RemoveEvent(object Key, string MatchName, SEEvent EventType) { Remove(Key, MatchName, EventType); }
/// <summary> /// 移除事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="EventType">事件枚举类型</param> public void RemoveEvent(object Key, SEEvent EventType) { Remove(Key, EventType); }
/// <summary> /// 添加Occurrence事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="MatchName">匹配名称</param> /// <param name="EventType">事件枚举类型</param> /// <param name="RegisterMethod">事件注册方法</param> public void AddEvent(object Key, string MatchName, SEEvent EventType, Action <object[]> RegisterMethod) { Add(Key, MatchName, EventType, RegisterMethod); }
/// <summary> /// 添加事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="EventType">事件枚举类型</param> /// <param name="RegisterMethod">事件注册方法</param> public void AddEvent(object Key, SEEvent EventType, Action <object[]> RegisterMethod) { Add(Key, EventType, RegisterMethod); }
/// <summary> /// 检查是否为系统事件,并且添加/替换或者移除事件 /// </summary> /// <param name="ObjectKey">唯一键</param> /// <param name="EventType">事件枚举类型</param> /// <param name="RegisterMethod">事件注册方法</param> /// <param name="AddOrRemove">添加或者移除</param> /// <param name="Replace">如果存在是否替换</param> /// <returns></returns> private bool CheckSolidEdgeApplicationEvent(object ObjectKey, SEEvent EventType , Action <object[]> RegisterMethod = null , bool AddOrRemove = false, bool Replace = false) { switch (EventType) { case SEEvent.ApplicationAfterActiveDocumentChange: case SEEvent.ApplicationAfterCommandRun: case SEEvent.ApplicationAfterDocumentOpen: case SEEvent.ApplicationAfterDocumentPrint: case SEEvent.ApplicationAfterDocumentSave: case SEEvent.ApplicationAfterEnvironmentActivate: case SEEvent.ApplicationAfterNewDocumentOpen: case SEEvent.ApplicationAfterNewWindow: case SEEvent.ApplicationAfterWindowActivate: case SEEvent.ApplicationBeforeCommandRun: case SEEvent.ApplicationBeforeDocumentClose: case SEEvent.ApplicationBeforeDocumentPrint: case SEEvent.ApplicationBeforeEnvironmentDeactivate: case SEEvent.ApplicationBeforeWindowDeactivate: case SEEvent.ApplicationBeforeQuit: case SEEvent.ApplicationBeforeDocumentSave: //添加 if (AddOrRemove) { SolidEdgeSystemEventHelper Helper = new SolidEdgeSystemEventHelper(ObjectKey, EventType, RegisterMethod); //不存在 if (!_mDicHelprOfApp.ContainsKey(ObjectKey)) { //添加 _mDicHelprOfApp.Add(ObjectKey, new Dictionary <SEEvent, SolidEdgeSystemEventHelper>(new EnumComparer <SEEvent>()) { [EventType] = Helper }); } //存在主键 else { //不存在该事件类型 if (!_mDicHelprOfApp[ObjectKey].ContainsKey(EventType)) { //添加 _mDicHelprOfApp[ObjectKey].Add(EventType, Helper); } //已存在 else { //需要替换 if (Replace) { //先注销事件 _mDicHelprOfApp[ObjectKey][EventType].UnregisterEvent(); _mDicHelprOfApp[ObjectKey].Remove(EventType); //添加 _mDicHelprOfApp[ObjectKey].Add(EventType, Helper); } //提示重复 else { throw new ArgumentException("重复添加事件:" + EventType.ToString()); } } } //最后统一注册事件 Helper.RegisterEvent(); } //移除 else { if (_mDicHelprOfApp.ContainsKey(ObjectKey)) { if (_mDicHelprOfApp[ObjectKey].ContainsKey(EventType)) { _mDicHelprOfApp[ObjectKey][EventType].UnregisterEvent(); } } } return(true); } return(false); }
/// <summary> /// 添加或者替换事件 /// </summary> /// <param name="Key">唯一键</param> /// <param name="EventType">事件枚举类型</param> /// <param name="RegisterMethod">事件注册方法</param> public void AddOrReplaceEvent(object Key, SEEvent EventType, Action <object[]> RegisterMethod) { Add(Key, EventType, RegisterMethod, true); }