Przeglądaj źródła

优化三元图绘制,添加特殊形状

zhangjiaxin 8 miesięcy temu
rodzic
commit
fbd1edf97e

+ 77 - 52
OTSIncAReportApp/1-UI/Control_ECharts/EChart_Trianglediagram.cs

@@ -1,5 +1,6 @@
 using NPOI.SS.UserModel;
 using NPOI.XSSF.UserModel;
+using OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration;
 using OTSIncAReportApp.DataOperation.DataAccess;
 using OTSIncAReportApp.OTSRstMgrFunction;
 using OTSIncAReportApp.OTSSampleReportInfo;
@@ -98,79 +99,88 @@ namespace OTSIncAReportApp.Control_ECharts
             List<Color> Color_list = SetColor_list();
             string str_unit = "";
             int PositionJeight = 27;
-            for (int i = 0; i < listName.Count; i = i + 10)
+            TernaryDiagram ternaryDiagram = new TernaryDiagram();
+            for (int i = 0; i < listName.Count; i = i + 8)
             {
                 if (i < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i]);
-                    g.DrawRectangle(mypen, 0, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 1, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i].ToString() + str_unit, myFont2, sbrush, 12, PositionJeight - 2);
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i]);
+                    ternaryDiagram.ShapeList(1, new PointF(10, PositionJeight), 10, Color_list[i], g);
+                    //g.DrawRectangle(mypen, 0, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 1, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i].ToString() + str_unit, myFont2, sbrush, 22, PositionJeight - 2);
                 }
                 if (i + 1 < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 1]);
-                    g.DrawRectangle(mypen, 94, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 95, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 1].ToString() + str_unit, myFont2, sbrush, 106, PositionJeight - 2);
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 1]);
+                    ternaryDiagram.ShapeList(2, new PointF(104, PositionJeight), 10, Color_list[i+1], g);
+                    //g.DrawRectangle(mypen, 94, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 95, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i + 1].ToString() + str_unit, myFont2, sbrush, 116, PositionJeight - 2);
                 }
                 if (i + 2 < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 2]);
-                    g.DrawRectangle(mypen, 188, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 189, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 2].ToString() + str_unit, myFont2, sbrush, 199, PositionJeight - 2);
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 2]);
+                    ternaryDiagram.ShapeList(3, new PointF(194, PositionJeight), 10, Color_list[i + 2], g);
+                    //g.DrawRectangle(mypen, 188, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 189, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i + 2].ToString() + str_unit, myFont2, sbrush, 206, PositionJeight - 2);
                 }
 
                 if (i + 3 < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 3]);
-                    g.DrawRectangle(mypen, 282, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 283, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 3].ToString() + str_unit, myFont2, sbrush, 292, PositionJeight - 2);
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 3]);
+                    ternaryDiagram.ShapeList(4, new PointF(292, PositionJeight), 10, Color_list[i + 3], g);
+                    //g.DrawRectangle(mypen, 282, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 283, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i + 3].ToString() + str_unit, myFont2, sbrush, 304, PositionJeight - 2);
                 }
                 if (i + 4 < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 4]);
