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.
TwoLaserHead-PushJig/LaiPuLaser/ObjContainer.cpp

915 lines
25 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "StdAfx.h"
#include "ObjContainer.h"
#include "GlobalDrawMgr.h"
#include "GlobalFunction.h"
#include "ObjPLine.h"
#include "ObjFactory.h"
#include "CommandBase.h"
#include "CStringFuc.h"
#include "WorkFileLable.h"
#include "WorkFileMgr.h"
#include "LogMgr.h"
CObjContainer::CObjContainer(void)
{
}
CObjContainer::~CObjContainer(void)
{
}
#if 1
void CObjContainer::WriteWorkFile(vector<CLab> &LabVec)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
LabVec.push_back(CLab(LAB_OBJ_START));
(*iter)->WriteWorkFile(LabVec);
LabVec.push_back(CLab(LAB_OBJ_END));
}
}
void CObjContainer::ReadWorkFile(CLabVecRang &LabVecRang)
{
//分离obj 对象---------------------------------------------------
vector<CLabVecRang> LabVecRangVec;
CWorkFileMgr WorkFileMgr;
WorkFileMgr.SeparateStrVec(LabVecRang,LabVecRangVec,LAB_OBJ_START,LAB_OBJ_END);
//处理每个obj ---------------------------------------------------
if(gDraw->IsbDelOldObj())
Clear();//清空原来的obj
if(!LabVecRangVec.empty())
{
vector<CLabVecRang>::iterator iter = LabVecRangVec.begin();
vector<CLabVecRang>::iterator iter_end = LabVecRangVec.end();
for(;iter!=iter_end;iter++)
{
//获取obj 的类型
CLab ObjType= WorkFileMgr.FindLab((*iter),LAB_OBJ_TYPE);
if(ObjType.m_ValType != _TYPE_NULL)
{
OBJ_TYPE type = (OBJ_TYPE)(ObjType.m_Int);
if(type != _TYPE_BASE)
{
CObjFactory ObjFactory;
CObjBase *p = ObjFactory.CreatObj(type);//恢复obj 的实例
if(p)
{
p->ReadWorkFile(*iter);//恢复数据
AddObject(p);
}
}
}
}
}
}
#endif
#if 1
void CObjContainer::AddObject(CObjBase *pMarkObject)
{
//保存到智能指针
Sptr<CObjBase> sPtr(pMarkObject);
AddObject(sPtr);
}
void CObjContainer::AddObject(Sptr<CObjBase> p)
{
m_ObjVec.push_back(p);
}
//添加点到末尾的obj
void CObjContainer::AddPtToLastObj(CDataPoint pt)
{
if(!m_ObjVec.empty())
{
m_ObjVec[m_ObjVec.size()-1]->AddDataPoint(pt);
}
}
//创建特殊对象属性(比如圆)
CMFCPropertyGridProperty *CObjContainer::CreatSpecialGridProperty(CModule *pModule)
{
if(GetSelObjCnt() == 1)//只有一个对象时才设置
{
return GetFirstSelObj()->CreatSpecialGridProperty(pModule);
}
else
return NULL;
}
//相应特殊属性的变化
void CObjContainer::OnSpecialPropertyChanged()
{
if(GetSelObjCnt() == 1)//只有一个对象时才设置
{
GetFirstSelObj()->OnSpecialPropertyChanged();
}
}
//插入对象列表
void CObjContainer::InsertList(CListCtrl &List)
{
int size = m_ObjVec.size();
for(int i=0;i<size;i++)
{
int idx = 0;
List.InsertItem(i," ");//插入一行
List.SetItemText(i,idx++,Int2CString(i+1));//序号
List.SetItemText(i,idx++,m_ObjVec[i]->GetStr());//类型
}
}
#endif
#if 1//绘制
void CObjContainer::DrawAllObj(CDC* pDC)
{
//绘制所有obj
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected())
{
(*iter)->Draw(pDC,gDraw->GetSelObjectPen());
}
else
{
(*iter)->Draw(pDC);
}
}
}
void CObjContainer::DrawAllObj(CDC* pDC,CPen &Pen)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->Draw(pDC,Pen);
}
}
void CObjContainer::XorRedrawObj(CDC* pDC,bool bNeedSel)
{
int old_rop = pDC->SetROP2(R2_XORPEN);
//绘制所有obj
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(bNeedSel)
{
if((*iter)->IsSelected())
{
(*iter)->Draw(pDC,gDraw->GetSelObjectPen());
}
}
else
{
(*iter)->Draw(pDC,gDraw->GetObjectPen());
}
}
pDC->SetROP2(old_rop);
}
void CObjContainer::XorDrawLastObj(CDC* pDC)
{
if(m_ObjVec.empty()==false)
{
int old_rop = pDC->SetROP2(R2_XORPEN);
m_ObjVec[m_ObjVec.size()-1]->Draw(pDC,gDraw->GetObjectPen());
pDC->SetROP2(old_rop);
}
}
#endif
#if 1
//是否有选择的obj
bool CObjContainer::HasObjSel()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected())
return true;
}
return false;
}
//获取选中obj 的个数
int CObjContainer::GetSelObjCnt()
{
int cnt = 0;
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected())
cnt++;
}
return cnt;
}
bool CObjContainer::HasSelObjectInRect(DbRect rect)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected() && (*iter)->IsInRect(rect,false))
return true;
}
return false;
}
//在鼠标的rect 中是否有选择的节点
bool CObjContainer::HasSelNodeInRect(DbRect rect)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected()&&(*iter)->HasNodeInRect(rect))
{
return true;
}
}
return false;
}
bool CObjContainer::HasObjectInRect(DbRect rect)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsInRect(rect,false))
return true;
}
return false;
}
//获取第一个选择的obj
Sptr<CObjBase> CObjContainer::GetFirstSelObj()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected())
{
return (*iter);
}
}
//错误
Sptr<CObjBase> sp(NULL);
return sp;
}
Sptr<CObjBase> CObjContainer::GetFirstObjInRect(DbRect &rect)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsInRect(rect,false))
{
Sptr<CObjBase> sp(*iter);
return sp;
}
}
//错误
Sptr<CObjBase> sp(NULL);
return sp;
}
Sptr<CObjBase> CObjContainer::GetFirstNodeObjInRect(DbRect &rect)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->HasNodeInRect(rect))
{
Sptr<CObjBase> sp(*iter);
return sp;
}
}
//错误
Sptr<CObjBase> sp(NULL);
return sp;
}
DbRect CObjContainer::GetSelObjRect()
{
DbRect SelObjRect;
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected()==false)
continue;
DbRect rect = (*iter)->GetRect();
if(SelObjRect.IsZero())
{
SelObjRect = rect;
}
else
{
AdjustRectByRect(SelObjRect,rect);
}
}
return SelObjRect;
}
//获取所有Obj 的范围矩形
DbRect CObjContainer::GetObjRect(bool bNeedSel)
{
DbRect ObjRect;
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(bNeedSel && (*iter)->IsSelected()==false)
continue;
DbRect rect = (*iter)->GetRect();
if(ObjRect.IsZero())
{
ObjRect = rect;
}
else
{
AdjustRectByRect(ObjRect,rect);
}
}
return ObjRect;
}
//获取单个obj 的矩形范围
DbRect CObjContainer::GetObjRect(int idx)
{
DbRect ObjRect;
int size = m_ObjVec.size();
if(CorrectIdx(idx))
{
ObjRect = m_ObjVec[idx]->GetRect();
}
return ObjRect;
}
//选择rect 内的obj
bool CObjContainer::SelObjectInRect(DbRect rect,bool bNeedAllIn)
{
bool ret = false;
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
Sptr<CObjBase> p = (*iter);
if(p->IsInRect(rect,bNeedAllIn))
{
p->SetSelected(true);
ret = true;
}
}
return ret;
}
//全选
void CObjContainer::SelAllObj()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->SetSelected(true);
}
}
void CObjContainer::NotSelAllObj()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->SetSelected(false);
}
}
//反选
void CObjContainer::RevSelAllObj()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected())
{
(*iter)->SetSelected(false);
}
else
{
(*iter)->SetSelected(true);
}
}
}
//删除选择项
void CObjContainer::DelSelObj()
{
vector<Sptr<CObjBase>> vec;
//先备份非选择项
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected() == false)
{
vec.push_back(*iter);
}
}
}
//删除所有obj
m_ObjVec.clear();
//将非选择obj 倒回
{
vector<Sptr<CObjBase>>::iterator iter = vec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = vec.end();
for(;iter!=iter_end;iter++)
{
m_ObjVec.push_back(*iter);
}
}
}
//删除指定的obj
void CObjContainer::DelObj(Sptr<CObjBase> p)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter).GetPtr() == p.GetPtr())
{
m_ObjVec.erase(iter);
break;
}
}
}
//删除最后一个obj
void CObjContainer::DeleteLastObj()
{
if(Empty()==false)
{
m_ObjVec.pop_back();
}
}
//删除空线段
void CObjContainer::DelNullLine()
{
vector<Sptr<CObjBase>> vec;
//先备份非选择项
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->Empty() == false)
{
vec.push_back(*iter);
}
}
}
//删除所有obj
m_ObjVec.clear();
//将非选择obj 倒回
{
vector<Sptr<CObjBase>>::iterator iter = vec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = vec.end();
for(;iter!=iter_end;iter++)
{
m_ObjVec.push_back(*iter);
}
}
}
//合并选择的图形
CObjBase* CObjContainer::JoinSelObj()
{
//查找适合放在第一位的obj ---------------------------------------------------
int size = m_ObjVec.size();
int cnt = 0;
bool flg1;
bool flg2;
int idx=0;
double eps = 0.01;//判断精度
int firstSelIdx = -1;//第一个选择的obj
for(;idx<size;idx++)
{
if(m_ObjVec[idx]->IsSelected())
{
if(firstSelIdx==-1)
{
firstSelIdx = idx;
}
flg1 = true;
flg2 = true;
for(int j=0;j<size;j++)
{
if(m_ObjVec[j]->IsSelected()&&j!=idx)
{
#if 0
//相连
if(m_ObjVec[idx]->GetFirstPt() == m_ObjVec[j]->GetFirstPt() || m_ObjVec[idx]->GetFirstPt() == m_ObjVec[j]->GetLastPt())
{
flg1 = false;
}
if(m_ObjVec[idx]->GetLastPt() == m_ObjVec[j]->GetFirstPt() || m_ObjVec[idx]->GetLastPt() == m_ObjVec[j]->GetLastPt())
{
flg2 = false;
}
#else
//相连
if(IsTwoDbPtEqual(m_ObjVec[idx]->GetFirstPt(),m_ObjVec[j]->GetFirstPt(),eps)|| IsTwoDbPtEqual(m_ObjVec[idx]->GetFirstPt(),m_ObjVec[j]->GetLastPt(),eps))
{
flg1 = false;
}
if(IsTwoDbPtEqual(m_ObjVec[idx]->GetLastPt(),m_ObjVec[j]->GetFirstPt(),eps)|| IsTwoDbPtEqual(m_ObjVec[idx]->GetLastPt(),m_ObjVec[j]->GetLastPt(),eps))
{
flg2 = false;
}
#endif
}
}
if(flg1 || flg2)//找到
{
break;
}
}
}
if(flg1 && flg2)//如果两端都没有和其他obj连接则不能合并
return NULL;
if(firstSelIdx==-1)
return NULL;
if(!flg1 && !flg2)//选择的obj 为闭合状态则以第一个选择的obj 开始
{
idx= flg1;
}
//创建合并的obj ------------------------------------------
bool bReverse = false;
if(flg2)
{
bReverse = true;
}
CObjPline *p = new CObjPline;
p->AddObj(m_ObjVec[idx],bReverse);//加入第一个obj
set<int> Set;//用来判断哪些已经处理过
Set.insert(idx);
Dbxy ConectPt = p->GetLastPt();//当前的连接点
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
if(m_ObjVec[j]->IsSelected()&&Set.count(j)==false)//加入没处理过的选择obj
{
if(IsTwoDbPtEqual(ConectPt,m_ObjVec[j]->GetFirstPt(),eps))//正向
{
p->AddObj(m_ObjVec[j],false);
Set.insert(j);//标记
ConectPt = m_ObjVec[j]->GetLastPt();
}
else if(IsTwoDbPtEqual(ConectPt,m_ObjVec[j]->GetLastPt(),eps))//逆向
{
p->AddObj(m_ObjVec[j],true);
Set.insert(j);//标记
ConectPt = m_ObjVec[j]->GetFirstPt();
}
}
}
}
//检查是否还有选择的obj 没有被合并
bool flg = false;
for(int i=0;i<size;i++)
{
if(m_ObjVec[i]->IsSelected()&&Set.count(i)==false)
{
flg = true;
break;
}
}
//如果有,则表示不能合并
if(flg)
{
delete p;
p = NULL;
}
return p;
}
//设置当前操作对象idx 节点的值为pt
void CObjContainer::SetNodePtByIdx(int idx,Dbxy pt)
{
if(Empty())
return;
m_ObjVec[0]->SetNodePtByIdx(idx,pt);
}
#endif
#if 1
//操作选择的obj
//bNeedSel 表示需要为选择状态才操作
//bTmpOp 表示是否为临时操作
void CObjContainer::OperateObj(SObjOperatePar &par,bool bNeedSel)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(bNeedSel==false || (bNeedSel && (*iter)->IsSelected()))
{
(*iter)->Operate(par);
}
}
}
//操作最后一个obj
void CObjContainer::OperateLastObj(SObjOperatePar &par)
{
if(m_ObjVec.empty()==false)
{
m_ObjVec[m_ObjVec.size()-1]->Operate(par);
}
}
#endif
#if 1//捕获
void CObjContainer::GetLineInRect(DbRect &rect,vector<DbLine> &DataPtLineVec,bool bCatchTemp)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
//不要捕捉临时对象的工具认为选择的对象也是临时对象
if(bCatchTemp==false&&(*iter)->IsSelected())
continue;
(*iter)->GetLineInRect(rect,DataPtLineVec);
}
}
//复制m_ObjVec 的obj 到rhs 容器
void CObjContainer::CloneObj(CObjContainer &rhs,bool bNeedSel)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(!bNeedSel ||(bNeedSel && (*iter)->IsSelected()))
{
CObjBase *p = (*iter)->Clone();
rhs.AddObject(p);
}
}
}
//获取和line 相交的所有交点到PointVec 中
void CObjContainer::GetIntersectPoint(DbLine &line,vector<Dbxy> &PointVec)
{
}
//是否有obj 和line 相交
bool CObjContainer::HasObjIntersectWithLine(DbLine &line)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IntersectWithLine(line))
{
return true;
}
}
return false;
}
#endif
#if 1
//添加obj 到指令
void CObjContainer::AddObjToCmd(CCommandBase *p,bool bNeedSel)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(bNeedSel)
{
if((*iter)->IsSelected())
p->AddOpObj((*iter));
}
else
{
p->AddOpObj((*iter));
}
}
}
//将obj 导入当前的layer
void CObjContainer::AllObjAddToLayer()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
GetLayerInstance().AddObject(*iter);
}
}
//把自己所有的obj 导入rhs
void CObjContainer::AllObjAddToContainer(CObjContainer &rhs,bool bNeedSel)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(bNeedSel)
{
if((*iter)->IsSelected())
rhs.AddObject(*iter);
}
else
{
rhs.AddObject(*iter);
}
}
}
void CObjContainer::AllObjAddToLayerTmp()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
GetLayerInstance().AddTmpObject(*iter);
}
}
//获取当前操作的一个obj 的指针(由创建对象的tool 使用)
CObjBase *CObjContainer::GetCurOpObj()
{
if(m_ObjVec.empty())
return NULL;
else
return m_ObjVec[m_ObjVec.size()-1].GetPtr();
}
#endif
#if 1//group 相关函数
bool CObjContainer::IsInRect(DbRect rect,bool bNeedAllIn)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsInRect(rect,bNeedAllIn))
return true;
}
return false;
}
void CObjContainer::SetSelected(bool bSelected)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->SetSelected(bSelected);
}
}
//idx 为-1 时操作全部
void CObjContainer::Operate(SObjOperatePar &par,int idx)
{
if(idx==-1)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->Operate(par);
}
}
else
{
if(CorrectIdx(idx))
{
m_ObjVec[idx]->Operate(par);
}
}
}
bool CObjContainer::CorrectIdx(int idx)
{
int size = m_ObjVec.size();
if(0<=idx && idx<size)
return true;
return false;
}
//绑定参数到对话框
void CObjContainer::BindingDlg()
{
int cnt = GetSelObjCnt();
if(cnt ==1)//只选择一个对象时
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsSelected())
{
(*iter)->BindingDlg();
break;
}
}
}
}
#endif
#if 1
//提取所有obj 的数据(包括填充数据)到vec 中(合并相连的线段)
void CObjContainer::GetObjPtData(vector<vector<Dbxy>> &vec,bool bNeedSel)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(!bNeedSel || (bNeedSel && (*iter)->IsSelected()))
{
(*iter)->GetPtData(vec);
}
}
}
//提取所有obj 的填充数据到vec 中
void CObjContainer::GetObjFillData(vector<vector<Dbxy>> &vec,bool bNeedSel)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(!bNeedSel || (bNeedSel && (*iter)->IsSelected()))
{
(*iter)->GetFillData(vec);
}
}
}
//找到所有点对象并保存坐标到vec
void CObjContainer::GetOnePoint(vector<Dbxy> &vec)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->GetType()==_TYPE_POINT)
{
Dbxy pt = (*iter)->GetFirstPt();
vec.push_back(pt);
}
}
}
#endif
#if 1//填充
void CObjContainer::FillObj(SFillPar FillPar,bool bNeedSel)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if(bNeedSel && (*iter)->IsSelected()==false)
continue;
(*iter)->CreatFillData(FillPar);
}
}
#endif
//提取所有点对象的中心点
void CObjContainer::GetAllPointObjPt(vector<Dbxy> &PtVec)
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->GetType()==_TYPE_POINT)
{
PtVec.push_back(((*iter)->GetRect()).GetCenterPt());
}
}
}
//保存obj 现在的选择状态
void CObjContainer::SaveOldSelState()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->SaveOldSelState();
}
}
//恢复obj 之前的选择状态
void CObjContainer::RecoverOldSelState()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->RecoverOldSelState();
}
}
//重置对象的搜集状态
void CObjContainer::ResetAllCollectedState()
{
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->SetbCollected(false);
}
}
//获取唯一选择的偏移区域对象rect
bool CObjContainer::GetSelOffsetRect(DbRect &Rect)
{
int cnt = 0;
vector<Sptr<CObjBase>>::iterator iter = m_ObjVec.begin();
vector<Sptr<CObjBase>>::iterator iter_end = m_ObjVec.end();
for(;iter!=iter_end;iter++)
{
if((*iter)->IsbOffsetAreaRect()&&(*iter)->IsSelected())
{
cnt++;
Rect = (*iter)->GetRect();
}
}
return (cnt==1);
}