From 0b38918fc4c1021d63689108fbcddc87593aae36 Mon Sep 17 00:00:00 2001
From: xcd <834800634@qq.com>
Date: 星期四, 02 七月 2020 18:11:46 +0800
Subject: [PATCH] 板卡操作配置可获取板卡初始配置中的IO定义

---
 src/Bro.UI.Device.Winform/MotionCard/CtrlMotionCardOperationBase.cs |    1 
 src/Bro.Common.Model/Helper/PropertyConvertHelper.cs                |   83 --------------------
 src/Bro.Common.Device/DeviceBase/MotionCardBase.cs                  |  113 +++++++++++++++++++++++++++
 src/Bro.Common.Model/Model/IOItem.cs                                |   20 +++++
 src/Bro.Common.Model/Forms/FrmDeviceOpConfigEditor.cs               |    7 +
 src/Bro.UI.Config/MenuForms/FrmOperation.resx                       |    4 
 src/Bro.Process/ProcessControl.cs                                   |    4 
 7 files changed, 145 insertions(+), 87 deletions(-)

diff --git a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
index 4425373..44eee94 100644
--- a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
+++ b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
@@ -1,14 +1,17 @@
-锘縰sing Bro.Common.Helper;
+锘縰sing Autofac;
+using Bro.Common.Helper;
 using Bro.Common.Interface;
 using Bro.Common.Model;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.ComponentModel.Design;
 using System.Drawing.Design;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using System.Windows.Forms;
 
 namespace Bro.Common.Base
 {
@@ -136,5 +139,111 @@
         }
     }
 
-    
+    public class IORefrenceItemCollectionEditor : CollectionEditor
+    {
+        protected override CollectionForm CreateCollectionForm()
+        {
+            var form = base.CreateCollectionForm();
+
+            var prop = form.GetType().GetField("propertyBrowser", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+            if (prop != null)
+            {
+                if (prop.GetValue(form) is PropertyGrid grid)
+                {
+                    grid.HelpVisible = true;
+                    grid.ToolbarVisible = false;
+                }
+            }
+
+            return form;
+        }
+
+        //protected override object CreateInstance(Type itemType)
+        //{
+        //    return base.CreateInstance(itemType);
+        //}
+
+        //protected override object[] GetItems(object editValue)
+        //{
+        //    return base.GetItems(editValue);
+        //}
+
+        //protected override object SetItems(object editValue, object[] value)
+        //{
+        //    return base.SetItems(editValue, value);
+        //}
+
+        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+        {
+            if (context.Instance is IOperationConfig opConfig)
+            {
+                if (string.IsNullOrWhiteSpace(opConfig.DeviceId))
+                {
+                    return base.EditValue(context, provider, value);
+                }
+
+                using (var scope = GlobalVar.Container.BeginLifetimeScope())
+                {
+                    List<IDevice> deviceList = scope.Resolve<List<IDevice>>();
+
+                    var device = deviceList.FirstOrDefault(u => u.Id == opConfig.DeviceId);
+
+                    if (device == null)
+                    {
+                        return base.EditValue(context, provider, value);
+                    }
+
+                    if (device is MotionCardBase motionCard)
+                    {
+                        if (value is IORefrenceItem item)
+                        {
+                            item.IOItemSource = (motionCard.InitialConfig as MotionCardInitialConfigBase).IODefinitionCollection;
+                        }
+                    }
+                }
+            }
+
+            return base.EditValue(context, provider, value);
+        }
+
+        public IORefrenceItemCollectionEditor(Type type) : base(type)
+        {
+        }
+
+        /// <summary> 
+        /// 闄愬埗涓�娆¢�変竴涓疄渚� 
+        /// </summary> 
+        /// <returns></returns> 
+        protected override bool CanSelectMultipleInstances()
+        {
+            return false;
+        }
+
+        /// <summary> 
+        /// 鎸囧畾鍒涘缓鐨勫璞$被鍨� 
+        /// </summary> 
+        /// <returns></returns> 
+        protected override Type CreateCollectionItemType()
+        {
+            return typeof(IORefrenceItem);
+        }
+
+        protected override string GetDisplayText(object value)
+        {
+            if (value is IComplexDisplay)
+            {
+                return (value as IComplexDisplay).GetDisplayText();
+            }
+
+            return base.GetDisplayText(value);
+        }
+
+        //protected override void DestroyInstance(object instance)
+        //{
+        //    base.DestroyInstance(instance);//閲嶈锛佽嚜鍔ㄥ垹闄ょ粍浠剁殑璁捐鏃朵唬鐮侊紒 
+        //}
+    }
+
+
 }
