From beb0f2c826515c0a2abc9ee6eb296dd5d7199b3a Mon Sep 17 00:00:00 2001
From: xcd <834800634@qq.com>
Date: 星期一, 06 七月 2020 13:24:44 +0800
Subject: [PATCH] 机台暂停/继续操作

---
 src/Bro.Common.Model/Model/IOItem.cs |  160 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 148 insertions(+), 12 deletions(-)

diff --git a/src/Bro.Common.Model/Model/IOItem.cs b/src/Bro.Common.Model/Model/IOItem.cs
index 11283eb..653cdb2 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鐐圭紪鍙�
@@ -20,8 +22,9 @@
         /// IO鐐圭殑鍊�
         /// </summary>
         [Category("IO閰嶇疆")]
-        [Description("IO鏁板��")]
-        public virtual int Value { get; set; }
+        [Description("IO鐘舵��")]
+        [TypeConverter(typeof(EnumDescriptionConverter<IOValue>))]
+        public virtual IOValue Value { get; set; }
 
         /// <summary>
         /// IO鐐规槸in杩樻槸out
@@ -30,14 +33,34 @@
         [Description("IO绫诲瀷")]
         public virtual IOType IOType { get; set; }
 
-        public string GetDisplayText()
+        public new bool Equals(object x, object y)
         {
-            return $"{IOType.GetEnumDescription()},缂栧彿{IONum}锛孖O鐐圭殑鍊納Value}";
+            if (x is IOItem a && y is IOItem b)
+            {
+                return a.IOType == b.IOType && a.IONum == b.IONum;
+            }
+
+            return false;
+        }
+
+        public virtual string GetDisplayText()
+        {
+            return $"{IOType.GetEnumDescription()}-{IONum}-{Value.GetEnumDescription()}";
+        }
+
+        public int GetHashCode(object obj)
+        {
+            return obj.GetHashCode();
         }
     }
 
     public class IODefinition : IOItem
     {
+        [Category("IO閰嶇疆")]
+        [Description("IO棰勫畾涔�")]
+        [TypeConverter(typeof(EnumDescriptionConverter<IOPrestatement>))]
+        public IOPrestatement IOPreStatement { get; set; } = IOPrestatement.Customized;
+
         [Category("IO閰嶇疆")]
         [Description("IO鐢ㄩ�旀弿杩�")]
         public string IODesc { get; set; }
@@ -48,26 +71,139 @@
 
         [Browsable(false)]
         [JsonIgnore]
-        public override int Value { get; set; }
+        public override IOValue Value { get; set; }
 
-        public new string GetDisplayText()
+        public override string GetDisplayText()
         {
-            return $"{IODesc} {IOType.GetEnumDescription()} {IONum}";
+            return $"{(IOPreStatement == IOPrestatement.Customized ? IODesc : IOPreStatement.GetEnumDescription())} {IOType.GetEnumDescription()} {IONum}";
         }
     }
 
-    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; }
+        [Description("闇�瑕佹搷浣滅殑IO鐨勭姸鎬�")]
+        public IOValue 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.GetEnumDescription();
+        }
+    }
+
+    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