Compare commits
7 Commits
409089e2ca
...
dev_update
Author | SHA1 | Date | |
---|---|---|---|
|
b2ccd0c91a | ||
4765e0e5bd | |||
|
ab38ee029a | ||
|
dbf412713b | ||
|
67ba78f268 | ||
|
d63a6c42b3 | ||
babc40d36a |
@@ -3,10 +3,42 @@ using System.ComponentModel;
|
||||
using System.Drawing.Imaging;
|
||||
using AntdUI;
|
||||
using DH.Commons.Enums;
|
||||
using HalconDotNet;
|
||||
using OpenCvSharp;
|
||||
|
||||
namespace DH.Commons.Base
|
||||
{
|
||||
public class MatSet
|
||||
{
|
||||
public DateTime ImageTime { get; set; } = DateTime.Now;
|
||||
|
||||
private string id = "";
|
||||
public string Id
|
||||
{
|
||||
get
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(id))
|
||||
{
|
||||
id = ImageTime.ToString("HHmmssfff");
|
||||
}
|
||||
return id;
|
||||
}
|
||||
set
|
||||
{
|
||||
id = value;
|
||||
}
|
||||
}
|
||||
public string CameraId { get; set; }
|
||||
public Mat _mat { get; set; } = null;
|
||||
|
||||
public ImageFormat _imageFormat { get; set; } = ImageFormat.Jpeg;
|
||||
public virtual void Dispose()
|
||||
{
|
||||
_mat?.Dispose();
|
||||
_mat = null;
|
||||
|
||||
}
|
||||
}
|
||||
public class CameraBase : NotifyProperty
|
||||
{
|
||||
|
||||
|
@@ -9,6 +9,7 @@ using AntdUI;
|
||||
using static DH.Commons.Enums.EnumHelper;
|
||||
using System.Text.Json.Serialization;
|
||||
using DH.Commons.Enums;
|
||||
using System.Drawing.Imaging;
|
||||
|
||||
namespace DH.Commons.Base
|
||||
{
|
||||
@@ -104,20 +105,20 @@ namespace DH.Commons.Base
|
||||
/// </summary>
|
||||
public class DetectionResultDetail
|
||||
{
|
||||
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
|
||||
|
||||
public string LabelBGR { get; set; }//识别到对象的标签BGR
|
||||
|
||||
|
||||
|
||||
public int LabelNo { get; set; } // 识别到对象的标签索引
|
||||
|
||||
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
|
||||
|
||||
public string LabelName { get; set; }//识别到对象的标签名称
|
||||
|
||||
|
||||
public double Score { get; set; }//识别目标结果的可能性、得分
|
||||
|
||||
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
|
||||
|
||||
public string LabelDisplay { get; set; }//识别到对象的 显示信息
|
||||
|
||||
|
||||
@@ -138,10 +139,10 @@ namespace DH.Commons.Base
|
||||
public class MLResult
|
||||
{
|
||||
public bool IsSuccess = false;
|
||||
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
|
||||
|
||||
public string ResultMessage;
|
||||
|
||||
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
|
||||
|
||||
public Bitmap ResultMap;
|
||||
|
||||
public List<DetectionResultDetail> ResultDetails = new List<DetectionResultDetail>();
|
||||
@@ -165,8 +166,7 @@ namespace DH.Commons.Base
|
||||
public bool IsGPU;
|
||||
public int GPUId;
|
||||
public float Score_thre;
|
||||
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
|
||||
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
|
||||
|
||||
public MLInit(string modelFile, bool isGPU, int gpuId, float score_thre)
|
||||
|
||||
|
||||
@@ -191,6 +191,24 @@ namespace DH.Commons.Base
|
||||
}
|
||||
public class DetectStationResult
|
||||
{
|
||||
public DateTime ImageTime { get; set; } = DateTime.Now;
|
||||
|
||||
private string id = "";
|
||||
public string Id
|
||||
{
|
||||
get
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(id))
|
||||
{
|
||||
id = ImageTime.ToString("HHmmssfff");
|
||||
}
|
||||
return id;
|
||||
}
|
||||
set
|
||||
{
|
||||
id = value;
|
||||
}
|
||||
}
|
||||
public string Pid { get; set; }
|
||||
|
||||
public string TempPid { get; set; }
|
||||
@@ -237,35 +255,24 @@ namespace DH.Commons.Base
|
||||
/// 预处理阶段已经NG
|
||||
/// </summary>
|
||||
public bool IsPreTreatNG { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 检测原图
|
||||
/// </summary>
|
||||
public Bitmap DetectionOriginImage { get; set; }
|
||||
/// <summary>
|
||||
/// 目标检测NG
|
||||
/// </summary>
|
||||
public bool IsObjectDetectNG { get; set; } = false;
|
||||
|
||||
public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg;
|
||||
public DateTime EndTime { get; set; }
|
||||
|
||||
public string ImageSaveDirectory { get; set; }
|
||||
public int StationDetectElapsed { get; set; }
|
||||
public static string NormalizeAndClean(string input)
|
||||
{
|
||||
public bool SaveOKOriginal = false;
|
||||
public bool SaveNGOriginal = false;
|
||||
public bool SaveOKDetect = false;
|
||||
public bool SaveNGDetect = false;
|
||||
|
||||
if (input == null) return null;
|
||||
|
||||
|
||||
// Step 1: 标准化字符编码为 Form C (规范组合)
|
||||
string normalizedString = input.Normalize(NormalizationForm.FormC);
|
||||
|
||||
// Step 2: 移除所有空白字符,包括制表符和换行符
|
||||
string withoutWhitespace = Regex.Replace(normalizedString, @"\s+", "");
|
||||
|
||||
// Step 3: 移除控制字符 (Unicode 控制字符,范围 \u0000 - \u001F 和 \u007F)
|
||||
string withoutControlChars = Regex.Replace(withoutWhitespace, @"[\u0000-\u001F\u007F]+", "");
|
||||
|
||||
// Step 4: 移除特殊的不可见字符(如零宽度空格等)
|
||||
string cleanedString = Regex.Replace(withoutControlChars, @"[\u200B\u200C\u200D\uFEFF]+", "");
|
||||
|
||||
return cleanedString;
|
||||
}
|
||||
|
||||
}
|
||||
public class RelatedCamera : NotifyProperty
|
||||
@@ -502,7 +509,7 @@ namespace DH.Commons.Base
|
||||
private AntList<SizeTreatParam> _sizeTreatParamList = new AntList<SizeTreatParam>();
|
||||
|
||||
private CustomizedPoint _showLocation = new CustomizedPoint();
|
||||
|
||||
private string _imageSaveDirectory="D://Images";
|
||||
private bool _saveOKOriginal = false;
|
||||
private bool _saveNGOriginal = false;
|
||||
private bool _saveOKDetect = false;
|
||||
@@ -620,7 +627,19 @@ namespace DH.Commons.Base
|
||||
OnPropertyChanged(nameof(IsAddStation));
|
||||
}
|
||||
}
|
||||
|
||||
[Category("图片保存")]
|
||||
[DisplayName("图片保存文件夹")]
|
||||
[Description("图片保存文件夹")]
|
||||
public virtual string ImageSaveDirectory
|
||||
{
|
||||
get => _imageSaveDirectory;
|
||||
set
|
||||
{
|
||||
if (_imageSaveDirectory == value) return;
|
||||
_imageSaveDirectory = value;
|
||||
OnPropertyChanged(nameof(ImageSaveDirectory));
|
||||
}
|
||||
}
|
||||
[Category("1.预处理(视觉算子)")]
|
||||
[DisplayName("预处理-算法文件路径")]
|
||||
public string HalconAlgorithemPath_Pre
|
||||
|
@@ -3,6 +3,7 @@ using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using DH.Commons.Enums;
|
||||
using DH.Commons.Helper;
|
||||
using HalconDotNet;
|
||||
using OpenCvSharp;
|
||||
|
||||
@@ -50,19 +51,20 @@ namespace DH.Commons.Base
|
||||
{
|
||||
OnDetectionWarningStop?.Invoke(detectionDes);
|
||||
}
|
||||
|
||||
public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper();
|
||||
public virtual void SaveImageAsync(string fullname, Bitmap saveMap, ImageFormat imageFormat)
|
||||
{
|
||||
if (saveMap != null)
|
||||
{
|
||||
//ImageSaveSet imageSaveSet = new ImageSaveSet()
|
||||
//{
|
||||
// FullName = fullname,
|
||||
// SaveImage = saveMap.CopyBitmap(),
|
||||
// ImageFormat = imageFormat.DeepSerializeClone()
|
||||
//};
|
||||
ImageSaveSet imageSaveSet = new ImageSaveSet()
|
||||
{
|
||||
FullName = fullname,
|
||||
SaveImage = saveMap.CopyBitmap(),
|
||||
ImageFormat = imageFormat.DeepSerializeClone()
|
||||
|
||||
//ImageSaveHelper.ImageSaveAsync(imageSaveSet);
|
||||
};
|
||||
|
||||
ImageSaveHelper.ImageSaveAsync(imageSaveSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -13,8 +13,10 @@
|
||||
|
||||
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AntdUI" Version="1.8.9" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
|
||||
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" />
|
||||
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" />
|
||||
|
@@ -375,6 +375,22 @@ namespace DH.Commons.Enums
|
||||
[Description("异常")]
|
||||
DSExcept = 32
|
||||
}
|
||||
public enum RunState
|
||||
{
|
||||
[ColorSelect("Gold")]
|
||||
[Description("空闲")]
|
||||
Idle = 1,
|
||||
[ColorSelect("Lime")]
|
||||
[Description("运行中")]
|
||||
Running = 2,
|
||||
[ColorSelect("Gray")]
|
||||
[Description("停止")]
|
||||
Stop = 3,
|
||||
[ColorSelect("Red")]
|
||||
[Description("宕机")]
|
||||
Down = 99,
|
||||
}
|
||||
|
||||
public enum PriorityDirection
|
||||
{
|
||||
X,
|
||||
|
107
DH.Commons/Helper/ImageSaveHelper.cs
Normal file
107
DH.Commons/Helper/ImageSaveHelper.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using DH.Commons.Helper;
|
||||
|
||||
namespace DH.Commons.Enums
|
||||
{
|
||||
public class ImageSaveHelper
|
||||
{
|
||||
public event Action<DateTime, string> OnImageSaveExceptionRaised;
|
||||
|
||||
//private string baseDirectory = "";
|
||||
//public string BaseDirectory
|
||||
//{
|
||||
// get => baseDirectory;
|
||||
// set
|
||||
// {
|
||||
// baseDirectory = value;
|
||||
// if (string.IsNullOrWhiteSpace(baseDirectory) || !Path.IsPathRooted(baseDirectory))
|
||||
// {
|
||||
// baseDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images");
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
public bool EnableImageSave { get; set; } = true;
|
||||
|
||||
public ImageSaveHelper() { }
|
||||
public ImageSaveHelper(bool enableImageSave = true)
|
||||
{
|
||||
EnableImageSave = enableImageSave;
|
||||
}
|
||||
|
||||
|
||||
object lockObj = new object();
|
||||
////耗时操作从 _taskFactory分配线程
|
||||
//public TaskFactory _taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning);
|
||||
readonly ConcurrentQueue<ImageSaveSet> _imageQueue = new ConcurrentQueue<ImageSaveSet>();
|
||||
Task _saveTask = null;
|
||||
readonly object _saveLock = new object();
|
||||
|
||||
public async void ImageSaveAsync(ImageSaveSet set)
|
||||
{
|
||||
if (!EnableImageSave)
|
||||
return;
|
||||
|
||||
await Task.Run(() =>
|
||||
{
|
||||
_imageQueue.Enqueue(set);
|
||||
|
||||
lock (_saveLock)
|
||||
{
|
||||
if (_saveTask == null)
|
||||
{
|
||||
_saveTask = Task.Run(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
while (_imageQueue.Count > 0)
|
||||
{
|
||||
if (_imageQueue.TryDequeue(out ImageSaveSet saveSet))
|
||||
{
|
||||
if (!Directory.Exists(Path.GetDirectoryName(saveSet.FullName)))
|
||||
{
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(saveSet.FullName));
|
||||
}
|
||||
if (saveSet.SaveImage != null)
|
||||
{
|
||||
saveSet.SaveImage.Save(saveSet.FullName, saveSet.ImageFormat);
|
||||
saveSet.SaveImage.Dispose();
|
||||
}
|
||||
saveSet = null;
|
||||
}
|
||||
}
|
||||
|
||||
await Task.Delay(2000);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnImageSaveExceptionRaised?.Invoke(DateTime.Now, $"图片保存异常:{ex.GetExceptionMessage()}");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public class ImageSaveSet
|
||||
{
|
||||
public string FullName { get; set; }//带后缀 全路径
|
||||
|
||||
public Bitmap SaveImage { get; set; }
|
||||
|
||||
public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg;
|
||||
}
|
||||
}
|
@@ -1,5 +1,5 @@
|
||||
using Microsoft.CSharp.RuntimeBinder;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Dynamic;
|
||||
@@ -34,7 +34,10 @@ namespace DH.Commons.Helper
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static T DeepSerializeClone<T>(this T t)
|
||||
{
|
||||
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(t));
|
||||
}
|
||||
/// <summary>
|
||||
/// 字节数组转换为整数
|
||||
/// </summary>
|
||||
|
26
DH.Commons/Models/ProductSummary.cs
Normal file
26
DH.Commons/Models/ProductSummary.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace DH.Commons.Models
|
||||
{
|
||||
public class CameraSummary
|
||||
{
|
||||
public string CameraName { get; set; } // 相机名称
|
||||
public int TiggerCount { get; set; } //触发数
|
||||
public int OKCount { get; set; } // OK 数
|
||||
public int NGCount { get; set; } // NG 数
|
||||
public int TotalCount => OKCount + NGCount; // 总检测数量
|
||||
public string YieldStr => $"{Yield:f2} %"; // 良率(字符串形式)
|
||||
public double Yield => OKCount + NGCount > 0 ? (double)OKCount / (OKCount + NGCount) * 100 : 0;
|
||||
}
|
||||
|
||||
public class ProductSummary
|
||||
{
|
||||
public int ProductAmount { get; set; }
|
||||
public string ResultDesc { get; set; }
|
||||
public string PercentStr { get; set; }
|
||||
}
|
||||
}
|
@@ -1,10 +1,13 @@
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection.Metadata;
|
||||
using System.Xml.Linq;
|
||||
using DH.Commons.Base;
|
||||
using DH.Commons.Enums;
|
||||
using DH.Commons.Helper;
|
||||
using DVPCameraType;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp.Extensions;
|
||||
using static System.Net.Mime.MediaTypeNames;
|
||||
using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel;
|
||||
|
||||
@@ -28,6 +31,8 @@ namespace DH.Devices.Camera
|
||||
|
||||
public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper();
|
||||
public event Action<LogMsg> OnLog;
|
||||
public ConcurrentDictionary<string, MatSet> _imageSetList = new ConcurrentDictionary<string, MatSet>();
|
||||
|
||||
|
||||
public Do3ThinkCamera()
|
||||
{
|
||||
@@ -360,9 +365,17 @@ namespace DH.Devices.Camera
|
||||
break;
|
||||
}
|
||||
Mat smat = cvImage.Clone();
|
||||
var imageSet = new MatSet
|
||||
{
|
||||
|
||||
_mat = smat,
|
||||
|
||||
};
|
||||
InitialImageSet(imageSet);
|
||||
OnHImageOutput?.Invoke(DateTime.Now, this, smat);
|
||||
|
||||
|
||||
//存图
|
||||
DisplayAndSaveOriginImage(imageSet.Id,SnapshotCount);
|
||||
|
||||
|
||||
|
||||
@@ -378,7 +391,86 @@ namespace DH.Devices.Camera
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
public void InitialImageSet(MatSet set)
|
||||
{
|
||||
//if (saveOption != null)
|
||||
//{
|
||||
// set.ImageSaveOption = saveOption.Copy();
|
||||
//}
|
||||
|
||||
//set.IsOriginSaved = !set.ImageSaveOption.IsSaveOriginImage;
|
||||
//set.IsFitSaved = !set.ImageSaveOption.IsSaveFitImage;
|
||||
//set.IsAddtionalSaved = string.IsNullOrWhiteSpace(set.ImageSaveOption.AddtionalSaveType);
|
||||
set.CameraId = this.CameraName;
|
||||
|
||||
set.ImageTime = DateTime.Now;
|
||||
_imageSetList[set.Id] = set;
|
||||
}
|
||||
|
||||
public virtual async void DisplayAndSaveOriginImage(string imgSetId, int _counter)
|
||||
{
|
||||
MatSet set = _imageSetList.Values.FirstOrDefault(u => u.Id == imgSetId);
|
||||
|
||||
if (set != null && set._mat != null)
|
||||
{
|
||||
await Task.Run(() =>
|
||||
{
|
||||
Bitmap showImage = set._mat.ToBitmap();
|
||||
// showImage.Save("D:/test333.bmp");
|
||||
// Marshal.Copy(pbyteImageBuffer, 0, (IntPtr)lAddrImage, (int)dwBufferSize);
|
||||
// Bitmap saveImage = showImage?.CopyBitmap();
|
||||
// saveImage.Save("d://TEST444.BMP");
|
||||
// OnShowImageUpdated?.Invoke(this, showImage, imgSetId);
|
||||
if (IsSavePicEnabled)
|
||||
{
|
||||
string fullname = Path.Combine(ImageSaveDirectory, $"{CameraName}_{_counter:D7}_{set.Id}.{set._imageFormat.ToString().ToLower()}");
|
||||
ImageSaveAsync(fullname, showImage);
|
||||
}
|
||||
|
||||
//释放 himage
|
||||
ClearImageSet(set);
|
||||
});
|
||||
}
|
||||
}
|
||||
static object _imageSetLock = new object();
|
||||
public void ClearImageSet(MatSet set)
|
||||
{
|
||||
try
|
||||
{
|
||||
bool flag = false;
|
||||
lock (_imageSetLock)
|
||||
{
|
||||
flag = _imageSetList.TryRemove(set.Id, out set);
|
||||
if (flag)
|
||||
{
|
||||
set.Dispose();
|
||||
}
|
||||
//LogAsync(DateTime.Now, $"{Name}移除图片信息{(flag ? "成功" : "失败")},当前缓存数量:{_imageSetList.Count}", "");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogAsync(DateTime.Now, LogLevel.Exception, $"清理图片缓存异常,当前缓存数量{_imageSetList.Count},{ex.GetExceptionMessage()}");
|
||||
}
|
||||
}
|
||||
public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper();
|
||||
public virtual void ImageSaveAsync(string fullName, Bitmap map)
|
||||
{
|
||||
if (!IsSavePicEnabled)
|
||||
{
|
||||
map?.Dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
ImageSaveSet imageSaveSet = new ImageSaveSet()
|
||||
{
|
||||
FullName = fullName,
|
||||
SaveImage = map,
|
||||
|
||||
};
|
||||
|
||||
ImageSaveHelper.ImageSaveAsync(imageSaveSet);
|
||||
}
|
||||
public override bool CameraDisConnect()
|
||||
{
|
||||
try
|
||||
|
@@ -11,6 +11,14 @@
|
||||
<Platforms>AnyCPU;x64</Platforms>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<Optimize>False</Optimize>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Optimize>False</Optimize>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -281,7 +281,7 @@ namespace DH.Devices.Vision
|
||||
|
||||
// GC.Collect();
|
||||
}
|
||||
#pragma warning restore CS0168 // 声明了变量,但从未使用过
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@@ -8,6 +8,8 @@ using OpenCvSharp.Extensions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Diagnostics.Eventing.Reader;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Linq;
|
||||
using System.Runtime.ExceptionServices;
|
||||
using System.Text;
|
||||
@@ -76,6 +78,15 @@ namespace DH.Devices.Vision
|
||||
//未能获得检测配置
|
||||
return detectResult;
|
||||
}
|
||||
detectResult.DetectName = detectConfig.Name;
|
||||
detectResult.ImageSaveDirectory=detectConfig.ImageSaveDirectory;
|
||||
detectResult.SaveNGDetect=detectConfig.SaveNGDetect;
|
||||
detectResult.SaveNGOriginal=detectConfig.SaveNGOriginal;
|
||||
detectResult.SaveOKDetect=detectConfig.SaveOKDetect;
|
||||
detectResult.SaveOKOriginal=detectConfig.SaveOKOriginal;
|
||||
Mat OriginImage = originImgSet.Clone();
|
||||
detectResult.DetectionOriginImage = CopyBitmapWithLockBits(OriginImage.ToBitmap());
|
||||
//detectResult.DetectionOriginImage = originImgSet.Clone().ToBitmap();
|
||||
Stopwatch sw = new Stopwatch();
|
||||
#region 1.预处理
|
||||
sw.Start();
|
||||
@@ -257,22 +268,22 @@ namespace DH.Devices.Vision
|
||||
}
|
||||
|
||||
|
||||
foreach (IGrouping<ResultState, DetectionFilter> group in conditionList)
|
||||
{
|
||||
bool b = group.ToList().Any(f =>
|
||||
{
|
||||
return f.FilterOperation(d);
|
||||
});
|
||||
//foreach (IGrouping<ResultState, DetectionFilter> group in conditionList)
|
||||
//{
|
||||
// bool b = group.ToList().Any(f =>
|
||||
// {
|
||||
// return f.FilterOperation(d);
|
||||
// });
|
||||
|
||||
|
||||
if (b)
|
||||
{
|
||||
d.FinalResult = group.Key;
|
||||
break;
|
||||
}
|
||||
// if (b)
|
||||
// {
|
||||
// d.FinalResult = group.Key;
|
||||
// break;
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
//}
|
||||
});
|
||||
#endregion
|
||||
#region 5.统计缺陷过滤结果或预处理直接NG
|
||||
@@ -449,9 +460,9 @@ namespace DH.Devices.Vision
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogAsync(DateTime.Now, LogLevel.Error, $"模型加载成功;是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}");
|
||||
// LogAsync(DateTime.Now, LogLevel.Error, $"模型加载成功;是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}");
|
||||
|
||||
//throw new ProcessException($"异常:是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.GetExceptionMessage()}");
|
||||
throw new ProcessException($"异常:是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.GetExceptionMessage()}");
|
||||
}
|
||||
return mLEngineSet;
|
||||
}
|
||||
@@ -952,15 +963,15 @@ namespace DH.Devices.Vision
|
||||
});
|
||||
}
|
||||
|
||||
//if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0)
|
||||
//{
|
||||
// detectResult.realSpecs.ForEach(d =>
|
||||
// {
|
||||
// displayTxt +=
|
||||
// $"{d.Code} :{d.ActualValue} \r\n";
|
||||
// });
|
||||
//}
|
||||
Bitmap resultMask=result.ToBitmap();
|
||||
if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0)
|
||||
{
|
||||
detectResult.realSpecs.ForEach(d =>
|
||||
{
|
||||
displayTxt +=
|
||||
$"{d.Code} :{d.ActualValue} \r\n";
|
||||
});
|
||||
}
|
||||
Bitmap resultMask =result.ToBitmap();
|
||||
//if (detectResult.VisionImageSet.DetectionResultImage == null && detectResult.VisionImageSet.SizeResultImage == null)
|
||||
//{
|
||||
// return;
|
||||
@@ -994,14 +1005,14 @@ namespace DH.Devices.Vision
|
||||
List<IShapeElement> detectionResultShapesClone = new List<IShapeElement>(detectionResultShapes);
|
||||
|
||||
DetectionDone(DetectionId, resultMask, detectionResultShapes);
|
||||
|
||||
//SaveDetectResultImageAsync(detectResult);
|
||||
//detectResult.DetectionOriginImage = CopyBitmapWithLockBits(resultMask);
|
||||
SaveDetectResultImageAsync(detectResult);
|
||||
// SaveDetectResultCSVAsync(detectResult);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogAsync(DateTime.Now, LogLevel.Exception,
|
||||
$"{Name}显示{detectResult.DetectName}检测结果异常,{ex.GetExceptionMessage()}");
|
||||
//LogAsync(DateTime.Now, LogLevel.Exception,
|
||||
// $"{Name}显示{detectResult.DetectName}检测结果异常,{ex.GetExceptionMessage()}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -1010,6 +1021,343 @@ namespace DH.Devices.Vision
|
||||
}
|
||||
});
|
||||
}
|
||||
public static Bitmap CopyBitmapWithLockBits(Bitmap original)
|
||||
{
|
||||
Bitmap copy = new Bitmap(original.Width, original.Height, original.PixelFormat);
|
||||
BitmapData originalData = original.LockBits(
|
||||
new Rectangle(0, 0, original.Width, original.Height),
|
||||
ImageLockMode.ReadOnly,
|
||||
original.PixelFormat
|
||||
);
|
||||
BitmapData copyData = copy.LockBits(
|
||||
new Rectangle(0, 0, copy.Width, copy.Height),
|
||||
ImageLockMode.WriteOnly,
|
||||
copy.PixelFormat
|
||||
);
|
||||
int bytesPerPixel = Image.GetPixelFormatSize(original.PixelFormat) / 8;
|
||||
int byteCount = originalData.Stride * original.Height;
|
||||
byte[] buffer = new byte[byteCount];
|
||||
System.Runtime.InteropServices.Marshal.Copy(originalData.Scan0, buffer, 0, byteCount);
|
||||
System.Runtime.InteropServices.Marshal.Copy(buffer, 0, copyData.Scan0, byteCount);
|
||||
original.UnlockBits(originalData);
|
||||
copy.UnlockBits(copyData);
|
||||
return copy;
|
||||
}
|
||||
/// <summary>
|
||||
///图片异步保存
|
||||
/// </summary>
|
||||
public void SaveDetectResultImageAsync1(DetectStationResult detectResult)
|
||||
{
|
||||
string format = detectResult.ImageFormat.ToString().ToLower();
|
||||
|
||||
if(detectResult.ImageSaveDirectory!=null)
|
||||
{
|
||||
if (!Directory.Exists(detectResult.ImageSaveDirectory))
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//根目录
|
||||
string rootPath = Path.Combine(detectResult.ImageSaveDirectory,
|
||||
DateTime.Now.ToString("yyyyMMdd"), detectResult.DetectName);
|
||||
|
||||
if (detectResult.ResultState != ResultState.OK)
|
||||
{
|
||||
|
||||
// NG原图
|
||||
if (detectResult.SaveNGOriginal && detectResult.DetectionOriginImage != null)
|
||||
{
|
||||
string prefix = Path.Combine(rootPath, "NGRawImages", detectResult.ResultLabel);
|
||||
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_NGRawImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
|
||||
SaveImageAsync(fullname, detectResult.DetectionOriginImage, detectResult.ImageFormat);
|
||||
}
|
||||
|
||||
|
||||
//NG结果图
|
||||
if (detectResult.SaveOKDetect && detectResult.DetectionOriginImage != null)
|
||||
{
|
||||
// 没有预处理,则保存原始图+检测结果图
|
||||
// if (detectResult.VisionImageSet.PreTreatedBitmap == null)
|
||||
{
|
||||
//string displayTxt = detectResult.ResultState.ToString() + "\r\n";
|
||||
string displayTxt = "";
|
||||
detectResult.DetectDetails.ForEach(d =>
|
||||
{
|
||||
displayTxt += $"{d.LabelName} score:{d.Score.ToString("f2")} area:{d.Area.ToString("f2")}\r\n";
|
||||
});
|
||||
if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0)
|
||||
{
|
||||
detectResult.realSpecs.ForEach(d =>
|
||||
{
|
||||
displayTxt +=
|
||||
$"{d.Code} score:{d.ActualValue} \r\n";
|
||||
});
|
||||
}
|
||||
Bitmap resultMask = detectResult.DetectionOriginImage.CopyBitmap();
|
||||
|
||||
Bitmap preTreatedBitmap = detectResult.DetectionOriginImage.CopyBitmap();
|
||||
|
||||
//List<IShapeElement> detectionResultShapes = new List<IShapeElement>(detectResult.DetectionResultShapes);
|
||||
//DetectResultDisplay resultDisplay = new DetectResultDisplay(detectResult, resultMask, displayTxt);
|
||||
//detectionResultShapes.Add(resultDisplay);
|
||||
|
||||
Bitmap resultMap = GetResultImage(resultMask, detectResult.DetectionResultShapes);
|
||||
|
||||
|
||||
// resultDisplay.Dispose();
|
||||
//detectionResultShapes.Clear();
|
||||
|
||||
|
||||
Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap);
|
||||
|
||||
string prefix = Path.Combine(rootPath, "NGFitImages", detectResult.ResultLabel);
|
||||
Directory.CreateDirectory(prefix); // 自动创建所有缺失的目录
|
||||
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_NGFitImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
|
||||
|
||||
|
||||
|
||||
// SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat);
|
||||
// 使用回调或 Task.ContinueWith 确保保存完成后再释放资源
|
||||
//SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat)
|
||||
// .ContinueWith(t =>
|
||||
// {
|
||||
// resultMask?.Dispose();
|
||||
// preTreatedBitmap?.Dispose();
|
||||
// resultMap?.Dispose();
|
||||
// detectionFitImage?.Dispose();
|
||||
// }, TaskScheduler.Default);
|
||||
|
||||
resultMask?.Dispose();
|
||||
preTreatedBitmap?.Dispose();
|
||||
resultMap?.Dispose();
|
||||
detectionFitImage?.Dispose();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // OK原图
|
||||
if (detectResult.SaveOKOriginal && detectResult.DetectionOriginImage != null)
|
||||
{
|
||||
string prefix = Path.Combine(rootPath, "OKRawImages", detectResult.ResultLabel);
|
||||
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_OKRawImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
|
||||
SaveImageAsync(fullname, detectResult.DetectionOriginImage, detectResult.ImageFormat);
|
||||
}
|
||||
|
||||
//ok结果图
|
||||
if (detectResult.SaveOKDetect && detectResult.DetectionOriginImage != null)
|
||||
{
|
||||
// 没有预处理,则保存原始图+检测结果图
|
||||
// if (detectResult.VisionImageSet.PreTreatedBitmap == null)
|
||||
{
|
||||
//string displayTxt = detectResult.ResultState.ToString() + "\r\n";
|
||||
string displayTxt = "";
|
||||
detectResult.DetectDetails.ForEach(d =>
|
||||
{
|
||||
displayTxt += $"{d.LabelName} score:{d.Score.ToString("f2")} area:{d.Area.ToString("f2")}\r\n";
|
||||
});
|
||||
if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0)
|
||||
{
|
||||
detectResult.realSpecs.ForEach(d =>
|
||||
{
|
||||
displayTxt +=
|
||||
$"{d.Code} score:{d.ActualValue} \r\n";
|
||||
});
|
||||
}
|
||||
Bitmap resultMask = detectResult.DetectionOriginImage.CopyBitmap();
|
||||
|
||||
Bitmap preTreatedBitmap = detectResult.DetectionOriginImage.CopyBitmap();
|
||||
|
||||
List<IShapeElement> detectionResultShapes = new List<IShapeElement>(detectResult.DetectionResultShapes);
|
||||
DetectResultDisplay resultDisplay = new DetectResultDisplay(detectResult, resultMask, displayTxt);
|
||||
detectionResultShapes.Add(resultDisplay);
|
||||
|
||||
Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap);
|
||||
|
||||
string prefix = Path.Combine(rootPath, "OKFitImages", detectResult.ResultLabel);
|
||||
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_" +
|
||||
$"OKFitImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
|
||||
|
||||
|
||||
|
||||
SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat);
|
||||
|
||||
//resultDisplay.Dispose();
|
||||
//detectionResultShapes.Clear();
|
||||
//resultMask?.Dispose();
|
||||
//preTreatedBitmap?.Dispose();
|
||||
//resultMap?.Dispose();
|
||||
//detectionFitImage?.Dispose();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public virtual Bitmap GetResultImage(Bitmap baseImage, List<IShapeElement> eleList)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 重新生成画布 避免 无法从带有索引像素格式的图像创建graphics对象
|
||||
Bitmap image = new Bitmap(baseImage.Width, baseImage.Height);
|
||||
|
||||
using (Graphics g = Graphics.FromImage(image))
|
||||
{
|
||||
g.DrawImage(baseImage, 0, 0);
|
||||
|
||||
// 创建临时拷贝避免共享状态
|
||||
// var tempElements = eleList.Select(e => e.Clone()).Cast<IShapeElement>().ToList();
|
||||
|
||||
eleList.ForEach(e =>
|
||||
{
|
||||
e.State = ElementState.Normal;
|
||||
e.Draw(g);
|
||||
});
|
||||
}
|
||||
return image;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogAsync(DateTime.Now, LogLevel.Exception, $"获取叠加结果图片异常:{ex.GetExceptionMessage()}");
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void SaveDetectResultImageAsync(DetectStationResult detectResult)
|
||||
{
|
||||
if (detectResult.ImageSaveDirectory == null) return;
|
||||
|
||||
string format = detectResult.ImageFormat.ToString().ToLower();
|
||||
string rootPath = Path.Combine(detectResult.ImageSaveDirectory,
|
||||
DateTime.Now.ToString("yyyyMMdd"), detectResult.DetectName);
|
||||
|
||||
try
|
||||
{
|
||||
if (detectResult.ResultState != ResultState.OK)
|
||||
{
|
||||
SaveNGImages(detectResult, rootPath, format);
|
||||
}
|
||||
else
|
||||
{
|
||||
SaveOKImages(detectResult, rootPath, format);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Logger.Error($"保存检测结果失败: {ex.Message}");
|
||||
}
|
||||
finally {
|
||||
GC.Collect();
|
||||
GC.WaitForPendingFinalizers();
|
||||
}
|
||||
}
|
||||
private void SaveNGImages(DetectStationResult result, string rootPath, string format)
|
||||
{
|
||||
// NG 原图
|
||||
if (result.SaveNGOriginal && result.DetectionOriginImage != null)
|
||||
{
|
||||
string prefix = Path.Combine(rootPath, "NGRawImages", result.ResultLabel);
|
||||
Directory.CreateDirectory(prefix);
|
||||
string fullname = Path.Combine(prefix, $"{result.Pid}_NGRawImage_{result.DetectName}_{result.Id}.{format}");
|
||||
SaveImageAsync(fullname, result.DetectionOriginImage, result.ImageFormat);
|
||||
}
|
||||
|
||||
// NG 结果图
|
||||
if (result.SaveOKDetect && result.DetectionOriginImage != null)
|
||||
{
|
||||
string displayTxt = BuildDisplayText(result);
|
||||
using (Bitmap resultMask = result.DetectionOriginImage.CopyBitmap())
|
||||
using (Bitmap preTreatedBitmap = result.DetectionOriginImage.CopyBitmap())
|
||||
{
|
||||
var detectionResultShapes = new List<IShapeElement>()
|
||||
{
|
||||
new DetectResultDisplay(result, resultMask, displayTxt)
|
||||
};
|
||||
|
||||
using (Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes))
|
||||
using (Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap))
|
||||
{
|
||||
string prefix = Path.Combine(rootPath, "NGFitImages", result.ResultLabel);
|
||||
Directory.CreateDirectory(prefix);
|
||||
string fullname = Path.Combine(prefix, $"{result.Pid}_NGFitImage_{result.DetectName}_{result.Id}.{format}");
|
||||
SaveImageAsync(fullname, detectionFitImage, result.ImageFormat);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private void SaveOKImages(DetectStationResult result, string rootPath, string format)
|
||||
{
|
||||
// OK 原图
|
||||
if (result.SaveOKOriginal && result.DetectionOriginImage != null)
|
||||
{
|
||||
string prefix = Path.Combine(rootPath, "OKRawImages", result.ResultLabel);
|
||||
Directory.CreateDirectory(prefix);
|
||||
string fullname = Path.Combine(prefix, $"{result.Pid}_OKRawImage_{result.DetectName}_{result.Id}.{format}");
|
||||
SaveImageAsync(fullname, result.DetectionOriginImage, result.ImageFormat);
|
||||
}
|
||||
|
||||
// OK 结果图
|
||||
if (result.SaveOKDetect && result.DetectionOriginImage != null)
|
||||
{
|
||||
string displayTxt = BuildDisplayText(result);
|
||||
using (Bitmap resultMask = result.DetectionOriginImage.CopyBitmap())
|
||||
using (Bitmap preTreatedBitmap = result.DetectionOriginImage.CopyBitmap())
|
||||
{
|
||||
var detectionResultShapes = new List<IShapeElement>()
|
||||
{
|
||||
new DetectResultDisplay(result, resultMask, displayTxt)
|
||||
};
|
||||
|
||||
using (Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes))
|
||||
using (Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap))
|
||||
{
|
||||
string prefix = Path.Combine(rootPath, "OKFitImages", result.ResultLabel);
|
||||
Directory.CreateDirectory(prefix);
|
||||
string fullname = Path.Combine(prefix, $"{result.Pid}_OKFitImage_{result.DetectName}_{result.Id}.{format}");
|
||||
SaveImageAsync(fullname, detectionFitImage, result.ImageFormat);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string BuildDisplayText(DetectStationResult result)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
result.DetectDetails.ForEach(d => sb.AppendLine($"{d.LabelName} score:{d.Score:f2} area:{d.Area:f2}"));
|
||||
if (result.realSpecs?.Count > 0)
|
||||
{
|
||||
result.realSpecs.ForEach(d => sb.AppendLine($"{d.Code} score:{d.ActualValue}"));
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -10,6 +10,14 @@
|
||||
<Platforms>AnyCPU;x64</Platforms>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<Optimize>False</Optimize>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Optimize>False</Optimize>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\DH.Commons\DH.Commons.csproj" />
|
||||
</ItemGroup>
|
||||
|
@@ -580,7 +580,7 @@ namespace DH.UI.Model.Winform
|
||||
/// </summary>
|
||||
[Browsable(false)]
|
||||
public Rectangle BaseRectangle { get; set; }
|
||||
EnumHelper.ElementState IShapeElement.State { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
|
||||
|
||||
public abstract bool IsMouseHover(PointF p);
|
||||
|
||||
|
@@ -13,10 +13,6 @@
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AntdUI" Version="1.8.9" />
|
||||
<PackageReference Include="SqlSugarCore" Version="5.1.4.185" />
|
||||
|
685
DHSoftware/MainWindow.Designer.cs
generated
685
DHSoftware/MainWindow.Designer.cs
generated
@@ -28,46 +28,41 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine();
|
||||
AntdUI.Tabs.StyleCard styleCard1 = new AntdUI.Tabs.StyleCard();
|
||||
AntdUI.SegmentedItem segmentedItem1 = new AntdUI.SegmentedItem();
|
||||
AntdUI.Tabs.StyleLine styleLine2 = new AntdUI.Tabs.StyleLine();
|
||||
AntdUI.Tabs.StyleCard styleCard2 = new AntdUI.Tabs.StyleCard();
|
||||
AntdUI.SegmentedItem segmentedItem6 = new AntdUI.SegmentedItem();
|
||||
AntdUI.SegmentedItem segmentedItem7 = new AntdUI.SegmentedItem();
|
||||
AntdUI.SegmentedItem segmentedItem8 = new AntdUI.SegmentedItem();
|
||||
AntdUI.SegmentedItem segmentedItem9 = new AntdUI.SegmentedItem();
|
||||
AntdUI.SegmentedItem segmentedItem10 = new AntdUI.SegmentedItem();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow));
|
||||
AntdUI.SegmentedItem segmentedItem2 = new AntdUI.SegmentedItem();
|
||||
AntdUI.SegmentedItem segmentedItem3 = new AntdUI.SegmentedItem();
|
||||
AntdUI.SegmentedItem segmentedItem4 = new AntdUI.SegmentedItem();
|
||||
AntdUI.SegmentedItem segmentedItem5 = new AntdUI.SegmentedItem();
|
||||
titlebar = new AntdUI.PageHeader();
|
||||
lbName = new AntdUI.Label();
|
||||
tabsStas = new AntdUI.Tabs();
|
||||
tabPage3 = new AntdUI.TabPage();
|
||||
panel7 = new Panel();
|
||||
panel5 = new Panel();
|
||||
lblNowtime = new Label();
|
||||
label8 = new Label();
|
||||
lblstarttime = new Label();
|
||||
label6 = new Label();
|
||||
lblUPH = new Label();
|
||||
label4 = new Label();
|
||||
lblNum = new Label();
|
||||
label2 = new Label();
|
||||
pageHeader1 = new AntdUI.PageHeader();
|
||||
labuph = new Label();
|
||||
divider2 = new AntdUI.Divider();
|
||||
tabMain = new AntdUI.TabPage();
|
||||
panelmain = new AntdUI.Panel();
|
||||
panel2 = new AntdUI.Panel();
|
||||
splitter2 = new AntdUI.Splitter();
|
||||
tabImgDisplay = new AntdUI.Tabs();
|
||||
panel4 = new AntdUI.Panel();
|
||||
splitter1 = new AntdUI.Splitter();
|
||||
pnlLog = new AntdUI.Panel();
|
||||
panel6 = new AntdUI.Panel();
|
||||
lblNum2 = new Label();
|
||||
label12 = new Label();
|
||||
lblNowtime2 = new Label();
|
||||
label10 = new Label();
|
||||
lblstarttime2 = new Label();
|
||||
label7 = new Label();
|
||||
lblUPH2 = new Label();
|
||||
tableLayoutstatistics = new TableLayoutPanel();
|
||||
dgvCamreaNums = new DataGridView();
|
||||
panelNums = new AntdUI.Panel();
|
||||
tableLayoutNums = new TableLayoutPanel();
|
||||
dgvProductNums = new DataGridView();
|
||||
tableLayoutPanel3 = new TableLayoutPanel();
|
||||
lblTotalTime = new Label();
|
||||
label1 = new Label();
|
||||
label12 = new Label();
|
||||
lblUPH = new Label();
|
||||
lblStartTime = new Label();
|
||||
lblOEE_Total = new Label();
|
||||
label10 = new Label();
|
||||
label7 = new Label();
|
||||
panel2 = new AntdUI.Panel();
|
||||
panel1 = new AntdUI.Panel();
|
||||
panel3 = new AntdUI.Panel();
|
||||
btnDeleteProject = new AntdUI.Button();
|
||||
@@ -78,12 +73,22 @@
|
||||
titlebar.SuspendLayout();
|
||||
tabsStas.SuspendLayout();
|
||||
tabPage3.SuspendLayout();
|
||||
panel5.SuspendLayout();
|
||||
pageHeader1.SuspendLayout();
|
||||
panelmain.SuspendLayout();
|
||||
panel2.SuspendLayout();
|
||||
panel4.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)splitter2).BeginInit();
|
||||
splitter2.Panel1.SuspendLayout();
|
||||
splitter2.Panel2.SuspendLayout();
|
||||
splitter2.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)splitter1).BeginInit();
|
||||
splitter1.Panel1.SuspendLayout();
|
||||
splitter1.Panel2.SuspendLayout();
|
||||
splitter1.SuspendLayout();
|
||||
panel6.SuspendLayout();
|
||||
tableLayoutstatistics.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit();
|
||||
panelNums.SuspendLayout();
|
||||
tableLayoutNums.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)dgvProductNums).BeginInit();
|
||||
tableLayoutPanel3.SuspendLayout();
|
||||
panel1.SuspendLayout();
|
||||
panel3.SuspendLayout();
|
||||
SuspendLayout();
|
||||
@@ -125,14 +130,13 @@
|
||||
tabsStas.Name = "tabsStas";
|
||||
tabsStas.Pages.Add(tabPage3);
|
||||
tabsStas.Size = new Size(580, 176);
|
||||
tabsStas.Style = styleLine1;
|
||||
tabsStas.Style = styleLine2;
|
||||
tabsStas.TabIndex = 3;
|
||||
tabsStas.Text = "tabs3";
|
||||
//
|
||||
// tabPage3
|
||||
//
|
||||
tabPage3.Controls.Add(panel7);
|
||||
tabPage3.Controls.Add(panel5);
|
||||
tabPage3.Location = new Point(3, 3);
|
||||
tabPage3.Name = "tabPage3";
|
||||
tabPage3.Size = new Size(574, 170);
|
||||
@@ -144,129 +148,9 @@
|
||||
panel7.Dock = DockStyle.Fill;
|
||||
panel7.Location = new Point(0, 0);
|
||||
panel7.Name = "panel7";
|
||||
panel7.Size = new Size(374, 170);
|
||||
panel7.Size = new Size(574, 170);
|
||||
panel7.TabIndex = 2;
|
||||
//
|
||||
// panel5
|
||||
//
|
||||
panel5.Controls.Add(lblNowtime);
|
||||
panel5.Controls.Add(label8);
|
||||
panel5.Controls.Add(lblstarttime);
|
||||
panel5.Controls.Add(label6);
|
||||
panel5.Controls.Add(lblUPH);
|
||||
panel5.Controls.Add(label4);
|
||||
panel5.Controls.Add(lblNum);
|
||||
panel5.Controls.Add(label2);
|
||||
panel5.Dock = DockStyle.Right;
|
||||
panel5.Location = new Point(374, 0);
|
||||
panel5.Name = "panel5";
|
||||
panel5.Size = new Size(200, 170);
|
||||
panel5.TabIndex = 1;
|
||||
//
|
||||
// lblNowtime
|
||||
//
|
||||
lblNowtime.AutoSize = true;
|
||||
lblNowtime.Location = new Point(69, 41);
|
||||
lblNowtime.Name = "lblNowtime";
|
||||
lblNowtime.Size = new Size(15, 17);
|
||||
lblNowtime.TabIndex = 7;
|
||||
lblNowtime.Text = "0";
|
||||
//
|
||||
// label8
|
||||
//
|
||||
label8.AutoSize = true;
|
||||
label8.Location = new Point(7, 41);
|
||||
label8.Name = "label8";
|
||||
label8.Size = new Size(56, 17);
|
||||
label8.TabIndex = 6;
|
||||
label8.Text = "此刻时间";
|
||||
//
|
||||
// lblstarttime
|
||||
//
|
||||
lblstarttime.AutoSize = true;
|
||||
lblstarttime.Location = new Point(69, 15);
|
||||
lblstarttime.Name = "lblstarttime";
|
||||
lblstarttime.Size = new Size(15, 17);
|
||||
lblstarttime.TabIndex = 5;
|
||||
lblstarttime.Text = "0";
|
||||
//
|
||||
// label6
|
||||
//
|
||||
label6.AutoSize = true;
|
||||
label6.Location = new Point(7, 15);
|
||||
label6.Name = "label6";
|
||||
label6.Size = new Size(56, 17);
|
||||
label6.TabIndex = 4;
|
||||
label6.Text = "开始时间";
|
||||
//
|
||||
// lblUPH
|
||||
//
|
||||
lblUPH.AutoSize = true;
|
||||
lblUPH.Location = new Point(70, 105);
|
||||
lblUPH.Name = "lblUPH";
|
||||
lblUPH.Size = new Size(15, 17);
|
||||
lblUPH.TabIndex = 3;
|
||||
lblUPH.Text = "0";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
label4.AutoSize = true;
|
||||
label4.Location = new Point(7, 105);
|
||||
label4.Name = "label4";
|
||||
label4.Size = new Size(33, 17);
|
||||
label4.TabIndex = 2;
|
||||
label4.Text = "UPH";
|
||||
//
|
||||
// lblNum
|
||||
//
|
||||
lblNum.AutoSize = true;
|
||||
lblNum.Location = new Point(70, 75);
|
||||
lblNum.Name = "lblNum";
|
||||
lblNum.Size = new Size(15, 17);
|
||||
lblNum.TabIndex = 1;
|
||||
lblNum.Text = "0";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
label2.AutoSize = true;
|
||||
label2.Location = new Point(7, 75);
|
||||
label2.Name = "label2";
|
||||
label2.Size = new Size(32, 17);
|
||||
label2.TabIndex = 0;
|
||||
label2.Text = "总数";
|
||||
//
|
||||
// pageHeader1
|
||||
//
|
||||
pageHeader1.Controls.Add(labuph);
|
||||
pageHeader1.Controls.Add(divider2);
|
||||
pageHeader1.DividerShow = true;
|
||||
pageHeader1.Dock = DockStyle.Bottom;
|
||||
pageHeader1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||
pageHeader1.Location = new Point(0, 608);
|
||||
pageHeader1.Name = "pageHeader1";
|
||||
pageHeader1.Size = new Size(1024, 40);
|
||||
pageHeader1.TabIndex = 7;
|
||||
pageHeader1.Text = "UPH";
|
||||
//
|
||||
// labuph
|
||||
//
|
||||
labuph.AutoSize = true;
|
||||
labuph.Location = new Point(59, 10);
|
||||
labuph.Name = "labuph";
|
||||
labuph.Size = new Size(64, 21);
|
||||
labuph.TabIndex = 1;
|
||||
labuph.Text = "100000";
|
||||
//
|
||||
// divider2
|
||||
//
|
||||
divider2.Dock = DockStyle.Top;
|
||||
divider2.Location = new Point(0, 0);
|
||||
divider2.Name = "divider2";
|
||||
divider2.OrientationMargin = 0F;
|
||||
divider2.Size = new Size(1024, 10);
|
||||
divider2.TabIndex = 0;
|
||||
divider2.Text = "";
|
||||
//
|
||||
// tabMain
|
||||
//
|
||||
tabMain.Location = new Point(3, 28);
|
||||
@@ -277,144 +161,287 @@
|
||||
//
|
||||
// panelmain
|
||||
//
|
||||
panelmain.Controls.Add(splitter2);
|
||||
panelmain.Controls.Add(panel2);
|
||||
panelmain.Controls.Add(panel4);
|
||||
panelmain.Controls.Add(panel1);
|
||||
panelmain.Dock = DockStyle.Fill;
|
||||
panelmain.Location = new Point(0, 40);
|
||||
panelmain.Margin = new Padding(0);
|
||||
panelmain.Name = "panelmain";
|
||||
panelmain.Size = new Size(1024, 568);
|
||||
panelmain.Size = new Size(1024, 631);
|
||||
panelmain.TabIndex = 8;
|
||||
//
|
||||
// panel2
|
||||
// splitter2
|
||||
//
|
||||
panel2.Controls.Add(tabImgDisplay);
|
||||
panel2.Dock = DockStyle.Fill;
|
||||
panel2.Location = new Point(0, 68);
|
||||
panel2.Name = "panel2";
|
||||
panel2.Size = new Size(1024, 388);
|
||||
panel2.TabIndex = 3;
|
||||
panel2.Text = "panel2";
|
||||
splitter2.Dock = DockStyle.Fill;
|
||||
splitter2.Location = new Point(0, 68);
|
||||
splitter2.Name = "splitter2";
|
||||
splitter2.Orientation = Orientation.Horizontal;
|
||||
//
|
||||
// splitter2.Panel1
|
||||
//
|
||||
splitter2.Panel1.Controls.Add(tabImgDisplay);
|
||||
//
|
||||
// splitter2.Panel2
|
||||
//
|
||||
splitter2.Panel2.Controls.Add(splitter1);
|
||||
splitter2.Size = new Size(1024, 563);
|
||||
splitter2.SplitterDistance = 442;
|
||||
splitter2.TabIndex = 4;
|
||||
//
|
||||
// tabImgDisplay
|
||||
//
|
||||
tabImgDisplay.Dock = DockStyle.Fill;
|
||||
tabImgDisplay.Location = new Point(0, 0);
|
||||
tabImgDisplay.Name = "tabImgDisplay";
|
||||
tabImgDisplay.Size = new Size(1024, 388);
|
||||
tabImgDisplay.Style = styleCard1;
|
||||
tabImgDisplay.Size = new Size(1024, 442);
|
||||
tabImgDisplay.Style = styleCard2;
|
||||
tabImgDisplay.TabIndex = 3;
|
||||
tabImgDisplay.Text = "tabs1";
|
||||
//
|
||||
// panel4
|
||||
// splitter1
|
||||
//
|
||||
panel4.Controls.Add(pnlLog);
|
||||
panel4.Controls.Add(panel6);
|
||||
panel4.Dock = DockStyle.Bottom;
|
||||
panel4.Location = new Point(0, 456);
|
||||
panel4.Name = "panel4";
|
||||
panel4.Size = new Size(1024, 112);
|
||||
panel4.TabIndex = 2;
|
||||
panel4.Text = "panel4";
|
||||
splitter1.Dock = DockStyle.Fill;
|
||||
splitter1.Location = new Point(0, 0);
|
||||
splitter1.Name = "splitter1";
|
||||
//
|
||||
// splitter1.Panel1
|
||||
//
|
||||
splitter1.Panel1.Controls.Add(pnlLog);
|
||||
//
|
||||
// splitter1.Panel2
|
||||
//
|
||||
splitter1.Panel2.Controls.Add(panel6);
|
||||
splitter1.Size = new Size(1024, 117);
|
||||
splitter1.SplitterDistance = 332;
|
||||
splitter1.TabIndex = 3;
|
||||
//
|
||||
// pnlLog
|
||||
//
|
||||
pnlLog.Dock = DockStyle.Fill;
|
||||
pnlLog.Location = new Point(0, 0);
|
||||
pnlLog.Name = "pnlLog";
|
||||
pnlLog.Size = new Size(719, 112);
|
||||
pnlLog.Size = new Size(332, 117);
|
||||
pnlLog.TabIndex = 2;
|
||||
pnlLog.Text = "panel8";
|
||||
//
|
||||
// panel6
|
||||
//
|
||||
panel6.Controls.Add(lblNum2);
|
||||
panel6.Controls.Add(label12);
|
||||
panel6.Controls.Add(lblNowtime2);
|
||||
panel6.Controls.Add(label10);
|
||||
panel6.Controls.Add(lblstarttime2);
|
||||
panel6.Controls.Add(label7);
|
||||
panel6.Controls.Add(lblUPH2);
|
||||
panel6.Controls.Add(label1);
|
||||
panel6.Dock = DockStyle.Right;
|
||||
panel6.Location = new Point(719, 0);
|
||||
panel6.Controls.Add(tableLayoutstatistics);
|
||||
panel6.Dock = DockStyle.Fill;
|
||||
panel6.Location = new Point(0, 0);
|
||||
panel6.Name = "panel6";
|
||||
panel6.Size = new Size(305, 112);
|
||||
panel6.Size = new Size(688, 117);
|
||||
panel6.TabIndex = 0;
|
||||
panel6.Text = "panel6";
|
||||
//
|
||||
// lblNum2
|
||||
// tableLayoutstatistics
|
||||
//
|
||||
lblNum2.AutoSize = true;
|
||||
lblNum2.Location = new Point(68, 92);
|
||||
lblNum2.Name = "lblNum2";
|
||||
lblNum2.Size = new Size(15, 17);
|
||||
lblNum2.TabIndex = 7;
|
||||
lblNum2.Text = "0";
|
||||
tableLayoutstatistics.ColumnCount = 2;
|
||||
tableLayoutstatistics.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||
tableLayoutstatistics.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||
tableLayoutstatistics.Controls.Add(dgvCamreaNums, 0, 0);
|
||||
tableLayoutstatistics.Controls.Add(panelNums, 1, 0);
|
||||
tableLayoutstatistics.Dock = DockStyle.Fill;
|
||||
tableLayoutstatistics.Location = new Point(0, 0);
|
||||
tableLayoutstatistics.Name = "tableLayoutstatistics";
|
||||
tableLayoutstatistics.RowCount = 1;
|
||||
tableLayoutstatistics.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||
tableLayoutstatistics.Size = new Size(688, 117);
|
||||
tableLayoutstatistics.TabIndex = 9;
|
||||
//
|
||||
// label12
|
||||
// dgvCamreaNums
|
||||
//
|
||||
label12.AutoSize = true;
|
||||
label12.Location = new Point(6, 92);
|
||||
label12.Name = "label12";
|
||||
label12.Size = new Size(44, 17);
|
||||
label12.TabIndex = 6;
|
||||
label12.Text = "总计数";
|
||||
dgvCamreaNums.AllowUserToAddRows = false;
|
||||
dgvCamreaNums.AllowUserToDeleteRows = false;
|
||||
dgvCamreaNums.AllowUserToResizeColumns = false;
|
||||
dgvCamreaNums.AllowUserToResizeRows = false;
|
||||
dgvCamreaNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
|
||||
dgvCamreaNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
|
||||
dgvCamreaNums.BackgroundColor = SystemColors.Control;
|
||||
dgvCamreaNums.BorderStyle = BorderStyle.None;
|
||||
dgvCamreaNums.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal;
|
||||
dgvCamreaNums.ColumnHeadersHeight = 4;
|
||||
dgvCamreaNums.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
|
||||
dgvCamreaNums.ColumnHeadersVisible = false;
|
||||
dgvCamreaNums.Dock = DockStyle.Fill;
|
||||
dgvCamreaNums.Location = new Point(3, 3);
|
||||
dgvCamreaNums.MultiSelect = false;
|
||||
dgvCamreaNums.Name = "dgvCamreaNums";
|
||||
dgvCamreaNums.ReadOnly = true;
|
||||
dgvCamreaNums.RowHeadersVisible = false;
|
||||
dgvCamreaNums.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
||||
dgvCamreaNums.Size = new Size(338, 111);
|
||||
dgvCamreaNums.TabIndex = 9;
|
||||
//
|
||||
// lblNowtime2
|
||||
// panelNums
|
||||
//
|
||||
lblNowtime2.AutoSize = true;
|
||||
lblNowtime2.Location = new Point(68, 68);
|
||||
lblNowtime2.Name = "lblNowtime2";
|
||||
lblNowtime2.Size = new Size(15, 17);
|
||||
lblNowtime2.TabIndex = 5;
|
||||
lblNowtime2.Text = "0";
|
||||
panelNums.Controls.Add(tableLayoutNums);
|
||||
panelNums.Dock = DockStyle.Fill;
|
||||
panelNums.Location = new Point(347, 3);
|
||||
panelNums.Name = "panelNums";
|
||||
panelNums.Size = new Size(338, 111);
|
||||
panelNums.TabIndex = 8;
|
||||
panelNums.Text = "panel4";
|
||||
//
|
||||
// label10
|
||||
// tableLayoutNums
|
||||
//
|
||||
label10.AutoSize = true;
|
||||
label10.Location = new Point(6, 68);
|
||||
label10.Name = "label10";
|
||||
label10.Size = new Size(56, 17);
|
||||
label10.TabIndex = 4;
|
||||
label10.Text = "运行时间";
|
||||
tableLayoutNums.ColumnCount = 1;
|
||||
tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
||||
tableLayoutNums.Controls.Add(dgvProductNums, 0, 0);
|
||||
tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1);
|
||||
tableLayoutNums.Dock = DockStyle.Fill;
|
||||
tableLayoutNums.Location = new Point(0, 0);
|
||||
tableLayoutNums.Name = "tableLayoutNums";
|
||||
tableLayoutNums.RowCount = 2;
|
||||
tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||
tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||
tableLayoutNums.Size = new Size(338, 111);
|
||||
tableLayoutNums.TabIndex = 8;
|
||||
//
|
||||
// lblstarttime2
|
||||
// dgvProductNums
|
||||
//
|
||||
lblstarttime2.AutoSize = true;
|
||||
lblstarttime2.Location = new Point(68, 37);
|
||||
lblstarttime2.Name = "lblstarttime2";
|
||||
lblstarttime2.Size = new Size(15, 17);
|
||||
lblstarttime2.TabIndex = 3;
|
||||
lblstarttime2.Text = "0";
|
||||
dgvProductNums.AllowUserToAddRows = false;
|
||||
dgvProductNums.AllowUserToDeleteRows = false;
|
||||
dgvProductNums.AllowUserToResizeColumns = false;
|
||||
dgvProductNums.AllowUserToResizeRows = false;
|
||||
dgvProductNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
|
||||
dgvProductNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
|
||||
dgvProductNums.BackgroundColor = SystemColors.Control;
|
||||
dgvProductNums.BorderStyle = BorderStyle.None;
|
||||
dgvProductNums.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal;
|
||||
dgvProductNums.ColumnHeadersHeight = 4;
|
||||
dgvProductNums.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
|
||||
dgvProductNums.ColumnHeadersVisible = false;
|
||||
dgvProductNums.Dock = DockStyle.Fill;
|
||||
dgvProductNums.Location = new Point(3, 3);
|
||||
dgvProductNums.MultiSelect = false;
|
||||
dgvProductNums.Name = "dgvProductNums";
|
||||
dgvProductNums.ReadOnly = true;
|
||||
dgvProductNums.RowHeadersVisible = false;
|
||||
dgvProductNums.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
||||
dgvProductNums.Size = new Size(332, 49);
|
||||
dgvProductNums.TabIndex = 10;
|
||||
//
|
||||
// label7
|
||||
// tableLayoutPanel3
|
||||
//
|
||||
label7.AutoSize = true;
|
||||
label7.Location = new Point(6, 37);
|
||||
label7.Name = "label7";
|
||||
label7.Size = new Size(56, 17);
|
||||
label7.TabIndex = 2;
|
||||
label7.Text = "开始时间";
|
||||
tableLayoutPanel3.ColumnCount = 4;
|
||||
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 81F));
|
||||
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 75F));
|
||||
tableLayoutPanel3.Controls.Add(lblTotalTime, 1, 1);
|
||||
tableLayoutPanel3.Controls.Add(label1, 2, 1);
|
||||
tableLayoutPanel3.Controls.Add(label12, 0, 1);
|
||||
tableLayoutPanel3.Controls.Add(lblUPH, 3, 1);
|
||||
tableLayoutPanel3.Controls.Add(lblStartTime, 1, 0);
|
||||
tableLayoutPanel3.Controls.Add(lblOEE_Total, 3, 0);
|
||||
tableLayoutPanel3.Controls.Add(label10, 0, 0);
|
||||
tableLayoutPanel3.Controls.Add(label7, 2, 0);
|
||||
tableLayoutPanel3.Dock = DockStyle.Fill;
|
||||
tableLayoutPanel3.Location = new Point(3, 58);
|
||||
tableLayoutPanel3.Name = "tableLayoutPanel3";
|
||||
tableLayoutPanel3.RowCount = 2;
|
||||
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||
tableLayoutPanel3.Size = new Size(332, 50);
|
||||
tableLayoutPanel3.TabIndex = 11;
|
||||
//
|
||||
// lblUPH2
|
||||
// lblTotalTime
|
||||
//
|
||||
lblUPH2.AutoSize = true;
|
||||
lblUPH2.Location = new Point(68, 11);
|
||||
lblUPH2.Name = "lblUPH2";
|
||||
lblUPH2.Size = new Size(15, 17);
|
||||
lblUPH2.TabIndex = 1;
|
||||
lblUPH2.Text = "0";
|
||||
lblTotalTime.AutoSize = true;
|
||||
lblTotalTime.Dock = DockStyle.Fill;
|
||||
lblTotalTime.Location = new Point(91, 25);
|
||||
lblTotalTime.Name = "lblTotalTime";
|
||||
lblTotalTime.Size = new Size(82, 25);
|
||||
lblTotalTime.TabIndex = 15;
|
||||
lblTotalTime.Text = "0";
|
||||
lblTotalTime.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.AutoSize = true;
|
||||
label1.Location = new Point(6, 11);
|
||||
label1.Dock = DockStyle.Fill;
|
||||
label1.Location = new Point(179, 25);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(33, 17);
|
||||
label1.TabIndex = 0;
|
||||
label1.Size = new Size(75, 25);
|
||||
label1.TabIndex = 8;
|
||||
label1.Text = "UPH";
|
||||
label1.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label12
|
||||
//
|
||||
label12.AutoSize = true;
|
||||
label12.Dock = DockStyle.Fill;
|
||||
label12.Location = new Point(3, 25);
|
||||
label12.Name = "label12";
|
||||
label12.Size = new Size(82, 25);
|
||||
label12.TabIndex = 14;
|
||||
label12.Text = "运行时间";
|
||||
label12.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblUPH
|
||||
//
|
||||
lblUPH.AutoSize = true;
|
||||
lblUPH.Dock = DockStyle.Fill;
|
||||
lblUPH.Location = new Point(260, 25);
|
||||
lblUPH.Name = "lblUPH";
|
||||
lblUPH.Size = new Size(69, 25);
|
||||
lblUPH.TabIndex = 9;
|
||||
lblUPH.Text = "0";
|
||||
lblUPH.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblStartTime
|
||||
//
|
||||
lblStartTime.AutoSize = true;
|
||||
lblStartTime.Dock = DockStyle.Fill;
|
||||
lblStartTime.Location = new Point(91, 0);
|
||||
lblStartTime.Name = "lblStartTime";
|
||||
lblStartTime.Size = new Size(82, 25);
|
||||
lblStartTime.TabIndex = 11;
|
||||
lblStartTime.Text = "0";
|
||||
lblStartTime.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblOEE_Total
|
||||
//
|
||||
lblOEE_Total.AutoSize = true;
|
||||
lblOEE_Total.Dock = DockStyle.Fill;
|
||||
lblOEE_Total.Location = new Point(260, 0);
|
||||
lblOEE_Total.Name = "lblOEE_Total";
|
||||
lblOEE_Total.Size = new Size(69, 25);
|
||||
lblOEE_Total.TabIndex = 13;
|
||||
lblOEE_Total.Text = "0";
|
||||
lblOEE_Total.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label10
|
||||
//
|
||||
label10.AutoSize = true;
|
||||
label10.Dock = DockStyle.Fill;
|
||||
label10.Location = new Point(3, 0);
|
||||
label10.Name = "label10";
|
||||
label10.Size = new Size(82, 25);
|
||||
label10.TabIndex = 12;
|
||||
label10.Text = "开始时间";
|
||||
label10.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label7
|
||||
//
|
||||
label7.AutoSize = true;
|
||||
label7.Dock = DockStyle.Fill;
|
||||
label7.Location = new Point(179, 0);
|
||||
label7.Name = "label7";
|
||||
label7.Size = new Size(75, 25);
|
||||
label7.TabIndex = 10;
|
||||
label7.Text = "总计数";
|
||||
label7.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// panel2
|
||||
//
|
||||
panel2.Location = new Point(511, 86);
|
||||
panel2.Name = "panel2";
|
||||
panel2.Size = new Size(814, 364);
|
||||
panel2.TabIndex = 3;
|
||||
panel2.Text = "panel2";
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
@@ -493,66 +520,56 @@
|
||||
segmented1.Font = new Font("Microsoft YaHei UI", 9F);
|
||||
segmented1.ForeColor = Color.White;
|
||||
segmented1.Full = true;
|
||||
segmentedItem1.Badge = null;
|
||||
segmentedItem1.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem1.BadgeBack = null;
|
||||
segmentedItem1.BadgeMode = false;
|
||||
segmentedItem1.BadgeOffsetX = 0;
|
||||
segmentedItem1.BadgeOffsetY = 0;
|
||||
segmentedItem1.BadgeSize = 0.6F;
|
||||
segmentedItem1.BadgeSvg = null;
|
||||
segmentedItem1.IconActiveSvg = resources.GetString("segmentedItem1.IconActiveSvg");
|
||||
segmentedItem1.IconSvg = resources.GetString("segmentedItem1.IconSvg");
|
||||
segmentedItem1.Text = "启动";
|
||||
segmentedItem2.Badge = null;
|
||||
segmentedItem2.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem2.BadgeBack = null;
|
||||
segmentedItem2.BadgeMode = false;
|
||||
segmentedItem2.BadgeOffsetX = 0;
|
||||
segmentedItem2.BadgeOffsetY = 0;
|
||||
segmentedItem2.BadgeSize = 0.6F;
|
||||
segmentedItem2.BadgeSvg = null;
|
||||
segmentedItem2.IconActiveSvg = resources.GetString("segmentedItem2.IconActiveSvg");
|
||||
segmentedItem2.IconSvg = resources.GetString("segmentedItem2.IconSvg");
|
||||
segmentedItem2.Text = "停止";
|
||||
segmentedItem3.Badge = null;
|
||||
segmentedItem3.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem3.BadgeBack = null;
|
||||
segmentedItem3.BadgeMode = false;
|
||||
segmentedItem3.BadgeOffsetX = 0;
|
||||
segmentedItem3.BadgeOffsetY = 0;
|
||||
segmentedItem3.BadgeSize = 0.6F;
|
||||
segmentedItem3.BadgeSvg = null;
|
||||
segmentedItem3.IconActiveSvg = resources.GetString("segmentedItem3.IconActiveSvg");
|
||||
segmentedItem3.IconSvg = resources.GetString("segmentedItem3.IconSvg");
|
||||
segmentedItem3.Text = "复位";
|
||||
segmentedItem4.Badge = null;
|
||||
segmentedItem4.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem4.BadgeBack = null;
|
||||
segmentedItem4.BadgeMode = false;
|
||||
segmentedItem4.BadgeOffsetX = 0;
|
||||
segmentedItem4.BadgeOffsetY = 0;
|
||||
segmentedItem4.BadgeSize = 0.6F;
|
||||
segmentedItem4.BadgeSvg = null;
|
||||
segmentedItem4.IconActiveSvg = resources.GetString("segmentedItem4.IconActiveSvg");
|
||||
segmentedItem4.IconSvg = resources.GetString("segmentedItem4.IconSvg");
|
||||
segmentedItem4.Text = "登录";
|
||||
segmentedItem5.Badge = null;
|
||||
segmentedItem5.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem5.BadgeBack = null;
|
||||
segmentedItem5.BadgeMode = false;
|
||||
segmentedItem5.BadgeOffsetX = 0;
|
||||
segmentedItem5.BadgeOffsetY = 0;
|
||||
segmentedItem5.BadgeSize = 0.6F;
|
||||
segmentedItem5.BadgeSvg = null;
|
||||
segmentedItem5.IconActiveSvg = resources.GetString("segmentedItem5.IconActiveSvg");
|
||||
segmentedItem5.IconSvg = resources.GetString("segmentedItem5.IconSvg");
|
||||
segmentedItem5.Text = "设置";
|
||||
segmented1.Items.Add(segmentedItem1);
|
||||
segmented1.Items.Add(segmentedItem2);
|
||||
segmented1.Items.Add(segmentedItem3);
|
||||
segmented1.Items.Add(segmentedItem4);
|
||||
segmented1.Items.Add(segmentedItem5);
|
||||
segmentedItem6.Badge = null;
|
||||
segmentedItem6.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem6.BadgeBack = null;
|
||||
segmentedItem6.BadgeMode = false;
|
||||
segmentedItem6.BadgeOffsetX = 0;
|
||||
segmentedItem6.BadgeOffsetY = 0;
|
||||
segmentedItem6.BadgeSize = 0.6F;
|
||||
segmentedItem6.BadgeSvg = null;
|
||||
segmentedItem6.Text = "启动";
|
||||
segmentedItem7.Badge = null;
|
||||
segmentedItem7.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem7.BadgeBack = null;
|
||||
segmentedItem7.BadgeMode = false;
|
||||
segmentedItem7.BadgeOffsetX = 0;
|
||||
segmentedItem7.BadgeOffsetY = 0;
|
||||
segmentedItem7.BadgeSize = 0.6F;
|
||||
segmentedItem7.BadgeSvg = null;
|
||||
segmentedItem7.Text = "停止";
|
||||
segmentedItem8.Badge = null;
|
||||
segmentedItem8.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem8.BadgeBack = null;
|
||||
segmentedItem8.BadgeMode = false;
|
||||
segmentedItem8.BadgeOffsetX = 0;
|
||||
segmentedItem8.BadgeOffsetY = 0;
|
||||
segmentedItem8.BadgeSize = 0.6F;
|
||||
segmentedItem8.BadgeSvg = null;
|
||||
segmentedItem8.Text = "复位";
|
||||
segmentedItem9.Badge = null;
|
||||
segmentedItem9.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem9.BadgeBack = null;
|
||||
segmentedItem9.BadgeMode = false;
|
||||
segmentedItem9.BadgeOffsetX = 0;
|
||||
segmentedItem9.BadgeOffsetY = 0;
|
||||
segmentedItem9.BadgeSize = 0.6F;
|
||||
segmentedItem9.BadgeSvg = null;
|
||||
segmentedItem9.Text = "登录";
|
||||
segmentedItem10.Badge = null;
|
||||
segmentedItem10.BadgeAlign = AntdUI.TAlignFrom.TR;
|
||||
segmentedItem10.BadgeBack = null;
|
||||
segmentedItem10.BadgeMode = false;
|
||||
segmentedItem10.BadgeOffsetX = 0;
|
||||
segmentedItem10.BadgeOffsetY = 0;
|
||||
segmentedItem10.BadgeSize = 0.6F;
|
||||
segmentedItem10.BadgeSvg = null;
|
||||
segmentedItem10.Text = "设置";
|
||||
segmented1.Items.Add(segmentedItem6);
|
||||
segmented1.Items.Add(segmentedItem7);
|
||||
segmented1.Items.Add(segmentedItem8);
|
||||
segmented1.Items.Add(segmentedItem9);
|
||||
segmented1.Items.Add(segmentedItem10);
|
||||
segmented1.Location = new Point(0, 0);
|
||||
segmented1.Name = "segmented1";
|
||||
segmented1.Size = new Size(491, 68);
|
||||
@@ -562,10 +579,9 @@
|
||||
//
|
||||
// MainWindow
|
||||
//
|
||||
ClientSize = new Size(1024, 648);
|
||||
ClientSize = new Size(1024, 671);
|
||||
ControlBox = false;
|
||||
Controls.Add(panelmain);
|
||||
Controls.Add(pageHeader1);
|
||||
Controls.Add(titlebar);
|
||||
Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
||||
@@ -578,15 +594,23 @@
|
||||
titlebar.ResumeLayout(false);
|
||||
tabsStas.ResumeLayout(false);
|
||||
tabPage3.ResumeLayout(false);
|
||||
panel5.ResumeLayout(false);
|
||||
panel5.PerformLayout();
|
||||
pageHeader1.ResumeLayout(false);
|
||||
pageHeader1.PerformLayout();
|
||||
panelmain.ResumeLayout(false);
|
||||
panel2.ResumeLayout(false);
|
||||
panel4.ResumeLayout(false);
|
||||
splitter2.Panel1.ResumeLayout(false);
|
||||
splitter2.Panel2.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)splitter2).EndInit();
|
||||
splitter2.ResumeLayout(false);
|
||||
splitter1.Panel1.ResumeLayout(false);
|
||||
splitter1.Panel2.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)splitter1).EndInit();
|
||||
splitter1.ResumeLayout(false);
|
||||
panel6.ResumeLayout(false);
|
||||
panel6.PerformLayout();
|
||||
tableLayoutstatistics.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit();
|
||||
panelNums.ResumeLayout(false);
|
||||
tableLayoutNums.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)dgvProductNums).EndInit();
|
||||
tableLayoutPanel3.ResumeLayout(false);
|
||||
tableLayoutPanel3.PerformLayout();
|
||||
panel1.ResumeLayout(false);
|
||||
panel3.ResumeLayout(false);
|
||||
ResumeLayout(false);
|
||||
@@ -595,12 +619,9 @@
|
||||
#endregion
|
||||
|
||||
private AntdUI.PageHeader titlebar;
|
||||
private AntdUI.PageHeader pageHeader1;
|
||||
private AntdUI.Divider divider2;
|
||||
private AntdUI.Panel panelmain;
|
||||
private AntdUI.Panel panel1;
|
||||
private AntdUI.Segmented segmented1;
|
||||
private Label labuph;
|
||||
private AntdUI.Splitter splitter1;
|
||||
|
||||
private AntdUI.Label lbName;
|
||||
@@ -610,30 +631,36 @@
|
||||
private AntdUI.Button btnLoadProject;
|
||||
public AntdUI.Select sltProjects;
|
||||
private Panel panel7;
|
||||
private Panel panel5;
|
||||
private Label lblNum;
|
||||
private Label label2;
|
||||
private Label lblNowtime;
|
||||
private Label label8;
|
||||
private Label lblstarttime;
|
||||
private Label label6;
|
||||
private Label lblUPH;
|
||||
// private Panel panel5;
|
||||
// private Label lblNum;
|
||||
// private Label label2;
|
||||
// private Label lblNowtime;
|
||||
// private Label label8;
|
||||
// private Label lblstarttime;
|
||||
// private Label label6;
|
||||
// private Label lblUPH;
|
||||
private Label label4;
|
||||
private AntdUI.TabPage tabPage3;
|
||||
private AntdUI.TabPage tabMain;
|
||||
private AntdUI.Tabs tabsStas;
|
||||
private Label label1;
|
||||
private AntdUI.Panel panel2;
|
||||
private AntdUI.Panel panel4;
|
||||
private AntdUI.Tabs tabImgDisplay;
|
||||
private AntdUI.Panel panel6;
|
||||
private Label lblUPH2;
|
||||
private Label lblNum2;
|
||||
private Label label12;
|
||||
private Label lblNowtime2;
|
||||
private Label label10;
|
||||
private Label lblstarttime2;
|
||||
private Label label7;
|
||||
private AntdUI.Panel pnlLog;
|
||||
private AntdUI.Splitter splitter2;
|
||||
private TableLayoutPanel tableLayoutstatistics;
|
||||
private AntdUI.Panel panelNums;
|
||||
private DataGridView dgvCamreaNums;
|
||||
private TableLayoutPanel tableLayoutNums;
|
||||
private Label label1;
|
||||
private Label lblTotalTime;
|
||||
private Label lblUPH;
|
||||
private Label label12;
|
||||
private Label label7;
|
||||
private Label lblOEE_Total;
|
||||
private Label lblStartTime;
|
||||
private Label label10;
|
||||
private DataGridView dgvProductNums;
|
||||
private TableLayoutPanel tableLayoutPanel3;
|
||||
}
|
||||
}
|
@@ -22,9 +22,11 @@ using System;
|
||||
using System.CodeDom;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
@@ -36,13 +38,22 @@ using static DH.Commons.Enums.EnumHelper;
|
||||
using Camera = DHSoftware.Models.Camera;
|
||||
using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel;
|
||||
using ResultState = DH.Commons.Base.ResultState;
|
||||
using Timer = System.Threading.Timer;
|
||||
|
||||
namespace DHSoftware
|
||||
{
|
||||
public partial class MainWindow : AntdUI.Window
|
||||
{
|
||||
System.Windows.Forms.Timer _refreshUITimer = new System.Windows.Forms.Timer();
|
||||
private Dictionary<string, List<string>> _cameraRelatedDetectionDict = null;
|
||||
public event Action<LogMsg> OnLog;
|
||||
|
||||
public List<CameraSummary> CameraSummaries { get; set; } = new List<CameraSummary>();
|
||||
public List<ProductSummary> ProductSummaries { get; set; } = new List<ProductSummary>();
|
||||
static object _productSummaryLock = new object();
|
||||
public event Action<DateTime, object, string> OnUpdateResult;
|
||||
public event Action<DateTime, object, string> OnUpdateCamResult;
|
||||
|
||||
private string _loginName;
|
||||
|
||||
public string LoginName
|
||||
@@ -173,8 +184,7 @@ namespace DHSoftware
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
//refreshTimer.Start();
|
||||
InitialCameraSumsView(); //refreshTimer.Start();
|
||||
//初始化数据
|
||||
InitData();
|
||||
//绑定事件
|
||||
@@ -185,6 +195,317 @@ namespace DHSoftware
|
||||
//userControlFrm.Dock = DockStyle.Fill;
|
||||
//tabPage2.Controls.Add(userControlFrm);
|
||||
}
|
||||
//#region OEE
|
||||
// public event Action<RunState> OnProcessRunStateChanged;
|
||||
#region INotifyPropertyChanged
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
public virtual void Set<T>(ref T field, T newValue, [CallerMemberName] string propName = null)
|
||||
{
|
||||
if (!field.Equals(newValue))
|
||||
{
|
||||
field = newValue;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
#region Properties
|
||||
private int uph = 0;
|
||||
private int upm = 0;
|
||||
|
||||
private DateTime? startTime = null;
|
||||
private TimeSpan runTime = new TimeSpan();
|
||||
private TimeSpan idleTime = new TimeSpan();
|
||||
private TimeSpan downTime = new TimeSpan();
|
||||
private TimeSpan totalTime = new TimeSpan();
|
||||
private int qty_OEE = 0;
|
||||
private int qty_OEE_OK = 0;
|
||||
private float oee = 0;
|
||||
|
||||
public int UPH
|
||||
{
|
||||
get => uph;
|
||||
set => Set(ref uph, value);
|
||||
}
|
||||
public int UPM
|
||||
{
|
||||
get => upm;
|
||||
set => Set(ref upm, value);
|
||||
}
|
||||
public DateTime? StartTime
|
||||
{
|
||||
get => startTime;
|
||||
set => Set(ref startTime, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 有效运行时间
|
||||
/// </summary>
|
||||
public TimeSpan RunTime
|
||||
{
|
||||
get => runTime;
|
||||
set => Set(ref runTime, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 空闲待机时间
|
||||
/// </summary>
|
||||
public TimeSpan IdleTime
|
||||
{
|
||||
get => idleTime;
|
||||
set => Set(ref idleTime, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 故障宕机时间
|
||||
/// </summary>
|
||||
public TimeSpan DownTime
|
||||
{
|
||||
get => downTime;
|
||||
set => Set(ref downTime, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 总开机时间
|
||||
/// </summary>
|
||||
public TimeSpan TotalTime
|
||||
{
|
||||
get => totalTime;
|
||||
set => Set(ref totalTime, value);
|
||||
}
|
||||
|
||||
public float OEE
|
||||
{
|
||||
get => oee;
|
||||
set => Set(ref oee, value);
|
||||
}
|
||||
#endregion
|
||||
#region Timer
|
||||
System.Threading.Timer _runTimer = null;
|
||||
System.Threading.Timer _idleTimer = null;
|
||||
System.Threading.Timer _downTimer = null;
|
||||
System.Threading.Timer _checkIdleTimer = null;
|
||||
//System.Threading.Timer _calculateTimer = null;
|
||||
|
||||
private RunState? currentState = null;
|
||||
public RunState? CurrentState
|
||||
{
|
||||
get => currentState;
|
||||
set
|
||||
{
|
||||
if (value != null)
|
||||
{
|
||||
if (value.Value == RunState.Running)
|
||||
{
|
||||
_checkIdleTimer?.Change(10 * 1000, -1);
|
||||
}
|
||||
|
||||
if (currentState != value.Value)
|
||||
{
|
||||
switch (currentState)
|
||||
{
|
||||
case RunState.Idle:
|
||||
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Idle, false);
|
||||
break;
|
||||
case RunState.Down:
|
||||
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Down, false);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (value.Value)
|
||||
{
|
||||
case RunState.Stop:
|
||||
_runTimer?.Change(-1, -1);
|
||||
_idleTimer?.Change(-1, -1);
|
||||
_downTimer?.Change(-1, -1);
|
||||
break;
|
||||
case RunState.Running:
|
||||
_idleTimer?.Change(-1, -1);
|
||||
_downTimer?.Change(-1, -1);
|
||||
_runTimer?.Change(0, 1000);
|
||||
break;
|
||||
case RunState.Idle:
|
||||
_runTimer?.Change(-1, -1);
|
||||
_downTimer?.Change(-1, -1);
|
||||
_idleTimer?.Change(0, 1000);
|
||||
|
||||
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Idle, true);
|
||||
break;
|
||||
case RunState.Down:
|
||||
_idleTimer?.Change(-1, -1);
|
||||
_runTimer?.Change(-1, -1);
|
||||
_downTimer?.Change(0, 1000);
|
||||
|
||||
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Down, true);
|
||||
break;
|
||||
}
|
||||
|
||||
currentState = value;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckIdleTimeStart(object state)
|
||||
{
|
||||
if (CurrentState == RunState.Running)
|
||||
{
|
||||
RunTime = RunTime.Add(new TimeSpan(0, 0, 0 - 10));
|
||||
IdleTime = IdleTime.Add(new TimeSpan(0, 0, 10));
|
||||
|
||||
CurrentState = RunState.Idle;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitialOEEStatistic()
|
||||
{
|
||||
InitialStatisticTimers();
|
||||
ResetOEETimeDistribute();
|
||||
ResetProductSummaries();
|
||||
}
|
||||
|
||||
public void ResetProductSummaries()
|
||||
{
|
||||
ProductSummaries = new List<ProductSummary>();
|
||||
}
|
||||
private void InitialStatisticTimers()
|
||||
{
|
||||
if (_checkIdleTimer == null)
|
||||
{
|
||||
_checkIdleTimer = new Timer(new TimerCallback(CheckIdleTimeStart), null, -1, -1);
|
||||
}
|
||||
|
||||
if (_runTimer == null)
|
||||
{
|
||||
_runTimer = new System.Threading.Timer(RunTimerCallBack, null, -1, -1);
|
||||
}
|
||||
|
||||
if (_idleTimer == null)
|
||||
{
|
||||
_idleTimer = new System.Threading.Timer(IdleTimerCallBack, null, -1, -1);
|
||||
}
|
||||
|
||||
if (_downTimer == null)
|
||||
{
|
||||
_downTimer = new System.Threading.Timer(DownTimerCallBack, null, -1, -1);
|
||||
}
|
||||
|
||||
StartTime = DateTime.Now;
|
||||
DownTime = IdleTime = RunTime = new TimeSpan(0, 0, 0);
|
||||
CurrentState = RunState.Running;
|
||||
}
|
||||
|
||||
private void DownTimerCallBack(object state)
|
||||
{
|
||||
DownTime = DownTime.Add(new TimeSpan(0, 0, 1));
|
||||
GetTotalTime();
|
||||
}
|
||||
|
||||
private void IdleTimerCallBack(object state)
|
||||
{
|
||||
IdleTime = IdleTime.Add(new TimeSpan(0, 0, 1));
|
||||
GetTotalTime();
|
||||
}
|
||||
|
||||
private void RunTimerCallBack(object state)
|
||||
{
|
||||
RunTime = RunTime.Add(new TimeSpan(0, 0, 1));
|
||||
GetTotalTime();
|
||||
}
|
||||
|
||||
private void GetTotalTime()
|
||||
{
|
||||
TotalTime = RunTime + IdleTime + DownTime;
|
||||
}
|
||||
|
||||
public void ResetOEETimeDistribute()
|
||||
{
|
||||
StartTime = DateTime.Now;
|
||||
DownTime = IdleTime = RunTime = new TimeSpan(0, 0, 0);
|
||||
|
||||
ProductNum_Total = ProductNum_OK = 0;
|
||||
}
|
||||
|
||||
public void CloseStatisticTimers()
|
||||
{
|
||||
CloseTimer(ref _checkIdleTimer);
|
||||
CloseTimer(ref _runTimer);
|
||||
CloseTimer(ref _idleTimer);
|
||||
CloseTimer(ref _downTimer);
|
||||
|
||||
CurrentState = RunState.Stop;
|
||||
}
|
||||
|
||||
private void CloseTimer(ref System.Threading.Timer timer)
|
||||
{
|
||||
timer?.Change(-1, -1);
|
||||
timer?.Dispose();
|
||||
timer = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region CameraSum
|
||||
private void InitialCameraSumsView()
|
||||
{
|
||||
dgvProductNums.AutoGenerateColumns = false;
|
||||
|
||||
dgvProductNums.DefaultCellStyle.Font = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.World);
|
||||
|
||||
dgvProductNums.DataSource = null;
|
||||
dgvProductNums.DataSource = ProductSummaries;
|
||||
|
||||
|
||||
dgvCamreaNums.AutoGenerateColumns = false;
|
||||
|
||||
dgvCamreaNums.DefaultCellStyle.Font = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.World);
|
||||
|
||||
dgvCamreaNums.DataSource = null;
|
||||
dgvCamreaNums.Columns.Clear();
|
||||
|
||||
// 添加 CCD 列
|
||||
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
|
||||
{
|
||||
HeaderText = "CCD",
|
||||
DataPropertyName = "CameraName"
|
||||
});
|
||||
|
||||
// 添加 合格 列
|
||||
var okColumn = new DataGridViewTextBoxColumn
|
||||
{
|
||||
HeaderText = "合格",
|
||||
DataPropertyName = "OKCount"
|
||||
};
|
||||
okColumn.DefaultCellStyle.ForeColor = Color.LightGreen; // 设置背景为绿色
|
||||
dgvCamreaNums.Columns.Add(okColumn);
|
||||
|
||||
// 添加 不合格 列
|
||||
var ngColumn = new DataGridViewTextBoxColumn
|
||||
{
|
||||
HeaderText = "不合格",
|
||||
DataPropertyName = "NGCount"
|
||||
};
|
||||
ngColumn.DefaultCellStyle.ForeColor = Color.LightCoral; // 设置背景为红色
|
||||
dgvCamreaNums.Columns.Add(ngColumn);
|
||||
|
||||
// 添加 总数 列
|
||||
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
|
||||
{
|
||||
HeaderText = "总数",
|
||||
DataPropertyName = "TotalCount"
|
||||
|
||||
});
|
||||
|
||||
// 添加 良率 列
|
||||
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
|
||||
{
|
||||
HeaderText = "良率",
|
||||
DataPropertyName = "YieldStr"
|
||||
});
|
||||
|
||||
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 窗体对象实例
|
||||
@@ -265,17 +586,23 @@ namespace DHSoftware
|
||||
if (cameraBase.CamType == EnumCamType.度申Do3think)
|
||||
{
|
||||
|
||||
Do3ThinkCamera cam = new Do3ThinkCamera();
|
||||
|
||||
Do3ThinkCamera cam =new Do3ThinkCamera();
|
||||
cam.IsSavePicEnabled = cameraBase.IsSavePicEnabled;
|
||||
cam.CameraName = cameraBase.CameraName;
|
||||
cam.CameraIP = cameraBase.CameraIP;
|
||||
cam.IsEnabled = cameraBase.IsEnabled;
|
||||
cam.ImageSaveDirectory = "D://Cam1//";
|
||||
Cameras.Add(cam);
|
||||
if(cameraBase.IsEnabled)
|
||||
{
|
||||
cam.OnLog -= _visionEngine_OnLog;
|
||||
cam.OnLog += _visionEngine_OnLog;
|
||||
cam.CameraConnect();
|
||||
cam.OnHImageOutput += OnCameraHImageOutput;
|
||||
}
|
||||
|
||||
}
|
||||
else if (cameraBase.CamType == EnumCamType.海康hik)
|
||||
{
|
||||
HikVisionCamera cam = new HikVisionCamera();
|
||||
@@ -419,6 +746,70 @@ namespace DHSoftware
|
||||
LoggerHelper.LogPrefix = "Process";
|
||||
OnLog -= LogDisplay;
|
||||
OnLog += LogDisplay;
|
||||
|
||||
OnUpdateCamResult -= UpdateCamResult;
|
||||
|
||||
OnUpdateCamResult += UpdateCamResult;
|
||||
OnUpdateResult -= UpdateResult;
|
||||
OnUpdateResult += UpdateResult;
|
||||
Load += (s, e) =>
|
||||
{
|
||||
_refreshUITimer.Interval = 1000;
|
||||
_refreshUITimer.Tick += _refreshUITimer_Tick;
|
||||
_refreshUITimer.Enabled = true;
|
||||
};
|
||||
}
|
||||
private void _refreshUITimer_Tick(object sender, EventArgs e)
|
||||
{
|
||||
_refreshUITimer.Enabled = false;
|
||||
|
||||
if (this != null)
|
||||
{
|
||||
lblStartTime.Text = StartTime == null ? "" : StartTime.Value.ToString("yyyy/MM/dd HH:mm:ss");
|
||||
lblTotalTime.Text = TotalTime.ToString(); // 运行时间
|
||||
// lblRunTime.Text = RunTime.ToString(); // 有效时间
|
||||
// lblIdleTime.Text = ProcessControl.IdleTime.ToString(); // 空闲时间
|
||||
// lblDownTime.Text = ProcessControl.DownTime.ToString(); // 宕机时间
|
||||
|
||||
lblOEE_Total.Text =ProductNum_Total.ToString();
|
||||
//lblOEE_OK.Text = ProcessControl.ProductNum_OK.ToString();
|
||||
}
|
||||
|
||||
_refreshUITimer.Enabled = true;
|
||||
}
|
||||
private void UpdateCamResult(DateTime updateTime, object objData, string customMessage)
|
||||
{
|
||||
this.Invoke(new Action(() =>
|
||||
{
|
||||
|
||||
BindingList<CameraSummary> cameraSummaries = new BindingList<CameraSummary>(CameraSummaries);
|
||||
dgvCamreaNums.DataSource = cameraSummaries;
|
||||
|
||||
}));
|
||||
|
||||
}
|
||||
private void UpdateResult(DateTime updateTime, object objData, string result)
|
||||
{
|
||||
this.Invoke(new Action(() =>
|
||||
{
|
||||
//dgvProductNums.DataSource = null;
|
||||
|
||||
BindingList<ProductSummary> productSummaries = new BindingList<ProductSummary>(ProductSummaries);
|
||||
|
||||
dgvProductNums.DataSource = productSummaries;
|
||||
|
||||
//if (dgvProductNums.Rows.Count > 0)
|
||||
//{
|
||||
// dgvProductNums.Height = dgvProductNums.Rows[0].Height * dgvProductNums.Rows.Count + 15;
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// dgvProductNums.Height = 15;
|
||||
//}
|
||||
|
||||
//lblOEE_Rate.Text = ProcessControl.OEE.ToString("f2") + " %";
|
||||
lblUPH.Text = UPH.ToString();
|
||||
}));
|
||||
}
|
||||
|
||||
private void BtnDeleteProject_Click(object? sender, EventArgs e)
|
||||
@@ -641,7 +1032,7 @@ namespace DHSoftware
|
||||
private void StartProcess()
|
||||
{
|
||||
ProcessstartTime = DateTime.Now;
|
||||
lblstarttime2.Text = ProcessstartTime.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
lblStartTime.Text = ProcessstartTime.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
//计数清零
|
||||
PieceCount = 0;
|
||||
|
||||
@@ -652,7 +1043,7 @@ namespace DHSoftware
|
||||
PLC.OnNewPieces += MainMotion_NewPieces;
|
||||
}
|
||||
|
||||
ConfigModel.CameraBaseList.ForEach(d =>
|
||||
Cameras.ForEach(d =>
|
||||
{
|
||||
if (d is CameraBase cam)
|
||||
{
|
||||
@@ -744,7 +1135,7 @@ namespace DHSoftware
|
||||
// ProductBaseCount = _MGSCameraList.Count;
|
||||
|
||||
|
||||
|
||||
InitialOEEStatistic();
|
||||
//流程执行时PLC
|
||||
PLC.StartProcess();
|
||||
|
||||
@@ -873,17 +1264,7 @@ namespace DHSoftware
|
||||
if (!_cameraRelatedDetectionDict.ContainsKey(camera.CameraName))
|
||||
{
|
||||
localImageSet.Dispose();
|
||||
//this.BeginInvoke(new MethodInvoker(delegate ()
|
||||
//{
|
||||
// // int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y;
|
||||
|
||||
// // richTextBox1.AppendText(productNumber + "提前推出" + camera.CameraName);
|
||||
|
||||
// // 设置回原来的滚动位置
|
||||
// // richTextBox1.SelectionStart = richTextBox1.TextLength;
|
||||
// // richTextBox1.ScrollToCaret();
|
||||
//}));
|
||||
////重新生成实例 销毁之前的实例
|
||||
|
||||
|
||||
LogAsync(DateTime.Now, LogLevel.Warning, $"{camera.CameraName} 找到产品{productNumber},但是没有推理1");
|
||||
@@ -911,6 +1292,8 @@ namespace DHSoftware
|
||||
}
|
||||
}
|
||||
stopwatch.Stop();
|
||||
if (product.ResultCollection.Count != 0)
|
||||
UpdateResultoverride(dt, camera, resultStates, totalTime, _cameraRelatedDetectionDict.Keys.Count);
|
||||
|
||||
product.InferenceOne();
|
||||
|
||||
@@ -920,19 +1303,8 @@ namespace DHSoftware
|
||||
{
|
||||
return;
|
||||
}
|
||||
UpdateResult(DateTime.Now, null, product.ProductResult.GetEnumDescription());
|
||||
// ProductNum_Total++;
|
||||
// CalculateOEE();
|
||||
this.BeginInvoke(new MethodInvoker(delegate ()
|
||||
{
|
||||
//int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y;
|
||||
UpdateResultPro(DateTime.Now, null, product.ProductResult.GetEnumDescription());
|
||||
|
||||
//richTextBox1.AppendText($"统计结果成功,{productNumber} 吹气!\n");
|
||||
|
||||
// 设置回原来的滚动位置
|
||||
// richTextBox1.SelectionStart = richTextBox1.TextLength;
|
||||
// richTextBox1.ScrollToCaret();
|
||||
}));
|
||||
|
||||
#region 6. 统计产品结果
|
||||
|
||||
@@ -1025,18 +1397,115 @@ namespace DHSoftware
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public async Task UpdateResult(DateTime dt, object objData, string resultStr)
|
||||
public virtual void AddOKProduct(string resultStr)
|
||||
{
|
||||
if (resultStr.ToLower() == "ok")
|
||||
{
|
||||
ProductNum_OK++;
|
||||
}
|
||||
}
|
||||
public async Task UpdateResultoverride(DateTime dt, CameraBase objData, List<ResultState> resultStr, double total, int _cameraDictCount)
|
||||
{
|
||||
// CurrentState = RunState.Running;
|
||||
|
||||
|
||||
|
||||
// 根据相机名称找到对应的信息(假设有一个字典或其他集合保存相机相关信息)
|
||||
var cameraName = objData?.CameraName; // 假设 CameraBase 有 Name 属性
|
||||
if (string.IsNullOrEmpty(cameraName))
|
||||
{
|
||||
throw new ArgumentException("相机名称不能为空");
|
||||
}
|
||||
|
||||
|
||||
|
||||
lock (_cameraSummaryLock)
|
||||
{
|
||||
// 查找或添加相机统计项
|
||||
var summary = CameraSummaries.FirstOrDefault(c => c.CameraName == cameraName)
|
||||
?? new CameraSummary { CameraName = cameraName };
|
||||
|
||||
if (!CameraSummaries.Contains(summary))
|
||||
{
|
||||
CameraSummaries.Add(summary);
|
||||
}
|
||||
|
||||
if (resultStr.Any(u => u.ToString().ToLower() == "ok"))
|
||||
{
|
||||
summary.OKCount++;
|
||||
}
|
||||
|
||||
else /*if (resultStr.Equals("TBD", StringComparison.OrdinalIgnoreCase))*/
|
||||
{
|
||||
summary.NGCount++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
await Task.Run(() =>
|
||||
{
|
||||
OnUpdateCamResult?.Invoke(dt, objData, "");
|
||||
});
|
||||
}
|
||||
|
||||
public async Task UpdateResultPro(DateTime dt, object objData, string resultStr)
|
||||
{
|
||||
CurrentState = RunState.Running;
|
||||
|
||||
ProductNum_Total++;
|
||||
//AddOKProduct(resultStr);
|
||||
AddOKProduct(resultStr);
|
||||
|
||||
|
||||
|
||||
lock (_productSummaryLock)
|
||||
{
|
||||
var product = ProductSummaries.FirstOrDefault(u => u.ResultDesc == resultStr);
|
||||
if (product != null)
|
||||
{
|
||||
product.ProductAmount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
product = new ProductSummary();
|
||||
product.ResultDesc = resultStr;
|
||||
product.ProductAmount = 1;
|
||||
|
||||
ProductSummaries.Add(product);
|
||||
}
|
||||
|
||||
int totalNum = ProductSummaries.Sum(p => p.ProductAmount);
|
||||
ProductSummaries.ForEach(p => p.PercentStr = ((double)p.ProductAmount * 100.0 / totalNum).ToString("f2") + " %");
|
||||
}
|
||||
|
||||
CalculateOEE();
|
||||
|
||||
await Task.Run(() =>
|
||||
{
|
||||
OnUpdateResult?.Invoke(dt, objData, resultStr);
|
||||
});
|
||||
lock (_cameraSummaryLock)
|
||||
{
|
||||
// 查找或添加相机统计项
|
||||
var summary = CameraSummaries.FirstOrDefault(c => c.CameraName == "合计")
|
||||
?? new CameraSummary { CameraName = "合计" };
|
||||
|
||||
summary.OKCount = ProductNum_OK;
|
||||
summary.NGCount = ProductNum_Total - ProductNum_OK;
|
||||
if (!CameraSummaries.Contains(summary))
|
||||
{
|
||||
CameraSummaries.Add(summary);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
await Task.Run(() =>
|
||||
{
|
||||
OnUpdateCamResult?.Invoke(dt, objData, "合计");
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1050,21 +1519,33 @@ namespace DHSoftware
|
||||
//sLDMotion.Stop();
|
||||
}
|
||||
|
||||
public int UPH = 0;
|
||||
|
||||
|
||||
public void CalculateOEE()
|
||||
{
|
||||
TimeSpan timeSpan = DateTime.Now - ProcessstartTime;
|
||||
|
||||
UPH = (int)(ProductNum_Total / timeSpan.TotalHours) + 100;
|
||||
//UPM = (int)UPH / 60;
|
||||
this.BeginInvoke(new MethodInvoker(delegate ()
|
||||
if (TotalTime.TotalHours == 0)
|
||||
{
|
||||
lblNowtime2.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
lblUPH2.Text = UPH.ToString();
|
||||
lblNum2.Text = ProductNum_Total.ToString();
|
||||
labuph.Text = UPH.ToString();
|
||||
}));
|
||||
UPH = 0;
|
||||
UPM = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
UPH = (int)(ProductNum_Total / RunTime.TotalHours) + 100;
|
||||
UPM = (int)UPH / 60;
|
||||
}
|
||||
|
||||
|
||||
//TimeSpan timeSpan = DateTime.Now - ProcessstartTime;
|
||||
|
||||
//UPH = (int)(ProductNum_Total / timeSpan.TotalHours) + 100;
|
||||
////UPM = (int)UPH / 60;
|
||||
//this.BeginInvoke(new MethodInvoker(delegate ()
|
||||
//{
|
||||
// lblNowtime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
// lblUPH.Text = UPH.ToString();
|
||||
// lblNum.Text = ProductNum_Total.ToString();
|
||||
|
||||
//}));
|
||||
}
|
||||
|
||||
private void HandleResetButton()
|
||||
|
@@ -117,36 +117,6 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="segmentedItem1.IconActiveSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M731.818667 500.280889L386.844444 239.729778a14.677333 14.677333 0 0 0-23.495111 11.719111v521.159111a14.677333 14.677333 0 0 0 23.495111 11.662222l344.860445-260.608a14.677333 14.677333 0 0 0 0.113778-23.381333z" fill="#FFFFFF"/><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512z m0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem1.IconSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M731.818667 500.280889L386.844444 239.729778a14.677333 14.677333 0 0 0-23.495111 11.719111v521.159111a14.677333 14.677333 0 0 0 23.495111 11.662222l344.860445-260.608a14.677333 14.677333 0 0 0 0.113778-23.381333z" fill="#FFFFFF"/><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512z m0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem2.IconActiveSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M365.014704 657.815846H657.084939V365.74561H365.014704V657.815846zm584.140471-146.035118c0-240.906781-197.125482-438.105353-438.105353-438.105353-240.979872 0-438.105353 197.198572-438.105354 438.105353 0 240.979872 197.125482 438.178444 438.105354 438.178444 240.979872 0 438.105353-197.198572 438.105353-438.178444zM511.634547 0.730906c281.399001 0 511.634547 230.235546 511.634547 511.634547s-230.235546 511.634547-511.634547 511.634547-511.634547-230.235546-511.634547-511.634547 230.235546-511.634547 511.634547-511.634547z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem2.IconSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M365.014704 657.815846H657.084939V365.74561H365.014704V657.815846zm584.140471-146.035118c0-240.906781-197.125482-438.105353-438.105353-438.105353-240.979872 0-438.105353 197.198572-438.105354 438.105353 0 240.979872 197.125482 438.178444 438.105354 438.178444 240.979872 0 438.105353-197.198572 438.105353-438.178444zM511.634547 0.730906c281.399001 0 511.634547 230.235546 511.634547 511.634547s-230.235546 511.634547-511.634547 511.634547-511.634547-230.235546-511.634547-511.634547 230.235546-511.634547 511.634547-511.634547z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem3.IconActiveSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M527.36 351.744V292.864L410.624 380.416 527.36 468.48V410.624c72.192 8.192 124.416 73.216 116.224 145.408-8.192 72.192-73.216 124.416-145.408 116.224-66.56-7.168-117.248-64-117.248-131.072-0.512-5.12-0.512-9.728 0-14.848H323.584c-0.512 5.12-0.512 9.728 0 14.848 0 104.96 85.504 189.952 190.464 189.952s189.952-85.504 189.952-190.464c-0.512-99.328-77.312-181.76-176.64-188.928z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem3.IconSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M527.36 351.744V292.864L410.624 380.416 527.36 468.48V410.624c72.192 8.192 124.416 73.216 116.224 145.408-8.192 72.192-73.216 124.416-145.408 116.224-66.56-7.168-117.248-64-117.248-131.072-0.512-5.12-0.512-9.728 0-14.848H323.584c-0.512 5.12-0.512 9.728 0 14.848 0 104.96 85.504 189.952 190.464 189.952s189.952-85.504 189.952-190.464c-0.512-99.328-77.312-181.76-176.64-188.928z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem4.IconActiveSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path transform="scale(0.8) translate(128,128)" d="M960.853333 903.816533a463.633067 463.633067 0 0 0-11.264-39.185066c-1.536-4.539733-3.413333-8.942933-5.051733-13.448534a484.078933 484.078933 0 0 0-9.557333-24.4736c-2.2528-5.188267-4.881067-10.274133-7.338667-15.394133-3.413333-7.099733-6.8608-14.165333-10.6496-21.0944-2.901333-5.3248-6.075733-10.513067-9.181867-15.701333-2.423467-4.061867-4.573867-8.226133-7.133866-12.219734-1.604267-2.4576-3.413333-4.778667-5.0176-7.202133-1.501867-2.218667-2.730667-4.608-4.266667-6.792533-0.4096-0.6144-1.058133-0.887467-1.501867-1.4336a461.482667 461.482667 0 0 0-90.385066-96.768c-13.5168-10.786133-27.7504-20.48-42.257067-29.5936-0.477867-0.341333-0.7168-0.8192-1.194667-1.1264-3.6864-2.286933-7.509333-4.3008-11.264-6.485334-4.266667-2.491733-8.4992-5.051733-12.868266-7.441066-6.826667-3.6864-13.789867-7.099733-20.753067-10.478934-3.618133-1.7408-7.202133-3.618133-10.8544-5.290666a449.194667 449.194667 0 0 0-31.607467-12.731734c-0.7168-0.273067-1.365333-0.6144-2.082133-0.8192-3.140267-1.1264-6.417067-1.911467-9.557333-2.935466-4.164267-1.399467-8.328533-2.833067-12.561067-4.096a259.9936 259.9936 0 0 0 129.194667-225.450667 260.061867 260.061867 0 0 0-76.629334-185.002667 259.9936 259.9936 0 0 0-185.002666-76.629333H512h-0.034133a259.857067 259.857067 0 0 0-185.002667 76.629333 259.925333 259.925333 0 0 0-76.629333 185.002667 259.584 259.584 0 0 0 76.629333 185.002667c15.906133 15.940267 33.655467 29.2864 52.565333 40.448-4.266667 1.262933-8.430933 2.730667-12.663466 4.096-3.140267 1.058133-6.3488 1.8432-9.489067 2.935466-0.7168 0.238933-1.365333 0.580267-2.048 0.8192-10.683733 3.822933-21.265067 8.0896-31.675733 12.765867-3.584 1.604267-7.0656 3.4816-10.615467 5.154133-7.099733 3.413333-14.165333 6.826667-21.0944 10.615467-4.266667 2.321067-8.3968 4.8128-12.561067 7.2704-3.822933 2.218667-7.748267 4.266667-11.502933 6.621867-0.512 0.3072-0.750933 0.8192-1.2288 1.160533-14.506667 9.147733-28.706133 18.807467-42.222933 29.559467a459.6736 459.6736 0 0 0-90.385067 96.768c-0.443733 0.546133-1.092267 0.8192-1.501867 1.4336-1.536 2.184533-2.7648 4.573867-4.266666 6.792533-1.604267 2.423467-3.447467 4.744533-5.0176 7.202133-2.56 3.9936-4.7104 8.157867-7.133867 12.219734-3.106133 5.188267-6.280533 10.376533-9.181867 15.701333-3.7888 6.929067-7.202133 13.994667-10.6496 21.0944-2.4576 5.12-5.051733 10.205867-7.338666 15.394133-3.515733 8.021333-6.519467 16.247467-9.557334 24.4736-1.672533 4.5056-3.549867 8.9088-5.051733 13.448534-4.3008 12.868267-8.0896 25.941333-11.264 39.185066-3.072 12.970667 2.594133 25.770667 13.073067 32.802134a31.3344 31.3344 0 0 0 9.966933 4.608 30.9248 30.9248 0 0 0 34.030933-15.2576 30.446933 30.446933 0 0 0 3.345067-7.7824c2.833067-11.844267 6.178133-23.483733 10.0352-34.9184 0.6144-1.8432 1.399467-3.549867 2.013867-5.358934 3.447467-9.762133 7.133867-19.456 11.332266-28.945066 0.512-1.160533 1.1264-2.2528 1.6384-3.447467 4.7104-10.308267 9.728-20.48 15.291734-30.344533l0.068266-0.1024a402.773333 402.773333 0 0 1 19.694934-31.4368l0.136533-0.375467a397.4144 397.4144 0 0 1 116.599467-111.2064c0.136533-0.1024 0.3072-0.068267 0.443733-0.170667a397.824 397.824 0 0 1 94.993067-42.973866c2.7648-0.8192 5.495467-1.7408 8.2944-2.491734 5.7344-1.604267 11.5712-3.003733 17.373866-4.334933a367.8208 367.8208 0 0 1 47.342934-7.953067c3.8912-0.443733 7.7824-0.9216 11.6736-1.2288 10.410667-0.785067 20.8896-1.3312 31.505066-1.3312s21.060267 0.546133 31.505067 1.3312c3.8912 0.3072 7.816533 0.785067 11.707733 1.2288a361.3696 361.3696 0 0 1 47.240534 7.953067c5.870933 1.3312 11.707733 2.730667 17.5104 4.334933 2.696533 0.750933 5.358933 1.6384 8.021333 2.4576 33.348267 10.103467 65.365333 24.405333 95.197867 43.008 0.136533 0.1024 0.3072 0.068267 0.443733 0.170667a396.151467 396.151467 0 0 1 116.599467 111.2064c0.1024 0.136533 0.1024 0.273067 0.170666 0.375467 13.687467 19.7632 25.3952 40.5504 35.191467 62.1568l1.467733 3.037866c4.3008 9.659733 8.055467 19.592533 11.605334 29.5936 0.546133 1.604267 1.2288 3.106133 1.774933 4.7104 3.822933 11.4688 7.236267 23.176533 10.0352 35.0208a31.061333 31.061333 0 0 0 60.450133-14.336zm-249.275733-560.2304A199.850667 199.850667 0 0 1 512 543.197867a199.850667 199.850667 0 0 1-199.5776-199.611734A199.816533 199.816533 0 0 1 512 144.008533a199.816533 199.816533 0 0 1 199.5776 199.5776z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem4.IconSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path transform="scale(0.8) translate(128,128)" d="M960.853333 903.816533a463.633067 463.633067 0 0 0-11.264-39.185066c-1.536-4.539733-3.413333-8.942933-5.051733-13.448534a484.078933 484.078933 0 0 0-9.557333-24.4736c-2.2528-5.188267-4.881067-10.274133-7.338667-15.394133-3.413333-7.099733-6.8608-14.165333-10.6496-21.0944-2.901333-5.3248-6.075733-10.513067-9.181867-15.701333-2.423467-4.061867-4.573867-8.226133-7.133866-12.219734-1.604267-2.4576-3.413333-4.778667-5.0176-7.202133-1.501867-2.218667-2.730667-4.608-4.266667-6.792533-0.4096-0.6144-1.058133-0.887467-1.501867-1.4336a461.482667 461.482667 0 0 0-90.385066-96.768c-13.5168-10.786133-27.7504-20.48-42.257067-29.5936-0.477867-0.341333-0.7168-0.8192-1.194667-1.1264-3.6864-2.286933-7.509333-4.3008-11.264-6.485334-4.266667-2.491733-8.4992-5.051733-12.868266-7.441066-6.826667-3.6864-13.789867-7.099733-20.753067-10.478934-3.618133-1.7408-7.202133-3.618133-10.8544-5.290666a449.194667 449.194667 0 0 0-31.607467-12.731734c-0.7168-0.273067-1.365333-0.6144-2.082133-0.8192-3.140267-1.1264-6.417067-1.911467-9.557333-2.935466-4.164267-1.399467-8.328533-2.833067-12.561067-4.096a259.9936 259.9936 0 0 0 129.194667-225.450667 260.061867 260.061867 0 0 0-76.629334-185.002667 259.9936 259.9936 0 0 0-185.002666-76.629333H512h-0.034133a259.857067 259.857067 0 0 0-185.002667 76.629333 259.925333 259.925333 0 0 0-76.629333 185.002667 259.584 259.584 0 0 0 76.629333 185.002667c15.906133 15.940267 33.655467 29.2864 52.565333 40.448-4.266667 1.262933-8.430933 2.730667-12.663466 4.096-3.140267 1.058133-6.3488 1.8432-9.489067 2.935466-0.7168 0.238933-1.365333 0.580267-2.048 0.8192-10.683733 3.822933-21.265067 8.0896-31.675733 12.765867-3.584 1.604267-7.0656 3.4816-10.615467 5.154133-7.099733 3.413333-14.165333 6.826667-21.0944 10.615467-4.266667 2.321067-8.3968 4.8128-12.561067 7.2704-3.822933 2.218667-7.748267 4.266667-11.502933 6.621867-0.512 0.3072-0.750933 0.8192-1.2288 1.160533-14.506667 9.147733-28.706133 18.807467-42.222933 29.559467a459.6736 459.6736 0 0 0-90.385067 96.768c-0.443733 0.546133-1.092267 0.8192-1.501867 1.4336-1.536 2.184533-2.7648 4.573867-4.266666 6.792533-1.604267 2.423467-3.447467 4.744533-5.0176 7.202133-2.56 3.9936-4.7104 8.157867-7.133867 12.219734-3.106133 5.188267-6.280533 10.376533-9.181867 15.701333-3.7888 6.929067-7.202133 13.994667-10.6496 21.0944-2.4576 5.12-5.051733 10.205867-7.338666 15.394133-3.515733 8.021333-6.519467 16.247467-9.557334 24.4736-1.672533 4.5056-3.549867 8.9088-5.051733 13.448534-4.3008 12.868267-8.0896 25.941333-11.264 39.185066-3.072 12.970667 2.594133 25.770667 13.073067 32.802134a31.3344 31.3344 0 0 0 9.966933 4.608 30.9248 30.9248 0 0 0 34.030933-15.2576 30.446933 30.446933 0 0 0 3.345067-7.7824c2.833067-11.844267 6.178133-23.483733 10.0352-34.9184 0.6144-1.8432 1.399467-3.549867 2.013867-5.358934 3.447467-9.762133 7.133867-19.456 11.332266-28.945066 0.512-1.160533 1.1264-2.2528 1.6384-3.447467 4.7104-10.308267 9.728-20.48 15.291734-30.344533l0.068266-0.1024a402.773333 402.773333 0 0 1 19.694934-31.4368l0.136533-0.375467a397.4144 397.4144 0 0 1 116.599467-111.2064c0.136533-0.1024 0.3072-0.068267 0.443733-0.170667a397.824 397.824 0 0 1 94.993067-42.973866c2.7648-0.8192 5.495467-1.7408 8.2944-2.491734 5.7344-1.604267 11.5712-3.003733 17.373866-4.334933a367.8208 367.8208 0 0 1 47.342934-7.953067c3.8912-0.443733 7.7824-0.9216 11.6736-1.2288 10.410667-0.785067 20.8896-1.3312 31.505066-1.3312s21.060267 0.546133 31.505067 1.3312c3.8912 0.3072 7.816533 0.785067 11.707733 1.2288a361.3696 361.3696 0 0 1 47.240534 7.953067c5.870933 1.3312 11.707733 2.730667 17.5104 4.334933 2.696533 0.750933 5.358933 1.6384 8.021333 2.4576 33.348267 10.103467 65.365333 24.405333 95.197867 43.008 0.136533 0.1024 0.3072 0.068267 0.443733 0.170667a396.151467 396.151467 0 0 1 116.599467 111.2064c0.1024 0.136533 0.1024 0.273067 0.170666 0.375467 13.687467 19.7632 25.3952 40.5504 35.191467 62.1568l1.467733 3.037866c4.3008 9.659733 8.055467 19.592533 11.605334 29.5936 0.546133 1.604267 1.2288 3.106133 1.774933 4.7104 3.822933 11.4688 7.236267 23.176533 10.0352 35.0208a31.061333 31.061333 0 0 0 60.450133-14.336zm-249.275733-560.2304A199.850667 199.850667 0 0 1 512 543.197867a199.850667 199.850667 0 0 1-199.5776-199.611734A199.816533 199.816533 0 0 1 512 144.008533a199.816533 199.816533 0 0 1 199.5776 199.5776z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem5.IconActiveSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M437.314 840.84l-18.967-5.795c-43.935-13.425-84.182-35.551-119.623-65.767l-15.203-12.962 11.199-16.544c17.376-25.668 17.938-59.158 1.433-85.319-14.356-22.787-39.028-36.385-66.006-36.385-4.102 0-8.229 0.328-12.267 0.974l-19.752 3.158-5.301-19.288c-8.196-29.823-12.353-59.896-12.353-89.381 0-19.675 1.863-39.491 5.694-60.582l3.652-20.105 20.349 1.862c2.343 0.214 4.726 0.323 7.081 0.323 29.007 0 55.436-15.908 68.974-41.516 14.941-28.2 11.264-62.223-9.356-86.694l-13.166-15.625L278.1 276.7c38.694-38.954 86.677-68.095 138.76-84.273l19.741-6.132 7.631 19.211c11.88 29.908 40.312 49.234 72.432 49.234 32.097 0 60.521-19.328 72.413-49.241l7.632-19.197 19.73 6.122c43.968 13.642 84.295 36.164 119.862 66.938l15.414 13.337-11.883 16.561c-18.636 25.975-19.684 60.166-2.671 87.105 14.369 22.78 39.055 36.373 66.04 36.372 4.344 0 8.71-0.366 12.978-1.087l20.143-3.403 5.176 19.762c7.539 28.792 11.362 57.566 11.362 85.522 0 21.328-2.143 43.048-6.365 64.554l-3.859 19.65-19.952-1.709a77.999 77.999 0 0 0-6.612-0.281c-28.998 0-55.44 15.917-69.009 41.542-14.47 27.405-11.311 60.816 8.063 85.095l12.496 15.661-14.222 14.111c-38.674 38.378-86.551 67.041-138.455 82.892l-18.968 5.792-7.988-18.152c-12.462-28.318-40.459-46.617-71.325-46.617-30.883 0-58.893 18.299-71.36 46.619l-7.99 18.152zm-95.455-94.18c22.324 16.82 46.59 30.174 72.469 39.881 22.445-34.023 60.731-55.125 102.336-55.125 41.59 0 79.862 21.1 102.303 55.12 32.745-12.298 63.249-30.557 89.663-53.667-19.709-35.774-20.525-79.555-1.04-116.455 19.699-37.203 56.634-61.386 98.053-64.883 1.705-12.731 2.565-25.453 2.565-38 0-18.339-1.923-37.155-5.729-56.144-42.123-0.241-80.616-21.581-103.077-57.189-22.944-36.331-25.024-81.029-6.697-118.768-22.165-16.932-46.203-30.4-71.788-40.221-8.847 14.328-20.577 26.719-34.618 36.447-20.522 14.219-44.602 21.735-69.635 21.735-25.044 0-49.131-7.516-69.657-21.734-14.042-9.727-25.773-22.116-34.618-36.441-32.551 12.503-62.856 30.935-89.106 54.196 21.198 36.233 22.547 80.974 2.407 118.987-19.71 37.285-56.808 61.499-98.402 64.875-1.45 11.713-2.161 23.035-2.161 34.255 0 19.715 2.166 39.792 6.449 59.894 41.851 0.474 80.029 21.785 102.35 57.214 22.218 35.217 24.782 78.871 7.933 116.023z" fill="#FFFFFF"/><path d="M516.664 633.864c-66.246 0-120.141-53.897-120.141-120.147 0-66.249 53.895-120.146 120.141-120.146 66.237 0 120.127 53.897 120.127 120.146 0 66.25-53.89 120.147-120.127 120.147zm0-195.641c-41.625 0-75.488 33.866-75.488 75.494s33.863 75.495 75.488 75.495c41.617 0 75.475-33.867 75.475-75.495s-33.858-75.494-75.475-75.494z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<data name="segmentedItem5.IconSvg" xml:space="preserve">
|
||||
<value><svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M437.314 840.84l-18.967-5.795c-43.935-13.425-84.182-35.551-119.623-65.767l-15.203-12.962 11.199-16.544c17.376-25.668 17.938-59.158 1.433-85.319-14.356-22.787-39.028-36.385-66.006-36.385-4.102 0-8.229 0.328-12.267 0.974l-19.752 3.158-5.301-19.288c-8.196-29.823-12.353-59.896-12.353-89.381 0-19.675 1.863-39.491 5.694-60.582l3.652-20.105 20.349 1.862c2.343 0.214 4.726 0.323 7.081 0.323 29.007 0 55.436-15.908 68.974-41.516 14.941-28.2 11.264-62.223-9.356-86.694l-13.166-15.625L278.1 276.7c38.694-38.954 86.677-68.095 138.76-84.273l19.741-6.132 7.631 19.211c11.88 29.908 40.312 49.234 72.432 49.234 32.097 0 60.521-19.328 72.413-49.241l7.632-19.197 19.73 6.122c43.968 13.642 84.295 36.164 119.862 66.938l15.414 13.337-11.883 16.561c-18.636 25.975-19.684 60.166-2.671 87.105 14.369 22.78 39.055 36.373 66.04 36.372 4.344 0 8.71-0.366 12.978-1.087l20.143-3.403 5.176 19.762c7.539 28.792 11.362 57.566 11.362 85.522 0 21.328-2.143 43.048-6.365 64.554l-3.859 19.65-19.952-1.709a77.999 77.999 0 0 0-6.612-0.281c-28.998 0-55.44 15.917-69.009 41.542-14.47 27.405-11.311 60.816 8.063 85.095l12.496 15.661-14.222 14.111c-38.674 38.378-86.551 67.041-138.455 82.892l-18.968 5.792-7.988-18.152c-12.462-28.318-40.459-46.617-71.325-46.617-30.883 0-58.893 18.299-71.36 46.619l-7.99 18.152zm-95.455-94.18c22.324 16.82 46.59 30.174 72.469 39.881 22.445-34.023 60.731-55.125 102.336-55.125 41.59 0 79.862 21.1 102.303 55.12 32.745-12.298 63.249-30.557 89.663-53.667-19.709-35.774-20.525-79.555-1.04-116.455 19.699-37.203 56.634-61.386 98.053-64.883 1.705-12.731 2.565-25.453 2.565-38 0-18.339-1.923-37.155-5.729-56.144-42.123-0.241-80.616-21.581-103.077-57.189-22.944-36.331-25.024-81.029-6.697-118.768-22.165-16.932-46.203-30.4-71.788-40.221-8.847 14.328-20.577 26.719-34.618 36.447-20.522 14.219-44.602 21.735-69.635 21.735-25.044 0-49.131-7.516-69.657-21.734-14.042-9.727-25.773-22.116-34.618-36.441-32.551 12.503-62.856 30.935-89.106 54.196 21.198 36.233 22.547 80.974 2.407 118.987-19.71 37.285-56.808 61.499-98.402 64.875-1.45 11.713-2.161 23.035-2.161 34.255 0 19.715 2.166 39.792 6.449 59.894 41.851 0.474 80.029 21.785 102.35 57.214 22.218 35.217 24.782 78.871 7.933 116.023z" fill="#FFFFFF"/><path d="M516.664 633.864c-66.246 0-120.141-53.897-120.141-120.147 0-66.249 53.895-120.146 120.141-120.146 66.237 0 120.127 53.897 120.127 120.146 0 66.25-53.89 120.147-120.127 120.147zm0-195.641c-41.625 0-75.488 33.866-75.488 75.494s33.863 75.495 75.488 75.495c41.617 0 75.475-33.867 75.475-75.495s-33.858-75.494-75.475-75.494z" fill="#FFFFFF"/></svg></value>
|
||||
</data>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
|
Reference in New Issue
Block a user