GBT37787Dialog.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. using OpenCvSharp;
  2. using OpenCvSharp.Extensions;
  3. using PaintDotNet.Annotation;
  4. using PaintDotNet.Annotation.Enum;
  5. using PaintDotNet.Annotation.FieldView;
  6. using PaintDotNet.Base.DedicatedAnalysis.Porosity;
  7. using PaintDotNet.Base.DedicatedAnalysis.Porosity.Standard.TypesOfAssessment;
  8. using PaintDotNet.Base.Functionodel;
  9. using PaintDotNet.GeneralAnalysis;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.ComponentModel;
  13. using System.Data;
  14. using System.Drawing;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using System.Windows.Forms;
  19. namespace PaintDotNet.DedicatedAnalysis.Porosity.GBT37787
  20. {
  21. partial class GBT37787Dialog : PorosityStandardDialog
  22. {
  23. private GroupBox groupBox1;
  24. private DataGridView dataGridView1;
  25. private DataGridViewTextBoxColumn Column11;
  26. private DataGridViewTextBoxColumn dataGridViewTextBoxColumn1;
  27. private DataGridViewTextBoxColumn dataGridViewTextBoxColumn2;
  28. private DataGridViewTextBoxColumn dataGridViewTextBoxColumn3;
  29. private DataGridViewTextBoxColumn dataGridViewTextBoxColumn4;
  30. public GBT37787Dialog(AppWorkspace appWorkspace, string dialogText, PdnMenuItem menuItem) : base(appWorkspace, dialogText, menuItem)
  31. {
  32. InitializeComponent();
  33. InitializeLanguageText();
  34. }
  35. private void InitializeLanguageText()
  36. {
  37. this.dataGridViewTextBoxColumn2.HeaderText = PdnResources.GetString("Menu.Phasearea.text");
  38. this.dataGridViewTextBoxColumn1.HeaderText = PdnResources.GetString("Menu.Phasename.text");
  39. this.Column11.HeaderText = PdnResources.GetString("Menu.view.text");
  40. this.groupBox1.Text = PdnResources.GetString("Menu.reckoning.text");
  41. this.dataGridViewTextBoxColumn3.HeaderText = PdnResources.GetString("Menu.proportion.text");
  42. this.dataGridViewTextBoxColumn4.HeaderText = PdnResources.GetString("Menu.Phasecontent.text");
  43. this.Text = "GBT37787_2019(" + PdnResources.GetString("Menu.Porosity.text") + ")";
  44. }
  45. private void InitializeComponent()
  46. {
  47. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
  48. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
  49. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
  50. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
  51. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
  52. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle();
  53. this.groupBox1 = new System.Windows.Forms.GroupBox();
  54. this.dataGridView1 = new System.Windows.Forms.DataGridView();
  55. this.Column11 = new System.Windows.Forms.DataGridViewTextBoxColumn();
  56. this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
  57. this.dataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
  58. this.dataGridViewTextBoxColumn3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
  59. this.dataGridViewTextBoxColumn4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
  60. ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_lwRatioLimit)).BeginInit();
  61. this.groupBox1.SuspendLayout();
  62. ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
  63. this.SuspendLayout();
  64. //
  65. // groupBox1
  66. //
  67. this.groupBox1.Controls.Add(this.dataGridView1);
  68. this.groupBox1.Location = new System.Drawing.Point(178, 370);
  69. this.groupBox1.Name = "groupBox1";
  70. this.groupBox1.Size = new System.Drawing.Size(356, 186);
  71. this.groupBox1.TabIndex = 35;
  72. this.groupBox1.TabStop = false;
  73. //
  74. // dataGridView1
  75. //
  76. this.dataGridView1.AllowUserToAddRows = false;
  77. this.dataGridView1.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;
  78. dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
  79. dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
  80. dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
  81. dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
  82. dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
  83. dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
  84. dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
  85. this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
  86. this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
  87. this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
  88. this.Column11,
  89. this.dataGridViewTextBoxColumn1,
  90. this.dataGridViewTextBoxColumn2,
  91. this.dataGridViewTextBoxColumn3,
  92. this.dataGridViewTextBoxColumn4});
  93. this.dataGridView1.Location = new System.Drawing.Point(8, 20);
  94. this.dataGridView1.MultiSelect = false;
  95. this.dataGridView1.Name = "dataGridView1";
  96. this.dataGridView1.ReadOnly = true;
  97. this.dataGridView1.RowHeadersVisible = false;
  98. this.dataGridView1.RowTemplate.Height = 23;
  99. this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
  100. this.dataGridView1.Size = new System.Drawing.Size(340, 157);
  101. this.dataGridView1.TabIndex = 1;
  102. //
  103. // Column11
  104. //
  105. dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
  106. this.Column11.DefaultCellStyle = dataGridViewCellStyle2;
  107. this.Column11.Name = "Column11";
  108. this.Column11.ReadOnly = true;
  109. this.Column11.Width = 80;
  110. //
  111. // dataGridViewTextBoxColumn1
  112. //
  113. dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
  114. this.dataGridViewTextBoxColumn1.DefaultCellStyle = dataGridViewCellStyle3;
  115. this.dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1";
  116. this.dataGridViewTextBoxColumn1.ReadOnly = true;
  117. this.dataGridViewTextBoxColumn1.Width = 70;
  118. //
  119. // dataGridViewTextBoxColumn2
  120. //
  121. dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
  122. this.dataGridViewTextBoxColumn2.DefaultCellStyle = dataGridViewCellStyle4;
  123. this.dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2";
  124. this.dataGridViewTextBoxColumn2.ReadOnly = true;
  125. this.dataGridViewTextBoxColumn2.Width = 70;
  126. //
  127. // dataGridViewTextBoxColumn3
  128. //
  129. dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
  130. this.dataGridViewTextBoxColumn3.DefaultCellStyle = dataGridViewCellStyle5;
  131. this.dataGridViewTextBoxColumn3.Name = "dataGridViewTextBoxColumn3";
  132. this.dataGridViewTextBoxColumn3.ReadOnly = true;
  133. this.dataGridViewTextBoxColumn3.Width = 60;
  134. //
  135. // dataGridViewTextBoxColumn4
  136. //
  137. dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
  138. this.dataGridViewTextBoxColumn4.DefaultCellStyle = dataGridViewCellStyle6;
  139. this.dataGridViewTextBoxColumn4.Name = "dataGridViewTextBoxColumn4";
  140. this.dataGridViewTextBoxColumn4.ReadOnly = true;
  141. this.dataGridViewTextBoxColumn4.Width = 70;
  142. //
  143. // GBT37787Dialog
  144. //
  145. this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
  146. this.ClientSize = new System.Drawing.Size(1177, 761);
  147. this.Controls.Add(this.groupBox1);
  148. this.Name = "GBT37787Dialog";
  149. this.Controls.SetChildIndex(this.groupBox1, 0);
  150. ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_lwRatioLimit)).EndInit();
  151. this.groupBox1.ResumeLayout(false);
  152. ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
  153. this.ResumeLayout(false);
  154. }
  155. #region 需继承方法
  156. protected override void SubclassInitialize()
  157. {
  158. InitializeComponent();
  159. }
  160. protected override MethodOfAssessment getMethodOfAssessment()
  161. {
  162. return new MethodOfGBT37787(this.imgPxPerUnit);
  163. }
  164. protected override void initColorSetting()
  165. {
  166. //this.radioButton_Black.CheckedChanged += new System.EventHandler(colorSettingRadioButton);
  167. //this.radioButton_Gray.CheckedChanged += new System.EventHandler(colorSettingRadioButton);
  168. //this.radioButton_LightBlue.CheckedChanged += new System.EventHandler(colorSettingRadioButton);
  169. //this.radioButton_DarkGray.CheckedChanged += new System.EventHandler(colorSettingRadioButton);
  170. }
  171. protected override void initDisplaySetting()
  172. {
  173. //this.panel_displaySetting_SS.BackColor = Color.FromArgb(MethodOfAssessment.activeMethod.inclusionsStandard.globalSettings.typeDics["SS"].showColor);
  174. //this.panel_displaySetting_OS.BackColor = Color.FromArgb(MethodOfAssessment.activeMethod.inclusionsStandard.globalSettings.typeDics["OS"].showColor);
  175. //this.panel_displaySetting_OA.BackColor = Color.FromArgb(MethodOfAssessment.activeMethod.inclusionsStandard.globalSettings.typeDics["OA"].showColor);
  176. //this.panel_displaySetting_OG.BackColor = Color.FromArgb(MethodOfAssessment.activeMethod.inclusionsStandard.globalSettings.typeDics["OG"].showColor);
  177. }
  178. protected override void list_add_data()
  179. {
  180. }
  181. #endregion 需继承方法
  182. /// <summary>
  183. /// 获取视场即相相关参数
  184. /// </summary>
  185. protected override void getAllView()
  186. {
  187. double pxPerUnit = Startup.instance.rules[MeasurementUnit.Micron];
  188. if (this.documentWorkspace.phaseModels.Count == 0)
  189. {
  190. MessageBox.Show(PdnResources.GetString("Menu.Thereisnophasetoanalyze.text")+"!");
  191. return;
  192. }
  193. dataGridView1.Rows.Clear();
  194. if (this.lstView_img.FocusedItem != null)
  195. {
  196. //总面积
  197. double fullArea = AnalysisTools.GetPointsFromMat(this.imageMat.Clone()) * pxPerUnit * pxPerUnit;
  198. int num = 2;
  199. if (this.domainUpDown_resultPrecision.SelectedIndex != -1)
  200. {
  201. num = Convert.ToInt32(this.domainUpDown_resultPrecision.Items[this.domainUpDown_resultPrecision.SelectedIndex]);
  202. }
  203. if (this.documentWorkspace.GraphicsList.IsExsitView())
  204. {
  205. int m = 0;
  206. for (int k = 0; k < this.documentWorkspace.GraphicsList.Count; k++)
  207. {
  208. if (this.documentWorkspace.GraphicsList[k].objectType != DrawClass.View || (this.documentWorkspace.GraphicsList[k].Rectangle.Width == 0 && this.documentWorkspace.GraphicsList[k].Rectangle.Height == 0)) {
  209. continue;
  210. }
  211. for (int i = 0; i < this.originalPhaseModels.Count; i++)
  212. {
  213. PhaseModel pModel = this.originalPhaseModels[i];
  214. if (pModel.mat == null)
  215. {
  216. pModel.mat = this.documentWorkspace.phaseModels[i].mat;
  217. }
  218. // TODO 用于在一张图中扣出所有视场的Mat
  219. Bitmap bitmap = this.appWorkspace.DocumentWorkspaces[this.lstView_img.FocusedItem.Index].GetCutSizeWithColorWhiteOrTransparentColor(false);
  220. Mat oldMapabc = PaintDotNet.Camera.Tools.ToMat(bitmap);
  221. int X = (int)this.documentWorkspace.GraphicsList[k].Rectangle.X;
  222. int Y = (int)this.documentWorkspace.GraphicsList[k].Rectangle.Y;
  223. int reWidth = (int)this.documentWorkspace.GraphicsList[k].Rectangle.Width;
  224. int reHeight = (int)this.documentWorkspace.GraphicsList[k].Rectangle.Height;
  225. if (this.documentWorkspace.GraphicsList[k].Rectangle.Contains(new RectangleF(0, 0, bitmap.Width, bitmap.Height)))
  226. {
  227. X = 0;
  228. Y = 0;
  229. reWidth = bitmap.Width;
  230. reHeight = bitmap.Height;
  231. }
  232. else {
  233. if (this.documentWorkspace.GraphicsList[k].Rectangle.IntersectsWith(new RectangleF(0, 0, bitmap.Width, bitmap.Height))) {
  234. RectangleF rectangleF = new RectangleF(this.documentWorkspace.GraphicsList[k].Rectangle.X, this.documentWorkspace.GraphicsList[k].Rectangle.Y, this.documentWorkspace.GraphicsList[k].Rectangle.Width, this.documentWorkspace.GraphicsList[k].Rectangle.Height);
  235. rectangleF.Intersect(new RectangleF(0, 0, bitmap.Width, bitmap.Height));
  236. X = (int)rectangleF.X;
  237. Y = (int)rectangleF.Y;
  238. reWidth = (int)rectangleF.Width;
  239. reHeight = (int)rectangleF.Height;
  240. }
  241. }
  242. Mat oldMap = new Mat(oldMapabc, new Rect(X, Y, reWidth, reHeight));
  243. //寻找并标记区域个数
  244. Mat labelMat = new Mat();
  245. Mat stats = new Mat();
  246. Mat centroids = new Mat();
  247. int nonenum = Cv2.ConnectedComponentsWithStats(oldMap.CvtColor(ColorConversionCodes.BGR2GRAY), labelMat, stats, centroids, PixelConnectivity.Connectivity8);
  248. for (int h = 1; h < centroids.Cols; h++)
  249. {
  250. int x = stats.At<int>(h, 0);
  251. int y = stats.At<int>(h, 1);
  252. int width = stats.At<int>(h, 2);
  253. int height = stats.At<int>(h, 3);
  254. int area = stats.At<int>(h, 4);
  255. //if (x < 0 || y < 0 || width > bitmap.Width || height > bitmap.Height)
  256. //{
  257. // continue;
  258. //}
  259. Mat ImageROI1 = new Mat(pModel.mat, new Rect(X, Y, reWidth, reHeight));
  260. Mat[] contours = null;
  261. Mat hierarchy = new Mat();
  262. Mat mat = Mat.FromImageData(ImageROI1.ToBytes(), ImreadModes.Grayscale);
  263. Cv2.FindContours(mat, out contours, hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxNone);
  264. CounterResult result = new CounterResult();
  265. result.GraphName = lstView_img.FocusedItem.Text;
  266. result.PolyphaseName = pModel.name;
  267. result.Count = contours.Count();
  268. //视场面积
  269. int viewArea = (int)(this.documentWorkspace.GraphicsList[k].Rectangle.Width * this.documentWorkspace.GraphicsList[k].Rectangle.Height * pxPerUnit * pxPerUnit);
  270. //相面积
  271. double phaseArea = AnalysisTools.GetPointsFromMat(ImageROI1) * pxPerUnit * pxPerUnit;
  272. result.Area = Convert.ToDouble(Math.Round(Convert.ToDecimal(phaseArea), num));
  273. // 比例
  274. result.AreaContent = viewArea > 0 ? (double)(((double)phaseArea) / ((double)viewArea)) * 100 : 0;
  275. result.AreaContent = Convert.ToDouble(Math.Round(Convert.ToDecimal(result.AreaContent), num));
  276. //相含量
  277. result.AreaPercent = fullArea > 0 ? (double)(result.Area / fullArea) * 100 : 0;
  278. result.AreaPercent = Convert.ToDouble(Math.Round(Convert.ToDecimal(result.AreaPercent), num));
  279. dataGridView1.Rows.Add(PdnResources.GetString("Menu.view.text") + m + "-相" + (h -1), result.PolyphaseName, result.Area, result.AreaContent, result.AreaPercent);
  280. m++;
  281. }
  282. }
  283. }
  284. }
  285. else {
  286. for (int i = 0; i < this.originalPhaseModels.Count; i++)
  287. {
  288. PhaseModel pModel = this.originalPhaseModels[i];
  289. if (pModel.mat == null) {
  290. pModel.mat = this.documentWorkspace.phaseModels[i].mat;
  291. }
  292. Mat[] contours = null;
  293. Mat hierarchy = new Mat();
  294. Mat mat = Mat.FromImageData(pModel.mat.ToBytes(), ImreadModes.Grayscale);
  295. Cv2.FindContours(mat, out contours, hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxNone);
  296. CounterResult result = new CounterResult();
  297. result.GraphName = lstView_img.FocusedItem.Text;
  298. result.PolyphaseName = pModel.name;
  299. result.Count = contours.Count();
  300. //视场面积
  301. double viewArea = this.imageMat.Width * this.imageMat.Height * pxPerUnit * pxPerUnit;
  302. //相面积
  303. double phaseArea = AnalysisTools.GetPointsFromMat(pModel.mat) * pxPerUnit * pxPerUnit;
  304. result.Area = Convert.ToDouble(Math.Round(Convert.ToDecimal(phaseArea), num));
  305. // 比例
  306. result.AreaContent = viewArea > 0 ? (double)(((double)phaseArea) / ((double)viewArea)) * 100 : 0;
  307. result.AreaContent = Convert.ToDouble(Math.Round(Convert.ToDecimal(result.AreaContent), num));
  308. //相含量
  309. result.AreaPercent = fullArea > 0 ? (double)(result.Area / fullArea) * 100 : 0;
  310. result.AreaPercent = Convert.ToDouble(Math.Round(Convert.ToDecimal(result.AreaPercent), num));
  311. dataGridView1.Rows.Add(PdnResources.GetString("Menu.view.text")+ "1", result.PolyphaseName, result.Area, result.AreaContent, result.AreaPercent);
  312. }
  313. }
  314. }
  315. }
  316. protected override void clearAllView() {
  317. dataGridView1.Rows.Clear();
  318. }
  319. protected override void clearOneView()
  320. {
  321. if (dataGridView1.Rows.Count > 0)
  322. {
  323. dataGridView1.Rows.RemoveAt(this.delIndex);
  324. }
  325. }
  326. protected override void changeOneViewColor()
  327. {
  328. if (dataGridView1.Rows.Count > 0)
  329. {
  330. dataGridView1.Rows[this.delIndex].DefaultCellStyle.BackColor = this.documentItems[this.lstView_img.FocusedItem.Index].drawGraphicsList[this.delIndex].Color;
  331. }
  332. }
  333. }
  334. }