diff --git a/src/Bro.Common.Model/Forms/FrmDeviceOpConfigEditor.cs b/src/Bro.Common.Model/Forms/FrmDeviceOpConfigEditor.cs
index 10d6598..26b8303 100644
--- a/src/Bro.Common.Model/Forms/FrmDeviceOpConfigEditor.cs
+++ b/src/Bro.Common.Model/Forms/FrmDeviceOpConfigEditor.cs
@@ -70,9 +70,12 @@
                 }
             }
 
+            bind.OpConfig.DeviceId = bind.Device;
+
             backOpConfig.DataFrom(bind.OpConfig);
 
             propGrid.SelectedObject = bind.OpConfig;
+
         }
 
         private void CboDevice_SelectedIndexChanged(object sender, EventArgs e)
@@ -88,7 +91,9 @@
                 var attr = device.GetType().GetCustomAttribute<DeviceAttribute>();
                 if (attr != null)
                 {
-                    propGrid.SelectedObject = ConfigFactory.GetOperationConfig(attr.TypeCode);
+                    var opConfig= ConfigFactory.GetOperationConfig(attr.TypeCode);
+                    opConfig.DeviceId = device.Id;
+                    propGrid.SelectedObject = opConfig;
                 }
             }
         }
diff --git a/src/Bro.Common.Model/Helper/PropertyConvertHelper.cs b/src/Bro.Common.Model/Helper/PropertyConvertHelper.cs
index 6dc252c..dd48235 100644
--- a/src/Bro.Common.Model/Helper/PropertyConvertHelper.cs
+++ b/src/Bro.Common.Model/Helper/PropertyConvertHelper.cs
@@ -1,4 +1,5 @@
-锘縰sing Bro.Common.Factory;
+锘縰sing Autofac;
+using Bro.Common.Factory;
 using Bro.Common.Interface;
 using Bro.Common.Model;
 using Newtonsoft.Json;
@@ -915,85 +916,7 @@
 
             return base.EditValue(context, provider, value);
         }
-    }
-
-    public class IORefrenceItemCollectionEditor : CollectionEditor
-    {
-        protected override CollectionForm CreateCollectionForm()
-        {
-            var form = base.CreateCollectionForm();
-
-            var prop = form.GetType().GetField("propertyBrowser", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
-
-            if (prop != null)
-            {
-                if (prop.GetValue(form) is PropertyGrid grid)
-                {
-                    grid.HelpVisible = true;
-                    grid.ToolbarVisible = false;
-                }
-            }
-
-            return form;
-        }
-
-        //protected override object CreateInstance(Type itemType)
-        //{
-        //    return base.CreateInstance(itemType);
-        //}
-
-        //protected override object[] GetItems(object editValue)
-        //{
-        //    return base.GetItems(editValue);
-        //}
-
-        //protected override object SetItems(object editValue, object[] value)
-        //{
-        //    return base.SetItems(editValue, value);
-        //}
-
-        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
-        {
-            return base.EditValue(context, provider, value);
-        }
-
-        public IORefrenceItemCollectionEditor(Type type) : base(type)
-        {
-        }
-
-        /// <summary> 
-        /// 闄愬埗涓�娆¢�変竴涓疄渚� 
-        /// </summary> 
-        /// <returns></returns> 
-        protected override bool CanSelectMultipleInstances()
-        {
-            return false;
-        }
-
-        /// <summary> 
-        /// 鎸囧畾鍒涘缓鐨勫璞$被鍨� 
-        /// </summary> 
-        /// <returns></returns> 
-        protected override Type CreateCollectionItemType()
-        {
-            return typeof(IORefrenceItem);
-        }
-
-        protected override string GetDisplayText(object value)
-        {
-            if (value is IComplexDisplay)
-            {
-                return (value as IComplexDisplay).GetDisplayText();
-            }
-
-            return base.GetDisplayText(value);
-        }
-
-        //protected override void DestroyInstance(object instance)
-        //{
-        //    base.DestroyInstance(instance);//閲嶈锛佽嚜鍔ㄥ垹闄ょ粍浠剁殑璁捐鏃朵唬鐮侊紒 
-        //}
-    }
+    }    
     #endregion
 
 }