-                    g.DrawRectangle(mypen, 376, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 377, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 4].ToString() + str_unit, myFont2, sbrush, 386, PositionJeight - 2);
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 4]);
+                    ternaryDiagram.ShapeList(1, new PointF(386, PositionJeight), 10, Color_list[i + 4], g);
+                    //g.DrawRectangle(mypen, 376, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 377, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i + 4].ToString() + str_unit, myFont2, sbrush, 398, PositionJeight - 2);
                 }
                 if (i + 5 < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
-                    g.DrawRectangle(mypen, 470, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 471, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 5].ToString() + str_unit, myFont2, sbrush, 480, PositionJeight - 2);
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
+                    ternaryDiagram.ShapeList(2, new PointF(480, PositionJeight), 10, Color_list[i + 5], g);
+                    //g.DrawRectangle(mypen, 470, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 471, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i + 5].ToString() + str_unit, myFont2, sbrush, 492, PositionJeight - 2);
                 }
                 if (i + 6 < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
-                    g.DrawRectangle(mypen, 564, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 565, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 6].ToString() + str_unit, myFont2, sbrush, 574, PositionJeight - 2);
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 6]);
+                    ternaryDiagram.ShapeList(3, new PointF(574, PositionJeight), 10, Color_list[i + 6], g);
+                    //g.DrawRectangle(mypen, 564, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 565, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i + 6].ToString() + str_unit, myFont2, sbrush, 586, PositionJeight - 2);
                 }
                 if (i + 7 < listName.Count)
                 {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
-                    g.DrawRectangle(mypen, 658, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 659, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 7].ToString() + str_unit, myFont2, sbrush, 668, PositionJeight - 2);
-                }
-                if (i + 8 < listName.Count)
-                {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
-                    g.DrawRectangle(mypen, 752, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 753, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 8].ToString() + str_unit, myFont2, sbrush, 762, PositionJeight - 2);
-                }
-                if (i + 9 < listName.Count)
-                {
-                    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
-                    g.DrawRectangle(mypen, 846, PositionJeight, 8, 8);
-                    g.FillRectangle(sbrush_Color, 847, PositionJeight + 1, 7, 7);
-                    g.DrawString(listName[i + 9].ToString() + str_unit, myFont2, sbrush, 856, PositionJeight - 2);
-                }
+                    //SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 7]);
+                    ternaryDiagram.ShapeList(4, new PointF(668, PositionJeight), 10, Color_list[i + 7], g);
+                    //g.DrawRectangle(mypen, 658, PositionJeight, 8, 8);
+                    //g.FillRectangle(sbrush_Color, 659, PositionJeight + 1, 7, 7);
+                    g.DrawString(listName[i + 7].ToString() + str_unit, myFont2, sbrush, 680, PositionJeight - 2);
+                }
+                //if (i + 8 < listName.Count)
+                //{
+                //    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
+                //    g.DrawRectangle(mypen, 752, PositionJeight, 8, 8);
+                //    g.FillRectangle(sbrush_Color, 753, PositionJeight + 1, 7, 7);
+                //    g.DrawString(listName[i + 8].ToString() + str_unit, myFont2, sbrush, 762, PositionJeight - 2);
+                //}
+                //if (i + 9 < listName.Count)
+                //{
+                //    SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
+                //    g.DrawRectangle(mypen, 846, PositionJeight, 8, 8);
+                //    g.FillRectangle(sbrush_Color, 847, PositionJeight + 1, 7, 7);
+                //    g.DrawString(listName[i + 9].ToString() + str_unit, myFont2, sbrush, 856, PositionJeight - 2);
+                //}
                 PositionJeight = PositionJeight + 15;
             }
             PictureBox pictureBox = new PictureBox();
@@ -358,12 +368,27 @@ namespace OTSIncAReportApp.Control_ECharts
                 g.DrawString((i * 10).ToString(), new Font("Arial Unicode MS", 8, FontStyle.Bold), new SolidBrush(Color.Black), new Point(y1_b, Line + 8));
                 g.DrawString(((10 - i) * 10).ToString(), new Font("Arial Unicode MS", 8, FontStyle.Bold), new SolidBrush(Color.Black), new Point(x1_b + 20, x2_b - 5));
             }
