#include "StdAfx.h" #include "MarkAreaMgr.h" #include "CStringFuc.h" #include "GlobalDrawMgr.h" #include "FileMgr.h" #include "LogMgr.h" #include "ObjComponentMgr.h" #include "WorkFileLable.h" #include "WorkFileMgr.h" #include "Layer.h" #include "WorkDataMgr.h" #include "CommonFlowMgr.h" #define FILE_PATH _T("\\Parameter\\MarkArea\\MarkArea.par") #define FIXED_FILE_PATH _T("\\Parameter\\MarkArea\\FixedMarkArea.par")//固定不变的(只能读) CMarkAreaMgr *gMarkAreaMgr = new CMarkAreaMgr; CMarkAreaMgr::CMarkAreaMgr(void) { m_CurSelIdx = -1;//当前选择的 索引值 m_bDraw = false;//是否绘制 m_bDrawIdx = false;//是否显示area 的索引值 } CMarkAreaMgr::~CMarkAreaMgr(void) { } void CMarkAreaMgr::OnAppInitialize() { SaveOrLoad(false);//读取文件 } void CMarkAreaMgr::Draw(CDC* pDC) { if(!m_bDraw) return; int size = m_AreaVec.size(); for(int i=0;iDrawTxt(pDC,str,m_AreaVec[i].GetBasePt()); } } } //通过点来选择area ,一次只能选一个 void CMarkAreaMgr::SelAreaByPt(Dbxy pt) { int size = m_AreaVec.size(); for(int i=0;iWriteDebugLog("MarkArea File Read Err", _LOG_ERROR); } } } void CMarkAreaMgr::SaveOrLoadExt(CArchive &ar) { int size = 0; if(ar.IsStoring()) { size = m_AreaVec.size();//area 的数量 ar<>size; for(int i=0;i &LabVec) { int size = m_AreaVec.size(); for(int i=0;i LabVecRangVec; CWorkFileMgr WorkFileMgr; WorkFileMgr.SeparateStrVec(LabVecRang,LabVecRangVec,LAB_MARK_AREA_START,LAB_MARK_AREA_END); //处理每个点 if(!LabVecRangVec.empty()) { m_AreaVec.clear(); vector::iterator iter = LabVecRangVec.begin(); vector::iterator iter_end = LabVecRangVec.end(); for(;iter!=iter_end;iter++) { CMarkArea MarkArea; MarkArea.ReadWorkFile(*iter); m_AreaVec.push_back(MarkArea); } } } #endif #if 1//编辑area 用的函数 void CMarkAreaMgr::Add() { if(m_AreaVec.empty())//新建 { CMarkArea Area; m_AreaVec.push_back(Area); } else//复制选中的 { if(IdxValid(m_CurSelIdx)) { CMarkArea Area(m_AreaVec[m_CurSelIdx]); m_AreaVec.push_back(Area); } } } void CMarkAreaMgr::InsertList(CListCtrl &List) { int size = m_AreaVec.size(); for(int i=0;i= size) return false; return true; } void CMarkAreaMgr::DelSel(int &idx) { if(!IdxValid(idx)) return; vector::iterator iter = m_AreaVec.begin(); vector::iterator iter_end = m_AreaVec.end(); int i=0; for(;iter!=iter_end;iter++) { if(i==idx) { m_AreaVec.erase(iter); idx = -1; break; } i++; } } void CMarkAreaMgr::DelAll() { m_AreaVec.clear(); m_CurSelIdx = -1;//当前选择的 索引值 } //操作idx 索引 void CMarkAreaMgr::OpArea(int idx,CMarkArea &Area,bool bRead) { if(!IdxValid(idx)) return; ResetAllAreaSelState(); int size = m_AreaVec.size(); for(int i=0;iWriteDebugLog("Func---->CollectWorkData"); //重置obj 的收集状态---------------------------------- gObjComponentMgr->ResetObjCollectState(false); CObjContainer &LayerObjContainer = gLayer.GetObjContainer(); LayerObjContainer.ResetAllCollectedState(); vector::iterator iter = m_AreaVec.begin(); vector::iterator iter_end = m_AreaVec.end(); for(int i=0;iter!=iter_end;iter++,i++) { (*iter).CollectWorkData(bNeedSel); } } //是否有加工数据 int CMarkAreaMgr::GetHasWorkDataAreaCnt() { int Cnt = 0; vector::iterator iter = m_AreaVec.begin(); vector::iterator iter_end = m_AreaVec.end(); for(;iter!=iter_end;iter++) { if((*iter).HasWorkData())//只要一个area 有数据即可 { Cnt++; } } if(Cnt == 0) gLogMgr->WriteDebugLog("Err----> not have work data",_LOG_ERROR); return Cnt; } #endif //阵列创建 void CMarkAreaMgr::ArrayCreat(int CntX,int CntY,double Offset) { DelAll(); //计算右上角area 的中心坐标 Dbxy pt; pt.x = ((CntX-1)*Offset)/2; pt.y = ((CntY-1)*Offset)/2; double flag = -1;//方向标志 for(int i=0;i::iterator iter = m_AreaVec.begin(); vector::iterator iter_end = m_AreaVec.end(); for(;iter!=iter_end;iter++) { (*iter).SetSelState(false); } } int CMarkAreaMgr::GetCurSelIdx() { int size = m_AreaVec.size(); if(m_CurSelIdx::iterator iter = m_AreaVec.begin(); vector::iterator iter_end = m_AreaVec.end(); for(;iter!=iter_end;iter++) { (*iter).UpdateSize(); } } void CMarkAreaMgr::ReReadFixMarkArea() { //重新读取参数保存的markaera 数据 DelAll(); SaveOrLoad(false,true);//从固定文件来读 } //通过obj 对象来调整markarea 的中心点和范围 void CMarkAreaMgr::AdjustByObj() { gLogMgr->WriteDebugLog("func : Adjust MarkArea By Obj"); ReReadFixMarkArea(); double MaxSize = 0; vector::iterator iter = m_AreaVec.begin(); vector::iterator iter_end = m_AreaVec.end(); for(;iter!=iter_end;iter++) { (*iter).AdjustByObj(); DbSize size = (*iter).GetSize(); if(size.w>MaxSize) MaxSize = size.w; if(size.h>MaxSize) MaxSize = size.h; } CString LogStr; LogStr.Format(_T("[MaxAreaSize] = [%.3f]"),MaxSize); gLogMgr->WriteDebugLog(LogStr); } #if 1 //调整区域(脱机卡的时候使用) //处理一个区域内有不同的模板的情况 //顺便设置MarkArea 的编号 void CMarkAreaMgr::Adjust() { gLogMgr->WriteDebugLog("func : CMarkAreaMgr---->Adjust"); int idx = 0; vector::iterator iter = m_AreaVec.begin(); vector::iterator iter_end = m_AreaVec.end(); for(;iter!=iter_end;iter++) { if((*iter).HasWorkData())//只要一个area 有数据即可 { (*iter).SetAreaIdx(idx++); } } } /*发送数据到脱机卡 DataVec 数据容器 TempIdx 模板编号 TempCnt 模板总数 PenPar 振镜参数 CardIdx 脱机卡的编号 */ void CMarkAreaMgr::SendDataToCard(int CardIdx) { } //检查是否全部为点数据 bool CMarkAreaMgr::IsAllPtData(vector> &PtDataVec) { int size = PtDataVec.size(); for(int i=0;i &OneDataVec = PtDataVec[i]; int size1 = OneDataVec.size(); if(size1 > 1) { return false; } } return true; } //转换元件模板数据的格式 void CMarkAreaMgr::ConvertTempData(vector> &DataVec,vector &TempDataVec) { CPenPar &PenPar = gPenParMgr->GetCurPen(); int size = DataVec.size(); for(int i=0;i &OneDataVec = DataVec[i]; int size1 = OneDataVec.size(); int WorkTimes = 1; if(size1 == 1)//只有一个点的情况 { TempDataVec.push_back((double)(size1*WorkTimes));//点数 for(int k=0;k> &DataVec,vector &PosVec) { int size = DataVec.size(); for(int i=0;i &OneDataVec = DataVec[i]; int size1 = OneDataVec.size(); if(size1 == 1)//只有一个点的数据才认为是元件的中心 { PosVec.push_back(OneDataVec[0]); } } } //检查触发模板的安全性 bool CMarkAreaMgr::CheckTempIdx(int idx) { return true; if(idx<0 || idx>=m_CurTempCnt) { CString LogStr; LogStr.Format(_T("Err---->错误的模板编号[idx] = [%d]"),idx); gLogMgr->WriteDebugLog(LogStr); return false; } return true; } #endif