16 Commits

Author SHA1 Message Date
bb943740da 数据统计线程保护
设置删除工位失效bug
2025-04-30 09:21:06 +08:00
71bbea56a7 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-29 15:23:37 +08:00
6c1d86619e har error 和日志更新 2025-04-29 15:22:54 +08:00
1a84519874 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-28 15:38:34 +08:00
4e75b0d4da 将相机设置页面的数字框改为文本框,防止出现滚动中键数值变动的情况 2025-04-28 15:38:27 +08:00
95bc9ce3b3 提交 2025-04-28 11:30:29 +08:00
bc0ed5d574 相机格式更改 2025-04-28 09:44:35 +08:00
6a9e7e4343 更新GPU 2025-04-27 10:40:12 +08:00
f12c2f0cd9 软件ico提交 2025-04-27 10:21:45 +08:00
8e2197f46e 提交图片保存路径 2025-04-27 09:48:48 +08:00
ed53c8e5db 1.三色灯提交
2.设置重命名时带出之前名称
2025-04-27 09:26:18 +08:00
b749eb4266 提交设备状态 2025-04-25 09:03:47 +08:00
ae5c1122ed 提交 2025-04-24 16:21:10 +08:00
6973d39cad 提交bug 2025-04-24 15:45:01 +08:00
77b75050b2 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-24 09:00:57 +08:00
99226f4cb0 提交 2025-04-24 09:00:44 +08:00
32 changed files with 1990 additions and 1403 deletions

View File

@ -3,6 +3,7 @@ using System.ComponentModel;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using AntdUI; using AntdUI;
using DH.Commons.Enums; using DH.Commons.Enums;
using DVPCameraType;
using HalconDotNet; using HalconDotNet;
using OpenCvSharp; using OpenCvSharp;
@ -47,11 +48,13 @@ namespace DH.Commons.Base
// 私有字段 + 带通知的属性与DetectionLabel风格一致 // 私有字段 + 带通知的属性与DetectionLabel风格一致
private bool _isEnabled = false; private bool _isEnabled = false;
private bool _isallPicEnabled = true;//默认全画幅 private bool _isallPicEnabled = true;//默认全画幅
private bool _isRGBEnabled = true;//默认彩色
private bool _isContinueMode = false; private bool _isContinueMode = false;
private bool _isSavePicEnabled = false; private bool _isSavePicEnabled = false;
private bool _isZoomCamera = false; private bool _isZoomCamera = false;
private string _imageSaveDirectory; private string _imageSaveDirectory;
private EnumCamType _CamType; private EnumCamType _CamType;
private dvpStreamFormat _dvpstreamFormat = dvpStreamFormat.S_RGB24;
private ImageFormat _imageFormat = ImageFormat.Jpeg; private ImageFormat _imageFormat = ImageFormat.Jpeg;
private bool _isHardwareTrigger = true; private bool _isHardwareTrigger = true;
private string _serialNumber = string.Empty; private string _serialNumber = string.Empty;
@ -71,6 +74,20 @@ namespace DH.Commons.Base
public volatile int SnapshotCount = 0; public volatile int SnapshotCount = 0;
[Category("相机设置")]
[DisplayName("图像格式")]
[Description("相机采集图像格式")]
public dvpStreamFormat DvpImageFormat
{
get => _dvpstreamFormat;
set
{
if (_dvpstreamFormat == value) return;
_dvpstreamFormat = value;
OnPropertyChanged(nameof(DvpImageFormat));
}
}
[Category("采图模式")] [Category("采图模式")]
[DisplayName("连续模式")] [DisplayName("连续模式")]
[Description("是否连续模式。true连续模式采图false触发模式采图")] [Description("是否连续模式。true连续模式采图false触发模式采图")]

View File

@ -11,6 +11,9 @@ namespace DH.Commons.Base
{ {
public class GlobalConfig : NotifyProperty public class GlobalConfig : NotifyProperty
{ {
bool _EnableVibrator=false;
bool _EnableBelt = false;
int _ClearTime=0;
string _name; string _name;
private BindingList<PLCItem> _InitProcessList = new BindingList<PLCItem>(); private BindingList<PLCItem> _InitProcessList = new BindingList<PLCItem>();
private BindingList<PLCItem> _StartProcessList = new BindingList<PLCItem>(); private BindingList<PLCItem> _StartProcessList = new BindingList<PLCItem>();
@ -29,7 +32,42 @@ namespace DH.Commons.Base
} }
} }
} }
public bool EnableBelt
{
get => _EnableBelt;
set
{
if (_EnableBelt != value)
{
_EnableBelt = value;
OnPropertyChanged(nameof(EnableBelt));
}
}
}
public bool EnableVibrator
{
get => _EnableVibrator;
set
{
if (_EnableVibrator != value)
{
_EnableVibrator = value;
OnPropertyChanged(nameof(EnableVibrator));
}
}
}
public int ClearTime
{
get => _ClearTime;
set
{
if (_ClearTime != value)
{
_ClearTime = value;
OnPropertyChanged(nameof(ClearTime));
}
}
}
public BindingList<PLCItem> InitProcessList public BindingList<PLCItem> InitProcessList
{ {
get => _InitProcessList; get => _InitProcessList;

View File

@ -27,6 +27,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="DVPCameraCS64">
<HintPath>..\X64\Debug\DVPCameraCS64.dll</HintPath>
</Reference>
<Reference Include="halcondotnet"> <Reference Include="halcondotnet">
<HintPath>..\x64\Debug\halcondotnet.dll</HintPath> <HintPath>..\x64\Debug\halcondotnet.dll</HintPath>
</Reference> </Reference>

View File

@ -9,8 +9,9 @@ namespace DH.Commons.Enums
{ {
public enum EnumStatus public enum EnumStatus
{ {
, ,
, ,
,
, ,
} }

View File

@ -18,7 +18,7 @@ namespace DH.Commons.Models
/// <summary> /// <summary>
/// 当前状态 /// 当前状态
/// </summary> /// </summary>
public static EnumStatus CurrentStatus =EnumStatus.; public static EnumStatus CurrentStatus =EnumStatus.;
} }
/// <summary> /// <summary>

View File

@ -27,7 +27,7 @@ namespace DH.Devices.Camera
public bool Connected=false; public bool Connected=false;
public int m_n_dev_count = 0; public int m_n_dev_count = 0;
private DVPCamera.dvpStreamCallback ImageCallback; private DVPCamera.dvpStreamCallback ImageCallback;
public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24; // public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24;
public int m_CamCount = 0; public int m_CamCount = 0;
public Double m_dfDisplayCount = 0; public Double m_dfDisplayCount = 0;
@ -63,6 +63,8 @@ namespace DH.Devices.Camera
{ {
try try
{ {
if (CameraName == "Cam1")
Console.WriteLine("");
pCallBackFunc = new DVPCamera.dvpEventCallback(cbExceptiondelegate); pCallBackFunc = new DVPCamera.dvpEventCallback(cbExceptiondelegate);
nRet = DVPCamera.dvpOpenByUserId(CameraName, nRet = DVPCamera.dvpOpenByUserId(CameraName,
dvpOpenMode.OPEN_NORMAL, dvpOpenMode.OPEN_NORMAL,
@ -74,7 +76,7 @@ namespace DH.Devices.Camera
throw new Exception($"Create device failed:{nRet:x8}"); throw new Exception($"Create device failed:{nRet:x8}");
} }
nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)dvpStreamFormat); nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)DvpImageFormat);
if (dvpStatus.DVP_STATUS_OK != nRet) if (dvpStatus.DVP_STATUS_OK != nRet)
{ {
throw new Exception($"Set image format failed:{nRet:x8}"); throw new Exception($"Set image format failed:{nRet:x8}");
@ -156,7 +158,10 @@ namespace DH.Devices.Camera
} }
//全画幅 //全画幅
if (!IsAllPicEnabled) if (!IsAllPicEnabled)
{
SetPictureRoi((int)ROIX, (int)ROIY, (int)ROIW, (int)ROIH); SetPictureRoi((int)ROIX, (int)ROIY, (int)ROIW, (int)ROIH);
}
//// 设置 触发延迟 //// 设置 触发延迟
if (TriggerDelay > 0) if (TriggerDelay > 0)

View File

@ -85,11 +85,15 @@ namespace DH.Devices.Motion
public void NewPieces(int diskIndex, uint pieceNumber) public void NewPieces(int diskIndex, uint pieceNumber)
{ {
_taskFactory.StartNew(() => Task.Run(() =>
{ {
try {
Thread.CurrentThread.Priority = ThreadPriority.Highest; Thread.CurrentThread.Priority = ThreadPriority.Highest;
OnNewPieces?.Invoke(diskIndex, pieceNumber); OnNewPieces?.Invoke(diskIndex, pieceNumber);
}
catch (Exception ex) { /* 记录异常 */ }
}); });
} }
public void SetResetFlag(bool isReset) public void SetResetFlag(bool isReset)

View File

@ -627,11 +627,22 @@ namespace DH.Devices.PLC
public void NewPieces(int axisIndex, uint pieceNumber) public void NewPieces(int axisIndex, uint pieceNumber)
{ {
_taskFactory.StartNew(() => //_taskFactory.StartNew(() =>
//{
// Thread.CurrentThread.Priority = ThreadPriority.Highest;
// OnNewPieces?.Invoke(axisIndex, pieceNumber);
//});
Task.Run(() =>
{
try
{ {
Thread.CurrentThread.Priority = ThreadPriority.Highest; Thread.CurrentThread.Priority = ThreadPriority.Highest;
OnNewPieces?.Invoke(axisIndex, pieceNumber); OnNewPieces?.Invoke(axisIndex, pieceNumber);
}
catch (Exception ex) { /* 记录异常 */ }
}); });
} }
public async Task HeartbeatAsync1() public async Task HeartbeatAsync1()
@ -697,14 +708,14 @@ namespace DH.Devices.PLC
//while (CurrentState != DeviceState.DSClose && CurrentState != DeviceState.DSExcept && CurrentState != DeviceState.DSUninit) //while (CurrentState != DeviceState.DSClose && CurrentState != DeviceState.DSExcept && CurrentState != DeviceState.DSUninit)
while (Connected) while (Connected)
{ {
Stopwatch sw = new Stopwatch(); // Stopwatch sw = new Stopwatch();
uint tmpPieceNumber = 0; uint tmpPieceNumber = 0;
sw.Start(); // sw.Start();
// var ret = TcpNet.ReadUInt16("D1016"); // var ret = TcpNet.ReadUInt16("D1016");
var ret = TcpNet.ReadUInt32(Count); var ret = TcpNet.ReadUInt32(Count);
sw.Stop(); //sw.Stop();
if (ret.IsSuccess) if (ret.IsSuccess)
{ {
tmpPieceNumber = ret.Content; tmpPieceNumber = ret.Content;
@ -712,7 +723,7 @@ namespace DH.Devices.PLC
if (ret.IsSuccess && ret.Content > piecesCount) if (ret.IsSuccess && ret.Content > piecesCount)
{ {
sw.Start(); // sw.Start();
// Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} 板卡{station}产品入列触发{tmpPieceNumber}"); // Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} 板卡{station}产品入列触发{tmpPieceNumber}");
//LogAsync(DateTime.Now, LogLevel.Information, $"转盘{0}产品入列 {piecesCountDic[0]} size:{sum}"); //LogAsync(DateTime.Now, LogLevel.Information, $"转盘{0}产品入列 {piecesCountDic[0]} size:{sum}");
if (tmpPieceNumber != piecesCount + 1) if (tmpPieceNumber != piecesCount + 1)
@ -724,8 +735,8 @@ namespace DH.Devices.PLC
piecesCount = tmpPieceNumber; piecesCount = tmpPieceNumber;
//NewPieces(ai, piecesCountDic[station]); //NewPieces(ai, piecesCountDic[station]);
NewPieces(1, piecesCount); NewPieces(1, piecesCount);
sw.Stop(); // sw.Stop();
startTime = DateTime.Now; // startTime = DateTime.Now;
//if (idalarm) //if (idalarm)
//{ //{
// idalarm = false; // idalarm = false;
@ -760,6 +771,12 @@ namespace DH.Devices.PLC
//LogAsync(DateTime.Now, LogLevel.Information, $"停止转盘"); //LogAsync(DateTime.Now, LogLevel.Information, $"停止转盘");
//转盘使能 //转盘使能
TurnEnable(true); TurnEnable(true);
RedLight(false);
YellowLight(false);
//绿灯
GreenLight(true);
LogAsync(DateTime.Now, LogLevel.Information, $"启用心跳-状态复位-关闭定位-写入流程加载点位配置-计数清零-停止转盘-转盘使能"); LogAsync(DateTime.Now, LogLevel.Information, $"启用心跳-状态复位-关闭定位-写入流程加载点位配置-计数清零-停止转盘-转盘使能");
//开启入料监听 //开启入料监听
MonitorPieces(); MonitorPieces();
@ -822,25 +839,70 @@ namespace DH.Devices.PLC
//流程开启操作配置 //流程开启操作配置
// ProcessInitialAction(); // ProcessInitialAction();
// if (_PLC?Enabled == true) // if (_PLC?Enabled == true)
//皮带
// _PLC.Belt(true);
// LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置"); // LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置");
//计数清零
CountToZero(); bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt;
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零"); if (enableBelt == true)
{
Belt(true);
}
Thread.Sleep(1000);
bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator;
if (enableVibrator == true)
{
Vibrator(true);
}
Thread.Sleep(1000);
//转盘使能
TurnEnable(true);
//转盘启动 //转盘启动
TurnStart(true); TurnStart(true);
Thread.Sleep(1000);
//计数清零
CountToZero();
Thread.Sleep(1000);
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零");
Thread.Sleep(200);
} }
public void StopProcess() public void StopProcess()
{ {
StatusReset(); StatusReset();
VisionPos(false); VisionPos(false);
CountToZero(); CountToZero();
bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator;
if (enableVibrator == true)
{
Vibrator(true);
}
Thread.Sleep(1000);
bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt;
if (enableBelt == true)
{
Belt(false);
}
Thread.Sleep(1000);
StopProcessAction(); StopProcessAction();
TurnStart(false); TurnStart(false);
// LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接");
}
public async Task ExecuteClearDelayAsync()
{
int? clearTime = ConfigModel.GlobalList?.FirstOrDefault()?.ClearTime;
if (clearTime != null)
{
TurnClear(true);
await Task.Delay(clearTime.Value * 1000);
TurnClear(false);
}
} }
public void CloseProcess() public void CloseProcess()
{ {
@ -850,7 +912,11 @@ namespace DH.Devices.PLC
TurnStart(false); TurnStart(false);
TurnEnable(false); TurnEnable(false);
StopProcessAction(); StopProcessAction();
TurnClear(false);
OpenHeartbeat(false); OpenHeartbeat(false);
GreenLight(false);
YellowLight(false);
RedLight(true);
PLCDisConnect(); PLCDisConnect();
// LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接"); // LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接");
} }
@ -1014,6 +1080,25 @@ namespace DH.Devices.PLC
WriteBool(pLCItem.Address, b); WriteBool(pLCItem.Address, b);
Thread.Sleep(30); Thread.Sleep(30);
} }
public void Belt(bool b)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "皮带");
if (pLCItem == null)
return;
WriteBool(pLCItem.Address, b);
Thread.Sleep(30);
}
public void Vibrator(bool b)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "振动盘");
if (pLCItem == null)
return;
WriteBool(pLCItem.Address, b);
Thread.Sleep(30);
}
public void Motor(bool direction, int speed, int pos) public void Motor(bool direction, int speed, int pos)
{ {
@ -1143,7 +1228,13 @@ namespace DH.Devices.PLC
elapsedTime += checkInterval; elapsedTime += checkInterval;
} }
BarrierToZero(false);
Thread.Sleep(300);
// 检查是否不在原点,如果不在,则回原点
BarrierClockwise(false);
Thread.Sleep(300);
BarrierCounterclockwise(false);
Thread.Sleep(300);
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置 // 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
BarrierSpeed(speed); BarrierSpeed(speed);
Thread.Sleep(300); Thread.Sleep(300);

View File

