#include "StdAfx.h" #include "ItemCutOut.h" #include "SigmaDoc.h" #include "SigmaView.h" #include ".\itemcutout.h" #include "DrawOperator\cutout.h" #include "ActionListItem.h" #include "ActionAddItem.h" CItemCutOut::CItemCutOut(CSigmaDoc* ppDoc) :CItem(ppDoc), m_nInfoID(0) { this->SetType(ITEM_CUT_OUT); //SetProcessIdea(CUT_OUT_RECTANGLE); m_range.SetRect(0,0,0,0); m_nMode=0; m_pSelectCurve = new CItemSelectCurve(GetDoc()); m_pSelectCurve->SetNumber(-1); m_pSelectCurve->EnableSelectOtherType(TRUE); m_pSelectCurve->AddOtherType(DOUBLEFOX_ELLIPSE); m_pSelectCurve->AddOtherType(DOUBLEFOX_ARC); m_pSelectCurve->AddOtherType(DOUBLEFOX_CIRCLE); m_pSelectCurve->AddOtherType(DOUBLEFOX_CRECT); } CItemCutOut::~CItemCutOut(void) { if(m_pSelectCurve) delete m_pSelectCurve; m_pSelectCurve=NULL; } void CItemCutOut::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk) { m_pSelectCurve->OnLButtonDown(pDC, nFlags, point, vk); if (m_pSelectCurve->GetSelectCount() > 0) CutOutPickup(); } int CItemCutOut::GetCountOfPickup() { return m_pSelectCurve->GetSelectCount(); } int CItemCutOut::CutOut(CCurveEx* pCurveRange, CCurveEx* pSourceCurveRange) { CCutOut co; co.SetSourceCurveRange(pSourceCurveRange); co.SetXY(GetXY()); co.m_dMiniCurveSmoothStep=GetDC()->GetMiniSmoothStep(); //GetDoc()->BeginProgress("Cut out..."); co.CutOut(pCurveRange); //CActionDeleteItem deleteItem(GetDoc(), IDS_STRING_ACTION_DELETE, co.m_plDel); //deleteItem.Do(); if (m_nInfoID == 0) m_nInfoID = ID_CUT_OUT_MAP_RECTANGLE; //for undo/redo CActionListItem *pAction = new CActionListItem(GetDoc(), m_nInfoID); //元素删除操作 pAction->AddDeleteItem(co.m_plDel); //元素增加操作 CActionAddItem* pItem = new CActionAddItem(GetDoc(), 0, co.m_plAdd); pAction->AddTailItem(pItem); GetDoc()->SetActionItem(pAction); return 1; } int CItemCutOut::CutOutRectangle(CRect8 rect) { CCurveEx ceRange; ceRange.CreateCurveFromRect(&rect); return CutOut(&ceRange); } int CItemCutOut::CutOutPickup(void) { POSITION pos=m_pSelectCurve->GetSelectItem(0); if(pos==NULL) return 0; BOOL bDeleteCurve=FALSE; CCurveEx* pRgn=m_pSelectCurve->GetRangeCurve(pos, bDeleteCurve); if(pRgn==NULL) return 0; int rt=0; if(pRgn->IsClosed()) rt=CutOut(pRgn, pRgn); else { CCurveEx* pc=new CCurveEx; *pc=*pRgn; pc->SetToClose(); pc->num+=1; pc->GetLocation(); rt=CutOut(pc, pRgn); delete pc; } if(bDeleteCurve) delete pRgn; return rt; } int CItemCutOut::CutOutAccurately(void) { return 0; /* CPropertiesSheet sheet(IDS_STRING_CUT_OUT_MAP,GetView(),0,FALSE); sheet.SetItem(this); if(sheet.DoModal()!=IDOK) return 0; CRect8 rect=m_range; CCurveEx ceRange; switch(m_nMode) { case 0: ceRange.CreateCurveFromRect(&rect); break; case 2://度分秒, 转换为度 rect.left=AfxGetPublicFunction()->ToDegree(rect.left); rect.top=AfxGetPublicFunction()->ToDegree(rect.top); rect.right=AfxGetPublicFunction()->ToDegree(rect.right); rect.bottom=AfxGetPublicFunction()->ToDegree(rect.bottom); case 1://度 转换为分 rect.left*=60; rect.top*=60; rect.right*=60; rect.bottom*=60; if(CreateCurveWidthBL(rect, ceRange)==0) return 0; //根据经纬度生成范围曲线 break; } return CutAccurately(&ceRange); */ } int NItem::CItemCutOut::CutAccurately(CCurveEx* pCurveRange) { return CutOut(pCurveRange); } int CItemCutOut::CreateCurveWidthBL(CRect8& rect, CCurveEx& curve) { CExchangeXYZ net; net.SetProjection(&(GetXY()->m_ExchangeXYZ)); dfPoint dp; CPointList list; double dl=rect.Width()*0.02; double db=rect.Height()*0.02; double v=rect.left; dp.x0=v; dp.y0=rect.top; net.ToXY_M(dp.x0, dp.y0); list.AddTail(dp); //Point(left,top)--->Point(right,top); v+=dl; while(vPoint(right,bottom); v-=db; while(v>rect.bottom) { dp.x0=rect.right; dp.y0=v; net.ToXY_M(dp.x0, dp.y0); list.AddTail(dp); v-=db; } v=rect.right; dp.x0=v; dp.y0=rect.bottom; net.ToXY_M(dp.x0, dp.y0); list.AddTail(dp); //Point(right,bottom)--->Point(left,bottom); v-=dl; while(v>rect.left) { dp.x0=v; dp.y0=rect.bottom; net.ToXY_M(dp.x0, dp.y0); list.AddTail(dp); v-=dl; } v=rect.bottom; dp.x0=rect.left; dp.y0=v; net.ToXY_M(dp.x0, dp.y0); list.AddTail(dp); //Point(left,bottom)--->Point(left,top); v+=db; while(vDraw(curve); return 1; } CXy* NItem::CItemCutOut::GetXY(void) { return GetDoc()->GetDraw(); }