#include "StdAfx.h" #include "SequentialPoint.h" #include "GlobalFunction.h" #include "GlobalDrawMgr.h" #include "DrawSimpleShape.h" #include "WorkFileLable.h" #include "WorkFileMgr.h" #include "LogMgr.h" CSequentialPoint::CSequentialPoint(void) { } CSequentialPoint::~CSequentialPoint(void) { } #if 1 void CSequentialPoint::WriteWorkFile(vector &LabVec) { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { LabVec.push_back(CLab(LAB_POINT_START));//数据点开始 Dbxy pt = (*iter).GetPt(); LabVec.push_back(CLab(LAB_POINT_X,pt.x)); LabVec.push_back(CLab(LAB_POINT_Y,pt.y)); LabVec.push_back(CLab(LAB_POINT_IS_NODE,(*iter).IsNode()));//是否为节点 LabVec.push_back(CLab(LAB_POINT_END));//数据点结束 } } void CSequentialPoint::ReadWorkFile(CLabVecRang &LabVecRang) { //分离数据点--------------------------------------------------- vector LabVecRangVec; CWorkFileMgr WorkFileMgr; WorkFileMgr.SeparateStrVec(LabVecRang,LabVecRangVec,LAB_POINT_START,LAB_POINT_END); //处理每个点 if(!LabVecRangVec.empty()) { vector::iterator iter = LabVecRangVec.begin(); vector::iterator iter_end = LabVecRangVec.end(); for(;iter!=iter_end;iter++) { Dbxy pt; bool bIsNode; {//X坐标 CLab Lab = WorkFileMgr.FindLab((*iter),LAB_POINT_X); if(Lab.m_ValType != _TYPE_NULL) { pt.x = Lab.m_Double; } } {//Y坐标 CLab Lab = WorkFileMgr.FindLab((*iter),LAB_POINT_Y); if(Lab.m_ValType != _TYPE_NULL) { pt.y = Lab.m_Double; } } {//是否为NODE 点 CLab Lab = WorkFileMgr.FindLab((*iter),LAB_POINT_IS_NODE); if(Lab.m_ValType != _TYPE_NULL) { bIsNode = Lab.m_Bool; } } CDataPoint DataPoint(pt); DataPoint.SetIsNode(bIsNode); AddDataPoint(DataPoint); } } } #endif #if 1 void CSequentialPoint::AddDataPoint(CDataPoint DataPt) { m_PtContainer.push_back(DataPt); } //导入另一个容器的数据 void CSequentialPoint::Load(CSequentialPoint &rhs) { vector::iterator iter = rhs.m_PtContainer.begin(); vector::iterator iter_end = rhs.m_PtContainer.end(); for(;iter!=iter_end;iter++) { m_PtContainer.push_back(*iter); } } bool CSequentialPoint::Empty()//是否有数据点 { return m_PtContainer.empty(); }; void CSequentialPoint::DelAllPt()//删除所有数据点 { m_PtContainer.clear(); }; void CSequentialPoint::DelLastDataPoint()//删除最后一个节点 { if(!Empty()) { m_PtContainer.pop_back(); } } //设置最后一个节点 void CSequentialPoint::SetLastPoint(CDataPoint &pt) { if(!Empty()) { CDataPoint &LastPt = m_PtContainer[m_PtContainer.size()-1]; LastPt = pt; } } //使用时需要保证m_Container 非空 Dbxy CSequentialPoint::GetFirstPt() { return m_PtContainer[0].GetPt(); } //使用时需要保证m_Container 非空 Dbxy CSequentialPoint::GetLastPt() { return m_PtContainer[m_PtContainer.size()-1].GetPt(); } //获取node 点的序号 int CSequentialPoint::GetNodePtIdx(Dbxy pt) { int idx = -1; int size = m_PtContainer.size(); for(int i=0;i::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); int i=0; for(;iter!=iter_end;iter++) { if(i==idx && (*iter).IsNode()) { m_PtContainer.erase(iter); break; } i++; } } //设置idx 对应的node 点的值为pt void CSequentialPoint::SetNodePtByIdx(int idx,Dbxy pt) { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); int i=0; for(;iter!=iter_end;iter++) { if(i==idx && (*iter).IsNode()) { (*iter).SetPt(pt); break; } i++; } } void CSequentialPoint::InsertNode(int idx,Dbxy pt) { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); int i=0; for(;iter!=iter_end;iter++) { if(i==idx) { CDataPoint DataPoint(pt); DataPoint.SetIsNode(true); m_PtContainer.insert(iter,DataPoint); break; } i++; } } #endif #if 1 //是否在矩形区域内 bool CSequentialPoint::IsInRect(DbRect rect,bool bNeedAllIn) { //检查所有线段 { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { if(iter != m_PtContainer.begin()) { Dbxy pt1 = (*(iter-1)).GetPt(); Dbxy pt2 = (*iter).GetPt(); if(bNeedAllIn)//需要全部在矩形范围内 { if(!IsPointInRect(pt1,rect)||!IsPointInRect(pt2,rect)) { return false; } } else //(挂到边也算) { if(IsLineInRect(pt1,pt2,rect)) return true; } } } } if(bNeedAllIn) return true; else return false; } //获取边界矩形 DbRect CSequentialPoint::GetRect() { DbRect rect; vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { AdjustRectByPoint(rect,(*iter).GetPt()); } return rect; } //是否有节点在rect 中 bool CSequentialPoint::HasNodeInRect(DbRect rect) { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { if((*iter).IsNode()&&IsPointInRect((*iter).GetPt(),rect)) { return true; } } return false; } #endif #if 1 void CSequentialPoint::Operate(SObjOperatePar par) { if(par.OpType == _OP_REVERSE) { //反转节点 Reverse(); } else { OperateExt(par); } } void CSequentialPoint::OperateExt(SObjOperatePar par) { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { (*iter).Operate(par); } } //反转节点 void CSequentialPoint::Reverse() { //先保存起来 vector vec; vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { vec.push_back((*iter)); } //清空 m_PtContainer.clear(); //逆向倒回 int size = vec.size(); for(int i=size-1;i>=0;i--) { m_PtContainer.push_back(vec[i]); } } #endif #if 1//绘制 //绘制连续线段 void CSequentialPoint::DrawDataPointVec(CDC* pDC,vector &vec) { if(vec.size()>1)//最少两个点起绘 { //绘制每条线段 vector::iterator iter = vec.begin(); vector::iterator iter_end = vec.end(); for(;iter!=iter_end;iter++) { CDataPoint &DataPt = (*iter); CPoint pt = DataPt.GetDevicePt(); if(iter == vec.begin()) { pDC->MoveTo(pt.x,pt.y); } else { pDC->LineTo(pt.x,pt.y); } } } } void CSequentialPoint::Draw(CDC* pDC,CPen&Pen) { CPen *pOldPen; pOldPen = pDC->SelectObject(&Pen); //绘制连续线段 DrawDataPointVec(pDC,m_PtContainer); pDC->SelectObject(pOldPen); } //绘制最后一条线段 void CSequentialPoint::DrawLastLine(CDC* pDC,CPen &Pen) { CPen *pOldPen; pOldPen = pDC->SelectObject(&Pen); if(!Empty()) { vector &vec = m_PtContainer; int size = vec.size(); if(size>=2) { CPoint pt1 = vec[size-2].GetDevicePt(); pDC->MoveTo(pt1.x,pt1.y); CPoint pt2 = vec[size-1].GetDevicePt(); pDC->LineTo(pt2.x,pt2.y); } } pDC->SelectObject(pOldPen); } //绘制节点 void CSequentialPoint::DrawNode(CDC* pDC) { int size = m_PtContainer.size(); for(int i=0;iGetObjFirstNodeColor(),gDraw->GetCurPointRect(m_PtContainer[i].GetPt())); } else { DrawSolidRect(pDC,gDraw->GetObjNodeColor(),gDraw->GetCurPointRect(m_PtContainer[i].GetPt())); } } } } #endif #if 1 void CSequentialPoint::GetLineInRect(DbRect &rect,vector &DataPtLineVec) { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { if(iter != m_PtContainer.begin()) { Dbxy pt1 = (*(iter-1)).GetPt(); Dbxy pt2 = (*iter).GetPt(); if(IsLineInRect(pt1,pt2,rect)) { DataPtLineVec.push_back(DbLine((*(iter-1)),(*iter))); } } } } //获取捕获结点的线段 void CSequentialPoint::GetNodePtLineInRect(DbRect &rect,vector &DataPtLineVec) { vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { Dbxy pt1 = (*iter).GetPt(); Dbxy pt2 = (*iter).GetPt(); if(IsLineInRect(pt1,pt2,rect)) { DataPtLineVec.push_back(DbLine((*iter),(*iter))); } } } #endif //搜集点的数据到vec (如果和上一段是连接的则连上) (PenNum为笔号) void CSequentialPoint::GetPtData(vector> &vec,int PenNum) { bool bhasLastPt = false;//是否有最后一个点 Dbxy LastPt; //获取之前的最后一个点 int size = vec.size(); if(size>0) { if(vec[size-1].empty()==false) { int size1 = vec[size-1].size(); LastPt = vec[size-1][size1-1]; bhasLastPt = true; } } vector VecTmp; bool bNeedConnect = false;//是否需要连接 vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { if(iter == m_PtContainer.begin() && bhasLastPt)//判断是否连接 { if((*iter).GetPt() == LastPt) { bNeedConnect = true; } } Dbxy pt = (*iter).GetPt(); pt.PenNum = PenNum;//设置点所在的笔号 VecTmp.push_back(pt); } if(!VecTmp.empty()) { #if 0//不要将数据连起来 if(bNeedConnect) { vector::iterator iter = VecTmp.begin(); vector::iterator iter_end = VecTmp.end(); for(;iter!=iter_end;iter++) { vec[size-1].push_back(*iter); } } else #endif { vec.push_back(VecTmp); } } } //是否和line 相交 bool CSequentialPoint::IntersectWithLine(DbLine &line) { Dbxy pt1 = line.GetPt1(); Dbxy pt2 = line.GetPt2(); vector::iterator iter = m_PtContainer.begin(); vector::iterator iter_end = m_PtContainer.end(); for(;iter!=iter_end;iter++) { if(iter != m_PtContainer.begin()) { if(IsTwoLineIntersect(pt1,pt2,(*(iter-1)).GetPt(),(*iter).GetPt())) { return true; } } } return false; }