@ -32,6 +32,10 @@ namespace DH.Devices.Vision
bool res = false; bool res = false;
try try
{ {
if (!Path.GetExtension(mLInit.ModelFile).Equals(".trt", StringComparison.OrdinalIgnoreCase))
{
throw new Exception("选择的模型不是trt格式");
}
Model = MLGPUEngine.InitModel(mLInit.ModelFile, 1, mLInit.Score_thre, mLInit.GPUId, 3, 8); Model = MLGPUEngine.InitModel(mLInit.ModelFile, 1, mLInit.Score_thre, mLInit.GPUId, 3, 8);
//Model = MLEngine.InitModel(mLInit.ModelFile, 1, 0.45f, 0, 3); //Model = MLEngine.InitModel(mLInit.ModelFile, 1, 0.45f, 0, 3);

View File

@ -31,6 +31,8 @@ namespace DH.Devices.Vision
public List<SimboStationMLEngineSet> SimboStationMLEngineList = new List<SimboStationMLEngineSet>(); public List<SimboStationMLEngineSet> SimboStationMLEngineList = new List<SimboStationMLEngineSet>();
public void Init() public void Init()
{
try
{ {
//InitialQueue(); //InitialQueue();
InitialHalconTools(); InitialHalconTools();
@ -40,6 +42,12 @@ namespace DH.Devices.Vision
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised; // ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
// base.Init(); // base.Init();
} }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public void Stop() public void Stop()
{ {
SimboStationMLEngineList.ToList().ForEach(sm => SimboStationMLEngineList.ToList().ForEach(sm =>
@ -291,11 +299,18 @@ namespace DH.Devices.Vision
/// 初始化深度学习工具 /// 初始化深度学习工具
/// </summary> /// </summary>
private bool InitialSimboMLEnginesAsync() private bool InitialSimboMLEnginesAsync()
{
try
{ {
//深度学习 模型加载 //深度学习 模型加载
var resultOK = MLLoadModel(); var resultOK = MLLoadModel();
return resultOK; return resultOK;
} }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary> /// <summary>
/// 深度学习 模型加载 /// 深度学习 模型加载
/// </summary> /// </summary>
@ -358,6 +373,7 @@ namespace DH.Devices.Vision
{ {
// LogAsync(DateTime.Now, LogLevel.Exception, $"异常:模型并发加载异常:{ex.GetExceptionMessage()}"); // LogAsync(DateTime.Now, LogLevel.Exception, $"异常:模型并发加载异常:{ex.GetExceptionMessage()}");
resultOK = false; resultOK = false;
throw new Exception(ex.Message);
} }
return resultOK; return resultOK;
@ -409,7 +425,7 @@ namespace DH.Devices.Vision
} }
MLInit mLInit; MLInit mLInit;
string inferenceDevice = "CPU"; string inferenceDevice = "CPU";
if (dc.IsEnableGPU) if (dc.ModelType== ModelType.GPU)
{ {
inferenceDevice = "GPU"; inferenceDevice = "GPU";
mLInit = new MLInit(dc.ModelPath, isGPU, coreInx, dc.ModelconfThreshold); mLInit = new MLInit(dc.ModelPath, isGPU, coreInx, dc.ModelconfThreshold);
@ -432,7 +448,7 @@ namespace DH.Devices.Vision
{ {
// 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 Exception($"异常是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.Message}");
} }
return mLEngineSet; return mLEngineSet;
} }

View File

@ -109,9 +109,6 @@
<Compile Include="Views\Sys\User\UserPage.cs" /> <Compile Include="Views\Sys\User\UserPage.cs" />
<Compile Include="Views\Sys\User\UserPage.Designer.cs" /> <Compile Include="Views\Sys\User\UserPage.Designer.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="favicon.ico" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AntdUI" Version="1.8.9" /> <PackageReference Include="AntdUI" Version="1.8.9" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -10,7 +10,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<ApplicationIcon>assets\favicon.ico</ApplicationIcon> <ApplicationIcon>assets\logo.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
@ -23,7 +23,8 @@
<ItemGroup> <ItemGroup>
<Content Include="assets\favicon.ico" /> <Content Include="assets\logo.ico" />
<Content Include="assets\screenshots\favicon.ico" />
<Content Include="db\config.json"> <Content Include="db\config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -94,8 +95,11 @@
<ItemGroup> <ItemGroup>
<None Include="assets\favicon.ico" />
<None Include="db\db.sqlite"> <None Include="db\db.sqlite">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<!-- 仅在首次生成时复制 -->
<Condition>!Exists('$(OutputPath)\db\db.sqlite')</Condition>
</None> </None>
</ItemGroup> </ItemGroup>

View File

@ -53,7 +53,6 @@
dgvCamreaNums = new DataGridView(); dgvCamreaNums = new DataGridView();
panelNums = new AntdUI.Panel(); panelNums = new AntdUI.Panel();
tableLayoutNums = new TableLayoutPanel(); tableLayoutNums = new TableLayoutPanel();
dgvProductNums = new DataGridView();
tableLayoutPanel3 = new TableLayoutPanel(); tableLayoutPanel3 = new TableLayoutPanel();
lblTotalTime = new Label(); lblTotalTime = new Label();
label1 = new Label(); label1 = new Label();
@ -63,6 +62,7 @@
lblOEE_Total = new Label(); lblOEE_Total = new Label();
label10 = new Label(); label10 = new Label();
label7 = new Label(); label7 = new Label();
tagMachineStatus = new AntdUI.Tag();
panel2 = new AntdUI.Panel(); panel2 = new AntdUI.Panel();
panel1 = new AntdUI.Panel(); panel1 = new AntdUI.Panel();
segmented2 = new AntdUI.Segmented(); segmented2 = new AntdUI.Segmented();
@ -94,7 +94,6 @@
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit(); ((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit();
panelNums.SuspendLayout(); panelNums.SuspendLayout();
tableLayoutNums.SuspendLayout(); tableLayoutNums.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dgvProductNums).BeginInit();
tableLayoutPanel3.SuspendLayout(); tableLayoutPanel3.SuspendLayout();
panel1.SuspendLayout(); panel1.SuspendLayout();
panel3.SuspendLayout(); panel3.SuspendLayout();
@ -145,9 +144,9 @@
// tabPage3 // tabPage3
// //
tabPage3.Controls.Add(panel7); tabPage3.Controls.Add(panel7);
tabPage3.Location = new Point(3, 28); tabPage3.Location = new Point(3, 3);
tabPage3.Name = "tabPage3"; tabPage3.Name = "tabPage3";
tabPage3.Size = new Size(574, 145); tabPage3.Size = new Size(574, 170);
tabPage3.TabIndex = 0; tabPage3.TabIndex = 0;
tabPage3.Text = "日志"; tabPage3.Text = "日志";
// //
@ -156,7 +155,7 @@
panel7.Dock = DockStyle.Fill; panel7.Dock = DockStyle.Fill;
panel7.Location = new Point(0, 0); panel7.Location = new Point(0, 0);
panel7.Name = "panel7"; panel7.Name = "panel7";
panel7.Size = new Size(574, 145); panel7.Size = new Size(574, 170);
panel7.TabIndex = 2; panel7.TabIndex = 2;
// //
// tabMain // tabMain
@ -296,8 +295,8 @@
// //
tableLayoutNums.ColumnCount = 1; tableLayoutNums.ColumnCount = 1;
tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tableLayoutNums.Controls.Add(dgvProductNums, 0, 0);
tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1); tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1);
tableLayoutNums.Controls.Add(tagMachineStatus, 0, 0);
tableLayoutNums.Dock = DockStyle.Fill; tableLayoutNums.Dock = DockStyle.Fill;
tableLayoutNums.Location = new Point(0, 0); tableLayoutNums.Location = new Point(0, 0);
tableLayoutNums.Name = "tableLayoutNums"; tableLayoutNums.Name = "tableLayoutNums";
@ -308,31 +307,6 @@
tableLayoutNums.Size = new Size(338, 101); tableLayoutNums.Size = new Size(338, 101);
tableLayoutNums.TabIndex = 8; tableLayoutNums.TabIndex = 8;
// //
// dgvProductNums
//
dgvProductNums.AllowUserToAddRows = false;
dgvProductNums.AllowUserToDeleteRows = false;
dgvProductNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgvProductNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dgvProductNums.BackgroundColor = SystemColors.Control;
dgvProductNums.BorderStyle = BorderStyle.None;
dgvProductNums.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal;
dgvProductNums.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
dgvProductNums.ColumnHeadersHeight = 4;
dgvProductNums.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dgvProductNums.ColumnHeadersVisible = false;
dgvProductNums.Dock = DockStyle.Fill;
dgvProductNums.Location = new Point(3, 10);
dgvProductNums.Margin = new Padding(3, 10, 3, 0);
dgvProductNums.MultiSelect = false;
dgvProductNums.Name = "dgvProductNums";
dgvProductNums.ReadOnly = true;
dgvProductNums.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
dgvProductNums.RowHeadersVisible = false;
dgvProductNums.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgvProductNums.Size = new Size(332, 40);
dgvProductNums.TabIndex = 10;
//
// tableLayoutPanel3 // tableLayoutPanel3
// //
tableLayoutPanel3.AutoSizeMode = AutoSizeMode.GrowAndShrink; tableLayoutPanel3.AutoSizeMode = AutoSizeMode.GrowAndShrink;
@ -447,6 +421,16 @@
label7.Text = "总计数"; label7.Text = "总计数";
label7.TextAlign = ContentAlignment.MiddleCenter; label7.TextAlign = ContentAlignment.MiddleCenter;
// //
// tagMachineStatus
//
tagMachineStatus.Font = new Font("Microsoft YaHei UI", 14.25F, FontStyle.Regular, GraphicsUnit.Point, 134);
tagMachineStatus.Location = new Point(3, 3);
tagMachineStatus.Name = "tagMachineStatus";
tagMachineStatus.Size = new Size(141, 44);
tagMachineStatus.TabIndex = 12;
tagMachineStatus.Text = "待机中";
tagMachineStatus.Type = AntdUI.TTypeMini.Primary;
//
// panel2 // panel2
// //
panel2.Location = new Point(511, 86); panel2.Location = new Point(511, 86);
@ -530,7 +514,7 @@
btnCreateBatchNO.Name = "btnCreateBatchNO"; btnCreateBatchNO.Name = "btnCreateBatchNO";
btnCreateBatchNO.Size = new Size(72, 35); btnCreateBatchNO.Size = new Size(72, 35);
btnCreateBatchNO.TabIndex = 21; btnCreateBatchNO.TabIndex = 21;
btnCreateBatchNO.Tag = "sys-load"; btnCreateBatchNO.Tag = "";
btnCreateBatchNO.Text = "生成批次"; btnCreateBatchNO.Text = "生成批次";
btnCreateBatchNO.Click += btnCreateBatchNO_Click; btnCreateBatchNO.Click += btnCreateBatchNO_Click;
// //
@ -719,7 +703,6 @@
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit(); ((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit();
panelNums.ResumeLayout(false); panelNums.ResumeLayout(false);
tableLayoutNums.ResumeLayout(false); tableLayoutNums.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dgvProductNums).EndInit();
tableLayoutPanel3.ResumeLayout(false); tableLayoutPanel3.ResumeLayout(false);
tableLayoutPanel3.PerformLayout(); tableLayoutPanel3.PerformLayout();
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
@ -778,10 +761,10 @@
// private Label label7; // private Label label7;
// private AntdUI.Panel pnlLog; // private AntdUI.Panel pnlLog;
private AntdUI.Label lbInBackend; private AntdUI.Label lbInBackend;
private DataGridView dgvProductNums;
private TableLayoutPanel tableLayoutPanel3; private TableLayoutPanel tableLayoutPanel3;
private AntdUI.Button btnCreateBatchNO; private AntdUI.Button btnCreateBatchNO;
private AntdUI.Input textBoxBatchNO; private AntdUI.Input textBoxBatchNO;
private AntdUI.Segmented segmented2; private AntdUI.Segmented segmented2;
public AntdUI.Tag tagMachineStatus;
} }
} }

View File

@ -57,132 +57,9 @@ namespace DHSoftware
public event Action<DateTime, object, string> OnUpdateResult; public event Action<DateTime, object, string> OnUpdateResult;
public event Action<DateTime, object, string> OnUpdateCamResult; public event Action<DateTime, object, string> OnUpdateCamResult;
private string _loginName;
public string LoginName
{
get { return _loginName; }
set
{
_loginName = value;
UpdateLabel();
}
}
private bool _ShowConfig;
public bool ShowConfig
{
get { return _ShowConfig; }
set
{
_ShowConfig = value;
UpdateConfig();
}
}
private bool _addscheme;
public bool Addscheme
{
get { return _addscheme; }
set
{
_addscheme = value;
UpdateScheme();
}
}
private bool _deletescheme;
public bool Deleteschememe
{
get { return _deletescheme; }
set
{
_deletescheme = value;
UpdateScheme();
}
}
private bool _loadscheme;
public bool Loadscheme
{
get { return _loadscheme; }
set
{
_loadscheme = value;
UpdateScheme();
}
}
private void UpdateScheme()
{
if (this.InvokeRequired)
{
this.Invoke(new Action(UpdateScheme));
return;
}
if (Loadscheme)
{
btnDeleteProject.Visible = true;
}
else
{
btnDeleteProject.Visible = false;
}
if (Addscheme)
{
btnAddProject.Visible = true;
}
else
{
btnAddProject.Visible = false;
}
if (Deleteschememe)
{
btnLoadProject.Visible = true;
}
else
{
btnLoadProject.Visible = false;
}
}
private void UpdateLabel()
{
if (lbName.InvokeRequired)
{
lbName.Invoke(new Action(UpdateLabel));
return;
}
lbName.Text = _loginName;
}
private void UpdateConfig()
{
if (ShowConfig)
{
if (segmented1.InvokeRequired)
{
segmented1.Invoke(new Action(UpdateConfig));
return;
}
// 恢复显示时
segmented1.Items.Insert(4, itemToHide);
}
else
{
if (segmented1.InvokeRequired)
{
segmented1.Invoke(new Action(UpdateConfig));
return;
}
segmented1.Items.Remove(itemToHide);
}
}
public List<SysPermission> ButtonPermissionList public List<SysPermission> ButtonPermissionList
{ {
set set
@ -546,14 +423,9 @@ namespace DHSoftware
#region CameraSum #region CameraSum
private void InitialCameraSumsView() private void InitialCameraSumsView()
{ {
dgvProductNums.AutoGenerateColumns = false;
dgvProductNums.DefaultCellStyle.Font = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.World);
dgvProductNums.DataSource = null;
dgvProductNums.DataSource = ProductSummaries;
this.BeginInvoke(new MethodInvoker(delegate ()
{
dgvCamreaNums.Columns.Clear(); dgvCamreaNums.Columns.Clear();
@ -606,7 +478,7 @@ namespace DHSoftware
}); });
dgvCamreaNums.AutoGenerateColumns = false; dgvCamreaNums.AutoGenerateColumns = false;
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries); dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
} })); }
#endregion #endregion
/// <summary> /// <summary>
@ -653,14 +525,16 @@ namespace DHSoftware
cam.CameraIP = cameraBase.CameraIP; cam.CameraIP = cameraBase.CameraIP;
cam.IsEnabled = cameraBase.IsEnabled; cam.IsEnabled = cameraBase.IsEnabled;
cam.IsZoomCamera = cameraBase.IsZoomCamera; cam.IsZoomCamera = cameraBase.IsZoomCamera;
cam.DvpImageFormat = cameraBase.DvpImageFormat;
cam.Exposure = cameraBase.Exposure; cam.Exposure = cameraBase.Exposure;
cam.Gain = cameraBase.Gain; cam.Gain = cameraBase.Gain;
cam.RotateImage = cameraBase.RotateImage; cam.RotateImage = cameraBase.RotateImage;
cam.IsAllPicEnabled=cameraBase.IsAllPicEnabled;
cam.ROIX= cameraBase.ROIX; cam.ROIX= cameraBase.ROIX;
cam.ROIH= cameraBase.ROIH; cam.ROIH= cameraBase.ROIH;
cam.ROIW= cameraBase.ROIW; cam.ROIW= cameraBase.ROIW;
cam.ROIY=cameraBase.ROIY; cam.ROIY=cameraBase.ROIY;
cam.ImageSaveDirectory = Path.Combine("D://Projects", cameraBase.CameraName); cam.ImageSaveDirectory = Path.Combine("D://Projects//Images", cameraBase.CameraName);
Cameras.Add(cam); Cameras.Add(cam);
if (cameraBase.IsEnabled) if (cameraBase.IsEnabled)
{ {
@ -705,6 +579,8 @@ namespace DHSoftware
} }
public void ConnectPLC() public void ConnectPLC()
{
try
{ {
if (ConfigModel.PLCBaseList.Count > 0) if (ConfigModel.PLCBaseList.Count > 0)
{ {
@ -721,7 +597,7 @@ namespace DHSoftware
PLC.Port = plcBase.Port; PLC.Port = plcBase.Port;
PLC.OnLog -= _visionEngine_OnLog; PLC.OnLog -= _visionEngine_OnLog;
PLC.OnLog += _visionEngine_OnLog; PLC.OnLog += _visionEngine_OnLog;
if(PLC.Enable) if (PLC.Enable)
{ {
PLC.PLCConnect(); PLC.PLCConnect();
Button CamLabel = new Button(); Button CamLabel = new Button();
@ -748,10 +624,18 @@ namespace DHSoftware
} }
} }
}
}
catch (Exception ex)
{
} }
} }
FrmLog frmLog; FrmLog frmLog;
public void InitModel() public void InitModel()
{
try
{ {
Dectection.Clear(); Dectection.Clear();
_cameraRelatedDetectionDict = new(); _cameraRelatedDetectionDict = new();
@ -770,9 +654,9 @@ namespace DHSoftware
detectionConfig.IsEnabled = detection.IsEnabled; detectionConfig.IsEnabled = detection.IsEnabled;
detectionConfig.ImageSaveDirectory = "D://Projects//Images"; detectionConfig.ImageSaveDirectory = "D://Projects//Images";
detectionConfig.ShowLocation.X = (i + 1) % 5 + (i + 1) / 5; // 优化后代码
// detectionConfig.ShowLocation.X = detection.ShowLocation.X; detectionConfig.ShowLocation.X = (i % 5) + 1; // X坐标从1开始每行1-5
detectionConfig.ShowLocation.Y = (i + 1) / 5 + 1; detectionConfig.ShowLocation.Y = (i / 5) + 1; // Y坐标从1开始每5个换行
// detectionConfig.ShowLocation.Y = detection.ShowLocation.Y; // detectionConfig.ShowLocation.Y = detection.ShowLocation.Y;
DetectionConfigs.Add(detectionConfig); DetectionConfigs.Add(detectionConfig);
} }
@ -813,6 +697,11 @@ namespace DHSoftware
CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine); CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine);
ctrlVisionRun.Dock = DockStyle.Fill; ctrlVisionRun.Dock = DockStyle.Fill;
tabImgDisplay.Controls.Add(ctrlVisionRun); tabImgDisplay.Controls.Add(ctrlVisionRun);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} }
@ -916,7 +805,7 @@ namespace DHSoftware
this.Invoke(new Action(() => this.Invoke(new Action(() =>
{ {
dgvProductNums.DataSource = new BindingList<ProductSummary>(ProductSummaries);
//if (dgvProductNums.Rows.Count > 0) //if (dgvProductNums.Rows.Count > 0)
//{ //{
@ -1072,6 +961,7 @@ namespace DHSoftware
private Thread _monitorThread; private Thread _monitorThread;
private void MainWindow_Load(object sender, EventArgs e) private void MainWindow_Load(object sender, EventArgs e)
{ {
//开启按钮监听 //开启按钮监听
// 启动所有监控线程 // 启动所有监控线程
StartAllMonitors(); StartAllMonitors();
@ -1083,6 +973,8 @@ namespace DHSoftware
{ {
if (_monitorThread == null || !_monitorThread.IsAlive) if (_monitorThread == null || !_monitorThread.IsAlive)
{ {
//关闭按钮自身功能(比如按按钮转盘自己启动等)
PLC.WriteBool("M40", true);
_isRunning = true; _isRunning = true;
_monitorThread = new Thread(MonitorPlcButtons); _monitorThread = new Thread(MonitorPlcButtons);
_monitorThread.IsBackground = true; // 后台线程 _monitorThread.IsBackground = true; // 后台线程
@ -1107,8 +999,7 @@ namespace DHSoftware
// 处理按钮状态变化 // 处理按钮状态变化
if (startPressed) if (startPressed)
{ {
PLC.TurnSpeed(0);
PLC.TurnStart(false);
HandleStartButton(); HandleStartButton();
} }
if (resetPressed) if (resetPressed)
@ -1124,7 +1015,7 @@ namespace DHSoftware
//EmergencyStop(null, null, null); //EmergencyStop(null, null, null);
} }
Thread.Sleep(50); // 降低 CPU 占用,根据实际调整轮询间隔 Thread.Sleep(150);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -1144,6 +1035,7 @@ namespace DHSoftware
{ {
_monitorThread.Join(1000); // 等待线程退出 _monitorThread.Join(1000); // 等待线程退出
} }
PLC.WriteBool("M40", false);
} }
private bool _isClosing = false; // 状态标志 private bool _isClosing = false; // 状态标志
@ -1171,11 +1063,13 @@ namespace DHSoftware
{ {
camera.CameraDisConnect(); camera.CameraDisConnect();
} }
StopMonitoring();
if (PLC != null) if (PLC != null)
{ {
PLC.CloseProcess(); PLC.CloseProcess();
} }
StopMonitoring();
_visionEngine.Stop();//释放模型 _visionEngine.Stop();//释放模型
CloseWindow.Instance.Close();// 关闭提示窗口 CloseWindow.Instance.Close();// 关闭提示窗口
//Application.Exit(); //Application.Exit();
@ -1264,13 +1158,59 @@ namespace DHSoftware
} }
private void HandleStartButton() private void HandleStartButton()
{
lock (_stopLock)
{
if (_isStopProcessing) return;
_isStopProcessing = true;
}
try
{
if (SystemModel.CurrentStatus == EnumStatus.)
{ {
InitialCameraSumsView(); InitialCameraSumsView();
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候..."); LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
ResetAllCameraCounts(); ResetAllCameraCounts();
//开始流程 //开始流程
StartProcess(); StartProcess();
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Success;
tagMachineStatus.Text = "运行中";
}));
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!"); LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在运行,无需启动!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!");
}
}
finally
{
lock (_stopLock)
{
_isStopProcessing = false;
}
}
} }
@ -1279,10 +1219,7 @@ namespace DHSoftware
{ {
try try
{ {
if (CurrentMachine)
{
return;
}
BatchNO = textBoxBatchNO.Text; BatchNO = textBoxBatchNO.Text;
textBoxBatchNO.ReadOnly = true; textBoxBatchNO.ReadOnly = true;
@ -1371,9 +1308,8 @@ namespace DHSoftware
//mOfflineImageTimer.Start(); //mOfflineImageTimer.Start();
#endregion #endregion
//流程执行时PLC
PLC.StartProcess();
LogAsync(DateTime.Now, LogLevel.Action, "流程启动11111111111完成");
///这里会执行完成后会造成后台线程断断续续会造成界面UI卡顿 ///这里会执行完成后会造成后台线程断断续续会造成界面UI卡顿
//var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList(); //var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList();
//if (settings != null) //if (settings != null)
@ -1417,7 +1353,8 @@ namespace DHSoftware
InitialOEEStatistic(); InitialOEEStatistic();
//流程执行时PLC
PLC.StartProcess();
CurrentMachine = true; CurrentMachine = true;
} }
catch (Exception ex) catch (Exception ex)
@ -1457,15 +1394,15 @@ namespace DHSoftware
//转盘2 的物料是不是重新覆盖之前的pDta //转盘2 的物料是不是重新覆盖之前的pDta
if (axisIndex == 1) if (axisIndex == 1)
{ {
ProductData pData = new ProductData("", pieceNumber, ProductBaseCount); ProductData pData = new ProductData(BatchNO, pieceNumber, ProductBaseCount);
_productLists[index][pieceNumber] = pData; _productLists[index][pieceNumber] = pData;
LogAsync(DateTime.Now, LogLevel.Action, $">> {axisIndex}新产品{pieceNumber}加入队列{index}----板卡计数{PieceCount}"); LogAsync(DateTime.Now, LogLevel.Action, $">> 转盘{axisIndex}新产品{pieceNumber}加入队列{index}----计数{PieceCount}");
} }
DateTime dtNow = DateTime.Now; //DateTime dtNow = DateTime.Now;
UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds); //UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds);
_ctTime = dtNow; // _ctTime = dtNow;
} }
public async Task UpdateCT(object objData, float ctTime) public async Task UpdateCT(object objData, float ctTime)
@ -1848,13 +1785,24 @@ namespace DHSoftware
} }
private void HandleStopButton() private readonly object _stopLock = new object(); // 锁对象
private bool _isStopProcessing = false; // 状态标志
private async void HandleStopButton()
{ {
if (!CurrentMachine) // 通过锁和状态标志实现双重检查
lock (_stopLock)
{ {
return; if (_isStopProcessing) return;
_isStopProcessing = true;
} }
try
{
if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备待机中,无需停止!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
textBoxBatchNO.ReadOnly = false; textBoxBatchNO.ReadOnly = false;
btnCreateBatchNO.Enabled = true; btnCreateBatchNO.Enabled = true;
@ -1862,11 +1810,64 @@ namespace DHSoftware
// Dectection.Clear(); // Dectection.Clear();
// Add the code for the "停止" button click here // Add the code for the "停止" button click here
PLC.StopProcess(); PLC.StopProcess();
CurrentMachine = false; SystemModel.CurrentStatus = EnumStatus.;
//sLDMotion.Stop(); this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Primary;
tagMachineStatus.Text = "待机中";
}));
LogAsync(DateTime.Now, LogLevel.Action, $"流程停止!");
await Task.Run(async () =>
{
await ExecuteClearDelayAsync();
});
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!");
}
}
finally
{
lock (_stopLock)
{
_isStopProcessing = false;
}
} }
//sLDMotion.Stop();
}
private async Task ExecuteClearDelayAsync()
{
LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料开始");
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Warn;
tagMachineStatus.Text = "清料中";
}));
await PLC.ExecuteClearDelayAsync();
LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料完成");
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Primary;
tagMachineStatus.Text = "待机中";
}));
}
public void CalculateOEE() public void CalculateOEE()
{ {

View File

@ -156,254 +156,7 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <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"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn
H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E
u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D
uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -412,7 +165,159 @@
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/
AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA
D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/
AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A
H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAA=
</value> </value>
</data> </data>
</root> </root>

View File

@ -67,6 +67,8 @@ namespace DHSoftware
catch (Exception ex) catch (Exception ex)
{ {
SystemModel.CurrentStatus = EnumStatus.; SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
} }
@ -99,6 +101,8 @@ namespace DHSoftware
catch (Exception ex) catch (Exception ex)
{ {
SystemModel.CurrentStatus = EnumStatus.; SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
} }
UpdateStep(80, "正在加载算法模型", true); UpdateStep(80, "正在加载算法模型", true);
@ -109,6 +113,8 @@ namespace DHSoftware
catch (Exception ex) catch (Exception ex)
{ {
SystemModel.CurrentStatus = EnumStatus.; SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
} }
UpdateStep(100, "程序初始化完成", true); UpdateStep(100, "程序初始化完成", true);

View File

@ -13,6 +13,7 @@ namespace DHSoftware.Views
InitializeComponent(); InitializeComponent();
lbTitleName.Text = TitleName; lbTitleName.Text = TitleName;
// 绑定事件 // 绑定事件
BindEventHandler(); BindEventHandler();
} }
@ -21,6 +22,12 @@ namespace DHSoftware.Views
{ {
button_ok.Click += Button_ok_Click; button_ok.Click += Button_ok_Click;
button_cancel.Click += Button_cancel_Click; button_cancel.Click += Button_cancel_Click;
Load += AddCameraControl_Load;
}
private void AddCameraControl_Load(object? sender, EventArgs e)
{
input_name.Text = CubicleName;
} }
private void Button_cancel_Click(object sender, EventArgs e) private void Button_cancel_Click(object sender, EventArgs e)

