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++
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;//避免初始化的时候报错
|
|
}
|
|
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<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));
|
|
}
|
|
}
|
|
}
|
|
//删除选择项
|
|
void CLayer::DelSelObj()
|
|
{
|
|
m_ObjContainer->DelSelObj();
|
|
}
|
|
//删除ObjContainer 中指定的所有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));
|
|
}
|
|
}
|
|
}
|
|
//删除指定的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);
|
|
}
|
|
//选择矩形区域内的对象(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<CObjBase> CLayer::GetFirstObjInRect(DbRect &rect)
|
|
{
|
|
return m_ObjContainer->GetFirstObjInRect(rect);
|
|
}
|
|
Sptr<CObjBase> 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<CObjBase> 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<CObjBase> p)
|
|
{
|
|
m_TmpObjContainer.AddObject(p);
|
|
}
|
|
void CLayer::ClearTmpObj()
|
|
{
|
|
m_TmpObjContainer.Clear();
|
|
}
|
|
//获取rect 范围内的所有线段保存到DataPtLineVec 中
|
|
void CLayer::GetLineInRect(DbRect &rect,vector<DbLine> &DataPtLineVec,bool bCatchTemp)
|
|
{
|
|
m_ObjContainer->GetLineInRect(rect,DataPtLineVec,bCatchTemp);
|
|
//临时对象
|
|
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())//不要捕获最后一个临时点
|
|
{
|
|
(*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<Dbxy> &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<Dbxy> &PtVec)
|
|
{
|
|
m_ObjContainer->GetAllPointObjPt(PtVec);
|
|
}
|
|
//更新obj 的区域偏移
|
|
void CLayer::UpdateRectObjOffset()
|
|
{
|
|
vector<COffsetRect> OffsetRectVec;
|
|
//收集偏移区域
|
|
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
|