浏览代码

修复颗粒回溯bug

zty 3 年之前
父节点
当前提交
2e09e32cbe
共有 1 个文件被更改,包括 43 次插入21 次删除
  1. 43 21
      OTSIncAReportApp/1-UI/Control_Graph/Controls/Control_DrawDistrbutionImageAndBSE.cs

+ 43 - 21
OTSIncAReportApp/1-UI/Control_Graph/Controls/Control_DrawDistrbutionImageAndBSE.cs

@@ -1058,27 +1058,7 @@ namespace OTSIncAReportGraph.Controls
                                 if (control_XRayTable1.Visible == false)
                                     ShowXRay(dp);
 
-                                Dictionary<string, object> SEMStageData = (Dictionary<string, object>)resultFile.ResultInfo["SEMStageData"];
-                                string ScanFieldSize = SEMStageData["scanFieldSize"].ToString();
-                                string leftOrRight = SEMStageData["xAxisDir"].ToString().Split('_')[0];
-                                string downOrUp = SEMStageData["yAxisDir"].ToString().Split('_')[0];
-                                Point point = new Point();
-                                if (leftOrRight == "RIGHT")
-                                {
-                                    point.X = dp.SEMPosX - int.Parse(ScanFieldSize) / 2 + dp.objParticleData.PosX;
-                                }
-                                else
-                                {
-                                    point.X = dp.SEMPosX + int.Parse(ScanFieldSize) / 2 + dp.objParticleData.PosX;
-                                }
-                                if (downOrUp == "UP")
-                                {
-                                    point.Y = dp.SEMPosY + int.Parse(ScanFieldSize) / 2 + dp.objParticleData.PosY;
-                                }
-                                else
-                                {
-                                    point.Y = dp.SEMPosY - int.Parse(ScanFieldSize) / 2 + dp.objParticleData.PosY;
-                                }
+                                Point point = CalculateParticleCenterPosition(resultFile, new Point(dp.SEMPosX, dp.SEMPosY), new Point(dp.objParticleData.PosX, dp.objParticleData.PosY));
 
                                 m_str_mouseshow_left = "颗粒SEM位置:" + point.X.ToString() + ":" + point.Y.ToString();
                                 m_sem_mouse_now_point = point;
@@ -1125,6 +1105,48 @@ namespace OTSIncAReportGraph.Controls
             Invalidate();
         }
 
+        /// <summary>
+        /// 计算颗粒中心的电镜坐标
+        /// </summary>
+        /// <param name="resultFile"></param>
+        /// <param name="SEMPos"></param>
+        /// <param name="ParticlePos"></param>
+        /// <returns></returns>
+        public static Point CalculateParticleCenterPosition(ResultFile resultFile, Point SEMPos, Point ParticlePos)
+        {
+            Point point = new Point();
+            Dictionary<string, object> sampleMembers = ((Dictionary<string, object>)((Dictionary<string, object>)resultFile.ResultInfo["Sample"])["Members"]);
+            Dictionary<string, object> imageScanParam = (Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)sampleMembers["MsrParams"])["Members"])["ImageScanParam"];
+            Dictionary<string, object> SEMDataMsr = (Dictionary<string, object>)sampleMembers["SEMDataMsr"];
+            Dictionary<string, object> SEMStageData = (Dictionary<string, object>)resultFile.ResultInfo["SEMStageData"];
+            float ScanFieldSizeX = float.Parse(SEMDataMsr["ScanFieldSize"].ToString());
+            string leftOrRight = SEMStageData["xAxisDir"].ToString().Split(':')[1];
+            string downOrUp = SEMStageData["yAxisDir"].ToString().Split(':')[1];
+            string ImageResolution = imageScanParam["ImageResolution"].ToString();
+            int width = int.Parse(ImageResolution.Split('_')[1]);
+            int height = int.Parse(ImageResolution.Split('_')[2]);
+            float ScanFieldSizeY = ScanFieldSizeX * height / width;
+            float m_pixelSize = ScanFieldSizeX / width;
+            if (leftOrRight == "RIGHT_TOWARD")
+            {
+                point.X = (int)(SEMPos.X - ScanFieldSizeX / 2 + ParticlePos.X * m_pixelSize);
+            }
+            else
+            {
+                point.X = (int)(SEMPos.X + ScanFieldSizeX / 2 - ParticlePos.X * m_pixelSize);
+            }
+            if (downOrUp == "UP_TOWARD")
+            {
+                point.Y = (int)(SEMPos.Y + ScanFieldSizeY / 2 - ParticlePos.Y * m_pixelSize);
+            }
+            else
+            {
+                point.Y = (int)(SEMPos.Y - ScanFieldSizeY / 2 + ParticlePos.Y * m_pixelSize);
+            }
+
+            return point;
+        }
+
         /// <summary>
         /// 获取鼠标所在位置的信息,显示在框架的右下角
         /// </summary>