using OTSCLRINTERFACE;
using OTSCommon.DBOperate.Model;
using OTSDataType;
using OTSModelSharp;
using OTSModelSharp.DTLBase;
using OTSModelSharp.ServiceCenter;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static OTSDataType.otsdataconst;
namespace OTSMeasureApp._0_OTSModel.Measure._4_ReMeasure
{
class SmplMeasureReMeasure : CSmplMeasure
{
OTSIncAMeasureAppForm aMeasureAppForm;
IEDSController eds;
COTSField curFldData;
public SmplMeasureReMeasure(string a_strWorkingFolder, COTSSample a_pSample) : base(a_strWorkingFolder, a_pSample)
{
SetWorkingFolder(a_strWorkingFolder);
SetSample(a_pSample);
m_classifyEngine = new CClassifyEngine();
}
///
/// 获取所选样品设定数据
///
///
///
///
public byte[] SetReFldInfo(string sampleName,CBSEImgClr a_pBSEImg)
{
aMeasureAppForm = (OTSIncAMeasureAppForm)Application.OpenForms["OTSIncAMeasureAppForm"];
COTSSample sampleClr = aMeasureAppForm.m_ProjRstData.GetSampleByName(sampleName);
curFldData = new COTSField(new Point(0, 0), m_Sample.CalculatePixelSize());
curFldData.SetId(0);
curFldData.SetBSEImage(a_pBSEImg);
SetSample(sampleClr);
var expC = m_Sample.GetMsrParams().GetXRayParam().GetAnalyExpCount();
var imgwidth = m_Sample.GetMsrParams().GetImageScanParam().GetImageResolutionSize().cx;
var imgheight = m_Sample.GetMsrParams().GetImageScanParam().GetImageResolutionSize().cy;
var ifautoid = m_Sample.GetMsrParams().GetXRayParam().IfAutoId;
var knownelements = m_Sample.GetMsrParams().GetXRayParam().AnalysisElements;
eds = EDSController.GetEDSController(imgwidth, imgheight, expC, ifautoid, knownelements);
//eds = EDSController.GetEDSController(imgwidth,imgheight,expC);
return a_pBSEImg.GetImageDataPtr();
}
///
/// 二次采集能谱
///
///
///
///
///
///
public bool AcquisitionSpectrum(string samplePath, int xrayMode, double new_PixelSize, ref Particle particle, uint a_nXRayAQTime)
{
try
{
List cOTSParticleClrs = new List();
List elements = new List();
//采集能谱
COTSParticleClr cOTSParticle = new COTSParticleClr();
CPosXrayClr cPosXray = new CPosXrayClr();
cOTSParticle.SetAnalysisId(particle.XrayId);
cOTSParticle.SetFieldId(particle.FieldId);
cOTSParticle.SetXray(cPosXray);
cOTSParticle.SetXRayPos(new Point(particle.PosX, particle.PosY));
cOTSParticle.SetParticleRect(new Rectangle(particle.RectLeft, particle.RectTop, particle.RectWidth, particle.RectHeight));
cOTSParticle.SetActualArea(particle.Area);
COTSFeatureClr fea = new COTSFeatureClr();
List segs = new List();
for (int k = 0; k < particle.SegmentNum; k++)
{
segs.Add(new COTSSegmentClr(particle.SegmentList[k].Height, particle.SegmentList[k].Start, particle.SegmentList[k].Length));
}
fea.SetSegmentsList(segs, false);
cOTSParticle.SetFeature(fea);
cOTSParticleClrs.Add(cOTSParticle);
if (xrayMode == (int)OTS_X_RAY_SCAN_MODE.PointMode)
{
eds.GetXRayByParts(cOTSParticleClrs, a_nXRayAQTime, true);
}
else
{
eds.GetXRayByFeatures(cOTSParticleClrs, a_nXRayAQTime, true);
}
//重新计算颗粒信息
CImageHandler m_ImagePro = new CImageHandler();
m_ImagePro.CalParticleImageProp(cOTSParticle, new_PixelSize);
particle.DFERET = cOTSParticle.GetFeretDiameter();
particle.DMAX = cOTSParticle.GetDMAX();
particle.DMIN = cOTSParticle.GetDMIN();
particle.DPERP = cOTSParticle.GetDMPERP();
particle.PERIMETER = cOTSParticle.GetDPRIMETER();
particle.ORIENTATION = cOTSParticle.GetORIENTATION();
particle.DINSCR = cOTSParticle.GetDINSCR();
particle.DMEAN = cOTSParticle.GetDMEAN();
particle.DELONG = cOTSParticle.GetDELONG();
//保存能谱数据库
SQLiteHelper sQLiteHelper = new SQLiteHelper(samplePath + "Inclusion.db");
sQLiteHelper.GetDBConnection();
sQLiteHelper.BeginTransaction();
log.Info("Begin to save info to db ");
uint[] xrayData = cOTSParticle.GetXray().GetXrayData();
byte[] bytedata = new byte[GENERALXRAYCHANNELS * 4];
for (int k = 0; k < GENERALXRAYCHANNELS; k++)
{
uint m = xrayData[k];
byte[] dwordData = BitConverter.GetBytes(m);
bytedata[k * 4] = dwordData[0];
bytedata[k * 4 + 1] = dwordData[1];
bytedata[k * 4 + 2] = dwordData[2];
bytedata[k * 4 + 3] = dwordData[3];
}
if (!sQLiteHelper.ExecuteXrayForTransaction(cOTSParticle.GetAnalysisId(), cOTSParticle.GetFieldId(), bytedata))
{
NLog.LogManager.GetCurrentClassLogger().Error("ExecuteXrayForTransaction failed");
return false;
}
//保存元素数据库
List elementChemistryClrs = cOTSParticle.GetXray().GetElementQuantifyData();
List nameList = new List();
List perList = new List();
for (int k = 0; k < elementChemistryClrs.Count; k++)
{
nameList.Add(elementChemistryClrs[k].GetName());
perList.Add(elementChemistryClrs[k].GetPercentage());
Element element = new Element();
element.Name = elementChemistryClrs[k].GetName();
element.Percentage = elementChemistryClrs[k].GetPercentage();
element.ElementId = k;
element.ElementNum = elementChemistryClrs.Count;
element.FieldId = cOTSParticle.GetFieldId();
element.XrayId = cOTSParticle.GetAnalysisId();
elements.Add(element);
}
if (!sQLiteHelper.ExecuteElementForTransaction(cOTSParticle.GetAnalysisId(), cOTSParticle.GetFieldId(), cOTSParticle.GetXray().GetElementNum(), nameList, perList))
{
NLog.LogManager.GetCurrentClassLogger().Error("ExecuteElementForTransaction failed");
return false;
}
//保存颗粒数据库
//if (!sQLiteHelper.ExecuteSegmentForTransaction(cOTSParticle.GetAnalysisId(), cOTSParticle.GetFieldId(), particle.SegmentList))
//{
// NLog.LogManager.GetCurrentClassLogger().Error("ExecuteSegmentForTransaction failed");
// return false;
//}
//重新分类
string stdFileName = m_Sample.GetMsrParams().GetSTDName();
if (stdFileName != "NoSTDDB")
{
if (!stdFileName.Contains(".db"))
{
stdFileName += ".db";
}
var m_classifyEngine = new CClassifyEngine();
IClassifyEngine engine = m_classifyEngine.GetExpressionClassifyEngine(stdFileName);
if (!engine.ClassifyByExpression(cOTSParticle))
{
NLog.LogManager.GetCurrentClassLogger().Error("reclassification failed");
return false;
}
string[] values = new string[31];
values[0] = particle.FieldId.ToString();
values[1] = particle.XrayId.ToString();
values[2] = cOTSParticle.GetAveGray().ToString();
values[3] = particle.RectLeft.ToString();
values[4] = particle.RectTop.ToString();
values[5] = particle.RectWidth.ToString();
values[6] = particle.RectHeight.ToString();
values[7] = particle.Area.ToString();
values[8] = particle.PosX.ToString();
values[9] = particle.PosY.ToString();
values[10] = particle.DFERET.ToString();
values[11] = particle.SegmentNum.ToString();
values[12] = particle.FieldPosX.ToString();
values[13] = particle.FieldPosY.ToString();
values[14] = particle.ParticleId.ToString();
values[15] = particle.DMAX.ToString();
values[16] = particle.DMIN.ToString();
values[17] = particle.DPERP.ToString();
values[18] = particle.PERIMETER.ToString();
values[19] = particle.ORIENTATION.ToString();
values[20] = particle.DINSCR.ToString();
values[21] = particle.DMEAN.ToString();
values[22] = particle.DELONG.ToString();
values[23] = cOTSParticle.GetClassifyId().ToString();
values[24] = cOTSParticle.GetTypeName().ToString();
values[25] = cOTSParticle.GetTypeColor().ToString();
values[26] = particle.SEMPosX.ToString();
values[27] = particle.SEMPosY.ToString();
values[28] = cOTSParticle.GetGrpId().ToString();
values[29] = cOTSParticle.GetGrpName().ToString();
values[30] = cOTSParticle.GetGrpColor().ToString();
if (!sQLiteHelper.ExecuteIncAForTransaction("IncADataReMeasure", values))
{
NLog.LogManager.GetCurrentClassLogger().Error("ExecuteIncAForTransaction failed");
return false;
}
particle.TypeName = cOTSParticle.GetTypeName();
particle.ElementList = elements;
particle.XRayData = bytedata;
}
sQLiteHelper.CommitTransaction();
return true;
}
catch (Exception ex)
{
NLog.LogManager.GetCurrentClassLogger().Error(ex.ToString());
return false;
}
}
}
}