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.
kev/Drawer/Module/GeoSigmaDraw/SelectionDrawer.cpp

171 lines
3.9 KiB
C++

#include "stdafx.h"
#include "SelectionDrawer.h"
#include "SigmaDoc.h"
SelectionDrawer::SelectionDrawer(CSigmaDoc * pDoc)
:m_pDoc(pDoc)
{
m_pDoc = nullptr;
m_pSelection = nullptr;
}
void SelectionDrawer::OnDraw(CDC* pDC)
{
//m_selection = &m_oldSelection;
//ReloadTrackerPath();
//m_Tracker.Draw(pDC);
ReloadTrackerPath();
m_Tracker.Draw(pDC);
}
void SelectionDrawer::SetPostion(POSITION pos)
{
m_selection.RemoveAll();
m_selection.AddTail(pos);
}
void SelectionDrawer::ReloadTrackerPath(void)
{
//CWaitCursor wc;
m_Tracker.Clear();
if (m_selection.IsEmpty()) return;
POSITION pos, pt;
pos = m_selection.GetHeadPosition();
while (pos != NULL)
{
pt = m_selection.GetNext(pos);
LoadPath(pt);
}
}
void SelectionDrawer::LoadPath(POSITION pos)
{
if (pos == NULL)
return;
COne* pOne;
pOne = (COne*)m_pDoc->GetDraw()->GetAt(pos);
LoadPath(pOne);
}
void SelectionDrawer::LoadPath(COne* pOne)
{
if (pOne == NULL)
return;
GraphicsPath path;
path.Reset();
switch (pOne->GetType())
{
case DOUBLEFOX_CURVE:
LoadCurvePath(path, (CCurveEx*)pOne->GetValue());
break;
case DOUBLEFOX_CIRCLE:
case DOUBLEFOX_ELLIPSE:
{
CEllipse* pCircle = (CEllipse*)pOne->GetValue();
CRect8 range = pOne->GetRect();
CRect rt = (&m_pDoc->GetDC())->GetScreen(range); rt.NormalizeRect();
path.AddEllipse(rt.left, rt.top, rt.Width(), rt.Height());
}
break;
case DOUBLEFOX_FRAME:
{
m_posRect = pOne->GetRect();
m_posRect.NormalizeRect();
LoadRectPath(path, m_posRect);
}
break;
case DOUBLEFOX_ARC:
LoadCurvePath(path, ((CArc*)pOne->GetValue())->GetCurve());
break;
case DOUBLEFOX_TEXT:
{
CText* pText = (CText*)pOne->GetValue();
CXyDC* pXyDC = &m_pDoc->GetDC();
CDC* pBakDC = pXyDC->GetDC();
CRect BakRT = pXyDC->GetViewRect();
CMemoryDC *pImageDC = new CMemoryDC;
CSize sizeOld;
sizeOld.cx = BakRT.Width();
sizeOld.cy = BakRT.Height();
if (!pImageDC->Create(sizeOld))
{
delete pImageDC;
pImageDC = nullptr;
return;
}
pXyDC->Create(pImageDC);
// »ñµÃ·¶Î§
CPoint point;
point.x = pXyDC->GetSX(pText->x0);
point.y = pXyDC->GetSY(pText->y0);
CRect rect(point, point);
CFont font; font.CreateFontIndirect(&pText->m_logFont);
pImageDC->SelectObject(&font);
pImageDC->DrawText(pText->GetName(), rect, DT_CALCRECT);
pXyDC->Create(pBakDC);
delete pImageDC;
pImageDC = nullptr;
CRect8 rt8 = pXyDC->GetReal(rect);
rt8.NormalizeRect();
pText->Aligns(rt8);
m_posRect = pOne->GetRect();
TRACE("Old_m_posRect:%lf,%lf,%lf,%lf,%lf,%lf\r\n"
, m_posRect.left, m_posRect.top, m_posRect.right, m_posRect.bottom, m_posRect.Width(), m_posRect.Height());
m_posRect.SetRect(rt8.left, rt8.top, rt8.right, rt8.bottom);
TRACE("New_m_posRect:%lf,%lf,%lf,%lf%lf,%lf\r\n"
, m_posRect.left, m_posRect.top, m_posRect.right, m_posRect.bottom, m_posRect.Width(), m_posRect.Height());
LoadRectPath(path, m_posRect);
}
break;
case DOUBLEFOX_XYZ:
case DOUBLEFOX_POINT:
//if (m_bPointTextSelected)
//{
// CPointNameEx* ppn = (CPointNameEx*)pOne->GetValue();
// CRect8 range(1e100, -1e100, -1e100, 1e100);
// ppn->GetRangeText(range, pOne->GetHowToViewPoint());
// LoadRectPath(path, range);
//}
//else
//{
m_posRect = pOne->GetRect();
LoadRectPath(path, m_posRect);
//}
break;
default:
m_posRect = pOne->GetRect();
LoadRectPath(path, m_posRect);
break;
}
// GetDoc()->GetTracker().AddPath(path);
m_Tracker.AddPath(path, TRUE);
}
void SelectionDrawer::LoadCurvePath(GraphicsPath& path, CCurveEx* pc)
{
if (pc == NULL) return;
Point *pt = new Point[pc->num];
CPoint point;
for (int i = 0; i < pc->num; i++)
{
point = m_pDoc->GetDC().GetScreen(pc->x[i], pc->y[i]);
pt[i].X = point.x;
pt[i].Y = point.y;
}
path.AddCurve(pt, pc->num, 0);
//path.CloseFigure();
delete[] pt;
}
void SelectionDrawer::LoadRectPath(GraphicsPath& path, CRect8 rect)
{
CCurveEx* pCurve = new CCurveEx(5);
pCurve->CreateCurveFromRect(&rect);
LoadCurvePath(path, pCurve);
delete pCurve;
}