using RichCreator.Utility;
|
using RichCreator.Utility.Captures;
|
using RichCreator.Utility.CV;
|
using RichCreator.Utility.InputControl;
|
using RichCreator.Utility.Structs;
|
using RichCreator.Utility.Utilitys;
|
using Emgu.CV;
|
using Emgu.CV.Structure;
|
using RichCreator.Models;
|
using RichCreator.ViewModels;
|
using System;
|
using System.IO;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using System.Windows;
|
using System.Windows.Controls;
|
using ZTImage.Configuration;
|
using ZTImage.Log;
|
|
namespace RichCreator
|
{
|
/// <summary>
|
/// MainWindow.xaml 的交互逻辑
|
/// </summary>
|
public partial class MainWindow : Window
|
{
|
private ConfigViewModel viewModel;
|
public MainWindow()
|
{
|
InitializeComponent();
|
G.Instance.EnableWriter(this.writeDebug, this.writeInfo, this.writeRemainTime, this.CancelConfirm,this.stopTaskUI);
|
viewModel = new ConfigViewModel();
|
this.DataContext = viewModel;
|
}
|
|
|
private JobMonitor monitor;
|
private bool isRunning = false;
|
|
#region events
|
/// <summary>
|
/// 开始运行
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void Run_Click(object sender, RoutedEventArgs e)
|
{
|
Int32 taskIndex = this.taskName.SelectedIndex;
|
if (isRunning)
|
{
|
monitor.Stop();
|
stopTaskUI();
|
return;
|
}
|
|
G.Instance.DebugWriter("开始运行,2秒后开始控制,请不要移动鼠标!~");
|
RunningButton.IsEnabled = false;
|
Task.Run(() => {
|
Thread.Sleep(2000);
|
if (!TestHardware())
|
{
|
if (!TestHardware())
|
{
|
G.Instance.DebugWriter("检测硬件未通过");
|
stopTaskUI();
|
return;
|
}
|
}
|
G.Instance.DebugWriter("硬件检测通过");
|
|
this.monitor = new JobMonitor(taskIndex);
|
monitor.Start();
|
|
startTaskUI();
|
});
|
|
|
}
|
|
|
/// <summary>
|
/// 清空日志
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void ClearLog_Click(object sender, RoutedEventArgs e)
|
{
|
this.LogTB.Text = string.Empty;
|
}
|
|
/// <summary>
|
/// 点击检测按钮
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void BtnTestDo_Click(object sender, RoutedEventArgs e)
|
{
|
if (this.RemainTimeTB.Text.Trim() == "032j")
|
{
|
testTempVar = true;
|
|
}
|
else
|
{
|
testTempVar = false;
|
}
|
manualre.Set();
|
}
|
|
/// <summary>
|
/// 取消重试
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void CancelTry_Click(object sender, RoutedEventArgs e)
|
{
|
cancelReTry = true;
|
}
|
|
/// <summary>
|
/// GPD路径浏览
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void BrowserGPDPath_Click(object sender, RoutedEventArgs e)
|
{
|
string exePath = string.Empty;
|
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
|
ofd.DefaultExt = ".exe";
|
ofd.Filter = "tgp_daemon|*.exe";
|
ofd.Multiselect = false;
|
if (ofd.ShowDialog() == true)
|
{
|
exePath = ofd.FileName;
|
}
|
else
|
{
|
return;
|
}
|
|
if (File.Exists(exePath))
|
{
|
this.viewModel.TGPDaemonPath = exePath;
|
return;
|
}
|
}
|
|
/// <summary>
|
/// 保存配置
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void ConfigSave_Click(object sender, RoutedEventArgs e)
|
{
|
this.viewModel.SaveConfig();
|
MessageBox.Show("配置更新成功");
|
}
|
#endregion
|
|
private ZTPoint GetRolePosition()
|
{
|
System.Drawing.Bitmap bitmap = ScreenCapture.Instance.CaptureScreen();
|
//原图
|
Image<Rgb, byte> image = new Image<Rgb, byte>(bitmap);
|
//色彩hsv
|
Image<Hsv, byte> hsvImage = new Image<Hsv, byte>(image.Width, image.Height);
|
|
|
|
CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
|
|
hsvImage = hsvImage.GetSubRect(new System.Drawing.Rectangle(0, 0, 1280, 720));
|
|
return DnfCVHelper.FindRole(hsvImage, new ZTRectangle(0, 0, 1280, 720));
|
}
|
|
|
#region 测试硬件
|
//测试硬件的中间变量
|
private bool testTempVar = false;
|
private AutoResetEvent manualre = new AutoResetEvent(false);
|
|
/// <summary>
|
/// 测试硬件是否正常工作
|
/// </summary>
|
/// <returns></returns>
|
private bool TestHardware()
|
{
|
testTempVar = false;
|
Utility.Structs.ZTPoint btnPosition = Utility.Structs.ZTPoint.Empty;
|
Utility.Structs.ZTPoint txtPosition = Utility.Structs.ZTPoint.Empty;
|
using (ManualResetEvent mre = new ManualResetEvent(false))
|
{
|
//等待读取位置成功
|
this.Dispatcher.BeginInvoke((Action)(() =>
|
{
|
this.RemainTimeTB.Text = string.Empty;
|
btnPosition = GetElementClickPosition(this.btnTestDo);
|
txtPosition = GetElementClickPosition(this.RemainTimeTB);
|
mre.Set();
|
}));
|
if (!mre.WaitOne(1000))
|
{
|
return false;
|
}
|
}
|
|
|
//输入文字
|
G.Instance.InputControl.MoveToAndClick(txtPosition);
|
G.Instance.InputControl.InputString("032j");
|
|
//点检测
|
G.Instance.InputControl.MoveToAndClick(btnPosition);
|
|
bool rtt = manualre.WaitOne(8000);
|
if (!rtt)
|
{
|
return false;
|
}
|
if (testTempVar)
|
{
|
return true;
|
}
|
|
return false;
|
}
|
|
|
|
/// <summary>
|
/// 获取控件位置
|
/// </summary>
|
/// <param name="element"></param>
|
/// <returns></returns>
|
private ZTPoint GetElementClickPosition(Control element)
|
{
|
Point t = element.PointToScreen(new Point(0, 0));
|
Utility.Structs.ZTPoint t1 = new Utility.Structs.ZTPoint((Int32)(t.X + element.ActualWidth / 2), (Int32)(t.Y + element.ActualHeight / 2));
|
return t1;
|
}
|
#endregion
|
|
|
#region 显示
|
/// <summary>
|
/// 输出调试信息
|
/// </summary>
|
/// <param name="msg"></param>
|
private void writeDebug(string msg)
|
{
|
this.Dispatcher.BeginInvoke((Action)(() =>
|
{
|
string content = DateTime.Now.ToString("dd日HH:mm:ss") + "->" + msg;
|
this.debugMessage.Text = content;
|
}));
|
|
Trace.Debug(msg);
|
}
|
|
/// <summary>
|
/// 输出关键信息
|
/// </summary>
|
/// <param name="msg"></param>
|
private void writeInfo(string msg)
|
{
|
this.Dispatcher.BeginInvoke((Action)(() =>
|
{
|
if (string.IsNullOrEmpty(msg))
|
{
|
this.LogTB.Text = string.Empty;
|
return;
|
}
|
string content = DateTime.Now.ToString("dd日HH:mm:ss") + "->" + msg + "\r\n";
|
this.LogTB.AppendText(content);
|
this.LogTB.ScrollToEnd();
|
}));
|
|
Trace.Info(msg);
|
}
|
|
bool cancelReTry = false;
|
/// <summary>
|
/// 弹出提示,并带有倒计时
|
/// </summary>
|
/// <param name="msg"></param>
|
/// <param name="remainMillSecond"></param>
|
private bool CancelConfirm(Int64 remainMillSecond)
|
{
|
bool retry = true;
|
ManualResetEvent mre = new ManualResetEvent(false);
|
|
//启用取消按钮
|
this.Dispatcher.BeginInvoke((Action)(() =>
|
{
|
cancelReTry = false;
|
btnCancelTry.IsEnabled = true;
|
mre.Set();
|
}));
|
mre.WaitOne();
|
mre.Reset();
|
|
//计时,并判断是否取消
|
for (int remainSecond = (Int32)remainMillSecond / 1000; remainSecond >= 0; remainSecond--)
|
{
|
this.Dispatcher.BeginInvoke((Action)(() =>
|
{
|
btnCancelTry.Content = "取消重试(" + remainSecond + ")";
|
mre.Set();
|
}));
|
mre.WaitOne();
|
mre.Reset();
|
if (cancelReTry)
|
{
|
//取消重试
|
retry = false;
|
break;
|
}
|
Thread.Sleep(1000);
|
}
|
|
//禁用取消按钮
|
this.Dispatcher.BeginInvoke((Action)(() =>
|
{
|
cancelReTry = false;
|
btnCancelTry.IsEnabled = false;
|
btnCancelTry.Content = "取消重试";
|
mre.Set();
|
}));
|
mre.WaitOne();
|
mre.Reset();
|
mre.Close();
|
return retry;
|
}
|
|
|
/// <summary>
|
/// 输出剩余时间
|
/// </summary>
|
/// <param name="remaintime"></param>
|
private void writeRemainTime(Int64 remaintime)
|
{
|
//更新倒计时
|
string rt = "--:--";
|
if (remaintime >= 0)
|
{
|
Int64 min = remaintime / 60;
|
Int64 sec = remaintime % 60;
|
rt = min.ToString().PadLeft(2, '0') + ":" + sec.ToString().PadLeft(2, '0');
|
}
|
|
this.Dispatcher.BeginInvoke((Action)(() =>
|
{
|
this.RemainTimeTB.Text = rt;
|
}));
|
}
|
|
/// <summary>
|
/// 开始任务UI设置
|
/// </summary>
|
private void startTaskUI()
|
{
|
//文字设成停止运行
|
this.Dispatcher.BeginInvoke((Action)(() => {
|
RunningButton.Content = "停止";
|
RunningButton.IsEnabled = true;
|
isRunning = true;
|
}));
|
}
|
|
/// <summary>
|
/// 停止任务
|
/// </summary>
|
private void stopTaskUI()
|
{
|
//文字设成停止运行
|
this.Dispatcher.BeginInvoke((Action)(() => {
|
RunningButton.Content = "开始";
|
RunningButton.IsEnabled = true;
|
isRunning = false;
|
}));
|
}
|
#endregion
|
|
|
}
|
}
|