From c866d11e0054a7299076fa53830b96610286ac2c Mon Sep 17 00:00:00 2001 From: xcd <834800634@qq.com> Date: 星期四, 02 七月 2020 20:14:40 +0800 Subject: [PATCH] 板卡操作配置添加IO定义 --- src/Bro.Common.Model/Model/IOItem.cs | 140 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 135 insertions(+), 5 deletions(-) diff --git a/src/Bro.Common.Model/Model/IOItem.cs b/src/Bro.Common.Model/Model/IOItem.cs index 11283eb..4b59a7c 100644 --- a/src/Bro.Common.Model/Model/IOItem.cs +++ b/src/Bro.Common.Model/Model/IOItem.cs @@ -1,13 +1,15 @@ 锘縰sing Bro.Common.Helper; using Newtonsoft.Json; using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using static Bro.Common.Helper.EnumHelper; namespace Bro.Common.Model { - public class IOItem : IComplexDisplay + public class IOItem : IComplexDisplay, IEqualityComparer { /// <summary> /// IO鐐圭紪鍙� @@ -30,9 +32,24 @@ [Description("IO绫诲瀷")] public virtual IOType IOType { get; set; } + public new bool Equals(object x, object y) + { + if (x is IOItem a && y is IOItem b) + { + return a.IOType == b.IOType && a.IONum == b.IONum; + } + + return false; + } + public string GetDisplayText() { - return $"{IOType.GetEnumDescription()},缂栧彿{IONum}锛孖O鐐圭殑鍊納Value}"; + return $"{IOType.GetEnumDescription()}-{IONum}-{Value}"; + } + + public int GetHashCode(object obj) + { + return obj.GetHashCode(); } } @@ -56,18 +73,131 @@ } } - public class IORefrenceItem + public class IORefrenceItem : IComplexDisplay { [Category("IO鎿嶄綔閰嶇疆")] [Description("闇�瑕佹搷浣滅殑IO")] - public IOItem IOItem { get; set; } = new IOItem(); + [TypeConverter(typeof(IORefrenceItemSourceConverter))] + public IODefinition IOItem { get; set; } = new IODefinition(); [Category("IO鎿嶄綔閰嶇疆")] [Description("闇�瑕佹搷浣滅殑IO鐨勬暟鍊�")] - public int CheckValue { get => IOItem.Value; set => IOItem.Value = value; } + public int CheckValue + { + get => IOItem.Value; + set => IOItem.Value = value; + } [Browsable(false)] [JsonIgnore] public List<IODefinition> IOItemSource { get; set; } = new List<IODefinition>(); + + public string GetDisplayText() + { + return IOItem.IODesc + "-" + CheckValue; + } + } + + public class IORefrenceItemSourceConverter : TypeConverter + { + Dictionary<IODefinition, string> itemDict = new Dictionary<IODefinition, string>(); + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + { + if (context.Instance is IORefrenceItem item) + { + item.IOItemSource.ForEach(i => + { + itemDict[i] = i.IODesc + "-" + i.IOType.GetEnumDescription() + "-" + i.IONum; + }); + + return new StandardValuesCollection(itemDict.Keys); + } + + return base.GetStandardValues(context); + } + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + { + return true; + } + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + { + return true; + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(String)) + return true; + + return base.CanConvertFrom(context, sourceType); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + return base.CanConvertTo(context, destinationType); + } + + public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues) + { + return base.CreateInstance(context, propertyValues); + } + + /// <summary> + /// + /// </summary> + /// <param name="context"></param> + /// <param name="culture"></param> + /// <param name="value">string</param> + /// <returns></returns> + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + var s = value.ToString().Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); + + if (s.Length == 3) + { + foreach (KeyValuePair<IODefinition, string> pair in itemDict) + { + if (pair.Value == value.ToString()) + { + return pair.Key; + } + } + + IODefinition item = new IODefinition(); + item.IODesc = s[0]; + item.IOType = (IOType)Enum.Parse(typeof(IOType), s[1]); + item.IONum = int.Parse(s[2]); + return item; + } + + return base.ConvertFrom(context, culture, value); + } + + /// <summary> + /// + /// </summary> + /// <param name="context"></param> + /// <param name="culture"></param> + /// <param name="value">IOItem</param> + /// <param name="destinationType"></param> + /// <returns></returns> + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + if (value is IODefinition item) + { + foreach (KeyValuePair<IODefinition, string> pair in itemDict) + { + if (pair.Key.IOType == item.IOType && pair.Key.IONum == item.IONum) + { + return pair.Value; + } + } + + return item.IODesc + "-" + item.IOType.GetEnumDescription() + "-" + item.IONum; + } + + return base.ConvertTo(context, culture, value, destinationType); + } } } -- Gitblit v1.8.0