OutPIC.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. using OTSCommon.Model;
  2. using OTSIncAReportGraph;
  3. using OTSIncAReportGraph.Class;
  4. using OTSIncAReportGraph.Controls;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace OTSIncAReportApp._3_ServiceCenter
  14. {
  15. class OutPIC
  16. {
  17. public OTSIncAReportApp.frmReportApp m_ReportApp;
  18. //包含particle的field的列表对象
  19. public List<DisplayField> m_list_allDfield = null;
  20. public ResultFile resultFile = null;
  21. public SaveFileDialog sfd = null;
  22. public DataTable ParticleData = new DataTable();
  23. public DataTable ParticleClassData = new DataTable();
  24. public int type = 0;
  25. /// <summary>
  26. /// 获取每行图片的位置配合opencv方法使用
  27. /// </summary>
  28. /// <returns></returns>
  29. private List<DataTable> opencv_piclist()
  30. {
  31. List<DataTable> list_dt_picdata = new List<DataTable>();
  32. DataTable picDatat = new DataTable();
  33. picDatat.Columns.Add("X", typeof(double));
  34. picDatat.Columns.Add("Y", typeof(double));
  35. foreach (var f in m_list_allDfield)
  36. {
  37. DataRow dr = picDatat.NewRow();
  38. dr["X"] = f.OTSCoordinatePos.X;
  39. dr["Y"] = f.OTSCoordinatePos.Y;
  40. //dr["X"] = f.GetShowRect().X;
  41. //dr["Y"] = f.GetShowRect().Y;
  42. picDatat.Rows.Add(dr);
  43. }
  44. //int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
  45. //int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
  46. DataTable total_dt_X = picDatat.Copy();
  47. DataView dv_x = total_dt_X.DefaultView;
  48. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  49. dv_x_2.Sort = "X ASC";
  50. total_dt_X = dv_x_2.ToTable();
  51. DataTable total_dt_Y = picDatat.Copy();
  52. DataView dv_Y = total_dt_Y.DefaultView;
  53. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  54. dv_Y_2.Sort = "Y ASC";
  55. total_dt_Y = dv_Y_2.ToTable();
  56. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  57. {
  58. NLog.LogManager.GetCurrentClassLogger().Info("Splice line"+i+1.ToString()+"of"+ total_dt_Y.Rows.Count.ToString()+".....");
  59. DataTable data = new DataTable();
  60. data.Columns.Add("mat", typeof(Bitmap));
  61. data.Columns.Add("X", typeof(double));
  62. data.Columns.Add("Y", typeof(double));
  63. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  64. {
  65. DataRow dr2 = data.NewRow();
  66. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  67. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  68. Graphics g = Graphics.FromImage(bitmap);
  69. g.Clear(Color.White);
  70. g.Dispose();
  71. dr2["mat"] = bitmap;
  72. dr2["X"] = total_dt_X.Rows[a]["X"];
  73. //dr2["Y"] = total_dt_X.Rows[a]["Y"];
  74. data.Rows.Add(dr2);
  75. }
  76. foreach (var f in m_list_allDfield)
  77. {
  78. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  79. {
  80. for (int c = 0; c < data.Rows.Count; c++)
  81. {
  82. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  83. {
  84. data.Rows[c]["mat"] = f.OriginalImage;
  85. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  86. data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
  87. }
  88. }
  89. }
  90. }
  91. DataView dataView1 = data.DefaultView;
  92. dataView1.Sort = "X ASC";
  93. data = dataView1.ToTable();
  94. list_dt_picdata.Add(data);
  95. }
  96. return list_dt_picdata;
  97. }
  98. public void opencv_outpic()
  99. {
  100. List<DataTable> list_dt_picdata = new List<DataTable>();
  101. OpenCvSharp.Mat[] list_mats;
  102. if (type == (int)Outpic_enum.pic)
  103. {
  104. list_dt_picdata = opencv_piclist();
  105. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
  106. }
  107. else if (type == (int)Outpic_enum.Render_pic)
  108. {
  109. list_dt_picdata = opencv_piclist_Render();
  110. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count + 1];
  111. }
  112. else
  113. {
  114. list_dt_picdata = NoBackgroundParticleDiagram();
  115. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
  116. }
  117. NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
  118. List<OpenCvSharp.Mat> list_pano = new List<OpenCvSharp.Mat>();
  119. //循环保存每行拼接的图片
  120. for (int i = list_dt_picdata.Count-1; i >= 0; i--)
  121. {
  122. //拼接同一行中的图片
  123. OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count];
  124. for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++)
  125. {
  126. mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
  127. }
  128. OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
  129. OpenCvSharp.Cv2.HConcat(mats, pano);
  130. list_pano.Add(pano);
  131. }
  132. //导出原图(渲染图)在下方增加每种颜色的标注和面积占比
  133. if (type == (int)Outpic_enum.Render_pic)
  134. {
  135. DataTable particleData = ParticleDataIntegration(ParticleData, ParticleClassData);
  136. int NumberOfRows = getPICstringLong(particleData, list_pano);
  137. Bitmap bitmap = new Bitmap(list_pano[0].Width, NumberOfRows*140);
  138. Graphics g = Graphics.FromImage(bitmap);
  139. g.Clear(Color.White);
  140. int rowData = 10;
  141. //矩形格子宽500
  142. SolidBrush mysbrush1 = new SolidBrush(ColorTranslator.FromHtml("#000000"));
  143. Pen mypen = new Pen(mysbrush1, 2);
  144. Font myFont = new Font("宋体", 13, FontStyle.Bold);
  145. SolidBrush sbrush = new SolidBrush(Color.Black);
  146. int Color_Y = 10; int TypeName_Y = 40; int Prozentsatz_Y = 100;int Area_Y = 70;
  147. int Gitter_X = 10;
  148. picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
  149. Gitter_X = Gitter_X + 350;
  150. for (int i = 0; i < particleData.Rows.Count; i++)
  151. {
  152. if (Gitter_X+350> list_pano[0].Width)
  153. {
  154. rowData = rowData + 130;
  155. picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
  156. Color_Y = Color_Y + 130;
  157. TypeName_Y = TypeName_Y + 130;
  158. Prozentsatz_Y = Prozentsatz_Y + 130;
  159. Area_Y = Area_Y + 130;
  160. Gitter_X = 360;
  161. }
  162. g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
  163. g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
  164. g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
  165. g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
  166. SolidBrush mysbrush = new SolidBrush(ColorTranslator.FromHtml(particleData.Rows[i]["Color"].ToString()));
  167. g.FillRectangle(mysbrush, Gitter_X + 1, Color_Y + 1, 348, 28);
  168. g.DrawString(particleData.Rows[i]["TypeName"].ToString(), myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
  169. g.DrawString(particleData.Rows[i]["Area"].ToString(), myFont, sbrush, Gitter_X + 1, Area_Y + 2);
  170. g.DrawString(particleData.Rows[i]["Percentage"].ToString()+"%", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
  171. Gitter_X = Gitter_X + 350;
  172. }
  173. g.Dispose();
  174. OpenCvSharp.Mat pano = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
  175. list_pano.Add(pano);
  176. }
  177. for (int i = 0; i < list_pano.Count; i++)
  178. {
  179. list_mats[i] = list_pano[i];
  180. }
  181. NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed.");
  182. NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......");
  183. OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
  184. OpenCvSharp.Cv2.VConcat(list_mats, save_pano);
  185. OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
  186. NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
  187. Control_DrawDistrbutionImageAndBSE v = m_ReportApp.im_Control_DrawDistrbutionImageAndBSE;
  188. MyEvent += new MyEntrust(v.msgInform);
  189. v.Invoke(MyEvent);
  190. }
  191. private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
  192. {
  193. int Long = 1;
  194. int Gitter_X = 10;
  195. for (int i = 0; i < particleData.Rows.Count; i++)
  196. {
  197. if (Gitter_X + 350 > list_pano[0].Width)
  198. {
  199. Long = Long + 1;
  200. Gitter_X = 10;
  201. }
  202. Gitter_X = Gitter_X + 350;
  203. }
  204. return Long;
  205. }
  206. private void picKopfzeile(Pen mypen, Font myFont, SolidBrush sbrush, Graphics g ,int X,int Y)
  207. {
  208. int Color_Y = Y; int TypeName_Y = Y+30; int Prozentsatz_Y = Y + 90; int Area_Y = Y+ 60;
  209. int Gitter_X = X;
  210. g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
  211. g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
  212. g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
  213. g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
  214. g.DrawString("Color", myFont, sbrush, Gitter_X + 1, Color_Y + 2);
  215. g.DrawString("TypeName", myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
  216. g.DrawString("Area", myFont, sbrush, Gitter_X + 1, Area_Y + 2);
  217. g.DrawString("Prozentsatz", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
  218. }
  219. private DataTable ParticleDataIntegration(DataTable ParticleAll,DataTable ParticleClass)
  220. {
  221. DataTable dt = ParticleClass.Copy();
  222. dt.Columns.Add("Area", typeof(float));
  223. dt.Columns.Add("Percentage");
  224. dt.Columns.Add("Color");
  225. double ParticleAreaTotal = 0;
  226. for (int i=0;i< ParticleAll.Rows.Count;i++)
  227. {
  228. ParticleAreaTotal = ParticleAreaTotal + Convert.ToDouble(ParticleAll.Rows[i]["Area"]);
  229. }
  230. for (int i=0;i< dt.Rows.Count;i++)
  231. {
  232. double ParticleArea = 0;
  233. string ParticleColer = "";
  234. for (int a=0;a< ParticleAll.Rows.Count;a++)
  235. {
  236. if (dt.Rows[i]["TypeName"].ToString()== ParticleAll.Rows[a]["TypeName"].ToString())
  237. {
  238. ParticleArea = ParticleArea + Convert.ToDouble(ParticleAll.Rows[a]["Area"]);
  239. ParticleColer = ParticleAll.Rows[a]["TypeColor"].ToString();
  240. }
  241. }
  242. dt.Rows[i]["Area"] = ParticleArea;
  243. dt.Rows[i]["Percentage"] = ParameterNormalization(ParticleAreaTotal, ParticleArea);
  244. dt.Rows[i]["Color"] = ParticleColer;
  245. }
  246. return dt;
  247. }
  248. /// <summary>
  249. /// 参数归一化
  250. /// </summary>
  251. /// <param name="a_mi">总数</param>
  252. /// <param name="m">传参</param>
  253. /// <returns></returns>
  254. private string ParameterNormalization(double a_mi, double m)
  255. {
  256. double ColVal = Convert.ToDouble(m / a_mi * 100);
  257. if (ColVal == 0)
  258. {
  259. return "";
  260. }
  261. else
  262. {
  263. return Math.Round(ColVal, 2).ToString();
  264. }
  265. }
  266. private List<DataTable> NoBackgroundParticleDiagram()
  267. {
  268. List<DataTable> list_dt_picdata = new List<DataTable>();
  269. DataTable picDatat = new DataTable();
  270. List<Field> fieldlist = resultFile.List_OTSField;
  271. picDatat.Columns.Add("X", typeof(double));
  272. picDatat.Columns.Add("Y", typeof(double));
  273. foreach (var f in m_list_allDfield)
  274. {
  275. DataRow dr = picDatat.NewRow();
  276. dr["X"] = f.OTSCoordinatePos.X;
  277. dr["Y"] = f.OTSCoordinatePos.Y;
  278. picDatat.Rows.Add(dr);
  279. }
  280. DataTable total_dt_X = picDatat.Copy();
  281. DataView dv_x = total_dt_X.DefaultView;
  282. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  283. dv_x_2.Sort = "X ASC";
  284. total_dt_X = dv_x_2.ToTable();
  285. DataTable total_dt_Y = picDatat.Copy();
  286. DataView dv_Y = total_dt_Y.DefaultView;
  287. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  288. dv_Y_2.Sort = "Y ASC";
  289. total_dt_Y = dv_Y_2.ToTable();
  290. //循环每一行图片
  291. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  292. {
  293. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  294. DataTable data = new DataTable();
  295. data.Columns.Add("mat", typeof(Bitmap));
  296. data.Columns.Add("X", typeof(double));
  297. //循环每行图片进行拼接
  298. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  299. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  300. {
  301. DataRow dr2 = data.NewRow();
  302. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  303. Graphics g = Graphics.FromImage(bitmap);
  304. g.Clear(Color.White);
  305. g.Dispose();
  306. dr2["mat"] = bitmap;
  307. dr2["X"] = total_dt_X.Rows[a]["X"];
  308. data.Rows.Add(dr2);
  309. }
  310. //循环所有图片
  311. foreach (var f in m_list_allDfield)
  312. {
  313. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  314. {
  315. //循环图片的行数
  316. for (int c = 0; c < data.Rows.Count; c++)
  317. {
  318. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  319. {
  320. Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
  321. Graphics g2 = Graphics.FromImage(image);
  322. //g2.Clear(Color.White);
  323. Color color1 = Color.FromArgb(217, 217, 217);
  324. g2.Clear(color1);
  325. g2.DrawImage(image, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
  326. Graphics graph_2 = Graphics.FromImage(image);
  327. for (int a = 0; a < fieldlist.Count; a++)
  328. {
  329. if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
  330. {
  331. //先获取该Field中的所有Particle
  332. List<Particle> list_particle;
  333. list_particle = fieldlist[a].ParticleList;
  334. //再循环计算所有的Particle对象
  335. foreach (Particle particle in list_particle)
  336. {
  337. List<Segment> list_seg;
  338. list_seg = particle.SegmentList;
  339. //创建颗粒分布图对应的类对象
  340. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  341. //再循环取出里面所有的segment
  342. foreach (Segment seg in list_seg)
  343. {
  344. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  345. Point on_p = new Point() { X = seg.Start, Y = seg.Height };
  346. Point off_p = new Point() { X = seg.Start + seg.Length, Y = seg.Height };
  347. //var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage("#434343", particle.TypeId);
  348. Pen npen = new Pen(Color.FromArgb(255-particle.AveGray, 0, 0, 0));
  349. graph_2.DrawLine(npen, on_p, off_p);
  350. #endregion
  351. }
  352. }
  353. }
  354. }
  355. data.Rows[c]["mat"] = image;
  356. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  357. }
  358. }
  359. }
  360. }
  361. DataView dataView1 = data.DefaultView;
  362. dataView1.Sort = "X ASC";
  363. data = dataView1.ToTable();
  364. list_dt_picdata.Add(data);
  365. }
  366. return list_dt_picdata;
  367. }
  368. private List<DataTable> opencv_piclist_Render()
  369. {
  370. List<DataTable> list_dt_picdata = new List<DataTable>();
  371. DataTable picDatat = new DataTable();
  372. List<Field> fieldlist = resultFile.List_OTSField;
  373. picDatat.Columns.Add("X", typeof(double));
  374. picDatat.Columns.Add("Y", typeof(double));
  375. foreach (var f in m_list_allDfield)
  376. {
  377. DataRow dr = picDatat.NewRow();
  378. dr["X"] = f.OTSCoordinatePos.X;
  379. dr["Y"] = f.OTSCoordinatePos.Y;
  380. picDatat.Rows.Add(dr);
  381. }
  382. DataTable total_dt_X = picDatat.Copy();
  383. DataView dv_x = total_dt_X.DefaultView;
  384. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  385. dv_x_2.Sort = "X ASC";
  386. total_dt_X = dv_x_2.ToTable();
  387. DataTable total_dt_Y = picDatat.Copy();
  388. DataView dv_Y = total_dt_Y.DefaultView;
  389. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  390. dv_Y_2.Sort = "Y ASC";
  391. total_dt_Y = dv_Y_2.ToTable();
  392. //循环每一行图片
  393. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  394. {
  395. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  396. DataTable data = new DataTable();
  397. data.Columns.Add("mat", typeof(Bitmap));
  398. data.Columns.Add("X", typeof(double));
  399. //循环每行图片进行拼接
  400. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  401. {
  402. DataRow dr2 = data.NewRow();
  403. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  404. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  405. Graphics g = Graphics.FromImage(bitmap);
  406. g.Clear(Color.White);
  407. g.Dispose();
  408. dr2["mat"] = bitmap;
  409. dr2["X"] = total_dt_X.Rows[a]["X"];
  410. data.Rows.Add(dr2);
  411. }
  412. //循环所有图片
  413. foreach (var f in m_list_allDfield)
  414. {
  415. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  416. {
  417. //循环图片的行数
  418. for (int c = 0; c < data.Rows.Count; c++)
  419. {
  420. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  421. {
  422. Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
  423. Graphics g2 = Graphics.FromImage(image);
  424. g2.DrawImage(f.OriginalImage, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
  425. Graphics graph_2 = Graphics.FromImage(image);
  426. for (int a = 0; a < fieldlist.Count; a++)
  427. {
  428. if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
  429. {
  430. //先获取该Field中的所有Particle
  431. List<Particle> list_particle;
  432. list_particle = fieldlist[a].ParticleList;
  433. //再循环计算所有的Particle对象
  434. foreach (Particle particle in list_particle)
  435. {
  436. List<Segment> list_seg;
  437. list_seg = particle.SegmentList;
  438. //创建颗粒分布图对应的类对象
  439. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  440. //再循环取出里面所有的segment
  441. foreach (Segment seg in list_seg)
  442. {
  443. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  444. Point on_p = new Point() { X = seg.Start, Y = seg.Height };
  445. Point off_p = new Point() { X = seg.Start + seg.Length, Y = seg.Height };
  446. var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
  447. Pen npen = new Pen(color);
  448. graph_2.DrawLine(npen, on_p, off_p);
  449. #endregion
  450. }
  451. }
  452. }
  453. }
  454. data.Rows[c]["mat"] = image;
  455. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  456. }
  457. }
  458. }
  459. }
  460. DataView dataView1 = data.DefaultView;
  461. dataView1.Sort = "X ASC";
  462. data = dataView1.ToTable();
  463. list_dt_picdata.Add(data);
  464. }
  465. return list_dt_picdata;
  466. }
  467. public delegate void MyEntrust();
  468. public event MyEntrust MyEvent;
  469. }
  470. }