#include "StdAfx.h" #include "ObjComponent.h" #include "DrawSimpleShape.h" #include "GlobalFunction.h" #include "TemplateMgr.h" #include "ProductMgr.h" #include "ObjComponentMgr.h" #include "CommonFlowMgr.h" #include "LogMgr.h" CObjComponent::CObjComponent() { m_Size.w = 5; m_Size.h = 4.2; m_bMark1Obj = false;//第一个mark Ini(); } CObjComponent::CObjComponent(Dbxy pt,DbSize size) { m_BasePt = pt;//元件的基准点 m_Size = size;//元件的尺寸 Ini(); } void CObjComponent::Ini() { m_bBase = false;//是否为基准元件 m_bSel = false;//是否被选中 m_TempIdx = 0;//使用的数据模板编号 m_bMarked = false;//是否被加工过了 m_bCollected = false; m_bCircle = false;//是否为圆形 m_bMarkObj = false;//是否为标记的obj m_bMarkSidewardObj = false;//是否为标记obj 旁边的obj m_ColorIdx = -1;//颜色索引值 m_ObjMarkIdx = -1;//obj 标记,用来区别是否开孔 m_bAutoCreatObj = false;//是否为自动创建的obj m_ObjLineIdx = 0;//obj 在line 上的索引值,用来确定相邻line 中obj 的关系 m_bView = false;//是否正在观察 m_bViewed = false;//是否被观察过了 m_bCollecteData = true;//是否需要收集加工数据(false 的时候不收集obj 的数据) m_bHide = false;//是否隐藏 m_bMark3Obj = false;//是否为mark3 } CObjComponent::~CObjComponent(void) { } DbRect CObjComponent::GetRect() { DbRect rect(m_BasePt,m_Size); return rect; } void CObjComponent::Draw(CDC* pDC) { if(m_bHide) return; //颜色----------------------------------------------- COLORREF c; if(m_bSel)//选择状态 { c = gObjComponentMgr->GetSelColor(); } else if(!m_bCollecteData)//不加工 { c = RGB_GRAY1; } else if(m_bMarked)//被加工过 { c = gObjComponentMgr->GetViewedObjColor(); } else//普通状态 { if(IsbSpecialObj())//特殊对象 c = RGB_BLUE1; else c = gObjComponentMgr->GetNoSelColor(); } //绘制------------------------------------------------- Dbxy pt = m_BasePt; DbSize size = m_Size; DbRect rect = GetRect(); double Gap = 0.5; rect.L -= Gap; rect.R += Gap; rect.T += Gap; rect.B -= Gap; if(gObjComponentMgr->IsbShowRealObj()) { pt = m_RealBasePt; size.w = size.h = 1; DbRect RealRect(pt,size); rect = RealRect; } if(gObjComponentMgr->IsDrawFillColor()) { if(m_bCircle) { DrawSolidCircle(pDC,c,pt,(size.w+Gap)/2); } else { DrawSolidRect(pDC,c,rect); } } else { CPen pen; pen.CreatePen(PS_INSIDEFRAME,1,c); if(m_bCircle) { DrawCircle(pDC,pen,pt,(size.w+Gap)/2,50); } else { DrawRect(pDC,pen,rect,false); } pen.DeleteObject(); } if(m_bMarkObj || m_bMark3Obj)//如果是mark obj 在中间画一个十字标记一下 { CPen pen; pen.CreatePen(PS_INSIDEFRAME,1,RGB_RED); XorDrawCross(pDC,false,pen,pt,size.w*4); pen.DeleteObject(); } } COLORREF CObjComponent::GetObjColorByIdx(int Idx) { COLORREF c = RGB_GREEN; //渐变色 int r = GetRValue(c)+30*Idx; int g = GetGValue(c)+30*Idx; int b = GetBValue(c)+30*Idx; COLORREF Color = RGB(r,g,b); return Color; } //是否在鼠标选择范围(bCenterIn 表示中心点在rect 范围内) bool CObjComponent::IsInRect(DbRect rect,bool bCenterIn) { if(bCenterIn && !m_bCollecteData)//收集数据的时候不要 return false; DbRect ObjRect = GetRect(); bool ret; if(bCenterIn) ret = IsPointInRect(ObjRect.GetCenterPt(),rect);//obj 的中心点必须在rect 内 else ret = IsTwoRectIntersect(ObjRect,rect)||IsTwoRectIntersect(rect,ObjRect);//挂到obj 的边就算 return ret; } //收集工作数据(目前的算法会比较慢) void CObjComponent::CollectWorkData(DbRect &rect,vector> &vec) { if(!m_bCollecteData) return; if(m_bCollected)//不要重复收集 return; //是否在数据收集范围 if(!IsInRect(rect,true))//搜集数据的时候按中心点来判断 return; //优化速度 int MarkCnt = 0; if(gCommonFlowMgr->IsbCollectSpecialObj())//收集特殊对象 { if(!IsbSpecialObj())//过滤掉普通对象 return; MarkCnt = gCommonFlowMgr->GetSpecialOneObjMarkCnt(); } else//普通数据 { MarkCnt = gCommonFlowMgr->GetOneObjMarkCnt();//单个元件加工次数 } vector>::iterator iter = m_ObjShapeVec.begin(); vector>::iterator iter_end = m_ObjShapeVec.end(); { for(int k=0;kGetPtData(vec); } } if(!IsbSpecialObj())//特殊对象不要标记 m_bCollected = true; } //设置mark 标记 void CObjComponent::SetObjMarkIdx(bool b) { m_ObjMarkIdx = b?1:2; } //添加绑定的layer obj void CObjComponent::AddObjShape(Sptr p) { m_ObjShapeVec.push_back(p); } //设置选中状态 void CObjComponent::SetSelected(bool b) { m_bSel = b; } //设置绑定layer obj 的锁定状态 void CObjComponent::SetShapeLockState(bool b) { vector>::iterator iter = m_ObjShapeVec.begin(); vector>::iterator iter_end = m_ObjShapeVec.end(); { (*iter)->SetLock(b); } } //bMoveObjShape是否移动绑定的图形对象 void CObjComponent::OnMove(Dbxy Offset,bool bMoveObjShape) { m_BasePt.x += Offset.x; m_BasePt.y += Offset.y; if(bMoveObjShape) { vector>::iterator iter = m_ObjShapeVec.begin(); vector>::iterator iter_end = m_ObjShapeVec.end(); { SObjOperatePar par; par.OpType = _OP_MOVE; par.MoveX = Offset.x; par.MoveY = Offset.y; (*iter)->Operate(par); } } } //设置选择对象的笔号 void CObjComponent::SetSelObjPenNum() { vector>::iterator iter = m_ObjShapeVec.begin(); vector>::iterator iter_end = m_ObjShapeVec.end(); { if((*iter)->GetPenNum() == 0) (*iter)->SetPenNum(1); else (*iter)->SetPenNum(0); } } //obj 是否为特殊对象 bool CObjComponent::IsbSpecialObj() { vector>::iterator iter = m_ObjShapeVec.begin(); vector>::iterator iter_end = m_ObjShapeVec.end(); { if((*iter)->GetPenNum() == 0) return false; else return true; } return false; }