#include "StdAfx.h" #include "ObjBase.h" #include "LogMgr.h" #include "GlobalFunction.h" #include "GlobalDrawMgr.h" #include "MarkParMgr.h" #include "WorkFileLable.h" #include "WorkFileMgr.h" #include "CommonFlowMgr.h" CObjBase::CObjBase(void) { SetSelected(false);//是否被选中 SetLock(false);//是否锁定 m_bDraw = true;//是否绘制 m_bOffsetAreaRect = false;//是否为偏移调整区域对象 OnCreat(); } CObjBase::~CObjBase(void) { } //创建的时候 void CObjBase::OnCreat() { m_PenNum = gMarkParMgr->GetCurPenNum(); } #if 1 void CObjBase::WriteWorkFileBase(vector &LabVec) { LabVec.push_back(CLab(LAB_OBJ_TYPE,(int)GetType()));//obj 的类型 LabVec.push_back(CLab(LAB_PEN_NUM,m_PenNum));//obj 轮廓的笔号 LabVec.push_back(CLab(LAB_OBJ_IS_OFFSET_RECT,m_bOffsetAreaRect));//是否为偏移调整区域对象 } void CObjBase::ReadWorkFileBase(CLabVecRang &LabVecRang) { CWorkFileMgr WorkFileMgr; //读取笔号------------------------------------------------ { CLab Lab = WorkFileMgr.FindLab(LabVecRang,LAB_PEN_NUM); if(Lab.m_ValType != _TYPE_NULL) { m_PenNum = Lab.m_Int; } } { CLab Lab = WorkFileMgr.FindLab(LabVecRang,LAB_OBJ_IS_OFFSET_RECT); if(Lab.m_ValType != _TYPE_NULL) { m_bOffsetAreaRect = Lab.m_Bool; } } } void CObjBase::WriteWorkFile(vector &LabVec) { //写入公共信息 WriteWorkFileBase(LabVec); WriteWorkFileExt(LabVec); } void CObjBase::ReadWorkFile(CLabVecRang &LabVecRang) { //读取公共信息 ReadWorkFileBase(LabVecRang); ReadWorkFileExt(LabVecRang); } void CObjBase::WriteWorkFileExt(vector &LabVec) { m_PtContainer.WriteWorkFile(LabVec); } void CObjBase::ReadWorkFileExt(CLabVecRang &LabVecRang) { //读取数据点-------------------------------------------- m_PtContainer.ReadWorkFile(LabVecRang); } #endif #if 1 //拷贝构造函数 CObjBase::CObjBase(CObjBase &rhs) { m_bSelected = rhs.m_bSelected;//是否被选中 m_PtContainer.Load(rhs.m_PtContainer);//坐标数据的容器 m_NodePtContainer.Load(rhs.m_NodePtContainer); m_PenNum = rhs.m_PenNum; m_bLocked = rhs.m_bLocked; m_bDraw = rhs.m_bDraw;//是否绘制 m_bOffsetAreaRect = rhs.m_bOffsetAreaRect;//是否为偏移调整区域对象 } //复制rhs 的数据点 void CObjBase::CopyPt(CObjBase &rhs) { m_PtContainer.Load(rhs.m_PtContainer); } #endif #if 1 void CObjBase::Draw(CDC* pDC,CPen &Pen) { if(!m_bDraw) return; //图形数据 m_PtContainer.Draw(pDC,Pen); //节点 if(IsSelected()) { m_PtContainer.DrawNode(pDC); } //填充线 DrawFill(pDC,Pen); } void CObjBase::Draw(CDC* pDC) { if(!m_bDraw) return; CPen Pen; Pen.CreatePen(PS_INSIDEFRAME,0.5,gMarkParMgr->GetPenColor(m_PenNum)); Draw(pDC,Pen); } //绘制最后一个线段 void CObjBase::DrawLastLine(CDC* pDC,CPen &Pen) { if(!m_bDraw) return; m_PtContainer.DrawLastLine(pDC,Pen); } #endif //添加一个数据点 void CObjBase::AddDataPoint(CDataPoint pt) { m_PtContainer.AddDataPoint(pt); } //添加额外用于捕获的点 void CObjBase::AddNodePt(CDataPoint pt) { m_NodePtContainer.AddDataPoint(pt); } bool CObjBase::Empty() { return (m_PtContainer.GetPtCnt()<2) ; } void CObjBase::DelAllPt()//删除所有数据点 { m_PtContainer.DelAllPt(); m_NodePtContainer.DelAllPt(); } //获取点的个数 int CObjBase::GetPtCnt() { return m_PtContainer.GetPtCnt(); } void CObjBase::DelLastDataPoint()//删除最后一个节点 { m_PtContainer.DelLastDataPoint(); } int CObjBase::GetNodePtIdx(Dbxy pt) { return m_PtContainer.GetNodePtIdx(pt); } void CObjBase::DelNodePtByIdx(int idx) { m_PtContainer.DelNodePtByIdx(idx); } void CObjBase::SetNodePtByIdx(int idx,Dbxy pt) { m_PtContainer.SetNodePtByIdx(idx,pt); } void CObjBase::InsertNode(int idx,Dbxy pt) { m_PtContainer.InsertNode(idx,pt); } void CObjBase::SetLastPoint(CDataPoint &pt) { m_PtContainer.SetLastPoint(pt); } bool CObjBase::IsSelected() { return m_bSelected; } void CObjBase::SetSelected(bool bSelected) { if(m_bLocked)//锁定状态不能被选中 return; m_bSelected = bSelected; } DbRect CObjBase::GetRect() { return m_PtContainer.GetRect(); } Dbxy CObjBase::GetFirstPt() { return m_PtContainer.GetFirstPt(); } Dbxy CObjBase::GetLastPt() { return m_PtContainer.GetLastPt(); } //是否有节点在rect 内 bool CObjBase::HasNodeInRect(DbRect rect) { return m_PtContainer.HasNodeInRect(rect); } //是否和line 相交 bool CObjBase::IntersectWithLine(DbLine &line) { return m_PtContainer.IntersectWithLine(line); } #if 1 void CObjBase::Operate(SObjOperatePar &par) { m_GeometryPorp.Operate(par);//记录几何属性 m_PtContainer.Operate(par);//数据点 m_NodePtContainer.Operate(par);//节点 OperateFill(par);//填充 } #endif #if 1//捕获相关函数 //获取obj 和rect 相交的线段(bGetCatchNode 表示是否获得额外的捕捉点) void CObjBase::GetLineInRect(DbRect &rect,vector &DataPtLineVec,bool bGetCatchNode) { m_PtContainer.GetLineInRect(rect,DataPtLineVec); if(bGetCatchNode) { m_NodePtContainer.GetNodePtLineInRect(rect,DataPtLineVec); } } #endif #if 1 //搜集obj 点的数据到vec 中 void CObjBase::GetPtData(vector> &vec) { m_PtContainer.GetPtData(vec); //填充数据 #if 0 vector::iterator iter = m_FillDataVec.begin(); vector::iterator iter_end = m_FillDataVec.end(); for(;iter!=iter_end;iter++) { (*iter).GetPtData(vec); } #endif } #endif #if 1//填充相关函数 //创建填充数据 void CObjBase::CreatFillData(SFillPar FillPar) { m_FillDataVec.clear(); if(!FillPar.bFill) return; //搜集obj 点的数据到vec 中 vector> vec; GetPtData(vec); //创建填充 CObjFill Fill(m_FillDataVec); Fill.SetPar(FillPar); Fill.CreatFill(vec,GetRect()); } void CObjBase::DrawFill(CDC* pDC,CPen &Pen) { vector::iterator iter = m_FillDataVec.begin(); vector::iterator iter_end = m_FillDataVec.end(); for(;iter!=iter_end;iter++) { (*iter).Draw(pDC,Pen); } } //操作填充 void CObjBase::OperateFill(SObjOperatePar &par) { vector::iterator iter = m_FillDataVec.begin(); vector::iterator iter_end = m_FillDataVec.end(); for(;iter!=iter_end;iter++) { (*iter).Operate(par); } } //获取填充数据 void CObjBase::GetFillData(vector> &vec) { //填充数据 vector::iterator iter = m_FillDataVec.begin(); vector::iterator iter_end = m_FillDataVec.end(); for(;iter!=iter_end;iter++) { (*iter).GetPtData(vec); } } #endif #if 1 //创建同心数据 void CObjBase::CreatConcentricData(vector &GapVec) { vector> vec; double FirstGap = gCommonFlowMgr->GetFirstGap(); double bChangeSize = !IsDbEqualZero(FirstGap); if(bChangeSize)//拉伸 { vector DataPointVec = GetConcentricData(FirstGap); m_PtContainer.DelAllPt(); AddDataPointVec(DataPointVec); } if(GapVec.empty()) return; double Gap = GapVec[0]; double CurGap = Gap; vector::iterator iter = GapVec.begin(); vector::iterator iter_end = GapVec.end(); for(;iter!=iter_end;iter++) { vector DataPointVec = GetConcentricData(CurGap); vec.push_back(DataPointVec); CurGap += Gap; } { vector>::iterator iter = vec.begin(); vector>::iterator iter_end = vec.end(); for(;iter!=iter_end;iter++) { AddDataPointVec(*iter); } } } void CObjBase::AddDataPointVec(vector &Vec) { vector &DataPointVec = GetPtContainer(); vector::iterator iter = Vec.begin(); vector::iterator iter_end = Vec.end(); for(;iter!=iter_end;iter++) { DataPointVec.push_back(*iter); } } //根据实际加工尺寸来调整obj的尺寸DN cut 2016-09-18 Dbxy CObjBase::GetSizeAdjust2() { double Rang = 40; Dbxy SizeAdjust2(0.013,-0.012); Dbxy CenterPt = GetRect().GetCenterPt(); SizeAdjust2.x = SizeAdjust2.x *(CenterPt.x/Rang); SizeAdjust2.y = SizeAdjust2.y *(CenterPt.x/Rang); return SizeAdjust2; } //obj 缩放 vector CObjBase::GetConcentricData(double Gap) { DbRect rect = GetRect(); Dbxy SizeAdjust = gCommonFlowMgr->GetAdjustSize(); #if 0//dn cut 2016-09-18 Dbxy SizeAdjust2 = GetSizeAdjust2(); SizeAdjust.x += SizeAdjust2.x; SizeAdjust.y += SizeAdjust2.y; #endif SObjOperatePar parX; parX.OpType = _OP_STRETCH; parX.BasePt = rect.GetCenterPt(); parX.OldSize = rect.GetSize().w; parX.Diff = SizeAdjust.x; parX.xy = _X; SObjOperatePar parY; parY.OpType = _OP_STRETCH; parY.BasePt = rect.GetCenterPt(); parY.OldSize = rect.GetSize().h; parY.Diff = SizeAdjust.y; parY.xy = _Y; vector DataPointVec = GetPtContainer();//复制数据 vector::iterator iter = DataPointVec.begin(); vector::iterator iter_end = DataPointVec.end(); for(;iter!=iter_end;iter++) { (*iter).Operate(parX); (*iter).Operate(parY); } return DataPointVec; } #endif