|
@@ -14,6 +14,7 @@ using System.IO;
|
|
|
using SmartSEMControl;
|
|
|
using MeasureData;
|
|
|
using FileManager;
|
|
|
+using WebManager;
|
|
|
|
|
|
using OpenCvSharp;
|
|
|
|
|
@@ -360,6 +361,51 @@ namespace MeasureThread
|
|
|
|
|
|
public class Measure
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// 图像拉直算法
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Slope">倾斜角度</param>
|
|
|
+ /// <param name="x0">圆心坐标x</param>
|
|
|
+ /// <param name="y0">圆心坐标y</param>
|
|
|
+ /// <param name="x1">倾斜情况下帧图的坐标x</param>
|
|
|
+ /// <param name="y1">倾斜情况下帧图的坐标y</param>
|
|
|
+ /// <param name="Hx">复位到原位置需要移动的x值(返回值)</param>
|
|
|
+ /// <param name="Hy">复位到原位置需要移动的y值(返回值)</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool Straightening(double Slope, int x0, int y0, int x1, int y1, ref int Hx, ref int Hy)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ double xr = x1 - x0;//倾斜图到中心的距离差x
|
|
|
+ double yr = y1 - y0;//倾斜图到中心的距离差y
|
|
|
+ double R = Math.Sqrt(xr * xr + yr * yr);//圆心到倾斜图的长度
|
|
|
+ //double D = 2 * R * Math.Sin(ScanRotation / 2);//倾斜图与矫正图底边的长度
|
|
|
+ double k = Math.Atan(y1 / x1) / Math.PI * 180;//x1,y1的直角三角形圆心角度
|
|
|
+ double k_S = k - Slope;//通过夹角差求x2,y2
|
|
|
+ int y2 = (int)Math.Round(Math.Sin(Math.PI / (180 / k_S)) * R);
|
|
|
+ int x2 = (int)Math.Round(Math.Cos(Math.PI / (180 / k_S)) * R);
|
|
|
+
|
|
|
+ if (Slope > 0 || Slope < 0)
|
|
|
+ {
|
|
|
+ Hx = x1 - x2;
|
|
|
+ Hy = y1 - y2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Hx = 0;
|
|
|
+ Hy = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public WebResult wr = null;
|
|
|
+
|
|
|
public event ThreadStatusHandler SendThreadStatus; // 声明事件
|
|
|
public event CutHolesStatusHandler SendCutHolesStatus; // 声明事件
|
|
|
|
|
@@ -435,16 +481,13 @@ namespace MeasureThread
|
|
|
}
|
|
|
|
|
|
//构造函数
|
|
|
- public Measure()
|
|
|
- {
|
|
|
- Init();
|
|
|
- }
|
|
|
-
|
|
|
- private void Init()
|
|
|
+ public Measure(String webServerIP, String webServerPort, String webServerUrl)
|
|
|
{
|
|
|
MeasParam = new MeasureParam();
|
|
|
TStatus = new ThreadStatus();
|
|
|
cutHoles = new List<MeasureData.CutHole>();
|
|
|
+ //配置远程连接
|
|
|
+ wr = new WebResult(webServerIP,webServerPort,webServerUrl);
|
|
|
}
|
|
|
|
|
|
//初始化测量业务, 读测量文件,判断是否有可测试的切孔
|
|
@@ -482,13 +525,12 @@ namespace MeasureThread
|
|
|
switch(step_code)
|
|
|
{
|
|
|
//拍照
|
|
|
- case "1-3":
|
|
|
- case "1-9":
|
|
|
+ case "1-5":
|
|
|
+ case "1-7":
|
|
|
case "1-16":
|
|
|
case "1-24":
|
|
|
//电压、放大倍数、工作距离、位置信息、图片路径
|
|
|
arg.Picture_Information.Work_Voltage = iSEM.GetSEMVoltage();
|
|
|
- arg.Picture_Information.Work_Status = "SEM";
|
|
|
arg.Picture_Information.Work_Distance = iSEM.GetWorkingDistance();
|
|
|
arg.Picture_Information.Magnification = iSEM.GetMagnification();
|
|
|
break;
|
|
@@ -509,6 +551,7 @@ namespace MeasureThread
|
|
|
}
|
|
|
SendThreadStatus(this, arg);
|
|
|
}
|
|
|
+
|
|
|
public void SendCutHoleMsg(string a_state, string a_holeName)
|
|
|
{
|
|
|
CutHolesStatusEventArgs arg = new CutHolesStatusEventArgs(a_state, a_holeName);
|
|
@@ -590,46 +633,15 @@ namespace MeasureThread
|
|
|
//设置工作文件夹
|
|
|
public bool SetWorkingFolderStr()
|
|
|
{
|
|
|
-
|
|
|
WorkingFolder = m_measureFile.FilePath;
|
|
|
-
|
|
|
return true;
|
|
|
- ////获取工作文件路径
|
|
|
- //string pathName = m_measureFile.FilePath;
|
|
|
-
|
|
|
- ////判断工作文件路径是否为空或无效
|
|
|
- //if (string.IsNullOrEmpty(pathName))
|
|
|
- //{
|
|
|
- // SendMsg("路径无效");
|
|
|
- // return false;
|
|
|
- //}
|
|
|
- ////文件未保存
|
|
|
- //else if (pathName.CompareTo(MeasureFile.UNTITLED_FILE_NAME) == 0)
|
|
|
- //{
|
|
|
- // SendMsg("工程文件未保存");
|
|
|
- // return false;
|
|
|
- //}
|
|
|
-
|
|
|
- ////获取工作文件所在文件夹
|
|
|
- //string folder = System.IO.Path.GetDirectoryName(pathName);
|
|
|
- //if (string.IsNullOrEmpty(folder))
|
|
|
- //{
|
|
|
- // SendMsg("工程文件无效");
|
|
|
- // return false;
|
|
|
- //}
|
|
|
-
|
|
|
- //WorkingFolder += @"\\";
|
|
|
-
|
|
|
- //LogManager.Init(WorkingFolder);
|
|
|
-
|
|
|
- //return false;
|
|
|
}
|
|
|
|
|
|
//插入PT针
|
|
|
public bool InsertPT()
|
|
|
{
|
|
|
string fn = m_ProgramFolder + "\\Macro\\" + MacoInsertPt;
|
|
|
- SendMsg("调用宏插入PT针宏文件" + fn);
|
|
|
+ //SendMsg("调用宏插入PT针宏文件" + fn);
|
|
|
iSEM.CMDMCFFilename(fn);
|
|
|
//延时1s??
|
|
|
Thread.Sleep(1000);
|
|
@@ -640,7 +652,7 @@ namespace MeasureThread
|
|
|
public bool RetractPT()
|
|
|
{
|
|
|
string fn = m_ProgramFolder + "\\Macro\\" + MacoRetractPt;
|
|
|
- SendMsg("调用宏撤出PT针宏文件" + fn);
|
|
|
+ //SendMsg("调用宏撤出PT针宏文件" + fn);
|
|
|
iSEM.CMDMCFFilename(fn);
|
|
|
//延时1s??
|
|
|
Thread.Sleep(1000);
|
|
@@ -652,7 +664,7 @@ namespace MeasureThread
|
|
|
{
|
|
|
//执行PT沉积的ELY文件
|
|
|
string fn = m_ProgramFolder + "\\Macro\\" + ElyDeposition;
|
|
|
- SendMsg("执行PT沉积Ely文件:" + fn);
|
|
|
+ //SendMsg("执行PT沉积Ely文件:" + fn);
|
|
|
if (!ExcuteEly(fn))
|
|
|
{
|
|
|
return false;
|
|
@@ -675,7 +687,7 @@ namespace MeasureThread
|
|
|
{
|
|
|
//执行PT沉积的ELY文件
|
|
|
string fn = m_ProgramFolder + "\\Macro\\" + ElyCrossSection;
|
|
|
- SendMsg("执行FIB切割Ely文件:" + fn);
|
|
|
+ //SendMsg("执行FIB切割Ely文件:" + fn);
|
|
|
if (!ExcuteEly(fn))
|
|
|
{
|
|
|
return false;
|
|
@@ -694,198 +706,230 @@ namespace MeasureThread
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ //执行ELY文件的步骤
|
|
|
public bool ExcuteEly(string a_filename)
|
|
|
{
|
|
|
//执行ELy文件有三个动作
|
|
|
//1. 选择ELY文件
|
|
|
- SendMsg("选择ELY文件");
|
|
|
+ //SendMsg("选择ELY文件");
|
|
|
if (!iSEM.CmdFIBLoadELY(a_filename))
|
|
|
{
|
|
|
- SendMsg("选择ELY文件失败");
|
|
|
+ //SendMsg("选择ELY文件失败");
|
|
|
return false;
|
|
|
}
|
|
|
Thread.Sleep(1000);
|
|
|
//2. 确认ELY文件
|
|
|
- SendMsg("确认ELY文件");
|
|
|
+ //SendMsg("确认ELY文件");
|
|
|
if (!iSEM.CmdFIBEXPOSUREELY())
|
|
|
{
|
|
|
- SendMsg("确认ELY文件失败");
|
|
|
+ //SendMsg("确认ELY文件失败");
|
|
|
return false;
|
|
|
}
|
|
|
Thread.Sleep(1000);
|
|
|
//3. 执行ELY文件
|
|
|
- SendMsg("执行ELY文件");
|
|
|
+ //SendMsg("执行ELY文件");
|
|
|
if (!iSEM.CmdFIBSTARTELY())
|
|
|
{
|
|
|
- SendMsg("执行ELY文件失败");
|
|
|
+ //SendMsg("执行ELY文件失败");
|
|
|
return false;
|
|
|
}
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
/// <summary>
|
|
|
- ///13. 自动 定位功能
|
|
|
+ ///13. 自动 定位功能,沉积
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- public bool GetPoistion()
|
|
|
+ public bool GetPoistion(Boolean isFirst)
|
|
|
{
|
|
|
+ float x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
|
|
|
+ int state = 0;
|
|
|
//SendMsg("自动定位");
|
|
|
//13.自动定位切割
|
|
|
{
|
|
|
//1.控制SEM放大600X
|
|
|
- if (!iSEM.SetMagnification(600))
|
|
|
+ arg.State = "SEM";
|
|
|
+ if (!iSEM.SetMagnification(m_measureFile.MParam.Photograph_Magnification))
|
|
|
{
|
|
|
+ arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍失败";
|
|
|
+ SendMsg("1-2");
|
|
|
return false;
|
|
|
}
|
|
|
- arg.Message = "放大600倍";
|
|
|
- SendMsg("1-1");
|
|
|
+ arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍成功";
|
|
|
+ SendMsg("1-2");
|
|
|
|
|
|
//2.控制SEM自动对焦、亮度、对比度
|
|
|
- // if (!MeasParam.FocusMode)
|
|
|
+ if (m_measureFile.MParam.FocusMode==1)//手动
|
|
|
{
|
|
|
if (DialogResult.Yes == MessageBox.Show("图像自动对焦已完成?", "确认消息", MessageBoxButtons.YesNo))
|
|
|
{
|
|
|
arg.Message = "自动对焦完成";
|
|
|
- SendMsg("1-2");
|
|
|
+ SendMsg("1-3");
|
|
|
//return true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
arg.Message = "自动对焦失败";
|
|
|
- SendMsg("1-2");
|
|
|
+ SendMsg("1-3");
|
|
|
return false;
|
|
|
}
|
|
|
- //弹出手动对焦的窗口
|
|
|
}
|
|
|
- //else
|
|
|
- //{
|
|
|
- // //调用自动对焦模块
|
|
|
- //}
|
|
|
-
|
|
|
- //3.设置SEM进行角度补偿54度
|
|
|
- //if (!TiltCorrection(54))
|
|
|
- //{
|
|
|
- // SendMsg("设置SEM进行角度补偿54度");
|
|
|
- // return false;
|
|
|
- //}
|
|
|
- //arg.Message = "设置校正54度";
|
|
|
- //SendMsg("1-15");
|
|
|
- //Thread.Sleep(5000);
|
|
|
-
|
|
|
- //4.控制SEM拍照
|
|
|
-
|
|
|
- //5.保存照片
|
|
|
+ else if (m_measureFile.MParam.FocusMode == 2)//自有自动
|
|
|
{
|
|
|
- //1. 创建目录,已经完成
|
|
|
- //2. 设置图片名称
|
|
|
- //3. 保存图片1
|
|
|
- WorkingFolder = m_measureFile.FilePath;
|
|
|
- String fileName1 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName1;
|
|
|
- arg.Picture_Information.Picture_FullPath = fileName1;
|
|
|
- if (!GetImage(ImageMode.SEM, fileName1))
|
|
|
- {
|
|
|
- SendMsg("SEM拍照失败");
|
|
|
- return false;
|
|
|
- }
|
|
|
- arg.Message = "SEM拍照";
|
|
|
- SendMsg("1-3");
|
|
|
- Thread.Sleep(3000);
|
|
|
+ //郝工增加自动对焦算法
|
|
|
}
|
|
|
-
|
|
|
- //6.设置FIB拍照参数——扫描时间、束流等
|
|
|
- //7.控制FIB自动亮度、对比度
|
|
|
- SendMsg("切换FIB控制");
|
|
|
- if (!iSEM.CmdFIBModeFIB())
|
|
|
+ else //客户自动
|
|
|
{
|
|
|
- SendMsg("FIB模式切换失败");
|
|
|
- return false;
|
|
|
+ //后期和客户对接接口
|
|
|
+ List<string> filenames = new List<string>();
|
|
|
+ String retfilename = wr.Img_Auto_Focus(filenames);
|
|
|
}
|
|
|
|
|
|
- Thread.Sleep(10000);
|
|
|
-
|
|
|
- //8.控制FIB拍照
|
|
|
- //9.保存照片
|
|
|
- SendMsg("FIB拍照");
|
|
|
+ //3.第一次不需要进行角度补偿,其他需要设置SEM进行角度补偿54度
|
|
|
+ if (!isFirst)
|
|
|
{
|
|
|
- //1. 设置图片名称
|
|
|
- //2. 保存图片2
|
|
|
- String fileName2 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName2;
|
|
|
- if (!GetImage(ImageMode.FIB, fileName2))
|
|
|
+ if (!TiltCorrection(m_measureFile.MParam.Correction_Angle))
|
|
|
{
|
|
|
- SendMsg("FIB拍照失败");
|
|
|
+ arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度失败";
|
|
|
+ SendMsg("1-4");
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- Thread.Sleep(3000);
|
|
|
+ arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度成功";
|
|
|
+ SendMsg("1-4");
|
|
|
+ Thread.Sleep(5000);
|
|
|
}
|
|
|
|
|
|
- //10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
|
|
|
- SendMsg("调用识别位置");
|
|
|
-
|
|
|
- if (DialogResult.Yes == MessageBox.Show("移动已完成?", "确认消息", MessageBoxButtons.YesNo))
|
|
|
- {
|
|
|
- SendMsg("移动已完成");
|
|
|
- //return true;
|
|
|
- }
|
|
|
- else
|
|
|
+ //4.控制SEM拍照,5保存照片
|
|
|
+ String fileName1 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName1;
|
|
|
+ arg.Picture_Information.Picture_FullPath = fileName1;
|
|
|
+ arg.Picture_Information.Work_Status = "SEM";
|
|
|
+ if (!GetImage(ImageMode.SEM, fileName1))
|
|
|
{
|
|
|
- SendMsg("移动已失败");
|
|
|
+ arg.Message = "SEM拍照失败";
|
|
|
+ SendMsg("1-5");
|
|
|
return false;
|
|
|
}
|
|
|
+ arg.Message = "SEM拍照成功";
|
|
|
+ SendMsg("1-5");
|
|
|
+ Thread.Sleep(3000);
|
|
|
|
|
|
-
|
|
|
- SendMsg("进行PT沉积");
|
|
|
- //11.自动工具样品类型参数确定是否需要PT沉积
|
|
|
+ //判断是否为仅拍照,不是则执行FIB操作
|
|
|
+ if (!m_MsParam.Is_Photograph)
|
|
|
{
|
|
|
- //1. 根据客户PT沉积坐标控制FIB调整到中心位置
|
|
|
- //2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
|
|
|
- //3. 根据坐标进行PT沉积
|
|
|
- if (!PTWork())
|
|
|
+ //6.设置FIB拍照参数——扫描时间、束流等
|
|
|
+ //7.控制FIB自动亮度、对比度
|
|
|
+ if (!iSEM.CmdFIBModeFIB())
|
|
|
{
|
|
|
- SendMsg("PT沉积失败");
|
|
|
+ arg.Message = "FIB模式切换失败";
|
|
|
+ SendMsg("1-6");
|
|
|
return false;
|
|
|
}
|
|
|
+ arg.Message = "FIB模式切换成功";
|
|
|
+ SendMsg("1-6");
|
|
|
+ Thread.Sleep(10000);
|
|
|
|
|
|
+ //8.控制FIB拍照
|
|
|
+ //9.保存照片
|
|
|
+ String fileName2 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName2;
|
|
|
+ arg.Picture_Information.Picture_FullPath = fileName1;
|
|
|
+ arg.Picture_Information.Work_Status = "FIB";
|
|
|
+ if (!GetImage(ImageMode.FIB, fileName2))
|
|
|
+ {
|
|
|
+ arg.Message = "FIB拍照失败";
|
|
|
+ SendMsg("1-7");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "FIB拍照成功";
|
|
|
+ SendMsg("1-7");
|
|
|
+ Thread.Sleep(3000);
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
+ //这里需要确认是否对FIB的参数进行设置:电压和放大倍数等
|
|
|
|
|
|
- return true;
|
|
|
- //模拟为客户返回的坐标值
|
|
|
- float x0 = 0, y0 = 0;
|
|
|
- SendMsg("移动到新(" + x0.ToString() + "," + y0.ToString() + ")位置失败");
|
|
|
+ //10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
|
|
|
+ if (DialogResult.Yes == MessageBox.Show("是否手动移动样品台到指定位置?\n如果点击取消则会调用Web接口。", "确认消息", MessageBoxButtons.YesNo))
|
|
|
+ {
|
|
|
+ arg.Message = "样品台移动到指定位置";
|
|
|
+ SendMsg("1-8");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ wr.Img_Cut_Position(fileName2, m_MsParam.SampleName, m_MsParam.Firm, out x1, out y1, out x2, out y2, out state);
|
|
|
+ if (state == 1)
|
|
|
+ {
|
|
|
+ //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
|
|
|
+ if (!iSEM.MoveStageXY(x1, y1))
|
|
|
+ {
|
|
|
+ arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
|
|
|
+ SendMsg("1-8");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //判断是否移动完成
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ Thread.Sleep(5000);
|
|
|
+ if (iSEM.GetStageIs() == 0)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
|
|
|
+ SendMsg("1-8");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ arg.Message = "样品台移动失败";
|
|
|
+ SendMsg("1-8");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- //12.根据梯形坐标控制FIB调整到中心位置
|
|
|
- if (!iSEM.MoveStageXY(x0, y0))
|
|
|
- {
|
|
|
- SendMsg("移动到新(" + x0.ToString() + "," + y0.ToString() + ")位置失败");
|
|
|
- return false;
|
|
|
+ //11.自动工具样品类型参数确定是否需要PT沉积
|
|
|
+ if (m_MsParam.PT)
|
|
|
+ {
|
|
|
+ //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
|
|
|
+ //第10步已经移动好位置
|
|
|
+ //2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
|
|
|
+ x0 = iSEM.GetStageAtX();
|
|
|
+ y0 = iSEM.GetStageAtY();
|
|
|
+ if (Math.Abs(x0 - x1) > fMin && Math.Abs(y0 - y1) > fMin)
|
|
|
+ {
|
|
|
+ arg.Message = "目标位置(" + x0.ToString() + "," + y0.ToString() + ")移动失败";
|
|
|
+ SendMsg("1-9");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "目标位置(" + x0.ToString() + "," + y0.ToString() + ")移动成功";
|
|
|
+ SendMsg("1-9");
|
|
|
+ //3. 根据坐标进行PT沉积
|
|
|
+ if (!PTWork())
|
|
|
+ {
|
|
|
+ arg.Message = "PT沉积失败";
|
|
|
+ SendMsg("1-10");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "PT沉积成功";
|
|
|
+ SendMsg("1-10");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- //电镜移动是有一个延时的操作的?
|
|
|
-
|
|
|
+ //12.根据梯形坐标控制FIB调整到中心位置
|
|
|
//13.验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确
|
|
|
- float x1 = iSEM.GetStageAtX();
|
|
|
- float y1 = iSEM.GetStageAtY();
|
|
|
- if (Math.Abs(x0 - x1) > fMin && Math.Abs(y0 - y1) > fMin)
|
|
|
- {
|
|
|
- SendMsg("目标位置(" + x0.ToString() + "," + y0.ToString() + ")移动失败");
|
|
|
- return false;
|
|
|
- }
|
|
|
+ //以上两步已经将程序移动到11内部去做
|
|
|
|
|
|
//14.保存样品1第1号孔中心位置6轴坐标1 XYZMRT到数据库,保存客户返回值信息到数据库
|
|
|
float[] firstPosition = iSEM.GetStagePosition();
|
|
|
//这里要调用文件保存功能
|
|
|
- SendMsg("坐标1(" + firstPosition[0].ToString() + ","
|
|
|
+ arg.Message = "坐标1(" + firstPosition[0].ToString() + ","
|
|
|
+ firstPosition[1].ToString() + ","
|
|
|
+ firstPosition[2].ToString() + ","
|
|
|
+ firstPosition[3].ToString() + ","
|
|
|
+ firstPosition[4].ToString() + ","
|
|
|
- + firstPosition[5].ToString() + ")");
|
|
|
+ + firstPosition[5].ToString() + ")";
|
|
|
+ SendMsg("1-11");
|
|
|
}
|
|
|
|
|
|
- return false;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -895,38 +939,39 @@ namespace MeasureThread
|
|
|
public bool FIBCross()
|
|
|
{
|
|
|
//14.自动控制FIB切割
|
|
|
+ //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
|
|
|
+ //2.控制FIB进行切割
|
|
|
+ //以上1、2步全部用ELY文件代替
|
|
|
+ if (!FIBWork())
|
|
|
{
|
|
|
- //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
|
|
|
- //2.控制FIB进行切割
|
|
|
- SendMsg("FIB切割");
|
|
|
- if (!FIBWork())
|
|
|
- {
|
|
|
- SendMsg("FIB切割失败");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- Thread.Sleep(5000);
|
|
|
+ arg.Message = "FIB切割失败";
|
|
|
+ SendMsg("1-12");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "FIB切割成功";
|
|
|
+ SendMsg("1-12");
|
|
|
+
|
|
|
+ Thread.Sleep(5000);
|
|
|
|
|
|
- //3.控制FIB拍照600X
|
|
|
- //4.保存图片
|
|
|
- {
|
|
|
- //1.设置图片名称
|
|
|
- //2.保存图片3
|
|
|
- WorkingFolder = m_measureFile.FilePath;
|
|
|
- String fileName3 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName3;
|
|
|
- SendMsg("SEM拍照存储到" + fileName3);
|
|
|
- if (!GetImage(ImageMode.FIB, fileName3))
|
|
|
- {
|
|
|
- SendMsg("FIB拍照失败");
|
|
|
- return false;
|
|
|
- }
|
|
|
+ //3.控制FIB拍照600X
|
|
|
+ //这里如何控制
|
|
|
+ //4.保存图片
|
|
|
+ String fileName3 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName3;
|
|
|
+ arg.Picture_Information.Picture_FullPath = fileName3;
|
|
|
+ arg.Picture_Information.Work_Status = "FIB";
|
|
|
+ if (!GetImage(ImageMode.FIB, fileName3))
|
|
|
+ {
|
|
|
+ arg.Message = "FIB拍照失败";
|
|
|
+ SendMsg("1-14");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "FIB拍照成功";
|
|
|
+ SendMsg("1-14");
|
|
|
|
|
|
- Thread.Sleep(3000);
|
|
|
- }
|
|
|
- //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
|
|
|
+ Thread.Sleep(3000);
|
|
|
+ //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
|
|
|
|
|
|
- //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
|
|
|
- }
|
|
|
+ //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -936,59 +981,252 @@ namespace MeasureThread
|
|
|
/// <returns></returns>
|
|
|
public bool FindCross()
|
|
|
{
|
|
|
- //16.自动调整SEM找到切割位置
|
|
|
+ float x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
|
|
|
+ float angle = 0;
|
|
|
+ int direction = 0;
|
|
|
+ int state = 0;
|
|
|
+ //1.控制SEM放大到300倍
|
|
|
+ arg.State = "SEM";
|
|
|
+ if (!iSEM.SetMagnification(m_measureFile.MParam.Photograph_Magnification))
|
|
|
+ {
|
|
|
+ arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍失败";
|
|
|
+ SendMsg("1-18");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍成功";
|
|
|
+ SendMsg("1-18");
|
|
|
+ //2.控制SEM自动对焦、亮度、对比度-接口
|
|
|
+ if (m_measureFile.MParam.FocusMode == 1)//手动
|
|
|
{
|
|
|
- //1.控制SEM放大到300倍
|
|
|
- if (!iSEM.SetMagnification(300))
|
|
|
+ if (DialogResult.Yes == MessageBox.Show("图像自动对焦已完成?", "确认消息", MessageBoxButtons.YesNo))
|
|
|
{
|
|
|
+ arg.Message = "自动对焦完成";
|
|
|
+ SendMsg("1-19");
|
|
|
+ //return true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ arg.Message = "自动对焦失败";
|
|
|
+ SendMsg("1-19");
|
|
|
return false;
|
|
|
}
|
|
|
- //2.控制SEM自动对焦、亮度、对比度-接口
|
|
|
- if (!MeasParam.FocusMode)
|
|
|
+ }
|
|
|
+ else if (m_measureFile.MParam.FocusMode == 2)//自有自动
|
|
|
+ {
|
|
|
+ //郝工增加自动对焦算法
|
|
|
+ }
|
|
|
+ else //客户自动
|
|
|
+ {
|
|
|
+ //后期和客户对接接口
|
|
|
+ List<string> filenames = new List<string>();
|
|
|
+ String retfilename = wr.Img_Auto_Focus(filenames);
|
|
|
+ }
|
|
|
+
|
|
|
+ Thread.Sleep(5000);
|
|
|
+
|
|
|
+ //原来这里有3是角度补偿
|
|
|
+
|
|
|
+ //3.控制SEM拍照
|
|
|
+ String fileName4 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName4;
|
|
|
+ arg.Picture_Information.Picture_FullPath = fileName4;
|
|
|
+ arg.Picture_Information.Work_Status = "SEM";
|
|
|
+ if (!GetImage(ImageMode.SEM, fileName4))
|
|
|
+ {
|
|
|
+ arg.Message = "SEM拍照失败";
|
|
|
+ SendMsg("1-20");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "SEM拍照成功";
|
|
|
+ SendMsg("1-20");
|
|
|
+
|
|
|
+ Thread.Sleep(3000);
|
|
|
+ //4.将照片传给客户,获取偏移坐标,以及偏移角度
|
|
|
+ //5.根据坐标控制SEM移动到切孔位置,居中
|
|
|
+ //这里是否用到拉直操作,我没有加
|
|
|
+ if (DialogResult.Yes == MessageBox.Show("是否手动移动样品台到指定位置?\n如果点击取消则会调用Web接口。", "确认消息", MessageBoxButtons.YesNo))
|
|
|
+ {
|
|
|
+ arg.Message = "样品台移动到指定位置";
|
|
|
+ SendMsg("1-21");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ wr.Img_Center_Position_OffsetAngle_Direction(fileName4, m_MsParam.SampleName, m_MsParam.Firm, out x1, out y1, out angle, out direction, out state);
|
|
|
+ if (state == 1)
|
|
|
{
|
|
|
- //弹出手动对焦的窗口
|
|
|
+ //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
|
|
|
+ if (!iSEM.MoveStageXY(x1, y1))
|
|
|
+ {
|
|
|
+ arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
|
|
|
+ SendMsg("1-21");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //判断是否移动完成
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ Thread.Sleep(5000);
|
|
|
+ if (iSEM.GetStageIs() == 0)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
|
|
|
+ SendMsg("1-21");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //调用自动对焦模块
|
|
|
+ arg.Message = "样品台移动失败";
|
|
|
+ SendMsg("1-21");
|
|
|
+ return false;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- Thread.Sleep(5000);
|
|
|
+ if (!iSEM.SetScanRotation(angle))
|
|
|
+ {
|
|
|
+ arg.Message = "调整角度失败";
|
|
|
+ SendMsg("1-22");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "调整角度成功";
|
|
|
+ SendMsg("1-22");
|
|
|
|
|
|
- //3.控制SEM拍照
|
|
|
- String fileName4 = WorkingFolder + ImageName4;
|
|
|
- if (!GetImage(ImageMode.SEM, fileName4))
|
|
|
+
|
|
|
+ ////6.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
|
|
|
+ //float x5 = iSEM.GetStageAtX();
|
|
|
+ //float y5 = iSEM.GetStageAtY();
|
|
|
+ //if (Math.Abs(x5 - x4) > fMin && Math.Abs(y5 - y4) > fMin)
|
|
|
+ //{
|
|
|
+ // return false;
|
|
|
+ //}
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 17.自动控制SEM拍截面照
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool ShotSection()
|
|
|
+ {
|
|
|
+ float x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
|
|
|
+ int state = 0;
|
|
|
+ //切换到SEM模式
|
|
|
+ if (!iSEM.CmdFIBModeSEM())
|
|
|
+ {
|
|
|
+ //SendMsg("SEM模式切换失败");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.State = "SEM";
|
|
|
+ Thread.Sleep(10000);
|
|
|
+
|
|
|
+ //1、放大6000倍
|
|
|
+ if (!iSEM.SetMagnification(6000))
|
|
|
+ {
|
|
|
+ arg.Message = "放大倍数调整失败";
|
|
|
+ SendMsg("1-25");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "放大倍数调整成功";
|
|
|
+ SendMsg("1-25");
|
|
|
+
|
|
|
+ //2.控制SEM自动对焦、亮度、对比度-接口
|
|
|
+ if (m_measureFile.MParam.FocusMode == 1)//手动
|
|
|
+ {
|
|
|
+ if (DialogResult.Yes == MessageBox.Show("图像自动对焦已完成?", "确认消息", MessageBoxButtons.YesNo))
|
|
|
+ {
|
|
|
+ arg.Message = "自动对焦完成";
|
|
|
+ SendMsg("1-26");
|
|
|
+ //return true;
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
+ arg.Message = "自动对焦失败";
|
|
|
+ SendMsg("1-26");
|
|
|
return false;
|
|
|
}
|
|
|
+ }
|
|
|
+ else if (m_measureFile.MParam.FocusMode == 2)//自有自动
|
|
|
+ {
|
|
|
+ //郝工增加自动对焦算法
|
|
|
+ }
|
|
|
+ else //客户自动
|
|
|
+ {
|
|
|
+ //后期和客户对接接口
|
|
|
+ List<string> filenames = new List<string>();
|
|
|
+ String retfilename = wr.Img_Auto_Focus(filenames);
|
|
|
+ }
|
|
|
|
|
|
- Thread.Sleep(3000);
|
|
|
- //4.将照片传给客户,获取偏移坐标,以及偏移角度
|
|
|
- float x4 = 0, y4 = 0;
|
|
|
- float angle = 0;
|
|
|
+ //3、设置SEM补偿角度
|
|
|
+ if (!TiltCorrection(m_measureFile.MParam.Correction_Angle))
|
|
|
+ {
|
|
|
+ arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度失败";
|
|
|
+ SendMsg("1-27");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度成功";
|
|
|
+ SendMsg("1-27");
|
|
|
+ Thread.Sleep(5000);
|
|
|
|
|
|
- //5.根据坐标控制SEM移动到切孔位置,居中
|
|
|
- if (!iSEM.MoveStageXY(x4, y4))
|
|
|
+ //4、拍照,5、保存照片
|
|
|
+ String fileName5 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName5;
|
|
|
+ arg.Picture_Information.Picture_FullPath = fileName5;
|
|
|
+ arg.Picture_Information.Work_Status = "SEM";
|
|
|
+ if (!GetImage(ImageMode.SEM, fileName5))
|
|
|
+ {
|
|
|
+ arg.Message = "SEM拍照失败";
|
|
|
+ SendMsg("1-28");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "SEM拍照成功";
|
|
|
+ SendMsg("1-28");
|
|
|
+ Thread.Sleep(3000);
|
|
|
+
|
|
|
+ //6、获取偏移坐标,7、移动到位
|
|
|
+ if (DialogResult.Yes == MessageBox.Show("是否手动移动样品台到指定位置?\n如果点击取消则会调用Web接口。", "确认消息", MessageBoxButtons.YesNo))
|
|
|
+ {
|
|
|
+ arg.Message = "样品台移动到指定位置";
|
|
|
+ SendMsg("1-29");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // wr.Img_Cut_Position(fileName5, m_MsParam.SampleName, m_MsParam.Firm, out x1, out y1, out x2, out y2, out state);
|
|
|
+ if (state == 1)
|
|
|
{
|
|
|
- return false;
|
|
|
+ //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
|
|
|
+ if (!iSEM.MoveStageXY(x1, y1))
|
|
|
+ {
|
|
|
+ arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
|
|
|
+ SendMsg("1-29");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //判断是否移动完成
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ Thread.Sleep(5000);
|
|
|
+ if (iSEM.GetStageIs() == 0)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
|
|
|
+ SendMsg("1-29");
|
|
|
}
|
|
|
-
|
|
|
- if (!iSEM.SetScanRotation(angle))
|
|
|
+ else
|
|
|
{
|
|
|
+ arg.Message = "样品台移动失败";
|
|
|
+ SendMsg("1-8");
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- ////6.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
|
|
|
- //float x5 = iSEM.GetStageAtX();
|
|
|
- //float y5 = iSEM.GetStageAtY();
|
|
|
- //if (Math.Abs(x5 - x4) > fMin && Math.Abs(y5 - y4) > fMin)
|
|
|
- //{
|
|
|
- // return false;
|
|
|
- //}
|
|
|
}
|
|
|
+
|
|
|
+ //8、验证移动准确性
|
|
|
+
|
|
|
+ //9、
|
|
|
+
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
public bool CommonWork()
|
|
|
{
|
|
|
SendMsg("插入PT针");
|
|
@@ -1004,7 +1242,7 @@ namespace MeasureThread
|
|
|
|
|
|
//13. 自动 定位功能
|
|
|
SendMsg("自动定位切割位置");
|
|
|
- if (!GetPoistion())
|
|
|
+ if (!GetPoistion(false))
|
|
|
{
|
|
|
SendMsg("自动定位切割位置失败");
|
|
|
return false;
|
|
@@ -1140,103 +1378,103 @@ namespace MeasureThread
|
|
|
public bool FirstHole()
|
|
|
{
|
|
|
MeasureData.CutHole firstHole = m_cutHoles[0];
|
|
|
- SendMsg("插入PT针");
|
|
|
+
|
|
|
//12.根据样品类型参数确定是否需要PT沉积,控制PT针插入
|
|
|
- //if (firstHole.PT == true)
|
|
|
+ if (m_MsParam.Is_Photograph == false && m_MsParam.PT == true)
|
|
|
{
|
|
|
if (!InsertPT())
|
|
|
{
|
|
|
- SendMsg("插入PT针失败");
|
|
|
+ arg.Message = "插入PT针失败";
|
|
|
+ SendMsg("1-0");
|
|
|
return false;
|
|
|
}
|
|
|
+ arg.Message = "插入PT针成功";
|
|
|
+ SendMsg("1-0");
|
|
|
}
|
|
|
|
|
|
//13. 自动 定位功能
|
|
|
- SendMsg("自动定位切割位置");
|
|
|
- if (!GetPoistion())
|
|
|
+ if (!GetPoistion(true))
|
|
|
{
|
|
|
- SendMsg("自动定位切割位置失败");
|
|
|
+ arg.Message = "自动定位切割位置失败";
|
|
|
+ SendMsg("1-1");
|
|
|
return false;
|
|
|
}
|
|
|
+ arg.Message = "自动定位切割位置成功";
|
|
|
+ SendMsg("1-1");
|
|
|
|
|
|
//14.自动控制FIB切割
|
|
|
- SendMsg("FIB切割");
|
|
|
- if (!FIBCross())
|
|
|
+ if (m_MsParam.Is_Photograph == false && m_MsParam.PT == true)
|
|
|
{
|
|
|
- SendMsg("FIB切割失败");
|
|
|
- return false;
|
|
|
+ if (!FIBCross())
|
|
|
+ {
|
|
|
+ arg.Message = "FIB切割失败";
|
|
|
+ SendMsg("1-16");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "FIB切割成功";
|
|
|
+ SendMsg("1-16");
|
|
|
}
|
|
|
- //{
|
|
|
- // //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
|
|
|
- // //2.控制FIB进行切割
|
|
|
-
|
|
|
- // //3.控制FIB拍照600X
|
|
|
- // //4.保存图片
|
|
|
- // {
|
|
|
- // //1.设置图片名称
|
|
|
- // //2.保存图片3
|
|
|
- // String fileName3 = WorkingFolder + ImageName3;
|
|
|
- // if (!GetImage(ImageMode.FIB, fileName3))
|
|
|
- // {
|
|
|
- // return false;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
|
|
|
|
|
|
- // //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
|
|
|
- //}
|
|
|
//15.根据样品类型决定是否撤出PT针
|
|
|
- SendMsg("撤出PT针");
|
|
|
- //if (firstHole.PT == false)
|
|
|
- //{
|
|
|
+ if(m_MsParam.Is_Photograph == false && m_MsParam.PT == true)
|
|
|
+ {
|
|
|
if (!RetractPT())
|
|
|
{
|
|
|
- SendMsg("撤出PT针失败");
|
|
|
+ arg.Message = "撤出PT针失败";
|
|
|
+ SendMsg("1-17");
|
|
|
return false;
|
|
|
}
|
|
|
- //}
|
|
|
+ arg.Message = "撤出PT针成功";
|
|
|
+ SendMsg("1-17");
|
|
|
+ }
|
|
|
|
|
|
// 16.找到切割位置
|
|
|
- SendMsg("找到切割位置");
|
|
|
-
|
|
|
- //17.自动控制SEM拍截面照
|
|
|
- SendMsg("观测层高");
|
|
|
-
|
|
|
- SendMsg("切换SEM控制");
|
|
|
- if (!iSEM.CmdFIBModeSEM())
|
|
|
+ if(m_MsParam.Is_Photograph == false)
|
|
|
{
|
|
|
- SendMsg("SEM模式切换失败");
|
|
|
- return false;
|
|
|
+ if (!FindCross())
|
|
|
+ {
|
|
|
+ arg.Message = "找到切割位置失败";
|
|
|
+ SendMsg("1-24");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "找到切割位置成功";
|
|
|
+ SendMsg("1-24");
|
|
|
}
|
|
|
|
|
|
- Thread.Sleep(10000);
|
|
|
-
|
|
|
- SendMsg("放大6000倍");
|
|
|
- if (!iSEM.SetMagnification(6000))
|
|
|
+ //17.自动控制SEM拍截面照
|
|
|
+ if(m_MsParam.Is_Photograph == false)
|
|
|
{
|
|
|
- SendMsg("放大倍数调整失败");
|
|
|
- return false;
|
|
|
+ if (!ShotSection())
|
|
|
+ {
|
|
|
+ arg.Message = "自动控制SEM拍截面照失败";
|
|
|
+ SendMsg("1-33");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ arg.Message = "自动控制SEM拍截面照成功";
|
|
|
+ SendMsg("1-33");
|
|
|
}
|
|
|
|
|
|
- if (DialogResult.Yes == MessageBox.Show("图像拍摄已完成?", "确认消息", MessageBoxButtons.YesNo))
|
|
|
- {
|
|
|
- SendMsg("拍摄照片完成");
|
|
|
- //return true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- SendMsg("拍摄照片失败");
|
|
|
- return false;
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
- SendMsg("图像校正36度");
|
|
|
- //3.设置SEM角度补偿cos36度
|
|
|
- if (!TiltCorrection(36))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ //if (DialogResult.Yes == MessageBox.Show("图像拍摄已完成?", "确认消息", MessageBoxButtons.YesNo))
|
|
|
+ //{
|
|
|
+ // SendMsg("拍摄照片完成");
|
|
|
+ // //return true;
|
|
|
+ //}
|
|
|
+ //else
|
|
|
+ //{
|
|
|
+ // SendMsg("拍摄照片失败");
|
|
|
+ // return false;
|
|
|
+ //}
|
|
|
|
|
|
- Thread.Sleep(3000);
|
|
|
+ //SendMsg("图像校正36度");
|
|
|
+ ////3.设置SEM角度补偿cos36度
|
|
|
+ //if (!TiltCorrection(36))
|
|
|
+ //{
|
|
|
+ // return false;
|
|
|
+ //}
|
|
|
+
|
|
|
+ //Thread.Sleep(3000);
|
|
|
|
|
|
string fn;
|
|
|
//用宏抓一般图
|