diff --git a/src/Bro.Common.Model/Model/IOItem.cs b/src/Bro.Common.Model/Model/IOItem.cs
index 11283eb..486d0ff 100644
--- a/src/Bro.Common.Model/Model/IOItem.cs
+++ b/src/Bro.Common.Model/Model/IOItem.cs
@@ -1,6 +1,7 @@
 锘縰sing Bro.Common.Helper;
 using Newtonsoft.Json;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.ComponentModel;
 using static Bro.Common.Helper.EnumHelper;
@@ -60,6 +61,7 @@
     {
         [Category("IO鎿嶄綔閰嶇疆")]
         [Description("闇�瑕佹搷浣滅殑IO")]
+        [TypeConverter(typeof(IORefrenceItemSourceConverter))]
         public IOItem IOItem { get; set; } = new IOItem();
 
         [Category("IO鎿嶄綔閰嶇疆")]
@@ -70,4 +72,22 @@
         [JsonIgnore]
         public List<IODefinition> IOItemSource { get; set; } = new List<IODefinition>();
     }
+
+    public class IORefrenceItemSourceConverter : ComboBoxItemTypeConvert
+    {
+        public override Hashtable GetConvertHash(ITypeDescriptorContext context)
+        {
+            Hashtable table = new Hashtable();
+
+            if (context.Instance is IORefrenceItem item)
+            {
+                item.IOItemSource.ForEach(i =>
+                {
+                    table[i.IODesc + i.IOType.GetEnumDescription() + i.IONum] = i as IOItem;
+                });
+            }
+
+            return table;
+        }
+    }
 }
diff --git a/src/Bro.Process/ProcessControl.cs b/src/Bro.Process/ProcessControl.cs
index ece460d..29d3170 100644
--- a/src/Bro.Process/ProcessControl.cs
+++ b/src/Bro.Process/ProcessControl.cs
@@ -32,8 +32,8 @@
             #region AutoFac娉ㄥ唽
             GlobalVar.Builder.RegisterInstance(this).As<IProcess>().ExternallyOwned();
             GlobalVar.Builder.RegisterInstance(IConfig).As<IProcessConfig>().ExternallyOwned();
-            GlobalVar.Builder.RegisterInstance(DeviceCollection);
-            GlobalVar.Builder.RegisterInstance(ProcessMethodCollection);
+            GlobalVar.Builder.RegisterInstance(DeviceCollection).ExternallyOwned();
+            GlobalVar.Builder.RegisterInstance(ProcessMethodCollection).ExternallyOwned();
 
             //if (isBuild)
             //{
diff --git a/src/Bro.UI.Config/MenuForms/FrmOperation.resx b/src/Bro.UI.Config/MenuForms/FrmOperation.resx
index b1a77b1..28530b7 100644
--- a/src/Bro.UI.Config/MenuForms/FrmOperation.resx
+++ b/src/Bro.UI.Config/MenuForms/FrmOperation.resx
@@ -125,7 +125,7 @@
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADm
-        CgAAAk1TRnQBSQFMAgEBAgEAAdABAAHQAQABGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        CgAAAk1TRnQBSQFMAgEBAgEAAdgBAAHYAQABGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABYAMAARgDAAEBAQABCAYAAQkYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
         AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@@ -182,7 +182,7 @@
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD4
-        CAAAAk1TRnQBSQFMAwEBAAHQAQAB0AEAARgBAAEYAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
+        CAAAAk1TRnQBSQFMAwEBAAHYAQAB2AEAARgBAAEYAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
         AWADAAEYAwABAQEAAQgGAAEJGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
         AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
         AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
diff --git a/src/Bro.UI.Device.Winform/MotionCard/CtrlMotionCardOperationBase.cs b/src/Bro.UI.Device.Winform/MotionCard/CtrlMotionCardOperationBase.cs
index 2d90199..d3daefe 100644
--- a/src/Bro.UI.Device.Winform/MotionCard/CtrlMotionCardOperationBase.cs
+++ b/src/Bro.UI.Device.Winform/MotionCard/CtrlMotionCardOperationBase.cs
@@ -1,5 +1,6 @@
 锘縰sing Bro.Common.Helper;
 using Bro.Common.Interface;
+using Bro.Common.Model;
 using Bro.Device.GTSCard;
 using System;
 using System.Collections.Generic;

--
Gitblit v1.8.0