using AiControlRequest;
using OpenCvSharp;
using PaintDotNet;
using PaintDotNet.Adjust;
using PaintDotNet.Base.CommTool;
using PaintDotNet.Camera;
using PaintDotNet.DbOpreate.DbBll;
using PaintDotNet.DbOpreate.DbModel;
using PaintDotNet.ImageCollect;
using StageController;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AiControlRequest.AiControl;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Metis.AutoAnalysis
{
internal partial class AutoAnalysisDialog : FloatingToolForm, IStageEvent
{
///
/// 样品台展示控件
///
SampleStageControl _samplesControl;
Dictionary _stageSettingList;
SampleStageModel _stageSettingNow;
string _stageSettingName;
///
/// 结果展示控件
///
ScanGridControl _scanGird;
AxisController m_stage;
private double m_PxLength;
Dictionary ResultList = new Dictionary();
String[] infoList;
private RulerPainter m_rulerPainter = new RulerPainter();//画标尺用
private ReportExporter m_reportExporter = new ReportExporter();//输出报表用
private int m_groupIndex = 0; //夹杂物分组序号
private int m_imageIndex = 0; //夹杂物分组内图片序号
private int m_totalImageCount = 0;//需要发送的AI的图片个数
private int m_imageCountToAI = 0;//记录四组会换模式中发送到AI的图片数量
private List m_lstSentFiles = new List();//存放已经发送到AI的文件
private List m_lstWorkDir = new List();
private string m_grabedDirName = "\\grabed";
private string m_cmbProjuctSelectText;
private DataUpload m_dataUpload = new DataUpload();
///
/// 分析设置存储信息
///
protected AutoAnalyzeSettingModel autoAnalyzeSettingModel;
public AutoAnalyzeSettingModel AutoAnalyzeSettingModel
{
get
{
return this.autoAnalyzeSettingModel;
}
set
{
this.autoAnalyzeSettingModel = value;
}
}
protected int ConvertUMToPX(double length)
{
return (int)(length / m_PxLength);
}
protected double ConvertPXToUm(double length)
{
return length * m_PxLength;
}
public int VisionWidthPixel = 2448;
public int VisionHeightPixel = 2048;
public double VisionWidth = 2448;
public double VisionHeight = 2048;
public int NumRow;
public int NumCol;
private AppWorkspace _app;
public string lblResultText;
public AutoAnalysisDialog(AppWorkspace app)
{
LogHelper.log.Debug("Start AutoAnalysisDialog");
_app = app;
InitializeComponent();
Startup.instance.rules.TryGetValue(MeasurementUnit.Micron, out m_PxLength);
_scanGird = new ScanGridControl();
_scanGird.MouseDown += _scanGird_MouseDown;
pnlScanGrid.Controls.Add(_scanGird);
InitSmapleStageControl();
//DirRoot = @"D:\AiTest";//Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
_camera = CameraManager.CurrentCamera;
if (_camera.IsOpen())
{
var size = _camera.Resolution;
VisionWidthPixel = size.Width == 0 ? 1000 : size.Width;
VisionHeightPixel = size.Height == 0 ? 1000 : size.Height;
VisionWidth = ConvertPXToUm(VisionWidthPixel);
VisionHeight = ConvertPXToUm(VisionHeightPixel);
lblImageSize.Text = string.Format("{0:f0}*{1:f0}", VisionWidthPixel, VisionHeightPixel);
}
SetAnalyzeModelFromXml("自动分析");
m_reportExporter.form = this;
}
#region Load Close
private void AutoAnalysisDialog_Load(object sender, EventArgs e)
{
InitializeText();
CameraConfigs.GetInstance().CameraParamInit();
_stageSettingList = SampleStageManager.GetAll();
foreach (var s in _stageSettingList.Keys)
{
if (SampleStageManager.Validation(_stageSettingList[s]))
cmbSampleStageList.Items.Add(s);
}
if (cmbSampleStageList.Items.Count > 0)
cmbSampleStageList.SelectedIndex = 0;
cmbScanMode.SelectedIndex = 0;
cmbAutoFocusParm.SelectedIndex = 0;
tmrUpdateUI.Start();
tmrUpdateUI.Tick += TmrUpdateUI_Tick;
UpdateUserList();
InitStage();
InitOfflineTest();
InitCheckConfig();
CameraManager.FrameCallback += CallbackDraw;
m_dataUpload.ConnectServer();
}
void InitializeText()
{
this.Text = PdnResources.GetString("AutoAnalysis");
grpStage.Text = PdnResources.GetString("AutoAnalysis.Stage");
grpFocus.Text = PdnResources.GetString("AutoAnalysis.FocusSetting");
grpStageInfo.Text = PdnResources.GetString("AutoAnalysis.StageInfo");
grpStageDisplay.Text = PdnResources.GetString("AutoAnalysis.StageSketch");
grpResult.Text = PdnResources.GetString("AutoAnalysis.ResultSketch");
grpRange.Text = PdnResources.GetString("AutoAnalysis.DetectRange");
grpAnalysis.Text = PdnResources.GetString("AutoAnalysis.AnalysisResult");
grpAiOperate.Text = PdnResources.GetString("AutoAnalysis.SameOperate");
grpWorkOperate.Text = PdnResources.GetString("AutoAnalysis.SameOperate");
grpFilePath.Text = PdnResources.GetString("AutoAnalysis.SaveDir");
label1.Text = PdnResources.GetString("AutoAnalysis.StageSelect");
label2.Text = PdnResources.GetString("AutoAnalysis.FocusSelect");
lblUser.Text = PdnResources.GetString("AutoAnalysis.Inspector");
lblInfo.Text = PdnResources.GetString("AutoAnalysis.Info");
label5.Text = PdnResources.GetString("AutoAnalysis.Horizon");
label7.Text = PdnResources.GetString("AutoAnalysis.Vertical");
label6.Text = PdnResources.GetString("AutoAnalysis.Point");
label8.Text = PdnResources.GetString("AutoAnalysis.Point");
label9.Text = PdnResources.GetString("AutoAnalysis.Mode");
label10.Text = PdnResources.GetString("AutoAnalysis.Total");
label12.Text = PdnResources.GetString("AutoAnalysis.CaptureSize");
label14.Text = PdnResources.GetString("AutoAnalysis.DetectSize");
lblDiskUsed.Text = PdnResources.GetString("AutoAnalysis.DiskUsage");
rbtWithoutFocus.Text = PdnResources.GetString("AutoAnalysis.Without");
rbtAutoFocus.Text = PdnResources.GetString("AutoAnalysis.AutoFocus");
rdbStratFormCurrent.Text = PdnResources.GetString("AutoAnalysis.DetectFrom");
rdbOnlyCurrent.Text = PdnResources.GetString("AutoAnalysis.DetectOne");
rdbReplayAll.Text = PdnResources.GetString("AutoAnalysis.DetectAll");
btnAddUser.Text = PdnResources.GetString("AutoAnalysis.Button.Add");
btnDelUser.Text = PdnResources.GetString("AutoAnalysis.Button.Delete");
btnAddInfo.Text = PdnResources.GetString("AutoAnalysis.Button.Add");
btnDelInfo.Text = PdnResources.GetString("AutoAnalysis.Button.Delete");
btnLookBack.Text = PdnResources.GetString("AutoAnalysis.Button.OriginalImage");
btnAnalysis.Text = PdnResources.GetString("AutoAnalysis.Button.ProcessImage");
btnLocate.Text = PdnResources.GetString("AutoAnalysis.Button.LocalCamera");
btnReport.Text = PdnResources.GetString("AutoAnalysis.Button.CreateReport");
btnStart.Text = PdnResources.GetString("AutoAnalysis.Button.Start");
btnStop.Text = PdnResources.GetString("AutoAnalysis.Button.Stop");
btnPreview.Text = PdnResources.GetString("AutoAnalysis.Button.Preview");
btnChangDir.Text = PdnResources.GetString("AutoAnalysis.Button.ChangeDir");
cmbScanMode.Items.Add(PdnResources.GetString("AutoAnalysis.ModeS"));
cmbScanMode.Items.Add(PdnResources.GetString("AutoAnalysis.ModeJump"));
cmbScanMode.Items.Add("回环四组");
//cmbScanMode.Items.Add("回环四组o");
}
int[] _detectParams = new int[3];
private CheckConfigModel _checkconfig;
private void CheckItemChange(string str)
{
for (int i = 0; i < 3; i++)
_detectParams[i] = int.Parse(str.Split(',')[i]);
}
string CheckconfigPath = Application.StartupPath + @"\Automation\checkitem\checkconfig.xml";
private void InitCheckConfig()
{
try
{
_checkconfig = XmlSerializeHelper.Load(CheckconfigPath);
DirRoot = _checkconfig.Path;
cmbProjuctSelect.DropDownStyle = ComboBoxStyle.DropDownList;
foreach (var item in _checkconfig.Items)
{
cmbProjuctSelect.Items.Add(item.Name);
}
cmbProjuctSelect.SelectedIndex = 0;
}
catch
{
MessageBox.Show("请检查\"\\Automation\\checkitem\\checkconfig.xml\"文件是否有错误。", "检测配置文件错误");
}
}
///
/// 更新控件状态
///
private void TmrUpdateUI_Tick(object sender, EventArgs e)
{
grpStage.Enabled = !_isWorking;
grpFocus.Enabled = !_isWorking;
grpStageInfo.Enabled = !_isWorking;
grpStageDisplay.Enabled = !_isWorking;
//grpWorkOperate.Enabled = m_stage.IsOpen; //removed by songxk for test
//grpAiOperate.Enabled = !_isWorking || _pause;
grpRange.Enabled = !_isWorking;
btnLocate.Enabled = !_isWorking & m_stage.IsOpen;
btnLookBack.Enabled = _workDone || _pause;
btnAnalysis.Enabled = _workDone || _pause;
btnReport.Enabled = _workDone;
//btnStart.Text = !_isWorking || _pause ? "开始" : "暂停";
btnStart.Enabled = !_isWorking || _pause ? true : false;//取消暂停
btnStop.Enabled = _isWorking;
cmbProjuctSelect.Enabled = !_isWorking;
if (_isWorking)
{
_resultScanSelect = -1;
}
}
private void AutoAnalysisDialog_FormClosing(object sender, FormClosingEventArgs e)
{
CameraManager.FrameCallback -= CallbackDraw;
StopWork();
//XmlSerializeHelper.Save(_checkconfig, CheckconfigPath);
}
public void InitStage()
{
m_stage = AxisController.GetInstance();
pnlTest.Width = 0;
if (!m_stage.IsOpen)
{
// MessageBox.Show(PdnResources.GetString("Message.AxisController.NotConnected"));
//grpWorkOperate.Enabled = false;
return;
}
m_stage.SetWorkspeedXY();
var dialog = TransferProgressDialog.CreatDialog("平台复位", "复位中...", null, "Stop");
m_stage.ResetStage(
() =>
{
this.Invoke(new Action(dialog.Close));
});
dialog.ShowDialog();
}
#endregion
private void cmbSampleStageList_SelectedIndexChanged(object sender, EventArgs e)
{
_stageSettingNow = _stageSettingList[cmbSampleStageList.Text];
_stageSettingName = cmbSampleStageList.Text;
UpdateSmapleStageControl();
BuildTableList();
var hc = Math.Ceiling(_stageSettingNow.Width * 1000 / VisionWidth);
var vc = Math.Ceiling(_stageSettingNow.Height * 1000 / VisionHeight);
nupHorizon.Value = (decimal)Math.Max(hc, 1);
nupVertical.Value = (decimal)Math.Max(vc, 1);
//Add by shayg 20220718 start
SetBasePointsComboBox(hc, vc);
//Add by shayg 20220718 end
ClearResult();
}
//Add by shayg 20220718 start
private void SetBasePointsComboBox(double hcount, double vcount)
{
var selectIndex = cmbFocusCount.SelectedIndex;
cmbFocusCount.Items.Clear();
if (hcount <= 1 || vcount <= 1)
{
rbtFocusForecast.Checked = false;
rbtFocusForecast.Enabled = false;
return;
}
if (hcount >= 2 && vcount >= 2)
{
rbtFocusForecast.Enabled = true;
cmbFocusCount.Items.Add(3);
}
if (hcount >= 3 && vcount >= 3)
cmbFocusCount.Items.Add(5);
if (hcount >= 5 && vcount >= 5)
cmbFocusCount.Items.Add(9);
if (cmbFocusCount.Items.Count > 0 && selectIndex < 0 || selectIndex >= cmbFocusCount.Items.Count)
{
cmbFocusCount.SelectedIndex = cmbFocusCount.Items.Count - 1;
}
else
{
cmbFocusCount.SelectedIndex = selectIndex;
}
}
private void rbtFocusForecast_CheckedChanged(object sender, EventArgs e)
{
cmbFocusCount.Enabled = rbtFocusForecast.Checked;
}
//Add by shayg 20220718 end
#region ScanGrid Display
private void nupHorizon_ValueChanged(object sender, EventArgs e)
{
var colN = (int)nupHorizon.Value;
var rowN = (int)nupVertical.Value;
if (colN != 0 && rowN != 0)
UpdateScanGrid(colN, rowN);
else { return; }
var width = ConvertUMToPX(_stageSettingNow.Width * 1000 / colN);
var height = ConvertUMToPX(_stageSettingNow.Height * 1000 / rowN);
lblStageSize.Text = string.Format("{0:f0}*{1:f0}", width, height);
//Add by shayg 20220718 start
SetBasePointsComboBox(colN, rowN);
//Add by shayg 20220718 end
}
private void UpdateScanGrid(int c, int r)
{
lblTotal.Text = (c * r).ToString();
NumCol = c;
NumRow = r;
_scanGird.NumCol = c;
_scanGird.NumRow = r;
_scanGird.VsnWitch = VisionWidth;
_scanGird.VsnHeight = VisionHeight;
_scanGird.InitGrid(_stageSettingNow);
}
private void _scanGird_MouseDown(object sender, MouseEventArgs e)
{
_resultLookId = _scanGird.GetHitId(e.X, e.Y);
_resultScanSelect = _scanGird.GetIndex(e.X, e.Y);
ShowResult();
}
#endregion
#region SampleStage
void InitSmapleStageControl()
{
_samplesControl = new SampleStageControl();
_samplesControl.OnSelectChanged += (value) =>
{
UpdateInfoTable(value);
// if (_workDone)
UpdateScanGridByResult(value);
};
pnlStageDisplay.Controls.Add(_samplesControl);
}
private void UpdateSmapleStageControl()
{
_samplesControl.Update(_stageSettingNow);
}
private void ResetSmapleState()
{
for (int i = 0; i < _tables.Length; i++)
{
var table = _tables[i];
if (table == null)
_samplesControl.SetState(i, 0);
else
_samplesControl.SetState(i, 1);
}
}
#endregion
#region User
List _userList;
private void UpdateUserList()
{
cmbUser.Items.Clear();
_userList = SampleStageManager.GetUsers();
foreach (var s in _userList) cmbUser.Items.Add(s);
if (cmbUser.Items.Count > 0)
cmbUser.SelectedIndex = 0;
}
private void btnAddUser_Click(object sender, EventArgs e)
{
var form = new AddUser() { CallOK = AddUser };
form.TopMost = true;
form.ShowDialog();
}
private void AddUser(string s)
{
if (_userList.Contains(s))
return;
_userList.Insert(0, s);
SampleStageManager.SaveUsers(_userList);
UpdateUserList();
}
private void DelUser(string s)
{
_userList.Remove(s);
SampleStageManager.SaveUsers(_userList);
UpdateUserList();
}
private void btnDelUser_Click(object sender, EventArgs e)
{
DelUser(cmbUser.Text);
}
#endregion
#region Information
string[] _infos;
DataTable[] _tables;
char _spliter = ';';
string GetUser()
{
return cmbUser.Text;
}
void BuildTableList()
{
dgvStageInfo.DataSource = null;
_tables = new DataTable[_stageSettingNow.WorkPoits.Count];
_infos = new string[_stageSettingNow.WorkPoits.Count];
}
private void txbInfo_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
btnAddInfo_Click(null, null);
}
}
private void btnAddInfo_Click(object sender, EventArgs e)
{
if (!_tables.Any((t) => t == null))
{
MessageBox.Show("所有工位已经添加完成");
return;
}
var user = GetUser();
if (string.IsNullOrEmpty(user))
{
MessageBox.Show("请先添加检测员。");
return;
}
//var infostr = txbInfo.Text;
//if (string.IsNullOrEmpty(infostr)) return;
//txbInfo.Text = "";
//infoList = infostr.Split(_spliter);
var sampleEditSelect = _tables.ToList().FindIndex((t) => t == null);
_samplesControl.SelectIndex = sampleEditSelect;
var table = new DataTable();
table.Columns.Add("工位 ", typeof(string));
table.Columns.Add("检测项目 ", typeof(string));
table.Columns.Add("检验批号 ", typeof(string));
table.Columns.Add("试批顺序号 ", typeof(string));
table.Columns.Add("试样号 ", typeof(string));
table.Columns.Add("收样时间", typeof(string));
table.Columns.Add("牌号(钢级)", typeof(string));
table.Columns.Add("检测 ", typeof(bool));
table.Columns.Add("结果 ", typeof(string));
table.Columns.Add("检测员 ", typeof(string));
SelectSampleInfo frm = new SelectSampleInfo();
var dr = frm.ShowDialog();
if (dr != DialogResult.OK)
return;
var row = table.NewRow();
row[0] = "#" + (sampleEditSelect + 1);
int j = 1;
row[j++] = frm.TESTCODE;
row[j++] = frm.SAMPLELOTNO;
row[j++] = frm.SAMPLEID;
row[j++] = frm.FD_SAMPLE_NO;
row[j++] = frm.RECVTIME;
row[j++] = frm.FD_SG_SIGN;
row[j++] = true;
row[j++] = "";
row[j++] = user;
table.Rows.Add(row);
_tables[sampleEditSelect] = table;
//_infos[sampleEditSelect] = infostr;
_samplesControl.SetState(sampleEditSelect, 1);
UpdateInfoTable(sampleEditSelect);
}
private void UpdateInfoTable(int i)
{
var table = _tables[i];
dgvStageInfo.DataSource = table;
}
private void btnDelInfo_Click(object sender, EventArgs e)
{
if (_samplesControl.SelectIndex < 0) return;
var i = _samplesControl.SelectIndex;
_tables[i] = null;
_infos[i] = null;
dgvStageInfo.DataSource = null;
_samplesControl.SetState(i, 0);
}
private bool IsCheck(int id)
{
return (bool)dgvStageInfo.Rows[id].Cells[2].Value;
}
#endregion
#region Work
int _workSampleIndex;
int _workScanIndex;
bool _isWorking;
bool _pause = false;
bool _workDone;
bool _isOnce = false;
bool _restart = false;
ResultModel _resultWorking;
///
/// 聚焦间隔
///
int _focusInterval = 1;
///
/// 蛇形扫描: 0:连续,1:间隔
///
int _mode = 0;
private void btnStart_Click(object sender, EventArgs e)
{
if (cmbScanMode.SelectedIndex == 2)
{
int hVal = (int)nupHorizon.Value;
int vVal = (int)nupVertical.Value;
if (hVal % 2 != 0)
{
MessageBox.Show("请将横向设定为偶数");
return;
}
if (vVal % 2 != 0)
{
MessageBox.Show("请将纵向设定为偶数");
return;
}
}
if (string.IsNullOrEmpty(_dirRoot))
{
MessageBox.Show("请选择");
return;
}
var str = cmbProjuctSelect.Text;
if (string.IsNullOrEmpty(str))
{
MessageBox.Show("检测项目不能为空");
return;
}
m_cmbProjuctSelectText = str;
var item = _checkconfig.Items.First((i) => i.Name == str);
CheckItemChange(item.Value);
var table = _tables[0];
if (table == null)
{
MessageBox.Show("请添加样品信息。");
return;
}
var hasCheck = false;
for (int i = 0; i < table.Rows.Count; i++)
{
hasCheck |= (bool)table.Rows[i][7];
}
if (!hasCheck)
{
MessageBox.Show("请选择检测项。");
return;
}
if (!_isWorking)
{
StartWork();
}
else
{
if (_pause)
{
_restart = rdbReplayAll.Checked;
_isWorking = !_restart;
}
else
{
}
_pause = !_pause;
}
_isOnce = rdbOnlyCurrent.Checked;
}
private void btnStop_Click(object sender, EventArgs e)
{
StopWork();
}
private void StartWork()
{
m_lstSentFiles.Clear();
m_totalImageCount = 0;
m_imageCountToAI = 0;
_workSampleIndex = 0;
_workScanIndex = 0;
_resultCmpAll = new List();
_resultList = new List();
NewWorkDir();
InitAi(_dirCurrent);
Directory.Delete(_dirCurrent);
_isWorking = true;
ResetSmapleState();
//Add by shayg 20220718 start
scanMode = cmbScanMode.SelectedIndex;
if (cmbFocusCount.SelectedItem != null)
{
int.TryParse(cmbFocusCount.SelectedItem.ToString(), out focusCount);
}
//Add by shayg 20220718 end
new Thread(Runtime).Start();
}
private void PauseWork()
{
_pause = true;
}
private void StopWork()
{
AutoFocusWorkflow.Stop();
_pause = false;
_isWorking = false;
}
private void Runtime()
{
Console.WriteLine("In to work runtime");
m_lstWorkDir.Clear();
while (_isWorking)
{
while (_pause)
{
Thread.Sleep(50);
if (!_isWorking) break;
}
//Delete by shayg 20220718 start
//ToWorkStartPoint(_workSampleIndex);
//Delete by shayg 20220718 end
NewWorkDir();
m_lstWorkDir.Add(_dirCurrent);
aicontrol.GradePaht = _dirCurrent;
var rule = Startup.instance.ruleDB;
if (rule != null)
{
int mul = (int)rule.gain_multiple;
double umperpx = (double)(rule.physical_length / (decimal)rule.pixel_length);
// aicontrol.StartAndSetGradeParam(catagoryParam.Inclusion, itemParam.Inclusion, jsonParam.InclusionALL, mul, umperpx);
aicontrol.StartAndSetGradeParam((catagoryParam)_detectParams[0], (itemParam)_detectParams[1], (jsonParam)_detectParams[2], mul, umperpx);
}
else
{
aicontrol.StartAndSetGradeParam((catagoryParam)_detectParams[0], (itemParam)_detectParams[1], (jsonParam)_detectParams[2], 1, 1);
}
_samplesControl.SetState(_workSampleIndex, 2);
_scanGird.Reset();
//Add by shayg 20220718 start
if (rbtFocusForecast.Checked)
{
GenerateFocalPlanes(() => _imgNow, 3, _dirCurrent);
}
ToWorkStartPoint(_workSampleIndex);
//Add by shayg 20220718 end
//Scan
ScanSampleWorkflow();
LogHelper.log.Debug("扫描样品结束");
if (!_isWorking)
{
LogHelper.log.Debug("点击了停止,退出");
break;
}
_samplesControl.SetState(_workSampleIndex, 3);
_resultFlag = _workSampleIndex + 1;
EndGrade(_workSampleIndex);
if (_workSampleIndex < _stageSettingNow.WorkPoits.Count - 1)
ToWorkStartPoint(_workSampleIndex + 1);
LogHelper.log.Debug("等待所有AI处理结束...");
WaitAiCompleteAll();
LogHelper.log.Debug("AI已经结束");
_workSampleIndex++;
if (_workSampleIndex >= _stageSettingNow.WorkPoits.Count) break;
}
Console.WriteLine("Out of work runtime.");
if(_isWorking)
{
//点停止按钮的时候不做这些处理
if (chkAutoUpload.Checked)
{
UploadData();
}
this.Invoke(new Action(() =>
{
PrintReport(true);
}));
}
//当全部扫码完成退出循环,_isWorking依然为true,则认为完成
_workDone = _isWorking;
StopWork();
if (_restart)
{
_restart = false;
StartWork();
}
}
//Add by shayg 20220718 start
#region 聚焦补偿,焦平面创建
private int scanMode;
private int focusCount;
private FocalPlanes3D focalPlanes;
private void SetScanGridVision(int index)
{
if (scanMode == 0)
{
_scanGird.VisionAt(index);
}
}
private bool GenerateFocalPlanes(Func currentImage, int windowLength, string dirCurrent)
{
if (NumCol <= 1 || NumRow <= 1 || focusCount < 3)
{
focalPlanes = null;
}
m_stage.WaitMoveDone();
var startPoint = GetWorkStartPoint(_workSampleIndex);
if (focusCount == 3)
{
var focusPoints = GetFocusPoints3();
if (focusPoints != null && focusPoints.Count == 3)
{
SetScanGridVision(focusPoints[0].ScanIndex);
m_stage.To(startPoint.X + focusPoints[0].TotalOffx, startPoint.Y + focusPoints[0].TotalOffy);
m_stage.WaitMoveDone();
var focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent);
var point1 = new Point3D(startPoint.X + focusPoints[0].TotalOffx, -(startPoint.Y + focusPoints[0].TotalOffy), (float)focusImage.Z);
if (!_isWorking)
return false;
SetScanGridVision(focusPoints[1].ScanIndex);
m_stage.To(startPoint.X + focusPoints[1].TotalOffx, startPoint.Y + focusPoints[1].TotalOffy);
m_stage.WaitMoveDone();
focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent);
var point2 = new Point3D(startPoint.X + focusPoints[1].TotalOffx, -(startPoint.Y + focusPoints[1].TotalOffy), (float)focusImage.Z);
if (!_isWorking)
return false;
SetScanGridVision(focusPoints[2].ScanIndex);
m_stage.To(startPoint.X + focusPoints[2].TotalOffx, startPoint.Y + focusPoints[2].TotalOffy);
m_stage.WaitMoveDone();
focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent);
var point3 = new Point3D(startPoint.X + focusPoints[2].TotalOffx, -(startPoint.Y + focusPoints[2].TotalOffy), (float)focusImage.Z);
focalPlanes = new FocalPlanes3D(point1, point2, point3);
}
return true;
}
else
{
var focusPoints = GetFocusPoints5Or9(focusCount);
if (focusPoints != null && focusPoints.Count >= 5)
{
double x, y;
Point3D center = null;
var points = new List();
for (int i = 0; i < focusPoints.Count; i++)
{
SetScanGridVision(focusPoints[i].ScanIndex);
x = startPoint.X + focusPoints[i].TotalOffx;
y = startPoint.Y + focusPoints[i].TotalOffy;
m_stage.To(x, y);
m_stage.WaitMoveDone();
var focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent);
if (i == 0)
center = new Point3D(x, -y, focusImage.Z);
else
points.Add(new Point3D(x, -y, focusImage.Z));
if (!_isWorking)
return false;
}
focalPlanes = new FocalPlanes3D(center, points);
return true;
}
return false;
}
}
#endregion
#region 计算需要自动聚焦点的索引及坐标
private List<(int ScanIndex, double TotalOffx, double TotalOffy)> GetFocusPoints3()
{
var focusPoints = new List<(int ScanIndex, double X, double Y)>();
//第1点
focusPoints.Add((0, 0, 0));
if (NumCol > NumRow)
{
//第2点
focusPoints.Add((NumCol - 1, Offx * (NumCol - 1), 0));
//第3点
focusPoints.Add((NumRow % 2 == 0 ? NumRow * NumCol - NumCol / 2 - 1 : (NumRow - 1) * NumCol + NumCol / 2, Offx * (NumCol / 2), Offy * (NumRow - 1)));
}
else
{
//第2点
focusPoints.Add((NumRow / 2 % 2 == 0 ? (NumRow / 2 + 1) * NumCol - 1 : NumRow / 2 * NumCol, Offx * (NumCol - 1), Offy * (NumRow / 2)));
//第3点
focusPoints.Add((NumRow % 2 == 0 ? NumRow * NumCol - 1 : (NumRow - 1) * NumCol, 0, Offy * (NumRow - 1)));
}
return focusPoints;
}
private List<(int ScanIndex, double TotalOffx, double TotalOffy)> GetFocusPoints5Or9(int focusCount)
{
var focusPoints = new List<(int ScanIndex, double X, double Y)>();
if (NumRow >= 3 && NumCol >= 3 && (focusCount == 5 || focusCount == 9))
{
var totalOffx = 0d;
var totalOffy = 0d;
//中心(0)
if (NumRow / 2 % 2 == 0)
{
focusPoints.Add((NumRow / 2 * NumCol + NumCol / 2, Offx * (NumCol / 2), Offy * (NumRow / 2)));
}
else
{
focusPoints.Add(((NumRow / 2 + 1) * NumCol - NumCol / 2 - 1, Offx * (NumCol / 2), Offy * (NumRow / 2)));
}
//第1点(1)
focusPoints.Add((0, totalOffx, totalOffy));
//第2点
if (focusCount == 9)
{
totalOffx = Offx * (NumCol / 2);
focusPoints.Add((NumCol / 2, totalOffx, totalOffy));
}
//第3点(2)
totalOffx = Offx * (NumCol - 1);
focusPoints.Add((NumCol - 1, totalOffx, totalOffy));
//第4点
if (focusCount == 9)
{
totalOffy = Offy * (NumRow / 2);
if (NumRow / 2 % 2 == 0)
{
focusPoints.Add(((NumRow / 2 + 1) * NumCol - 1, totalOffx, totalOffy));
}
else
{
focusPoints.Add((NumRow / 2 * NumCol, totalOffx, totalOffy));
}
}
//第5点(3)
totalOffy = Offy * (NumRow - 1);
if (NumRow % 2 == 0)
{
focusPoints.Add(((NumRow - 1) * NumCol, totalOffx, totalOffy));
}
else
{
focusPoints.Add((NumRow * NumCol - 1, totalOffx, totalOffy));
}
//第6点
if (focusCount == 9)
{
totalOffx = totalOffx - Offx * (NumCol / 2);
if (NumRow % 2 == 0)
{
focusPoints.Add(((NumRow - 1) * NumCol + NumCol / 2, totalOffx, totalOffy));
}
else
{
focusPoints.Add((NumRow * NumCol - NumCol / 2 - 1, totalOffx, totalOffy));
}
}
//第7点(4)
totalOffx = 0;
if (NumRow % 2 == 0)
{
focusPoints.Add((NumRow * NumCol - 1, totalOffx, totalOffy));
}
else
{
focusPoints.Add(((NumRow - 1) * NumCol, totalOffx, totalOffy));
}
//第8点
if (focusCount == 9)
{
totalOffy = totalOffy - Offy * (NumCol / 2);
if ((NumRow + 1) / 2 % 2 == 0)
{
focusPoints.Add(((NumRow + 1) / 2 * NumCol - 1, totalOffx, totalOffy));
}
else
{
focusPoints.Add((((NumRow + 1) / 2 - 1) * NumCol, totalOffx, totalOffy));
}
}
return focusPoints;
}
return null;
}
#endregion
//Add by shayg 20220718 end
private void ScanSampleWorkflow()
{
if (_mode <= 1)
{
for (; _workScanIndex < NumCol * NumRow && _isWorking; _workScanIndex += 1 + _mode)
{
while (_pause)
{
Thread.Sleep(50);
if (!_isWorking) return;
}
if (_isOnce) _pause = true;
//Console.Write("Before To Next:");
m_stage.WaitMoveDone();
ToNext(Offx, Offy, _workScanIndex);
_scanGird.SetDoning(_workScanIndex, _workScanIndex / (_mode + 1) + 1);
_resultWorking = new ResultModel() { SampleId = _workSampleIndex, ScanId = _workScanIndex, ResultId = _workScanIndex / (_mode + 1) + 1 };
_resultList.Add(_resultWorking);
if (rbtAutoFocus.Checked)
{
if ((_workScanIndex / (_mode + 1) + 1) % _focusInterval == 0)
{
// Modify by shayg 20220718 start
//AutoFocusWorkflow.AutoFocusFast(m_stage, () => _imgNow);
var bitmap = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, 4, _workScanIndex, _dirCurrent);
CatchShoot(bitmap.Image);
// Modify by shayg 20220718 end
}
}
//Modify by shayg 20220718 start
//SetShoot();
else if (rbtFocusForecast.Checked && focalPlanes != null)
{
var z = focalPlanes.GetFocusValue(m_stage.X, -m_stage.Y);
m_stage.UpTo(z);
m_stage.WaitMoveDone();
SetShoot();
}
else
{
SetShoot();
}
// Modify by shayg 20220718 end
}
_workScanIndex = 0;
}
//else if(_mode == 2)
else
{
//NumRow和NumCol需要设定为偶数
//每拍四张照片,合成一张后找最差视场,提交给AI分析
int dispIndex = 0;
m_groupIndex = 0;
m_lstSentFiles.Clear();
m_totalImageCount = NumRow * NumCol / 4;
for (int i = 0; i < NumRow; i = i + 2)
{
for (int j = 0; j < NumCol; j = j + 2)
{
m_groupIndex++;
for (int k = 0; k < 4; k++)
{
if (_isWorking == false)
break;
while (_pause)
{
Thread.Sleep(50);
if (!_isWorking) return;
}
if (_isOnce) _pause = true;
m_stage.WaitMoveDone();
m_imageIndex = k + 1;
ToNext_Four(Offx, Offy, i, j, k);
_workScanIndex = NextScanIndex(i, j, k);
dispIndex++;
_scanGird.SetDoning(_workScanIndex, dispIndex);
_resultWorking = new ResultModel() { SampleId = _workSampleIndex, ScanId = _workScanIndex, ResultId = _workScanIndex + 1 };
_resultList.Add(_resultWorking);
if (rbtAutoFocus.Checked)
{
//Modify by shayg 20220718 start
//if (((dispIndex - 1) % _focusInterval) == 0)
// AutoFocusWorkflow.AutoFocusFast(m_stage, () => _imgNow);
if (((dispIndex - 1) % _focusInterval) == 0)
{
var bitmap = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, 4, _workScanIndex, _dirCurrent);
CatchShoot(bitmap.Image);
}
//Modify by shayg 20220718 end
}
//Modify by shayg 20220718 start
//SetShoot();
else if (rbtFocusForecast.Checked && focalPlanes != null)
{
var z = focalPlanes.GetFocusValue(m_stage.X, -m_stage.Y);
m_stage.UpTo(z);
m_stage.WaitMoveDone();
SetShoot();
}
else
{
SetShoot();
}
// Modify by shayg 20220718 end
}
}
}
_workScanIndex = 0;
}
}
///
/// 拼接图片
///
///
private void MergeImage(int groupIndex)
{
var dir = _dirCurrent + m_grabedDirName + "\\" + groupIndex.ToString();
var desDir = _dirCurrent + "\\temp";
//var desDir = _dirCurrent;
if (Directory.Exists(desDir) == false)
{
Directory.CreateDirectory(desDir);
}
var outfileName = desDir + "\\" + groupIndex.ToString() + ".jpg";
Console.WriteLine("start to stitch");
DateTime startTime = DateTime.Now;
Process p = new Process();
//设置要启动的应用程序
p.StartInfo.FileName = "java.exe";
p.StartInfo.Arguments = " -Xmx500m -jar Stitching\\stitching.jar " + dir + " " + outfileName;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
string strOuput = p.StandardOutput.ReadToEnd();
Console.WriteLine(strOuput);
p.WaitForExit();
p.Close();
if (File.Exists(outfileName) == false)
{
LogHelper.log.Error(strOuput);
}
DateTime endTime = DateTime.Now;
var gap = endTime - startTime;
Console.WriteLine("duration time :" + gap.TotalMilliseconds.ToString() + " ms");
CutImage(outfileName);
}
///
/// 截取最严重的710*710的视场
///
///
private void CutImage(string fileName)
{
//if(_mode == 2)
//{
// try
// {
// m_lstSentFiles.Add(fileName);
// _resultWorking.File = fileName;
// aicontrol.PostFileName(_resultWorking.FileName);
// LogHelper.log.Debug(fileName + " was post to AI");
// }
// catch (Exception ex) //sxk add 20211029
// {
// LogHelper.log.Error("post image to AI error", ex);
// }
// return;
//}
if (File.Exists(fileName) == false)
{
LogHelper.log.Debug("file not exist " + fileName);
return;
}
Mat mat = Cv2.ImRead(fileName, ImreadModes.Color);
var unit = m_rulerPainter.MicronRatioPerPixel;
int w = (int)(710.0 / unit);
OpenCvSharp.Size roiSize = new OpenCvSharp.Size(w, w);
WorstfieldFinder finder = new WorstfieldFinder();
LogHelper.log.Debug("WorstfieldFinder.Find ");
Mat roi = WorstfieldFinder.Find(mat, roiSize);
//Mat roi = new Mat(mat, new Rect(new OpenCvSharp.Point(150, 150), roiSize));
//Mat roi = mat(roiSize);
var img = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(roi);
//画标尺
m_rulerPainter.DrawRuler(ref img);
var outfileName = _dirCurrent + "\\" + Path.GetFileName(fileName);
try
{
LogHelper.log.Debug("save image ");
img.Save(outfileName, ImageFormat.Jpeg);
m_lstSentFiles.Add(outfileName);
_resultWorking.File = outfileName;
aicontrol.PostFileName(_resultWorking.FileName);
LogHelper.log.Debug("image cuted and sent to ai server " + _resultWorking.FileName);
}
catch (Exception ex) //sxk add 20211029
{
LogHelper.log.Error("image save error", ex);
}
//Cv2.ImWrite(outfileName, roi);
mat.Dispose();
}
///
/// 切换到下一个扫描索引
///
///
///
///
///
private int NextScanIndex(int row, int col, int num)
{
int scanIndex = 0;
if ((row == 0) && (col == 0) && (num == 0))
return scanIndex;//不需要移动
if (row % 4 == 0)
{
//大方向从左向右移动
if (num == 0)
{
scanIndex = row * NumCol + col;
}
else if (num == 1)
{
scanIndex = (row + 1) * NumCol + (NumCol - col) - 1;
}
else if (num == 2)
{
scanIndex = (row + 1) * NumCol + (NumCol - col - 1) - 1;
}
else
{
scanIndex = row * NumCol + col + 1;
}
}
else
{
//大方向从右向左移动
if (num == 0)
{
scanIndex = row * NumCol + (NumCol - col - 2);
}
else if (num == 1)
{
scanIndex = (row + 1) * NumCol + col + 1;
}
else if (num == 2)
{
scanIndex = (row + 1) * NumCol + col;
}
else
{
scanIndex = row * NumCol + (NumCol - col - 1);
}
}
return scanIndex;
}
bool _shootFlag = false;
private void SetShoot()
{
_shootFlag = true;
while (_isWorking && _shootFlag)
{
Thread.Sleep(10);
}
}
private void CatchShoot(Bitmap img)
{
if (_mode >= 2)
{
//夹杂物拼图采集
_shootFlag = false;
_resultWorking.File = Save_Four(img);
return;
}
else
{
//画标尺
m_rulerPainter.DrawRuler(ref img);
_shootFlag = false;
_resultWorking.File = Save(img);
//
if (string.IsNullOrEmpty(_resultWorking.File))
return;
var type = CheckPicBoundary(img);
aicontrol.PostFileName(_resultWorking.FileName);
//if (type == 3 || (type == 2 && _checkconfig.Border == 1))
//aicontrol.PostFileName(_resultWorking.FileName);
}
}
class ResultModel
{
public int SampleId;
public int ScanId = -1;
public bool Done;
//public string Result;
string _file;
public string File
{
get => _file;
set
{
_file = value;
var i = value.LastIndexOf('\\');
Dir = value.Substring(0, i + 1);
FileName = value.Substring(i + 1);
}
}
public string Dir;
public string FileName;
public int ResultId;
}
#endregion
#region Move To
float Offx => _stageSettingNow.Width * 1000 / NumCol;
float Offy => _stageSettingNow.Height * 1000 / NumRow;
///
/// 移动到开始位置
///
///
private void ToWorkStartPoint(int i)
{
var p = GetWorkStartPoint(i);
m_stage.To(p.X, p.Y);
}
private PointF GetWorkStartPoint(int i)
{
var x = (_stageSettingNow.WorkPoits[i].X - _stageSettingNow.Width / 2) * 1000;
var y = (_stageSettingNow.WorkPoits[i].Y - _stageSettingNow.Height / 2) * 1000;
return new PointF(x, y);
}
///
/// 夹杂物4个一组组合方式的扫描
/// 四个一组,
/// 11 14 21 24
/// 12 13 22 23
/// 41 44 31 34
/// 42 43 32 33
///
/// 横向移动单位
/// 纵向移动单位
/// 行号
/// 列号
/// 组内序号
private void ToNext_Four(double offx, double offy, int row, int col, int num)
{
double x = 0;
double y = 0;
if ((row == 0) && (col == 0) && (num == 0))
return;//不需要移动
if (row % 4 == 0)
{
//大方向从左向右移动
if (col == 0)
{
//第一列
if (num == 0)
{
x = -offx;
y = offy * 2;
}
else if (num == 1)
{
y = offy;
}
else if (num == 2)
{
x = offx;
}
else
{
y = -offy;
}
}
else
{
//其他
if (num == 0)
{
x = offx;
}
else if (num == 1)
{
y = offy;
}
else if (num == 2)
{
x = offx;
}
else
{
y = -offy;
}
}
}
else
{
//大方向从右向左移动
if (col == 0)
{
//第一列
if (num == 0)
{
x = -offx;
y = offy * 2;
}
else if (num == 1)
{
y = offy;
}
else if (num == 2)
{
x = offx;
}
else
{
y = -offy;
}
}
else
{
//其他列
if (num == 0)
{
x = -offx * 3;//移动到前一组
}
else if (num == 1)
{
y = offy;
}
else if (num == 2)
{
x = offx;
}
else
{
y = -offy;
}
}
}
m_stage.Move(x, y);
LogHelper.log.Debug("ToNext_Four : x = " + x.ToString() + ", y = " + y.ToString());
m_stage.WaitMoveDone();
return;
}
private void ToNext(double offx, double offy, int i)
{
double x = 0, y = 0;
int r = i / NumCol;
int c = i % NumCol;
if (_mode == 0)
{
if (i == 0) ;
else if (c == 0)
y = offy;
else if (r % 2 == 0)
x = offx;
else
x = -offx;
}
if (_mode == 1)
{
if (i == 0) ;
else if (r % 2 == 0)
{
if (c == 0)
{
x = -offx;
y = offy;
}
else if (c == 1)
{
x = offx;
y = offy;
}
else x = 2 * offx;
}
else
{
if (c == 0)
{
x = offx;
y = offy;
}
else if (c == 1)
{
x = -offx;
y = offy;
}
else x = -2 * offx;
}
}
m_stage.Move(x, y);
// Console.Write("To Next:");
m_stage.WaitMoveDone();
}
private void ToScanPoint(int sampleId, int scanId)
{
var p = GetWorkStartPoint(sampleId);
float offx = scanId / NumCol % 2 == 0 ? scanId % NumCol : NumCol - scanId % NumCol - 1;
float offy = (int)(scanId / NumCol);
offx *= Offx;
offy *= Offy;
m_stage.To(p.X + offx, p.Y + offy);
}
#endregion
#region Preview
private void btnPreview_Click(object sender, EventArgs e)
{
PreviewPure.StartPreiew(sender as Button);
}
private ICamera _camera;
private Bitmap _imgNow;
private void CallbackDraw(Bitmap obj)
{
if (obj == null)
return;
var bmp = (Bitmap)obj.Clone();
if (bmp.PixelFormat == PixelFormat.Format8bppIndexed)
{
ColorPalette palette = bmp.Palette;
for (int i = 0; i < 256; i++)
{
palette.Entries[i] = Color.FromArgb(i, i, i);
}
bmp.Palette = palette;
}
if (_shootFlag)
{
CatchShoot(bmp);
}
else
{
try
{
_imgNow = (Bitmap)bmp.Clone();
PreviewPure.ShowPrieview(bmp);
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace, ex.Message);
}
}
}
#endregion
#region Save
string _dirRoot;
string DirRoot
{
get => _dirRoot;
set
{
_dirRoot = value;
lblDirectory.Text = value;
_checkconfig.Path = value;
try
{
GetDriverInfo(value);
}
catch { }
}
}
string _dirCurrent;
private void btnChangDir_Click(object sender, EventArgs e)
{
if (_isWorking)
return;
var path = SelectFolder();
if (string.IsNullOrEmpty(path)) return;
DirRoot = path;
}
public string SelectFolder()
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
if (string.IsNullOrEmpty(dialog.SelectedPath))
{
// System.Windows.MessageBox.Show("文件夹路径不能为空", "提示");
return null;
}
else
return dialog.SelectedPath;
}
else return null;
}
///
/// 读取硬盘信息
///
/// 盘符
public void GetDriverInfo(string disk)
{
long lsum = 0, ldr = 0;
long gb = 1024 * 1024 * 1024;
DriveInfo drive = new DriveInfo(disk);
lsum = drive.TotalSize / gb;
ldr = drive.TotalFreeSpace / gb;
lblDisk.Width = (int)(lblDisk.Parent.Width - lblDisk.Parent.Width * ldr / lsum);
}
///
/// 夹杂图四个一组图像保存
///
///
///
public string Save_Four(Bitmap img)
{
var grpIndex = m_groupIndex;
var path = _dirCurrent + m_grabedDirName;
if (Directory.Exists(path) == false)
{
Directory.CreateDirectory(path);
}
var subDir = grpIndex.ToString();
var path2 = path + "\\" + subDir;
if (Directory.Exists(path2) == false)
{
Directory.CreateDirectory(path2);
}
var fileName = path2 + "\\" + string.Format("{0}.jpg", m_imageIndex);
try //sxk add 20211029
{
img.Save(fileName, ImageFormat.Jpeg);
if (m_imageIndex == 4)
{
//拍完一组,开始拼图
Task mergeTask = new Task(() =>
{
MergeImage(grpIndex);
m_imageCountToAI++;
});
mergeTask.Start();
}
return fileName;
}
catch (Exception ex) //sxk add 20211029
{
LogHelper.log.Error("image save error", ex);
return "";
}
}
public string Save(Bitmap img)
{
var time = DateTime.Now.ToString("yyyyMMddHHmmss");//日期时间
var id = _workSampleIndex + 1;//工位号
var x = m_stage.X;//坐标x
var y = m_stage.Y;//坐标y
var i = _workScanIndex + 1;//图序号
var stage = _stageSettingName;//样品台名称
var fileName = _dirCurrent + "\\" + string.Format("{0}_{1}_{2}_{3}_{4:f2}_{5:f2}.jpg", time, i, stage, id, x, y);
try //sxk add 20211029
{
img.Save(fileName, ImageFormat.Jpeg);
return fileName;
}
catch (Exception ex) //sxk add 20211029
{
LogHelper.log.Error("image save error", ex);
return "";
}
}
///
/// 创建工作目录
///
public void NewWorkDir()
{
this.Invoke(new Action(() =>
{
_dirCurrent = DirRoot + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss");// + "_" + cmbSampleStageList.Text;
Directory.CreateDirectory(_dirCurrent);
}));
}
#endregion
#region Ai Api
AiControl aicontrol;
int _resultFlag = -1;
///
/// AI处理全部结束
///
///
void InitAi(string dir)
{
aicontrol = new AiControl(dir);
aicontrol.CompleteBatchEvent += Aicontrol_CompleteBatchEvent;
aicontrol.CompleteAllEvent += Aicontrol_CompleteAllEvent;
}
public string re = "";
private List GrainFileList = new List();
///
/// AI处理全部结束
///
///
void Aicontrol_CompleteAllEvent(string result)
{
var item = _checkconfig.Items.First((i) => i.Name == m_cmbProjuctSelectText);
var name = "Automation.Inclusions";//夹杂物
//轴承钢带状、轴承钢网状、亚共析钢带状、球退查找最差级别
if (item.Value == "17,16,0"|| item.Value == "16,4,6" || item.Value == "16,2,0" || item.Value == "16,1,0")
{
name = "Automation.Grain";//晶粒度
AIResultReader arr = new AIResultReader();
string level = arr.LoadOnlyResult(_dirCurrent + "\\AI");
_resultCmpAll.Add(level);
this.Invoke(new Action(() =>
{
lblResult.Text = level;
}));
_resultFlag = -1;
re = level;
lblResultText = level;
return;
}
//晶粒度查找查找众数
if (item.Value == "18,10,0" || item.Value == "18,11,0")
{
name = "Automation.Grain";//晶粒度
AIResultReader arr = new AIResultReader();
string level = arr.LoadGrainResult(_dirCurrent+"\\AI", ref GrainFileList);
_resultCmpAll.Add(level);
this.Invoke(new Action(() =>
{
lblResult.Text = level;
}));
_resultFlag = -1;
re = level;
lblResultText = level;
return;
}
result = result.Trim();
if(string.IsNullOrEmpty(result))
{
LogHelper.log.Debug("AI全部完成,结果为空, 重新取 work dir = " + _dirCurrent);
result = AnalysisAIFile();
}
//Console.WriteLine("CompleteAllEvent");
Console.WriteLine("全部完成,结果:" + result);
LogHelper.log.Debug("AI全部完成,结果:" + result);
_resultCmpAll.Add(result);
this.Invoke(new Action(() =>
{
lblResult.Text = JsonHelper.ParseResultString(result);
}));
//ResultList.Add(_resultFlag, resultfilename);
_resultFlag = -1;
re = result;
//生成报告
}
///
/// 批次结束
///
///
void Aicontrol_CompleteBatchEvent(List batchfilenames)
{
foreach (var file in batchfilenames)
{
try
{
var result = _resultList.First((r) => r.FileName == file);
_scanGird.SetDone(result.ScanId);
result.Done = true;
}
catch
{
Console.WriteLine("获取结果时发生错误");
}
}
Console.WriteLine("批次完成");
}
void EndGrade(int flag)
{
_resultFlag = flag;
if (_mode >= 2)
{
for (int i = 0; i < 1000; i++)
{
if (m_imageCountToAI >= m_totalImageCount)
{
aicontrol.EndGrade();
break;
}
Thread.Sleep(50);
}
}
else
{
aicontrol.EndGrade();
}
}
void WaitAiCompleteAll()
{
while (_resultFlag != -1)
{
if (!_isWorking && !_offlineWorking)
_resultFlag = -1;
Thread.Sleep(50);
}
}
#endregion
#region Ai Operate
List _resultList = new List();
int _resultLookId = -1;
int _resultSampleSelect = -1;
int _resultScanSelect = -1;
List _resultCmpAll = new List();
ResultModel ResultSelect => _resultList.FirstOrDefault((r) => r.ResultId == _resultLookId && r.SampleId == _resultSampleSelect);
private void ClearResult()
{
_resultList = new List();
_resultLookId = -1;
_resultSampleSelect = -1;
_resultScanSelect = -1;
_resultCmpAll = new List();
}
private void btnLookBack_Click(object sender, EventArgs e)
{
if (_resultLookId < 1)
return;
try
{
PreviewPure.ShowImage(ResultSelect.File, "查看原图");
}
catch { }
}
private void btnAnalysis_Click(object sender, EventArgs e)
{
if (_resultLookId < 1)
return;
var file = aicontrol.GetImageProcess(ResultSelect.File);
try
{
PreviewPure.ShowImage(file, "分析过程");
}
catch { }
}
private void ShowResult()
{
if (_resultLookId < 1)
{
Console.WriteLine("尚未分析");
return;
}
var result = ResultSelect;
if (result == null || string.IsNullOrEmpty(result.File)) return;
var str = aicontrol.GetImageTestResult(ResultSelect.File);
ConsoleResult(string.IsNullOrEmpty(str) ? "没有结果" : str);
}
private void ConsoleResult(string msg)
{
lblResult.Text = msg;
}
private void UpdateScanGridByResult(int sampleId)
{
try
{
var list = _resultList.Where((r) => r.SampleId == sampleId).ToList();
_resultSampleSelect = sampleId;
_scanGird.Reset();
foreach (var item in list)
{
if (_resultCmpAll[sampleId].Contains(item.FileName))
_scanGird.SetResult(item.ScanId, item.ResultId);
else if (item.Done)
{
_scanGird.SetDone(item.ScanId, item.ResultId);
}
else
{
_scanGird.SetDoning(item.ScanId, item.ResultId);
}
}
lblResult.Text = JsonHelper.ParseResultString(_resultCmpAll[sampleId]);
if (JsonHelper.ParseResultString(_resultCmpAll[sampleId]) == "")
{
lblResult.Text = _resultCmpAll[sampleId];
}
}
catch { }
}
private void btnLocate_Click(object sender, EventArgs e)
{
if (!_isWorking)
{
if (_resultSampleSelect > -1 && _resultScanSelect > -1)
ToScanPoint(_resultSampleSelect, _resultScanSelect);
}
}
private string GetReportName(string str)
{
var item = _checkconfig.Items.First((i) => i.Name == str);
var name = "Automation.Inclusions";//夹杂物
if (item.Value == "18,5,5" || item.Value == "18,1,5")
{
name = "Automation.Inclusions";//夹杂物
}
if (item.Value == "18,10,0" || item.Value == "18,11,0")
{
name = "Automation.Grain";//晶粒度
}
if (item.Value == "17,16,0")
{
name = "Automation.HypoeutectoidStrip";//亚共析钢带状
}
if (item.Value == "16,4,6")
{
name = "Automation.BearingSteel";//轴承钢带状
}
if (item.Value == "16,2,0")
{
name = "Automation.BearingSteelMesh";//轴承钢网状
}
if (item.Value == "0,0,0")
{
name = "Automation.OrganizationalIdentification";//组织识别
}
if (item.Value == "16,1,0")
{
name = "Automation.Spheroidization"; //轴承钢球退
}
return name;
}
private void btnReport_Click(object sender, EventArgs e)
{
PrintReport(false);
}
private void PrintReport(bool autoFalg)
{
var str = m_cmbProjuctSelectText;
if (string.IsNullOrEmpty(str))
{
//MessageBox.Show("检测项目不能为空");
return;
}
var name = GetReportName(str);
var result = new List();
AutoAnalysisReportDialog reportDialog = new AutoAnalysisReportDialog(this, name, result);
if (reportDialog.hasModule)
{
reportDialog.AutoExportFlag = autoFalg;
reportDialog.StartPosition = FormStartPosition.CenterScreen;
reportDialog.ExportReport = ExportReport;
reportDialog.ShowDialog();
}
else
{
reportDialog = null;
}
}
private bool IsDigit(string str)
{
if (string.IsNullOrEmpty(str))
return false;
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] bytestr = ascii.GetBytes(str);
foreach (var c in bytestr)
{
if (c < 48 || c > 57)
{
return false;
}
}
return true;
}
///
/// 取得夹杂物中每个级别中最严重的那张图片
///
///
///
private List findWorstResult(List> resultList)
{
LogHelper.log.Error("输出报告 findWorstResult");
var result = new List();
double maxValue_A = -1;
double maxValue_B = -1;
double maxValue_C = -1;
double maxValue_D = -1;
double maxValue_DS = -1;
int count = resultList.Count;
string fileName_A = "";
string fileName_B = "";
string fileName_C = "";
string fileName_D = "";
string fileName_DS = "";
for (int i = 0; i < count; i++)
{
List rstOne = resultList[i];
if (rstOne.Count < 2)
continue;
string rst = rstOne[0];
string[] rstarr = rst.Split('+');
if (rstarr.Length <= 0)
continue;
//rst = rstarr[0];
foreach (var item in rstarr)
{
LogHelper.log.Error("输出报告(findWorstResult) " + item + " file name = " + rstOne[1]);
string type = item.Substring(0, 1);
string type2 = item.Substring(1, 1);
int gradeStart = 1;
if ("S".Equals(type2))
{
gradeStart = 2;
type = "DS";
}
string grade = item.Substring(gradeStart);
bool isDigit = IsDigit(grade);
if (isDigit == false)
{
grade = grade.Substring(0, grade.Length - 1);//后一位是e或s
}
if ("A".Equals(type))
{
double curpj = 0;
double.TryParse(grade, out curpj);
if (maxValue_A < curpj)
{
maxValue_A = curpj;
fileName_A = rstOne[1];
}
}
if ("B".Equals(type))
{
double curpj = 0;
double.TryParse(grade, out curpj);
if (maxValue_B < curpj)
{
maxValue_B = curpj;
fileName_B = rstOne[1];
}
}
if ("C".Equals(type))
{
double curpj = 0;
double.TryParse(grade, out curpj);
if (maxValue_C < curpj)
{
maxValue_C = curpj;
fileName_C = rstOne[1];
}
}
if ("D".Equals(type))
{
double curpj = 0;
double.TryParse(grade, out curpj);
if (maxValue_D < curpj)
{
maxValue_D = curpj;
fileName_D = rstOne[1];
}
}
if ("DS".Equals(type))
{
double curpj = 0;
double.TryParse(grade, out curpj);
if (maxValue_DS < curpj)
{
maxValue_DS = curpj;
fileName_DS = rstOne[1];
}
}
}
}
if (string.IsNullOrEmpty(fileName_A) == false)
{
result.Add(fileName_A);
LogHelper.log.Error("输出报告 找到A类图片 " + fileName_A);
}
if ((result.Contains(fileName_B) == false) && (string.IsNullOrEmpty(fileName_B) == false))
{
result.Add(fileName_B);
LogHelper.log.Error("找到B类图片 " + fileName_B);
}
if ((result.Contains(fileName_C) == false) && (string.IsNullOrEmpty(fileName_C) == false))
{
result.Add(fileName_C);
LogHelper.log.Error("找到C类图片 " + fileName_C);
}
if ((result.Contains(fileName_D) == false) && (string.IsNullOrEmpty(fileName_D) == false))
{
result.Add(fileName_D);
LogHelper.log.Error("找到D类图片 " + fileName_D);
}
if ((result.Contains(fileName_DS) == false) && (string.IsNullOrEmpty(fileName_DS) == false))
{
result.Add(fileName_DS);
LogHelper.log.Error("找到DS类图片 " + fileName_DS);
}
if (result.Count <= 0)
{
LogHelper.log.Error("没有找到图片 " + fileName_DS);
}
return result;
}
///
/// 取得夹杂物最严重的那张图片
///
///
///
private string findMaxResult(List> resultList)
{
double maxValue = -1;
int count = resultList.Count;
string resultFileName = "";
for (int i = 0; i < count; i++)
{
List rstOne = resultList[i];
if (rstOne.Count < 2)
continue;
string rst = rstOne[0];
string[] rstarr = rst.Split('+');
if (rstarr.Length <= 0)
continue;
rst = rstarr[0];
string type = rst.Substring(0, 1);
string grade = rst.Substring(1);
bool isDigit = IsDigit(grade);
if (isDigit == false)
{
grade = grade.Substring(0, grade.Length - 1);
}
if ("A".Equals(type))
{
double curpj = 0;
double.TryParse(grade, out curpj);
if (maxValue < curpj)
{
maxValue = curpj;
resultFileName = rstOne[1];
}
}
}
return resultFileName;
}
///
///取得夹杂物各个级别最严重视场-zm
///
private List findBigResult()
{
List res = new List();
Dictionary> le = JsonHelper.ParseResultArray(re);
foreach (var key in le.Keys)
{
res.Add(le[key][0]);
}
return res;
}
///
/// 取文件夹下随机文件
///
///
///
///
private List GetRandomFiles(string dir)
{
List lstResult = new List();
if (Directory.Exists(dir) == false)
return lstResult;
var totalFiles = Directory.GetFiles(dir, "*.jpg");
int count = 1;//只取5张
int totalCount = totalFiles.Count();
if (totalCount <= count)
{
lstResult.AddRange(totalFiles);
return lstResult;
}
int pos = totalCount / 2 - count / 2;
while (lstResult.Count < count)
{
if (pos >= totalCount)
break;
var fileName = totalFiles[pos++];
lstResult.Add(fileName);
}
return lstResult;
}
///
/// 检查report.ai是否存在,如果不存在检查report.ai_是否存在,如果存在改名为report.ai
///
///
///
private bool CheckReportAIFileExist(string dir)
{
string filename = dir + "\\report.ai";
if (File.Exists(filename))
{
return true;
}
string filename_ = dir + "\\report.ai_";
if (File.Exists(filename_) == false)
{
return false;
}
try
{
File.Move(filename, filename_);
return true;
}
catch(Exception)
{
return false;
}
}
///
/// 取文件夹下一个文件
///
///
///
///
private List GetOnlyFile(string dir)
{
List lstResult = new List();
if (CheckReportAIFileExist(dir) == false)
{
LogHelper.log.Error("report.ai不存在 dir = " + dir);
return lstResult;
}
string filename = dir + "\\report.ai";
if (File.Exists(filename) == false)
{
LogHelper.log.Error("report.ai不存在 filename = " + filename);
return lstResult;
}
var totalFiles = Directory.GetFiles(dir, "*.jpg");
int count = 1;//只取1张
int totalCount = totalFiles.Count();
if (totalCount <= count)
{
lstResult.AddRange(totalFiles);
return lstResult;
}
using (System.IO.StreamReader _file = System.IO.File.OpenText(filename))
{
using (JsonTextReader reader = new JsonTextReader(_file))
{
JObject o = (JObject)JToken.ReadFrom(reader);
JObject arrList = JObject.Parse(o["file_results"].ToString());
List gradeList = new List();
foreach (var item in arrList)
{
string name = item.Key.ToString();
string grade = item.Value.ToString();
if (grade == re)
{
lstResult.Add(name);
break;
}
}
}
}
if(lstResult.Count <= 0)
{
lstResult.Add(totalFiles[0]);
}
return lstResult;
}
///
/// 输出报表,生成word和excel文件
///
void ExportReport()
{
//获取word书签与excel单元格的关系,以字典方式存储
List infos = mic_module_infos_BLL.FindAll().FindAll(a => a.analyze_classify == this.autoAnalyzeSettingModel.analyzeClassify);
Dictionary tagInfos = new Dictionary();
if (infos != null && infos.Count > 0)
{
foreach (mic_module_infos info in infos)
{
tagInfos.Add(info.tag_name, info.cell_position);
}
}
List> inclusionList = new List>();
List bitList = new List();
var name = GetReportName(cmbProjuctSelect.Text);
//夹杂物报告
if (name == "Automation.Inclusions")
{
List inclusionHead = new List();
string path = "";
for (int i = 0; i < _resultCmpAll.Count; i++)
{
var item = _resultCmpAll[i];
var list = new List();
var rStr = JsonHelper.ParseResultString(item);
path = JsonHelper.ParseImagePath(item);
//list.Add("样品" + (i + 1) + ", 测试结果:");
//list.Add(rStr);
//var path = JsonHelper.ParseImagePath(item);
//list.Add(path);
//inclusionList.Add(list);
if (string.IsNullOrEmpty(rStr)) continue;
list = rStr.Split(';').ToList();
var dict = JsonHelper.ParseResultArray(item);
foreach (var head in list)
{
var list1 = dict[head];
foreach (var f in list1)
{
var list2 = new List();
list2.Add(head);
list2.Add(f);
LogHelper.log.Debug("head = " + head);
LogHelper.log.Debug("f = " + f);
inclusionList.Add(list2);
}
}
}
//每个级别中最严重的图片记入到报告中
List maxPath = findBigResult();
//去除重复图像
for (int j = 0; j < maxPath.Count; j++)
{
for (int k = maxPath.Count - 1; k > j; k--)
{
if (maxPath[k] == maxPath[j])
{
maxPath.RemoveAt(k);
}
}
}
for (int i = 0; i < maxPath.Count; i++)
{
if ((string.IsNullOrEmpty(path) == false) && (string.IsNullOrEmpty(maxPath[i]) == false))
{
string fileName = path + "\\AI\\" + maxPath[i];
Bitmap bmp = (Bitmap)Image.FromFile(fileName);
bmp.Tag = Convert.ToDouble(this.m_rulerPainter.RulerValue * m_rulerPainter.Multiple);
bitList.Add(bmp);
}
}
m_reportExporter.CreateAnalysisReport(AutoAnalyzeSettingModel, inclusionList, bitList, tagInfos);
}
//晶粒度、亚共析钢带状、轴承钢带状、轴承钢网状、球退报告(只有一张)
if(name == "Automation.Grain" || name== "Automation.HypoeutectoidStrip" || name== "Automation.BearingSteel"|| name=="Automation.BearingSteelMesh" || name== "Automation.Spheroidization")
{
int sampleNum = 1;
List lstModel = new List();
List> lstBit = new List>();
foreach (var dir in m_lstWorkDir)
{
LogHelper.log.Debug("搜索图片文件夹:" + dir);
List lstBitamp = new List();
var randomFiles = GetOnlyFile(dir + "\\AI");
inclusionList.Clear();
bitList.Clear();
foreach (var fileName in randomFiles)
{
string f = dir + "\\AI\\" + fileName;
if (File.Exists(f) == false)
continue;
Bitmap bmp = (Bitmap)Image.FromFile(f);
bmp.Tag = Convert.ToDouble(this.m_rulerPainter.RulerValue * m_rulerPainter.Multiple);
lstBitamp.Add(bmp);
}
lstBit.Add(lstBitamp);
var settingModel = autoAnalyzeSettingModel.Clone();
settingModel.reportNumber = settingModel.reportNumber + "_" + sampleNum.ToString();
sampleNum++;
lstModel.Add(settingModel);
}
m_reportExporter.CreateGrainReport(lstModel, lstBit, lblResultText);
MessageBox.Show(PdnResources.GetString("Menu.Analysisreporfoldertoview.text"));
}
//组织识别、轴承钢退火暂时无报告
#region
//else
//{
// int sampleNum = 1;
// List lstModel = new List();
// List> lstBit = new List>();
// foreach (var dir in m_lstWorkDir)
// {
// List lstBitamp = new List();
// //任意找5张图片
// var randomFiles = GetRandomFiles(dir + "\\AI");
// inclusionList.Clear();
// bitList.Clear();
// foreach (var fileName in randomFiles)
// {
// if (File.Exists(fileName) == false)
// continue;
// Bitmap bmp = (Bitmap)Image.FromFile(fileName);
// bmp.Tag = Convert.ToDouble(this.m_rulerPainter.RulerValue * m_rulerPainter.Multiple);
// lstBitamp.Add(bmp);
// }
// lstBit.Add(lstBitamp);
// var settingModel = autoAnalyzeSettingModel.Clone();
// settingModel.reportNumber = settingModel.reportNumber + "_" + sampleNum.ToString();
// sampleNum++;
// lstModel.Add(settingModel);
// }
// m_reportExporter.CreateGrainReport(lstModel, lstBit,lblResultText);
// MessageBox.Show(PdnResources.GetString("Menu.Analysisreporfoldertoview.text"));
//}
#endregion
}
#endregion
#region Offline work
bool _offlineWorking = false;
string _srcDir = "";
List _srcList = new List();
double _x;
double _y;
void InitOfflineTest()
{
}
private void btnOfflineTest_Click(object sender, EventArgs e)
{
if (_offlineWorking)
{
StopWorkOffline();
btnOfflineTest.Text = "脱机运行";
return;
}
_srcDir = SelectFolder();
if (string.IsNullOrEmpty(_srcDir))
return;
_srcList = Directory.GetFiles(_srcDir).ToList();
if (string.IsNullOrEmpty(_dirRoot))
{
MessageBox.Show("Please select a dir first.");
return;
}
StartWorkOffline(); btnOfflineTest.Text = "停止";
}
void StartWorkOffline()
{
_offlineWorking = true;
_workSampleIndex = 0;
_workScanIndex = 0;
NewWorkDir();
InitAi(_dirCurrent);
//_sampleStage.Reset();
new Thread(RunTimeOffline).Start();
}
void StopWorkOffline()
{
_offlineWorking = false;
}
private void RunTimeOffline()
{
while (_offlineWorking)
{
if (_srcList.Count < NumCol * NumRow * (_workSampleIndex + 1))
{
_offlineWorking = false;
return;
}
_x = _stageSettingNow.WorkPoits[_workSampleIndex].X * 1000;
_y = _stageSettingNow.WorkPoits[_workSampleIndex].Y * 1000;
//_scanGird.Reset();
//_sampleStage.SetState(_sampleIndex, 2);
Console.WriteLine("样品" + (_workSampleIndex + 1) + "开始");
// aicontrol.StartAndSetGradeParam(cat, item, json, 100, 0.2755);
OfflineWorkflow();
EndGrade(_workSampleIndex);
Console.WriteLine("扫描完成");
WaitAiCompleteAll();
//_sampleStage.SetState(_sampleIndex, 3);
_workSampleIndex++;
//_offlineWorking = false;
if (_workSampleIndex >= _stageSettingNow.WorkPoits.Count)
_offlineWorking = false;
}
}
private void OfflineWorkflow()
{
var offx = _stageSettingNow.Width * 1000 / NumCol;
var offy = _stageSettingNow.Height * 1000 / NumRow;
for (int i = _workScanIndex; i < NumCol * NumRow && _offlineWorking; i++)
{
_workScanIndex = i;
int r = i / NumCol;
int c = i % NumCol;
if (i == 0) ;
else if (c == 0)
_y += offy;
else if (r % 2 == 0)
_x += offx;
else
_x -= offx;
Thread.Sleep(300);
aicontrol.PostFileName(CopyFile());
//_scanGird.SetDone(r * NumCol + c);
}
_workScanIndex = 0;
}
private string CopyFile()
{
var file = _srcList[_workScanIndex + NumCol * NumRow * _workSampleIndex];
var disFile = CreateFileOffline();
File.Copy(file, _dirCurrent + "\\" + disFile);
return disFile;
}
private string CreateFileOffline()
{
var time = DateTime.Now.ToString("yyyyMMddHHmmss");//日期时间
var id = _workSampleIndex;//工位号
var i = _workScanIndex + 1;//图序号
var stage = _stageSettingName;//样品台名称
var fileName = string.Format("{0}_{1}_{2}_{3}_{4}_{5}.jpg", time, i, stage, id, _x, _y);
return fileName;
}
#endregion
#region Stage Event
public void OnUpdatePosition()
{
}
public void OnTimeoutConnect()
{
btnStart.Enabled = false;
StopWork();
}
public void OnErrorSend()
{
}
#endregion
private void cmbScanMode_SelectedIndexChanged(object sender, EventArgs e)
{
_mode = cmbScanMode.SelectedIndex;
}
private void cmbAutoFocusParm_SelectedIndexChanged(object sender, EventArgs e)
{
int.TryParse(cmbAutoFocusParm.Text, out _focusInterval);
}
///
/// 是否包含胶体
/// 1、全胶体
/// 2、部分胶体
/// 3、无胶体
///
/// 源图像
///
private unsafe int CheckPicBoundary(Bitmap source)
{
int type = 3;
Mat gray = null;
try
{
var mat = PaintDotNet.Camera.Tools.ToMat(source);
if (mat.Channels() == 3)
gray = mat.CvtColor(ColorConversionCodes.BGR2GRAY);
else gray = mat;
gray.ForEachAsByte(this.Gray_ForEachAsByte);
OpenCvSharp.Point leftTop = new OpenCvSharp.Point(0, 0);
OpenCvSharp.Point rightTop = new OpenCvSharp.Point(gray.Width - 1, 0);
OpenCvSharp.Point leftBottom = new OpenCvSharp.Point(0, gray.Height - 1);
OpenCvSharp.Point rightBottom = new OpenCvSharp.Point(gray.Width - 1, gray.Height - 1);
byte leftTopV = gray.At(0, 0);
byte rightTopV = gray.At(0, gray.Width - 1);
byte leftBottomV = gray.At(gray.Height - 1, 0);
byte rightBottomV = gray.At(gray.Height - 1, gray.Width - 1);
Rect rect;
int leftTopNum = 0, rightTopNum = 0, leftBottomNum = 0, rightBottomNum = 0;
if (leftTopV == 0) leftTopNum = Cv2.FloodFill(gray, leftTop, new Scalar(0), out rect, null, null, FloodFillFlags.Link8);
if (rightTopV == 0) rightTopNum = Cv2.FloodFill(gray, rightTop, new Scalar(0), out rect, null, null, FloodFillFlags.Link8);
if (leftBottomV == 0) leftBottomNum = Cv2.FloodFill(gray, leftBottom, new Scalar(0), out rect, null, null, FloodFillFlags.Link8);
if (rightBottomV == 0) rightBottomNum = Cv2.FloodFill(gray, rightBottom, new Scalar(0), out rect, null, null, FloodFillFlags.Link8);
if (leftTopNum == 0 && rightTopNum == 0 && leftBottomNum == 0 && rightBottomNum == 0)
{
type = 3;
}
else if (leftTopNum > 0 && rightTopNum > 0 && leftBottomNum > 0 && rightBottomNum > 0)
{
type = 1;
}
else
{
if (leftTopNum > 10000 || rightTopNum > 10000 || leftBottomNum > 10000 || rightBottomNum > 10000)
{
type = 2;
}
}
}
catch (Exception)
{
}
finally
{
if (gray != null)
{
gray.Dispose();
GC.Collect();
}
}
return type;
}
private unsafe void Gray_ForEachAsByte(byte* value, int* position)
{
int y = position[0];
int x = position[1];
if (*value <= 90)
{
*value = 0;
}
else
{
*value = 255;
}
}
private void btnUpData_Click(object sender, EventArgs e)
{
var dr = MessageBox.Show("请确认是否上传数据?", "upload", MessageBoxButtons.YesNo);
if (dr != DialogResult.Yes)
return;
UploadData();
//UploadDataDialog frm = new UploadDataDialog(infoList);
//string str = cmbProjuctSelect.Text;
//var item = _checkconfig.Items.First((i) => i.Name == str);
//frm.CheckItem = 1;//夹杂物
//if (item.Value == "18,10,0" || item.Value == "18,11,0")
//{
// frm.CheckItem = 2;//晶粒度
//}
//if(_resultCmpAll.Count > 0)
// frm.CheckResult = _resultCmpAll[0];
//frm.ShowDialog();
}
private String AnalysisAIFile()
{
String ret = "";
try
{
string dir = Path.Combine(_dirCurrent, "AI");
if (CheckReportAIFileExist(dir) == false)
{
LogHelper.log.Error("report.ai不存在 dir = " + dir);
return "";
}
String aiFile = dir + "\\report.ai";
if (File.Exists(aiFile))
{
using (System.IO.StreamReader _file = System.IO.File.OpenText(aiFile))
{
using (JsonTextReader reader = new JsonTextReader(_file))
{
try
{
Dictionary> gradeA = new Dictionary>();
Dictionary> gradeAe = new Dictionary>();
Dictionary> gradeAs = new Dictionary>();
Dictionary> gradeB = new Dictionary>();
Dictionary> gradeBe = new Dictionary>();
Dictionary> gradeBs = new Dictionary>();
Dictionary> gradeC = new Dictionary>();
Dictionary> gradeCe = new Dictionary>();
Dictionary> gradeCs = new Dictionary>();
Dictionary> gradeD = new Dictionary>();
Dictionary> gradeDe = new Dictionary>();
Dictionary> gradeDs = new Dictionary>();
JObject o = (JObject)JToken.ReadFrom(reader);
JObject arrList = JObject.Parse(o["file_results"].ToString());
foreach (var item in arrList)
{
string temp = item.Value.ToString();
string[] v = temp.Split('+');
for (int j = 0; j < v.Length; j++)
{
//包含A的
if (v[j].IndexOf("A") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0)
{
if (gradeA.ContainsKey(v[j]))
{
gradeA[v[j]].Add(item.Key);
}
else
{
gradeA.Add(v[j], new List());
gradeA[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0)
{
if (gradeAe.ContainsKey(v[j]))
{
gradeAe[v[j]].Add(item.Key);
}
else
{
gradeAe.Add(v[j], new List());
gradeAe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("s") > -1)
{
if (gradeAs.ContainsKey(v[j]))
{
gradeAs[v[j]].Add(item.Key);
}
else
{
gradeAs.Add(v[j], new List());
gradeAs[v[j]].Add(item.Key);
}
}
}
//包含B的
if (v[j].IndexOf("B") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0)
{
if (gradeB.ContainsKey(v[j]))
{
gradeB[v[j]].Add(item.Key);
}
else
{
gradeB.Add(v[j], new List());
gradeB[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0)
{
if (gradeBe.ContainsKey(v[j]))
{
gradeBe[v[j]].Add(item.Key);
}
else
{
gradeBe.Add(v[j], new List());
gradeBe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("s") > -1)
{
if (gradeBs.ContainsKey(v[j]))
{
gradeBs[v[j]].Add(item.Key);
}
else
{
gradeBs.Add(v[j], new List());
gradeBs[v[j]].Add(item.Key);
}
}
}
//包含C的
if (v[j].IndexOf("C") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0)
{
if (gradeC.ContainsKey(v[j]))
{
gradeC[v[j]].Add(item.Key);
}
else
{
gradeC.Add(v[j], new List());
gradeC[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0)
{
if (gradeCe.ContainsKey(v[j]))
{
gradeCe[v[j]].Add(item.Key);
}
else
{
gradeCe.Add(v[j], new List());
gradeCe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("s") > -1)
{
if (gradeCs.ContainsKey(v[j]))
{
gradeCs[v[j]].Add(item.Key);
}
else
{
gradeCs.Add(v[j], new List());
gradeCs[v[j]].Add(item.Key);
}
}
}
//包含D的
if (v[j].IndexOf("D") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("S") < 0)
{
if (gradeD.ContainsKey(v[j]))
{
gradeD[v[j]].Add(item.Key);
}
else
{
gradeD.Add(v[j], new List());
gradeD[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("S") < 0)
{
if (gradeDe.ContainsKey(v[j]))
{
gradeDe[v[j]].Add(item.Key);
}
else
{
gradeDe.Add(v[j], new List());
gradeDe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("S") > -1)
{
if (gradeDs.ContainsKey(v[j]))
{
gradeDs[v[j]].Add(item.Key);
}
else
{
gradeDs.Add(v[j], new List());
gradeDs[v[j]].Add(item.Key);
}
}
}
}
}
//结果JSON
JObject res = new JObject();
res.Add("path", o["path"]);
//结果显示
String result = "";
//排序,S的都输出,所以无需排序(DS除外)
if (gradeA.Count > 0)
{
string maxStr = "";
foreach (string key in gradeA.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeA[maxStr].Count; i++)
{
jarr.Add(gradeA[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeAe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeAe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeAe[maxStr].Count; i++)
{
jarr.Add(gradeAe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeB.Count > 0)
{
string maxStr = "";
foreach (string key in gradeB.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeB[maxStr].Count; i++)
{
jarr.Add(gradeB[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeBe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeBe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeBe[maxStr].Count; i++)
{
jarr.Add(gradeBe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeC.Count > 0)
{
string maxStr = "";
foreach (string key in gradeC.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeC[maxStr].Count; i++)
{
jarr.Add(gradeC[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeCe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeCe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeCe[maxStr].Count; i++)
{
jarr.Add(gradeCe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeD.Count > 0)
{
string maxStr = "";
foreach (string key in gradeD.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeD[maxStr].Count; i++)
{
jarr.Add(gradeD[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeDe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeDe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeDe[maxStr].Count; i++)
{
jarr.Add(gradeDe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeDs.Count > 0)
{
string maxStr = "";
foreach (string key in gradeDs.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeDs[maxStr].Count; i++)
{
jarr.Add(gradeDs[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeAs.Count > 0)
{
foreach (string key in gradeAs.Keys)
{
result += key + ";";
JArray jarr = new JArray();
for (int i = 0; i < gradeAs[key].Count; i++)
{
jarr.Add(gradeAs[key][i]);
}
if (res.ContainsKey(key))
{
continue;
}
else
{
res.Add(key, jarr);
}
}
}
if (gradeBs.Count > 0)
{
foreach (string key in gradeBs.Keys)
{
result += key + ";";
JArray jarr = new JArray();
for (int i = 0; i < gradeBs[key].Count; i++)
{
jarr.Add(gradeBs[key][i]);
}
if (res.ContainsKey(key))
{
continue;
}
else
{
res.Add(key, jarr);
}
}
}
if (gradeCs.Count > 0)
{
foreach (string key in gradeCs.Keys)
{
result += key + ";";
JArray jarr = new JArray();
for (int i = 0; i < gradeCs[key].Count; i++)
{
jarr.Add(gradeCs[key][i]);
}
if (res.ContainsKey(key))
{
continue;
}
else
{
res.Add(key, jarr);
}
}
}
return result;
}
catch (Exception e)
{
}
reader.Close();
_file.Close();
_file.Dispose();
return "";
}
}
}
}
catch { }
return ret;
}
public void UploadData()
{
var name = GetReportName(cmbProjuctSelect.Text);
if (name == "Automation.Inclusions")
{
for (int i = 0; i < _resultCmpAll.Count; i++)
{
var item = _resultCmpAll[i];
var rStr = JsonHelper.ParseResultString(item);
LogHelper.log.Debug("夹杂物结果:" + rStr);
m_dataUpload.CheckItem = 1;
int m = 1;
var table = _tables[i];
m_dataUpload.TESTCODE = table.Rows[0][m++].ToString();
m_dataUpload.SAMPLELOTNO = table.Rows[0][m++].ToString();
m_dataUpload.SAMPLEID = table.Rows[0][m++].ToString();
m_dataUpload.FD_SAMPLE_NO = table.Rows[0][m++].ToString();
m_dataUpload.RECVTIME = table.Rows[0][m++].ToString();
m_dataUpload.FD_SG_SIGN = table.Rows[0][m++].ToString();
m_dataUpload.CheckResult = rStr;
m_dataUpload.Send();
}
}
else if (name == "Automation.Grain")
{
for (int i = 0; i < _resultCmpAll.Count; i++)
{
var item = _resultCmpAll[i];
var rStr = item;
LogHelper.log.Debug("晶粒度结果:" + rStr);
m_dataUpload.CheckItem = 2;
int m = 1;
var table = _tables[i];
m_dataUpload.TESTCODE = table.Rows[0][m++].ToString();
m_dataUpload.SAMPLELOTNO = table.Rows[0][m++].ToString();
m_dataUpload.SAMPLEID = table.Rows[0][m++].ToString();
m_dataUpload.FD_SAMPLE_NO = table.Rows[0][m++].ToString();
m_dataUpload.RECVTIME = table.Rows[0][m++].ToString();
m_dataUpload.FD_SG_SIGN = table.Rows[0][m++].ToString();
m_dataUpload.CheckResult = rStr;
m_dataUpload.Send();
}
}
}
}
}