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.
519 lines
13 KiB
C++
519 lines
13 KiB
C++
#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;i<size;i++)
|
|
{
|
|
if(m_CurSelIdx==i)
|
|
{
|
|
m_AreaVec[i].Draw(pDC,true);
|
|
}
|
|
else
|
|
{
|
|
m_AreaVec[i].Draw(pDC,false);
|
|
}
|
|
if(m_bDrawIdx)
|
|
{
|
|
//中间绘制数字
|
|
CString str;
|
|
str.Format(_T("%d"),i+1);
|
|
gDraw->DrawTxt(pDC,str,m_AreaVec[i].GetBasePt());
|
|
}
|
|
}
|
|
}
|
|
//通过点来选择area ,一次只能选一个
|
|
void CMarkAreaMgr::SelAreaByPt(Dbxy pt)
|
|
{
|
|
int size = m_AreaVec.size();
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
if(m_AreaVec[i].IsPtInArea(pt))
|
|
{
|
|
SetCurSelIdx(i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//选择第一个area
|
|
void CMarkAreaMgr::SelFristArea()
|
|
{
|
|
int size = m_AreaVec.size();
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
if(i==0)
|
|
m_AreaVec[i].SetSelState(true);
|
|
else
|
|
m_AreaVec[i].SetSelState(false);
|
|
}
|
|
}
|
|
#if 1
|
|
//保存或者读取
|
|
void CMarkAreaMgr::SaveOrLoad(bool bSave,bool bFixed)
|
|
{
|
|
CFileMgr FileMgr;
|
|
char filepath[1024];
|
|
if(bFixed)
|
|
FileMgr.GetFullFilePath(filepath,FIXED_FILE_PATH);//获取完整路径
|
|
else
|
|
FileMgr.GetFullFilePath(filepath,FILE_PATH);//获取完整路径
|
|
|
|
if(bSave)
|
|
{
|
|
CFile file(filepath,CFile::modeReadWrite|CFile::modeCreate);
|
|
CArchive ar(&file,CArchive::store);
|
|
SaveOrLoadExt(ar);
|
|
}
|
|
else
|
|
{
|
|
CFile file;
|
|
if(file.Open(filepath,CFile::modeRead))
|
|
{
|
|
CArchive ar(&file,CArchive::load);
|
|
SaveOrLoadExt(ar);
|
|
}
|
|
else
|
|
{
|
|
gLogMgr->WriteDebugLog("MarkArea File Read Err", _LOG_ERROR);
|
|
}
|
|
}
|
|
}
|
|
void CMarkAreaMgr::SaveOrLoadExt(CArchive &ar)
|
|
{
|
|
int size = 0;
|
|
if(ar.IsStoring())
|
|
{
|
|
size = m_AreaVec.size();//area 的数量
|
|
ar<<size;
|
|
}
|
|
else
|
|
{
|
|
ar>>size;
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
CMarkArea Area;
|
|
if(i==0)
|
|
Area.SetSelState(true);//默认选中第一个
|
|
m_AreaVec.push_back(Area);
|
|
}
|
|
}
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
m_AreaVec[i].Serialize(ar);
|
|
}
|
|
}
|
|
|
|
#endif
|
|
#if 1
|
|
void CMarkAreaMgr::WriteWorkFileExt(vector<CLab> &LabVec)
|
|
{
|
|
int size = m_AreaVec.size();
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
LabVec.push_back(CLab(LAB_MARK_AREA_START));
|
|
m_AreaVec[i].WriteWorkFile(LabVec);
|
|
LabVec.push_back(CLab(LAB_MARK_AREA_END));
|
|
}
|
|
}
|
|
void CMarkAreaMgr::ReadWorkFile(CLabVecRang &LabVecRang)
|
|
{
|
|
vector<CLabVecRang> LabVecRangVec;
|
|
CWorkFileMgr WorkFileMgr;
|
|
WorkFileMgr.SeparateStrVec(LabVecRang,LabVecRangVec,LAB_MARK_AREA_START,LAB_MARK_AREA_END);
|
|
|
|
//处理每个点
|
|
if(!LabVecRangVec.empty())
|
|
{
|
|
m_AreaVec.clear();
|
|
vector<CLabVecRang>::iterator iter = LabVecRangVec.begin();
|
|
vector<CLabVecRang>::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;i++)
|
|
{
|
|
int idx = 0;
|
|
List.InsertItem(i," ");//插入一行
|
|
List.SetItemText(i,idx++,Int2CString(i+1));//序号
|
|
Dbxy pt = m_AreaVec[i].GetBasePt();//基准点
|
|
List.SetItemText(i,idx++,Db2CString(pt.x));
|
|
List.SetItemText(i,idx++,Db2CString(pt.y));
|
|
DbSize size = m_AreaVec[i].GetSize();//尺寸
|
|
List.SetItemText(i,idx++,Db2CString(size.w));
|
|
List.SetItemText(i,idx++,Db2CString(size.h));
|
|
}
|
|
}
|
|
//检查idx 是否有效
|
|
bool CMarkAreaMgr::IdxValid(int idx)
|
|
{
|
|
int size = m_AreaVec.size();
|
|
if(idx<0 || idx>= size)
|
|
return false;
|
|
return true;
|
|
}
|
|
void CMarkAreaMgr::DelSel(int &idx)
|
|
{
|
|
if(!IdxValid(idx))
|
|
return;
|
|
vector<CMarkArea>::iterator iter = m_AreaVec.begin();
|
|
vector<CMarkArea>::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;i<size;i++)
|
|
{
|
|
if(idx == i)
|
|
{
|
|
if(bRead)
|
|
{
|
|
Area = m_AreaVec[i];
|
|
//设置选择状态
|
|
m_AreaVec[i].SetSelState(true);
|
|
}
|
|
else
|
|
{
|
|
m_AreaVec[i] = Area;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//调整顺序
|
|
void CMarkAreaMgr::Order(int &idx,bool bMoveUp)
|
|
{
|
|
int size = m_AreaVec.size();
|
|
if(bMoveUp)//前移
|
|
{
|
|
SwapArea(idx,idx-1);
|
|
}
|
|
else//后移
|
|
{
|
|
SwapArea(idx,idx+1);
|
|
}
|
|
}
|
|
void CMarkAreaMgr::SwapArea(int &idx1,int idx2)
|
|
{
|
|
if(!IdxValid(idx1) || !IdxValid(idx2))
|
|
return;
|
|
CMarkArea tmp = m_AreaVec[idx1];
|
|
m_AreaVec[idx1] = m_AreaVec[idx2];
|
|
m_AreaVec[idx2] = tmp;
|
|
//指向交换后的项
|
|
idx1 = idx2;
|
|
}
|
|
void CMarkAreaMgr::MoveAllArea(double Val,DIRECTION dir)
|
|
{
|
|
int size = m_AreaVec.size();
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
Dbxy pt = m_AreaVec[i].GetBasePt();
|
|
if(dir==_DIR_L ||dir==_DIR_R)
|
|
pt.x += Val;
|
|
else
|
|
pt.y += Val;
|
|
m_AreaVec[i].SetBasePt(pt);
|
|
}
|
|
}
|
|
#endif
|
|
#if 1
|
|
//收集加工数据入口
|
|
void CMarkAreaMgr::CollectWorkData(bool bNeedSel)
|
|
{
|
|
gLogMgr->WriteDebugLog("Func---->CollectWorkData");
|
|
//重置obj 的收集状态----------------------------------
|
|
gObjComponentMgr->ResetObjCollectState(false);
|
|
CObjContainer &LayerObjContainer = gLayer.GetObjContainer();
|
|
LayerObjContainer.ResetAllCollectedState();
|
|
vector<CMarkArea>::iterator iter = m_AreaVec.begin();
|
|
vector<CMarkArea>::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<CMarkArea>::iterator iter = m_AreaVec.begin();
|
|
vector<CMarkArea>::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<CntX;i++)
|
|
{
|
|
for(int j=0;j<CntY;j++)
|
|
{
|
|
CMarkArea Area;
|
|
Area.SetBasePt(pt);
|
|
m_AreaVec.push_back(Area);
|
|
if(j<CntY-1)//最后一个不要再偏移
|
|
pt.y += Offset*(flag);
|
|
}
|
|
pt.x -= Offset;//左移
|
|
flag *= (-1);//反向
|
|
}
|
|
}
|
|
|
|
void CMarkAreaMgr::ResetAllAreaSelState()
|
|
{
|
|
vector<CMarkArea>::iterator iter = m_AreaVec.begin();
|
|
vector<CMarkArea>::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<size)
|
|
return m_CurSelIdx;
|
|
return -1;
|
|
}
|
|
void CMarkAreaMgr::SetAllMarkSize()
|
|
{
|
|
vector<CMarkArea>::iterator iter = m_AreaVec.begin();
|
|
vector<CMarkArea>::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<CMarkArea>::iterator iter = m_AreaVec.begin();
|
|
vector<CMarkArea>::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<CMarkArea>::iterator iter = m_AreaVec.begin();
|
|
vector<CMarkArea>::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<vector<Dbxy>> &PtDataVec)
|
|
{
|
|
int size = PtDataVec.size();
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
vector<Dbxy> &OneDataVec = PtDataVec[i];
|
|
int size1 = OneDataVec.size();
|
|
if(size1 > 1)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
//转换元件模板数据的格式
|
|
void CMarkAreaMgr::ConvertTempData(vector<vector<Dbxy>> &DataVec,vector<double> &TempDataVec)
|
|
{
|
|
CPenPar &PenPar = gPenParMgr->GetCurPen();
|
|
|
|
int size = DataVec.size();
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
vector<Dbxy> &OneDataVec = DataVec[i];
|
|
int size1 = OneDataVec.size();
|
|
int WorkTimes = 1;
|
|
|
|
if(size1 == 1)//只有一个点的情况
|
|
{
|
|
TempDataVec.push_back((double)(size1*WorkTimes));//点数
|
|
for(int k=0;k<WorkTimes;k++)
|
|
{
|
|
TempDataVec.push_back(OneDataVec[0].x);//点坐标X
|
|
TempDataVec.push_back(OneDataVec[0].y);//点坐标Y
|
|
}
|
|
}
|
|
else//连续线段
|
|
{
|
|
TempDataVec.push_back((double)(size1*WorkTimes));//点数
|
|
for(int k=0;k<WorkTimes;k++)//数据连续
|
|
{
|
|
for(int m=0;m<size1;m++)
|
|
{
|
|
TempDataVec.push_back(OneDataVec[m].x);//点坐标X
|
|
TempDataVec.push_back(OneDataVec[m].y);//点坐标Y
|
|
}
|
|
}
|
|
}
|
|
}
|
|
TempDataVec.push_back(0);//结束标示
|
|
}
|
|
//转换原件的坐标格式
|
|
void CMarkAreaMgr::ConvertPosVec(vector<vector<Dbxy>> &DataVec,vector<Dbxy> &PosVec)
|
|
{
|
|
int size = DataVec.size();
|
|
for(int i=0;i<size;i++)
|
|
{
|
|
vector<Dbxy> &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
|