View File

@ -28,6 +28,13 @@ namespace DHSoftware.Views
{ {
button_ok.Click += Button_ok_Click; button_ok.Click += Button_ok_Click;
button_cancel.Click += Button_cancel_Click; button_cancel.Click += Button_cancel_Click;
Load += AddCubicleControl_Load;
}
private void AddCubicleControl_Load(object? sender, EventArgs e)
{
input_name.Text = CubicleName;
sltdetectionType.SelectedIndex =(int)DetectionType;
} }
private void Button_cancel_Click(object sender, EventArgs e) private void Button_cancel_Click(object sender, EventArgs e)

View File

@ -29,29 +29,30 @@
private void InitializeComponent() private void InitializeComponent()
{ {
panel3 = new AntdUI.Panel(); panel3 = new AntdUI.Panel();
btnSizeAdd = new AntdUI.Button();
button1 = new AntdUI.Button();
button2 = new AntdUI.Button();
button3 = new AntdUI.Button(); button3 = new AntdUI.Button();
button2 = new AntdUI.Button();
button1 = new AntdUI.Button();
btnSizeAdd = new AntdUI.Button();
panel4 = new AntdUI.Panel(); panel4 = new AntdUI.Panel();
pictureBox1 = new PictureBox();
panel2 = new AntdUI.Panel(); panel2 = new AntdUI.Panel();
label18 = new AntdUI.Label(); label18 = new AntdUI.Label();
swhEnable = new AntdUI.Switch(); swhEnable = new AntdUI.Switch();
label1 = new AntdUI.Label(); label1 = new AntdUI.Label();
label2 = new AntdUI.Label(); label2 = new AntdUI.Label();
label3 = new AntdUI.Label(); label3 = new AntdUI.Label();
iptExposure = new AntdUI.InputNumber(); iptExposure = new AntdUI.Input();
iptGain = new AntdUI.InputNumber(); iptGain = new AntdUI.Input();
iptRevolve = new AntdUI.Select(); iptRevolve = new AntdUI.Select();
label4 = new AntdUI.Label(); label4 = new AntdUI.Label();
sltAcquisitionMode = new AntdUI.Select(); sltAcquisitionMode = new AntdUI.Select();
label5 = new AntdUI.Label(); label5 = new AntdUI.Label();
sltTriggerMode = new AntdUI.Select(); sltTriggerMode = new AntdUI.Select();
label7 = new AntdUI.Label(); label7 = new AntdUI.Label();
iptROIX = new AntdUI.InputNumber(); iptROIX = new AntdUI.Input();
iptROIY = new AntdUI.InputNumber(); iptROIY = new AntdUI.Input();
iptROIW = new AntdUI.InputNumber(); iptROIW = new AntdUI.Input();
iptROIH = new AntdUI.InputNumber(); iptROIH = new AntdUI.Input();
label6 = new AntdUI.Label(); label6 = new AntdUI.Label();
sthPic = new AntdUI.Switch(); sthPic = new AntdUI.Switch();
label8 = new AntdUI.Label(); label8 = new AntdUI.Label();
@ -65,12 +66,13 @@
label14 = new AntdUI.Label(); label14 = new AntdUI.Label();
switch1 = new AntdUI.Switch(); switch1 = new AntdUI.Switch();
panel1 = new AntdUI.Panel(); panel1 = new AntdUI.Panel();
pictureBox1 = new PictureBox(); sltPicType = new AntdUI.Select();
label15 = new AntdUI.Label();
panel3.SuspendLayout(); panel3.SuspendLayout();
panel4.SuspendLayout(); panel4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
panel2.SuspendLayout(); panel2.SuspendLayout();
panel1.SuspendLayout(); panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// panel3 // panel3
@ -80,51 +82,12 @@
panel3.Controls.Add(button1); panel3.Controls.Add(button1);
panel3.Controls.Add(btnSizeAdd); panel3.Controls.Add(btnSizeAdd);
panel3.Dock = DockStyle.Bottom; panel3.Dock = DockStyle.Bottom;
panel3.Location = new Point(0, 552); panel3.Location = new Point(0, 585);
panel3.Name = "panel3"; panel3.Name = "panel3";
panel3.Size = new Size(691, 59); panel3.Size = new Size(691, 59);
panel3.TabIndex = 39; panel3.TabIndex = 39;
panel3.Text = "panel3"; panel3.Text = "panel3";
// //
// btnSizeAdd
//
btnSizeAdd.BorderWidth = 2F;
btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSizeAdd.Ghost = true;
btnSizeAdd.IconRatio = 0F;
btnSizeAdd.IconSvg = "";
btnSizeAdd.Location = new Point(75, 13);
btnSizeAdd.Name = "btnSizeAdd";
btnSizeAdd.Size = new Size(80, 38);
btnSizeAdd.TabIndex = 43;
btnSizeAdd.Text = "连接相机";
//
// button1
//
button1.BorderWidth = 2F;
button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button1.Ghost = true;
button1.IconRatio = 0F;
button1.IconSvg = "";
button1.Location = new Point(233, 13);
button1.Name = "button1";
button1.Size = new Size(80, 38);
button1.TabIndex = 44;
button1.Text = "断开相机";
//
// button2
//
button2.BorderWidth = 2F;
button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button2.Ghost = true;
button2.IconRatio = 0F;
button2.IconSvg = "";
button2.Location = new Point(388, 13);
button2.Name = "button2";
button2.Size = new Size(80, 38);
button2.TabIndex = 45;
button2.Text = "单次触发";
//
// button3 // button3
// //
button3.BorderWidth = 2F; button3.BorderWidth = 2F;
@ -138,16 +101,65 @@
button3.TabIndex = 46; button3.TabIndex = 46;
button3.Text = "连续触发"; button3.Text = "连续触发";
// //
// button2
//
button2.BorderWidth = 2F;
button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button2.Ghost = true;
button2.IconRatio = 0F;
button2.IconSvg = "";
button2.Location = new Point(388, 13);
button2.Name = "button2";
button2.Size = new Size(80, 38);
button2.TabIndex = 45;
button2.Text = "单次触发";
//
// button1
//
button1.BorderWidth = 2F;
button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button1.Ghost = true;
button1.IconRatio = 0F;
button1.IconSvg = "";
button1.Location = new Point(233, 13);
button1.Name = "button1";
button1.Size = new Size(80, 38);
button1.TabIndex = 44;
button1.Text = "断开相机";
//
// btnSizeAdd
//
btnSizeAdd.BorderWidth = 2F;
btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSizeAdd.Ghost = true;
btnSizeAdd.IconRatio = 0F;
btnSizeAdd.IconSvg = "";
btnSizeAdd.Location = new Point(75, 13);
btnSizeAdd.Name = "btnSizeAdd";
btnSizeAdd.Size = new Size(80, 38);
btnSizeAdd.TabIndex = 43;
btnSizeAdd.Text = "连接相机";
//
// panel4 // panel4
// //
panel4.Controls.Add(pictureBox1); panel4.Controls.Add(pictureBox1);
panel4.Dock = DockStyle.Fill; panel4.Dock = DockStyle.Fill;
panel4.Location = new Point(0, 0); panel4.Location = new Point(0, 0);
panel4.Name = "panel4"; panel4.Name = "panel4";
panel4.Size = new Size(691, 552); panel4.Size = new Size(691, 585);
panel4.TabIndex = 40; panel4.TabIndex = 40;
panel4.Text = "panel4"; panel4.Text = "panel4";
// //
// pictureBox1
//
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
pictureBox1.Dock = DockStyle.Fill;
pictureBox1.Location = new Point(0, 0);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(691, 585);
pictureBox1.TabIndex = 39;
pictureBox1.TabStop = false;
//
// panel2 // panel2
// //
panel2.Controls.Add(panel4); panel2.Controls.Add(panel4);
@ -155,7 +167,7 @@
panel2.Dock = DockStyle.Fill; panel2.Dock = DockStyle.Fill;
panel2.Location = new Point(218, 0); panel2.Location = new Point(218, 0);
panel2.Name = "panel2"; panel2.Name = "panel2";
panel2.Size = new Size(691, 611); panel2.Size = new Size(691, 644);
panel2.TabIndex = 49; panel2.TabIndex = 49;
panel2.Text = "panel2"; panel2.Text = "panel2";
// //
@ -172,7 +184,7 @@
swhEnable.CheckedText = "启用"; swhEnable.CheckedText = "启用";
swhEnable.Location = new Point(86, 9); swhEnable.Location = new Point(86, 9);
swhEnable.Name = "swhEnable"; swhEnable.Name = "swhEnable";
swhEnable.Size = new Size(94, 33); swhEnable.Size = new Size(111, 33);
swhEnable.TabIndex = 49; swhEnable.TabIndex = 49;
swhEnable.UnCheckedText = "关闭"; swhEnable.UnCheckedText = "关闭";
// //
@ -204,7 +216,7 @@
// //
iptExposure.Location = new Point(86, 136); iptExposure.Location = new Point(86, 136);
iptExposure.Name = "iptExposure"; iptExposure.Name = "iptExposure";
iptExposure.Size = new Size(94, 36); iptExposure.Size = new Size(111, 36);
iptExposure.TabIndex = 53; iptExposure.TabIndex = 53;
iptExposure.Tag = ""; iptExposure.Tag = "";
iptExposure.Text = "0"; iptExposure.Text = "0";
@ -213,7 +225,7 @@
// //
iptGain.Location = new Point(86, 179); iptGain.Location = new Point(86, 179);
iptGain.Name = "iptGain"; iptGain.Name = "iptGain";
iptGain.Size = new Size(94, 36); iptGain.Size = new Size(111, 36);
iptGain.TabIndex = 54; iptGain.TabIndex = 54;
iptGain.Text = "0"; iptGain.Text = "0";
// //
@ -223,7 +235,7 @@
iptRevolve.List = true; iptRevolve.List = true;
iptRevolve.Location = new Point(86, 222); iptRevolve.Location = new Point(86, 222);
iptRevolve.Name = "iptRevolve"; iptRevolve.Name = "iptRevolve";
iptRevolve.Size = new Size(94, 36); iptRevolve.Size = new Size(111, 36);
iptRevolve.TabIndex = 55; iptRevolve.TabIndex = 55;
// //
// label4 // label4
@ -239,7 +251,7 @@
sltAcquisitionMode.List = true; sltAcquisitionMode.List = true;
sltAcquisitionMode.Location = new Point(86, 265); sltAcquisitionMode.Location = new Point(86, 265);
sltAcquisitionMode.Name = "sltAcquisitionMode"; sltAcquisitionMode.Name = "sltAcquisitionMode";
sltAcquisitionMode.Size = new Size(94, 36); sltAcquisitionMode.Size = new Size(111, 36);
sltAcquisitionMode.TabIndex = 57; sltAcquisitionMode.TabIndex = 57;
// //
// label5 // label5
@ -255,12 +267,12 @@
sltTriggerMode.List = true; sltTriggerMode.List = true;
sltTriggerMode.Location = new Point(86, 310); sltTriggerMode.Location = new Point(86, 310);
sltTriggerMode.Name = "sltTriggerMode"; sltTriggerMode.Name = "sltTriggerMode";
sltTriggerMode.Size = new Size(94, 36); sltTriggerMode.Size = new Size(111, 36);
sltTriggerMode.TabIndex = 59; sltTriggerMode.TabIndex = 59;
// //
// label7 // label7
// //
label7.Location = new Point(3, 498); label7.Location = new Point(3, 538);
label7.Name = "label7"; label7.Name = "label7";
label7.Size = new Size(29, 23); label7.Size = new Size(29, 23);
label7.TabIndex = 60; label7.TabIndex = 60;
@ -268,34 +280,34 @@
// //
// iptROIX // iptROIX
// //
iptROIX.Location = new Point(86, 430); iptROIX.Location = new Point(86, 470);
iptROIX.Name = "iptROIX"; iptROIX.Name = "iptROIX";
iptROIX.Size = new Size(94, 37); iptROIX.Size = new Size(111, 37);
iptROIX.TabIndex = 61; iptROIX.TabIndex = 61;
iptROIX.Tag = ""; iptROIX.Tag = "";
iptROIX.Text = "0"; iptROIX.Text = "0";
// //
// iptROIY // iptROIY
// //
iptROIY.Location = new Point(86, 473); iptROIY.Location = new Point(86, 513);
iptROIY.Name = "iptROIY"; iptROIY.Name = "iptROIY";
iptROIY.Size = new Size(94, 37); iptROIY.Size = new Size(111, 37);
iptROIY.TabIndex = 62; iptROIY.TabIndex = 62;
iptROIY.Text = "0"; iptROIY.Text = "0";
// //
// iptROIW // iptROIW
// //
iptROIW.Location = new Point(86, 516); iptROIW.Location = new Point(86, 556);
iptROIW.Name = "iptROIW"; iptROIW.Name = "iptROIW";
iptROIW.Size = new Size(94, 37); iptROIW.Size = new Size(111, 37);
iptROIW.TabIndex = 63; iptROIW.TabIndex = 63;
iptROIW.Text = "0"; iptROIW.Text = "0";
// //
// iptROIH // iptROIH
// //
iptROIH.Location = new Point(86, 559); iptROIH.Location = new Point(86, 599);
iptROIH.Name = "iptROIH"; iptROIH.Name = "iptROIH";
iptROIH.Size = new Size(94, 37); iptROIH.Size = new Size(111, 37);
iptROIH.TabIndex = 64; iptROIH.TabIndex = 64;
iptROIH.Text = "0"; iptROIH.Text = "0";
// //
@ -312,13 +324,13 @@
sthPic.CheckedText = "启用"; sthPic.CheckedText = "启用";
sthPic.Location = new Point(86, 56); sthPic.Location = new Point(86, 56);
sthPic.Name = "sthPic"; sthPic.Name = "sthPic";
sthPic.Size = new Size(94, 33); sthPic.Size = new Size(111, 33);
sthPic.TabIndex = 66; sthPic.TabIndex = 66;
sthPic.UnCheckedText = "关闭"; sthPic.UnCheckedText = "关闭";
// //
// label8 // label8
// //
label8.Location = new Point(36, 430); label8.Location = new Point(36, 470);
label8.Name = "label8"; label8.Name = "label8";
label8.Size = new Size(29, 37); label8.Size = new Size(29, 37);
label8.TabIndex = 67; label8.TabIndex = 67;
@ -326,7 +338,7 @@
// //
// label9 // label9
// //
label9.Location = new Point(36, 473); label9.Location = new Point(36, 513);
label9.Name = "label9"; label9.Name = "label9";
label9.Size = new Size(29, 37); label9.Size = new Size(29, 37);
label9.TabIndex = 68; label9.TabIndex = 68;
@ -334,7 +346,7 @@
// //
// label10 // label10
// //
label10.Location = new Point(28, 516); label10.Location = new Point(28, 556);
label10.Name = "label10"; label10.Name = "label10";
label10.Size = new Size(44, 37); label10.Size = new Size(44, 37);
label10.TabIndex = 69; label10.TabIndex = 69;
@ -342,7 +354,7 @@
// //
// label11 // label11
// //
label11.Location = new Point(28, 560); label11.Location = new Point(28, 600);
label11.Name = "label11"; label11.Name = "label11";
label11.Size = new Size(44, 36); label11.Size = new Size(44, 36);
label11.TabIndex = 70; label11.TabIndex = 70;
@ -350,7 +362,7 @@
// //
// label12 // label12
// //
label12.Location = new Point(21, 362); label12.Location = new Point(21, 402);
label12.Name = "label12"; label12.Name = "label12";
label12.Size = new Size(59, 23); label12.Size = new Size(59, 23);
label12.TabIndex = 71; label12.TabIndex = 71;
@ -359,9 +371,9 @@
// sthAllPic // sthAllPic
// //
sthAllPic.CheckedText = "启用"; sthAllPic.CheckedText = "启用";
sthAllPic.Location = new Point(86, 352); sthAllPic.Location = new Point(86, 392);
sthAllPic.Name = "sthAllPic"; sthAllPic.Name = "sthAllPic";
sthAllPic.Size = new Size(94, 33); sthAllPic.Size = new Size(111, 33);
sthAllPic.TabIndex = 72; sthAllPic.TabIndex = 72;
sthAllPic.UnCheckedText = "关闭"; sthAllPic.UnCheckedText = "关闭";
// //
@ -378,12 +390,12 @@
sltCamType.List = true; sltCamType.List = true;
sltCamType.Location = new Point(86, 93); sltCamType.Location = new Point(86, 93);
sltCamType.Name = "sltCamType"; sltCamType.Name = "sltCamType";
sltCamType.Size = new Size(94, 36); sltCamType.Size = new Size(111, 36);
sltCamType.TabIndex = 74; sltCamType.TabIndex = 74;
// //
// label14 // label14
// //
label14.Location = new Point(21, 401); label14.Location = new Point(21, 441);
label14.Name = "label14"; label14.Name = "label14";
label14.Size = new Size(59, 23); label14.Size = new Size(59, 23);
label14.TabIndex = 75; label14.TabIndex = 75;
@ -392,14 +404,16 @@
// switch1 // switch1
// //
switch1.CheckedText = "启用"; switch1.CheckedText = "启用";
switch1.Location = new Point(86, 391); switch1.Location = new Point(86, 431);
switch1.Name = "switch1"; switch1.Name = "switch1";
switch1.Size = new Size(94, 33); switch1.Size = new Size(111, 33);
switch1.TabIndex = 76; switch1.TabIndex = 76;
switch1.UnCheckedText = "关闭"; switch1.UnCheckedText = "关闭";
// //
// panel1 // panel1
// //
panel1.Controls.Add(sltPicType);
panel1.Controls.Add(label15);
panel1.Controls.Add(switch1); panel1.Controls.Add(switch1);
panel1.Controls.Add(label14); panel1.Controls.Add(label14);
panel1.Controls.Add(sltCamType); panel1.Controls.Add(sltCamType);
@ -432,19 +446,25 @@
panel1.Dock = DockStyle.Left; panel1.Dock = DockStyle.Left;
panel1.Location = new Point(0, 0); panel1.Location = new Point(0, 0);
panel1.Name = "panel1"; panel1.Name = "panel1";
panel1.Size = new Size(218, 611); panel1.Size = new Size(218, 644);
panel1.TabIndex = 48; panel1.TabIndex = 48;
panel1.Text = "panel1"; panel1.Text = "panel1";
// //
// pictureBox1 // sltPicType
// //
pictureBox1.BorderStyle = BorderStyle.FixedSingle; sltPicType.List = true;
pictureBox1.Dock = DockStyle.Fill; sltPicType.Location = new Point(86, 352);
pictureBox1.Location = new Point(0, 0); sltPicType.Name = "sltPicType";
pictureBox1.Name = "pictureBox1"; sltPicType.Size = new Size(111, 36);
pictureBox1.Size = new Size(691, 552); sltPicType.TabIndex = 78;
pictureBox1.TabIndex = 39; //
pictureBox1.TabStop = false; // label15
//
label15.Location = new Point(21, 352);
label15.Name = "label15";
label15.Size = new Size(59, 36);
label15.TabIndex = 77;
label15.Text = "图片格式";
// //
// CameraControl // CameraControl
// //
@ -453,12 +473,12 @@
Controls.Add(panel2); Controls.Add(panel2);
Controls.Add(panel1); Controls.Add(panel1);
Name = "CameraControl"; Name = "CameraControl";
Size = new Size(909, 611); Size = new Size(909, 644);
panel3.ResumeLayout(false); panel3.ResumeLayout(false);
panel4.ResumeLayout(false); panel4.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
panel2.ResumeLayout(false); panel2.ResumeLayout(false);
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
ResumeLayout(false); ResumeLayout(false);
} }
@ -477,18 +497,18 @@
private AntdUI.Label label1; private AntdUI.Label label1;
private AntdUI.Label label2; private AntdUI.Label label2;
private AntdUI.Label label3; private AntdUI.Label label3;
private AntdUI.InputNumber iptExposure; private AntdUI.Input iptExposure;
private AntdUI.InputNumber iptGain; private AntdUI.Input iptGain;
private AntdUI.Select iptRevolve; private AntdUI.Select iptRevolve;
private AntdUI.Label label4; private AntdUI.Label label4;
private AntdUI.Select sltAcquisitionMode; private AntdUI.Select sltAcquisitionMode;
private AntdUI.Label label5; private AntdUI.Label label5;
private AntdUI.Select sltTriggerMode; private AntdUI.Select sltTriggerMode;
private AntdUI.Label label7; private AntdUI.Label label7;
private AntdUI.InputNumber iptROIX; private AntdUI.Input iptROIX;
private AntdUI.InputNumber iptROIY; private AntdUI.Input iptROIY;
private AntdUI.InputNumber iptROIW; private AntdUI.Input iptROIW;
private AntdUI.InputNumber iptROIH; private AntdUI.Input iptROIH;
private AntdUI.Label label6; private AntdUI.Label label6;
private AntdUI.Switch sthPic; private AntdUI.Switch sthPic;
private AntdUI.Label label8; private AntdUI.Label label8;
@ -502,5 +522,7 @@
private AntdUI.Label label14; private AntdUI.Label label14;
private AntdUI.Switch switch1; private AntdUI.Switch switch1;
private AntdUI.Panel panel1; private AntdUI.Panel panel1;
private AntdUI.Select sltPicType;
private AntdUI.Label label15;
} }
} }

