SmplMeasureReMeasure.cs 11 KB

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