1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
using Autofac;
using Bro.Common.Base;
using Bro.Common.Helper;
using Bro.Common.Interface;
using Bro.Common.Model;
using Bro.Device.AuboRobot;
using Bro.Device.HikCamera;
using Bro.Device.OmronFins;
using Bro.Device.SeerAGV;
using Bro.Device.Station;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Bro.Common.Helper.EnumHelper;
 
namespace A032.Process
{
    public class ProcessConfig : IStationConfig
    {
        #region 设备配置
        [Category("设备配置")]
        [Description("PLC配置")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<OmronFinsInitialConfig>), typeof(UITypeEditor))]
        public List<OmronFinsInitialConfig> PLCConfigCollection { get; set; } = new List<OmronFinsInitialConfig>();
 
        [Category("设备配置")]
        [Description("机器人配置")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<AuboRobotInitialConfig>), typeof(UITypeEditor))]
        public List<AuboRobotInitialConfig> RobotConfigCollection { get; set; } = new List<AuboRobotInitialConfig>();
 
        [Category("设备配置")]
        [Description("AGV配置")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<SeerAGVInitialConfig>), typeof(UITypeEditor))]
        public List<SeerAGVInitialConfig> AGVConfigCollection { get; set; } = new List<SeerAGVInitialConfig>();
 
        [Category("设备配置")]
        [Description("相机配置")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<HikCameraInitialConfig>), typeof(UITypeEditor))]
        public List<HikCameraInitialConfig> CameraConfigCollection { get; set; } = new List<HikCameraInitialConfig>();
        #endregion
 
        #region 操作配置
        //[Category("操作配置")]
        //[Description("PLC监听配置")]
        //[TypeConverter(typeof(CollectionCountConvert))]
        //[Editor(typeof(MonitorSetBindEditor), typeof(UITypeEditor))]
        //public Dictionary<string, MonitorSet> PLCMonitorSet { get; set; } = new Dictionary<string, MonitorSet>();
 
        ///// <summary>
        ///// 操作配置的字典集合
        ///// Key:MethodCode,Value:操作配置
        ///// </summary>
        //[Category("操作配置")]
        //[Description("操作配置集合")]
        //[TypeConverter(typeof(CollectionCountConvert))]
        //[Editor(typeof(OperationConfigBindEditor), typeof(UITypeEditor))]
        //public Dictionary<string, IOperationConfig> ProcessOpConfigDict { get; set; } = new Dictionary<string, IOperationConfig>();
 
        //[Category("监听和操作配置")]
        //[Description("监听操作配置集合")]
        //[TypeConverter(typeof(CollectionCountConvert))]
        //[Editor(typeof(ComplexCollectionEditor<MonitorSet>), typeof(UITypeEditor))]
        //public List<MonitorSet> MonitorSetCollection { get; set; } = new List<MonitorSet>();
        #endregion
 
        #region 全局配置
        [Category("全局配置")]
        [Description("是否采用离线图片")]
        public virtual bool IsImageOffline { get; set; } = false;
 
        [Category("Demo模式")]
        [Description("是否测试模式 测试模式下始终反馈OK信号")]
        public virtual bool IsDemoMode { get; set; } = false;
 
        //[Category("Demo模式")]
        //[Description("测试模式下程序启动时反馈1至该地址,非测试模式反馈0")]
        //public int DemoReplayAddress { get; set; }
        #endregion
 
        #region 日志和CSV配置
        [Category("日志配置")]
        [Description("是否启用日志")]
        public bool IsLogEnabled { get; set; } = false;
 
        [Category("日志配置")]
        [Description("日志文件夹路径")]
        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        public string LogPath { get; set; }
 
        [Category("日志配置")]
        [Description("GRR日志文件夹路径")]
        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        public string GRRLogPath { get; set; }
 
        [Category("CSV文件配置")]
        [Description("是否做CSV文件输出")]
        public bool IsCSVOutput { get; set; } = false;
 
        [Category("CSV文件配置")]
        [Description("CSV输出文件夹路径")]
        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        public string CSVFilePath { get; set; }
        #endregion
 
        //[Category("PLC相关配置")]
        //[Description("警报配置列表")]
        //[TypeConverter(typeof(CollectionCountConvert))]
        //[Editor(typeof(ComplexCollectionEditor<WarningSet>), typeof(UITypeEditor))]
        //public List<WarningSet> WarningSets { get; set; } = new List<WarningSet>();
 
        [Category("PLC相关配置")]
        [Description("产品出列时是否有确认动作。true:有确认动作,确认后产品出列;false:没有确认动作,查询时产品出列")]
        public bool IsConfirmWhenProductionDone { get; set; } = false;
 
        [Category("NG图片保存配置")]
        [Description("NG图片保存目录")]
        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        [Browsable(false)]
        public string NGImageFolderPath { get; set; }
 
        //[Category("算法配置")]
        //[Description("是否采用外部算子。true:采用外部算子,false:使用内部算法")]
        //public bool IsUsingExternalAlgorithem { get; set; } = true;
 
        [Category("路径相关")]
        [Description("路径节点配置")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<PathPosition>), typeof(UITypeEditor))]
        public List<PathPosition> PositionCollection { get; set; } = new List<PathPosition>();
 
        [Category("路径相关")]
        [Description("各位置标定矩阵")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<PositionMatrix>), typeof(UITypeEditor))]
        public List<PositionMatrix> MatrixCollection { get; set; } = new List<PositionMatrix>();
 
        #region Ignore
        [Browsable(false)]
        [JsonIgnore]
        public List<OperationCTCollection> CTStatistic { get; set; }
 
        [Browsable(false)]
        [JsonIgnore]
        public bool IsUseMountCorrectionLimit { get; set; }
 
        [Browsable(false)]
        [JsonIgnore]
        public List<Spec> MountCorrectionRanges { get; set; }
 
        [Category("全局配置")]
        [Description("超时时间设置,单位为毫秒")]
        [Browsable(false)]
        public int TimeOut { get; set; } = 9999;
 
        //[Category("全局配置")]
        //[Description("空闲时间设置,当机器空闲时间超过该值,认为机器开始空闲,单位为秒")]
        //public int IdleTimeThreshold { get; set; } = 60;
 
        [Category("全局配置")]
        [Description("站点代码 例如S1")]
        [ReadOnly(true)]
        [Browsable(false)]
        [JsonIgnore]
        public virtual string StationCode { get; set; }
 
        [Category("全局配置")]
        [Description("站点序号,从1开始")]
        [Browsable(false)]
        [JsonIgnore]
        public virtual int SequenceIndex { get; set; }
 
        [Category("全局配置")]
        [Description("是否做过站检查")]
        [Browsable(false)]
        [JsonIgnore]
        public virtual bool IsCheckPrePass { get; set; } = false;
 
        [Category("全局配置")]
        [Description("是否数据库保存")]
        [Browsable(false)]
        [JsonIgnore]
        public virtual bool IsDBSave { get; set; } = false;
        #endregion
    }
 
    public class PathPosition : IComplexDisplay
    {
        [Category("导航路径")]
        [Description("路径节点代码")]
        public string PositionCode { get; set; }
 
        [Category("导航路径")]
        [Description("路径节点描述")]
        public string Description { get; set; }
 
        public string GetDisplayText()
        {
            return $"{PositionCode}-{Description}";
        }
    }
 
    public class PositionMatrix : IComplexDisplay
    {
        [Category("位置矩阵")]
        [Description("位置代码")]
        [TypeConverter(typeof(PositionCodeConverter))]
        public string PositionCode { get; set; }
 
        [Category("位置矩阵")]
        [Description("该位置标定矩阵")]
        [TypeConverter(typeof(SimpleCollectionConvert<double>))]
        public List<double> Matrix { get; set; } = new List<double>();
 
        public string GetDisplayText()
        {
            return $"{PositionCode}:{string.Join(",", Matrix)}";
        }
    }
 
    public class PositionCodeConverter : ComboBoxItemTypeConvert
    {
        public override void GetConvertHash()
        {
            using (var scope = GlobalVar.Container.BeginLifetimeScope())
            {
                var config = scope.Resolve<ProcessConfig>();
 
                config.PositionCollection.ForEach(p =>
                {
                    _hash[p.PositionCode] = $"{p.PositionCode}-{p.Description}";
                });
            }
        }
    }
}