View File

@ -10,6 +10,7 @@ using System.Windows.Forms;
using AntdUI; using AntdUI;
using DH.Commons.Base; using DH.Commons.Base;
using DH.Commons.Enums; using DH.Commons.Enums;
using DVPCameraType;
using static System.Windows.Forms.VisualStyles.VisualStyleElement; using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using Window = AntdUI.Window; using Window = AntdUI.Window;
@ -26,9 +27,36 @@ namespace DHSoftware.Views
InitializeComponent(); InitializeComponent();
sltCamType.TextChanged += SltCamTpye_TextChanged; sltCamType.TextChanged += SltCamTpye_TextChanged;
sltPicType.TextChanged += SltPicTpye_TextChanged;
InitData(); InitData();
BindData(); BindData();
} }
private void SltPicTpye_TextChanged(object? sender, EventArgs e)
{
if (sender is Select slt && !string.IsNullOrEmpty(slt.Text))
{
// 将文本转换为枚举值
if (Enum.TryParse<dvpStreamFormat>(slt.Text, out var plcType))
{
switch (plcType)
{
case dvpStreamFormat.S_RGB24:
case dvpStreamFormat.S_MONO8:
break;
default:
break;
}
}
else
{
}
}
}
private void SltCamTpye_TextChanged(object? sender, EventArgs e) private void SltCamTpye_TextChanged(object? sender, EventArgs e)
{ {
if (sender is Select slt && !string.IsNullOrEmpty(slt.Text)) if (sender is Select slt && !string.IsNullOrEmpty(slt.Text))
@ -77,6 +105,7 @@ namespace DHSoftware.Views
{ {
sltCamType.DataBindings.Add("Text", CameraBase, "CamType", true, DataSourceUpdateMode.OnPropertyChanged, ""); sltCamType.DataBindings.Add("Text", CameraBase, "CamType", true, DataSourceUpdateMode.OnPropertyChanged, "");
sltPicType.DataBindings.Add("Text", CameraBase, "DvpImageFormat", true, DataSourceUpdateMode.OnPropertyChanged, "");
sthPic.DataBindings.Add(nameof(sthPic.Checked), CameraBase, nameof(CameraBase.IsSavePicEnabled), sthPic.DataBindings.Add(nameof(sthPic.Checked), CameraBase, nameof(CameraBase.IsSavePicEnabled),
true, DataSourceUpdateMode.OnPropertyChanged); true, DataSourceUpdateMode.OnPropertyChanged);
sthAllPic.DataBindings.Add(nameof(sthAllPic.Checked), CameraBase, nameof(CameraBase.IsAllPicEnabled), sthAllPic.DataBindings.Add(nameof(sthAllPic.Checked), CameraBase, nameof(CameraBase.IsAllPicEnabled),
@ -87,22 +116,20 @@ namespace DHSoftware.Views
switch1.DataBindings.Add(nameof(switch1.Checked), CameraBase, nameof(CameraBase.IsZoomCamera), switch1.DataBindings.Add(nameof(switch1.Checked), CameraBase, nameof(CameraBase.IsZoomCamera),
true, DataSourceUpdateMode.OnPropertyChanged); true, DataSourceUpdateMode.OnPropertyChanged);
// 曝光时间绑定假设iptExposure是NumericUpDown // 曝光时间绑定假设iptExposure是NumericUpDown
iptExposure.DataBindings.Add(nameof(iptExposure.Value), CameraBase, nameof(CameraBase.Exposure),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
iptExposure.DataBindings.Add(nameof(iptExposure.Text), CameraBase, nameof(CameraBase.Exposure));
// 增益绑定 // 增益绑定
iptGain.DataBindings.Add(nameof(iptGain.Value), CameraBase, nameof(CameraBase.Gain),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
iptGain.DataBindings.Add(nameof(iptGain.Text), CameraBase, nameof(CameraBase.Gain));
// 旋转角度绑定 // 旋转角度绑定
iptRevolve.DataBindings.Add(nameof(iptRevolve.Text), CameraBase, nameof(CameraBase.RotateImage), iptRevolve.DataBindings.Add(nameof(iptRevolve.Text), CameraBase, nameof(CameraBase.RotateImage));
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
// ROI坐标绑定 // ROI坐标绑定
iptROIX.DataBindings.Add(nameof(iptROIX.Value), CameraBase, nameof(CameraBase.ROIX)); iptROIX.DataBindings.Add(nameof(iptROIX.Text), CameraBase, nameof(CameraBase.ROIX));
iptROIY.DataBindings.Add(nameof(iptROIY.Value), CameraBase, nameof(CameraBase.ROIY)); iptROIY.DataBindings.Add(nameof(iptROIY.Text), CameraBase, nameof(CameraBase.ROIY));
iptROIW.DataBindings.Add(nameof(iptROIW.Value), CameraBase, nameof(CameraBase.ROIW)); iptROIW.DataBindings.Add(nameof(iptROIW.Text), CameraBase, nameof(CameraBase.ROIW));
iptROIH.DataBindings.Add(nameof(iptROIH.Value), CameraBase, nameof(CameraBase.ROIH)); iptROIH.DataBindings.Add(nameof(iptROIH.Text), CameraBase, nameof(CameraBase.ROIH));
// 采集模式下拉框处理 // 采集模式下拉框处理
sltAcquisitionMode.SelectedIndexChanged += (s, e) => sltAcquisitionMode.SelectedIndexChanged += (s, e) =>
@ -126,10 +153,16 @@ namespace DHSoftware.Views
{ {
sltCamType.Items.Add(value.ToString()); sltCamType.Items.Add(value.ToString());
} }
sltPicType.Items.Clear();
foreach (dvpStreamFormat value in Enum.GetValues(typeof(dvpStreamFormat)))
{
sltPicType.Items.Add(value.ToString());
}
// 初始化下拉框选项 // 初始化下拉框选项
sltAcquisitionMode.Items.AddRange(new[] { "连续模式", "触发模式" }); sltAcquisitionMode.Items.AddRange(new[] { "连续模式", "触发模式" });
sltTriggerMode.Items.AddRange(new[] { "软触发", "硬触发" }); sltTriggerMode.Items.AddRange(new[] { "软触发", "硬触发" });
// 设置初始选择 // 设置初始选择
sltAcquisitionMode.SelectedIndex = CameraBase.IsContinueMode ? 0 : 1; sltAcquisitionMode.SelectedIndex = CameraBase.IsContinueMode ? 0 : 1;
sltTriggerMode.SelectedIndex = CameraBase.IsHardwareTrigger ? 1 : 0; sltTriggerMode.SelectedIndex = CameraBase.IsHardwareTrigger ? 1 : 0;

View File

@ -55,7 +55,7 @@
this.tsmiClearLog.Name = "tsmiClearLog"; this.tsmiClearLog.Name = "tsmiClearLog";
this.tsmiClearLog.Size = new System.Drawing.Size(124, 22); this.tsmiClearLog.Size = new System.Drawing.Size(124, 22);
this.tsmiClearLog.Text = "清空日志"; this.tsmiClearLog.Text = "清空日志";
this.tsmiClearLog.Click += new System.EventHandler(this.tsmiClearLog_Click); // this.tsmiClearLog.Click += new System.EventHandler(this.tsmiClearLog_Click);
// //
// menuStrip1 // menuStrip1
// //

View File

@ -30,8 +30,11 @@ namespace DHSoftware.Views
#region #region
private const string SOURCE_PROCESS = "流程"; private const string SOURCE_PROCESS = "流程";
private const int LOG_NUM_LIMIT = 2000; private const int LOG_NUM_LIMIT = 2000;
private const int BATCH_SIZE = 50; // private const int BATCH_SIZE = 50;
private const int PROCESS_INTERVAL = 100; // 调整常量配置
private const int BATCH_SIZE = 100; // 从50提升到100
private const int PROCESS_INTERVAL = 200; // 从100ms调整到200ms
// private const int PROCESS_INTERVAL = 100;
private const int FIRST_COL_WIDTH = 120; private const int FIRST_COL_WIDTH = 120;
#endregion #endregion

View File

@ -28,7 +28,7 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine(); AntdUI.Tabs.StyleLine styleLine2 = new AntdUI.Tabs.StyleLine();
tabs1 = new AntdUI.Tabs(); tabs1 = new AntdUI.Tabs();
tabPage6 = new AntdUI.TabPage(); tabPage6 = new AntdUI.TabPage();
tabPage1 = new AntdUI.TabPage(); tabPage1 = new AntdUI.TabPage();
@ -56,7 +56,16 @@
panel5 = new AntdUI.Panel(); panel5 = new AntdUI.Panel();
btnStopResetDelete = new AntdUI.Button(); btnStopResetDelete = new AntdUI.Button();
btnStopResetAdd = new AntdUI.Button(); btnStopResetAdd = new AntdUI.Button();
panel6 = new AntdUI.Panel();
panel7 = new AntdUI.Panel();
uiLabel1 = new Sunny.UI.UILabel();
swhEnableVibrator = new AntdUI.Switch();
swhEnableBelt = new AntdUI.Switch();
uiLabel2 = new Sunny.UI.UILabel();
uiLabel3 = new Sunny.UI.UILabel();
iptClearTime = new AntdUI.Input();
tabs1.SuspendLayout(); tabs1.SuspendLayout();
tabPage6.SuspendLayout();
tabPage1.SuspendLayout(); tabPage1.SuspendLayout();
panel1.SuspendLayout(); panel1.SuspendLayout();
tabPage2.SuspendLayout(); tabPage2.SuspendLayout();
@ -67,6 +76,7 @@
panel4.SuspendLayout(); panel4.SuspendLayout();
tabPage5.SuspendLayout(); tabPage5.SuspendLayout();
panel5.SuspendLayout(); panel5.SuspendLayout();
panel6.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
// tabs1 // tabs1
@ -81,13 +91,14 @@
tabs1.Pages.Add(tabPage4); tabs1.Pages.Add(tabPage4);
tabs1.Pages.Add(tabPage5); tabs1.Pages.Add(tabPage5);
tabs1.Size = new Size(898, 530); tabs1.Size = new Size(898, 530);
tabs1.Style = styleLine1; tabs1.Style = styleLine2;
tabs1.TabIndex = 26; tabs1.TabIndex = 26;
tabs1.Text = "tabs1"; tabs1.Text = "tabs1";
tabs1.SelectedIndex = 1;
// //
// tabPage6 // tabPage6
// //
tabPage6.Controls.Add(panel7);
tabPage6.Controls.Add(panel6);
tabPage6.Location = new Point(3, 28); tabPage6.Location = new Point(3, 28);
tabPage6.Name = "tabPage6"; tabPage6.Name = "tabPage6";
tabPage6.Size = new Size(892, 499); tabPage6.Size = new Size(892, 499);
@ -372,6 +383,86 @@
btnStopResetAdd.Type = AntdUI.TTypeMini.Primary; btnStopResetAdd.Type = AntdUI.TTypeMini.Primary;
btnStopResetAdd.WaveSize = 0; btnStopResetAdd.WaveSize = 0;
// //
// panel6
//
panel6.Controls.Add(iptClearTime);
panel6.Controls.Add(uiLabel3);
panel6.Controls.Add(swhEnableBelt);
panel6.Controls.Add(uiLabel2);
panel6.Controls.Add(swhEnableVibrator);
panel6.Controls.Add(uiLabel1);
panel6.Dock = DockStyle.Left;
panel6.Location = new Point(0, 0);
panel6.Name = "panel6";
panel6.Size = new Size(427, 499);
panel6.TabIndex = 0;
panel6.Text = "panel6";
//
// panel7
//
panel7.Dock = DockStyle.Fill;
panel7.Location = new Point(427, 0);
panel7.Name = "panel7";
panel7.Size = new Size(465, 499);
panel7.TabIndex = 1;
panel7.Text = "panel7";
//
// uiLabel1
//
uiLabel1.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel1.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel1.Location = new Point(28, 36);
uiLabel1.Name = "uiLabel1";
uiLabel1.Size = new Size(63, 23);
uiLabel1.TabIndex = 0;
uiLabel1.Text = "振动盘";
//
// swhEnableVibrator
//
swhEnableVibrator.CheckedText = "启用";
swhEnableVibrator.Location = new Point(97, 26);
swhEnableVibrator.Name = "swhEnableVibrator";
swhEnableVibrator.Size = new Size(94, 33);
swhEnableVibrator.TabIndex = 50;
swhEnableVibrator.UnCheckedText = "关闭";
//
// swhEnableBelt
//
swhEnableBelt.CheckedText = "启用";
swhEnableBelt.Location = new Point(97, 82);
swhEnableBelt.Name = "swhEnableBelt";
swhEnableBelt.Size = new Size(94, 33);
swhEnableBelt.TabIndex = 52;
swhEnableBelt.UnCheckedText = "关闭";
//
// uiLabel2
//
uiLabel2.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel2.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel2.Location = new Point(28, 92);
uiLabel2.Name = "uiLabel2";
uiLabel2.Size = new Size(63, 23);
uiLabel2.TabIndex = 51;
uiLabel2.Text = "皮带";
//
// uiLabel3
//
uiLabel3.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel3.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel3.Location = new Point(17, 142);
uiLabel3.Name = "uiLabel3";
uiLabel3.Size = new Size(74, 23);
uiLabel3.TabIndex = 53;
uiLabel3.Text = "清料时间";
//
// iptClearTime
//
iptClearTime.Location = new Point(97, 131);
iptClearTime.Name = "iptClearTime";
iptClearTime.Size = new Size(94, 43);
iptClearTime.TabIndex = 54;
iptClearTime.Text = "0";
//
// GlobalControl // GlobalControl
// //
AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleDimensions = new SizeF(7F, 17F);
@ -380,6 +471,7 @@
Name = "GlobalControl"; Name = "GlobalControl";
Size = new Size(898, 530); Size = new Size(898, 530);
tabs1.ResumeLayout(false); tabs1.ResumeLayout(false);
tabPage6.ResumeLayout(false);
tabPage1.ResumeLayout(false); tabPage1.ResumeLayout(false);
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
tabPage2.ResumeLayout(false); tabPage2.ResumeLayout(false);
@ -390,6 +482,7 @@
panel4.ResumeLayout(false); panel4.ResumeLayout(false);
tabPage5.ResumeLayout(false); tabPage5.ResumeLayout(false);
panel5.ResumeLayout(false); panel5.ResumeLayout(false);
panel6.ResumeLayout(false);
ResumeLayout(false); ResumeLayout(false);
} }
@ -421,5 +514,13 @@
private AntdUI.Button btnAdd; private AntdUI.Button btnAdd;
private AntdUI.Button btnDelete; private AntdUI.Button btnDelete;
private AntdUI.TabPage tabPage6; private AntdUI.TabPage tabPage6;
private AntdUI.Panel panel7;
private AntdUI.Panel panel6;
private Sunny.UI.UILabel uiLabel1;
private AntdUI.Switch swhEnableBelt;
private Sunny.UI.UILabel uiLabel2;
private AntdUI.Switch swhEnableVibrator;
private Sunny.UI.UILabel uiLabel3;
private AntdUI.Input iptClearTime;
} }
} }

View File

@ -691,7 +691,10 @@ namespace DHSoftware.Views
private void InitData() private void InitData()
{ {
// 启用状态绑定
swhEnableVibrator.DataBindings.Add("Checked", global, "EnableVibrator", true, DataSourceUpdateMode.OnPropertyChanged);
swhEnableBelt.DataBindings.Add("Checked", global, "EnableBelt", true, DataSourceUpdateMode.OnPropertyChanged);
iptClearTime.DataBindings.Add("Text", global, "ClearTime", true, DataSourceUpdateMode.OnPropertyChanged);
TableInitProcess.Columns = new ColumnCollection() { TableInitProcess.Columns = new ColumnCollection() {
new ColumnCheck("Selected"){Fixed = true}, new ColumnCheck("Selected"){Fixed = true},

View File

@ -7,6 +7,7 @@ using DH.Commons.Base;
using DH.RBAC.Model.Sys; using DH.RBAC.Model.Sys;
using System.Reflection; using System.Reflection;
using ScrollBar = AntdUI.ScrollBar; using ScrollBar = AntdUI.ScrollBar;
using DH.Commons.Enums;
namespace DHSoftware.Views namespace DHSoftware.Views
{ {
@ -59,6 +60,19 @@ namespace DHSoftware.Views
switch (clickedItem.PARENTITEM.Text) switch (clickedItem.PARENTITEM.Text)
{ {
case "相机设置": case "相机设置":
bool b = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-cameraset")
{
b = true;
break;
}
}
}
if (!b) { AntdUI.Message.warn(this, $"对不起,无权限访问相机设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -99,6 +113,19 @@ namespace DHSoftware.Views
break; break;
case "工位设置": case "工位设置":
bool b1 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-stationset")
{
b1 = true;
break;
}
}
}
if (!b1) { AntdUI.Message.warn(this, $"对不起,无权限访问工位设置!", autoClose: 3); return; }
// 检查是否已存在同名 TabPage // 检查是否已存在同名 TabPage
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
@ -146,6 +173,19 @@ namespace DHSoftware.Views
break; break;
case "运控设置": case "运控设置":
bool b2 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-motionset")
{
b2 = true;
break;
}
}
}
if (!b2) { AntdUI.Message.warn(this, $"对不起,无权限访问运控设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -185,6 +225,19 @@ namespace DHSoftware.Views
} }
break; break;
case "其他设置": case "其他设置":
bool b3 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-globalset")
{
b3 = true;
break;
}
}
}
if (!b3) { AntdUI.Message.warn(this, $"对不起,无权限访问其他设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -329,15 +382,30 @@ namespace DHSoftware.Views
} }
return null; return null;
} }
private List<SysPermission> _buttonPermissionList = new List<SysPermission>();
private readonly object _permissionLock = new object();
/// <summary>
/// 按钮权限列表(线程安全)
/// </summary>
public List<SysPermission> ButtonPermissionList public List<SysPermission> ButtonPermissionList
{ {
get
{
lock (_permissionLock)
{
return new List<SysPermission>(_buttonPermissionList); // 返回副本避免外部修改
}
}
set set
{ {
List<SysPermission> list = value; lock (_permissionLock)
SetPermission(list, this.Controls); {
_buttonPermissionList = value ?? new List<SysPermission>();
SetPermission(_buttonPermissionList, this.Controls); // 应用权限到控件
}
} }
} }
private void SetPermission(List<SysPermission> list, Control.ControlCollection controls) private void SetPermission(List<SysPermission> list, Control.ControlCollection controls)
{ {
foreach (Control control in controls) foreach (Control control in controls)
@ -453,7 +521,19 @@ namespace DHSoftware.Views
{ {
if (e.Button == MouseButtons.Right) if (e.Button == MouseButtons.Right)
{ {
bool b = false;
if (ButtonPermissionList.Count > 0)
{
foreach(var item in ButtonPermissionList)
{
if (item.EnCode == "sys-setright")
{
b= true;
break;
}
}
}
if (!b) { return; }
var menu = sender as Menu; var menu = sender as Menu;
if (menu == null) return; if (menu == null) return;
@ -491,6 +571,7 @@ namespace DHSoftware.Views
if (result == DialogResult.OK) if (result == DialogResult.OK)
{ {
menu1.Remove(clickedItem); menu1.Remove(clickedItem);
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -503,7 +584,7 @@ namespace DHSoftware.Views
return; return;
} }
} }
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
} }
break; break;
@ -515,7 +596,8 @@ namespace DHSoftware.Views
{ {
Size = new Size(300, 200), Size = new Size(300, 200),
// 传递当前名称到表单 // 传递当前名称到表单
CubicleName = originalName CubicleName = originalName,
}; };
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
@ -577,6 +659,7 @@ namespace DHSoftware.Views
if (result == DialogResult.OK) if (result == DialogResult.OK)
{ {
menu1.Remove(clickedItem); menu1.Remove(clickedItem);
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -595,12 +678,14 @@ namespace DHSoftware.Views
case "重命名": case "重命名":
// 保存原始名称用于查找 // 保存原始名称用于查找
string originalName = clickedItem.Text; string originalName = clickedItem.Text;
EnumDetectionType enumDetectionType= ConfigModel.DetectionList.FirstOrDefault(c =>
c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase)).DetectionType;
var form = new AddCubicleControl(this, "重命名工位操作") var form = new AddCubicleControl(this, "重命名工位操作")
{ {
Size = new Size(300, 500), Size = new Size(300, 500),
// 传递当前名称到表单 // 传递当前名称到表单
CubicleName = originalName CubicleName = originalName,
DetectionType = enumDetectionType
}; };
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
@ -624,6 +709,7 @@ namespace DHSoftware.Views
var detection = ConfigModel.DetectionList.FirstOrDefault(c => var detection = ConfigModel.DetectionList.FirstOrDefault(c =>
c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase)); c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase));
detection.Name = newName; detection.Name = newName;
detection.DetectionType = form.DetectionType;
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}")

View File

@ -62,10 +62,19 @@
btnMotorForward = new AntdUI.Button(); btnMotorForward = new AntdUI.Button();
iptMotorSpeed = new AntdUI.InputNumber(); iptMotorSpeed = new AntdUI.InputNumber();
label8 = new AntdUI.Label(); label8 = new AntdUI.Label();
panel3 = new AntdUI.Panel();
btnSaveBarrierPos = new AntdUI.Button();
iptBarrierPos = new AntdUI.InputNumber();
label10 = new AntdUI.Label();
btnBarrierZero = new AntdUI.Button();
btnBarrier = new AntdUI.Button();
iptBarrierSpeed = new AntdUI.InputNumber();
label11 = new AntdUI.Label();
imageViewerControl1 = new ImageViewerControl(); imageViewerControl1 = new ImageViewerControl();
panel1.SuspendLayout(); panel1.SuspendLayout();
panel2.SuspendLayout(); panel2.SuspendLayout();
panelMotor.SuspendLayout(); panelMotor.SuspendLayout();
panel3.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
// titlebar // titlebar
@ -77,12 +86,11 @@
titlebar.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); titlebar.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
titlebar.ForeColor = Color.White; titlebar.ForeColor = Color.White;
titlebar.Location = new Point(0, 0); titlebar.Location = new Point(0, 0);
titlebar.Margin = new Padding(4, 4, 4, 4);
titlebar.Mode = AntdUI.TAMode.Dark; titlebar.Mode = AntdUI.TAMode.Dark;
titlebar.Name = "titlebar"; titlebar.Name = "titlebar";
titlebar.ShowButton = true; titlebar.ShowButton = true;
titlebar.ShowIcon = true; titlebar.ShowIcon = true;
titlebar.Size = new Size(1551, 44); titlebar.Size = new Size(1210, 37);
titlebar.SubText = "视觉定位系统"; titlebar.SubText = "视觉定位系统";
titlebar.TabIndex = 1; titlebar.TabIndex = 1;
titlebar.Text = "山东迭慧智能科技有限公司"; titlebar.Text = "山东迭慧智能科技有限公司";
@ -100,39 +108,35 @@
panel1.Controls.Add(sltCameraName); panel1.Controls.Add(sltCameraName);
panel1.Controls.Add(label1); panel1.Controls.Add(label1);
panel1.Dock = DockStyle.Top; panel1.Dock = DockStyle.Top;
panel1.Location = new Point(0, 44); panel1.Location = new Point(0, 37);
panel1.Margin = new Padding(4, 4, 4, 4);
panel1.Name = "panel1"; panel1.Name = "panel1";
panel1.Size = new Size(1551, 66); panel1.Size = new Size(1210, 56);
panel1.TabIndex = 2; panel1.TabIndex = 2;
panel1.Text = "panel1"; panel1.Text = "panel1";
// //
// iptThreshold // iptThreshold
// //
iptThreshold.Location = new Point(1407, 7); iptThreshold.Location = new Point(1094, 6);
iptThreshold.Margin = new Padding(4, 4, 4, 4);
iptThreshold.Name = "iptThreshold"; iptThreshold.Name = "iptThreshold";
iptThreshold.Size = new Size(138, 51); iptThreshold.Size = new Size(107, 43);
iptThreshold.TabIndex = 15; iptThreshold.TabIndex = 15;
iptThreshold.Text = "0"; iptThreshold.Text = "0";
// //
// label6 // label6
// //
label6.BackColor = SystemColors.Window; label6.BackColor = SystemColors.Window;
label6.Location = new Point(1342, 21); label6.Location = new Point(1044, 18);
label6.Margin = new Padding(4, 4, 4, 4);
label6.Name = "label6"; label6.Name = "label6";
label6.Size = new Size(73, 27); label6.Size = new Size(57, 23);
label6.TabIndex = 14; label6.TabIndex = 14;
label6.Text = "定位阈值"; label6.Text = "定位阈值";
// //
// btnSelectBackImg // btnSelectBackImg
// //
btnSelectBackImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSelectBackImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSelectBackImg.Location = new Point(1238, 13); btnSelectBackImg.Location = new Point(963, 11);
btnSelectBackImg.Margin = new Padding(4, 4, 4, 4);
btnSelectBackImg.Name = "btnSelectBackImg"; btnSelectBackImg.Name = "btnSelectBackImg";
btnSelectBackImg.Size = new Size(96, 45); btnSelectBackImg.Size = new Size(75, 38);
btnSelectBackImg.TabIndex = 13; btnSelectBackImg.TabIndex = 13;
btnSelectBackImg.Text = "打开"; btnSelectBackImg.Text = "打开";
btnSelectBackImg.Type = AntdUI.TTypeMini.Primary; btnSelectBackImg.Type = AntdUI.TTypeMini.Primary;
@ -140,70 +144,63 @@
// btnSelectModel // btnSelectModel
// //
btnSelectModel.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSelectModel.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSelectModel.Location = new Point(675, 11); btnSelectModel.Location = new Point(525, 9);
btnSelectModel.Margin = new Padding(4, 4, 4, 4);
btnSelectModel.Name = "btnSelectModel"; btnSelectModel.Name = "btnSelectModel";
btnSelectModel.Size = new Size(96, 45); btnSelectModel.Size = new Size(75, 38);
btnSelectModel.TabIndex = 12; btnSelectModel.TabIndex = 12;
btnSelectModel.Text = "打开"; btnSelectModel.Text = "打开";
btnSelectModel.Type = AntdUI.TTypeMini.Primary; btnSelectModel.Type = AntdUI.TTypeMini.Primary;
// //
// iptBackImg // iptBackImg
// //
iptBackImg.Location = new Point(892, 7); iptBackImg.Location = new Point(694, 6);
iptBackImg.Margin = new Padding(4, 4, 4, 4);
iptBackImg.Name = "iptBackImg"; iptBackImg.Name = "iptBackImg";
iptBackImg.PlaceholderText = "请选择背景图片"; iptBackImg.PlaceholderText = "请选择背景图片";
iptBackImg.Size = new Size(338, 51); iptBackImg.Size = new Size(263, 43);
iptBackImg.TabIndex = 10; iptBackImg.TabIndex = 10;
// //
// label3 // label3
// //
label3.BackColor = SystemColors.Window; label3.BackColor = SystemColors.Window;
label3.Location = new Point(779, 21); label3.Location = new Point(606, 18);
label3.Margin = new Padding(4, 4, 4, 4);
label3.Name = "label3"; label3.Name = "label3";
label3.Size = new Size(105, 27); label3.Size = new Size(82, 23);
label3.TabIndex = 9; label3.TabIndex = 9;
label3.Text = "背景图片路径"; label3.Text = "背景图片路径";
// //
// iptModel // iptModel
// //
iptModel.Location = new Point(329, 7); iptModel.Location = new Point(256, 6);
iptModel.Margin = new Padding(4, 4, 4, 4);
iptModel.Name = "iptModel"; iptModel.Name = "iptModel";
iptModel.PlaceholderText = "请选择算法"; iptModel.PlaceholderText = "请选择算法";
iptModel.Size = new Size(338, 51); iptModel.Size = new Size(263, 43);
iptModel.TabIndex = 3; iptModel.TabIndex = 3;
// //
// label2 // label2
// //
label2.BackColor = SystemColors.Window; label2.BackColor = SystemColors.Window;
label2.Location = new Point(248, 21); label2.Location = new Point(193, 18);
label2.Margin = new Padding(4, 4, 4, 4);
label2.Name = "label2"; label2.Name = "label2";
label2.Size = new Size(73, 27); label2.Size = new Size(57, 23);
label2.TabIndex = 2; label2.TabIndex = 2;
label2.Text = "算法路径"; label2.Text = "算法路径";
// //
// sltCameraName // sltCameraName
// //
sltCameraName.List = true; sltCameraName.List = true;
sltCameraName.Location = new Point(93, 8); sltCameraName.Location = new Point(72, 7);
sltCameraName.Margin = new Padding(4, 4, 4, 4);
sltCameraName.MaxCount = 10; sltCameraName.MaxCount = 10;
sltCameraName.Name = "sltCameraName"; sltCameraName.Name = "sltCameraName";
sltCameraName.PlaceholderText = "请选择相机"; sltCameraName.PlaceholderText = "请选择相机";
sltCameraName.Size = new Size(148, 51); sltCameraName.Size = new Size(115, 43);
sltCameraName.TabIndex = 1; sltCameraName.TabIndex = 1;
// //
// label1 // label1
// //
label1.BackColor = SystemColors.Window; label1.BackColor = SystemColors.Window;
label1.Location = new Point(12, 21); label1.Location = new Point(9, 18);
label1.Margin = new Padding(4, 4, 4, 4);
label1.Name = "label1"; label1.Name = "label1";
label1.Size = new Size(73, 27); label1.Size = new Size(57, 23);
label1.TabIndex = 0; label1.TabIndex = 0;
label1.Text = "相机名称"; label1.Text = "相机名称";
// //
@ -222,39 +219,35 @@
panel2.Controls.Add(sltDirection); panel2.Controls.Add(sltDirection);
panel2.Controls.Add(label4); panel2.Controls.Add(label4);
panel2.Dock = DockStyle.Top; panel2.Dock = DockStyle.Top;
panel2.Location = new Point(0, 110); panel2.Location = new Point(0, 93);
panel2.Margin = new Padding(4, 4, 4, 4);
panel2.Name = "panel2"; panel2.Name = "panel2";
panel2.Size = new Size(1551, 66); panel2.Size = new Size(1210, 56);
panel2.TabIndex = 3; panel2.TabIndex = 3;
panel2.Text = "panel2"; panel2.Text = "panel2";
// //
// iptSpeed // iptSpeed
// //
iptSpeed.Location = new Point(329, 7); iptSpeed.Location = new Point(256, 6);
iptSpeed.Margin = new Padding(4, 4, 4, 4);
iptSpeed.Name = "iptSpeed"; iptSpeed.Name = "iptSpeed";
iptSpeed.Size = new Size(138, 51); iptSpeed.Size = new Size(107, 43);
iptSpeed.TabIndex = 20; iptSpeed.TabIndex = 20;
iptSpeed.Text = "0"; iptSpeed.Text = "0";
// //
// label7 // label7
// //
label7.BackColor = SystemColors.Window; label7.BackColor = SystemColors.Window;
label7.Location = new Point(248, 21); label7.Location = new Point(193, 18);
label7.Margin = new Padding(4, 4, 4, 4);
label7.Name = "label7"; label7.Name = "label7";
label7.Size = new Size(73, 27); label7.Size = new Size(57, 23);
label7.TabIndex = 19; label7.TabIndex = 19;
label7.Text = "转盘速度"; label7.Text = "转盘速度";
// //
// btnSaveImg // btnSaveImg
// //
btnSaveImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSaveImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveImg.Location = new Point(1448, 13); btnSaveImg.Location = new Point(1126, 11);
btnSaveImg.Margin = new Padding(4, 4, 4, 4);
btnSaveImg.Name = "btnSaveImg"; btnSaveImg.Name = "btnSaveImg";
btnSaveImg.Size = new Size(96, 45); btnSaveImg.Size = new Size(75, 38);
btnSaveImg.TabIndex = 18; btnSaveImg.TabIndex = 18;
btnSaveImg.Text = "保存图像"; btnSaveImg.Text = "保存图像";
btnSaveImg.Type = AntdUI.TTypeMini.Primary; btnSaveImg.Type = AntdUI.TTypeMini.Primary;
@ -262,10 +255,9 @@
// btnSavePos // btnSavePos
// //
btnSavePos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSavePos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSavePos.Location = new Point(1302, 13); btnSavePos.Location = new Point(1013, 11);
btnSavePos.Margin = new Padding(4, 4, 4, 4);
btnSavePos.Name = "btnSavePos"; btnSavePos.Name = "btnSavePos";
btnSavePos.Size = new Size(96, 45); btnSavePos.Size = new Size(75, 38);
btnSavePos.TabIndex = 17; btnSavePos.TabIndex = 17;
btnSavePos.Text = "保存定位"; btnSavePos.Text = "保存定位";
btnSavePos.Type = AntdUI.TTypeMini.Primary; btnSavePos.Type = AntdUI.TTypeMini.Primary;
@ -273,10 +265,9 @@
// btnReverse // btnReverse
// //
btnReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnReverse.Location = new Point(1162, 13); btnReverse.Location = new Point(904, 11);
btnReverse.Margin = new Padding(4, 4, 4, 4);
btnReverse.Name = "btnReverse"; btnReverse.Name = "btnReverse";
btnReverse.Size = new Size(96, 45); btnReverse.Size = new Size(75, 38);
btnReverse.TabIndex = 16; btnReverse.TabIndex = 16;
btnReverse.Text = "转盘反转"; btnReverse.Text = "转盘反转";
btnReverse.Type = AntdUI.TTypeMini.Primary; btnReverse.Type = AntdUI.TTypeMini.Primary;
@ -284,10 +275,9 @@
// btnForward // btnForward
// //
btnForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnForward.Location = new Point(1034, 13); btnForward.Location = new Point(804, 11);
btnForward.Margin = new Padding(4, 4, 4, 4);
btnForward.Name = "btnForward"; btnForward.Name = "btnForward";
btnForward.Size = new Size(96, 45); btnForward.Size = new Size(75, 38);
btnForward.TabIndex = 15; btnForward.TabIndex = 15;
btnForward.Text = "转盘正转"; btnForward.Text = "转盘正转";
btnForward.Type = AntdUI.TTypeMini.Primary; btnForward.Type = AntdUI.TTypeMini.Primary;
@ -295,10 +285,9 @@
// btnLocalization // btnLocalization
// //
btnLocalization.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnLocalization.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnLocalization.Location = new Point(905, 13); btnLocalization.Location = new Point(704, 11);
btnLocalization.Margin = new Padding(4, 4, 4, 4);
btnLocalization.Name = "btnLocalization"; btnLocalization.Name = "btnLocalization";
btnLocalization.Size = new Size(96, 45); btnLocalization.Size = new Size(75, 38);
btnLocalization.TabIndex = 14; btnLocalization.TabIndex = 14;
btnLocalization.Text = "开始定位"; btnLocalization.Text = "开始定位";
btnLocalization.Type = AntdUI.TTypeMini.Primary; btnLocalization.Type = AntdUI.TTypeMini.Primary;
@ -306,31 +295,28 @@
// btnAcquisition // btnAcquisition
// //
btnAcquisition.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnAcquisition.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnAcquisition.Location = new Point(779, 13); btnAcquisition.Location = new Point(606, 11);
btnAcquisition.Margin = new Padding(4, 4, 4, 4);
btnAcquisition.Name = "btnAcquisition"; btnAcquisition.Name = "btnAcquisition";
btnAcquisition.Size = new Size(96, 45); btnAcquisition.Size = new Size(75, 38);
btnAcquisition.TabIndex = 13; btnAcquisition.TabIndex = 13;
btnAcquisition.Text = "开始采集"; btnAcquisition.Text = "开始采集";
btnAcquisition.Type = AntdUI.TTypeMini.Primary; btnAcquisition.Type = AntdUI.TTypeMini.Primary;
// //
// iptPosition // iptPosition
// //
iptPosition.Location = new Point(546, 7); iptPosition.Location = new Point(425, 6);
iptPosition.Margin = new Padding(4, 4, 4, 4);
iptPosition.Name = "iptPosition"; iptPosition.Name = "iptPosition";
iptPosition.ReadOnly = true; iptPosition.ReadOnly = true;
iptPosition.Size = new Size(225, 51); iptPosition.Size = new Size(175, 43);
iptPosition.TabIndex = 7; iptPosition.TabIndex = 7;
iptPosition.Text = "0"; iptPosition.Text = "0";
// //
// label5 // label5
// //
label5.BackColor = SystemColors.Window; label5.BackColor = SystemColors.Window;
label5.Location = new Point(474, 21); label5.Location = new Point(369, 18);
label5.Margin = new Padding(4, 4, 4, 4);
label5.Name = "label5"; label5.Name = "label5";
label5.Size = new Size(76, 27); label5.Size = new Size(59, 23);
label5.TabIndex = 6; label5.TabIndex = 6;
label5.Text = "当前位置"; label5.Text = "当前位置";
// //
@ -338,21 +324,19 @@
// //
sltDirection.Items.AddRange(new object[] { "正方向", "反方向" }); sltDirection.Items.AddRange(new object[] { "正方向", "反方向" });
sltDirection.List = true; sltDirection.List = true;
sltDirection.Location = new Point(93, 7); sltDirection.Location = new Point(72, 6);
sltDirection.Margin = new Padding(4, 4, 4, 4);
sltDirection.MaxCount = 10; sltDirection.MaxCount = 10;
sltDirection.Name = "sltDirection"; sltDirection.Name = "sltDirection";
sltDirection.PlaceholderText = "请选择方向"; sltDirection.PlaceholderText = "请选择方向";
sltDirection.Size = new Size(148, 51); sltDirection.Size = new Size(115, 43);
sltDirection.TabIndex = 5; sltDirection.TabIndex = 5;
// //
// label4 // label4
// //
label4.BackColor = SystemColors.Window; label4.BackColor = SystemColors.Window;
label4.Location = new Point(12, 21); label4.Location = new Point(9, 18);
label4.Margin = new Padding(4, 4, 4, 4);
label4.Name = "label4"; label4.Name = "label4";
label4.Size = new Size(73, 27); label4.Size = new Size(57, 23);
label4.TabIndex = 4; label4.TabIndex = 4;
label4.Text = "转盘方向"; label4.Text = "转盘方向";
// //
@ -367,51 +351,46 @@
panelMotor.Controls.Add(iptMotorSpeed); panelMotor.Controls.Add(iptMotorSpeed);
panelMotor.Controls.Add(label8); panelMotor.Controls.Add(label8);
panelMotor.Dock = DockStyle.Top; panelMotor.Dock = DockStyle.Top;
panelMotor.Location = new Point(0, 176); panelMotor.Location = new Point(0, 149);
panelMotor.Margin = new Padding(4, 4, 4, 4);
panelMotor.Name = "panelMotor"; panelMotor.Name = "panelMotor";
panelMotor.Size = new Size(1551, 54); panelMotor.Size = new Size(1210, 46);
panelMotor.TabIndex = 4; panelMotor.TabIndex = 4;
panelMotor.Text = "panel3"; panelMotor.Text = "panel3";
// //
// btnSaveMotorPos // btnSaveMotorPos
// //
btnSaveMotorPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSaveMotorPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveMotorPos.Location = new Point(966, 6); btnSaveMotorPos.Location = new Point(751, 5);
btnSaveMotorPos.Margin = new Padding(4, 4, 4, 4);
btnSaveMotorPos.Name = "btnSaveMotorPos"; btnSaveMotorPos.Name = "btnSaveMotorPos";
btnSaveMotorPos.Size = new Size(111, 45); btnSaveMotorPos.Size = new Size(109, 38);
btnSaveMotorPos.TabIndex = 21; btnSaveMotorPos.TabIndex = 21;
btnSaveMotorPos.Text = "保存电机位置"; btnSaveMotorPos.Text = "保存相机电机位置";
btnSaveMotorPos.Type = AntdUI.TTypeMini.Primary; btnSaveMotorPos.Type = AntdUI.TTypeMini.Primary;
// //
// iptMotorPos // iptMotorPos
// //
iptMotorPos.Location = new Point(365, 0); iptMotorPos.Location = new Point(284, 0);
iptMotorPos.Margin = new Padding(4, 4, 4, 4);
iptMotorPos.Name = "iptMotorPos"; iptMotorPos.Name = "iptMotorPos";
iptMotorPos.ReadOnly = true; iptMotorPos.ReadOnly = true;
iptMotorPos.Size = new Size(225, 51); iptMotorPos.Size = new Size(175, 43);
iptMotorPos.TabIndex = 20; iptMotorPos.TabIndex = 20;
iptMotorPos.Text = "0"; iptMotorPos.Text = "0";
// //
// label9 // label9
// //
label9.BackColor = SystemColors.Window; label9.BackColor = SystemColors.Window;
label9.Location = new Point(261, 12); label9.Location = new Point(203, 10);
label9.Margin = new Padding(4, 4, 4, 4);
label9.Name = "label9"; label9.Name = "label9";
label9.Size = new Size(104, 27); label9.Size = new Size(81, 23);
label9.TabIndex = 19; label9.TabIndex = 19;
label9.Text = "变焦电机位置"; label9.Text = "变焦电机位置";
// //
// btnMotorZero // btnMotorZero
// //
btnMotorZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnMotorZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnMotorZero.Location = new Point(598, 6); btnMotorZero.Location = new Point(465, 5);
btnMotorZero.Margin = new Padding(4, 4, 4, 4);
btnMotorZero.Name = "btnMotorZero"; btnMotorZero.Name = "btnMotorZero";
btnMotorZero.Size = new Size(96, 45); btnMotorZero.Size = new Size(75, 38);
btnMotorZero.TabIndex = 18; btnMotorZero.TabIndex = 18;
btnMotorZero.Text = "电机回原点"; btnMotorZero.Text = "电机回原点";
btnMotorZero.Type = AntdUI.TTypeMini.Primary; btnMotorZero.Type = AntdUI.TTypeMini.Primary;
@ -419,10 +398,9 @@
// btnMotorReverse // btnMotorReverse
// //
btnMotorReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnMotorReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnMotorReverse.Location = new Point(847, 6); btnMotorReverse.Location = new Point(659, 5);
btnMotorReverse.Margin = new Padding(4, 4, 4, 4);
btnMotorReverse.Name = "btnMotorReverse"; btnMotorReverse.Name = "btnMotorReverse";
btnMotorReverse.Size = new Size(96, 45); btnMotorReverse.Size = new Size(75, 38);
btnMotorReverse.TabIndex = 17; btnMotorReverse.TabIndex = 17;
btnMotorReverse.Text = "电机反转"; btnMotorReverse.Text = "电机反转";
btnMotorReverse.Type = AntdUI.TTypeMini.Primary; btnMotorReverse.Type = AntdUI.TTypeMini.Primary;
@ -430,60 +408,137 @@
// btnMotorForward // btnMotorForward
// //
btnMotorForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnMotorForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnMotorForward.Location = new Point(724, 6); btnMotorForward.Location = new Point(563, 5);
btnMotorForward.Margin = new Padding(4, 4, 4, 4);
btnMotorForward.Name = "btnMotorForward"; btnMotorForward.Name = "btnMotorForward";
btnMotorForward.Size = new Size(96, 45); btnMotorForward.Size = new Size(75, 38);
btnMotorForward.TabIndex = 16; btnMotorForward.TabIndex = 16;
btnMotorForward.Text = "电机正转"; btnMotorForward.Text = "电机正转";
btnMotorForward.Type = AntdUI.TTypeMini.Primary; btnMotorForward.Type = AntdUI.TTypeMini.Primary;
// //
// iptMotorSpeed // iptMotorSpeed
// //
iptMotorSpeed.Location = new Point(116, 0); iptMotorSpeed.Location = new Point(90, 0);
iptMotorSpeed.Margin = new Padding(4, 4, 4, 4);
iptMotorSpeed.Name = "iptMotorSpeed"; iptMotorSpeed.Name = "iptMotorSpeed";
iptMotorSpeed.Size = new Size(138, 51); iptMotorSpeed.Size = new Size(107, 43);
iptMotorSpeed.TabIndex = 8; iptMotorSpeed.TabIndex = 8;
iptMotorSpeed.Text = "0"; iptMotorSpeed.Text = "0";
// //
// label8 // label8
// //
label8.BackColor = SystemColors.Window; label8.BackColor = SystemColors.Window;
label8.Location = new Point(12, 12); label8.Location = new Point(9, 10);
label8.Margin = new Padding(4, 4, 4, 4);
label8.Name = "label8"; label8.Name = "label8";
label8.Size = new Size(104, 27); label8.Size = new Size(81, 23);
label8.TabIndex = 1; label8.TabIndex = 1;
label8.Text = "变焦电机速度"; label8.Text = "变焦电机速度";
// //
// panel3
//
panel3.Controls.Add(btnSaveBarrierPos);
panel3.Controls.Add(iptBarrierPos);
panel3.Controls.Add(label10);
panel3.Controls.Add(btnBarrierZero);
panel3.Controls.Add(btnBarrier);
panel3.Controls.Add(iptBarrierSpeed);
panel3.Controls.Add(label11);
panel3.Dock = DockStyle.Top;
panel3.Location = new Point(0, 195);
panel3.Name = "panel3";
panel3.Size = new Size(1210, 46);
panel3.TabIndex = 6;
panel3.Text = "panel3";
//
// btnSaveBarrierPos
//
btnSaveBarrierPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveBarrierPos.Location = new Point(681, 5);
btnSaveBarrierPos.Name = "btnSaveBarrierPos";
btnSaveBarrierPos.Size = new Size(109, 38);
btnSaveBarrierPos.TabIndex = 21;
btnSaveBarrierPos.Text = "保存挡料电机位置";
btnSaveBarrierPos.Type = AntdUI.TTypeMini.Primary;
//
// iptBarrierPos
//
iptBarrierPos.Location = new Point(284, 0);
iptBarrierPos.Name = "iptBarrierPos";
iptBarrierPos.Size = new Size(175, 43);
iptBarrierPos.TabIndex = 20;
iptBarrierPos.Text = "0";
//
// label10
//
label10.BackColor = SystemColors.Window;
label10.Location = new Point(203, 10);
label10.Name = "label10";
label10.Size = new Size(81, 23);
label10.TabIndex = 19;
label10.Text = "挡料电机位置";
//
// btnBarrierZero
//
btnBarrierZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnBarrierZero.Location = new Point(465, 5);
btnBarrierZero.Name = "btnBarrierZero";
btnBarrierZero.Size = new Size(75, 38);
btnBarrierZero.TabIndex = 18;
btnBarrierZero.Text = "电机回原点";
btnBarrierZero.Type = AntdUI.TTypeMini.Primary;
//
// btnBarrier
//
btnBarrier.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnBarrier.Location = new Point(563, 5);
btnBarrier.Name = "btnBarrier";
btnBarrier.Size = new Size(101, 38);
btnBarrier.TabIndex = 16;
btnBarrier.Text = "挡料电机转动";
btnBarrier.Type = AntdUI.TTypeMini.Primary;
//
// iptBarrierSpeed
//
iptBarrierSpeed.Location = new Point(90, 0);
iptBarrierSpeed.Name = "iptBarrierSpeed";
iptBarrierSpeed.Size = new Size(107, 43);
iptBarrierSpeed.TabIndex = 8;
iptBarrierSpeed.Text = "0";
//
// label11
//
label11.BackColor = SystemColors.Window;
label11.Location = new Point(9, 10);
label11.Name = "label11";
label11.Size = new Size(81, 23);
label11.TabIndex = 1;
label11.Text = "挡料电机速度";
//
// imageViewerControl1 // imageViewerControl1
// //
imageViewerControl1.Dock = DockStyle.Fill; imageViewerControl1.Dock = DockStyle.Fill;
imageViewerControl1.Image = null; imageViewerControl1.Image = null;
imageViewerControl1.Location = new Point(0, 230); imageViewerControl1.Location = new Point(0, 241);
imageViewerControl1.Margin = new Padding(4, 4, 4, 4);
imageViewerControl1.Name = "imageViewerControl1"; imageViewerControl1.Name = "imageViewerControl1";
imageViewerControl1.Size = new Size(1551, 593); imageViewerControl1.Size = new Size(1210, 464);
imageViewerControl1.TabIndex = 5; imageViewerControl1.TabIndex = 7;
// //
// VisualLocalizationWindow // VisualLocalizationWindow
// //
AutoScaleDimensions = new SizeF(9F, 20F); AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1551, 823); ClientSize = new Size(1210, 705);
Controls.Add(imageViewerControl1); Controls.Add(imageViewerControl1);
Controls.Add(panel3);
Controls.Add(panelMotor); Controls.Add(panelMotor);
Controls.Add(panel2); Controls.Add(panel2);
Controls.Add(panel1); Controls.Add(panel1);
Controls.Add(titlebar); Controls.Add(titlebar);
Margin = new Padding(4, 4, 4, 4);
Name = "VisualLocalizationWindow"; Name = "VisualLocalizationWindow";
Text = "CCD光学筛选定位系统"; Text = "CCD光学筛选定位系统";
WindowState = FormWindowState.Maximized; WindowState = FormWindowState.Maximized;
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
panel2.ResumeLayout(false); panel2.ResumeLayout(false);
panelMotor.ResumeLayout(false); panelMotor.ResumeLayout(false);
panel3.ResumeLayout(false);
ResumeLayout(false); ResumeLayout(false);
} }
@ -517,12 +572,20 @@
private AntdUI.Panel panelMotor; private AntdUI.Panel panelMotor;
private AntdUI.InputNumber iptMotorSpeed; private AntdUI.InputNumber iptMotorSpeed;
private AntdUI.Label label8; private AntdUI.Label label8;
private ImageViewerControl imageViewerControl1;
private AntdUI.Button btnMotorReverse; private AntdUI.Button btnMotorReverse;
private AntdUI.Button btnMotorForward; private AntdUI.Button btnMotorForward;
private AntdUI.InputNumber iptMotorPos; private AntdUI.InputNumber iptMotorPos;
private AntdUI.Label label9; private AntdUI.Label label9;
private AntdUI.Button btnMotorZero; private AntdUI.Button btnMotorZero;
private AntdUI.Button btnSaveMotorPos; private AntdUI.Button btnSaveMotorPos;
private AntdUI.Panel panel3;
private AntdUI.Button btnSaveBarrierPos;
private AntdUI.InputNumber iptBarrierPos;
private AntdUI.Label label10;
private AntdUI.Button btnBarrierZero;
private AntdUI.Button btnBarrier;
private AntdUI.InputNumber iptBarrierSpeed;
private AntdUI.Label label11;
private ImageViewerControl imageViewerControl1;
} }
} }

