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.

289 lines
7.6 KiB
C++

#include "StdAfx.h"
#include "ItemWcsTrack.h"
#include "MultiWellSectionDoc.h"
#include "MultiWellSectionlView.h"
#include "WellPoleLib/WellBaseObj.h"
#include "WellPoleLib/WellClassObjGroup.h"
#include "WellPoleLib/TrackObj.h"
#include "WellPoleLib/InTrackTextRange.h"
//#include "GSingleWellLib\GSingleWellLib\TrackLayerObj.h"
//#include "GSingleWellLib\GSingleWellLib\TrackInLayer.h"
#include "WellPoleLib/InclinedTrack.h"
#include "WellPoleLib/TrackResult.h"
#include "WellPoleLib/InTrackResult.h"
#include "WellPoleLib/TrackText.h"
#include "WellPoleLib/WellPole.h"
#include "MultiWellSectionLib/BendObj.h"
#include "MultiWellSectionLib/FenceBendObj.h"
#include "MultiWellSectionLib/FaultObj.h"
#include "MultiWellSectionLib/SectionWellObj.h"
#include "MultiWellSectionLib/WellSection.h"
#include "MultiWellSectionLib/WellFence.h"
#include "ItemVirtualWell.h"
namespace NItem
{
CItemVirtualWell::CItemVirtualWell(CSigmaDoc* pDoc, BOOL bAdd)
: CItemWcsSingleWell(pDoc)
{
SetType(ITEM_VIRTUALWELL);
m_bAdd = bAdd;
m_bLDown = FALSE;
nDragHandle = 0;
m_pVirtualWell = NULL;
m_pItemSection = NULL;
}
CItemVirtualWell::~CItemVirtualWell(void)
{
}
void CItemVirtualWell::OnDraw(CXyDC* pXyDC)
{
CDC *pDC = GetDC()->GetDC();
CPen pen(PS_DOT, 0, RGB(0, 0, 0));
CPen *pOldPen = (CPen *)pDC->SelectObject(&pen);
int old = pDC->SetROP2(R2_NOTXORPEN);
if (m_bAdd)
{
CPoint p1,p2;
p1 = m_downPoint;
p2 = m_lastPoint;
p2.x = p1.x;
pDC->MoveTo(p1);
pDC->LineTo(p2);
}
else
{
if(m_pVirtualWell!=NULL)
{
if(m_bDrag && m_lastPoint!=m_downPoint)//画拖拽框(整体、控制点)
{
if(selectMode==CItemSelect::move)//整体
{
CRect position = pXyDC->GetScreen(m_pVirtualWell->GetRect());
position.NormalizeRect();
CRect rect = position;
CPoint delta = CPoint(m_lastPoint.x-m_downPoint.x,0);
rect.OffsetRect(delta.x, delta.y);
pDC->Rectangle(rect);
}
else if (nDragHandle!=0)//控制点
{
CRect rect = GetDC()->GetScreen(m_pVirtualWell->GetRect());
MoveHandle(nDragHandle, m_lastPoint, rect);
pDC->Rectangle(rect);
}
}
//画选中状态
if(!m_bDrag || m_firstPoint==m_downPoint)
{
//画控制点
CPoint2D point;
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(200,0,0));
pOldPen = pDC->SelectObject(&pen);
point.x0 = (m_pVirtualWell->GetPos().left+m_pVirtualWell->GetPos().right)/2;
point.y0 = m_pVirtualWell->GetPos().top;
DrawHandle(pXyDC, point);
point.x0 = (m_pVirtualWell->GetPos().left+m_pVirtualWell->GetPos().right)/2;
point.y0 = m_pVirtualWell->GetPos().bottom;
DrawHandle(pXyDC, point);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
pen.CreatePen(PS_DOT, 1, RGB(255,0,0));
pOldPen = pDC->SelectObject(&pen);
CRect rect = GetDC()->GetScreen(m_pVirtualWell->GetRect());
pDC->Rectangle(rect);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
}
}
}
pDC->SelectObject(pOldPen);
pen.DeleteObject();
pDC->SetROP2(old);
}
void CItemVirtualWell::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
m_bLDown = TRUE;
m_downPoint = m_firstPoint = m_lastPoint = point;
if(m_pVirtualWell != NULL)
{
CPoint2D ptReal = GetDC()->GetReal(point);
CWellBaseObj* pObj = m_pVirtualWell;
int nHandleSize = HANDLESIZE; // ::GetPreferences().WorkaroundHandle.m_nHandleSize;
double dHandleSize = GetDC()->GetRealSize(CSize(nHandleSize/2, nHandleSize/2)).cx;
nDragHandle = pObj->HitTest(ptReal,dHandleSize,TRUE);
if (nDragHandle != 0)
{
selectMode = ESelectMode::size;
//GetView()->SetCapture();
}
else
{
selectMode = ESelectMode::move;
//GetView()->SetCapture();
}
}
else
{
OnDraw(GetDC());
//GetView()->SetCapture();
}
//刷新属性页
//CXTPPropertyGrid &grid = GetPropertyGrid(GetDoc()->GetMainFrame());
//InitPropertyGrid(grid);
}
void CItemVirtualWell::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
m_firstPoint = m_lastPoint = point;
m_bLDown = FALSE;
CPoint2D ptDown = GetDC()->GetReal(m_downPoint);
CPoint2D ptLast = GetDC()->GetReal(m_lastPoint);
if(m_pVirtualWell == NULL)
{
double yMin = min(ptDown.y0,ptLast.y0);
double yMax = max(ptDown.y0,ptLast.y0);
if (fabs(yMin-yMax)==0.0)
{
ReleaseCapture();
return;
}
m_pVirtualWell = new CVirtualWellObj;
m_pVirtualWell->GetPos().left = ptDown.x0-20;
m_pVirtualWell->GetPos().right = ptDown.x0+20;
m_pVirtualWell->GetPos().bottom = min(ptDown.y0, ptLast.y0);
m_pVirtualWell->GetPos().top = max(ptDown.y0, ptLast.y0);
CWellSection* pWellSection = GetItemSection()->GetWellSection();
m_pVirtualWell->SetParent(pWellSection);
pWellSection->m_VirtualWellList.AddTail(m_pVirtualWell);
m_pVirtualWell->ComputeBendValueLevel();
m_pVirtualWell = NULL;
m_bLDown = FALSE;
}
else
{
CPoint2D delta(ptLast.x0-ptDown.x0,0/*ptLast.y0-ptDown.y0*/);
if((m_downPoint.x-m_lastPoint.x)!=0 || (m_downPoint.y-m_lastPoint.y)!=0)
{
if (IsCaptureState())
{
if(NULL != m_pItemSection)
m_pItemSection->SetReUnDoAction();
if (selectMode==CItemSelect::size && nDragHandle!=0)
{
//内置对象交互句柄
m_pVirtualWell->MoveHandleTo(nDragHandle, ptLast);
GetDoc()->Invalidate(); // m_pVirtualWell->GetParent());
}
else if (selectMode==CItemSelect::move)
{
CRect8 position = m_pVirtualWell->GetPos();
m_pVirtualWell->m_delta.x0 = delta.x0;
m_pVirtualWell->m_delta.y0 = 0;
position.OffsetRect(delta.x0, delta.y0);
m_pVirtualWell->MoveTo(position);
}
}
}
m_bDrag = FALSE;
nDragHandle = 0;
}
GetDoc()->Invalidate();
ReleaseCapture();
}
int CItemVirtualWell::OnMouseMove(CDC *pDC, UINT nFlags, CPoint point)
{
if(m_bAdd)
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_RANGE));
CPoint2D lastPoint = GetDC()->GetReal(point);
if(IsCaptureState() && m_bLDown)
{
OnDraw(GetDC());
m_bDrag = TRUE;
m_lastPoint = point;
OnDraw(GetDC());
}
}
else
{
if(m_pVirtualWell == NULL)
return 0;
CPoint2D lastPoint = GetDC()->GetReal(point);
if(IsCaptureState())
{
OnDraw(GetDC());
m_bDrag = TRUE;
m_lastPoint = point;
OnDraw(GetDC());
m_firstPoint = m_lastPoint;
}
else
m_lastPoint = point;
}
return 1;
}
BOOL CItemVirtualWell::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(m_bAdd)
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_RANGE));
}
else
{
CPoint2D lastPoint = GetDC()->GetReal(m_lastPoint);
int nHandleSize = HANDLESIZE; // ::GetPreferences().WorkaroundHandle.m_nHandleSize;
double dHandleSize = GetDC()->GetRealSize(CSize(nHandleSize/2, nHandleSize/2)).cx;
int nHandle = m_pVirtualWell->HitTest(lastPoint,dHandleSize,TRUE);
if(nHandle!=0)
{
::SetCursor(GetHandleCursor(nHandle));
return TRUE;
}
else
{
CRect8 rt = CRect8(lastPoint.x0, lastPoint.y0, lastPoint.x0, lastPoint.y0);
if(m_pVirtualWell->Intersects(rt, dHandleSize))
{
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEALL));
return TRUE;
}
}
}
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_UPARROW));
return TRUE;
//GetDoc()->GetCursor().SetCursor(CursorSelect);
//return GetDoc()->GetCursor().SetCursor();
}
int CItemVirtualWell::DeleteSelection(void)
{
if(GetDrawObj() == NULL)
return 0;
CWellSection* pWellSection = (CWellSection*)m_pVirtualWell->GetParent();
POSITION posFind = pWellSection->m_VirtualWellList.Find(m_pVirtualWell);
pWellSection->m_VirtualWellList.RemoveAt(posFind);
delete m_pVirtualWell;
return 1;
}
}