ParticleList.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. using DevExpress.DataAccess.Sql;
  2. using DevExpress.Office.Utils;
  3. using DevExpress.PivotGrid.OLAP.SchemaEntities;
  4. using DevExpress.XtraDiagram.Bars;
  5. using DevExpress.XtraTreeList.Data;
  6. using NPOI.Util;
  7. using Org.BouncyCastle.Crypto;
  8. using OTSCommon.DBOperate;
  9. using OTSCommon.DBOperate.Model;
  10. using OTSIncAReportApp._1_UI.Control_Graph.Controls;
  11. using OTSIncAReportApp._3_ServiceCenter.DataOperation.DataAccess;
  12. using OTSIncAReportApp.DataOperation.DataAccess;
  13. using OTSIncAReportApp.OTSRstMgrFunction;
  14. using OTSIncAReportGraph.Controls;
  15. using OTSIncAReportGrids;
  16. using OTSPeriodicTable;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Data;
  20. using System.Drawing;
  21. using System.IO;
  22. using System.Linq;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. using System.Windows.Forms;
  26. using System.Windows.Media;
  27. using static NPOI.HSSF.Util.HSSFColor;
  28. using static OTSDataType.otsdataconst;
  29. using static OTSIncAReportApp.OTSReport_Export;
  30. namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
  31. {
  32. /// <summary>
  33. /// 颗粒列表
  34. /// </summary>
  35. class ParticleList
  36. {
  37. ParticleData fielddata;
  38. FieldImage imgAcc;
  39. /// <summary>
  40. /// DEV颗粒列表颗粒前20个谱图排序
  41. /// </summary>
  42. /// <param name="m_mbszclass"></param>
  43. /// <returns></returns>
  44. public List<DataTable> Get_dev_kllb_data(c_TemplateClass m_mbszclass, OTSReport_Export m_otsreport_export, BasicData basicData, out List<DataTable> a_FilteredData)
  45. {
  46. // 优化要点:
  47. // - 缓存频繁访问的属性到局部变量
  48. // - 用 HashSet/Dictionary 减少重复查找
  49. // - 将重复创建的对象移出循环
  50. // - 修复原有循环/索引错误
  51. // - 保持原有输出结构与行为
  52. // basic path & helpers
  53. string str_resultPath = m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[
  54. m_otsreport_export.m_ReportApp.m_rstDataMgr.GetWorkingResultId()]
  55. .FilePath;
  56. fielddata = new ParticleData(str_resultPath);
  57. imgAcc = new FieldImage(str_resultPath);
  58. List<DataTable> OutDt = new List<DataTable>();
  59. a_FilteredData = new List<DataTable>();
  60. List<DataTable> datas = basicData.GetMeasurements() ?? new List<DataTable>();
  61. DataTable SpliceMeasurements = basicData.GetSpliceMeasurements();
  62. DataTable spliceAll = basicData.ObtainInformationOnSplicedParticles(m_otsreport_export);
  63. // resolve result file (same logic as original)
  64. ResultFile result;
  65. string sou = m_otsreport_export.m_ReportApp.m_conditionChoose.m_CurrentConditions[
  66. OTSIncAReportApp.OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE]
  67. .itemDisplayVal.ToString();
  68. if (sou.Contains("+"))
  69. {
  70. MessageBox.Show("This function does not support multiple samples!");
  71. result = m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[0];
  72. }
  73. else
  74. {
  75. result = m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[
  76. m_otsreport_export.m_ReportApp.m_conditionChoose.m_conditionData
  77. .GetComboDownListIndexByItemName(OTSIncAReportApp.OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE)
  78. ];
  79. }
  80. ParticlesGridDevidePage particlesGridDevide = new ParticlesGridDevidePage(m_otsreport_export.m_ReportApp);
  81. particlesGridDevide.fldImgAccess = new FieldImage(result.FilePath);
  82. particlesGridDevide.Particledata = new ParticleData(result.FilePath);
  83. // prepare maps for splice lookups to avoid repeated loops
  84. HashSet<string> spliceSubSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
  85. if (spliceAll != null)
  86. {
  87. foreach (DataRow r in spliceAll.Rows)
  88. {
  89. var sub = r["SubParticles"]?.ToString();
  90. if (!string.IsNullOrWhiteSpace(sub)) spliceSubSet.Add(sub);
  91. }
  92. }
  93. // map splice measurements by key "FieldId_XrayId"
  94. var spliceMeasurementsMap = new Dictionary<string, List<DataRow>>(StringComparer.OrdinalIgnoreCase);
  95. if (SpliceMeasurements != null)
  96. {
  97. foreach (DataRow r in SpliceMeasurements.Rows)
  98. {
  99. var key = r["FieldId"] + "_" + r["XrayId"];
  100. if (!spliceMeasurementsMap.TryGetValue(key, out var list))
  101. {
  102. list = new List<DataRow>();
  103. spliceMeasurementsMap[key] = list;
  104. }
  105. list.Add(r);
  106. }
  107. }
  108. // cache deletion set (serial)
  109. var deleteSerialSet = new HashSet<string>(m_mbszclass.M_KLLBXX.list_str_kllb_DeleteClass_Serial ?? new List<string>(), StringComparer.OrdinalIgnoreCase);
  110. ImageProcessor imageProcessor = new ImageProcessor();
  111. for (int i = 0; i < datas.Count; i++)
  112. {
  113. int serialNumber = 1;
  114. DataTable current = datas[i];
  115. if (current == null) continue;
  116. // 如果是 TCCleannessA,需要添加 Hardness 列并尝试从标准库读取硬度数据
  117. bool needHardness = m_otsreport_export.m_ReportApp.m_RptConfigFile.Systype == OTS_SysType_ID.TCCleannessA;
  118. if (needHardness)
  119. {
  120. if (!current.Columns.Contains("Hardness")) current.Columns.Add("Hardness", typeof(double));
  121. if (!current.Columns.Contains("Hardness_detailed")) current.Columns.Add("Hardness_detailed");
  122. // 将 STL 数据应用到表(若可用)
  123. DataTable dt_stl;
  124. if (GetSTL(basicData.GetResfile(), out dt_stl, m_otsreport_export) && dt_stl != null)
  125. {
  126. // 建立字典:TypeId(string) -> row for快速匹配
  127. var stlDict = new Dictionary<string, DataRow>(StringComparer.OrdinalIgnoreCase);
  128. foreach (DataRow r in dt_stl.Rows)
  129. {
  130. var key = r["TypeId"]?.ToString();
  131. if (!string.IsNullOrEmpty(key)) stlDict[key] = r;
  132. }
  133. for (int r = 0; r < current.Rows.Count; r++)
  134. {
  135. var typeName = current.Rows[r]["TypeName"]?.ToString();
  136. if (!string.IsNullOrEmpty(typeName) && stlDict.TryGetValue(typeName, out var drStl))
  137. {
  138. double hard = 0;
  139. try { hard = Convert.ToDouble(drStl["Hardness"]); } catch { hard = 0; }
  140. current.Rows[r]["Hardness"] = hard;
  141. current.Rows[r]["Hardness_detailed"] = drStl["Hardness_detailed"];
  142. }
  143. }
  144. }
  145. }
  146. #region 夹杂物筛选(按序号删除)
  147. for (int b = current.Rows.Count - 1; b >= 0; b--)
  148. {
  149. var typeId = current.Rows[b]["TypeId"]?.ToString();
  150. if (!string.IsNullOrEmpty(typeId) && deleteSerialSet.Contains(typeId))
  151. {
  152. current.Rows.RemoveAt(b);
  153. }
  154. }
  155. #endregion
  156. #region 排序并生成 p1Data_b
  157. DataTable table = current.Copy();
  158. DataView dvs = table.DefaultView;
  159. dvs.Sort = m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p1 + " DESC";
  160. DataTable p1Data_b = dvs.ToTable();
  161. #endregion
  162. // 增加元素列,原逻辑使用 fielddata.AddElementColumn
  163. DataTable p1Data = fielddata.AddElementColumn(p1Data_b, m_mbszclass, spliceAll);
  164. #region 创建要插入数据库表结构
  165. DataTable DT_Largest20 = new DataTable();
  166. DT_Largest20.TableName = "Largest20";
  167. DT_Largest20.Columns.Add("pid");
  168. DT_Largest20.Columns.Add("Size");
  169. DT_Largest20.Columns.Add("Width");
  170. DT_Largest20.Columns.Add("DMAX");
  171. DT_Largest20.Columns.Add("DMIN");
  172. DT_Largest20.Columns.Add("Class");
  173. DT_Largest20.Columns.Add("ColName1");
  174. DT_Largest20.Columns.Add("ColName2");
  175. DT_Largest20.Columns.Add("ColName3");
  176. DT_Largest20.Columns.Add("ColName4");
  177. DT_Largest20.Columns.Add("ColName5");
  178. DT_Largest20.Columns.Add("ColName6");
  179. DT_Largest20.Columns.Add("ColName7");
  180. DT_Largest20.Columns.Add("ColName8");
  181. DT_Largest20.Columns.Add("ColName9");
  182. DT_Largest20.Columns.Add("ColName10");
  183. DT_Largest20.Columns.Add("ColVal1");
  184. DT_Largest20.Columns.Add("ColVal2");
  185. DT_Largest20.Columns.Add("ColVal3");
  186. DT_Largest20.Columns.Add("ColVal4");
  187. DT_Largest20.Columns.Add("ColVal5");
  188. DT_Largest20.Columns.Add("ColVal6");
  189. DT_Largest20.Columns.Add("ColVal7");
  190. DT_Largest20.Columns.Add("ColVal8");
  191. DT_Largest20.Columns.Add("ColVal9");
  192. DT_Largest20.Columns.Add("ColVal10");
  193. DT_Largest20.Columns.Add("p1", typeof(Bitmap));
  194. DT_Largest20.Columns.Add("p2", typeof(Bitmap));
  195. DT_Largest20.Columns.Add("p3", typeof(Bitmap));
  196. DT_Largest20.Columns.Add("GroupName");
  197. #endregion
  198. // 插入颗粒部份
  199. DataTable FilteredData = p1Data.Clone();
  200. for (int i_row = 0; i_row < p1Data.Rows.Count; i_row++)
  201. {
  202. var row = p1Data.Rows[i_row];
  203. // 快速判空和排除
  204. var elementStr = row["Element"]?.ToString();
  205. var typeName = row["TypeName"]?.ToString();
  206. if (string.IsNullOrWhiteSpace(elementStr)) continue;
  207. if (string.Equals(typeName, "Not Identified", StringComparison.OrdinalIgnoreCase)) continue;
  208. var subParticles = row["SubParticles"]?.ToString() ?? "";
  209. var fieldid = row["fieldid"]?.ToString();
  210. if (string.IsNullOrWhiteSpace(fieldid) || fieldid == "-1") continue;
  211. // 超出要显示数量则跳出
  212. if (serialNumber > m_mbszclass.M_KLLBXX.list_int_kllb_number) break;
  213. // 判断是否为拼接
  214. bool isSplice = !string.IsNullOrEmpty(subParticles) && spliceSubSet.Contains(subParticles);
  215. // 准备表行副本,用于取 Tag 等
  216. DataTable table1 = p1Data.Clone();
  217. table1.ImportRow(row);
  218. Bitmap bp_particle = null;
  219. Bitmap BP = null;
  220. Bitmap ls_xraybpnew = null;
  221. if (!isSplice)
  222. {
  223. // 原图 & 二值图 & 能谱
  224. bp_particle = imgAcc.GetBitmapByParticleForUncombinedParticle(table1);
  225. bp_particle = imageProcessor.ResizeImageWithPadding(bp_particle, 120, 120, System.Drawing.Color.White);
  226. bp_particle.Tag = new List<string>() { row["FieldId"].ToString(), row["ParticleId"].ToString(), row["TypeId"].ToString() };
  227. // 能谱图
  228. ls_xraybpnew = null;
  229. try
  230. {
  231. System.Drawing.Bitmap bp_xraybp = ExportXRayBitmap(row["fieldid"].ToString(), row["particleid"].ToString(),
  232. Convert.ToInt32(row["TypeId"]), row["TypeName"].ToString(), fielddata);
  233. if (bp_xraybp != null) ls_xraybpnew = OTSIncAReportGraph.Class.DrawFunction.KiResizeImage(bp_xraybp, 700, 115);
  234. }
  235. catch { ls_xraybpnew = null; }
  236. // 二次放大黑白图(Binary)
  237. try
  238. {
  239. DataTable SegmentData = fielddata.GetSegment();
  240. Bitmap BinaryParticles = ImageSplicer.ParticleBinaryDiagram(SegmentData, Convert.ToInt32(fieldid), Convert.ToInt32(row["particleid"]));
  241. BP = imageProcessor.ResizeImageWithPadding(BinaryParticles, 120, 120, System.Drawing.Color.White);
  242. }
  243. catch { BP = new Bitmap(1, 1); }
  244. }
  245. else
  246. {
  247. // 组合拼接:收集子颗粒的 SpliceMeasurements 行
  248. List<string> strFieldId = new List<string>();
  249. List<string> strXrayId = new List<string>();
  250. string[] fruits = subParticles.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  251. foreach (var f in fruits)
  252. {
  253. var parts = f.Split(':');
  254. if (parts.Length >= 2)
  255. {
  256. strFieldId.Add(parts[0]);
  257. strXrayId.Add(parts[1]);
  258. }
  259. }
  260. DataTable SpliceData = p1Data.Clone();
  261. for (int splice = 0; splice < strFieldId.Count; splice++)
  262. {
  263. var key = strFieldId[splice] + "_" + strXrayId[splice];
  264. if (spliceMeasurementsMap.TryGetValue(key, out var drs))
  265. {
  266. foreach (var dr in drs) SpliceData.ImportRow(dr);
  267. }
  268. }
  269. // 原图(拼接)
  270. double pix = particlesGridDevide.result.GetPixelSize();
  271. int bitHeight = particlesGridDevide.result.GetImageHeight();
  272. int bitWidth = particlesGridDevide.result.GetImageWidth();
  273. try
  274. {
  275. Bitmap original = particlesGridDevide.fldImgAccess.GetBitmapForParticleAll(subParticles, SpliceData, pix, bitHeight, bitWidth);
  276. bp_particle = OTSIncAReportGraph.Class.DrawFunction.KiResizeImage(original, 120, 120);
  277. }
  278. catch { bp_particle = new Bitmap(1, 1); }
  279. // 黑白图
  280. try
  281. {
  282. var segsData = new Dictionary<string, List<Segment>>();
  283. foreach (DataRow dow in SpliceData.Rows)
  284. {
  285. int fldid = Convert.ToInt32(dow["fieldid"]);
  286. int partid = Convert.ToInt32(dow["particleId"]);
  287. var listseg = particlesGridDevide.Particledata.GetSegmentData(fldid, partid);
  288. string key = dow["fieldid"].ToString() + "_" + dow["particleid"].ToString();
  289. segsData[key] = listseg;
  290. }
  291. Bitmap black = particlesGridDevide.fldImgAccess.GetBitmapForParticleAllWithBlackAndWhite(subParticles, SpliceData, segsData, pix, bitHeight, bitWidth);
  292. BP = OTSIncAReportGraph.Class.DrawFunction.KiResizeImage(black, 120, 120);
  293. }
  294. catch { BP = new Bitmap(1, 1); }
  295. // 谱图(拼接)
  296. try
  297. {
  298. Bitmap xraybpnew = splice_ExportXRayBitmap(subParticles, Convert.ToInt32(row["particleId"]), Convert.ToInt32(row["fieldid"]), particlesGridDevide.Particledata, row["TypeName"].ToString());
  299. ls_xraybpnew = OTSIncAReportGraph.Class.DrawFunction.KiResizeImage(xraybpnew, 700, 115);
  300. }
  301. catch { ls_xraybpnew = null; }
  302. }
  303. // 填充 DT_Largest20 行
  304. DataRow drOut = DT_Largest20.NewRow();
  305. drOut["p1"] = bp_particle;
  306. drOut["p2"] = BP;
  307. drOut["p3"] = ls_xraybpnew;
  308. drOut["pid"] = serialNumber++.ToString();
  309. drOut["Size"] = datatable_data(p1Data, i_row, m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p1);
  310. drOut["Width"] = p1Data.Rows[i_row]["rectwidth"].ToString();
  311. drOut["DMAX"] = datatable_data(p1Data, i_row, m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p2);
  312. drOut["DMIN"] = datatable_data(p1Data, i_row, m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p3);
  313. drOut["Class"] = p1Data.Rows[i_row]["typename"].ToString();
  314. drOut["GroupName"] = p1Data.Rows[i_row]["GroupName"].ToString();
  315. // 元素 top N
  316. GetMaxElementFromDataTable(p1Data, i_row, out List<string> list_max_elementname, out List<double> list_max_elementvale);
  317. double colVal = list_max_elementvale.Sum();
  318. // 填充 10 个元素名和值(不足用空/0 补齐)
  319. for (int e = 0; e < 10; e++)
  320. {
  321. string nameCol = "ColName" + (e + 1);
  322. string valCol = "ColVal" + (e + 1);
  323. if (e < list_max_elementname.Count)
  324. {
  325. drOut[nameCol] = list_max_elementname[e];
  326. drOut[valCol] = ParameterNormalization(colVal, list_max_elementvale[e]);
  327. }
  328. else
  329. {
  330. drOut[nameCol] = " ";
  331. drOut[valCol] = "";
  332. }
  333. }
  334. DT_Largest20.Rows.Add(drOut);
  335. FilteredData.Rows.Add(p1Data.Rows[i_row].ItemArray);
  336. }
  337. OutDt.Add(DT_Largest20);
  338. a_FilteredData.Add(FilteredData);
  339. }
  340. return OutDt;
  341. }
  342. /// <summary>
  343. /// 颗粒列表帧图
  344. /// </summary>
  345. /// <param name="m_mbszclass"></param>
  346. /// <param name="file_pic"></param>
  347. /// <param name="list_dt"></param>
  348. /// <param name="m_otsreport_export"></param>
  349. public void Get_dev_kllb_data_frame_pic(c_TemplateClass m_mbszclass, out DataTable file_pic, out List<DataTable> list_dt, OTSReport_Export m_otsreport_export, List<DataTable> a_FrameData)
  350. {
  351. //去除拼接后的颗粒
  352. List<DataTable> FrameData = new List<DataTable>();
  353. for (int i = 0; i < a_FrameData.Count; i++)
  354. {
  355. DataTable DT = a_FrameData[i].Clone();
  356. for (int a = 0; a < a_FrameData[i].Rows.Count; a++)
  357. {
  358. if (a_FrameData[i].Rows[a]["SubParticles"].ToString() == "")
  359. {
  360. DT.Rows.Add(a_FrameData[i].Rows[a].ItemArray);
  361. }
  362. }
  363. FrameData.Add(DT);
  364. }
  365. m_otsreport_export.m_ReportApp.im_ParticlesGridDevidePage = new ParticlesGridDevidePage(m_otsreport_export.m_ReportApp);
  366. //根据sql条件,查询获取颗粒信息数据
  367. ParticleData fielddata = new ParticleData(m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.GetWorkingResultId()].FilePath);
  368. string str_resultPath = m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.GetWorkingResultId()].FilePath;
  369. file_pic =new DataTable();
  370. file_pic.Clear();
  371. file_pic.Columns.Add("fieldid");
  372. file_pic.Columns.Add("id");
  373. file_pic.Columns.Add("fieldName");
  374. file_pic.Columns.Add("cunt", typeof(int));
  375. file_pic.Columns.Add("fieldFullName");
  376. file_pic.Columns.Add("Field_pic", typeof(Bitmap));
  377. list_dt = new List<DataTable>();
  378. for (int i = 0; i < FrameData.Count; i++)
  379. {
  380. DataTable pic = new DataTable();
  381. List<DataTable> picDt = new List<DataTable>();
  382. m_otsreport_export.m_ReportApp.im_ParticlesGridDevidePage.Out_MarkParticleRectangleOnFieldFile(str_resultPath, FrameData[i], out List<string> vs, out DataTable data);
  383. DataTable data_A = FrameGraphParticleTableDatat(FrameData[i], fielddata, data, m_mbszclass, m_otsreport_export);
  384. for (int a = 0; a < data.Rows.Count; a++)
  385. {
  386. DataTable dataTable = data_A.Clone();
  387. //在数据表中有颗粒在该帧图中的话,则对该帧图标记图像进行读取存入数据库
  388. DataRow[] datarowlist = data_A.Select(data.Rows[a]["fieldid"].ToString());
  389. if (datarowlist.Count() > 0)
  390. {
  391. for (int b = 0; b < data_A.Rows.Count; b++)
  392. {
  393. if (data.Rows[a]["id"].ToString() == data_A.Rows[b]["FieldId"].ToString())
  394. {
  395. dataTable.Rows.Add(data_A.Rows[b].ItemArray);
  396. dataTable.TableName = data_A.Rows[b]["FieldId"].ToString();
  397. }
  398. }
  399. list_dt.Add(dataTable);
  400. file_pic.Rows.Add(data.Rows[a].ItemArray);
  401. }
  402. }
  403. }
  404. }
  405. private bool GetSTL(string str, out DataTable data,OTSReport_Export m_otsreport_export)
  406. {
  407. if (str.ToLower() == "nostddb")
  408. {
  409. data = null;
  410. return false;
  411. }
  412. DataTable dt = new DataTable();
  413. dt.Columns.Add("TypeId");
  414. dt.Columns.Add("Hardness", typeof(double));
  415. dt.Columns.Add("Hardness_detailed");
  416. OTSCommon.DBOperate.SqLiteHelper sh = null;
  417. string fullPath = m_otsreport_export.m_ReportApp.m_rstDataMgr.CurResultFile.FilePath + "\\" + str + ".db";
  418. string fullPath2 = System.IO.Directory.GetCurrentDirectory() + "\\Config\\SysData\\" + str + ".db";
  419. if (System.IO.File.Exists(fullPath))
  420. {
  421. sh = new OTSCommon.DBOperate.SqLiteHelper("data source='" + fullPath + "'");
  422. }
  423. else if (System.IO.File.Exists(fullPath2))
  424. {
  425. sh = new OTSCommon.DBOperate.SqLiteHelper("data source='" + fullPath2 + "'");
  426. }
  427. else
  428. {
  429. sh = null;
  430. data = null;
  431. return false;
  432. }
  433. DataTable dt_stl = sh.ExecuteQuery("select * from ClassifySTD");
  434. for (int i = 0; i < dt_stl.Rows.Count; i++)
  435. {
  436. DataRow dr = dt.NewRow();
  437. dr["TypeId"] = dt_stl.Rows[i]["StrName"].ToString();
  438. dr["Hardness_detailed"] = dt_stl.Rows[i]["Hardness"].ToString();
  439. if (System.Text.RegularExpressions.Regex.Replace(dt_stl.Rows[i]["Hardness"].ToString(), @"[^\d.\d]", "").ToString() != "")
  440. {
  441. try
  442. {
  443. if (System.Text.RegularExpressions.Regex.Replace(dt_stl.Rows[i]["Hardness"].ToString(), @"[^\d.\d]", "") == "o. Def.")
  444. {
  445. dr["Hardness"] = 0;
  446. }
  447. else
  448. {
  449. dr["Hardness"] = Convert.ToDouble(System.Text.RegularExpressions.Regex.Replace(dt_stl.Rows[i]["Hardness"].ToString(), @"[^\d.\d]", ""));
  450. }
  451. }
  452. catch
  453. {
  454. dr["Hardness"] = 0;
  455. }
  456. }
  457. else
  458. {
  459. dr["Hardness"] = 0;
  460. }
  461. dt.Rows.Add(dr);
  462. }
  463. data = dt;
  464. return true;
  465. }
  466. /// <summary>
  467. /// 输入颗粒的所在帧图id,颗粒id,颗粒类型id,获取对应的XRay能谱数据图
  468. /// </summary>
  469. /// <returns></returns>
  470. private Bitmap ExportXRayBitmap(string in_fieldid, string in_particleid, int in_stdtypeid, string TypeName, ParticleData particleData)
  471. {
  472. Bitmap ret_bp;
  473. //显示xray相关信息
  474. uint[] Analysis_xray = new uint[2000];
  475. int i_xray_id = 0;
  476. List<Element> list_celementchemistryclr = new List<Element>();
  477. //获取Xray数据
  478. Particle list = particleData.GetParticleByFidAndPid(in_fieldid, in_particleid);
  479. if (list == null)
  480. {
  481. return null;
  482. }
  483. Particle particle = list;
  484. if (particle.XrayId > -1)
  485. {
  486. for (int i = 0; i < 2000; i++)
  487. {
  488. if (particle.XRayData != null)
  489. {
  490. Analysis_xray[i] = BitConverter.ToUInt32(particle.XRayData, i * 4);
  491. }
  492. }
  493. i_xray_id = particle.XrayId;
  494. list_celementchemistryclr = particle.ElementList;
  495. }
  496. //get CElementChemistryClr list
  497. List<ShowElementInfo> list_showelementinfo = new List<ShowElementInfo>();
  498. for (int i = 0; i < list_celementchemistryclr.Count; i++)
  499. {
  500. ShowElementInfo ls_sei = new ShowElementInfo();
  501. ls_sei.ElementName = list_celementchemistryclr[i].Name;
  502. ls_sei.Percentage = list_celementchemistryclr[i].Percentage;
  503. ls_sei.dKF = Convert.ToDouble(CListPeriodic.GetPeriodicByEleName(ls_sei.ElementName).K_Peak);
  504. list_showelementinfo.Add(ls_sei);
  505. }
  506. //获取使用标准库的名称
  507. string str_stdname = "";
  508. string str_IncALibName = "";
  509. if (in_stdtypeid < 1000)
  510. {
  511. //小于1000,使用系统默认分类
  512. str_IncALibName = TypeName;
  513. str_stdname = "Default standard library";
  514. }
  515. else if (in_stdtypeid >= 1000 && in_stdtypeid < 10000)
  516. {
  517. //大于等于1000,并且小于10000时,使用系统数据库中夹杂物来分析
  518. str_IncALibName = TypeName;
  519. str_stdname = "User defined standard library";
  520. }
  521. else if (in_stdtypeid > 10000)
  522. {
  523. //大于10000时,使用用户标准库来分析夹杂物名称
  524. str_IncALibName = TypeName;
  525. str_stdname = "System standard library";
  526. }
  527. //获取数据后,需要对xraytable设置
  528. OTSIncAReportGraph.Controls.Control_XRayTable control_XRayTable1 = new Control_XRayTable();
  529. control_XRayTable1.SetXRayShowLineValue(Analysis_xray, list_showelementinfo);
  530. //颗粒国标信息
  531. //control_XRayTable1.GBInfoStr = in_dparticle.GBContent;
  532. control_XRayTable1.MaterialName = str_IncALibName;//杂夹物
  533. control_XRayTable1.STDName = str_stdname;//标准库
  534. control_XRayTable1.List_ShowElementInfo = list_showelementinfo;
  535. control_XRayTable1.Visible = true;
  536. control_XRayTable1.Invalidate();
  537. control_XRayTable1.Refresh();
  538. ret_bp = control_XRayTable1.ExportXRayImage();
  539. return ret_bp;
  540. }
  541. /// <summary>
  542. /// 输入颗粒的所在帧图id,颗粒id,颗粒类型id,获取对应的XRay能谱数据图
  543. /// </summary>
  544. /// <returns></returns>
  545. private Bitmap splice_ExportXRayBitmap(string subParticleString,int a_particleId,int a_fieldid, ParticleData particleData,string a_TyoeName)
  546. {
  547. Bitmap ret_bp;
  548. //显示xray相关信息
  549. uint[] Analysis_xray = new uint[2000];
  550. List<Element> list_celementchemistryclr = new List<Element>();
  551. //获取Xray数据
  552. Particle list = particleData.GetXrayByParticleIDAndFieldID(subParticleString, a_particleId, a_fieldid, out Analysis_xray);
  553. List<ShowElementInfo> list_showelementinfo = particleData.GetShowElementInfos(list.ElementList);
  554. //获取数据后,需要对xraytable设置
  555. OTSIncAReportGraph.Controls.Control_XRayTable control_XRayTable1 = new Control_XRayTable();
  556. control_XRayTable1.SetXRayShowLineValue(Analysis_xray, list_showelementinfo);
  557. control_XRayTable1.MaterialName = a_TyoeName;
  558. control_XRayTable1.List_ShowElementInfo = list_showelementinfo;
  559. control_XRayTable1.Visible = true;
  560. control_XRayTable1.Invalidate();
  561. control_XRayTable1.Refresh();
  562. ret_bp = control_XRayTable1.ExportXRayImage();
  563. return ret_bp;
  564. }
  565. private string datatable_data(DataTable dt, int it, string str)
  566. {
  567. if (str == "Hardness")
  568. {
  569. return dt.Rows[it]["Hardness_detailed"].ToString();
  570. }
  571. else
  572. if (str == "Area")
  573. {
  574. return Convert.ToDouble(dt.Rows[it][str]).ToString("#0.00");
  575. }
  576. else
  577. if (str == "DMAX")
  578. {
  579. return Math.Round(Convert.ToDouble(dt.Rows[it][str]), 2).ToString();
  580. }
  581. else
  582. if (str == "ECD")
  583. {
  584. return Math.Round(Convert.ToDouble(dt.Rows[it][str]), 2).ToString();
  585. }
  586. else
  587. {
  588. return dt.Rows[it][str].ToString();
  589. }
  590. }
  591. /// <summary>
  592. /// 传入DataTable,和行号,返回该Row行中,返回6个靠前的元素,不足6个返回空
  593. /// </summary>
  594. /// <param name="in_dt"></param>
  595. /// <param name="row_index"></param>
  596. /// <returns></returns>
  597. private void GetMaxElementFromDataTable(DataTable in_dt, int row_index, out List<string> out_list_elementname, out List<double> out_list_elementvalue)
  598. {
  599. out_list_elementname = new List<string>();
  600. out_list_elementvalue = new List<double>();
  601. //分别排出元素名,元素值列表
  602. List<string> list_elementname = new List<string>();
  603. List<double> list_elementvalue = new List<double>();
  604. string str_element = in_dt.Rows[row_index]["Element"].ToString();
  605. //防止取出的元素信息为空
  606. if (str_element != "")
  607. {
  608. string[] strcbo = str_element.Split(';');
  609. for (int i = 0; i < strcbo.Length - 1; i++)
  610. {
  611. string[] str = strcbo[i].Split('-');
  612. list_elementname.Add(str[0]);
  613. list_elementvalue.Add(Math.Round(Convert.ToDouble(str[1]), 2));
  614. }
  615. }
  616. //循环6次,得到最大的6个元素信息
  617. for (int geti = 0; geti < 11; geti++)
  618. {
  619. double max_elementvalue = -1;
  620. string max_elementname = " ";
  621. int max_index = -1;
  622. if (list_elementvalue.Count > 0)
  623. {
  624. for (int i = 0; i < list_elementvalue.Count; i++)
  625. {
  626. if (list_elementvalue[i] > max_elementvalue)
  627. {
  628. max_elementvalue = list_elementvalue[i];
  629. max_elementname = list_elementname[i];
  630. max_index = i;
  631. }
  632. }
  633. //移除掉最大的元素
  634. list_elementname.RemoveAt(max_index);
  635. list_elementvalue.RemoveAt(max_index);
  636. //将最大的元素添加到list中
  637. if (max_elementvalue > 0)
  638. {
  639. out_list_elementname.Add(max_elementname);
  640. out_list_elementvalue.Add(max_elementvalue);
  641. }
  642. else
  643. {
  644. out_list_elementname.Add(" ");
  645. out_list_elementvalue.Add(0);
  646. }
  647. }
  648. else
  649. {
  650. //如果元素数量已经不够,则添加空
  651. out_list_elementname.Add(" ");
  652. out_list_elementvalue.Add(0);
  653. }
  654. }
  655. }
  656. /// <summary>
  657. /// 参数归一化
  658. /// </summary>
  659. /// <param name="a_mi">总数</param>
  660. /// <param name="m">传参</param>
  661. /// <returns></returns>
  662. private string ParameterNormalization(double a_mi, double m)
  663. {
  664. double ColVal = Convert.ToDouble(m / a_mi * 100);
  665. if (ColVal == 0)
  666. {
  667. return "";
  668. }
  669. else
  670. {
  671. if (m == 0)
  672. return "0";
  673. else
  674. return Math.Round(ColVal, 2).ToString();
  675. }
  676. }
  677. private DataTable FrameGraphParticleTableDatat(DataTable dt_ParticlesGridDevidePage, ParticleData fielddata, DataTable DT_field_dt, c_TemplateClass m_mbszclass, OTSReport_Export m_otsreport_export)
  678. {
  679. DataTable dt;
  680. string str_resultPath = m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.GetWorkingResultId()].FilePath;
  681. imgAcc = new FieldImage(str_resultPath);
  682. if (m_otsreport_export.m_ReportApp.m_RptConfigFile.Systype != OTS_SysType_ID.IncA)
  683. {
  684. if (dt_ParticlesGridDevidePage.Columns.Contains("Hardness"))
  685. dt_ParticlesGridDevidePage.Columns.Remove("Hardness");
  686. if (dt_ParticlesGridDevidePage.Columns.Contains("Hardness_detailed"))
  687. dt_ParticlesGridDevidePage.Columns.Remove("Hardness_detailed");
  688. //将颗粒大小排序(从大到小)
  689. DataView dvs = dt_ParticlesGridDevidePage.DefaultView;
  690. dvs.Sort = m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p1.ToString() + " DESC";
  691. dt = dvs.ToTable();
  692. dt.Columns.Add("Hardness");
  693. dt.Columns.Add("Hardness_detailed");
  694. }
  695. else
  696. {
  697. //将颗粒大小排序(从大到小)
  698. DataView dvs = dt_ParticlesGridDevidePage.DefaultView;
  699. dvs.Sort = m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p1.ToString() + " DESC";
  700. dt = dvs.ToTable();
  701. }
  702. //表名Largest_frame表:(子表) 显示20条颗粒除外的部份颗粒信息
  703. DataTable FrameGraphSubTable = new DataTable();
  704. FrameGraphSubTable.TableName = "FrameGraphSubTable";
  705. FrameGraphSubTable.Columns.Add("pid");
  706. FrameGraphSubTable.Columns.Add("Size");
  707. FrameGraphSubTable.Columns.Add("Width");
  708. FrameGraphSubTable.Columns.Add("DMAX");
  709. FrameGraphSubTable.Columns.Add("DMIN");
  710. FrameGraphSubTable.Columns.Add("Class");
  711. FrameGraphSubTable.Columns.Add("ColName1");
  712. FrameGraphSubTable.Columns.Add("ColName2");
  713. FrameGraphSubTable.Columns.Add("ColName3");
  714. FrameGraphSubTable.Columns.Add("ColName4");
  715. FrameGraphSubTable.Columns.Add("ColName5");
  716. FrameGraphSubTable.Columns.Add("ColName6");
  717. FrameGraphSubTable.Columns.Add("ColName7");
  718. FrameGraphSubTable.Columns.Add("ColName8");
  719. FrameGraphSubTable.Columns.Add("ColName9");
  720. FrameGraphSubTable.Columns.Add("ColName10");
  721. FrameGraphSubTable.Columns.Add("ColVal1");
  722. FrameGraphSubTable.Columns.Add("ColVal2");
  723. FrameGraphSubTable.Columns.Add("ColVal3");
  724. FrameGraphSubTable.Columns.Add("ColVal4");
  725. FrameGraphSubTable.Columns.Add("ColVal5");
  726. FrameGraphSubTable.Columns.Add("ColVal6");
  727. FrameGraphSubTable.Columns.Add("ColVal7");
  728. FrameGraphSubTable.Columns.Add("ColVal8");
  729. FrameGraphSubTable.Columns.Add("ColVal9");
  730. FrameGraphSubTable.Columns.Add("ColVal10");
  731. FrameGraphSubTable.Columns.Add("pic", typeof(Bitmap));
  732. FrameGraphSubTable.Columns.Add("FieldId", typeof(int));
  733. FrameGraphSubTable.Columns.Add("GroupName");
  734. for (int i_row = 0; i_row < dt.Rows.Count; i_row++)
  735. {
  736. if (dt.Rows[i_row]["element"].ToString() == "")
  737. continue;
  738. if (dt.Rows[i_row]["TypeName"].ToString() == "Not Identified")
  739. continue;
  740. string str_fieldid = dt.Rows[i_row]["fieldid"].ToString();
  741. if (JudgeWhetherItExists(Convert.ToInt32(str_fieldid), DT_field_dt, "id"))
  742. {
  743. //获取原始颗粒图像
  744. Bitmap bp_particle = new Bitmap(1, 1);
  745. DataTable table1 = dt.Clone();
  746. table1.ImportRow(dt.Rows[i_row]);
  747. bp_particle = imgAcc.GetBitmapByParticleForUncombinedParticle(table1);
  748. bp_particle.Tag = new List<string>() { dt.Rows[i_row]["FieldId"].ToString(), dt.Rows[i_row]["ParticleId"].ToString(), dt.Rows[i_row]["TypeId"].ToString() };
  749. DataRow dr = FrameGraphSubTable.NewRow();
  750. dr["pic"] = bp_particle;
  751. //帧图列表列第一个字段的可选参数
  752. dr["pid"] = datatable_data(dt, i_row, m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p1);
  753. //帧图列表列第二个字段的可选参数
  754. dr["Size"] = datatable_data(dt, i_row, m_mbszclass.M_KLLBXX.str_cb_kllb_sort_p2);
  755. dr["Width"] = dt.Rows[i_row]["rectwidth"].ToString();
  756. dr["DMAX"] = Math.Round(Convert.ToDouble(dt.Rows[i_row]["dmax"]), 2).ToString();
  757. dr["DMIN"] = Math.Round(Convert.ToDouble(dt.Rows[i_row]["dmin"]), 2).ToString();
  758. dr["Class"] = dt.Rows[i_row]["typename"].ToString();
  759. dr["GroupName"] = dt.Rows[i_row]["GroupName"].ToString();
  760. dr["fieldid"] = str_fieldid;
  761. GetMaxElementFromDataTable(dt, i_row, out List<string> list_max_elementname, out List<double> list_max_elementvale);
  762. double colVal = 0;
  763. for (int i = 0; i < list_max_elementvale.Count; i++)
  764. {
  765. colVal = colVal + Convert.ToDouble(list_max_elementvale[i]);
  766. }
  767. //元素1
  768. dr["ColName1"] = list_max_elementname[0];
  769. dr["ColVal1"] = ParameterNormalization(colVal, list_max_elementvale[0]);
  770. //元素2
  771. dr["ColName2"] = list_max_elementname[1];
  772. dr["ColVal2"] = ParameterNormalization(colVal, list_max_elementvale[1]);
  773. //元素3
  774. dr["ColName3"] = list_max_elementname[2];
  775. dr["ColVal3"] = ParameterNormalization(colVal, list_max_elementvale[2]);
  776. //元素4
  777. dr["ColName4"] = list_max_elementname[3];
  778. dr["ColVal4"] = ParameterNormalization(colVal, list_max_elementvale[3]);
  779. //元素5
  780. dr["ColName5"] = list_max_elementname[4];
  781. dr["ColVal5"] = ParameterNormalization(colVal, list_max_elementvale[4]);
  782. //元素6
  783. dr["ColName6"] = list_max_elementname[5];
  784. dr["ColVal6"] = ParameterNormalization(colVal, list_max_elementvale[5]);
  785. //元素6
  786. dr["ColName7"] = list_max_elementname[6];
  787. dr["ColVal7"] = ParameterNormalization(colVal, list_max_elementvale[6]);
  788. //元素6
  789. dr["ColName8"] = list_max_elementname[7];
  790. dr["ColVal8"] = ParameterNormalization(colVal, list_max_elementvale[7]);
  791. //元素6
  792. dr["ColName9"] = list_max_elementname[8];
  793. dr["ColVal9"] = ParameterNormalization(colVal, list_max_elementvale[8]);
  794. //元素6
  795. dr["ColName10"] = list_max_elementname[9];
  796. dr["ColVal10"] = ParameterNormalization(colVal, list_max_elementvale[9]);
  797. FrameGraphSubTable.Rows.Add(dr);
  798. }
  799. }
  800. return FrameGraphSubTable;
  801. }
  802. private bool JudgeWhetherItExists(int id, DataTable dt, string column)
  803. {
  804. for (int i = 0; i < dt.Rows.Count; i++)
  805. {
  806. if (id == Convert.ToInt32(dt.Rows[i][column].ToString()))
  807. return true;
  808. }
  809. return false;
  810. }
  811. }
  812. }