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.

434 lines
9.8 KiB
C++

#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;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD>򱨴<EFBFBD>
}
CLayer::~CLayer(void)
{
}
#if 1
void CLayer::Serialize(CArchive& ar)
{
// m_ObjContainer->Serialize(ar);
}
CLayer &CLayer::Instance()
{
return m_Instance;
}
//<2F>󶨵<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ObjContainer
void CLayer::BindObjContainer(CObjContainer &Container)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ༭״̬
gCommandMgr.Reset();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ClearTmpObj();
//<2F><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>
m_ObjContainer = &Container;
#ifdef __DLG_PANE_OBJ_LIST__
//<2F><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󶨵<EFBFBD><F3B6A8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
GetFrame()->m_DlgObjList.BindObjContainer(m_ObjContainer);
#endif
}
#endif
#if 1
void CLayer::Draw(CDC* pDC)
{
if(gMarkAreaMgr->IsbShowReadDate())
return;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>obj
DrawAllObj(pDC);
}
void CLayer::DrawAllObj(CDC* pDC)
{
m_ObjContainer->DrawAllObj(pDC);
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ҲҪ<D2B2><D2AA><EFBFBD><EFBFBD>
m_TmpObjContainer.DrawAllObj(pDC);
}
//<2F>ػ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
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<CObjBase> p)
{
m_ObjContainer->AddObject(p);
}
void CLayer::AddObject(CObjContainer &ObjContainer)
{
vector<Sptr<CObjBase>> &vec = ObjContainer.GetObjVec();
vector<Sptr<CObjBase>>::iterator iter = vec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = vec.end();
for(;iter!=iter_end;iter++)
{
if((*iter).IsNull()==false)
{
(*iter)->SetSelected(false);
AddObject((*iter));
}
}
}
//ɾ<><C9BE>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>
void CLayer::DelSelObj()
{
m_ObjContainer->DelSelObj();
}
//ɾ<><C9BE>ObjContainer <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>obj
void CLayer::DelObj(CObjContainer &ObjContainer)
{
vector<Sptr<CObjBase>> &vec = ObjContainer.GetObjVec();
vector<Sptr<CObjBase>>::iterator iter = vec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = vec.end();
for(;iter!=iter_end;iter++)
{
if((*iter).IsNull()==false)
{
DelObj((*iter));
}
}
}
//ɾ<><C9BE>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>obj
void CLayer::DelObj(Sptr<CObjBase> 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);
}
//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĶ<DAB5><C4B6><EFBFBD>(bNeedAllIn <20><>ʾ<EFBFBD><CABE>Ҫ<EFBFBD><D2AA>rect <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
bool CLayer::SelObjectInRect(DbRect rect,bool bNeedAllIn)
{
bool ret =false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>֮ǰ<D6AE><C7B0>ѡ<EFBFBD><D1A1>
if(!gDraw->IsbMultipleSel())
{
SelAllObj();
RevSelAllObj();
}
if(gDraw->IsEditLayerObj())//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(m_ObjContainer->SelObjectInRect(rect,bNeedAllIn))
{
gEasyOperationMgr->Refresh();
ret = true;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
DbRect OffsetRect;
if(m_ObjContainer->GetSelOffsetRect(OffsetRect))
{
gObjComponentMgr->NotSelAllObj();
rect = OffsetRect;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
if(gObjComponentMgr->SelObjectInRect(rect))
{
ret = true;
}
return ret;
}
//<2F><>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>rect <20><>obj
Sptr<CObjBase> CLayer::GetFirstObjInRect(DbRect &rect)
{
return m_ObjContainer->GetFirstObjInRect(rect);
}
Sptr<CObjBase> CLayer::GetFirstNodeObjInRect(DbRect &rect)
{
return m_ObjContainer->GetFirstNodeObjInRect(rect);
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>obj
bool CLayer::HasObjSel()
{
return m_ObjContainer->HasObjSel();
}
//ȫѡ
void CLayer::SelAllObj()
{
m_ObjContainer->SelAllObj();
gEasyOperationMgr->Refresh();
//Ԫ<><D4AA>
gObjComponentMgr->SelAllObj();
}
//ȫ<><C8AB>ѡ
void CLayer::NotSelAllObj()
{
m_ObjContainer->NotSelAllObj();
//Ԫ<><D4AA>
gObjComponentMgr->NotSelAllObj();
gEasyOperationMgr->Refresh();
}
//<2F><>ѡ
void CLayer::RevSelAllObj()
{
m_ObjContainer->RevSelAllObj();
gEasyOperationMgr->Refresh();
//Ԫ<><D4AA>
gObjComponentMgr->RevSelAllObj();
}
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>obj
void CLayer::DelAllObj()
{
SelAllObj();
DelSelObj();
}
//<2F>жϵ<D0B6>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>
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();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>Բ)
CMFCPropertyGridProperty *CLayer::CreatSpecialGridProperty(CModule *pModule)
{
return m_ObjContainer->CreatSpecialGridProperty(pModule);
}
//<2F><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Եı
void CLayer::OnSpecialPropertyChanged()
{
m_ObjContainer->OnSpecialPropertyChanged();
}
#endif
#if 1
//<2F><><EFBFBD><EFBFBD>obj
void CLayer::OperateObj(SObjOperatePar &par,bool bAll)
{
m_ObjContainer->OperateObj(par,bAll);
}
//<2F>ƶ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>obj (bAddUndoΪ<6F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EBB3B7>ָ<EFBFBD><D6B8>)
void CLayer::OnMove(double MoveX,double MoveY,bool bAddUndo)
{
if(HasObjSel())
{
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
CCommandMove *p = new CCommandMove;
SObjOperatePar par;
par.OpType = _OP_MOVE;
par.MoveX = MoveX;
par.MoveY = MoveY;
p->SetOperatePar(par);
//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
if(bAddUndo)
gCommandMgr.AddUndoCommand(p);
//ִ<><D6B4>ָ<EFBFBD><D6B8>
p->Excute();
}
}
//<2F><>Ӧָ<D3A6><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CLayer::OnRotato(double Angle)
{
Dbxy pt = GetSelObjRect().GetCenterPt();
//obj <20><><EFBFBD><EFBFBD>
SObjOperatePar par;
par.OpType = _OP_ROTATO;
par.BasePt = pt;
par.Angle = Angle;
//<2F><><EFBFBD><EFBFBD>undo <20>õ<EFBFBD>ָ<EFBFBD><D6B8>-----start
CCommandRotato *p = new CCommandRotato;
p->SetOperatePar(par);
gCommandMgr.AddUndoCommand(p);
p->Excute();
//<2F><><EFBFBD><EFBFBD>undo <20>õ<EFBFBD>ָ<EFBFBD><D6B8>-----end
}
//<2F><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CLayer::OnMirror(X_OR_Y xy)
{
Dbxy pt = GetSelObjRect().GetCenterPt();
//obj <20><><EFBFBD><EFBFBD>
SObjOperatePar par;
par.OpType = _OP_MIRROR;
par.BasePt = pt;
par.xy = xy;
//<2F><><EFBFBD><EFBFBD>undo <20>õ<EFBFBD>ָ<EFBFBD><D6B8>-----start
CCommandMirror *p = new CCommandMirror;
p->SetOperatePar(par);
gCommandMgr.AddUndoCommand(p);
p->Excute();
}
//<2F><>ת<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>˳<EFBFBD><CBB3>
void CLayer::OnReverseSelObj()
{
//obj <20><><EFBFBD><EFBFBD>
SObjOperatePar par;
par.OpType = _OP_REVERSE;
//<2F><><EFBFBD><EFBFBD>undo <20>õ<EFBFBD>ָ<EFBFBD><D6B8>-----start
CCommandReverse *p = new CCommandReverse;
p->SetOperatePar(par);
gCommandMgr.AddUndoCommand(p);
p->Excute();
}
//<2F>ϲ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
bool CLayer::OnJoin()
{
CObjBase *p = m_ObjContainer->JoinSelObj();
if(p)//<2F>ϲ<EFBFBD><CFB2>ɹ<EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>-----------------------------
CCommandJion *pCmd = new CCommandJion;
gCommandMgr.AddUndoCommand(pCmd);
Sptr<CObjBase> pObj(p);
pCmd->AddOpObj(pObj);
pObj->SetSelected(true);//<2F>ϲ<EFBFBD><CFB2><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊѡ<CEAA><D1A1>״̬
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>obj
DelSelObj();
//<2F><><EFBFBD>Ӻϲ<D3BA><CFB2><EFBFBD><EFBFBD><EFBFBD>obj
AddObject(pObj);
return true;
}
return false;
}
//<2F>ֽ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
void CLayer::OnExplode()
{
}
#endif
#if 1//<2F><>׽
void CLayer::AddTmpObject(Sptr<CObjBase> p)
{
m_TmpObjContainer.AddObject(p);
}
void CLayer::ClearTmpObj()
{
m_TmpObjContainer.Clear();
}
//<2F><>ȡrect <20><>Χ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶α<DFB6><CEB1>浽DataPtLineVec <20><>
void CLayer::GetLineInRect(DbRect &rect,vector<DbLine> &DataPtLineVec,bool bCatchTemp)
{
m_ObjContainer->GetLineInRect(rect,DataPtLineVec,bCatchTemp);
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
if(bCatchTemp)
{
vector<Sptr<CObjBase>> &vec = m_TmpObjContainer.GetObjVec();
vector<Sptr<CObjBase>>::iterator iter = vec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = vec.end();
for(;iter!=iter_end;iter++)
{
if((iter+1)!=vec.end())//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
{
(*iter)->GetLineInRect(rect,DataPtLineVec);
}
}
}
}
//<2F>ж<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rect <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>offset <20><>
bool CLayer::IsOffsetRect(DbRect rect)
{
if(rect.Width()>10 || rect.Height()>10)
{
return true;
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1>line <20><EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD>㵽PointVec <20><>
void CLayer::GetIntersectPoint(DbLine &line,vector<Dbxy> &PointVec)
{
m_ObjContainer->GetIntersectPoint(line,PointVec);
}
bool CLayer::HasObjIntersectWithLine(DbLine &line)
{
return m_ObjContainer->HasObjIntersectWithLine(line);
}
//<2F><>¡<EFBFBD><C2A1>ǰѡ<C7B0><D1A1><EFBFBD><EFBFBD>obj <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Vec <20><>
void CLayer::CloneObj(CObjContainer &ObjContainer,bool bNeedSel)
{
m_ObjContainer->CloneObj(ObjContainer,bNeedSel);
}
#endif
#if 1//group <20><><EFBFBD><EFBFBD>
//<2F><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>group <20><><EFBFBD><EFBFBD><EFBFBD>󶨵<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĶԻ<C4B6><D4BB><EFBFBD><EFBFBD><EFBFBD>
void CLayer::BindingSelObjToDlg()
{
//<2F>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD>
GetFrame()->UnBindingDlg();
m_ObjContainer->BindingDlg();
}
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
void CLayer::FillObj(SFillPar FillPar,bool bNeedSel)
{
m_ObjContainer->FillObj(FillPar,bNeedSel);
}
#endif
#if 1
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
void CLayer::GetAllPointObjPt(vector<Dbxy> &PtVec)
{
m_ObjContainer->GetAllPointObjPt(PtVec);
}
//<2F><><EFBFBD><EFBFBD>obj <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
void CLayer::UpdateRectObjOffset()
{
vector<COffsetRect> OffsetRectVec;
//<2F>ռ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<Sptr<CObjBase>> &vec = m_ObjContainer->GetObjVec();
vector<Sptr<CObjBase>>::iterator iter = vec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = vec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsbOffsetAreaRect())
{
COffsetRect OffsetRect;
OffsetRectVec.push_back(OffsetRect);
}
}
}
#endif