using DataEntity;
|
using DataEntity.Share;
|
using DataRWDAL;
|
using HxEnum;
|
using HxSocket;
|
using Newtonsoft.Json.Linq;
|
using System;
|
using System.Collections.Generic;
|
using System.Collections.ObjectModel;
|
using System.Configuration;
|
using System.Data;
|
using System.IO;
|
using System.Net;
|
using System.Threading;
|
using System.Windows;
|
using System.Windows.Media;
|
using System.Xml;
|
using XCommon;
|
using XCommon.Log;
|
using XCore;
|
using XHandler.Class;
|
using XHandler.Class.DataEx;
|
using XHandler.Controls.Run.Com;
|
using XHandler.View;
|
using XHandler.View.ManualPick;
|
using XHandler.View.MethodProperty;
|
using XImagingXhandler.XDAL;
|
using static HxEnum.OperationTypeEnum;
|
using XHandler.View.ElectroCutGum;
|
|
namespace XHandler.Controls
|
{
|
public class TakePhotoControl
|
{
|
string strCurrentCulture = Shared.SoftwareInformation.currentculture;
|
WellCalc wellCalc = new WellCalc();
|
LatticeBll latticeBll = new LatticeBll();
|
HomeBll homeBll = new HomeBll();
|
public RunWnd launchView = null;
|
TakePhotoBll takePhotoBll = new TakePhotoBll();
|
public HxSocketClient socketTcpClientToRemote = null;
|
private BacteriaBll bacteriaBll = new BacteriaBll();
|
|
private int countOfAutoanalysis = 0;//成像识别菌落数量
|
private int countOfManualchoice = 0;//人工挑选菌落数量
|
private int countOfManualdelete = 0;//人工删除菌落数量
|
private int countOfoating = 0;//涂布菌落总数
|
private DateTime takephotoTime = DateTime.Now;
|
|
#region 执行拍照,返回结果字符串
|
/// <summary>
|
/// 执行拍照,返回结果字符串
|
/// </summary>
|
/// <param name="xmlEnv">装载方法属性节点对象</param>
|
/// <param name="methodNode">装载方法属性节点对象</param>
|
/// <param name="isSimulator">0:连接谁;1:仿真</param>
|
/// <returns></returns>
|
public bool ExecuteTakePhoto(XmlNode xmlEnv, XmlNode methodNode, bool isSimulator)
|
{
|
bool result = true;
|
try
|
{
|
if (launchView._cancelSource.IsCancellationRequested)
|
{
|
result = false;
|
return result;
|
}
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strStart.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】start:");
|
}
|
|
LoggerHelper.InfoLog("[TakePhotoControl][ExecuteTakePhoto]:Start");
|
|
#region 数据准备
|
string filePath = ConfigurationManager.AppSettings["choiceFilePath"]; // 挑菌下发参数.xls
|
DataTable dtChoiceParams = null;
|
// 微牧拍照之前机械臂需要先移到特定位置
|
string[] tackPhotoPositionXY = ConfigurationManager.AppSettings["tackPhotoPosition"].ToString().Split(',');
|
result = ControlCom.Move(float.Parse(tackPhotoPositionXY[0]), float.Parse(tackPhotoPositionXY[1]), isSimulator, launchView, MoveTypeEnum.Chanel);
|
if (!result)
|
{
|
return result;
|
}
|
|
string softwareDeviceNumber = Shared.SoftwareInformation.software_device_number;
|
List<string> ret = new List<string>();
|
PlsToolTipWin cameraRuningDialog = null;
|
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC))
|
{
|
|
}
|
else
|
{
|
// 获取挑菌信息
|
string strBacteriaids = methodNode.SelectSingleNode("bacteriaids").InnerText; // 挑菌的种类
|
Bacteria bacteriaInfo = bacteriaBll.GetABacteria(strBacteriaids);
|
|
if (!launchView.isRemotingOper)
|
{
|
// 单机运行时,更新 挑菌下发参数.xls
|
dtChoiceParams = DoUpdateChoiceMode(methodNode, filePath, bacteriaInfo);
|
}
|
else
|
{
|
dtChoiceParams = ExcelAndCsvHelper.GetDataTableFromExcelFile(filePath, true);
|
}
|
|
takePhotoBll.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
#endregion
|
|
#region 调用执行
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackingPhoto.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: The action of camera is executing...");
|
}
|
|
|
|
launchView.SetWaitOne();//暂停
|
|
if (!launchView.isRemotingOper)
|
{
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
string strMsg = string.Empty;
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
strMsg = Properties.TackPhotoResource.strTackingPhoto.ToString();
|
}
|
else
|
{
|
strMsg = "The action of camera is executing...";
|
}
|
|
cameraRuningDialog = new PlsToolTipWin(strMsg);
|
cameraRuningDialog.Height = 200;
|
cameraRuningDialog.Width = 520;
|
|
SolidColorBrush mybtn2_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0, 0, 0, 0));
|
cameraRuningDialog.Background = (System.Windows.Media.Brush)mybtn2_Brush;
|
cameraRuningDialog.btnCancel.Visibility = Visibility.Collapsed;
|
cameraRuningDialog.btnOK.Visibility = Visibility.Collapsed;
|
cameraRuningDialog.btnClose.Visibility = Visibility.Collapsed;
|
cameraRuningDialog.Show();
|
|
if (!isSimulator)
|
{
|
takephotoTime = DateTime.Now;
|
ret = takePhotoBll.ExecuteTakePhoto(methodNode, dtChoiceParams, softwareDeviceNumber, bacteriaInfo, isSimulator);
|
}
|
else
|
{
|
Thread.Sleep(3000);
|
}
|
|
// 推迟关闭拍照运行页面
|
//cameraRuningDialog.Close();
|
}));
|
}
|
else
|
{
|
ret = takePhotoBll.ExecuteTakePhoto(methodNode, dtChoiceParams, softwareDeviceNumber, bacteriaInfo, isSimulator);
|
}
|
}
|
|
OperateDialog plsConfirmOper = null;
|
if (ret.Count == 0 && !isSimulator)
|
{
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
if (cameraRuningDialog != null)
|
{
|
cameraRuningDialog.Close();
|
}
|
}));
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackPhotoError.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: Take photo was failed! No action!");
|
}
|
|
if (launchView.isRemotingOper)
|
{
|
result = false;
|
}
|
else
|
{
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
{
|
plsConfirmOper = new OperateDialog(strCurrentCulture.Equals("zh-CN") ? Properties.TackPhotoResource.strFailWhatToDo : "takePhoto are fail! What do you want to do?");
|
plsConfirmOper.ShowDialog();
|
}));
|
}
|
|
if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Cancel) // 1:终止
|
{
|
result = false;
|
}
|
else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Retry) // 2:重试
|
{
|
// 本方法
|
result = ExecuteTakePhoto(xmlEnv, methodNode, isSimulator);
|
}
|
else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Continue) // 3:跳过继续执行
|
{
|
result = true;
|
}
|
|
return result;
|
}
|
else
|
{
|
if (ret.Count == 1)
|
{
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
if (cameraRuningDialog != null)
|
{
|
cameraRuningDialog.Close();
|
}
|
}));
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackPhotoError.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: Take photo was failed! Data miss!");
|
}
|
|
if (launchView.isRemotingOper)
|
{
|
result = false;
|
}
|
else
|
{
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
{
|
plsConfirmOper = new OperateDialog(strCurrentCulture.Equals("zh-CN") ? Properties.TackPhotoResource.strFailWhatToDo : "takePhoto are fail! What do you want to do?");
|
plsConfirmOper.ShowDialog();
|
}));
|
}
|
|
if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Cancel) // 1:终止
|
{
|
result = false;
|
}
|
else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Retry) // 2:重试
|
{
|
// 本方法
|
result = ExecuteTakePhoto(xmlEnv, methodNode, isSimulator);
|
}
|
else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Continue) // 3:跳过继续执行
|
{
|
result = true;
|
}
|
return result;
|
}
|
else if (ret.Count == 2 || isSimulator)
|
{
|
int iType = 5;
|
int iMethodStatus = 2;
|
JObject jobFinish = null;
|
|
if (!isSimulator)
|
{
|
// 检查Data是否报错
|
string finishSrc = ret[1];
|
string finish = finishSrc.Replace("#!HxSEP!#", "");
|
LoggerHelper.DebugLog(string.Format("[TakePhotoControl][ExecuteTakePhoto]: finishResponse = {0}", finish));
|
jobFinish = JObject.Parse(finish);
|
iType = Convert.ToInt32(jobFinish["message_type"].ToString());
|
iMethodStatus = Convert.ToInt32(jobFinish["method_status"].ToString());
|
|
if (iMethodStatus == 3) // Failed
|
{
|
LoggerHelper.DebugLog("[TakePhotoControl][ExecuteTakePhoto]: iMethodStatus == 3");
|
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
if (cameraRuningDialog != null)
|
{
|
cameraRuningDialog.Close();
|
}
|
}));
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackPhotoError.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: Take photo was failed! Data error!");
|
}
|
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
plsConfirmOper = new OperateDialog(strCurrentCulture.Equals("zh-CN") ? Properties.TackPhotoResource.strFailWhatToDo : "takePhoto are fail! What do you want to do?");
|
plsConfirmOper.ShowDialog();
|
}));
|
|
if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Cancel) // 1:终止
|
{
|
result = false;
|
}
|
else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Retry) // 2:重试
|
{
|
// 本方法
|
result = ExecuteTakePhoto(xmlEnv, methodNode, isSimulator);
|
}
|
else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Continue) // 3:跳过继续执行
|
{
|
result = true;
|
}
|
return result;
|
}
|
}
|
|
#region 返回的消息数据处理,下载文件到本地路径下
|
if (iType == 5 && iMethodStatus == 2) // Finish ComPleted
|
{
|
string jsonFilePath = ConfigurationManager.AppSettings["captureFilePath"].ToString();
|
string fullImageFileName = string.Empty;
|
string fullJsonFileName = string.Empty;
|
string originalImageFileName = string.Empty;
|
|
fullImageFileName = jsonFilePath + "\\Simulator.jpg";
|
fullJsonFileName = jsonFilePath + "\\Simulator.json";
|
originalImageFileName = jsonFilePath + "\\Simulator_原.jpg";
|
|
#region 模拟运行下不下载,真机运行下载
|
if (!isSimulator)
|
{
|
//拍照命令下发后,执行完成了
|
string jsonURL = jobFinish["data"]["json"].ToString();
|
string imageURL = jobFinish["data"]["image"].ToString();
|
string originalImg = jobFinish["data"]["original"].ToString();
|
launchView.captureData = jobFinish["data"].ToString();
|
LoggerRunHelper.InfoLog(launchView.captureData.ToString());
|
LoggerRunHelper.InfoLog(jsonURL.ToString());
|
LoggerRunHelper.InfoLog(imageURL.ToString());
|
LoggerRunHelper.InfoLog(originalImg.ToString());
|
if (!Directory.Exists(jsonFilePath))
|
{
|
Directory.CreateDirectory(jsonFilePath);
|
}
|
//获取目录下文件的最大名称值
|
string[] files = Directory.GetFiles(jsonFilePath);
|
int fiMax = 0;
|
|
FileInfo fileInfo = null;
|
foreach (string f in files)
|
{
|
// 防止文件全路径包含【.】的情况
|
fileInfo = new FileInfo(f);
|
string f1 = fileInfo.Name.Split('.')[0];
|
if (f1.Contains("_原"))
|
{
|
continue;
|
}
|
try
|
{
|
|
int fileNameNum = Convert.ToInt32(f1);
|
if (fileNameNum > fiMax)
|
{
|
fiMax = fileNameNum;
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
LoggerHelper.DebugLog("[TakePhotoControl][ExecuteTakePhoto]: Download Start");
|
using (WebClient client = new WebClient())
|
{
|
if (!isSimulator)
|
{
|
if (Directory.Exists(jsonFilePath))
|
{
|
fullJsonFileName = jsonFilePath + "\\" + (fiMax + 1).ToString() + ".json";
|
if (File.Exists(fullJsonFileName))
|
{
|
File.Delete(fullJsonFileName);
|
}
|
client.DownloadFile(jsonURL, fullJsonFileName);
|
}
|
}
|
|
if (!isSimulator)
|
{
|
if (Directory.Exists(jsonFilePath))
|
{
|
fullImageFileName = jsonFilePath + "\\" + (fiMax + 1).ToString() + ".jpg";
|
if (File.Exists(fullImageFileName))
|
{
|
File.Delete(fullImageFileName);
|
}
|
|
client.DownloadFile(imageURL, fullImageFileName);
|
}
|
}
|
|
if (!isSimulator)
|
{
|
if (Directory.Exists(jsonFilePath))
|
{
|
originalImageFileName = jsonFilePath + "\\" + (fiMax + 1).ToString() + "_原.jpg";
|
if (File.Exists(originalImageFileName))
|
{
|
File.Delete(originalImageFileName);
|
}
|
|
client.DownloadFile(originalImg, originalImageFileName);
|
}
|
}
|
}
|
LoggerHelper.DebugLog("[TakePhotoControl][ExecuteTakePhoto]: Download End");
|
|
}
|
#endregion
|
|
ObservableCollection<BacteriaCoordinateEx> bacteriaCoordinates = new ObservableCollection<BacteriaCoordinateEx>();
|
if (!launchView.isRemotingOper)
|
{
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
bacteriaCoordinates = DataModule.getInstance().GetBacteriaCoordinateList(fullJsonFileName);
|
}));
|
}
|
else
|
{
|
bacteriaCoordinates = DataModule.getInstance().GetBacteriaCoordinateList(fullJsonFileName);
|
}
|
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
if (cameraRuningDialog != null)
|
{
|
cameraRuningDialog.Close();
|
}
|
}));
|
|
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC))
|
{
|
LoggerHelper.DebugLog(string.Format("[TakePhotoControl][ExecuteTakePhoto]: 拍照识别到的切胶点个数 == {0}", bacteriaCoordinates.Count));
|
ManualPickGum manualPickGum = null;
|
if (bacteriaCoordinates.Count == 0)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackPhotoNoDataForCutGum.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: Can't get any cut point!Please check the camera system!");
|
}
|
|
result = false;
|
launchView.captureData = string.Empty;
|
|
if (launchView.isRemotingOper)
|
{
|
ExperimentRunChoiceBacteraModel model = new ExperimentRunChoiceBacteraModel();
|
model.RunChoiceBacteraId = ComUtility.GetGuid();
|
model.ExperimentId = Shared.Exp.ExperimentId;
|
model.SourceBarcode = dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = Convert.ToInt32(dtChoiceParams.Rows[9]["属性值"].ToString());
|
string choicemode = dtChoiceParams.Rows[9]["属性值"].ToString(); // 1:人工挑选菌落;0:成像系统自动挑选菌落
|
|
}
|
else
|
{
|
// 0件继续做下一个皿
|
ExperimentRunChoiceBacteraModel model = new ExperimentRunChoiceBacteraModel();
|
model.RunChoiceBacteraId = ComUtility.GetGuid();
|
model.ExperimentId = Shared.Exp.ExperimentId;
|
model.SourceBarcode = dtChoiceParams==null?"": dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = dtChoiceParams == null ? 1 : Convert.ToInt32(dtChoiceParams.Rows[9]["属性值"].ToString()); // 识别方法:0:成像系统自动挑选菌落; 1:人工挑选菌落
|
|
result = true;
|
// 成像0件 && 单机运行时
|
// 人工挑:表示挑菌页面;自动挑:不表示挑菌页面
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
manualPickGum = new ManualPickGum(originalImageFileName, fullImageFileName, fullJsonFileName, isSimulator);
|
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
|
manualPickGum.Background = (System.Windows.Media.Brush)mybtn1_Brush;
|
manualPickGum.isSimulator = isSimulator;
|
manualPickGum.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
manualPickGum.launchView = launchView;
|
manualPickGum.expRunChoiceBactera = model;
|
manualPickGum.methodNode = methodNode;
|
manualPickGum.dtChoiceParams = dtChoiceParams;
|
manualPickGum.Height = Shared.Config.DisplaySizeH;
|
manualPickGum.Width = Shared.Config.DisplaySizeW;
|
manualPickGum.ShowDialog();
|
}));
|
}
|
}
|
else
|
{
|
ExperimentRunChoiceBacteraModel model = new ExperimentRunChoiceBacteraModel();
|
model.RunChoiceBacteraId = ComUtility.GetGuid();
|
model.ExperimentId = Shared.Exp.ExperimentId;
|
|
int choicemode = dtChoiceParams == null ? 1 : Convert.ToInt32(dtChoiceParams.Rows[9]["属性值"].ToString()); // 1:人工挑选菌落;0:成像系统自动挑选菌落
|
if (choicemode == EnumManagement.GetEnumValue(IdentificationEnum.Manual)) // 人工挑选菌落
|
{
|
model.SourceBarcode = dtChoiceParams == null ? "" : dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = choicemode;
|
if (!launchView.isRemotingOper)
|
{
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
manualPickGum = new ManualPickGum(originalImageFileName, fullImageFileName, fullJsonFileName, isSimulator);
|
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
|
manualPickGum.Background = (System.Windows.Media.Brush)mybtn1_Brush;
|
manualPickGum.isSimulator = isSimulator;
|
manualPickGum.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
manualPickGum.launchView = launchView;
|
manualPickGum.expRunChoiceBactera = model;
|
manualPickGum.methodNode = methodNode;
|
manualPickGum.dtChoiceParams = dtChoiceParams;
|
manualPickGum.Height = Shared.Config.DisplaySizeH;
|
manualPickGum.Width = Shared.Config.DisplaySizeW;
|
manualPickGum.ShowDialog();
|
}));
|
}
|
else
|
{
|
manualPickGum = new ManualPickGum(originalImageFileName, fullImageFileName, fullJsonFileName, isSimulator);
|
manualPickGum.Height = Shared.Config.DisplaySizeH;
|
manualPickGum.Width = Shared.Config.DisplaySizeW;
|
manualPickGum.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
manualPickGum.isSimulator = isSimulator;
|
manualPickGum.launchView = launchView;
|
manualPickGum.expRunChoiceBactera = model;
|
manualPickGum.isRemotingOper = true;
|
manualPickGum.methodNode = methodNode;
|
manualPickGum.dtChoiceParams = dtChoiceParams;
|
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
|
manualPickGum.Background = (System.Windows.Media.Brush)mybtn1_Brush;
|
manualPickGum.ShowDialog();
|
}
|
|
if (manualPickGum.cancelFlg)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackPhotoCancelled.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: Process canceled!");
|
}
|
|
result = false;
|
return result;
|
}
|
}
|
else if (choicemode == EnumManagement.GetEnumValue(IdentificationEnum.Auto)) // 成像系统自动挑选菌落
|
{
|
// 直接返回所有字符串给中控
|
// 获取拍照json文件里的数据条数入库
|
countOfAutoanalysis = bacteriaCoordinates.Count;
|
if (launchView != null)
|
{
|
model.SourceBarcode = dtChoiceParams == null ? "" : dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = choicemode;
|
model.CountAutoAnalysis = countOfAutoanalysis;
|
model.CountManualChoice = countOfManualchoice;
|
model.CountManualDelete = countOfManualdelete;
|
model.CountCoating = countOfoating;
|
ExperimentRunChoiceBacteraDB.Add(model);
|
}
|
}
|
}
|
}
|
else
|
{
|
LoggerHelper.DebugLog(string.Format("[TakePhotoControl][ExecuteTakePhoto]: 拍照识别到的菌落个数 == {0}", bacteriaCoordinates.Count));
|
ManualPickBacteria manualPickBacteria = null;
|
if (bacteriaCoordinates.Count == 0)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackPhotoNoData.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: Can't get any bacteria!Please check the camera system!");
|
}
|
|
result = false;
|
launchView.captureData = string.Empty;
|
|
if (launchView.isRemotingOper)
|
{
|
ExperimentRunChoiceBacteraModel model = new ExperimentRunChoiceBacteraModel();
|
model.RunChoiceBacteraId = ComUtility.GetGuid();
|
model.ExperimentId = Shared.Exp.ExperimentId;
|
model.SourceBarcode = dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = Convert.ToInt32(dtChoiceParams.Rows[9]["属性值"].ToString());
|
string choicemode = dtChoiceParams.Rows[9]["属性值"].ToString(); // 1:人工挑选菌落;0:成像系统自动挑选菌落
|
|
#region Del
|
//if (choicemode == "1" &&
|
// Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceChoice) // 人工挑选菌落
|
//{
|
// manualPickBacteria = new ManualPickBacteria(originalImageFileName, fullImageFileName, fullJsonFileName, isSimulator);
|
// manualPickBacteria.WindowStartupLocation = WindowStartupLocation.CenterScreen;
|
// //manualPickBacteria.Topmost = true;
|
// SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
|
// manualPickBacteria.Background = (System.Windows.Media.Brush)mybtn1_Brush;
|
// manualPickBacteria.isSimulator = isSimulator;
|
// manualPickBacteria.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
// manualPickBacteria.launchView = launchView;
|
// manualPickBacteria.experimentRunChoiceBactera = experimentRunChoiceBactera;
|
// manualPickBacteria.isRemotingOper = launchView.isRemotingOper;
|
// manualPickBacteria.methodNode = methodNode;
|
// manualPickBacteria.dtChoiceParams = dtChoiceParams;
|
// manualPickBacteria.Height = 1024;
|
// manualPickBacteria.Width = 1920;
|
// manualPickBacteria.ShowDialog();
|
//}
|
//else if (choicemode != "1" &&
|
// Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceChoice) // 自动挑选菌落
|
//{
|
// result = false;
|
// launchView.captureData = string.Empty;
|
// return result;
|
//}
|
#endregion
|
}
|
else
|
{
|
// 0件继续做下一个皿
|
ExperimentRunChoiceBacteraModel model = new ExperimentRunChoiceBacteraModel();
|
model.RunChoiceBacteraId = ComUtility.GetGuid();
|
model.ExperimentId = Shared.Exp.ExperimentId;
|
model.SourceBarcode = dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = Convert.ToInt32(dtChoiceParams.Rows[9]["属性值"].ToString()); // 识别方法:0:成像系统自动挑选菌落; 1:人工挑选菌落
|
|
result = true;
|
// 成像0件 && 单机运行时
|
// 人工挑:表示挑菌页面;自动挑:不表示挑菌页面
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
manualPickBacteria = new ManualPickBacteria(originalImageFileName, fullImageFileName, fullJsonFileName, isSimulator);
|
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
|
manualPickBacteria.Background = (System.Windows.Media.Brush)mybtn1_Brush;
|
manualPickBacteria.isSimulator = isSimulator;
|
manualPickBacteria.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
manualPickBacteria.launchView = launchView;
|
manualPickBacteria.expRunChoiceBactera = model;
|
manualPickBacteria.methodNode = methodNode;
|
manualPickBacteria.dtChoiceParams = dtChoiceParams;
|
manualPickBacteria.Height = Shared.Config.DisplaySizeH;
|
manualPickBacteria.Width = Shared.Config.DisplaySizeW;
|
manualPickBacteria.ShowDialog();
|
}));
|
}
|
}
|
else
|
{
|
ExperimentRunChoiceBacteraModel model = new ExperimentRunChoiceBacteraModel();
|
model.RunChoiceBacteraId = ComUtility.GetGuid();
|
model.ExperimentId = Shared.Exp.ExperimentId;
|
|
int choicemode = Convert.ToInt32(dtChoiceParams.Rows[9]["属性值"].ToString()); // 1:人工挑选菌落;0:成像系统自动挑选菌落
|
if (choicemode == EnumManagement.GetEnumValue(IdentificationEnum.Manual)) // 人工挑选菌落
|
{
|
model.SourceBarcode = dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = choicemode;
|
if (!launchView.isRemotingOper)
|
{
|
Application.Current.Dispatcher.Invoke(new Action(() =>
|
{
|
manualPickBacteria = new ManualPickBacteria(originalImageFileName, fullImageFileName, fullJsonFileName, isSimulator);
|
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
|
manualPickBacteria.Background = (System.Windows.Media.Brush)mybtn1_Brush;
|
manualPickBacteria.isSimulator = isSimulator;
|
manualPickBacteria.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
manualPickBacteria.launchView = launchView;
|
manualPickBacteria.expRunChoiceBactera = model;
|
manualPickBacteria.methodNode = methodNode;
|
manualPickBacteria.dtChoiceParams = dtChoiceParams;
|
manualPickBacteria.Height = Shared.Config.DisplaySizeH;
|
manualPickBacteria.Width = Shared.Config.DisplaySizeW;
|
manualPickBacteria.ShowDialog();
|
}));
|
}
|
else
|
{
|
manualPickBacteria = new ManualPickBacteria(originalImageFileName, fullImageFileName, fullJsonFileName, isSimulator);
|
manualPickBacteria.Height = Shared.Config.DisplaySizeH;
|
manualPickBacteria.Width = Shared.Config.DisplaySizeW;
|
manualPickBacteria.socketTcpListener = launchView.mainWindow.socketTcpListener;
|
manualPickBacteria.isSimulator = isSimulator;
|
manualPickBacteria.launchView = launchView;
|
manualPickBacteria.expRunChoiceBactera = model;
|
manualPickBacteria.isRemotingOper = true;
|
manualPickBacteria.methodNode = methodNode;
|
manualPickBacteria.dtChoiceParams = dtChoiceParams;
|
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
|
manualPickBacteria.Background = (System.Windows.Media.Brush)mybtn1_Brush;
|
manualPickBacteria.ShowDialog();
|
}
|
|
if (manualPickBacteria.cancelFlg)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.TackPhotoResource.strTackPhotoCancelled.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: Process canceled!");
|
}
|
|
result = false;
|
return result;
|
}
|
}
|
else if (choicemode == EnumManagement.GetEnumValue(IdentificationEnum.Auto)) // 成像系统自动挑选菌落
|
{
|
// 直接返回所有字符串给中控
|
// 获取拍照json文件里的数据条数入库
|
countOfAutoanalysis = bacteriaCoordinates.Count;
|
if (launchView != null)
|
{
|
model.SourceBarcode = dtChoiceParams.Rows[1]["属性值"].ToString();
|
model.TakePhotoTime = takephotoTime;
|
model.Identification = choicemode;
|
model.CountAutoAnalysis = countOfAutoanalysis;
|
model.CountManualChoice = countOfManualchoice;
|
model.CountManualDelete = countOfManualdelete;
|
model.CountCoating = countOfoating;
|
ExperimentRunChoiceBacteraDB.Add(model);
|
}
|
}
|
}
|
}
|
}
|
#endregion
|
}
|
}
|
#endregion
|
}
|
catch (Exception ex)
|
{
|
LoggerHelper.ErrorLog("ERROR:", ex);
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strError.ToString() + " 源 " + ex.Source + " 错误信息 " + ex.Message + ";");
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】error:source:" + ex.Source + ";error:" + ex.Message + ";");
|
}
|
|
result = false;
|
return result;
|
}
|
return result;
|
}
|
|
/// <summary>
|
/// 单机运行时,作成 挑菌下发参数.xls
|
/// </summary>
|
/// <param name="xmlNode"></param>
|
/// <param name="filePath"></param>
|
/// <param name="bacteriaInfo"></param>
|
/// <returns></returns>
|
private DataTable DoUpdateChoiceMode(XmlNode xmlNode, string filePath, Bacteria bacteriaInfo)
|
{
|
DataTable dtChoiceParams = ExcelAndCsvHelper.GetDataTableFromExcelFile(filePath, true);
|
string strValName = "属性值";
|
|
#region 数据准备
|
// 实验ID
|
dtChoiceParams.Rows[0][strValName] = string.Empty;
|
// 皿的二维码信息
|
dtChoiceParams.Rows[1][strValName] = launchView.choiceBarcode;
|
// 菌名称
|
dtChoiceParams.Rows[2][strValName] = bacteriaInfo.bacteria_name.ToString();
|
// 形状
|
dtChoiceParams.Rows[3][strValName] = bacteriaInfo.bacteria_shape.ToString();
|
// 边缘
|
dtChoiceParams.Rows[4][strValName] = bacteriaInfo.bacteria_edge.ToString();
|
// 颜色
|
dtChoiceParams.Rows[5][strValName] = bacteriaInfo.bacteria_color.ToString();
|
// 最小直径
|
dtChoiceParams.Rows[6][strValName] = bacteriaInfo.bacteria_min_size.ToString();
|
// 最大直径
|
dtChoiceParams.Rows[7][strValName] = bacteriaInfo.bacteria_max_size.ToString();
|
// 临近度
|
dtChoiceParams.Rows[8][strValName] = xmlNode.SelectSingleNode("gapValue").InnerText;
|
// 识别方法:0:成像系统自动挑选菌落;1:人工挑选菌落
|
dtChoiceParams.Rows[9][strValName] = xmlNode.SelectSingleNode("identification").InnerText;
|
// 挑菌距离底部或菌类形
|
dtChoiceParams.Rows[10][strValName] = bacteriaInfo.choice_position.ToString();
|
// 挑菌距离底部或菌类距离
|
dtChoiceParams.Rows[11][strValName] = bacteriaInfo.choice_position_distance.ToString();
|
// 挑菌时x轴偏移量
|
dtChoiceParams.Rows[12][strValName] = bacteriaInfo.choice_xaxis_distance.ToString();
|
// 挑菌时y轴偏移量
|
dtChoiceParams.Rows[13][strValName] = bacteriaInfo.choice_yaxis_distance.ToString();
|
|
// 涂布距离底部距离
|
dtChoiceParams.Rows[14][strValName] = bacteriaInfo.coating_position_distance.ToString();
|
// 涂布时x轴偏移量
|
dtChoiceParams.Rows[15][strValName] = bacteriaInfo.coating_xaxis_distance.ToString();
|
// 涂布时y轴偏移量
|
dtChoiceParams.Rows[16][strValName] = bacteriaInfo.coating_yaxis_distance.ToString();
|
//// 涂布方式:在文件涂布节点更新参数
|
//dtChoiceParams.Rows[17][strValName] = xmlNode.SelectSingleNode("choiceMode").InnerText;
|
// 涂布速度
|
dtChoiceParams.Rows[18][strValName] = float.Parse(ConfigurationManager.AppSettings["coatingSpeed"].ToString());
|
// 模型类型:1:算法1(微牧酵母);2:算法2(普通酵母);3:算法3(酵母背光01);4:算法4(链霉菌)
|
dtChoiceParams.Rows[19][strValName] = bacteriaInfo.model_type.ToString();
|
// 合并识别
|
dtChoiceParams.Rows[20][strValName] = bacteriaInfo.merge_masks.ToString();
|
// 降采样率
|
dtChoiceParams.Rows[21][strValName] = bacteriaInfo.ds_ratio.ToString();
|
// 平均直径
|
dtChoiceParams.Rows[22][strValName] = bacteriaInfo.mean_diam.ToString();
|
// 到边缘距离
|
dtChoiceParams.Rows[23][strValName] = bacteriaInfo.dist_to_edge.ToString();
|
// 菌标记颜色
|
dtChoiceParams.Rows[24][strValName] = bacteriaInfo.mark_color.ToString();
|
// 菌标记序号
|
dtChoiceParams.Rows[25][strValName] = bacteriaInfo.draw_label.ToString();
|
// 菌标记字体大小
|
dtChoiceParams.Rows[26][strValName] = bacteriaInfo.fontsize.ToString();
|
// 顶部背光亮度
|
dtChoiceParams.Rows[27][strValName] = bacteriaInfo.top_light.ToString();
|
// 底部背光亮度
|
dtChoiceParams.Rows[28][strValName] = "0";
|
// 挑菌方式
|
dtChoiceParams.Rows[29][strValName] = "0";
|
// 挑菌时下压距离
|
dtChoiceParams.Rows[30][strValName] = bacteriaInfo.press_distance.ToString();
|
#endregion
|
|
ExcelAndCsvHelper.WriteDataTableToExcelFile(dtChoiceParams, filePath);
|
|
return dtChoiceParams;
|
}
|
#endregion
|
|
#region 获取拍照之后的菌坐标数据-本次拍照后获取的所有菌落点位数据
|
public List<BacteriaCoordinate> GetBacteriasDataInfo(string jsonData)
|
{
|
List<BacteriaCoordinate> bacteriaCoordinates = new List<BacteriaCoordinate>();
|
try
|
{
|
//序列化
|
JObject job = JObject.Parse(jsonData);
|
JArray jArray = (JArray)job["data"]["germList"];
|
|
|
foreach (JToken jt in jArray)
|
{
|
BacteriaCoordinate bacteriaCoordinate = new BacteriaCoordinate();
|
bacteriaCoordinate.bacteriacoordinate_id = jt["index"].ToString();
|
string coordinate3D = string.Empty;
|
coordinate3D = jt["coordinate3D"]["x"].ToString() + "," + jt["coordinate3D"]["y"].ToString() + "," + jt["coordinate3D"]["z"].ToString();
|
bacteriaCoordinate.coordinate_machine = coordinate3D;
|
string coordinatePixel = string.Empty;
|
coordinatePixel = jt["coordinatePixel"]["x"].ToString() + "," + jt["coordinatePixel"]["y"].ToString();
|
bacteriaCoordinate.coordinate_pixel = coordinatePixel;
|
bacteriaCoordinates.Add(bacteriaCoordinate);
|
}
|
|
//gdDatalist.DataContext = bacteriaCoordinates;
|
}
|
catch (Exception ex)
|
{
|
LoggerHelper.ErrorLog("ERROR:", ex);
|
}
|
|
return bacteriaCoordinates;
|
}
|
#endregion
|
}
|
}
|