SmplMeasureReMeasure.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using OTSCLRINTERFACE;
  2. using OTSCommon.DBOperate.Model;
  3. using OTSDataType;
  4. using OTSModelSharp;
  5. using OTSModelSharp.DTLBase;
  6. using OTSModelSharp.ServiceCenter;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Drawing;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows.Forms;
  14. using static OTSDataType.otsdataconst;
  15. namespace OTSMeasureApp._0_OTSModel.Measure._4_ReMeasure
  16. {
  17. class SmplMeasureReMeasure : CSmplMeasure
  18. {
  19. OTSIncAMeasureAppForm aMeasureAppForm;
  20. IEDSController eds;
  21. COTSField curFldData;
  22. public SmplMeasureReMeasure(string a_strWorkingFolder, COTSSample a_pSample) : base(a_strWorkingFolder, a_pSample)
  23. {
  24. SetWorkingFolder(a_strWorkingFolder);
  25. SetSample(a_pSample);
  26. m_classifyEngine = new CClassifyEngine();
  27. }
  28. /// <summary>
  29. /// 获取所选样品设定数据
  30. /// </summary>
  31. /// <param name="sampleName"></param>
  32. /// <param name="a_pBSEImg"></param>
  33. /// <returns></returns>
  34. public byte[] SetReFldInfo(string sampleName,CBSEImgClr a_pBSEImg)
  35. {
  36. aMeasureAppForm = (OTSIncAMeasureAppForm)Application.OpenForms["OTSIncAMeasureAppForm"];
  37. COTSSample sampleClr = aMeasureAppForm.m_ProjRstData.GetSampleByName(sampleName);
  38. curFldData = new COTSField(new Point(0, 0), m_Sample.CalculatePixelSize());
  39. curFldData.SetId(0);
  40. curFldData.SetBSEImage(a_pBSEImg);
  41. SetSample(sampleClr);
  42. var expC = m_Sample.GetMsrParams().GetXRayParam().GetAnalyExpCount();
  43. var imgwidth = m_Sample.GetMsrParams().GetImageScanParam().GetImageResolutionSize().cx;
  44. var imgheight = m_Sample.GetMsrParams().GetImageScanParam().GetImageResolutionSize().cy;
  45. var ifautoid = m_Sample.GetMsrParams().GetXRayParam().IfAutoId;
  46. var knownelements = m_Sample.GetMsrParams().GetXRayParam().AnalysisElements;
  47. eds = EDSController.GetEDSController(imgwidth, imgheight, expC, ifautoid, knownelements);
  48. //eds = EDSController.GetEDSController(imgwidth,imgheight,expC);
  49. return a_pBSEImg.GetImageDataPtr();
  50. }
  51. /// <summary>
  52. /// 二次采集能谱
  53. /// </summary>
  54. /// <param name="samplePath"></param>
  55. /// <param name="xrayMode"></param>
  56. /// <param name="particle"></param>
  57. /// <param name="a_nXRayAQTime"></param>
  58. /// <returns></returns>
  59. public bool AcquisitionSpectrum(string samplePath, int xrayMode, double new_PixelSize, ref Particle particle, uint a_nXRayAQTime)
  60. {
  61. try
  62. {
  63. List<COTSParticleClr> cOTSParticleClrs = new List<COTSParticleClr>();
  64. List<Element> elements = new List<Element>();
  65. //采集能谱
  66. COTSParticleClr cOTSParticle = new COTSParticleClr();
  67. CPosXrayClr cPosXray = new CPosXrayClr();
  68. cOTSParticle.SetAnalysisId(particle.XrayId);
  69. cOTSParticle.SetFieldId(particle.FieldId);
  70. cOTSParticle.SetXray(cPosXray);
  71. cOTSParticle.SetXRayPos(new Point(particle.PosX, particle.PosY));
  72. cOTSParticle.SetParticleRect(new Rectangle(particle.RectLeft, particle.RectTop, particle.RectWidth, particle.RectHeight));
  73. cOTSParticle.SetActualArea(particle.Area);
  74. COTSFeatureClr fea = new COTSFeatureClr();
  75. List<COTSSegmentClr> segs = new List<COTSSegmentClr>();
  76. for (int k = 0; k < particle.SegmentNum; k++)
  77. {
  78. segs.Add(new COTSSegmentClr(particle.SegmentList[k].Height, particle.SegmentList[k].Start, particle.SegmentList[k].Length));
  79. }
  80. fea.SetSegmentsList(segs, false);
  81. cOTSParticle.SetFeature(fea);
  82. cOTSParticleClrs.Add(cOTSParticle);
  83. if (xrayMode == (int)OTS_X_RAY_SCAN_MODE.PointMode)
  84. {
  85. eds.GetXRayByParts(cOTSParticleClrs, a_nXRayAQTime, true);
  86. }
  87. else
  88. {
  89. eds.GetXRayByFeatures(cOTSParticleClrs, a_nXRayAQTime, true);
  90. }
  91. //重新计算颗粒信息
  92. CImageHandler m_ImagePro = new CImageHandler();
  93. m_ImagePro.CalParticleImageProp(cOTSParticle, new_PixelSize);
  94. particle.DFERET = cOTSParticle.GetFeretDiameter();
  95. particle.DMAX = cOTSParticle.GetDMAX();
  96. particle.DMIN = cOTSParticle.GetDMIN();
  97. particle.DPERP = cOTSParticle.GetDMPERP();
  98. particle.PERIMETER = cOTSParticle.GetDPRIMETER();
  99. particle.ORIENTATION = cOTSParticle.GetORIENTATION();
  100. particle.DINSCR = cOTSParticle.GetDINSCR();
  101. particle.DMEAN = cOTSParticle.GetDMEAN();
  102. particle.DELONG = cOTSParticle.GetDELONG();
  103. //保存能谱数据库
  104. SQLiteHelper sQLiteHelper = new SQLiteHelper(samplePath + "Inclusion.db");
  105. sQLiteHelper.GetDBConnection();
  106. sQLiteHelper.BeginTransaction();
  107. log.Info("Begin to save info to db ");
  108. uint[] xrayData = cOTSParticle.GetXray().GetXrayData();
  109. byte[] bytedata = new byte[GENERALXRAYCHANNELS * 4];
  110. for (int k = 0; k < GENERALXRAYCHANNELS; k++)
  111. {
  112. uint m = xrayData[k];
  113. byte[] dwordData = BitConverter.GetBytes(m);
  114. bytedata[k * 4] = dwordData[0];
  115. bytedata[k * 4 + 1] = dwordData[1];
  116. bytedata[k * 4 + 2] = dwordData[2];
  117. bytedata[k * 4 + 3] = dwordData[3];
  118. }
  119. if (!sQLiteHelper.ExecuteXrayForTransaction(cOTSParticle.GetAnalysisId(), cOTSParticle.GetFieldId(), bytedata))
  120. {
  121. NLog.LogManager.GetCurrentClassLogger().Error("ExecuteXrayForTransaction failed");
  122. return false;
  123. }
  124. //保存元素数据库
  125. List<CElementChemistryClr> elementChemistryClrs = cOTSParticle.GetXray().GetElementQuantifyData();
  126. List<string> nameList = new List<string>();
  127. List<double> perList = new List<double>();
  128. for (int k = 0; k < elementChemistryClrs.Count; k++)
  129. {
  130. nameList.Add(elementChemistryClrs[k].GetName());
  131. perList.Add(elementChemistryClrs[k].GetPercentage());
  132. Element element = new Element();
  133. element.Name = elementChemistryClrs[k].GetName();
  134. element.Percentage = elementChemistryClrs[k].GetPercentage();
  135. element.ElementId = k;
  136. element.ElementNum = elementChemistryClrs.Count;
  137. element.FieldId = cOTSParticle.GetFieldId();
  138. element.XrayId = cOTSParticle.GetAnalysisId();
  139. elements.Add(element);
  140. }
  141. if (!sQLiteHelper.ExecuteElementForTransaction(cOTSParticle.GetAnalysisId(), cOTSParticle.GetFieldId(), cOTSParticle.GetXray().GetElementNum(), nameList, perList))
  142. {
  143. NLog.LogManager.GetCurrentClassLogger().Error("ExecuteElementForTransaction failed");
  144. return false;
  145. }
  146. //保存颗粒数据库
  147. //if (!sQLiteHelper.ExecuteSegmentForTransaction(cOTSParticle.GetAnalysisId(), cOTSParticle.GetFieldId(), particle.SegmentList))
  148. //{
  149. // NLog.LogManager.GetCurrentClassLogger().Error("ExecuteSegmentForTransaction failed");
  150. // return false;
  151. //}
  152. //重新分类
  153. string stdFileName = m_Sample.GetMsrParams().GetSTDName();
  154. if (stdFileName != "NoSTDDB")
  155. {
  156. if (!stdFileName.Contains(".db"))
  157. {
  158. stdFileName += ".db";
  159. }
  160. var m_classifyEngine = new CClassifyEngine();
  161. IClassifyEngine engine = m_classifyEngine.GetExpressionClassifyEngine(stdFileName);
  162. if (!engine.ClassifyByExpression(cOTSParticle))
  163. {
  164. NLog.LogManager.GetCurrentClassLogger().Error("reclassification failed");
  165. return false;
  166. }
  167. string[] values = new string[31];
  168. values[0] = particle.FieldId.ToString();
  169. values[1] = particle.XrayId.ToString();
  170. values[2] = cOTSParticle.GetAveGray().ToString();
  171. values[3] = particle.RectLeft.ToString();
  172. values[4] = particle.RectTop.ToString();
  173. values[5] = particle.RectWidth.ToString();
  174. values[6] = particle.RectHeight.ToString();
  175. values[7] = particle.Area.ToString();
  176. values[8] = particle.PosX.ToString();
  177. values[9] = particle.PosY.ToString();
  178. values[10] = particle.DFERET.ToString();
  179. values[11] = particle.SegmentNum.ToString();
  180. values[12] = particle.FieldPosX.ToString();
  181. values[13] = particle.FieldPosY.ToString();
  182. values[14] = particle.ParticleId.ToString();
  183. values[15] = particle.DMAX.ToString();
  184. values[16] = particle.DMIN.ToString();
  185. values[17] = particle.DPERP.ToString();
  186. values[18] = particle.PERIMETER.ToString();
  187. values[19] = particle.ORIENTATION.ToString();
  188. values[20] = particle.DINSCR.ToString();
  189. values[21] = particle.DMEAN.ToString();
  190. values[22] = particle.DELONG.ToString();
  191. values[23] = cOTSParticle.GetClassifyId().ToString();
  192. values[24] = cOTSParticle.GetTypeName().ToString();
  193. values[25] = cOTSParticle.GetTypeColor().ToString();
  194. values[26] = particle.SEMPosX.ToString();
  195. values[27] = particle.SEMPosY.ToString();
  196. values[28] = cOTSParticle.GetGrpId().ToString();
  197. values[29] = cOTSParticle.GetGrpName().ToString();
  198. values[30] = cOTSParticle.GetGrpColor().ToString();
  199. if (!sQLiteHelper.ExecuteIncAForTransaction("IncADataReMeasure", values))
  200. {
  201. NLog.LogManager.GetCurrentClassLogger().Error("ExecuteIncAForTransaction failed");
  202. return false;
  203. }
  204. particle.TypeName = cOTSParticle.GetTypeName();
  205. particle.ElementList = elements;
  206. particle.XRayData = bytedata;
  207. }
  208. sQLiteHelper.CommitTransaction();
  209. return true;
  210. }
  211. catch (Exception ex)
  212. {
  213. NLog.LogManager.GetCurrentClassLogger().Error(ex.ToString());
  214. return false;
  215. }
  216. }
  217. }
  218. }