#include "StdAfx.h" #include "WaferRecipeDataMgr.h" #include "GlobalFunction.h" #include "LogMgr.h" #include "WorkTime.h" #include "FileMgr.h" #include "WorkFileMgr.h" #include "Layer.h" #include "ObjFillMgr.h" #include "Laser.h" #include "Propertie.h" #include "PropertieMgr.h" #include "AuthorityMgr.h" #include "MsgBox.h" #include "CStringFuc.h" #include "Layer.h" #include "PenParMgr.h" #include "ObjBase.h" #include "ObjContainer.h" #include "ExceptionMsg.h" #include "WorkRecord.h" #include "WorkCmdInvoker.h" #include "WorkCmdContainer.h" #include "WorkAreaMgr.h" #include "PenParMgr.h" #include "CommonFlowMgr.h" #include "LaserPowCheckMgr.h" #include "EncryptionMgr.h" #include "ObjPline.h" #include "CommomText.h" #include "ProgramLaserTuiHuo.h" #include "WorkAreaMgr.h" #define WORK_AREA_PATH _T("\\WorkMode") #define SCAN_AREA_FILE_PATH _T("\\ScanArea") //加工区域的路径 #define RECIPE_FILE_PATH _T("\\RecipeFile") CSlotRecipeDataMgr *gWaferRecipeDataMgr = new CSlotRecipeDataMgr; CSlotRecipeDataMgr::CSlotRecipeDataMgr(void) { m_bScanEnd = true;//扫描结束状态,用来确定扫描线的颜色 m_EndScanLineIdx = -1;//结束扫描时扫描线的索引值(用来恢复中断的情况) m_TotalScanLineCnt = 0;//扫描线的总数 } CSlotRecipeDataMgr::~CSlotRecipeDataMgr(void) { } void CSlotRecipeDataMgr::OnAppInitialize() { //默认显示选择对象的idx gLayer.SetbShowObjIdx(true); //创建recipe 文件路径 CString RecordPath; CFileMgr FileMgr; FileMgr.GetFullFilePath(RecordPath,RECIPE_FILE_PATH); if(!FileMgr.IsFileExist(RecordPath))//不存在,创建目录 { FileMgr.CreatDir(RecordPath); } CString OffsetTabPath = gProgramLaserTuiHuo->GetLaipuLaserDataDir(OFFSET_TAB_FILE_PATH); if(!FileMgr.IsFileExist(OffsetTabPath))//不存在,创建目录 { FileMgr.CreatDir(OffsetTabPath); } } //检查扫描数据的安全性 bool CSlotRecipeDataMgr::CheckScanPathSecurity() { gLogMgr->WriteDebugLog("Func---->CheckScanPathSecurity"); CObjContainer &ObjContainer = gLayer.GetObjContainer(); bool Ret = true; vector> &m_ObjVec = ObjContainer.GetObjVec(); int size = m_ObjVec.size(); for(int k=0;k&PtContainer = m_ObjVec[k]->GetPtContainer(); int size1 = PtContainer.size(); for(int i=0;iIsPtInWorkArea(PtContainer[i].GetPt())) { Ret = false; break; } } } if(!Ret) { CMsgBox MsgBox; MsgBox.Show("扫描数据不在安全的范围内!"); } return Ret; } #if 1 //创建扫描路径,SelObjVec 是选择的obj 索引 void CSlotRecipeDataMgr::CreatScanPath(vector SelObjVec) { CObjContainer &ObjContainer = gLayer.GetObjContainer(); ObjContainer.DelAllFillObj();//先删除填充的obj ObjContainer.SelObjByIdxVec(SelObjVec);//设置obj 的选择状态 gPenParMgr->SetParSelectState(SelObjVec);//设置对应笔号的选择状态 m_CurSelStateVec = SelObjVec;//记录当前选择状态 //填充所有选择的obj gObjFillMgr.FillAllSelObj(); //创建完成后取消选择状态 //ObjContainer.NotSelAllObj(); //设置第一个选择的笔作为工作笔 gPenParMgr->SetFirstSelPenAsWorkPen(); //记录当前扫描线的数量 CScanState &ScanState = gWorkRecordMgr->GetCurScanState(); ScanState.m_TotalScanLineCnt = ObjContainer.GetScanLineCnt(); } //通过制定area 的编号来创建扫描路径 void CSlotRecipeDataMgr::CreatScanPath(int AreaIdx) { vector SelObjVec; CObjContainer &ObjContainer = gLayer.GetObjContainer(); int AreaCnt = ObjContainer.GetScanAreaCnt(); for(int k=0;k=0 && idx扫描速度 double CSlotRecipeDataMgr::CalScanSpeedByOverlapRatio(double OverlapRatio,double Fre) { if(Fre<=0 || (OverlapRatio<=0 || OverlapRatio>99.9)) { return -1; } //当前光斑的尺寸 DbSize MainSpotSize = gLaser->GetSpotSize(_LaserDeviceType_MainLaser1); double SpotSize; if(gLaser->IsbScanByDirX()) SpotSize = MainSpotSize.w; else SpotSize = MainSpotSize.h; double SpotGap = SpotSize*(OverlapRatio/100); double ScanSpeed = (SpotSize - SpotGap)*Fre; //频率Fre = 500 //光斑X方向宽度SpotSize = 0.686 //重叠率 OverlapRatio = 10% //则计算出来的X 轴扫描速度ScanSpeed = 308.7 //ScanSpeed = (664.9 - (664.9-623.79))*500; = 311.895 return ScanSpeed; } //[功率密度/频率/光斑尺寸]--->[衰减器的旋转角度] /*用于验算角度对应的Edi double TestAng = Edi; double TestEdi = cos(_360ToAngle(2*(TestAng))); TestEdi *= TestEdi; TestEdi *= Pow;//pow TestEdi /= (Fre*LaserSpotX*LaserSpotY); CString log; log.Format("Test Edi = %lf",TestEdi); gLogMgr->WriteDebugLog(log); */ //计算公式: Edi = (P(cos2θ)^2)/(F*H*L) double CSlotRecipeDataMgr::CalRotatoDimmerAng(double LaserSpotX,double LaserSpotY,double Edi,double Fre,double Pow) { double Ang = 0; LaserSpotX *= 0.1;//mm-->cm LaserSpotY *= 0.1; double Ret = (LaserSpotX*LaserSpotY); Ret *= (Edi*Fre); Ret /= Pow; Ret = sqrt(Ret);//根号 Ret = acos(Ret);//cos的反三角函数(结果是反正切角) Ret /=2; Ang = Ret/2; Ang = AngleTo360(Ret);//反正切角转换为360 角 Ang *= -1; return Ang; } //通过速度和频率计算重叠率 double CSlotRecipeDataMgr::CalOverlapRatioByScanSpeed(double ScanSpeed,double Fre) { if(Fre<=0 || ScanSpeed<=0) { return -1; } //当前光斑的尺寸 DbSize MainSpotSize = gLaser->GetSpotSize(_LaserDeviceType_MainLaser1); double SpotSize; if(gLaser->IsbScanByDirX()) SpotSize = MainSpotSize.w; else SpotSize = MainSpotSize.h; double SpotGap = SpotSize - ScanSpeed/Fre; double OverlapRatio = (SpotGap/SpotSize)*100; if(OverlapRatio<0 || OverlapRatio>99) return -1; return OverlapRatio; } #endif #if 1 //初始化可以选择的扫描区域 void CSlotRecipeDataMgr::InitScanAreaComb(CComboBox &ComboBox) { ComboBox.ResetContent();//清空 //获取加工文件的名字 vector Vec; GetScanAreaName(Vec); int size = Vec.size(); for(int i=0;i Vec; GetScanAreaName(Vec); int size = Vec.size(); for(int i=0;i &Vec) { Vec.clear(); CFileMgr FileMgr; CString filepath; //FileMgr.GetFullFilePath(filepath,SCAN_AREA_FILE_PATH);//获取完整路径 filepath = gProgramLaserTuiHuo->GetScanAreaFilePath(); FileMgr.GetChildFileOrDirName(false,filepath,Vec,".obj"); m_ScanAreaPathVec = Vec;//记录 文件的完整路径 int size = Vec.size(); for(int i=0;i &ScanAreaPathVec = m_ScanAreaPathVec; int size = ScanAreaPathVec.size(); for(int i=0;iReadObjTemplateFile(Path); //记录当前使用的扫描区域 CFileMgr FileMgr; FileMgr.GetFileNameFromPath(Path,true); AreaName = FileMgr.GetFileNameFromPath(Path,true); break; } } return AreaName; } #endif #if 1 void CSlotRecipeDataMgr::IniRecipeParList(CListCtrl &list) { //设置风格 list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置列 int idx = 0; list.InsertColumn(idx,"Idx",LVCFMT_LEFT,50,-1); idx++; list.InsertColumn(idx,"参数名",LVCFMT_LEFT,155,-1); idx++; list.InsertColumn(idx,"值",LVCFMT_LEFT,130,-1); idx++; vector &RecipeParVec = gPenParMgr->GetRecipeParVec(); int size = RecipeParVec.size(); for(int k=0;k &ParVec = gPenParMgr->GetParVec(); int PenParCnt = ParVec.size(); CObjContainer &ObjContainer = gLayer.GetObjContainer(); int ObjCnt = ObjContainer.GetScanAreaCnt(); for(int k=0;(k=PenParCnt);k++) { CPenPar &PenPar =ParVec[k]; if(PenPar.m_bSelected) return k; } return -1; } #endif #if 1 void CSlotRecipeDataMgr::InitOffsetTableList(CListCtrl &List) { //设置风格 List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置列 int idx = 0; List.InsertColumn(idx,"Idx",LVCFMT_CENTER,35,-1); idx++; List.InsertColumn(idx,"ParName",LVCFMT_LEFT,140,-1); idx++; List.InsertColumn(idx,"Unit",LVCFMT_CENTER,80,-1); idx++; List.InsertColumn(idx,"Value",LVCFMT_LEFT,100,-1); idx++; } void CSlotRecipeDataMgr::UpdateOffsetTableList(CListCtrl &List,CString FilePath) { //从文件中读取OffsetTable m_CurEditOffsetTable.ReadOffsetTableFile(FilePath); //显示到列表 vector &OffsetTableParVec = m_CurEditOffsetTable.m_OffsetTableParVec; { List.DeleteAllItems(); int size = OffsetTableParVec.size(); for(int k=0;k &OffsetTableParVec = m_CurEditOffsetTable.m_OffsetTableParVec; int size = OffsetTableParVec.size(); for(int k=0;kWriteDebugLog(ParValStr); } m_CurEditOffsetTable.SaveOffsetTableFile(FilePath); //保存操作记录 CString Name = FileMgr.GetFileNameFromPath(FilePath,true); SaveOffsetTableHistory(OffsetTableParVec,"Change",Name); CString s = FilePath; s += "\nSave Succes"; MsgBox.Show(s); } //创建一个新的OffsetTable void CSlotRecipeDataMgr::CreateNewOffsetTable(CString Name) { CMsgBox MsgBox; CString s; CString Path = gProgramLaserTuiHuo->GetLaipuLaserDataDir(OFFSET_TAB_FILE_PATH); Path += Name; Path += "."; Path += OFFSET_TAB_FILE_SUFFIX; CFileMgr FileMgr; if(FileMgr.IsFileExist(Path)) { s = Name + "已存在"; MsgBox.Show(s); return; } COffsetTable OffsetTable; //写入文件 OffsetTable.SaveOffsetTableFile(Path); //保存操作记录 SaveOffsetTableHistory(OffsetTable.m_OffsetTableParVec,"Create",Name); } //删除OffsetTable void CSlotRecipeDataMgr::DelOffsetTable(CString FilePath) { CMsgBox MsgBox; CString s; CFileMgr FileMgr; if(!FileMgr.IsFileExist(FilePath)) { s = FilePath + "\nNot Exist"; MsgBox.Show(s); return; } s = "Delete: \n" + FilePath; if(MsgBox.ConfirmOkCancel(s)) { //保存操作记录 CString Name = FileMgr.GetFileNameFromPath(FilePath,true); SaveOffsetTableHistory(m_CurEditOffsetTable.m_OffsetTableParVec,"Delete",Name); CFileMgr FileMgr; FileMgr.DeleteFolder(FilePath); } } //保存操作记录 void CSlotRecipeDataMgr::SaveOffsetTableHistory(vector&OffsetTableParVec,CString OperateType,CString TableName) { CWorkTime WorkTime; CCsvData CsvData; CsvData.AddData("User Name",false); CsvData.AddData(gAuthorityMgr->GetCurUserName(),true); CsvData.AddData("Operate Time",false); CsvData.AddData(WorkTime.GetDateTime("/",":"),true); CsvData.AddData("OperateType",false); CsvData.AddData(OperateType,true); CsvData.AddData("Offset Table Name",false); CsvData.AddData(TableName,true); int size = OffsetTableParVec.size(); for(int k=0;kGetLaipuLaserDataDir(OFFSET_TAB_HISTORY_PATH)); CFileMgr FileMgr; FileMgr.WriteDataToExcel(DataPath,FileName,CsvData,false); } //初始化可以选择的Offset Table void CSlotRecipeDataMgr::InitOffsetTableComb(CComboBox &ComboBox) { ComboBox.ResetContent();//清空 //获取加工文件的名字 vector Vec; GetOffsetTableName(Vec); ComboBox.InsertString(0,RECIPE_OFFSET_TBL_NULL);//第一行为空,表示不选择OffsetTable int size = Vec.size(); for(int i=0;i &Vec) { Vec.clear(); CFileMgr FileMgr; CString filepath; filepath = gProgramLaserTuiHuo->GetLaipuLaserDataDir(OFFSET_TAB_FILE_PATH); FileMgr.GetChildFileOrDirName(false,filepath,Vec,".tbl"); m_OffsetTablePathVec = Vec;//记录 文件的完整路径 int size = Vec.size(); for(int i=0;i &OffsetTablePathVec = m_OffsetTablePathVec; int size = OffsetTablePathVec.size(); for(int i=0;i