using System;
using System.Collections.Generic;
using OTSCLRINTERFACE;
using System.Drawing;
using OTSDataType;
using OTSModelSharp;
using OTSModelSharp.ServiceCenter;
using OTSMeasureApp._4_OTSSamplespaceGraphicsPanel;
namespace OTSMeasureApp
{
public class SEMDATAFieldManage
{
#region 全部变量声明
//电镜设置对象
ISemController cSemfun = null;
IScanController cScanfun = null;
//IEDSController cEDSfun = null;
//主窗体对象
COTSMeasureParam m_ProjData;
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();
//}
return cSemfun.Connect();
}
catch (Exception ex)
{
log.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(ex.ToString() );
return 0;
}
}
#endregion
#region 设置放大倍数
public bool SetGMagnification(double a_dMagnification)
{
try
{
//获取放大倍数
bool result = cSemfun.SetMagnification(a_dMagnification);
return result;
}
catch (Exception ex)
{
log.Error( ex.ToString() );
return false;
}
}
#endregion
#region 设置工作距离
public bool SetSemWorkingDistance(double a_WorkingDistance)
{
try
{
bool result = cSemfun.SetWorkingDistance(a_WorkingDistance);
return result;
}
catch (Exception ex)
{
log.Error(ex.ToString() );
return false;
}
}
#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 驱动SEM到当前位置
public bool SetSEMCurrentLocation( Point mousePoint, CVisualStage stage)
{
try
{
if (!stage.IfMouseInStage(mousePoint))
{
//获取在范围中的样品
return false;
}
//判断是否鼠标在样品台范围中
Point OTSLocation = new Point();
//鼠标在样品台中移动获取坐标
OTSLocation = stage.GetMouseOTSLocation(mousePoint);
PointF SEMPoint =m_ProjData.ConvertOTSToSemCoord(OTSLocation);
bool result = cSemfun.MoveSEMToPoint(SEMPoint.X, SEMPoint.Y);
return result;
}
catch (Exception ex)
{
log.Error(ex.ToString());
return false;
}
}
#endregion
#region 驱动SEM到中心位置
public bool DriveSEMToLocation(Point mousePoint,CVisualStage stage, List m_MeasureFieldGDIObjects)
{
try
{
if (!stage.IfMouseInStage(mousePoint))
{
return false;
}
//判断是否鼠标在样品台范围中
Point OTSLocation = new Point();
//鼠标在样品台中移动获取坐标
OTSLocation = stage.GetMouseOTSLocation(mousePoint);
PointF SEMPoint = m_ProjData.ConvertOTSToSemCoord(OTSLocation);
//循环single中所有对象 进行位置匹配
for (int i = 0; i < m_MeasureFieldGDIObjects.Count; i++)
{
if (m_MeasureFieldGDIObjects[i].GetZoomedRegion.Contains(mousePoint))
{
//获取帧图左上坐标
Point LT = new Point((int)m_MeasureFieldGDIObjects[i].GetZoomedRegionF().Left, (int)m_MeasureFieldGDIObjects[i].GetZoomedRegionF().Top);
PointF lTLocation = stage.GetMouseOTSLocation(LT);
lTLocation = m_ProjData.ConvertOTSToSemCoord(lTLocation);
//获取帧图右下坐标
Point RB = new Point((int)m_MeasureFieldGDIObjects[i].GetZoomedRegionF().Right, (int)m_MeasureFieldGDIObjects[i].GetZoomedRegionF().Bottom);
PointF rbLocation = stage.GetMouseOTSLocation(RB);
rbLocation = m_ProjData.ConvertOTSToSemCoord(rbLocation);
float diffX = Math.Abs(rbLocation.X - lTLocation.X) / 2;
float diffY = Math.Abs(rbLocation.Y - lTLocation.Y) / 2;
//移动至帧图中心位置
float moveCenterX = lTLocation.X - diffX;
float moveCenterY = lTLocation.Y + diffY;
bool result = cSemfun.MoveSEMToPoint(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
}
}