ElementalAnalysis.cs 28 KB

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