You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

328 lines
13 KiB
C++

#pragma once
#include "GlobalDefine.h"
#include "module.h"
#include "OffsetTable.h"
#define Rcp_AreaName_Idx 18 //扫描区域名称参数索引值(前面增加了参数要改这个值)
#define Rcp_AreaIdx_Idx (Rcp_AreaName_Idx+1)
#define Rcp_N2_Idx (Rcp_AreaIdx_Idx+1)//N2开关
#define Rcp_UseCurN2Val_Idx (Rcp_N2_Idx+1)//使用Recipe的MFC流量值开关
#define Rcp_OffsetTab_Idx (Rcp_UseCurN2Val_Idx+1)//补偿表
#define Rcp_RunTimes_Idx (Rcp_OffsetTab_Idx+1)//运行次数
#define Rcp_CalInfo_Start_Idx (Rcp_RunTimes_Idx+1) //计算参数开始的索引值
#define Rcp_EdiScope_Idx 9 //功率密度复检精度
#define Rcp_OverlapX_Idx (Rcp_EdiScope_Idx+1)
#define Rcp_OverlapY_Idx (Rcp_OverlapX_Idx+1)
#define Rcp_FixSpeed_Idx (Rcp_OverlapY_Idx+2)
#define Rcp_FixGap_Idx (Rcp_FixSpeed_Idx+1)
#define Rcp_List_Val_Col 6//参数在list 中的列号
//参数的类型
enum ERecipeParType
{
_RecipeParType_Null = 0,
_RecipeParType_Double,
_RecipeParType_Bool,
_RecipeParType_CString,
_RecipeParType_Int,
};
enum ERecipeCtrlType
{
_RecipeCtrl_AddGroup = 0,
_RecipeCtrl_DelGroup,
_RecipeCtrl_GroupName,
_RecipeCtrl_AddRecipe,
_RecipeCtrl_DelRecipe,
_RecipeCtrl_CopyRecipe,
_RecipeCtrl_MoveRecipe,
_RecipeCtrl_RecipeName,
_RecipeCtrl_AddSubRecipe,
_RecipeCtrl_DelSubRecipe,
_RecipeCtrl_SubRecipeName,
};
//一个recipe 参数
class CRecipeParameter
{
public:
CRecipeParameter()
{
m_ParDoubleVal = 0;//参数数字值
m_DoubleMinVal = 0;//参数最小值
m_DoubleMaxVal = 0;//参数最大值
m_ParIntVal = 0;
m_ParType = _RecipeParType_Double;//参数的类型
m_ListItemWidht = 100;//列表宽度
m_bRcpInfoPar = false;//是否为计算参数(不能被编辑)
m_ParUnit = "/";//参数的单位,用于显示
m_DetailInfo = "未定义";
};
CString GetParStr();
void SetValByStr(CString s);
CString GetParTypeStr();
void SetTypeByStr(CString TypeStr);
void GetRangeStr(CString &Min,CString &Max);
public:
CString m_ParName;//参数的名字(保存)
double m_ParDoubleVal;//参数数字值(保存)
bool m_ParBoolVal;//bool 值(保存)
CString m_ParStrVal;//字符串值(保存)
int m_ParIntVal;//参数数字值(保存)
CString m_ParShowName;//参数的名字
ERecipeParType m_ParType;//参数的类型
int m_ListItemWidht;//列表宽度
double m_DoubleMinVal;//参数最小值
double m_DoubleMaxVal;//参数最大值
bool m_bRcpInfoPar;//是否为计算参数(不能被编辑)
CString m_ParUnit;//参数的单位,用于显示
CString m_DetailInfo;//详细参数信息
};
class CRecipeCtrlItem
{
public:
CRecipeCtrlItem(){};
public:
CString m_DlgTitle;
CString *m_EditName1;
CString *m_EditName2;
CComboBox *m_RecipeCtrlGroupComb;
CString m_SelGroupName;
};
class CRecipeParCtrlItem
{
public:
CRecipeParCtrlItem(){};
public:
double *m_EditParVal;
CString *m_EditParName;
CComboBox *m_SelScanAreaComb;
CComboBox *m_SelScanAreaIdxComb;
CComboBox *m_SelBoolValComb;
CComboBox *m_SelOffsetTableComb;
CString m_SelScanAreaStr;
};
class CSubRecipe
{
public:
CSubRecipe();
void IntiRecipeParVec();
void ReadMFCCtrlScalFile();
public:
CString m_SubRecipeName;
bool m_bUseSubRecipe;//生产中是否使用
vector<CRecipeParameter> m_RecipeParVec;//参数容器
COffsetTable m_OffsetTable;//补偿表
vector<vector<CString>> MFCScalStrVec;
};
class CRecipeCtrlPar
{
public:
CRecipeCtrlPar(){};
public:
ERecipeCtrlType m_CtrlType;
CString m_FilePath;
CString m_NewFilePath;
CString m_RcpName;
CString m_RcpNameNew;
CString m_SubRcpName;
CString m_SubRcpNameNew;
};
//一个Recipe (可以整个类进行赋值)
class CRecipe
{
public:
CRecipe();
void RecipeReset();
bool IsValid();
void SaveRecipeParToFile(CString FilePath);
void ReadRecipeParFromFile(CString FilePath);
CRecipeParameter GetRecipePar(CString ParName);//获取参数名为ParName 的值
void SetRecipePar(CString ParName,CRecipeParameter RecipePar);//设置参数名为ParName 的值
bool CheckParRange(bool bShowMsg);
bool CheckParRangeByName(CString ParName,double val);
bool CheckParRangeExt(CRecipeParameter &RecipePar,double ParVal,bool bShowMsg);
CString GetShowName();
vector<CRecipeParameter> &GetRecipeParVec();
vector<CSubRecipe> &GetSubRecipeVec(){return m_SubRecipeVec;};
void AddSubRecipe(CString SubRecipeName);
int GetCurSubRecipeIdx(){return m_CurSubRecipeIdx;};
void SetCurSubRecipeIdx(int idx){m_CurSubRecipeIdx = idx;};
CString GetCurSubRecipeName();
void SetCurSubRecipeName(CString Name);
void DelSubRecipe(CString SubRecipeName);
bool ReadOffsetTableFile(CString TableName);
double GetOffsetParVal(CString ParName);
public:
int m_GroupIdx;//组的编号(1~10)
int m_RecipeIdx;//在组中的编号(1~50)
double m_DoubleValCnt;//double 类型参数的数量
//新的参数
CString m_RecipeName;//Recipe 名
CString m_FilePath;//存储的目录
bool m_bEnableEdit;//当前时候可以编辑
int m_CurSubRecipeIdx;//当前使用的SubRecipe 索引号(这个值不能超过范围)(编辑和加工时会用到)
vector<CSubRecipe> m_SubRecipeVec;//用于一片wafer 多recipe 执行(最少要保留一个SubRecipe ,否则会报错)
};
//recipe 参数管理
class CRecipeMgr:public CModule
{
public:
CRecipeMgr(void);
virtual ~CRecipeMgr(void);
virtual void OnAppInitialize();
void InitRecipeGourpFile();
CRecipeParameter GetCurRecipePar(CString ParName);
void SelRecipeScanArea(CComboBox &ComboBox);
void SetCurSelGourpIdx(int Idx);
void SetCurSelRecipeIdx(int Idx);
void SetbChangeName(bool b){m_bChangeGroupName = b;};
bool GetbChangeName(){return m_bChangeGroupName;};
void SaveCurSelRecipe(CRecipe Recipe);
CRecipe GetCurWorkRecipe(){return m_CurWorkRecipe;};
void SetCurWorkRecipe(CRecipe Recipe){m_CurWorkRecipe = Recipe;};
CString GetCurSelGroupName();
CString GetSelGroupRecipeStr();
void UpdateSelRecipeList(CListCtrl &List,bool bInsert);
void CreatRecipeScanPath(CRecipe *pRecipe,int SubRecipeIdx);
bool EditRecipeByCtrlType(ERecipeCtrlType t);
ERecipeCtrlType GetCurRecipeCtrlType(){return m_CurRecipeCtrlType;};
CString RecipeCtrlExcute(CRecipeCtrlItem &CtrlItem);
void BindingRecipeGroupComb(CComboBox *p);
void RecipeCtrlInit(CRecipeCtrlItem &CtrlItem);
void InitGroupRecipeList(CListCtrl &List);
void UpdateGroupRecipeList(CListCtrl &List);
void InitEditRecipeList(CListCtrl &List,bool bShowParRange);
void InitEditSubRecipeList(CListCtrl &List);
void UpdateEditRecipeList(CListCtrl &RecipeList,CListCtrl &RecipeInfoList,bool bResetErrRangeParIdxSet=true);
void UpdateEditSubRecipeList(CListCtrl &List);
bool SaveEditRecipePar(CListCtrl &ListCtrl,CListCtrl &RecipeInfoList);
void AddSubRecipe(CString SubRecipeName);
void SetSubRecipeIdx(int idx);
bool MoveSubRecipe(bool bMoveUp);
void OnSelRecipeIdxChange(int idx);
bool ReadEditRecipeFromFile();
CString GetCurEditRecipeInfo();
CString GetCurEditSubRecipeInfo();
void ChangeRecipeName(CString NewRcpName);
void DelSubRecipe(CString SubRecipeName);
void SetCurSelRecipeName(CString s){m_CurSelRecipeName = s;};
void UpdatParBoolComb(CComboBox &Comb);
void UpdateAreaIdxCombo(CComboBox &AreaIdxComb);
bool UpdateRecipeInfoPar(CRecipe &Recipe);
void UpdateRecipeGroupComb(CComboBox *pComb);
void UpdateSelRecipeComb(CComboBox &ComboBox,vector<CString> &SelGroupRecipeNameVec);
bool ReadEditRecipeFromFile(CRecipe &Recipe,int SelGroupIdx,CString SelRecipeName);
void UpdateAllRecipeParToList(CRecipe Recipe,CListCtrl &RecipeList);
CString GetCtrlRecipeFilePath(CString GroupName,CString RecipeName);
void UpdateSelSubRecipeComb(CComboBox &ComboBox,CRecipe Recipe);
void CreatScanPath(CString AreaName,int AreaIdx);
CRecipe GetCurEditRecipe(){return m_CurEditRecipe;};
void CreatCurEditRecipeScanPath();
void UpdateRecipeGroupVec();
void UpdateEditRecipeListExt(CRecipe &Recipe,CListCtrl &RecipeList,CListCtrl &RecipeInfoList);
void UpdateEditSubRecipeListExt(CRecipe &Recipe,CListCtrl &List);
CString GetAreaIdxStr(int k);
CString CreatCurParDataPath();
void SaveRecipeHistoy(CRecipeCtrlPar RecipeCtrlPar);
bool CheckRecipeNameExist(CString RecipeName);
CString GetRecipePathByName(CString RecipeName);
void DeleteRecipeGroup(CString GroupName);
bool IsErrRangeParIdx(int idx){return m_ErrRangeParIdxSet.count(idx);};
bool IsChangeParIdx(int idx){return m_ChangeParIdxSet.count(idx);};
bool IsInvalidParIdx(int idx){return m_InvalidParIdxSet.count(idx);};
void UpdateEditRecipeListExt(CListCtrl &RecipeList,CRecipe &Recipe);
void UpdateInvalidParIdxSet(CRecipe &Recipe);
void UpdateLaserFocusProp();
void UpdateRecipeGroupInfo();
CString GetOffsetTablePath(CString TabName);
CString GetShowParText(int Row);
private:
CString GetGroupDirPath(int GroupIdx);
CString GetRecipeNameListPath();
CString GetRecipeFilePath(int GroupIdx,int RecipeIdx);
CString GetRecipePath();
void CreatRecipeFilePath();
void AddRecipeGroup(CString GroupName);
void AddRecipe(CString GroupName,CString RecipeName);
void ChangeGroupName(CString NewGroupName);
CString GetRecipeCtrlName(ERecipeCtrlType RecipeCtrlType);
void ChangeSubRecipeName(CString NewRcpName);
void SaveRecipeToXml(CString FilePath,CRecipe &Recipe);
void ReadCurGroupRecipeName(vector<CString> &SelGroupRecipeNameVec);
bool ReadRecipeFromXml(CString FilePath,CRecipe &Recipe);
void MoveRecipe(CString GroupName,CString RecipeName);
void CopyRecipe(CString NewRecipeName);
void DeletRecipe(CString RecipeName);
bool IsbSelEditRecipe();
void ResetParIdxSet();
private:
CRecipe m_CurWorkRecipe;//当前加工使用的recipe
bool m_bChangeGroupName;//true 设置group 名称,false 设置recipe 名称
vector<CString> m_RecipeGroupNameVec;
int m_CurSelGroupIdx;//当前选择的gourp 索引值
vector<CRecipe> m_CurGroupRecipeVec;//当前组的recipe 容器
int m_CurSelRecipeIdx;//当前选择的recipe 索引值
//新的参数
vector<CString> m_NewRecipeGroupNameVec;//组名称容器
vector<CString> m_CurSelGroupRecipeNameVec;//当前选中的组recipe 名称
ERecipeCtrlType m_CurRecipeCtrlType;//当前的操作类型
CComboBox *m_pRecipeGroupComb;
int m_CurSelRecipeParIdx;//当前选择的par 索引值
CString m_CurSelGroupName;//当前选中Group 的名称
CString m_CurSelRecipeName;//当前选中recipe 的名称
CRecipe m_CurEditRecipe;//当前编辑的recipe
//用于recipe list 显示的索引值
set<int> m_ErrRangeParIdxSet;//参数超出范围的索引值
set<int> m_ChangeParIdxSet;//变化参数的索引值
set<int> m_InvalidParIdxSet;//无效参数的索引值
double m_FocusAdjustMin;//焦距调整范围最小值
double m_FocusAdjustMax;//焦距调整范围最大值
};
extern CRecipeMgr *gRecipeMgr;