#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 &LabVec) { vector>::iterator iter = m_ObjVec.begin(); vector>::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 LabVecRangVec; CWorkFileMgr WorkFileMgr; WorkFileMgr.SeparateStrVec(LabVecRang,LabVecRangVec,LAB_OBJ_START,LAB_OBJ_END); //处理每个obj --------------------------------------------------- if(gDraw->IsbDelOldObj()) Clear();//清空原来的obj if(!LabVecRangVec.empty()) { vector::iterator iter = LabVecRangVec.begin(); vector::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 sPtr(pMarkObject); AddObject(sPtr); } void CObjContainer::AddObject(Sptr 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;iGetStr());//类型 } } #endif #if 1//绘制 void CObjContainer::DrawAllObj(CDC* pDC) { //绘制所有obj vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { if((*iter)->IsSelected()) cnt++; } return cnt; } bool CObjContainer::HasSelObjectInRect(DbRect rect) { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { if((*iter)->IsInRect(rect,false)) return true; } return false; } //获取第一个选择的obj Sptr CObjContainer::GetFirstSelObj() { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { if((*iter)->IsSelected()) { return (*iter); } } //错误 Sptr sp(NULL); return sp; } Sptr CObjContainer::GetFirstObjInRect(DbRect &rect) { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { if((*iter)->IsInRect(rect,false)) { Sptr sp(*iter); return sp; } } //错误 Sptr sp(NULL); return sp; } Sptr CObjContainer::GetFirstNodeObjInRect(DbRect &rect) { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { if((*iter)->HasNodeInRect(rect)) { Sptr sp(*iter); return sp; } } //错误 Sptr sp(NULL); return sp; } DbRect CObjContainer::GetSelObjRect() { DbRect SelObjRect; vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { Sptr p = (*iter); if(p->IsInRect(rect,bNeedAllIn)) { p->SetSelected(true); ret = true; } } return ret; } //全选 void CObjContainer::SelAllObj() { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { (*iter)->SetSelected(true); } } void CObjContainer::NotSelAllObj() { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { (*iter)->SetSelected(false); } } //反选 void CObjContainer::RevSelAllObj() { vector>::iterator iter = m_ObjVec.begin(); vector>::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> vec; //先备份非选择项 { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = vec.begin(); vector>::iterator iter_end = vec.end(); for(;iter!=iter_end;iter++) { m_ObjVec.push_back(*iter); } } } //删除指定的obj void CObjContainer::DelObj(Sptr p) { vector>::iterator iter = m_ObjVec.begin(); vector>::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> vec; //先备份非选择项 { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = vec.begin(); vector>::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(;idxIsSelected()) { if(firstSelIdx==-1) { firstSelIdx = idx; } flg1 = true; flg2 = true; for(int j=0;jIsSelected()&&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 Set;//用来判断哪些已经处理过 Set.insert(idx); Dbxy ConectPt = p->GetLastPt();//当前的连接点 for(int i=0;iIsSelected()&&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;iIsSelected()&&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>::iterator iter = m_ObjVec.begin(); vector>::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 &DataPtLineVec,bool bCatchTemp) { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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 &PointVec) { } //是否有obj 和line 相交 bool CObjContainer::HasObjIntersectWithLine(DbLine &line) { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { GetLayerInstance().AddObject(*iter); } } //把自己所有的obj 导入rhs void CObjContainer::AllObjAddToContainer(CObjContainer &rhs,bool bNeedSel) { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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> &vec,bool bNeedSel) { vector>::iterator iter = m_ObjVec.begin(); vector>::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> &vec,bool bNeedSel) { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { if(!bNeedSel || (bNeedSel && (*iter)->IsSelected())) { (*iter)->GetFillData(vec); } } } //找到所有点对象,并保存坐标到vec void CObjContainer::GetOnePoint(vector &vec) { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::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 &PtVec) { vector>::iterator iter = m_ObjVec.begin(); vector>::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>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { (*iter)->SaveOldSelState(); } } //恢复obj 之前的选择状态 void CObjContainer::RecoverOldSelState() { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { (*iter)->RecoverOldSelState(); } } //重置对象的搜集状态 void CObjContainer::ResetAllCollectedState() { vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { (*iter)->SetbCollected(false); } } //获取唯一选择的偏移区域对象rect bool CObjContainer::GetSelOffsetRect(DbRect &Rect) { int cnt = 0; vector>::iterator iter = m_ObjVec.begin(); vector>::iterator iter_end = m_ObjVec.end(); for(;iter!=iter_end;iter++) { if((*iter)->IsbOffsetAreaRect()&&(*iter)->IsSelected()) { cnt++; Rect = (*iter)->GetRect(); } } return (cnt==1); }