using OTSModelSharp;
using OTSDataType;
using NSOTSController;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.IO;
using OTSModelSharp.ResourceManage;
using static OTSModelSharp.ResourceManage.ResourceID;
using static OTSModelSharp.ResourceManage.ResourceData;
using static OTSDataType.otsdataconst;
using System.Windows.Forms;
namespace OTSMeasureApp
{
public enum OTS_SOFT_PACKAGE_ID
{
OTSIncA = 0, //夹杂物分析
OTSPartA = 1, //颗粒度分析
};
//文件保存返回的结果,DataMgr返回
public enum OTS_SAVE_FILE_REV
{
SaveFile_Success = 0,
SaveFile_Cancel = 1,
SaveFile_Failed = 2,
SaveFile_NoNedd = 3 //文件不需要保存
}
//设置线程状态
public enum MSR_THREAD_RunSTATUS
{
RUNMEASURE = 1, //开始测量
RUNSampleHoleImage = 2 //运行获取样品孔照片
};
enum SAMPLE_FAULT_WARN_CODE
{
INVALID = -1,
MIN = 0,
SEM_DATA_ERROR = 0,
AREA_OUTSIDE_HOLE = 1,
RESOLUTION_LOW = 2,
FINISHED = 3,
NO_ERROR_WARNING = 4,
FILE_NOT_SAVED = 5,
MAX = 5
};
enum SAMPLE_CHECK_RESULT_TYPE
{
INVALID = -1,
MIN = 0,
SWITCH_ON = 0,
FINISHED = 1,
SETTING_ERROR = 2,
SETTING_WARNING = 3,
MEASURABLE = 4,
NO_ERROR_WARNING = 5,
MAX = 5
};
public class COTSMeasureParam
{
OTSIncAMeasureAppForm m_MeasureAppFrom = null;
///
/// 创建
public COTSMsrPrjResultData m_ResultData;
//参数文件
public COTSDefaultParam m_DefaultParam = null;
//样品台文件(读取样品台数据等)
public CStageParam m_StageParam = null;
//测量样品链表
List m_MeasureSampleList = new List();
NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
public COTSMeasureParam(OTSIncAMeasureAppForm MeasureApp)
{
m_MeasureAppFrom = MeasureApp;
m_ResultData = new COTSMsrPrjResultData();
}
//检查参数文件是否存在
public bool LoadParamFile()
{
//加载样品参数文件: \Config\SysData\OTSProgMgrParam.pmf
m_DefaultParam = new COTSDefaultParam();
m_DefaultParam.LoadInfoFromProgMgrFile();
if (null == m_DefaultParam)
{
return false;
}
return true;
}
//检查参数样品台文件是否存在
public bool LoadStageParamFile()
{
m_StageParam = new CStageParam();
// 加载样品台文件; \Config\SysData\OTSStage.stg
if (!m_StageParam.Load(true, false))
{
return false;
}
return true;
}
//获取系统文件是否存在和有效
public bool InitResultData(bool bNewFileFlag = true)
{
//打开文件,则文件中保存有样品台信息,不需要使用系统样品名信息
if (bNewFileFlag)
{
//设置样品台参数
CStage Stage = m_StageParam.GetWorkingStage();
if (null == Stage)
{
return false;
}
m_ResultData.SetStage(Stage);
// 设置 SEM stage data
CSEMStageData SEMData = m_DefaultParam.GetStageDataParam();
if (null == SEMData)
{
return false;
}
m_ResultData.SetSEMStageData(SEMData);
}
//设置 general parameter
COTSGeneralParam GenParam = m_DefaultParam.GetGenParam();
if (null == GenParam)
{
return false;
}
m_ResultData.SetGenParam(GenParam);
if (m_ResultData.GetPathName()=="")
{
m_ResultData.SetPathName("Untitled");
}
m_ResultData.m_nPackId = m_DefaultParam.m_nPackId;
return true;
}
//新建样品工作文件 0:报错 1:正常 2:取消
public int CreateNewFile()
{
if (m_ResultData.IsModified()) // 文件被修改
{
int iRev = m_MeasureAppFrom.ShowSaveInfoMsgBox();
if ((int)MessageBoxRev.DIALOG_YES == iRev)
{
if (!m_ResultData.Save())
{
return 0;
}
}
else if((int)MessageBoxRev.DIALOG_CANCEL == iRev)
{
return 2;
}
}
//新建新的工作文件
//重新生成一个工作文件对象
COTSMsrPrjResultData ProjDataMgr = new COTSMsrPrjResultData();
m_ResultData.SetPathName("Untitled");
m_ResultData = ProjDataMgr;
this.LoadStageParamFile();
if (!this.InitResultData())
{
return 0;
}
return 1;
}
//将样品台坐标转换为Sem 坐标
public Point ChangeOTSToSemCoord(Point POTSCoord)
{
System.Drawing.Point VSemCoord = new System.Drawing.Point();
m_DefaultParam.GetStageDataParam().ConverOTSToSEMPoint(POTSCoord, ref VSemCoord);
return (Point)VSemCoord;
}
//将Sem 坐标转换为样品台坐标
public Point ConverSEMToOTSPoint(Point PSEMCoord)
{
System.Drawing.Point VOTSCoord = new System.Drawing.Point();
m_DefaultParam.GetStageDataParam().ConverSEMToOTSPoint(PSEMCoord, ref VOTSCoord);
return (Point)VOTSCoord;
}
//添加样品
//string sSHoleName: 样品孔名,当在样品孔上点击右键添加样品时,sSHoleName=样品孔名。当MEASUREAPP和TREEVIEW添加样品时,sSHoleName=""
//返回新的工作样品名称
public OTSSamplePropertyInfo AddNewSampleMeasure(string a_strHoleName = "")
{
COTSSample NewSample = new COTSSample();
SetSampleDefaultPara(ref NewSample, a_strHoleName);
//NewSample.
//添加样品
m_ResultData.AddSample(NewSample);
// 获取样品的属性值
OTSSamplePropertyInfo MeasureInfo = new OTSSamplePropertyInfo();
if (!GetWorkSamplePerameter(NewSample, ref MeasureInfo))
{
return null;
}
return MeasureInfo;
}
protected COTSSample SetSampleDefaultPara(ref COTSSample pSample, String a_strHoleName)
{
// get new sample name
String strNewSampleName = GetNewSampleName();
// make sure the new sample name is not an empty string
strNewSampleName.Trim();
// get a suitable sample hole for the new sample
CHole pHole = SelectASmpleHole(a_strHoleName);
// check the sample hole
if (pHole == null)
{
// failed to get sample hole for the new sample
return null;
}
// measurement area
CDomain pMsrArea = CalculateDefaultArea(pHole);
// measure data parameters containing particle analysis std, image scan parameter, image process parameter and x-ray parameter
CSampleParam poMsrParams = new CSampleParam();
poMsrParams.m_nPackId = m_DefaultParam.m_nPackId;
poMsrParams.m_runmode = m_DefaultParam.m_runmode;
var m_pParam = m_DefaultParam.GetGenParam();
MEMBRANE_TYPE a_nVal = (MEMBRANE_TYPE)m_pParam.GetMembraneType();
poMsrParams.SetImageScanParam(m_DefaultParam.GetImageScanParam ());
poMsrParams.SetImageProcessParam(m_DefaultParam.GetImageProcParam());
poMsrParams.SetXRayParam(m_DefaultParam.GetXRayParam());
String sSTDName = m_pParam.GetSTDSelect();
poMsrParams.SetSTDName(sSTDName);
poMsrParams.SetSteelTechnology((STEEL_TECHNOLOGY)m_pParam.GetSteelTechnology());
// set sample parameters
pSample.SetName(strNewSampleName);
pSample.SetSampleHoleName(pHole.GetName());
pSample.SetSwitch(m_pParam.GetMeasurementSwitch());
pSample.SetSysSTDSwitch(m_pParam.GetSysSTD());
pSample.SetMsrArea(pMsrArea);
pSample.SetMembraneType(a_nVal);
pSample.SetMsrParams(poMsrParams);
CSEMDataMsr semData = new CSEMDataMsr();
var m_pSEMStageData = m_DefaultParam.GetStageDataParam();
semData.SetScanFieldSize100(m_pSEMStageData.GetScanFieldSize100());
pSample.SetSEMDataMsr(semData);
return pSample;
}
public String GetNewSampleName()
{
// new sample name
String strNewSmplName = "";
// safety check
var m_pParam = m_DefaultParam.GetGenParam();
if (m_pParam == null)
{
// shouldn't happen, invalid general parameter pointer.
return strNewSmplName;
}
// new sample name base
String strNewSmplNameBase = m_pParam.GetSampleName() + @"{0}";
int nIndex = 1;
do
{
// new sample name is new sample name base + number string
strNewSmplName = string.Format(strNewSmplNameBase, nIndex);
++nIndex;
}
// make sure that the new sample name is not same with any sample in the samples list
while (SameNameInList(strNewSmplName));
// new sample name
return strNewSmplName;
}
public bool SameNameInList(String a_strSampleName, int a_nExclude = -1)
{
// make sure the input sample name is not empty
a_strSampleName.Trim();
if (a_strSampleName == "")
{
// shouldn't happen, input name is an empty string
return false;
}
// go through sample list
int nIndex = 0;
var m_listSamples = m_ResultData.GetSampleList();
foreach (var pSample in m_listSamples)
{
// return TRUE if this is not an exclude sample and its name is same with input
String strSampleName = pSample.GetName();
if (nIndex != a_nExclude && strSampleName.CompareTo(a_strSampleName) == 0)
{
// find a same name sample
return true;
}
++nIndex;
}
// no, same name sample in the same list, return FALSE
return false;
}
// select a suitable sample hole for a new sample
public CHole SelectASmpleHole(String a_strHoleName /*= _T("")*/)
{
// get holes list of the stage
var m_pStage = m_StageParam.GetWorkingStage();
List listHoles = m_pStage.GetHoleList();
//返回样品孔对象
CHole cReHole = new CHole();
// make sure the holes list is not empty
if (listHoles.Count == 0)
{
// shouldn't happen, stage have no hole.
return null;
}
// check the input hole name
a_strHoleName.Trim();
if (a_strHoleName != "")
{
// try to find matched hole
bool IsChanged = false;
int holeIndex = -1;
for (int itr = 0; itr < listHoles.Count; itr++)
{
if (listHoles[itr].GetName() == a_strHoleName)
{
cReHole = listHoles[itr];
//listHoles.RemoveAt(itr);
IsChanged = true;
holeIndex = itr;
break;
}
}
if (IsChanged)
{
return cReHole;
}
}
// can't find a matched hole, then pick the first empty hole
//没有按照孔进行添加,则与样品列表进行判断
// go through the holes list
foreach (var pHole in listHoles)
{
// has this hole any sample in it?
String strHoleName = pHole.GetName();
bool IsChanged = false;
var m_listSamples = m_ResultData.GetSampleList();
foreach (COTSSample sampleItem in m_listSamples)
{
if (strHoleName == sampleItem.GetSampleHoleName())
{
//listHoles.RemoveAt(itr);
IsChanged = true;
}
}
if (!IsChanged)
{
return pHole;
}
}
// no empty hole, then the first hole will be the one
return listHoles[0];
}
public CDomain CalculateDefaultArea(CHole a_pHole)
{
Rectangle rectHole = a_pHole.GetDomainRect();
System.Drawing.Point ptCenter = new System.Drawing.Point((rectHole.Left + rectHole.Right) / 2, (rectHole.Top + rectHole.Bottom) / 2);
var m_pParam = m_DefaultParam.GetGenParam();
DOMAIN_SHAPE nShape = m_pParam.GetShape();
double dArea = m_pParam.GetArea() * 1000000;
System.Drawing.Point ptLeftTop = new System.Drawing.Point();
System.Drawing.Size ptSize = new System.Drawing.Size();
int nEdge = 0;
int nRadius = 0;
switch ((int)nShape)
{
case (int)DOMAIN_SHAPE.RECTANGLE:
nEdge = (int)Math.Sqrt(dArea) / 2;
ptLeftTop.X = ptCenter.X - nEdge;
ptLeftTop.Y = ptCenter.Y - nEdge;
ptSize.Width = ptCenter.X + nEdge - ptLeftTop.X;
ptSize.Height = ptCenter.Y + nEdge - ptLeftTop.Y;
break;
case (int)DOMAIN_SHAPE.ROUND:
nRadius = (int)Math.Sqrt(dArea / 3.1415926);
ptLeftTop.X = ptCenter.X - nRadius;
ptLeftTop.Y = ptCenter.Y - nRadius;
ptSize.Width = ptCenter.X + nRadius - ptLeftTop.X;
ptSize.Height = ptCenter.Y + nRadius - ptLeftTop.Y;
break;
}
Rectangle MsrRect = new Rectangle(ptLeftTop, ptSize);
CDomain pMsrArea = new CDomain(nShape, MsrRect);
// return measurement area
return pMsrArea;
}
//设置工作样品的属性值
public bool SetSampleParamVal(OTS_SAMPLE_PROP_GRID_ITEMS ItemId, OTS_ITEM_TYPES ValType, object objVal)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
bool bSetFalg = false;
//判断样品名是否有效
if (ItemId == OTS_SAMPLE_PROP_GRID_ITEMS.SAMPLE_NAME)
{
if (!m_ResultData.IsValidSampleName((string)objVal))
{
bSetFalg = false;
return false;
}
}
bSetFalg = WSample.SetParamVal(ItemId, ValType, objVal);
if (bSetFalg)
{
m_ResultData.SetModify(true);
}
return bSetFalg;
}
//获取工作样品名称
public string GetWorkSampleName()
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return "";
}
string sWorkSampleName = WSample.GetName();
if ("" == sWorkSampleName)
{
return "";
}
return sWorkSampleName;
}
//设置工作样品
//string sNewWorkSampleName: 新工作样品
public bool SetWorkSample(string sNewWorkSampleName)
{
if ("" == sNewWorkSampleName)
{
return false;
}
if (!m_ResultData.SetWorkingSampleByName(sNewWorkSampleName))
{
return false;
}
return true;
}
//获取工作样品
// 返回工作样品对象
public COTSSample GetWorkSample()
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
}
return WSample;
}
//删除工作样品
//string sWorkSampleName : 删除工作样品名称
public bool DeleteWorkSample(string sWorkSampleName)
{
return m_ResultData.DeleteSampleByName(sWorkSampleName);
}
// 获取样品总数
//返回样品总数
public int GetSampleCount()
{
return m_ResultData.GetSampleList().Count();
}
//改变工作样品名称
//String sWSampleNewName
public bool ChangeWorkSampleName(String sWSampleNewName)
{
if (!m_ResultData.IsValidSampleName(sWSampleNewName))
{
return false;
}
COTSSample WorkSample = m_ResultData.GetWorkingSample();
if (null == WorkSample)
{
return false;
}
WorkSample.SetName(sWSampleNewName);
m_ResultData.SetModify(true);
return true;
}
//移动工作样品到其他样品孔,样品孔名称和测量区域都要改变,重新设置工作样品参数
//SampleMeasurePara SMeasurePara:
public SampleMeasurePara SetWorkSampleHoleNameAndMeasureArea(SampleMeasurePara SMeasurePara)
{
SampleMeasurePara SMPara = new SampleMeasurePara();
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return SMPara;
}
CDomain Domain = new CDomain();
Domain.SetShape((otsdataconst.DOMAIN_SHAPE)SMeasurePara.iShape);
Domain.SetRectDomain(SMeasurePara.MeasureRect);
if (SMeasurePara.DrawPolygonPointRegionF != null)
{
List PolygonPoint = new List();
foreach (var item in SMeasurePara.DrawPolygonPointRegionF)
{
PolygonPoint.Add(new Point((int)item.X, (int)item.Y));
}
Domain.SetPolygonPoint(PolygonPoint);
}
WSample.SetSampleHoleName(SMeasurePara.sHoleName);
WSample.SetMsrArea(Domain);
//获取样品的测量区域信息
SMPara.sSampleName = WSample.GetName(); //获取样品名称
SMPara.iShape = (int)WSample.GetMsrArea().GetShape(); // 获取测量区域形状
SMPara.sHoleName = WSample.GetSampleHoleName(); //获取样品孔名称
SMPara.MeasureRect = (Rectangle)WSample.GetMsrArea().GetRectDomain(); //样品测量区域
//改变测量区域后重新设置样品修改状态
//m_ResultData.SetModify(true);
//string pathName = m_ProjDataMgr.GetPathName();
//if (pathName != "" && pathName != "Untitled")
//{
// m_ProjDataMgr.Save();
//}
return SMPara;
}
//设置测量区域的形状 (通过RIBBON 上的画圆,画矩形 设置)
//int iShape: 测量区域形状 0: 圆形; 1 :矩形
public void SetMeasureAreaShape(int iShape)
{
// SampleMeasurePara SMPara = new SampleMeasurePara();
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return;
}
CDomain Domain = new CDomain();
Domain.SetShape((otsdataconst.DOMAIN_SHAPE)iShape);
}
//修改了ITEMID后,重新更新GROUPID和ITEMID
public void UpdateGroupValAndItemVal(OTS_SAMPLE_PROP_GRID_ITEMS ItemID)
{
OTS_SAMPLE_PROP_GRID_ITEM_GROUPS GroupID = OTS_SAMPLE_PROP_GRID_ITEM_GROUPS.INVALID;
OTS_SAMPLE_PROP_GRID_ITEMS iItemID = OTS_SAMPLE_PROP_GRID_ITEMS.INVALID;
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return;
}
if (!WSample.GetRelatedPropItemGrp((OTS_SAMPLE_PROP_GRID_ITEMS)ItemID, ref GroupID))
{
bool bFlag = WSample.GetRelatedPropItem(ItemID, ref iItemID);
}
}
//设置样品参数锁
//bool ParaLockFlag : 样品参数锁
public bool SetWorkSampleParamLock(bool ParaLockFlag)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
WSample.SetParamLock(ParaLockFlag);
m_ResultData.SetModify(true);
return true;
}
//获取工作样品锁
//ref bool ParamLockFlag : 获取的工作样品参数锁
public bool GetWSampleParaLock(ref bool ParamLockFlag)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
ParamLockFlag = WSample.GetParamLock();
return true;
}
//获取工作样品测量锁
public bool GetWSampleParaLock(ref OTSSamplePropertyInfo SMInfo)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
if (!GetWorkSamplePerameter(WSample, ref SMInfo))
{
return false;
}
return true;
}
//重新设置样品在样品列表中的位置(当拖动TREEVIEW的样品顺序后执行 )
public bool SortSamplePosition(List SNameList)
{
if (!m_ResultData.ResetSamplesListOrder(SNameList))
{
return false;
}
List SampleList = new List();
SampleList = m_ResultData.GetSampleList();
return true;
}
public bool CheckSampleParam(bool bCheckFlag)
{
m_MeasureSampleList.Clear();
List MSampleList = new List();
if (!CheckMeasureParam(m_ResultData, ref MSampleList, bCheckFlag))
{
return false;
}
if (MSampleList.Count > 0)
{
m_MeasureSampleList = MSampleList;
return true;
}
return false;
}
public bool CheckMeasureParam(COTSMsrPrjResultData a_pProjMgrFile, ref List a_listMeasuableSamples, bool a_bCheckSetting)
{
// go through the sample list to check setting parameters
int nSwitchSmplNo = 0;
int nCompletedSmplNo = 0;
int nErrorSmplNo = 0;
int nWarningSmplNo = 0;
List listSamplMessages = new List();
List listSamples = a_pProjMgrFile.GetSampleList();
List listMeasurableSamples = new List();
List listWithWarningMeasurableSamples = new List();
foreach (var pSample in listSamples)
{
// is the sample switch on
if (pSample.GetSwitch())
{
++nSwitchSmplNo;
String strSmplMessage;
strSmplMessage = pSample.GetName() + ":" + "\r\n";
// is this a measurement completed sample
if (IsMeasureCompletedSmpl(pSample))
{ // measurement completed sample
++nCompletedSmplNo;
string str2 = GetSampleErrorWarnString(SAMPLE_FAULT_WARN_CODE.FINISHED);
strSmplMessage += str2;
strSmplMessage += "\r\n";
}
else
{
// errors
List a_listErrorCodes = new List();
GetSampleErrorCodes(a_pProjMgrFile, pSample, ref a_listErrorCodes);
if (a_listErrorCodes.Count != 0)
{
// has error, this is not a measurable sample
++nErrorSmplNo;
foreach (var nErrorCode in a_listErrorCodes)
{
String str3 = GetSampleErrorWarnString(nErrorCode);
strSmplMessage += str3;
strSmplMessage += "\r\n";
}
}
else
{
// no error, this is a measurable sample
listMeasurableSamples.Add(pSample);
}
// warnings
List a_listWarningCodes = new List();
GetSampleWarningCodes(a_pProjMgrFile, pSample, ref a_listWarningCodes);
if (a_listWarningCodes.Count != 0)
{
++nWarningSmplNo;
foreach (var nWarningCode in a_listWarningCodes)
{
String str3 = GetSampleErrorWarnString(nWarningCode);
strSmplMessage += str3;
strSmplMessage += "\r\n";
}
// has no error?
if (a_listErrorCodes.Count == 0)
{
// this is a measurable sample but with setting warnings
listWithWarningMeasurableSamples.Add(pSample);
}
}
// no error and warning
if (a_listErrorCodes.Count == 0 && a_listWarningCodes.Count == 0)
{
String str3 = GetSampleErrorWarnString(SAMPLE_FAULT_WARN_CODE.NO_ERROR_WARNING);
strSmplMessage += str3;
strSmplMessage += "\r\n";
}
}
// add
listSamplMessages.Add(strSmplMessage);
}
}
// dlg message string
String strDlgMessage = "";
String str;
String str1;
str1 = GetResourceByKey(GrpOtherParam, IDS_SAMPLE_CHECK_RESULT + (int)SAMPLE_CHECK_RESULT_TYPE.SWITCH_ON);
str1 = str1.Replace("%d", "{0}");
str = string.Format(str1, nSwitchSmplNo);
strDlgMessage += str;
strDlgMessage += "\r\n";
// add more string if there switch on sample
if (nSwitchSmplNo > 0)
{
// completed sample number (optional)
if (nCompletedSmplNo > 0)
{
str1 = GetResourceByKey(GrpOtherParam, IDS_SAMPLE_CHECK_RESULT + (int)SAMPLE_CHECK_RESULT_TYPE.FINISHED);
str1 = str1.Replace("%d", "{0}");
str = string.Format(str1, nCompletedSmplNo);
strDlgMessage += str;
strDlgMessage += "\r\n";
}
// any unmeasured switch on samples?
if (nSwitchSmplNo > nCompletedSmplNo)
{
// with setting error sample number
str1 = GetResourceByKey(GrpOtherParam, IDS_SAMPLE_CHECK_RESULT + (int)SAMPLE_CHECK_RESULT_TYPE.SETTING_ERROR);
str1 = str1.Replace("%d", "{0}");
str = string.Format(str1, nErrorSmplNo);
strDlgMessage += str;
strDlgMessage += "\r\n";
// with setting warning sample number
str1 = GetResourceByKey(GrpOtherParam, IDS_SAMPLE_CHECK_RESULT + (int)SAMPLE_CHECK_RESULT_TYPE.SETTING_WARNING);
str1 = str1.Replace("%d", "{0}");
str = string.Format(str1, nWarningSmplNo);
strDlgMessage += str;
strDlgMessage += "\r\n";
}
}
// add an empty line strDlgMessage
strDlgMessage += "\r\n";
// add sample messages
foreach (var strSmplMessage in listSamplMessages)
{
strDlgMessage += strSmplMessage;
strDlgMessage += "\r\n";
}
// do we need to show dialog box?
if (nSwitchSmplNo == 0)
{
return false;
}
// measure button clicked?
if (a_bCheckSetting)
{
// there are measurable samples but no setting warnings samples
if (listMeasurableSamples.Count > 0 && listWithWarningMeasurableSamples.Count == 0)
{
// set output measurable samples list
foreach (var pSample in listMeasurableSamples)
{
a_listMeasuableSamples.Add(pSample);
}
return true;
}
}
//when there is sample setting error, and setting with no error and no warning samples, the dlg will not be show.??
//show the result dlg
DIALOG_CHECK_PARAM_RESULT dlg = new DIALOG_CHECK_PARAM_RESULT();
int nTatolMeasuableSmplNo = listMeasurableSamples.Count;
int nWithWarningMeasuableSmplNo = listWithWarningMeasurableSamples.Count;
// set the dlg parameters
dlg.SetCheckOnlyFlag(a_bCheckSetting);
dlg.SetMessageBase(strDlgMessage);
dlg.SetTatolMeasuableSmplNo(nTatolMeasuableSmplNo);
dlg.SetWithWarningMeasuableSmplNo(nWithWarningMeasuableSmplNo);
//no error not show dlg
if (nTatolMeasuableSmplNo == nSwitchSmplNo - nCompletedSmplNo && listMeasurableSamples.Count != 0)
{
foreach (var pSample in listMeasurableSamples)
{
var itr = listWithWarningMeasurableSamples.Find(s => { return s.GetName() == pSample.GetName(); });
if (itr == null)
{
a_listMeasuableSamples.Add(pSample);
}
}
if (a_listMeasuableSamples.Count == listMeasurableSamples.Count)
{
return true;
}
}
//show dlg
DialogResult dResult = dlg.ShowDialog();
if (!(dResult == System.Windows.Forms.DialogResult.OK))
{
// do something here
return false;
}
else
{
//if warnDo, back the listMeasuableSample
if (dlg.GetWarnDo())
{
foreach (var pSample in listMeasurableSamples)
{
a_listMeasuableSamples.Add(pSample);
}
}
else // back with no warn sample
{
foreach (var pSample in listMeasurableSamples)
{
var itr = listWithWarningMeasurableSamples.Find(e => { return e.GetName() == pSample.GetName(); });
if (itr == null)
{
a_listMeasuableSamples.Add(pSample);
}
}
}
}
return true;
}
bool IsMeasureCompletedSmpl(COTSSample a_pSample)
{
// safety check
if (a_pSample.GetMsrStatus().GetStatus() != OTSDataType.OTS_MSR_SAMPLE_STATUS.SUCCESSED)
{
return false;
}
return true;
}
string GetSampleErrorWarnString(SAMPLE_FAULT_WARN_CODE a_nSampleFaultWarn)
{
// check input
if (a_nSampleFaultWarn < SAMPLE_FAULT_WARN_CODE.MIN && a_nSampleFaultWarn > SAMPLE_FAULT_WARN_CODE.MAX)
{
return "";
}
// error/waring string
string strErrorWarn;
strErrorWarn = GetResourceByKey(GrpOtherParam, IDS_ERROR_WARNING + (int)a_nSampleFaultWarn);
return strErrorWarn;
}
// get error codes list of a sample
void GetSampleErrorCodes(COTSMsrPrjResultData a_pProjMgrFile, COTSSample a_pSample, ref List a_listErrorCodes)
{
const string UNTITLED_FILE_NAME = "Untitled";
// file has not been saved
String strPathName = a_pProjMgrFile.GetPathName();
// is this a file no saved?
strPathName.Trim();
if (strPathName == UNTITLED_FILE_NAME || strPathName == "")
{
a_listErrorCodes.Add(SAMPLE_FAULT_WARN_CODE.FILE_NOT_SAVED);
}
}
// get warning codes list of a sample
void GetSampleWarningCodes(COTSMsrPrjResultData a_pProjMgrFile, COTSSample a_pSample, ref List a_listWarningCodes)
{
// get the work stage
CStage pStage = a_pProjMgrFile.GetStage();
//get hole
String sHoleName = a_pSample.GetSampleHoleName();
//look for the hole Domain
CHole pSampleHole = pStage.GetHoleByName(sHoleName);
if (pSampleHole == null)
{
return;
}
if (a_pSample.GetSEMDataMsr() != null)
{
// compute pixel size
double dPixleSize = a_pSample.CalculatePixelSize();
// get min size
COTSImageProcParam pImageProcParam = a_pSample.GetMsrParams().GetImageProcessParam();
double dMinSize = pImageProcParam.GetIncAreaRange().GetStart();
// if pixel size bigger than 1/2 of the min size, current magnification can't see clear of the object
if (dPixleSize >= dMinSize * 0.5)
{
// resolution low
a_listWarningCodes.Add(SAMPLE_FAULT_WARN_CODE.RESOLUTION_LOW);
}
}
if(a_pSample.GetSEMDataMsr().GetTotalFields()==0
&& a_pSample.GetSEMDataMsr().GetScanFieldSize() == 0
&& a_pSample.GetSEMDataMsr().GetWorkingDistance() == 0)
{
// SEM_DATA_ERROR
a_listWarningCodes.Add(SAMPLE_FAULT_WARN_CODE.SEM_DATA_ERROR);
}
}
//获取测量参数文件名称
//int iNamePos: 文件名在链表中的位置
//List MParamFileNameList: 测量参数文件链表
public bool GetMeasureParamFileName(ref int iNamePos, ref List MParamFileNameList)
{
if (!m_ResultData.GetParamFileList(ref iNamePos, ref MParamFileNameList))
{
return false;
}
return true;
}
//设置测量文件名称
//int iNamePos: 文件名在链表中的位置
public bool SetMeasrueParamFileName(int iNamePos)
{
if (!m_ResultData.ChangeParamFromList(iNamePos))
{
return false;
}
return true;
}
//获取STD 标准库文件名称
//int iNamePos: 文件名在链表中的位置
//List STDFileNameList: STD文件链表
public bool GetSTDFileName(ref int iNamePos, ref List STDFileNameList)
{
if (!m_ResultData.GetSTDFileList(ref iNamePos, ref STDFileNameList))
{
return false;
}
return true;
}
//设置STD 标准库文件名称
public bool SetSTDFileName(int iNamePos)
{
if (!m_ResultData.ChangeSTDFromList(iNamePos))
{
return false;
}
return true;
}
///保存工作样品的测量参数文件
public bool SaveWorkMeasureFile()
{
CSampleParamMgr SMeasureParamData = new CSampleParamMgr();
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
if (!SMeasureParamData.SetMsrParamFile(WSample.GetMsrParams()))
{
return false;
}
// file open dialog
CSampleParamMgr cSampleParamMgr = new CSampleParamMgr();
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.FileName = WSample.GetName() +"_Config"+ cSampleParamMgr.MESUREMENT_PARAM_FILE_EXT;
saveFileDialog.Filter = cSampleParamMgr.MESUREMENT_PARAM_FILE_FILTER;
if (saveFileDialog.ShowDialog() != DialogResult.OK)
{
return false;
}
// get file pathname
string strPathName = saveFileDialog.FileName;
SMeasureParamData.Save(strPathName);
return true;
}
//打开工作样品的测量参数文件
public bool LoadWorkMeasureFile()
{
CSampleParamMgr SMeasureParamData = new CSampleParamMgr();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = SMeasureParamData.MESUREMENT_PARAM_FILE_FILTER;
if (openFileDialog.ShowDialog() != DialogResult.OK)
{
return false;
}
// get file pathname
string strPathName = openFileDialog.FileName;
if (!SMeasureParamData.Load(strPathName, true))
{
return false;
}
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
WSample.SetMsrParams(SMeasureParamData.GetMsrParams());
//更新样品GRID值测量文件名
OTSSamplePropertyInfo SMInfo = new OTSSamplePropertyInfo();
if (!this.GetWorkSamplePerameter(WSample, ref SMInfo))
{
return false;
}
m_MeasureAppFrom.m_SPropertyWindows.DisplaySampleMeasureInfo(SMInfo);
return true;
}
//判断是否允许修改样品名
public bool CheckSampleNameIsValid(string sNewName)
{
return m_ResultData.IsValidSampleName(sNewName);
}
//设置电镜参数
//int iScanFieldSize: Field扫描参数
//int iWDistance: 电镜工作距离
//double dMagni: 放大倍数
public void SetWorkingSampleSEMData(double iWDistance, double dMagni)
{
try
{
m_ResultData.GetWorkingSample().GetSEMDataMsr().SetWorkingDistance(iWDistance);
m_ResultData.GetWorkingSample().GetSEMDataMsr().SetMagnification(dMagni);
}
catch (Exception)
{
}
}
//获取电镜参数
//int iScanFieldSize: Field扫描参数
//int iWDistance: 电镜工作距离
//double dMagni: 放大倍数
public void GetWorkingSampleSEMData(ref double iWDistance, ref double dMagni)
{
iWDistance = m_ResultData.GetWorkingSample().GetSEMDataMsr().GetWorkingDistance();
dMagni = m_ResultData.GetWorkingSample().GetSEMDataMsr().GetMagnification();
}
//获取工作样品的测量区域
//int iShape :测量区域形状
//Rectangle Srect: 测量区域大小
public bool GetWSampleMrsArea(ref int iShape, ref Rectangle Srect)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
CDomain pMsrArea = new CDomain();
pMsrArea = WSample.GetMsrArea();
if (null == pMsrArea)
{
return false;
}
iShape = (int)pMsrArea.GetShape();
ValueType ValType = new Rectangle();
ValType = pMsrArea.GetRectDomain();
Srect = (Rectangle)ValType;
return true;
}
//检查Samplelist中的sample的checkbox状态
//当Samplelist中的链表有sample 的checkbox状态是选中状态,则返回TRUE. 说明可以测量
public bool GetSampleCheckBoxStatus()
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
List SampleList = new List();
SampleList = m_ResultData.GetSampleList();
int iCount = SampleList.Count();
if (0 == iCount)
{
return false;
}
for (int i = 0; i < iCount; i++)
{
if (SampleList[i].GetSwitch())
{
return true;
}
}
return false;
}
//获取BSE图像数据
public bool GetBSEImageSize(ref int iHeight, ref int iWidth)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
if (!WSample.GetBSESize(out iHeight, out iWidth))
{
return false;
}
return true;
}
//获取图像尺寸
public string GetBSEImageSize()
{
try
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return "";
}
OTSSamplePropertyInfo SMInfo = new OTSSamplePropertyInfo();
if (!GetWorkSamplePerameter(WSample, ref SMInfo))
{
return "";
}
int iCount = SMInfo.SampleDataList.Count();
for (int i = 0; i < iCount; i++)
{
if (OTS_SAMPLE_PROP_GRID_ITEMS.IMAGE_RESOLUTION == SMInfo.SampleDataList[i].iSampleId)
{
String val = (String)SMInfo.SampleDataList[i].SampleVal;
return val;
}
}
return "";
}
catch (Exception)
{
return "";
}
}
//获取放大倍数和工作距离
public bool GetMagAndDistance(ref double SemMag, ref double dDistance)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
//GetWorkingSampleSEMData(ref SemMag, ref dDistance);
GetWorkingSampleSEMData(ref dDistance, ref SemMag);
return true;
}
public bool GetWorkSamplePerameter(COTSSample Sample, ref OTSSamplePropertyInfo SMeasureInfo)
{
//设置工作样品属性项
if (Sample.GetMsrParams().m_nPackId == OTS_SysType_ID.CleanlinessA)
{
Sample.SetPropItemGrpsForCleanlinessSys();
}
else
{
Sample.SetPropItemGrpsForIncA();
}
bool MeasurementStatus = false;
//样品的标题名 (Treeview的根节点名)
SMeasureInfo.sSampleSoluName = m_ResultData.GetFileName();
// Treeview 的样品信息
SMeasureInfo.TSampleParam.sSampleTitleName = m_ResultData.GetFileName();
//获得 样品属性值
SMeasureInfo.bSwitch = Sample.GetSwitch();// (bool)jo.GetValue("bSwitch");
SMeasureInfo.TSampleParam.bParamLock = Sample.GetParamLock();// (bool)jo.GetValue("ParamLock");
//获取样品的测量区域信息
//获取样品名称
SMeasureInfo.SMeasurePara.sSampleName = Sample.GetName();// (String)SMeasurePara.GetValue("sNewSampleName");
// 获取测量区域形状
SMeasureInfo.SMeasurePara.iShape = (int)Sample.GetMsrArea().GetShape();// (int)SMeasurePara.GetValue("iShape");
//获取样品孔名称
SMeasureInfo.SMeasurePara.sHoleName = Sample.GetSampleHoleName();// (String)SMeasurePara.GetValue("sHoleName");
//样品测量区域
// JObject rec = (JObject)SMeasurePara.GetValue("MeasureRect");
Rectangle rec = Sample.GetMsrArea().GetDomainRect();
SMeasureInfo.SMeasurePara.MeasureRect = new Rectangle((int)rec.X, (int)rec.Y, (int)rec.Width, (int)rec.Height);
SMeasureInfo.TSampleParam.sWorkSampleName = Sample.GetName();// (String)TSampleParam.GetValue("sWorkSampleName");
SMeasureInfo.TSampleParam.bSwitch = Sample.GetSwitch();// (bool)TSampleParam.GetValue("bSwitch");
List ja = Sample.GetPropItemGrps();// (JArray)jo.GetValue("ItemGrp");
for (int i = 0; i < ja.Count; i++)
{
//获取GROUP ID和Grid的显示组的标题名
var grp = ja[i];
int grpId = (int)grp.GetGroupId();
String sTitle = (String)grp.GetName();
//获取样品属性ID和值
var SDataArr = grp.GetItemsList();
if (SDataArr.Count == 0)
continue;
SampleDataGroup smlgrp = new SampleDataGroup();
smlgrp.GroupId = (OTS_SAMPLE_PROP_GRID_ITEM_GROUPS)grpId;
smlgrp.sTitle = sTitle;
for (int j = 0; j < SDataArr.Count; j++)
{
var SDataObj = SDataArr[j];
SampleData SData = new SampleData();
int smplid = (int)SDataObj.GetSmplItemId();
SData.iSampleId = (OTS_SAMPLE_PROP_GRID_ITEMS)smplid;
if (SData.iSampleId == OTS_SAMPLE_PROP_GRID_ITEMS.WORKING_DISTANCE)
{
bool b = (bool)SDataObj.IsReadOnly();
}
SData.sSCaptionName = (String)SDataObj.GetName();
//------------------------------修改--------------------------
if ((String)SDataObj.GetName() == "样品名")
{
for (int a = 0; a < ja.Count; a++)
{
var grpa = ja[a];
var SDataArra = grpa.GetItemsList();
for (int b = 0; b < SDataArra.Count; b++)
{
var SDataObb = SDataArra[b];
if ((String)SDataObb.GetName() == "测量状态")
{
if ((String)Sample.GetItemValueStr((OTS_SAMPLE_PROP_GRID_ITEMS)SDataObb.GetSmplItemId()) == "未测量")
{
MeasurementStatus = false;
}
else
{
MeasurementStatus = true;
}
}
}
}
}
else
{
MeasurementStatus = false;
}
if (MeasurementStatus)
{
SData.bReadOnly = MeasurementStatus;
}
else
{
SData.bReadOnly = (bool)SDataObj.IsReadOnly();// OTS_ITEM_TYPES
}
//---------------------------------------------------------------
int type = (int)SDataObj.GetTypeId();
SData.iSampleValType = (OTS_ITEM_TYPES)type;
SData.sDescriptionInfo = (String)SDataObj.GetDescription();
OTS_SAMPLE_PROP_GRID_ITEMS ItemId = SDataObj.GetSmplItemId();
SData.SampleVal = (String)Sample.GetItemValueStr(ItemId);
List downStrList = new List();
if (type == (int)OTS_ITEM_TYPES.COMBO)
{
Sample.GetPropComboStrings(SDataObj.GetSmplItemId(), downStrList);
}
else if (type == (int)OTS_ITEM_TYPES.FILE_LIST)
{
//the sample object dosen't know anything about the fileList infomation so it has to delay this duty here.
int iPos = -1;
List sFileNameList = new List();
if (OTS_SAMPLE_PROP_GRID_ITEMS.MEASURE_PARAM_FILE_NAME == (OTS_SAMPLE_PROP_GRID_ITEMS)smplid)
{
if (!this.GetMeasureParamFileName(ref iPos, ref sFileNameList))
{
return false;
}
foreach (var f in sFileNameList)
{
downStrList.Add(f);
}
}
if (OTS_SAMPLE_PROP_GRID_ITEMS.STD_FILE_NAME == (OTS_SAMPLE_PROP_GRID_ITEMS)smplid)
{
if (!this.GetSTDFileName(ref iPos, ref sFileNameList))
{
return false;
}
foreach (var f in sFileNameList)
{
downStrList.Add(f);
}
}
}
if (downStrList.Count > 0)
{
for (int k = 0; k < downStrList.Count; k++)
{
SData.comboDownList.Add((String)downStrList[k]);
}
}
smlgrp.SampleDataList.Add(SData);
}
SMeasureInfo.AddASampleDataGrp(smlgrp);
}
return true;
}
//保存测量样品的
public bool SaveMeasureSampleInfo()
{
if (!m_ResultData.Save())
{
return false;
}
return true;
}
//获取测量Sample的开始时间
public bool GetMsrSampleStartTime(ref DateTime MsrFieldStartTime)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
MsrFieldStartTime = (DateTime)WSample.GetMsrStatus().GetStartTime();
return true;
}
//获取测量已用时间
public bool GetMsrSampleUsedTime(ref TimeSpan TUsedTime)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
TUsedTime = (TimeSpan)WSample.GetMsrStatus().GetUsedTime();
return true;
}
// 获取测量样品中之前已经测量完成Field帧图,(上一次未测量完成继续测试)
public bool GetBeforeCompleteField(ref string MsrSampleName, ref List FieldList)
{
COTSSample WSample = m_ResultData.GetWorkingSample();
if (null == WSample)
{
return false;
}
MsrSampleName = WSample.GetName();
FieldList = WSample.GetMsrStatus().GetCompletedFieldsCenter();
return true;
}
///
/// 通过样品孔信息 返回默认测量区域大小
///
///
///
public Rectangle CalculateMsrArea(string cHoleName)
{
CHole cHoleClr = null;
foreach (CHole item in m_ResultData.GetStage().GetHoleList())
{
if (item.GetName() == cHoleName)
{
cHoleClr = item;
}
}
CDomain CDomain = m_ResultData.CalculateMsrArea(cHoleClr);
return (Rectangle)CDomain.GetRectDomain();
}
///
/// 获取已完成测量的结果文件路径
///
/// 返回测量结果文件路径
///
public bool GetCompletedMeasureFileName(ref List mrFilePathList)
{
//测量文件路径
string proFilePath = m_ResultData.GetPathName();
//样品列表
List sampleList = m_ResultData.GetSampleList();
//获取样品数量
int sampleCount = sampleList.Count;
string mrSuffix = ".rst";
int existsCount = 0;
//获取测量文件路径
if (proFilePath.Equals("Untitled"))
{
return false;
}
string mrFolderPath = string.Empty;
try
{
mrFolderPath = proFilePath.Substring(0, proFilePath.LastIndexOf("\\"));
}
catch (Exception)
{
mrFolderPath = string.Empty;
}
for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
{
int CompleteFieldsCount = sampleList[sampleIndex].GetMsrStatus().GetCompletedFields();
//如果样品已测量成功后再加载至报告程序中
if (CompleteFieldsCount > 0)
{
string sampleName = sampleList[sampleIndex].GetName();
string mrFilePath = mrFolderPath + "\\" + sampleName + "\\" + sampleName + mrSuffix;
//判断文件是否存在
if (File.Exists(mrFilePath))
{
if (mrFilePathList != null)
{
mrFilePathList.Add(mrFilePath);
}
existsCount++;
}
}
}
if (existsCount > 0)
{
return true;
}
return false;
}
///
/// 获取工作样品的测量状态
///
///
///
public bool GetWorkSampleMeasureStatus()
{
bool reuslt = false;
COTSSample COTSSample = m_ResultData.GetWorkingSample();
int sampleStatus = COTSSample.GetMsrStatus().GetCompletedFields();
if (sampleStatus > 0)
{
reuslt = true;
}
return reuslt;
}
}
}