using SmartSEMControl;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HOZProject
{
public partial class FormUCMain : Form
{
#region 全局变量定义
//全局只有一个fatorySEM
static FactoryHardware factorySEM = FactoryHardware.Instance;
ISEMControl iSEM = factorySEM.ISEM;
//电镜连接状态变量
bool m_SEMConnectState = false;
//自动状态变量
bool m_AutoState = false;
//电压状态变量
bool m_HTState = false;
//样品台状态变量
bool m_StageStage = false;
int m_ThreadTime = 1000;
int m_ThreadCount = 5;
string m_ImgFileSavePath = "D://tempImage.tif";
string m_ImgAutoFileSavePath = "D://tempAutoImage.tif";
short m_ImgWidth = 1024;
short m_ImgHeight = 768;
#endregion
#region 构造
public FormUCMain()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
#endregion
#region 窗体事件
private void FormUCMain_Load(object sender, EventArgs e)
{
////获取初始状态(电镜连接状态、自动函数的状态、样品台状态)
//Thread thread = new Thread(new ThreadStart(GetInitState));
//thread.Start();
}
#endregion
#region 获取初始状态
public void GetInitState()
{
if (iSEM != null)
{
//电镜连接状态
GetSEMConnectState();
//自动函数的状态
GetAutoFUNCState();
//样品台状态
GetStageState();
}
}
#endregion
#region 获取状态(电镜连接状态、自动函数的状态、样品台状态)
public bool GetSEMConnectState()
{
bool result = GetAllState(StateType.SEMConnectState);
if (result)
{
//已连接,设置按钮图像
btnConnect.BackgroundImage = Properties.Resources.CloseImg;
btnConnect.Invalidate();
}
else
{
btnConnect.BackgroundImage = Properties.Resources.ConnectImg;
btnConnect.Invalidate();
}
//设置电镜连接状态:True
m_SEMConnectState = result;
return result;
}
public bool GetAutoFUNCState()
{
bool result = GetAllState(StateType.AutoFUNCState);
m_AutoState = result;
return result;
}
public bool GetStageState()
{
bool result = GetAllState(StateType.StageState);
if (result)
{
btnConnect.BackgroundImage = Properties.Resources.CloseImg;
}
else
{
btnConnect.BackgroundImage = Properties.Resources.ConnectImg;
}
m_StageStage = result;
return result;
}
public bool GetAllState(StateType stateType)
{
//线程循环计数器
int threadCount = 0;
bool bResult = false;
float fResult = 0;
while (true)
{
if (threadCount <= m_ThreadCount)
{
switch (stateType)
{
case StateType.SEMConnectState:
bResult = iSEM.ConnectStatus();
if (bResult)
{
return bResult;
}
break;
case StateType.AutoFUNCState:
fResult = iSEM.GetAutoFunction();
if (fResult == 0)
{
bResult = true;
return bResult;
}
break;
case StateType.StageState:
fResult = iSEM.GetStageIs();
if (fResult == 0)
{
bResult = true;
return bResult;
}
break;
}
}
else
{
return false;
}
threadCount++;
Thread.Sleep(m_ThreadTime);
}
}
///
/// 状态枚举
///
public enum StateType
{
SEMConnectState = 0,
AutoFUNCState = 1,
StageState = 2
}
#endregion
#region 关闭与最小化按钮事件
private void pichide_MouseEnter(object sender, EventArgs e)
{
pichide.Image = Properties.Resources.Min_Blue;
}
private void pichide_MouseLeave(object sender, EventArgs e)
{
pichide.Image = Properties.Resources.Min_Gray;
}
private void picexit_MouseEnter(object sender, EventArgs e)
{
picexit.Image = Properties.Resources.exit_Red;
}
private void picexit_MouseLeave(object sender, EventArgs e)
{
picexit.Image = Properties.Resources.exit_Gray;
}
private void picexit_Click(object sender, EventArgs e)
{
this.Close();
}
private void pichide_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
#endregion
#region 拖动窗体
private Point mouseOff;//鼠标移动位置变量
private bool leftFlag;//标签是否为左键
private void FormUCMain_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mouseOff = new Point(-e.X, -e.Y); //得到变量的值
leftFlag = true; //点击左键按下时标注为true;
}
}
private void FormUCMain_MouseMove(object sender, MouseEventArgs e)
{
if (leftFlag)
{
Point mouseSet = Control.MousePosition;
mouseSet.Offset(mouseOff.X, mouseOff.Y); //设置移动后的位置
Location = mouseSet;
}
}
private void FormUCMain_MouseUp(object sender, MouseEventArgs e)
{
if (leftFlag)
{
leftFlag = false;//释放鼠标后标注为false;
}
}
#endregion
#region SEM功能按钮读写事件
#region 连接、关闭设备
///
/// 初始化连接设备
///
///
///
private void btnConnect_Click(object sender, EventArgs e)
{
//1.判断当前连接状态
if (m_SEMConnectState)
{
if (iSEM != null)
{
iSEM.Dispose();
}
}
}
#endregion
#region 获取与设置缩放参数
///
/// 获取缩放参数
///
///
///
private void btnenlargeGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetMagnification();
if (float.IsNaN(ret))
{
txtenlarge.Enabled = false;
btnenlargeSet.Enabled = false;
}
else
{
txtenlarge.Text = ret.ToString();
btnenlargeSet.Enabled = true;
}
}
///
/// 获取缩放参数
///
///
///
private void btnenlargeSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtenlarge.Text, out set))
{
iSEM.SetMagnification(set);
}
}
#endregion
#region 获取与设置亮度参数
private void btnBrightnessGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetBrightness();
if (float.IsNaN(ret))
{
txtBrightness.Enabled = false;
btnBrightnessSet.Enabled = false;
}
else
{
txtBrightness.Text = ret.ToString();
btnBrightnessSet.Enabled = true;
}
}
private void btnBrightnessSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtBrightness.Text, out set))
{
iSEM.SetBrightness(set);
}
}
#endregion
#region 获取与设置焦距参数
private void btnWDGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetWorkingDistance();
if (float.IsNaN(ret))
{
txtWD.Enabled = false;
btnWDSet.Enabled = false;
}
else
{
txtWD.Text = ret.ToString();
btnWDSet.Enabled = true;
}
}
private void btnWDSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtWD.Text, out set))
{
iSEM.SetWorkingDistance(set);
}
}
#endregion
#region 获取与设置对比度参数
private void btnContrastGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetContrast();
if (float.IsNaN(ret))
{
txtContrast.Enabled = false;
btnContrastSet.Enabled = false;
}
else
{
txtContrast.Text = ret.ToString();
btnContrastSet.Enabled = true;
}
}
private void btnContrastSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtContrast.Text, out set))
{
iSEM.SetContrast(set);
}
}
#endregion
#region 获取与设置倾斜矫正参数
private void btnTiltAngleGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetTiltAngle();
if (float.IsNaN(ret))
{
txtTiltAngle.Enabled = false;
btnTiltAngleSet.Enabled = false;
}
else
{
txtTiltAngle.Text = ret.ToString();
btnTiltAngleSet.Enabled = true;
}
}
private void btnTiltAngleSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtTiltAngle.Text, out set))
{
iSEM.SetTiltAngle(set);
}
}
#endregion
#region 获取与设置旋转角度参数
private void btnScanRotationGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetScanRotation();
if (float.IsNaN(ret))
{
txtScanRotation.Enabled = false;
btnScanRotationSet.Enabled = false;
}
else
{
txtScanRotation.Text = ret.ToString();
btnScanRotationSet.Enabled = true;
}
}
private void btnScanRotationSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtScanRotation.Text, out set))
{
iSEM.SetScanRotation(set);
}
}
#endregion
#region 获取与设置像散Y参数
private void btnAstigmatismXGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetAstigmatismX();
if (float.IsNaN(ret))
{
txtAstigmatismX.Enabled = false;
btnAstigmatismXSet.Enabled = false;
}
else
{
txtAstigmatismX.Text = ret.ToString();
btnAstigmatismXSet.Enabled = true;
}
}
private void btnAstigmatismXSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtAstigmatismX.Text, out set))
{
iSEM.SetAstigmatismX(set);
}
}
#endregion
#region 获取与设置像散Y参数
private void btnAstigmatismYGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetAstigmatismY();
if (float.IsNaN(ret))
{
txtAstigmatismY.Enabled = false;
btnAstigmatismYSet.Enabled = false;
}
else
{
txtAstigmatismY.Text = ret.ToString();
btnAstigmatismYSet.Enabled = true;
}
}
private void btnAstigmatismYSet_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtAstigmatismY.Text, out set))
{
iSEM.SetAstigmatismY(set);
}
}
#endregion
#region 获取像素尺寸
private void btnPixelSizeGet_Click(object sender, EventArgs e)
{
float ret = iSEM.GetPixelSize();
if (float.IsNaN(ret))
{
txtPixelSize.Text = "NaN";
}
else
{
txtPixelSize.Text = ret.ToString();
}
}
#endregion
#region 切换电压状态
private void pbHT_Click(object sender, EventArgs e)
{
bool result = true;
if (!m_HTState)
{
//打开电压
result = iSEM.CmdOpenVoltage();
if (result)
{
m_HTState = true;
pbHT.Image = Properties.Resources.OFF;
pbHT.Invalidate();
}
}
else
{
//关闭电压
result = iSEM.CmdCloseVoltage();
if (result)
{
m_HTState = false;
pbHT.Image = Properties.Resources.ON;
pbHT.Invalidate();
}
}
}
#endregion
#region 获取样品台六轴位置信息
private void btnGetStagePosition_Click(object sender, EventArgs e)
{
if (iSEM == null)
{
return;
}
try
{
float[] pt = iSEM.GetStagePosition();
if (!float.IsNaN(pt[0]))
{
txtStageX.Text = pt[0].ToString();
}
if (!float.IsNaN(pt[1]))
{
txtStageY.Text = pt[1].ToString();
}
if (!float.IsNaN(pt[2]))
{
txtStageZ.Text = pt[2].ToString();
}
if (!float.IsNaN(pt[3]))
{
txtStageT.Text = pt[3].ToString();
}
if (!float.IsNaN(pt[4]))
{
txtStageR.Text = pt[4].ToString();
}
if (!float.IsNaN(pt[5]))
{
txtStageM.Text = pt[5].ToString();
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 获取与设置样品台X轴参数
private void btnStageGetX_Click(object sender, EventArgs e)
{
float ret = iSEM.GetStageAtX();
if (float.IsNaN(ret))
{
txtStageX.Text = "NaN";
}
else
{
txtStageX.Text = ret.ToString();
}
}
private void btnStageSetX_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtStageX.Text, out set))
{
iSEM.SetStageGotoX(set);
}
}
#endregion
#region 获取与设置样品台T轴参数
private void btnStageGetT_Click(object sender, EventArgs e)
{
float ret = iSEM.GetStageAtT();
if (float.IsNaN(ret))
{
txtStageT.Text = "NaN";
}
else
{
txtStageT.Text = ret.ToString();
}
}
private void btnStageSetT_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtStageT.Text, out set))
{
iSEM.SetStageGotoT(set);
}
}
#endregion
#region 获取与设置样品台Y轴参数
private void btnStageGetY_Click(object sender, EventArgs e)
{
float ret = iSEM.GetStageAtY();
if (float.IsNaN(ret))
{
txtStageY.Text = "NaN";
}
else
{
txtStageY.Text = ret.ToString();
}
}
private void btnStageSetY_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtStageY.Text, out set))
{
iSEM.SetStageGotoY(set);
}
}
#endregion
#region 获取与设置样品台R轴参数
private void btnStageGetR_Click(object sender, EventArgs e)
{
float ret = iSEM.GetStageAtR();
if (float.IsNaN(ret))
{
txtStageR.Text = "NaN";
}
else
{
txtStageR.Text = ret.ToString();
}
}
private void btnStageSetR_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtStageR.Text, out set))
{
iSEM.SetStageGotoR(set);
}
}
#endregion
#region 获取与设置样品台Z轴参数
private void btnStageGetZ_Click(object sender, EventArgs e)
{
float ret = iSEM.GetStageAtZ();
if (float.IsNaN(ret))
{
txtStageZ.Text = "NaN";
}
else
{
txtStageZ.Text = ret.ToString();
}
}
private void btnStageSetZ_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtStageZ.Text, out set))
{
iSEM.SetStageGotoZ(set);
}
}
#endregion
#region 获取与设置样品台M轴参数
private void btnStageGetM_Click(object sender, EventArgs e)
{
float ret = iSEM.GetStageAtM();
if (float.IsNaN(ret))
{
txtStageM.Text = "NaN";
}
else
{
txtStageM.Text = ret.ToString();
}
}
private void btnStageSetM_Click(object sender, EventArgs e)
{
float set = 0;
if (float.TryParse(txtStageM.Text, out set))
{
iSEM.SetStageGotoM(set);
}
}
#endregion
#region 移动当前位置至SEM中心
private void btnMoveSEMCenter_Click(object sender, EventArgs e)
{
if (iSEM == null)
{
return;
}
//设置当前样品台状态
m_StageStage = false;
float setX = 0;
float setY = 0;
bool GotoResult = false;
//判断X、Y轴信息
if (float.TryParse(txtMoveStageX.Text, out setX) && float.TryParse(txtMoveStageY.Text, out setY))
{
GotoResult = iSEM.MoveStageXY(setX, setY);
}
}
#endregion
#region 停止
///
/// 停止
///
///
///
private void btnStop_Click(object sender, EventArgs e)
{
if (iSEM != null)
{
//停止
iSEM.CmdStageAbort();
}
}
#endregion
#endregion
#region 自动函数处理
FormShowImage fShowImage = null;
#region 获取图像
///
/// 获取图像
///
///
///
private void btnGetImage_Click(object sender, EventArgs e)
{
if (iSEM == null)
{
return;
}
fShowImage = new FormShowImage();
//获取当前图像以及当前电镜参数
//放大倍数
float f_Mag = iSEM.GetMagnification();
//焦距
float f_WD = iSEM.GetWorkingDistance();
bool imageResult = iSEM.GrabImage(m_ImgFileSavePath, 0, 0, m_ImgWidth, m_ImgHeight, 0);
if (imageResult)
{
FileStream fileStream = new FileStream(m_ImgFileSavePath, FileMode.Open, FileAccess.Read);
fShowImage.Width = fShowImage.Width / 2;
//设置当前图像与参数
fShowImage.pbImage.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
fShowImage.Mag = "放大倍数:" + f_Mag;
fShowImage.Content = "焦距:" + f_WD;
fShowImage.SetParaInfo();
fShowImage.Show();
}
}
#endregion
#region 自动对焦
private void btnAutoWD_Click(object sender, EventArgs e)
{
if (iSEM == null)
{
return;
}
fShowImage = new FormShowImage();
//获取图像尺寸
int[] imageSize = iSEM.GetImageStore();
m_ImgWidth = Convert.ToInt16(imageSize[0]);
m_ImgHeight = Convert.ToInt16(imageSize[1]);
//放大倍数
float f_Mag = iSEM.GetMagnification();
//焦距
float f_WD = iSEM.GetWorkingDistance();
//获取当前图像以及当前电镜参数
bool imageResult = iSEM.GrabImage(m_ImgFileSavePath, 0, 0, m_ImgWidth, m_ImgHeight, 0);
if (imageResult)
{
FileStream fileStream = new FileStream(m_ImgFileSavePath, FileMode.Open, FileAccess.Read);
fShowImage.pbImage.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
//设置当前图像与参数
fShowImage.Mag = "放大倍数:" + f_Mag;
fShowImage.Content = "焦距:" + f_WD;
fShowImage.SetParaInfo();
fShowImage.Show();
Boolean result = iSEM.CmdAutoFocusCoarse();
if(result)
{
Thread threadImg = new Thread(new ThreadStart(GetAutoWDImage));
threadImg.Start();
}
}
}
///
/// 获取自动状态后
///
private void GetAutoWDImage()
{
if (fShowImage != null)
{
//获取当前自动状态
bool result = GetAllState(StateType.AutoFUNCState);
if (result)
{
//放大倍数
float f_Mag = iSEM.GetMagnification();
//焦距
float f_WD = iSEM.GetWorkingDistance();
//获取自动对焦后图像以及电镜参数
bool imageResult = iSEM.GrabImage(m_ImgAutoFileSavePath, 0, 0, m_ImgWidth, m_ImgHeight, 0);
FileStream fileStream = new FileStream(m_ImgFileSavePath, FileMode.Open, FileAccess.Read);
//自动后设置图像与参数
fShowImage.pbAutoImage.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
fShowImage.AutoMag = "放大倍数:" + f_Mag;
fShowImage.AutoContent = "焦距:" + f_WD;
fShowImage.SetAutoParaInfo();
fShowImage.Invalidate();
}
}
}
#endregion
#region 自动亮度
private void btnAutoBrightness_Click(object sender, EventArgs e)
{
if (iSEM == null)
{
return;
}
fShowImage = new FormShowImage();
//获取图像尺寸
int[] imageSize = iSEM.GetImageStore();
m_ImgWidth = Convert.ToInt16(imageSize[0]);
m_ImgHeight = Convert.ToInt16(imageSize[1]);
//放大倍数
float f_Mag = iSEM.GetMagnification();
//亮度
float f_Brightness = iSEM.GetBrightness();
//对比度
float f_Contrast = iSEM.GetContrast();
//获取当前图像以及当前电镜参数
bool imageResult = iSEM.GrabImage(m_ImgFileSavePath, 0, 0, m_ImgWidth, m_ImgHeight, 0);
if (imageResult)
{
FileStream fileStream = new FileStream(m_ImgFileSavePath, FileMode.Open, FileAccess.Read);
fShowImage.pbImage.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
fShowImage.Mag = "放大倍数:" + f_Mag;
fShowImage.Content = "亮度:"+f_Brightness+"对比度:"+ f_Contrast;
fShowImage.SetParaInfo();
fShowImage.Show();
float result = iSEM.GetAutoVideo();
if (result== 0)
{
Thread threadImg = new Thread(new ThreadStart(GetAutoBrightness));
threadImg.Start();
}
}
}
///
/// 获取自动状态后
///
private void GetAutoBrightness()
{
if (fShowImage != null)
{
//获取当前自动状态
bool result = GetAllState(StateType.AutoFUNCState);
if (result)
{
//放大倍数
float f_Mag = iSEM.GetMagnification();
//亮度
float f_Brightness = iSEM.GetBrightness();
//对比度
float f_Contrast = iSEM.GetContrast();
//获取自动对焦后图像以及电镜参数
bool imageResult = iSEM.GrabImage(m_ImgAutoFileSavePath, 0, 0, m_ImgWidth, m_ImgHeight, 0);
FileStream fileStream = new FileStream(m_ImgFileSavePath, FileMode.Open, FileAccess.Read);
fShowImage.pbAutoImage.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
fShowImage.AutoMag = "放大倍数:" + f_Mag;
fShowImage.AutoContent = "亮度:" + f_Brightness + "对比度:" + f_Contrast;
fShowImage.SetAutoParaInfo();
fShowImage.Invalidate();
}
}
}
#endregion
#region 自动消像散
private void btnAutoAstigmatism_Click(object sender, EventArgs e)
{
if (iSEM == null)
{
return;
}
fShowImage = new FormShowImage();
//获取图像尺寸
int[] imageSize = iSEM.GetImageStore();
m_ImgWidth = Convert.ToInt16(imageSize[0]);
m_ImgHeight = Convert.ToInt16(imageSize[1]);
//放大倍数
float f_Mag = iSEM.GetMagnification();
//消像散X
float f_AstigmatismX = iSEM.GetAstigmatismX();
//消像散Y
float f_AstigmatismY = iSEM.GetAstigmatismY();
//获取当前图像以及当前电镜参数
bool imageResult = iSEM.GrabImage(m_ImgFileSavePath, 0, 0, m_ImgWidth, m_ImgHeight, 0);
if (imageResult)
{
FileStream fileStream = new FileStream(m_ImgFileSavePath, FileMode.Open, FileAccess.Read);
fShowImage.pbImage.Image = Image.FromStream(fileStream);
fShowImage.Mag = "放大倍数:" + f_Mag;
fShowImage.Content = "消像散X:" + f_AstigmatismX + "消像散Y:" + f_AstigmatismY;
fShowImage.SetParaInfo();
fShowImage.Show();
fileStream.Close();
fileStream.Dispose();
float result = iSEM.GetAutoVideo();
if (result == 0)
{
Thread threadImg = new Thread(new ThreadStart(GetAutoAstigmatism));
threadImg.Start();
}
}
}
///
/// 获取自动状态后
///
private void GetAutoAstigmatism()
{
if (fShowImage != null)
{
//获取当前自动状态
bool result = GetAllState(StateType.AutoFUNCState);
if (result)
{
//放大倍数
float f_Mag = iSEM.GetMagnification();
//消像散X
float f_AstigmatismX = iSEM.GetAstigmatismX();
//消像散Y
float f_AstigmatismY = iSEM.GetAstigmatismY();
//获取自动对焦后图像以及电镜参数
bool imageResult = iSEM.GrabImage(m_ImgAutoFileSavePath, 0, 0, m_ImgWidth, m_ImgHeight, 0);
FileStream fileStream = new FileStream(m_ImgFileSavePath, FileMode.Open, FileAccess.Read);
fShowImage.pbAutoImage.Image = Image.FromStream(fileStream);
fShowImage.AutoMag = "放大倍数:" + f_Mag;
fShowImage.AutoContent = "消像散X:" + f_AstigmatismX + "消像散Y:" + f_AstigmatismY;
fShowImage.SetAutoParaInfo();
fShowImage.Invalidate();
fileStream.Close();
fileStream.Dispose();
}
}
}
#endregion
#endregion
private void btnContrast_Click(object sender, EventArgs e)
{
if (iSEM == null)
{
return;
}
}
}
}