#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 m_RecipeParVec;//参数容器 COffsetTable m_OffsetTable;//补偿表 vector> 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 &GetRecipeParVec(); vector &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 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 &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 &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 m_RecipeGroupNameVec; int m_CurSelGroupIdx;//当前选择的gourp 索引值 vector m_CurGroupRecipeVec;//当前组的recipe 容器 int m_CurSelRecipeIdx;//当前选择的recipe 索引值 //新的参数 vector m_NewRecipeGroupNameVec;//组名称容器 vector 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 m_ErrRangeParIdxSet;//参数超出范围的索引值 set m_ChangeParIdxSet;//变化参数的索引值 set m_InvalidParIdxSet;//无效参数的索引值 double m_FocusAdjustMin;//焦距调整范围最小值 double m_FocusAdjustMax;//焦距调整范围最大值 }; extern CRecipeMgr *gRecipeMgr;