SmplMeasureReMeasure.cs 11 KB

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