ElementalAnalysis.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. using OTSCommon.Model;
  2. using OTSIncAReportApp.DataOperation.DataAccess;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using static OTSIncAReportApp.OTSReport_Export;
  10. namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
  11. {
  12. /// <summary>
  13. /// 元素分析
  14. /// </summary>
  15. class ElementalAnalysis
  16. {
  17. /// <summary>
  18. /// 元素分析表(表头、表数据、全数据)
  19. /// </summary>
  20. /// <param name="m_mbszclass"></param>
  21. /// <param name="m_otsreport_export"></param>
  22. /// <returns></returns>
  23. public List<DataTable> GetElementData(c_TemplateClass m_mbszclass, OTSReport_Export m_otsreport_export)
  24. {
  25. DataTable data = GetDBData(m_mbszclass, m_otsreport_export);
  26. //根据sql条件,查询获取颗粒信息数据
  27. ParticleData fielddata = new ParticleData(m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.getSelectedIndex()].FilePath);
  28. DataTable AllAnalysisDetails = new DataTable();
  29. AllAnalysisDetails.TableName = "ElementValue";
  30. AllAnalysisDetails.Columns.Add("Name");
  31. AllAnalysisDetails.Columns.Add("TypeId");
  32. AllAnalysisDetails.Columns.Add("Area", typeof(double));
  33. AllAnalysisDetails.Columns.Add("Class");
  34. for (int i = 0; i < data.Rows.Count; i++)
  35. {
  36. DataRow dr2 = AllAnalysisDetails.NewRow();
  37. dr2["Name"] = data.Rows[i]["TypeName"].ToString();
  38. dr2["Area"] = Convert.ToDouble(data.Rows[i]["ar"]);
  39. dr2["TypeId"] = data.Rows[i]["TypeId"].ToString();
  40. dr2["Class"] = data.Rows[i]["Class"].ToString();
  41. AllAnalysisDetails.Rows.Add(dr2);
  42. }
  43. //按照list列表进行物质类排序,物质类中的元素分类按照面积的大小进行排序
  44. List<string> ClassName = new List<string>();
  45. DataTable getClass_dt = fielddata.GetAllClass();
  46. for (int i = 0; i < getClass_dt.Rows.Count; i++)
  47. {
  48. if (getClass_dt.Rows[i]["GroupName"].ToString() != "NOT_INCLUTION" && getClass_dt.Rows[i]["GroupName"].ToString() != "Invalid")
  49. //ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString());
  50. if (getClass_dt.Rows[i]["GroupName"].ToString() == "")
  51. ClassName.Add("Default");
  52. else
  53. ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString());
  54. }
  55. //统计元素物质大类的元素信息和面积占比
  56. DataTable dt_ElementalSubstance = ElementalSubstance(AllAnalysisDetails, ClassName, fielddata);
  57. //统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序
  58. DataTable dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, fielddata);
  59. //生成最后导出时物质元素成分表
  60. DataTable dt = MaterialElementComposition(dt_ElementalSubstance, 13, m_otsreport_export);//导出14个元素成分信息
  61. //生成最后导出时物质元素细分表
  62. DataTable dtname = new DataTable();
  63. DataTable dtData = new DataTable();
  64. SubdivisionOfMaterialElements(dt_ElementSorting, 13, ClassName, dt, out dtname, out dtData);
  65. //allElement_dt = dt_ElementSorting.Copy();
  66. List<DataTable> datas = new List<DataTable>();
  67. datas.Add(dtname);
  68. datas.Add(dtData);
  69. datas.Add(dt_ElementSorting);
  70. return datas;
  71. }
  72. private DataTable GetDBData(c_TemplateClass m_mbszclass, OTSReport_Export m_otsreport_export)
  73. {
  74. DataTable m_bt_DBData = new DataTable();
  75. ParticleData fielddata = new ParticleData(m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.getSelectedIndex()].FilePath);
  76. List<string> colid = new List<string>() { "TypeName", "ar", "TypeId", "Largest", "Class", "con" };
  77. //获取粒级表
  78. string path1 = m_otsreport_export.m_ReportApp.m_rstDataMgr.m_RptConfigFile.PartSizeFileFolder + m_mbszclass.M_KLFXJG.str_cb_klcc_ljb.ToString();
  79. DataSet ds = OTSIncAReportApp.DataOperation.DataAccess.XMLoperate.GetXml(path1);
  80. string sizestr = ds.Tables[0].Rows[0]["Sizes"].ToString();
  81. for (int i = 0; i < sizestr.Split(',').Length - 1; i++)
  82. {
  83. if (sizestr.Split(',')[i].Length > 0)
  84. {
  85. double d1 = Convert.ToDouble(sizestr.Split(',')[i]);
  86. double d2 = Convert.ToDouble(sizestr.Split(',')[i + 1]);
  87. colid.Add(d1.ToString() + "~" + d2.ToString());
  88. }
  89. }
  90. double d = Convert.ToDouble(sizestr.Split(',')[sizestr.Split(',').Length - 1]);
  91. colid.Add(d.ToString() + "~MAX");
  92. for (int i = 0; i < colid.Count; i++)
  93. {
  94. m_bt_DBData.Columns.Add(colid[i].ToString());
  95. }
  96. DataTable dt = InvalidRemoval(fielddata.GetParticleListForParticlSize("area", ""));
  97. DataTable AreaInformationOfAllElements = InvalidRemoval(fielddata.GetAreaByAllIncA(""));
  98. DataTable dtp = InvalidRemoval(fielddata.GetParticleAll(""));
  99. //选择颗粒信息
  100. DataTable data;
  101. SelectParticleData(out data, m_otsreport_export);
  102. //选择颗粒整理成表
  103. DataTable Partic_dt = new DataTable();
  104. if (data.Rows.Count > 0)
  105. {
  106. Partic_dt = GetParticleListForParticlSize(data, dtp);
  107. }
  108. List<string> vs = new List<string>() { "DMAX", "DMIN", "FERET", "Area" };
  109. string po = vs[m_otsreport_export.m_mbszclass.M_KLFXJG.index_cb_klcc_jsfs];
  110. switch (po)
  111. {
  112. case "DMAX":
  113. po = "DMAX";
  114. break;
  115. case "DMIN":
  116. po = "DMIN";
  117. break;
  118. case "ECD":
  119. po = "Area";
  120. break;
  121. case "FERET":
  122. po = "DFERET";
  123. break;
  124. }
  125. //如果是全部颗粒(0)
  126. if (m_mbszclass.M_SY.int_xzkl == 0)
  127. {
  128. for (int i = 0; i < dt.Rows.Count; i++)
  129. {
  130. DataRow dr = m_bt_DBData.NewRow();
  131. dr["TypeName"] = dt.Rows[i]["TypeName"].ToString();
  132. dr["TypeId"] = dt.Rows[i]["TypeId"].ToString();
  133. dr["con"] = dt.Rows[i]["con"].ToString();
  134. if (dt.Rows[i]["GroupName"].ToString() == "")
  135. dr["Class"] = "Default";
  136. else
  137. dr["Class"] = dt.Rows[i]["GroupName"].ToString();
  138. //continue;
  139. dr["Largest"] = Math.Round(Convert.ToDouble(dt.Rows[i]["max"]), 2);
  140. for (int a = 6; a < colid.Count; a++)
  141. {
  142. string d1 = colid[a].Split('~')[0];
  143. string d2 = colid[a].Split('~')[1];
  144. if (d2 == "MAX")
  145. {
  146. d2 = "999";
  147. }
  148. DataRow[] datas = dtp.Select(getWhere(d2, d1, po, dt.Rows[i]["TypeId"].ToString()));
  149. dr[colid[a]] = datas.Count();
  150. }
  151. for (int a = 0; a < AreaInformationOfAllElements.Rows.Count; a++)
  152. {
  153. if (dt.Rows[i]["TypeId"].ToString() == AreaInformationOfAllElements.Rows[a]["TypeId"].ToString())
  154. {
  155. dr["ar"] = AreaInformationOfAllElements.Rows[a]["ar"];
  156. }
  157. }
  158. m_bt_DBData.Rows.Add(dr);
  159. }
  160. }
  161. else//选择颗粒(1)
  162. {
  163. for (int i = 0; i < Partic_dt.Rows.Count; i++)
  164. {
  165. DataRow dr = m_bt_DBData.NewRow();
  166. dr["TypeName"] = Partic_dt.Rows[i]["TypeName"].ToString();
  167. dr["TypeId"] = Partic_dt.Rows[i]["TypeId"].ToString();
  168. dr["con"] = Partic_dt.Rows[i]["con"].ToString();
  169. dr["Class"] = Partic_dt.Rows[i]["GroupName"].ToString();
  170. dr["Largest"] = Math.Round(Convert.ToDouble(Partic_dt.Rows[i]["max"]), 2);
  171. for (int a = 6; a < colid.Count; a++)
  172. {
  173. string d1 = colid[a].Split('~')[0];
  174. string d2 = colid[a].Split('~')[1];
  175. if (d2 == "MAX")
  176. {
  177. d2 = "999";
  178. }
  179. DataRow[] datas = dtp.Select(getWhere(d2, d1, po, Partic_dt.Rows[i]["TypeId"].ToString()));
  180. dr[colid[a]] = datas.Count();
  181. }
  182. dr["ar"] = Partic_dt.Rows[i]["Area"];
  183. m_bt_DBData.Rows.Add(dr);
  184. }
  185. }
  186. //去除物质分类(非夹杂物分类)
  187. for (int a = 0; a < m_mbszclass.M_KLLBXX.list_str_kllb_DeleteClass.Count; a++)
  188. {
  189. for (int i = m_bt_DBData.Rows.Count - 1; i >= 0; i--)
  190. {
  191. if (m_bt_DBData.Rows[i]["TypeName"].ToString() == m_mbszclass.M_KLLBXX.list_str_kllb_DeleteClass[a].ToString())
  192. {
  193. m_bt_DBData.Rows.RemoveAt(i);
  194. }
  195. }
  196. }
  197. return m_bt_DBData;
  198. }
  199. private DataTable GetParticleListForParticlSize(DataTable data, DataTable table)
  200. {
  201. DataTable dt_Partick = new DataTable();
  202. dt_Partick.Columns.Add("TypeId");
  203. dt_Partick.Columns.Add("TypeName");
  204. dt_Partick.Columns.Add("TypeColor");
  205. dt_Partick.Columns.Add("con");
  206. dt_Partick.Columns.Add("ar");
  207. dt_Partick.Columns.Add("max");
  208. dt_Partick.Columns.Add("Area", typeof(double));
  209. dt_Partick.Columns.Add("GroupName");
  210. List<string> typeName = new List<string>();
  211. for (int i = 0; i < data.Rows.Count; i++)
  212. {
  213. typeName.Add(data.Rows[i]["TypeId"].ToString());
  214. }
  215. typeName = typeName.Distinct().ToList();
  216. for (int i = 0; i < typeName.Count; i++)
  217. {
  218. DataTable dt = dt_Partick.Clone();
  219. for (int j = 0; j < data.Rows.Count; j++)
  220. {
  221. if (typeName[i].ToString() == data.Rows[j]["TypeId"].ToString())
  222. {
  223. DataRow row = dt.NewRow();
  224. row["TypeId"] = data.Rows[j]["TypeId"];
  225. row["TypeName"] = data.Rows[j]["TypeName"];
  226. row["TypeColor"] = data.Rows[j]["TypeColor"];
  227. row["Area"] = data.Rows[j]["Area"];
  228. dt.Rows.Add(row);
  229. }
  230. }
  231. DataRow dr = dt_Partick.NewRow();
  232. dr["TypeId"] = dt.Rows[0]["TypeId"].ToString();
  233. dr["TypeName"] = dt.Rows[0]["TypeName"].ToString();
  234. dr["TypeColor"] = dt.Rows[0]["TypeColor"].ToString();
  235. dr["con"] = dt.Rows.Count;
  236. dr["ar"] = dt.Compute("min(Area)", "");
  237. dr["max"] = dt.Compute("Max(Area)", "");
  238. dr["Area"] = dt.Compute("SUM(Area)", "");
  239. dt_Partick.Rows.Add(dr);
  240. }
  241. for (int i = 0; i < dt_Partick.Rows.Count; i++)
  242. {
  243. for (int j = 0; j < table.Rows.Count; j++)
  244. {
  245. if (dt_Partick.Rows[i]["TypeId"].ToString() == table.Rows[j]["TypeId"].ToString())
  246. {
  247. dt_Partick.Rows[i]["GroupName"] = table.Rows[j]["GroupName"];
  248. break;
  249. }
  250. }
  251. }
  252. return dt_Partick;
  253. }
  254. private void SelectParticleData(out DataTable dt, OTSReport_Export m_otsreport_export)
  255. {
  256. List<Particle> selectParticles = m_otsreport_export.m_ReportApp.GetSelectedParticles();
  257. #region Datatable数据表格式
  258. DataTable dtUelect = new DataTable();
  259. dtUelect.Columns.Add("fieldid");
  260. dtUelect.Columns.Add("particleid");
  261. dtUelect.Columns.Add("AveGray");
  262. dtUelect.Columns.Add("RectLeft");
  263. dtUelect.Columns.Add("RectTop");
  264. dtUelect.Columns.Add("RectWidth");
  265. dtUelect.Columns.Add("RectHeight");
  266. dtUelect.Columns.Add("Area");
  267. dtUelect.Columns.Add("PosX");
  268. dtUelect.Columns.Add("PosY");
  269. dtUelect.Columns.Add("TypeId");
  270. dtUelect.Columns.Add("SegmentNum");
  271. dtUelect.Columns.Add("SEMPosX");
  272. dtUelect.Columns.Add("SEMPosY");
  273. dtUelect.Columns.Add("XrayId");
  274. dtUelect.Columns.Add("DMAX");
  275. dtUelect.Columns.Add("DMIN");
  276. dtUelect.Columns.Add("DPERP");
  277. dtUelect.Columns.Add("PERIMETER");
  278. dtUelect.Columns.Add("ORIENTATION");
  279. dtUelect.Columns.Add("DINSCR");
  280. dtUelect.Columns.Add("DMEAN");
  281. dtUelect.Columns.Add("DELONG");
  282. dtUelect.Columns.Add("DFERET");
  283. dtUelect.Columns.Add("TypeName");
  284. dtUelect.Columns.Add("TypeColor");
  285. #endregion
  286. for (int i = 0; i < selectParticles.Count; i++)
  287. {
  288. dtUelect.Rows.Add(selectParticles[i].FieldId, selectParticles[i].ParticleId, selectParticles[i].AveGray, selectParticles[i].RectLeft, selectParticles[i].RectTop, selectParticles[i].RectWidth, selectParticles[i].RectHeight, selectParticles[i].Area, selectParticles[i].PosX, selectParticles[i].PosX, selectParticles[i].TypeId, /*selectParticles[i].ElementNum,*/ selectParticles[i].SegmentNum, selectParticles[i].SEMPosX, selectParticles[i].SEMPosY, selectParticles[i].ParticleId, selectParticles[i].DMAX, selectParticles[i].DMIN, selectParticles[i].DPERP, selectParticles[i].PERIMETER, selectParticles[i].ORIENTATION, selectParticles[i].DINSCR, selectParticles[i].DMEAN, selectParticles[i].DELONG, selectParticles[i].DFERET, selectParticles[i].TypeName, selectParticles[i].TypeColor);
  289. }
  290. dt = dtUelect.Copy();
  291. }
  292. private DataTable InvalidRemoval(DataTable dt)
  293. {
  294. DataTable dataTable = dt.Copy();
  295. dataTable.Clear();
  296. for (int i = 0; i < dt.Rows.Count; i++)
  297. {
  298. if (Convert.ToInt32(dt.Rows[i]["TypeId"]) > 10)
  299. {
  300. dataTable.Rows.Add(dt.Rows[i].ItemArray);
  301. }
  302. }
  303. return dataTable;
  304. }
  305. private string getWhere(string max, string min, string col, string partic)
  306. {
  307. return col + ">=" + min + " and " + col + "<" + max + " and TypeId=" + partic;
  308. }
  309. /// <summary>
  310. /// 判断是否有大分类,有为true
  311. /// </summary>
  312. /// <param name="m_otsreport_export"></param>
  313. /// <returns></returns>
  314. public bool IsThereAMajorClassification(OTSReport_Export m_otsreport_export)
  315. {
  316. ParticleData fielddata = new ParticleData(m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.getSelectedIndex()].FilePath);
  317. DataTable getClass_dt = fielddata.GetAllClass();
  318. List<string> ClassName = new List<string>();
  319. for (int i = 0; i < getClass_dt.Rows.Count; i++)
  320. {
  321. if (getClass_dt.Rows[i]["GroupName"].ToString() != "NOT_INCLUTION" && getClass_dt.Rows[i]["GroupName"].ToString() != "Invalid"
  322. && getClass_dt.Rows[i]["GroupName"].ToString() != "Not Identified")
  323. if (getClass_dt.Rows[i]["GroupName"].ToString() == "")
  324. ClassName.Add("Default");
  325. else
  326. ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString());
  327. }
  328. if (ClassName.Count < 2)
  329. {
  330. return false;
  331. }
  332. else
  333. {
  334. return true;
  335. }
  336. }
  337. private bool SubdivisionOfMaterialElements(DataTable a_ElementalSubstance, int NumberOfColumns, List<string> ClassName, DataTable data, out DataTable dt1, out DataTable dt2)
  338. {
  339. DataTable dt_ElementalSubstance = new DataTable();
  340. dt_ElementalSubstance = data.Copy();
  341. dt_ElementalSubstance.Clear();
  342. dt_ElementalSubstance.TableName = "ElementSubdivision_Value";
  343. dt_ElementalSubstance.Columns["Name"].ColumnName = "Class";
  344. dt_ElementalSubstance.Columns.Add("Name");
  345. //处理元素面积保留小数点后两位
  346. for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++)
  347. {
  348. a_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"].ToString()), 2);
  349. }
  350. //循环元素物质大类
  351. for (int i = 0; i < ClassName.Count; i++)
  352. {
  353. DataTable dt_1 = new DataTable();
  354. dt_1 = data.Copy();
  355. dt_1.Clear();
  356. for (int a = 0; a < data.Rows.Count; a++)
  357. {
  358. if (data.Rows[a]["Name"].ToString() == ClassName[i].ToString())
  359. {
  360. dt_1.Rows.Add(data.Rows[a].ItemArray);
  361. }
  362. }
  363. dt_1.Columns["Name"].ColumnName = "Class";
  364. dt_1.Columns.Add("Name");
  365. DataTable dt_2 = new DataTable();
  366. dt_2 = dt_1.Copy();
  367. dt_2.Clear();
  368. dt_2.Rows.Add();
  369. //循环整个表筛选出当前的物质
  370. for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++)
  371. {
  372. if (ClassName[i].ToString() == a_ElementalSubstance.Rows[a]["Class"].ToString())
  373. {
  374. for (int b = 0; b < dt_1.Columns.Count; b++)
  375. {
  376. if (dt_2.Columns[b].ToString() != "Class")
  377. {
  378. if (a_ElementalSubstance.Columns.Contains(dt_2.Columns[b].ToString()))
  379. {
  380. if (a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()].ToString() == "")
  381. {
  382. dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
  383. }
  384. else
  385. {
  386. dt_2.Rows[0][dt_2.Columns[b].ToString()] = a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()];
  387. }
  388. }
  389. else
  390. {
  391. dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
  392. }
  393. }
  394. }
  395. dt_1.Rows.Add(dt_2.Rows[0].ItemArray);
  396. }
  397. }
  398. for (int a = 0; a < dt_1.Rows.Count; a++)
  399. {
  400. dt_ElementalSubstance.Rows.Add(dt_1.Rows[a].ItemArray);
  401. }
  402. }
  403. DataTable dataTable = new DataTable();
  404. dataTable = dt_ElementalSubstance.Copy();
  405. dataTable.Clear();
  406. DataRow row = dataTable.NewRow();
  407. dataTable.Rows.Add(row);
  408. dataTable.TableName = "ElementSubdivision_Name";
  409. for (int i = 0; i < dataTable.Columns.Count; i++)
  410. {
  411. dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString();
  412. }
  413. dt1 = dataTable.Copy();
  414. dt2 = dt_ElementalSubstance.Copy();
  415. return true;
  416. }
  417. private DataTable MaterialElementComposition(DataTable a_ElementalSubstance, int NumberOfColumns,OTSReport_Export m_otsreport_export)
  418. {
  419. DataTable dt_ElementalSubstance = new DataTable();
  420. dt_ElementalSubstance.TableName = "ElementalSubstance_Value";
  421. dt_ElementalSubstance.Columns.Add("Name");
  422. dt_ElementalSubstance.Columns.Add("Area");
  423. for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++)
  424. {
  425. dt_ElementalSubstance.Rows.Add(a_ElementalSubstance.Rows[i]["Name"]);
  426. dt_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"]), 2);
  427. }
  428. int cunt = 1;
  429. for (int i = 0; i < NumberOfColumns; i++)
  430. {
  431. if (i < m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys.Count())
  432. {
  433. dt_ElementalSubstance.Columns.Add(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]);
  434. for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++)
  435. {
  436. if (a_ElementalSubstance.Columns.Contains(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]))
  437. {
  438. if (a_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]].ToString() == "")
  439. {
  440. dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0;
  441. }
  442. else
  443. {
  444. dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = a_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]];
  445. }
  446. }
  447. else
  448. {
  449. dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0;
  450. }
  451. }
  452. }
  453. else
  454. {
  455. dt_ElementalSubstance.Columns.Add("Null" + cunt.ToString());
  456. cunt = cunt + 1;
  457. for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++)
  458. {
  459. dt_ElementalSubstance.Rows[a][i + 2] = "-";
  460. }
  461. }
  462. }
  463. DataTable dataTable = new DataTable();
  464. dataTable = dt_ElementalSubstance.Copy();
  465. dataTable.Clear();
  466. DataRow row = dataTable.NewRow();
  467. dataTable.Rows.Add(row);
  468. dataTable.TableName = "ElementalSubstance_Name";
  469. for (int i = 0; i < dataTable.Columns.Count; i++)
  470. {
  471. dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString();
  472. }
  473. //m_list_dt.Add(dataTable);
  474. //m_list_dt.Add(dt_ElementalSubstance);
  475. return dt_ElementalSubstance;
  476. }
  477. private DataTable ElementSorting(DataTable AllAnalysisDetails, List<string> ClassName, ParticleData fielddata)
  478. {
  479. DataTable dte = fielddata.GetAllElement();
  480. DataTable ElementSorting_dt = AllAnalysisDetails.Copy();
  481. ElementSorting_dt.Clear();
  482. for (int i = 0; i < ClassName.Count; i++)
  483. {
  484. DataTable dt = AllAnalysisDetails.Copy();
  485. dt.Clear();
  486. for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++)
  487. {
  488. if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString())
  489. {
  490. dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray);
  491. }
  492. }
  493. //将颗粒大小排序(从大到小)
  494. DataView dv = dt.DefaultView;
  495. dv.Sort = "Area DESC";
  496. DataTable dt_Element = dv.ToTable();
  497. for (int a = 0; a < dt_Element.Rows.Count; a++)
  498. {
  499. ElementSorting_dt.Rows.Add(dt_Element.Rows[a].ItemArray);
  500. }
  501. }
  502. //循环创建元素列(类型定义为double,为以后计算做准备)
  503. for (int a = 0; a < dte.Rows.Count; a++)
  504. {
  505. ElementSorting_dt.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double));
  506. }
  507. for (int a = 0; a < ElementSorting_dt.Rows.Count; a++)
  508. {
  509. DataTable ClassificationDetails = fielddata.GetAreaByIncA(ElementSorting_dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息
  510. //DataRow dr2 = ElementSorting_dt.NewRow();
  511. foreach (DataRow dr in ClassificationDetails.Rows)
  512. {
  513. double doe = Convert.ToDouble(dr["pc"]);
  514. ElementSorting_dt.Rows[a][dr["Name"].ToString()] = Math.Round(doe / Convert.ToDouble(ElementSorting_dt.Rows[a]["Area"]), 2);
  515. }
  516. }
  517. return ElementSorting_dt;
  518. }
  519. private DataTable ElementalSubstance(DataTable AllAnalysisDetails, List<string> ClassName, ParticleData fielddata)
  520. {
  521. //当前元素物质类面积的总和
  522. double ElementalSubstance = 0;
  523. DataTable dte = fielddata.GetAllElement();
  524. DataTable dt_Class = new DataTable();
  525. dt_Class.Columns.Add("Name");
  526. dt_Class.Columns.Add("Area");
  527. //循环创建元素列(类型定义为double,为以后计算做准备)
  528. for (int a = 0; a < dte.Rows.Count; a++)
  529. {
  530. dt_Class.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double));
  531. }
  532. //循环大类物质列表
  533. for (int i = 0; i < ClassName.Count; i++)
  534. {
  535. //保留当前循环中大类物质,去除其他物质
  536. DataTable dt = AllAnalysisDetails.Copy();
  537. dt.Clear();
  538. for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++)
  539. {
  540. if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString())
  541. {
  542. dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray);
  543. }
  544. }
  545. if (dt.Rows.Count == 0)
  546. continue;
  547. //计算出当前循环中大类物质的面积
  548. ElementalSubstance = Convert.ToDouble(decimal.Parse(dt.Compute("sum(Area)", "").ToString()));
  549. DataTable ta = new DataTable();
  550. ta = dt_Class.Copy();
  551. ta.Clear();
  552. for (int a = 0; a < dt.Rows.Count; a++)
  553. {
  554. DataTable ClassificationDetails = fielddata.GetAreaByIncA(dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息
  555. DataRow dr2 = ta.NewRow();
  556. foreach (DataRow dr in ClassificationDetails.Rows)
  557. {
  558. double doe = Convert.ToDouble(dr["pc"]);
  559. dr2[dr["Name"].ToString()] = doe;
  560. }
  561. ta.Rows.Add(dr2);
  562. }
  563. DataTable dataTable = ta.Copy();
  564. dataTable.Clear();
  565. DataRow row = dataTable.NewRow();
  566. dataTable.Rows.Add(row);
  567. for (int a = 0; a < ta.Columns.Count; a++)
  568. {
  569. if (ta.Columns[a].ToString() != "Name" && ta.Columns[a].ToString() != "Class")
  570. {
  571. bool bl = false;
  572. for (int b = 0; b < ta.Rows.Count; b++)
  573. {
  574. if (!ta.Rows[b].IsNull(ta.Columns[a].ToString()))
  575. {
  576. bl = true;
  577. }
  578. }
  579. if (bl)
  580. //datatSuncolumn(ta, ta.Columns[a].ToString());
  581. dataTable.Rows[0][ta.Columns[a].ToString()] = Math.Round(datatSuncolumn(ta, ta.Columns[a].ToString()) / ElementalSubstance, 2);
  582. }
  583. }
  584. dataTable.Rows[0]["Name"] = ClassName[i].ToString();
  585. dataTable.Rows[0]["Area"] = ElementalSubstance;
  586. dt_Class.Rows.Add(dataTable.Rows[0].ItemArray);
  587. }
  588. return dt_Class;
  589. }
  590. private double datatSuncolumn(DataTable dt, string str)
  591. {
  592. double sum = 0;
  593. for (int i = 0; i < dt.Rows.Count; i++)
  594. {
  595. if (dt.Rows[i][str].ToString() == "")
  596. {
  597. dt.Rows[i][str] = 0;
  598. }
  599. sum = sum + Convert.ToDouble(dt.Rows[i][str].ToString());
  600. }
  601. return sum;
  602. }
  603. /// <summary>
  604. /// 参数归一化
  605. /// </summary>
  606. /// <param name="a_mi">总数</param>
  607. /// <param name="m">传参</param>
  608. /// <returns></returns>
  609. public string ParameterNormalization(double a_mi, double m)
  610. {
  611. double ColVal = Convert.ToDouble(m / a_mi * 100);
  612. if (ColVal == 0)
  613. {
  614. return "";
  615. }
  616. else
  617. {
  618. return Math.Round(ColVal, 2).ToString();
  619. }
  620. }
  621. }
  622. }