using System;
using System.Collections.Generic;
using OTSCLRINTERFACE;
using System.Drawing;
using OTSDataType;
using OTSModelSharp;
using OTSModelSharp.ServiceInterface;
namespace OTSMeasureApp
{
public class SEMDATAFieldManage
{
#region 全部变量声明
//连接状态
public bool ConnectionState = false;
// 判断是否是模拟状态 FASE: 不是在模拟环境下 True: 在模拟环境下
public bool IsSimulationStatus = false;
//获取当前电镜的ID号
//int SemType = 0;
//获取XML 路径
static string xmlFilePath = System.Configuration.ConfigurationManager.ConnectionStrings["XMLFilePath"].ConnectionString;
//日志路径
static string LogPath = System.Configuration.ConfigurationManager.ConnectionStrings["LogPath"].ConnectionString;
//电镜设置对象
SemController cSemfun = null;
ScanController cScanfun = null;
EDSController cEDSfun = null;
//主窗体对象
COTSMeasureParam m_ProjData;
CFieldPositionMgr cFieldMgrClr;
NLog.Logger log ;
#endregion
#region 构造方法
public SEMDATAFieldManage(COTSMeasureParam a_DataMgr)
{
log = NLog.LogManager.GetCurrentClassLogger();
//获取主窗体对象
if (m_ProjData == null)
{
m_ProjData = a_DataMgr;
}
}
///
/// 初始化其他参数
///
public bool InitAndConnection()
{
try
{
//控制类对象初始化
if (cSemfun == null)
{
cSemfun = SemController.GetSEMController();
}
if (cScanfun == null)
{
cScanfun = ScanController.GetScanController();
}
if (cEDSfun == null)
{
cEDSfun = EDSController.GetEDSController();
}
//获取帧图操作类对象
if (cFieldMgrClr == null)
{
cFieldMgrClr = new CFieldPositionMgr();
}
//连接电镜
return cSemfun.Connect();
}
catch (Exception ex)
{
log.Error("SEMDATAFieldManage_InitAndConntion:--Error:" + ex.ToString() + "");
return false;
}
}
#endregion
#region 获取放大倍数
private double GetGMagnification()
{
try
{
double a_dMagnification = 0;
//获取放大倍数
bool result = cSemfun.GetMagnification(ref a_dMagnification);
if (result)
{
//赋值 显示
return a_dMagnification;
}
else
{
//配置结果提示
return 0;
}
}
catch (Exception)
{
return 0;
}
}
#endregion
#region 获取工作距离
private double GetSemWorkingDistance()
{
try
{
double a_WorkingDistance = 0;
//获取工作距离
bool result = cSemfun.GetWorkingDistance(ref a_WorkingDistance);
if (result)
{
//赋值 显示
return a_WorkingDistance;
}
else
{
//配置结果提示
return 0;
}
}
catch (Exception ex)
{
log.Error("SEMDATAFieldManage_GetSemWorkingDistance--错误日志:" + ex.ToString() + "");
return 0;
}
}
#endregion
#region 设置放大倍数
private bool SetGMagnification(double a_dMagnification)
{
try
{
//获取放大倍数
bool result = cSemfun.SetMagnification(a_dMagnification);
return result;
}
catch (Exception ex)
{
log.Error("SEMDATAFieldManage_SetSemWorkingDistance--错误日志:" + ex.ToString() + "");
return false;
}
}
#endregion
#region 设置工作距离
private bool SetSemWorkingDistance(double a_WorkingDistance)
{
try
{
bool result = cSemfun.SetWorkingDistance(a_WorkingDistance);
return result;
}
catch (Exception ex)
{
log.Error("SEMDATAFieldManage_SetSemWorkingDistance--错误日志:" + ex.ToString() + "");
return false;
}
}
#endregion
#region 获取单点Xray与元素信息
///
/// 获取单点Xray与元素信息
///
/// 采集时间
/// 鼠标在BSE图中X轴
/// 鼠标在BSE图中Y轴
/// Xray数组
/// 元素数量
/// 元素名称
///
public bool GetXRayAndElementInfo(uint a_Milliseconds, int a_BSEX, int a_BSEY, ref int[] a_ElementXrayData, ref ValueType a_nElementNum, ref string a_strElementName)
{
//获取Xray与元素信息
return false;// cfun.GetEDSControl().GetXRayByPoints(a_Milliseconds, a_BSEX, a_BSEY, ref a_ElementXrayData, ref a_nElementNum, ref a_strElementName);
}
#endregion
#region 获取电镜参数 放大倍数与工作距离
public List GetSEMMagAndWDParameter()
{
List semParameter = new List();
//放大倍数
double magnification = GetGMagnification();
//工作距离
double semWorkingDistance = GetSemWorkingDistance();
//添加 放大倍数、工作距离
semParameter.Add(magnification);
semParameter.Add(semWorkingDistance);
return semParameter;
}
#endregion
#region 设置电镜 放大倍数与工作距离
///
/// 设置电镜 放大倍数
///
///
///
///
public bool SetSEMMagnificationParameter(double a_dMagnification)
{
return SetGMagnification(a_dMagnification);
}
///
/// 设置电镜 工作距离
///
///
///
public bool SetSEMWorkingDistanceParameter(double a_WorkingDistance)
{
return SetSemWorkingDistance(a_WorkingDistance);
}
#endregion
#region 驱动SEM到当前位置
public bool SetSEMCurrentLocation( Point mousePoint, List m_RectangleGDIObjects, StageDrawingData oTSSampleStageData, int IsWidth, int Width, int Height)
{
try
{
ARectangleGDIObject RectangleGDIObject = null;
//循环判断是否鼠标在样品范围中
foreach (ARectangleGDIObject item in m_RectangleGDIObjects)
{
if (item.Region.Contains(mousePoint))
{
//获取在范围中的样品
RectangleGDIObject = item;
break;
}
}
//判断是否鼠标在样品台范围中
Point OTSLocation = new Point();
if (RectangleGDIObject != null)
{
//鼠标在样品台中移动获取坐标
OTSLocation = OTSSamplespaceGraphicsPanelFun.GetMouseLocationInRectangleGDIObject(mousePoint, m_RectangleGDIObjects[0], oTSSampleStageData, IsWidth, m_RectangleGDIObjects[0].Region.Width, m_RectangleGDIObjects[0].Region.Height);
Point SEMPoint =m_ProjData.ChangeOTSToSemCoord(OTSLocation);
//调用C++ controller中的方法
//移动至当前位置
bool result = cSemfun.MoveSEMToPoint(new Point(SEMPoint.X, SEMPoint.Y));
if (result)
{
return result;
}
}
return false;
}
catch (Exception)
{
return false;
}
}
#endregion
#region 驱动SEM到中心位置
public bool DriveSEMToLocation(Point mousePoint, List m_RectangleGDIObjects, List m_SingleGDIObjects, StageDrawingData oTSSampleStageData, int IsWidth, int Width, int Height)
{
try
{
ARectangleGDIObject RectangleGDIObject = null;
//循环判断是否鼠标在样品范围中
foreach (ARectangleGDIObject item in m_RectangleGDIObjects)
{
if (item.Region.Contains(mousePoint))
{
//获取在范围中的样品台对象
RectangleGDIObject = item;
break;
}
}
//判断是否鼠标在样品台范围中
Point OTSLocation = new Point();
if (RectangleGDIObject != null)
{
//鼠标在样品台中移动获取坐标
OTSLocation = OTSSamplespaceGraphicsPanelFun.GetMouseLocationInRectangleGDIObject(mousePoint, RectangleGDIObject, oTSSampleStageData, IsWidth, RectangleGDIObject.Region.Width, RectangleGDIObject.Region.Height);
Point SEMPoint = m_ProjData.ChangeOTSToSemCoord(OTSLocation);
//循环single中所有对象 进行位置匹配
for (int i = 0; i < m_SingleGDIObjects.Count; i++)
{
if (m_SingleGDIObjects[i].Region.Contains(mousePoint))
{
//获取帧图左上坐标
Point LT = new Point((int)m_SingleGDIObjects[i].RegionF.Left, (int)m_SingleGDIObjects[i].RegionF.Top);
Point lTLocation = OTSSamplespaceGraphicsPanelFun.GetMouseLocationInRectangleGDIObject(LT, RectangleGDIObject, oTSSampleStageData, IsWidth, RectangleGDIObject.Region.Width, RectangleGDIObject.Region.Height);
lTLocation = m_ProjData.ChangeOTSToSemCoord(lTLocation);
//获取帧图右下坐标
Point RB = new Point((int)m_SingleGDIObjects[i].RegionF.Right, (int)m_SingleGDIObjects[i].RegionF.Bottom);
Point rbLocation = OTSSamplespaceGraphicsPanelFun.GetMouseLocationInRectangleGDIObject(RB, RectangleGDIObject, oTSSampleStageData, IsWidth, RectangleGDIObject.Region.Width, RectangleGDIObject.Region.Height);
rbLocation = m_ProjData.ChangeOTSToSemCoord(rbLocation);
int diffX = Math.Abs(rbLocation.X - lTLocation.X) / 2;
int diffY = Math.Abs(rbLocation.Y - lTLocation.Y) / 2;
//移动至帧图中心位置
int moveCenterX = lTLocation.X - diffX;
int moveCenterY = lTLocation.Y + diffY;
bool result = cSemfun.MoveSEMToPoint(new Point(moveCenterX, moveCenterY));
if (result)
{
return result;
}
}
}
}
return false;
}
catch (Exception)
{
return false;
}
}
#endregion
#region 获取SEM位置
public bool GetSemLocation(ref List SemLocation)
{
//获取SEM位置 a_dPositionX:X轴 a_dPositionY:Z轴 a_dPositionR:角度
double a_dPositionX = 0;
double a_dPositionY = 0;
double a_dPositionR = 0;
if (cSemfun != null)
{
if (cSemfun.GetSemPositionXY(ref a_dPositionX, ref a_dPositionY, ref a_dPositionR))
{
SemLocation.Add(a_dPositionX);
SemLocation.Add(a_dPositionY);
SemLocation.Add(a_dPositionR);
return true;
}
}
return false;
}
#endregion
}
}