+            mypen = new Pen(Color.Black, 1);
+            TernaryDiagram ternaryDiagram = new TernaryDiagram();
+            int order = 1;
+            HashSet<int> hashSet = new HashSet<int>();
+            
             for (int i = 0; i < dt_point_sort.Rows.Count; i++)
             {
-                mypen = new Pen(Color.Black, 1);
-                SolidBrush mysbrush = new SolidBrush(Color_list[Convert.ToInt32(dt_point_sort.Rows[i]["Color_position"])]);
-                g.FillRectangle(mysbrush, Convert.ToInt32(dt_point_sort.Rows[i]["X"]) + 8, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]) - 2, 4, 5);
-                g.DrawRectangle(mypen, Convert.ToInt32(dt_point_sort.Rows[i]["X"]) + 7, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]) - 2, 5, 5);
+                int pos = Convert.ToInt32(dt_point_sort.Rows[i]["Color_position"]);
+                if (pos > 4)
+                {
+                    order = pos % 4;
+                }
+                else
+                {
+                    order = pos;
+                }
+                PointF pointF = new PointF(Convert.ToInt32(dt_point_sort.Rows[i]["X"])+10, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]));
+                ternaryDiagram.ShapeList(order, pointF, 10, Color_list[pos-1], g);
+                //SolidBrush mysbrush = new SolidBrush(Color_list[Convert.ToInt32(dt_point_sort.Rows[i]["Color_position"])]);
+                //g.FillRectangle(mysbrush, Convert.ToInt32(dt_point_sort.Rows[i]["X"]) + 8, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]) - 2, 4, 5);
+                //g.DrawRectangle(mypen, Convert.ToInt32(dt_point_sort.Rows[i]["X"]) + 7, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]) - 2, 5, 5);
             }
             Font myFont = new Font("Arial Unicode MS", 13, FontStyle.Bold);
             Font Font_features = new Font("Arial Unicode MS", 10, FontStyle.Bold);

+ 115 - 5
OTSIncAReportApp/1-UI/OTSReportExport/DataIntegration/TernaryDiagram.cs

@@ -7,6 +7,7 @@ using System;
 using System.Collections.Generic;
 using System.Data;
 using System.Drawing;
+using System.Drawing.Drawing2D;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -93,11 +94,11 @@ namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
             return map;
         }
 
-        public Bitmap DrawATernaryPicture(int selectindex, c_TemplateClass m_mbszclass, List<Color> Color_list,OTSReport_Export m_otsreport_export,string a_PartSizeFile)
+        public Bitmap DrawATernaryPicture(int selectindex, c_TemplateClass m_mbszclass, List<Color> Color_list, OTSReport_Export m_otsreport_export, string a_PartSizeFile)
         {
             initialization(m_otsreport_export);
-          
-          
+
+
 
             ResultFile resultFile = m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.GetWorkingResultId()];
 
@@ -133,7 +134,7 @@ namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
             dt_point_sort.Columns.Add("X", typeof(double));
             dt_point_sort.Columns.Add("Y", typeof(double));
             dt_point_sort.Columns.Add("Color_position");
-            DataTable particles = GetParticles(resultFile.FilePath, nameList, 0,m_otsreport_export,m_mbszclass);
+            DataTable particles = GetParticles(resultFile.FilePath, nameList, 0, m_otsreport_export, m_mbszclass);
             foreach (DataRow item in particles.Rows)
             {
                 if (item["particleLocation"].ToString() == "0,0,0")
@@ -278,7 +279,7 @@ namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
             listName.Add(d.ToString() + "~MAX");
 
             string filedAndParticl = "";
-           
+
             string po = "";
             string con = "";
             int row = m_condition.m_conditionData.ConditionItemList.Count;
@@ -450,6 +451,115 @@ namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
             }
             return strRet;
         }
