#include "StdAfx.h" #include "Layer.h" #include "LogMgr.h" #include "GlobalDrawMgr.h" #include "LaiPuLaserView.h" #include "GlobalFunction.h" #include "CommandRotato.h" #include "CommandMirror.h" #include "CommandMove.h" #include "CommandReverse.h" #include "CommandJion.h" #include "CommandMgr.h" #include "EasyOperationMgr.h" #include "ObjComponentMgr.h" #include "MarkAreaMgr.h" CLayer CLayer::m_Instance; CLayer::CLayer(void) { m_ObjContainer = &m_TmpObjContainer;//避免初始化的时候报错 } CLayer::~CLayer(void) { } #if 1 void CLayer::Serialize(CArchive& ar) { // m_ObjContainer->Serialize(ar); } CLayer &CLayer::Instance() { return m_Instance; } //绑定当前操作的ObjContainer void CLayer::BindObjContainer(CObjContainer &Container) { //清除现在编辑状态 gCommandMgr.Reset(); //清空临时对象容器 ClearTmpObj(); //绑定新的容器 m_ObjContainer = &Container; #ifdef __DLG_PANE_OBJ_LIST__ //将新的容器绑定到对象列表 GetFrame()->m_DlgObjList.BindObjContainer(m_ObjContainer); #endif } #endif #if 1 void CLayer::Draw(CDC* pDC) { if(gMarkAreaMgr->IsbShowReadDate()) return; //绘制所有obj DrawAllObj(pDC); } void CLayer::DrawAllObj(CDC* pDC) { m_ObjContainer->DrawAllObj(pDC); //临时对象也要绘制 m_TmpObjContainer.DrawAllObj(pDC); } //重绘选择的图形 void CLayer::XorRedrawObj(CDC* pDC,bool bNeedSel) { m_ObjContainer->XorRedrawObj(pDC,bNeedSel); } #endif #if 1 void CLayer::AddObject(CObjBase *pMarkObject) { m_ObjContainer->AddObject(pMarkObject); } void CLayer::AddObject(Sptr p) { m_ObjContainer->AddObject(p); } void CLayer::AddObject(CObjContainer &ObjContainer) { vector> &vec = ObjContainer.GetObjVec(); vector>::iterator iter = vec.begin(); vector>::iterator iter_end = vec.end(); for(;iter!=iter_end;iter++) { if((*iter).IsNull()==false) { (*iter)->SetSelected(false); AddObject((*iter)); } } } //删除选择项 void CLayer::DelSelObj() { m_ObjContainer->DelSelObj(); } //删除ObjContainer 中指定的所有obj void CLayer::DelObj(CObjContainer &ObjContainer) { vector> &vec = ObjContainer.GetObjVec(); vector>::iterator iter = vec.begin(); vector>::iterator iter_end = vec.end(); for(;iter!=iter_end;iter++) { if((*iter).IsNull()==false) { DelObj((*iter)); } } } //删除指定的obj void CLayer::DelObj(Sptr p) { m_ObjContainer->DelObj(p); } #endif #if 1 bool CLayer::HasSelObjectInRect(DbRect rect) { return m_ObjContainer->HasSelObjectInRect(rect); } bool CLayer::HasSelNodeInRect(DbRect rect) { return m_ObjContainer->HasSelNodeInRect(rect); } bool CLayer::HasObjectInRect(DbRect rect) { return m_ObjContainer->HasObjectInRect(rect); } //选择矩形区域内的对象(bNeedAllIn 表示需要在rect 里面才算) bool CLayer::SelObjectInRect(DbRect rect,bool bNeedAllIn) { bool ret =false; //不允许多选的时候先取消之前的选择 if(!gDraw->IsbMultipleSel()) { SelAllObj(); RevSelAllObj(); } if(gDraw->IsEditLayerObj())//是否允许编辑 { if(m_ObjContainer->SelObjectInRect(rect,bNeedAllIn)) { gEasyOperationMgr->Refresh(); ret = true; } } //如果有一个偏移区域对象被选中 DbRect OffsetRect; if(m_ObjContainer->GetSelOffsetRect(OffsetRect)) { gObjComponentMgr->NotSelAllObj(); rect = OffsetRect; } //在这里同时处理元件对象的选择 if(gObjComponentMgr->SelObjectInRect(rect)) { ret = true; } return ret; } //获取第一个在rect 的obj Sptr CLayer::GetFirstObjInRect(DbRect &rect) { return m_ObjContainer->GetFirstObjInRect(rect); } Sptr CLayer::GetFirstNodeObjInRect(DbRect &rect) { return m_ObjContainer->GetFirstNodeObjInRect(rect); } //是否有选择的obj bool CLayer::HasObjSel() { return m_ObjContainer->HasObjSel(); } //全选 void CLayer::SelAllObj() { m_ObjContainer->SelAllObj(); gEasyOperationMgr->Refresh(); //元件 gObjComponentMgr->SelAllObj(); } //全不选 void CLayer::NotSelAllObj() { m_ObjContainer->NotSelAllObj(); //元件 gObjComponentMgr->NotSelAllObj(); gEasyOperationMgr->Refresh(); } //反选 void CLayer::RevSelAllObj() { m_ObjContainer->RevSelAllObj(); gEasyOperationMgr->Refresh(); //元件 gObjComponentMgr->RevSelAllObj(); } //删除所有的obj void CLayer::DelAllObj() { SelAllObj(); DelSelObj(); } //判断当前鼠标工具的类型 MOUSE_TOOL CLayer::JudgeMouseToolType(Dbxy pt) { MOUSE_TOOL type = _TOOL_POINT; DbRect rect = gDraw->GetCurPointRect(pt); if(HasSelNodeInRect(rect)) { type = _TOOL_MOVE_NODE; } else if(HasSelObjectInRect(rect)) { type = _TOOL_MOVE; } return type; } DbRect CLayer::GetSelObjRect() { return m_ObjContainer->GetSelObjRect(); } //创建特殊对象属性(比如圆) CMFCPropertyGridProperty *CLayer::CreatSpecialGridProperty(CModule *pModule) { return m_ObjContainer->CreatSpecialGridProperty(pModule); } //相应特殊属性的变化 void CLayer::OnSpecialPropertyChanged() { m_ObjContainer->OnSpecialPropertyChanged(); } #endif #if 1 //操作obj void CLayer::OperateObj(SObjOperatePar &par,bool bAll) { m_ObjContainer->OperateObj(par,bAll); } //移动选择的obj (bAddUndo为是否加入撤销指令) void CLayer::OnMove(double MoveX,double MoveY,bool bAddUndo) { if(HasObjSel()) { //创建指令 CCommandMove *p = new CCommandMove; SObjOperatePar par; par.OpType = _OP_MOVE; par.MoveX = MoveX; par.MoveY = MoveY; p->SetOperatePar(par); //添加到队列 if(bAddUndo) gCommandMgr.AddUndoCommand(p); //执行指令 p->Excute(); } } //响应指定的旋转并处理撤销操作 void CLayer::OnRotato(double Angle) { Dbxy pt = GetSelObjRect().GetCenterPt(); //obj 操作 SObjOperatePar par; par.OpType = _OP_ROTATO; par.BasePt = pt; par.Angle = Angle; //创建undo 用的指令-----start CCommandRotato *p = new CCommandRotato; p->SetOperatePar(par); gCommandMgr.AddUndoCommand(p); p->Excute(); //创建undo 用的指令-----end } //响应镜像操作并处理撤销操作 void CLayer::OnMirror(X_OR_Y xy) { Dbxy pt = GetSelObjRect().GetCenterPt(); //obj 操作 SObjOperatePar par; par.OpType = _OP_MIRROR; par.BasePt = pt; par.xy = xy; //创建undo 用的指令-----start CCommandMirror *p = new CCommandMirror; p->SetOperatePar(par); gCommandMgr.AddUndoCommand(p); p->Excute(); } //反转节点的顺序 void CLayer::OnReverseSelObj() { //obj 操作 SObjOperatePar par; par.OpType = _OP_REVERSE; //创建undo 用的指令-----start CCommandReverse *p = new CCommandReverse; p->SetOperatePar(par); gCommandMgr.AddUndoCommand(p); p->Excute(); } //合并选择的图形 bool CLayer::OnJoin() { CObjBase *p = m_ObjContainer->JoinSelObj(); if(p)//合并成功 { //创建撤销指令----------------------------- CCommandJion *pCmd = new CCommandJion; gCommandMgr.AddUndoCommand(pCmd); Sptr pObj(p); pCmd->AddOpObj(pObj); pObj->SetSelected(true);//合并后默认为选择状态 //删除被合并的obj DelSelObj(); //添加合并后的obj AddObject(pObj); return true; } return false; } //分解选择的图形 void CLayer::OnExplode() { } #endif #if 1//捕捉 void CLayer::AddTmpObject(Sptr p) { m_TmpObjContainer.AddObject(p); } void CLayer::ClearTmpObj() { m_TmpObjContainer.Clear(); } //获取rect 范围内的所有线段保存到DataPtLineVec 中 void CLayer::GetLineInRect(DbRect &rect,vector &DataPtLineVec,bool bCatchTemp) { m_ObjContainer->GetLineInRect(rect,DataPtLineVec,bCatchTemp); //临时对象 if(bCatchTemp) { vector> &vec = m_TmpObjContainer.GetObjVec(); vector>::iterator iter = vec.begin(); vector>::iterator iter_end = vec.end(); for(;iter!=iter_end;iter++) { if((iter+1)!=vec.end())//不要捕获最后一个临时点 { (*iter)->GetLineInRect(rect,DataPtLineVec); } } } } //判断一个矩形rect 是否是用来调整offset 的 bool CLayer::IsOffsetRect(DbRect rect) { if(rect.Width()>10 || rect.Height()>10) { return true; } return false; } //获取和line 相交的所有交点到PointVec 中 void CLayer::GetIntersectPoint(DbLine &line,vector &PointVec) { m_ObjContainer->GetIntersectPoint(line,PointVec); } bool CLayer::HasObjIntersectWithLine(DbLine &line) { return m_ObjContainer->HasObjIntersectWithLine(line); } //克隆当前选择的obj 到容器Vec 中 void CLayer::CloneObj(CObjContainer &ObjContainer,bool bNeedSel) { m_ObjContainer->CloneObj(ObjContainer,bNeedSel); } #endif #if 1//group 操作 //将选择的group 参数绑定到指定的对话框上 void CLayer::BindingSelObjToDlg() { //先撤销所有绑定 GetFrame()->UnBindingDlg(); m_ObjContainer->BindingDlg(); } //填充图形 void CLayer::FillObj(SFillPar FillPar,bool bNeedSel) { m_ObjContainer->FillObj(FillPar,bNeedSel); } #endif #if 1 //提取所有点对象的中心点 void CLayer::GetAllPointObjPt(vector &PtVec) { m_ObjContainer->GetAllPointObjPt(PtVec); } //更新obj 的区域偏移 void CLayer::UpdateRectObjOffset() { vector OffsetRectVec; //收集偏移区域 vector> &vec = m_ObjContainer->GetObjVec(); vector>::iterator iter = vec.begin(); vector>::iterator iter_end = vec.end(); for(;iter!=iter_end;iter++) { if((*iter)->IsbOffsetAreaRect()) { COffsetRect OffsetRect; OffsetRectVec.push_back(OffsetRect); } } } #endif