View File

@ -31,7 +31,53 @@ namespace DHSoftware.Views
private System.Threading.Timer Timer; private System.Threading.Timer Timer;
List<VisualLocalization> localizations = new List<VisualLocalization>(); List<VisualLocalization> localizations = new List<VisualLocalization>();
#region
private readonly float x; //定义当前窗体的宽度
private readonly float y; //定义当前窗体的高度
private void setTag(Control cons)
{
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size;
if (con.Controls.Count > 0) setTag(con);
}
}
private void setControls(float newx, float newy, Control cons)
{
//遍历窗体中的控件,重新设置控件的值
foreach (Control con in cons.Controls)
//获取控件的Tag属性值并分割后存储字符串数组
if (con.Tag != null)
{
var mytag = con.Tag.ToString().Split(';');
//根据窗体缩放的比例确定控件的值
con.Width = Convert.ToInt32(Convert.ToSingle(mytag[0]) * newx); //宽度
con.Height = Convert.ToInt32(Convert.ToSingle(mytag[1]) * newy); //高度
con.Left = Convert.ToInt32(Convert.ToSingle(mytag[2]) * newx); //左边距
con.Top = Convert.ToInt32(Convert.ToSingle(mytag[3]) * newy); //顶边距
var currentSize = Convert.ToSingle(mytag[4]) * newy; //字体大小
if (currentSize > 0) con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
con.Focus();
if (con.Controls.Count > 0) setControls(newx, newy, con);
}
}
/// <summary>
/// 重置窗体布局
/// </summary>
private void ReWinformLayout()
{
var newx = Width / x;
var newy = Height / y;
setControls(newx, newy, this);
}
#endregion
public VisualLocalizationWindow() public VisualLocalizationWindow()
{ {
@ -55,11 +101,157 @@ namespace DHSoftware.Views
btnMotorZero.Click += BtnMotorZero_Click; btnMotorZero.Click += BtnMotorZero_Click;
btnSaveMotorPos.Click += BtnSaveMotorPos_Click; btnSaveMotorPos.Click += BtnSaveMotorPos_Click;
panelMotor.Visible = false; panelMotor.Visible = false;
Resize += VisualLocalizationWindow_Resize;
btnBarrierZero.Click += BtnBarrierZero_Click;
btnBarrier.Click += BtnBarrier_Click;
btnSaveBarrierPos.Click += BtnSaveBarrierPos_Click;
iptMotorSpeed.Value =1200;
iptBarrierSpeed.Value = 500;
AutoDpi(this);
x = Width;
y = Height;
setTag(this);
} }
private void BtnSaveBarrierPos_Click(object? sender, EventArgs e)
{
try
{
//根据工位查找点位
PLCItem? pLCItem = ConfigModel.PLCBaseList?
.FirstOrDefault()?
.PLCItemList?
.Where(it => it.Name == "挡料电机位置").FirstOrDefault();
if (pLCItem == null)
{
AntdUI.Message.warn(this, $"未找到挡料电机位置地址,请检查该地址是否存在于点位表!", autoClose: 3);
return;
}
PLCItem? pLCItem1 = ConfigModel.GlobalList?
.FirstOrDefault()?
.StartProcessList?
.Where(it => it.Name == "挡料电机位置").FirstOrDefault();
if (pLCItem1 == null)
{
pLCItem1 = new PLCItem();
pLCItem1.Name = pLCItem.Name;
pLCItem1.Address = pLCItem.Address;
pLCItem1.Value = iptBarrierPos.Text;
pLCItem1.Type = pLCItem.Type;
pLCItem1.StartExecute = true;
ConfigModel.GlobalList?
.FirstOrDefault()?
.StartProcessList?.Add(pLCItem1);
}
else
{
pLCItem1.Value = iptBarrierPos.Text;
}
ConfigHelper.SaveConfig();
AntdUI.Message.success(this, "保存成功!", autoClose: 3);
}
catch (Exception ex)
{
AntdUI.Message.error(this,ex.Message, autoClose: 3);
}
}
private async void BtnBarrier_Click(object? sender, EventArgs e)
{
if (_isOperating) return;
_isOperating = true;
try
{
// 获取并处理速度值
if (!int.TryParse(iptBarrierSpeed.Text, out int speed) || speed == 0)
{
AntdUI.Message.warn(this, "挡料电机速度值无效");
return;
}
if (!int.TryParse(iptBarrierPos.Text, out int barrierPos) || barrierPos == 0)
{
AntdUI.Message.warn(this, "挡料电机位置值无效");
return;
}
btnBarrierZero.Enabled= false;
int actualSpeed = Math.Abs(speed); // 正转取绝对值
MainWindow.Instance.PLC.BarrierSpeed(actualSpeed);
MainWindow.Instance.PLC.BarrierPos(barrierPos);
MainWindow.Instance.PLC.BarrierClockwise(true);
// 实时更新循环
while (barrierPos!=MainWindow.Instance.PLC.ReadBarrierRealPos())
{
await Task.Delay(50);
}
}
catch (Exception ex)
{
_isOperating = false;
btnBarrierZero.Enabled = true;
AntdUI.Message.error(this, $"挡料电机转动异常: {ex.Message}");
}
finally
{
MainWindow.Instance.PLC.BarrierClockwise(false);
_isOperating = false;
btnBarrierZero.Enabled = true;
}
}
private CancellationTokenSource? _bCts;
private bool _isOperating;
private async void BtnBarrierZero_Click(object? sender, EventArgs e)
{
if (_isOperating) return;
_isOperating = true;
btnBarrier.Enabled = false;
try
{
// 执行回零
await Task.Run(() => MainWindow.Instance.PLC.BarrierToZero(true));
// 等待回零完成
while (!MainWindow.Instance.PLC.ReadBarrierToZero())
{
await Task.Delay(50);
}
await Task.Run(() => MainWindow.Instance.PLC.BarrierToZero(false));
}
catch (Exception ex)
{
btnBarrier.Enabled = true;
_isOperating = false;
AntdUI.Message.error(this, $"回零失败: {ex.Message}");
}
finally
{
btnBarrier.Enabled = true;
_isOperating = false;
}
}
private void VisualLocalizationWindow_Resize(object? sender, EventArgs e)
{
ReWinformLayout();
}
private void BtnSaveMotorPos_Click(object? sender, EventArgs e) private void BtnSaveMotorPos_Click(object? sender, EventArgs e)
{
try
{ {
//根据工位查找点位 //根据工位查找点位
PLCItem? pLCItem = ConfigModel.PLCBaseList? PLCItem? pLCItem = ConfigModel.PLCBaseList?
@ -97,9 +289,12 @@ namespace DHSoftware.Views
ConfigHelper.SaveConfig(); ConfigHelper.SaveConfig();
AntdUI.Message.success(this, "保存成功!", autoClose: 3); AntdUI.Message.success(this, "保存成功!", autoClose: 3);
} }
private CancellationTokenSource? _motorCts; catch (Exception ex)
private bool _isMotorOperating; {
private bool _isHoming; AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
@ -138,6 +333,7 @@ namespace DHSoftware.Views
} }
catch (Exception ex) catch (Exception ex)
{ {
_isBusy = false;
AntdUI.Message.error(this, $"正转异常: {ex.Message}"); AntdUI.Message.error(this, $"正转异常: {ex.Message}");
} }
finally finally
@ -201,6 +397,7 @@ namespace DHSoftware.Views
} }
catch (Exception ex) catch (Exception ex)
{ {
_isBusy = false;
AntdUI.Message.error(this, $"反转异常: {ex.Message}"); AntdUI.Message.error(this, $"反转异常: {ex.Message}");
} }
finally finally
@ -247,6 +444,8 @@ namespace DHSoftware.Views
} }
catch (Exception ex) catch (Exception ex)
{ {
btnMotorForward.Enabled = btnMotorReverse.Enabled = true;
_isBusy = false;
AntdUI.Message.error(this, $"回零失败: {ex.Message}"); AntdUI.Message.error(this, $"回零失败: {ex.Message}");
} }
finally finally
@ -258,6 +457,8 @@ namespace DHSoftware.Views
} }
private void SltCameraName_SelectedIndexChanged(object sender, IntEventArgs e) private void SltCameraName_SelectedIndexChanged(object sender, IntEventArgs e)
{
try
{ {
try try
{ {
@ -268,9 +469,9 @@ namespace DHSoftware.Views
{ {
} }
string cameraName= sltCameraName.Text; string cameraName = sltCameraName.Text;
Do3ThinkCamera = MainWindow.Instance.Cameras.Where(it => it.CameraName == cameraName).FirstOrDefault() ?? new Do3ThinkCamera(); Do3ThinkCamera = MainWindow.Instance.Cameras.Where(it => it.CameraName == cameraName).FirstOrDefault() ?? new Do3ThinkCamera();
VisualLocalization? visual= localizations.Where(it=>it.CameraName==cameraName).FirstOrDefault(); VisualLocalization? visual = localizations.Where(it => it.CameraName == cameraName).FirstOrDefault();
if (visual != null) if (visual != null)
{ {
iptModel.Text = visual.ModelPath; iptModel.Text = visual.ModelPath;
@ -281,17 +482,24 @@ namespace DHSoftware.Views
} }
if (Do3ThinkCamera.IsZoomCamera) if (Do3ThinkCamera.IsZoomCamera)
{ {
panelMotor.Visible=true; panelMotor.Visible = true;
} }
else else
{ {
panelMotor.Visible = false; panelMotor.Visible = false;
} }
} }
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
private void BtnSavePos_Click(object? sender, EventArgs e) private void BtnSavePos_Click(object? sender, EventArgs e)
{ {
var form = new SavePositionControl(this,Convert.ToInt32(iptPosition.Text)) { Size = new Size(300, 300) }; try
{
var form = new SavePositionControl(this, Convert.ToInt32(iptPosition.Text)) { Size = new Size(300, 300) };
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
{ {
BtnHeight = 0, BtnHeight = 0,
@ -301,14 +509,19 @@ namespace DHSoftware.Views
VisualLocalization visualLocalization = new VisualLocalization(); VisualLocalization visualLocalization = new VisualLocalization();
//保存用户操作到文件 //保存用户操作到文件
visualLocalization.CameraName = sltCameraName.Text; visualLocalization.CameraName = sltCameraName.Text;
visualLocalization.ModelPath=iptModel.Text; visualLocalization.ModelPath = iptModel.Text;
visualLocalization.ImgPath=iptBackImg.Text; visualLocalization.ImgPath = iptBackImg.Text;
visualLocalization.Threshold=iptThreshold.Text; visualLocalization.Threshold = iptThreshold.Text;
visualLocalization.Direction=sltDirection.Text; visualLocalization.Direction = sltDirection.Text;
visualLocalization.Speed=iptSpeed.Text; visualLocalization.Speed = iptSpeed.Text;
visualLocalization.Save(); visualLocalization.Save();
} }
} }
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
/// <summary> /// <summary>
/// 保存图像 /// 保存图像
@ -316,13 +529,15 @@ namespace DHSoftware.Views
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void BtnSaveImg_Click(object? sender, EventArgs e) private void BtnSaveImg_Click(object? sender, EventArgs e)
{
try
{ {
if (!isCapturing) if (!isCapturing)
{ {
AntdUI.Message.warn(this, $"未开始采集,无法保存图像!", autoClose: 3); AntdUI.Message.warn(this, $"未开始采集,无法保存图像!", autoClose: 3);
return; return;
} }
Bitmap bitmap =imageViewerControl1.GetCurrentSnapshot(); Bitmap bitmap = imageViewerControl1.GetCurrentSnapshot();
using (SaveFileDialog saveDialog = new SaveFileDialog()) using (SaveFileDialog saveDialog = new SaveFileDialog())
{ {
saveDialog.Title = "保存图像文件"; saveDialog.Title = "保存图像文件";
@ -341,6 +556,12 @@ namespace DHSoftware.Views
AntdUI.Message.warn(this, $"取消图像保存操作!", autoClose: 3); AntdUI.Message.warn(this, $"取消图像保存操作!", autoClose: 3);
} }
} }
}
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
} }
/// <summary> /// <summary>
@ -349,6 +570,8 @@ namespace DHSoftware.Views
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void BtnLocalization_Click(object? sender, EventArgs e) private void BtnLocalization_Click(object? sender, EventArgs e)
{
try
{ {
if (!isCapturing) if (!isCapturing)
{ {
@ -357,7 +580,7 @@ namespace DHSoftware.Views
} }
if (!isLocationing) if (!isLocationing)
{ {
bool direction =sltDirection.SelectedIndex==0?true:false; bool direction = sltDirection.SelectedIndex == 0 ? true : false;
if (string.IsNullOrEmpty(iptSpeed.Text)) if (string.IsNullOrEmpty(iptSpeed.Text))
{ {
AntdUI.Message.warn(this, $"请输入速度!", autoClose: 3); AntdUI.Message.warn(this, $"请输入速度!", autoClose: 3);
@ -385,11 +608,16 @@ namespace DHSoftware.Views
else else
{ {
MainWindow.Instance.PLC.TurnStart(false); MainWindow.Instance.PLC.TurnStart(false);
iptPosition.Text= MainWindow.Instance.PLC.ReadVisionPos().ToString(); iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
isLocationing = false; isLocationing = false;
btnLocalization.Text = "开始定位"; btnLocalization.Text = "开始定位";
btnLocalization.Type = TTypeMini.Primary; btnLocalization.Type = TTypeMini.Primary;
} }
}
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
} }
@ -399,6 +627,8 @@ namespace DHSoftware.Views
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void BtnAcquisition_Click(object? sender, EventArgs e) private void BtnAcquisition_Click(object? sender, EventArgs e)
{
try
{ {
if (!isCapturing) if (!isCapturing)
{ {
@ -452,7 +682,7 @@ namespace DHSoftware.Views
AntdUI.Message.warn(this, $"未连接PLC,无法视觉定位!", autoClose: 3); AntdUI.Message.warn(this, $"未连接PLC,无法视觉定位!", autoClose: 3);
return; return;
} }
Do3ThinkCamera=MainWindow.Instance.Cameras.Where(it=>it.CameraName==sltCameraName.Text).FirstOrDefault()??new Do3ThinkCamera(); Do3ThinkCamera = MainWindow.Instance.Cameras.Where(it => it.CameraName == sltCameraName.Text).FirstOrDefault() ?? new Do3ThinkCamera();
Do3ThinkCamera.OnHImageOutput += OnCameraHImageOutput; Do3ThinkCamera.OnHImageOutput += OnCameraHImageOutput;
Timer = new System.Threading.Timer(CaptureLoop, null, 0, 50); Timer = new System.Threading.Timer(CaptureLoop, null, 0, 50);
isCapturing = true; isCapturing = true;
@ -475,6 +705,13 @@ namespace DHSoftware.Views
btnAcquisition.Type = TTypeMini.Primary; btnAcquisition.Type = TTypeMini.Primary;
} }
}
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
} }
@ -484,9 +721,16 @@ namespace DHSoftware.Views
/// </summary> /// </summary>
/// <param name="state"></param> /// <param name="state"></param>
private void CaptureLoop(object? state) private void CaptureLoop(object? state)
{
try
{ {
Do3ThinkCamera.Snapshot(); Do3ThinkCamera.Snapshot();
} }
catch(Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
private CancellationTokenSource? _rotateCts; private CancellationTokenSource? _rotateCts;
private bool _isRotating; private bool _isRotating;
@ -494,6 +738,8 @@ namespace DHSoftware.Views
/// 统一旋转控制方法 /// 统一旋转控制方法
/// </summary> /// </summary>
private async Task RotateControlAsync(bool direction) private async Task RotateControlAsync(bool direction)
{
try
{ {
// 防止重复启动 // 防止重复启动
if (_isRotating) return; if (_isRotating) return;
@ -558,6 +804,11 @@ namespace DHSoftware.Views
_rotateCts = null; _rotateCts = null;
} }
} }
catch (Exception ex) {
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
/// <summary> /// <summary>
@ -606,6 +857,8 @@ namespace DHSoftware.Views
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void BtnSelectBackImg_Click(object? sender, EventArgs e) private void BtnSelectBackImg_Click(object? sender, EventArgs e)
{
try
{ {
using (OpenFileDialog openFileDialog = new OpenFileDialog()) using (OpenFileDialog openFileDialog = new OpenFileDialog())
{ {
@ -626,6 +879,12 @@ namespace DHSoftware.Views
} }
} }
} }
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
/// <summary> /// <summary>
/// 选择算法 /// 选择算法
@ -633,6 +892,8 @@ namespace DHSoftware.Views
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void BtnSelectModel_Click(object? sender, EventArgs e) private void BtnSelectModel_Click(object? sender, EventArgs e)
{
try
{ {
using (OpenFileDialog openFileDialog = new OpenFileDialog()) using (OpenFileDialog openFileDialog = new OpenFileDialog())
{ {
@ -653,6 +914,11 @@ namespace DHSoftware.Views
} }
} }
} }
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
/// <summary> /// <summary>
/// 加载事件 /// 加载事件
@ -660,12 +926,14 @@ namespace DHSoftware.Views
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void VisualLocalizationWindow_Load(object? sender, EventArgs e) private void VisualLocalizationWindow_Load(object? sender, EventArgs e)
{
try
{ {
sltDirection.SelectedIndex = 0; sltDirection.SelectedIndex = 0;
sltCameraName.Items.Clear(); sltCameraName.Items.Clear();
if (MainWindow.Instance.Cameras?.Count > 0) if (MainWindow.Instance.Cameras?.Count > 0)
{ {
foreach(var cam in MainWindow.Instance.Cameras) foreach (var cam in MainWindow.Instance.Cameras)
{ {
sltCameraName.Items.Add(cam.CameraName); sltCameraName.Items.Add(cam.CameraName);
} }
@ -675,6 +943,13 @@ namespace DHSoftware.Views
AntdUI.Message.warn(this, $"未找到启用相机!", autoClose: 3); AntdUI.Message.warn(this, $"未找到启用相机!", autoClose: 3);
} }
}
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
} }
@ -702,7 +977,8 @@ namespace DHSoftware.Views
private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet) private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet)
{ {
try
{
this.BeginInvoke(new MethodInvoker(delegate () this.BeginInvoke(new MethodInvoker(delegate ()
{ {
@ -733,6 +1009,12 @@ namespace DHSoftware.Views
})); }));
} }
catch (Exception ex)
{
AntdUI.Message.error(this, ex.Message, autoClose: 3);
}
}
} }
} }

View File

@ -120,254 +120,7 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <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"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn
H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E
u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D
uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -376,7 +129,159 @@
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/
AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA
D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/
AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A
H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAA=
</value> </value>
</data> </data>
</root> </root>

BIN
DHSoftware/assets/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.