+        /// <summary>
+        /// 三角形绘制
+        /// </summary>
+        /// <param name="center">中心点位置</param>
+        /// <param name="sideLength">边长</param>
+        /// <param name="Blue">颜色</param>
+        /// <param name="g">Graphics</param>
+        private void Triangle(PointF center, float sideLength, Color Blue, Graphics g)
+        {
+            Pen pen = new Pen(Color.Black, 2);
+            // 计算正三角形的高度(从中心到底边的垂直距离)
+            float height = (float)(Math.Sqrt(3) / 2 * sideLength);
+            // 计算三个顶点的坐标
+            float cenrerX = center.X;
+            float cenrerY = center.Y;
+            PointF topVertex = new PointF(cenrerX, cenrerY - height / 2);
+            PointF leftVertex = new PointF(cenrerX - sideLength / 2, cenrerY + height / 2 * (float)Math.Sqrt(3) / 3);
+            PointF rightVertex = new PointF(cenrerX + sideLength / 2, cenrerY + height / 2 * (float)Math.Sqrt(3) / 3);
+            // 为了演示,这里我们仍然使用上面计算得到的顶点
+            PointF[] vertices = { topVertex, leftVertex, rightVertex };
+            
+            g.DrawPolygon(pen, vertices);
+            // 创建一个Brush对象来定义填充颜色
+            Brush brush = new SolidBrush(Blue); // 例如,填充颜色为蓝色
+            // 使用Graphics.FillPolygon方法填充正三角形
+            g.FillPolygon(brush, vertices);
+        }
+        /// <summary>
+        /// 矩形
+        /// </summary>
+        /// <param name="center">中心点位置</param>
+        /// <param name="sideLength">边长</param>
+        /// <param name="Blue">颜色</param>
+        /// <param name="g">Graphics</param>
+        private void Rectangle(PointF center, float sideLength, Color Blue, Graphics g)
+        {
+            PointF pointF = new PointF(center.X - (sideLength/2), center.Y - (sideLength / 2));
+            Brush brush = new SolidBrush(Blue);
+            Pen pen = new Pen(Color.Black, 2);
+            
+            g.DrawRectangle(pen, pointF.X, pointF.Y, sideLength, sideLength);
+            g.FillRectangle(brush, pointF.X, pointF.Y, sideLength, sideLength);
+        }
+        /// <summary>
+        /// 圆形
+        /// </summary>
+        /// <param name="center">中心点位置</param>
+        /// <param name="sideLength">边长</param>
+        /// <param name="Blue">颜色</param>
+        /// <param name="g">Graphics</param>
+        private void circle(PointF center, float sideLength, Color Blue, Graphics g)
+        {
+            Pen pen = new Pen(Color.Black, 2);
+            Brush brush = new SolidBrush(Blue); // 例如,填充颜色为蓝色
+            PointF pointF = new PointF(center.X - (sideLength / 2), center.Y - (sideLength / 2));
+            
+            g.DrawEllipse(pen, pointF.X , pointF.Y , sideLength , sideLength);
+            g.FillEllipse(brush, pointF.X, pointF.Y, sideLength, sideLength);
+        }
 
+        /// <summary>
+        /// 菱形
+        /// </summary>
+        /// <param name="center">中心点位置</param>
+        /// <param name="sideLength">边长</param>
+        /// <param name="Blue">颜色</param>
+        /// <param name="g">Graphics</param>
+        private void rhombus(PointF center, float sideLength, Color Blue, Graphics g)
+        {
+
+            // 保存当前的Graphics状态,以便稍后恢复
+            GraphicsState state = g.Save();
+            // 将坐标系移动到旋转的中心点,并旋转45度
+            g.TranslateTransform(center.X, center.Y);
+            g.RotateTransform(45);
+            // 在旋转后的坐标系中绘制正方形
+            Rectangle rect = new Rectangle((int)(-sideLength / 2), (int)(-sideLength / 2), (int)sideLength, (int)sideLength);
+            Pen pen = new Pen(Color.Black, 2);
+            g.DrawRectangle(pen, rect);
+            Brush brush = new SolidBrush(Blue);
+            g.FillRectangle(brush, rect);
+            // 恢复原始的Graphics状态
+            g.Restore(state);
+        }
+
+        public void ShapeList(int order, PointF center, float sideLength, Color Blue, Graphics g)
+        {
+            if (order ==1)
+            {
+                //三角
+                Triangle(center, sideLength+2, Blue, g);
+            }
+            else if(order==2)
+            {
+                //矩形
+                Rectangle(center, sideLength, Blue, g);
+            }
+            else if (order==3)
+            {
+                //圆形
+                circle(center, sideLength, Blue, g);
+            }
+            else if (order ==4)
+            {
+                //菱形
+                rhombus(center, sideLength, Blue, g);
+            }
+        }
     }
 }
+
+