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.

1504 lines
36 KiB
C++

1 month ago
#include "StdAfx.h"
#include "itemcurvearc.h"
#include "SigmaDoc.h"
namespace NItem
{
static CRect CalculateHandleRect(LPPOINT pPoint);
CItemCurveArc::CItemCurveArc(CSigmaDoc * ppDoc)
: CItemCurve(ppDoc)
, loop(0)
{
m_AddLineState = ppDoc->GetEditLineStatus();
m_pArc = new CItemArc(ppDoc);
m_pArc->m_bDoSelectEnd = FALSE;
}
CItemCurveArc::~CItemCurveArc(void)
{
if (m_pArc)delete m_pArc;
m_pArc = NULL;
}
BOOL CItemCurveArc::IsArcState(void)
{
if (m_AddLineState != CURVE_STATE_ARC)
return FALSE;
return TRUE;
}
void CItemCurveArc::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (!IsArcState())
CItemCurve::OnLButtonDown(pDC, nFlags, point, vk);
else
{
ClearRedoList();
m_pArc->OnLButtonDown(pDC, nFlags, point, vk);
if (loop == 2)
{
CArc* pArc = m_pArc->CreateArc();
if (pArc == NULL) return;
CCurveEx* pCurve = pArc->GetCurve();
dfPoint pt;
m_dpLastMousePos.x0 = m_pArc->PointStart.x0; m_dpLastMousePos.y0 = m_pArc->PointStart.y0;
for (int i = 0; i < pCurve->num; i++)
{
pt.x0 = pCurve->x[i];
pt.y0 = pCurve->y[i];
DrawLineScreen(m_dpLastMousePos.x0, m_dpLastMousePos.y0, pt.x0, pt.y0);
AddPoint(pt);
m_dpLastMousePos = pt;
}
delete pArc;
m_pArc->PointStart = m_pArc->PointEnd;
m_pArc->PointMiddle = m_pArc->PointStart;
m_pArc->loop = 1;
loop = 0;
}
loop++;
}
}
int CItemCurveArc::OnMouseMove(CDC* pDC, UINT nFlags, CPoint point)//, BYTE*& destBuffer, int& destLen)
{
if (!IsArcState())
{
return CItemCurve::OnMouseMove(pDC, nFlags, point);//, destBuffer, destLen);
}
else if (m_pArc)
{
if (m_pArc->loop == 1)
{
if (!PointList.IsEmpty())
m_pArc->PointStart = PointList.GetTail();
}
m_dpLastMousePos = GetRealPoint(PointList, nFlags, point);
return m_pArc->OnMouseMove(pDC, nFlags, point);
}
return 0;
}
void CItemCurveArc::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
}
void CItemCurveArc::SetCurveState(int state, CDC * pDC)
{
if (m_AddLineState == state) return;
CItemCurve::SetCurveState(state, pDC);
if (m_AddLineState == CURVE_STATE_ARC && PointList.GetCount() > 0)
{
m_pArc->PointStart = PointList.GetTail();
m_pArc->PointMiddle = m_pArc->PointStart;
loop = 1;
m_pArc->loop = loop;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CItemCurveSpline::CItemCurveSpline(CSigmaDoc * ppDoc)
: CItemCurveArc(ppDoc)
{
m_bAuxiliarySplineRedraw = FALSE;
m_nSplineNodes = 5;
m_mSmoothStepFactor = 3;
//SetCurveState(CURVE_STATE_SPLINE);
}
CItemCurveSpline::~CItemCurveSpline(void)
{
}
void CItemCurveSpline::OnDraw(CXyDC* pDC)
{
if (PointList.GetCount() > 0)
{
int od = pDC->GetDC()->SetROP2(R2_NOTXORPEN);
Draw(pDC, PointList, PEN_COLOR);
pDC->GetDC()->SetROP2(od);
}
if (IsSplineState())
{
if (m_spPointList.GetCount() < 1) return;
m_spPointList.AddTail(m_dpLastMousePos);
DrawSpline(pDC);
m_spPointList.RemoveTail();
}
}
void CItemCurveSpline::DrawSpline(CXyDC* pDC)
{
if (m_spPointList.GetCount() <= 1) return;
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
int od = pdc->SetROP2(R2_NOTXORPEN);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPen* pOld = pdc->SelectObject(&m_pen);
CPointList pl;
CCurveEx ce;
ce.SetPoints(m_spPointList, 2);
ce.CurveToSpline(pl, pDC->GetMiniSmoothStep() * m_mSmoothStepFactor, 0);
dfPoint dp;
POSITION p = pl.GetHeadPosition();
dp = pl.GetNext(p);
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
while (p)
{
dp = pl.GetNext(p);
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
/*
ce.SetPoints(pl, 2);
pDC->Draw(ce);
*/
pDC->GetDC()->SelectObject(pOld);
int count = 0;
CPen pen;
pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
//pOld = (CPen*)pDC->GetDC()->SelectStockObject(BLACK_PEN);
pOld = (CPen*)pdc->SelectObject(&pen);
CRect rt;
POINT sp;
dfPoint dt;
POSITION pos = m_spPointList.GetHeadPosition();
while (pos)
{
dp = m_spPointList.GetNext(pos);
if (count > 0)
{
if (fabs(dt.x0 - dp.x0) < 1e-3 && //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
fabs(dt.y0 - dp.y0) < 1e-3)
continue;
}
sp = pDC->GetScreen(dp.x0, dp.y0);
rt = CalculateHandleRect(&sp);
rt.InflateRect(1, 1);
pDC->GetDC()->Ellipse(&rt);
dt = dp;
count++;
}
pDC->GetDC()->SelectObject(pOld);
pDC->GetDC()->SetROP2(od);
}
void CItemCurveSpline::DrawSplineTail(CXyDC * pDC)
{
if (m_spCalcPointList.GetCount() <= 1) return;
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
int od = pdc->SetROP2(R2_NOTXORPEN);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPen* pOld = pdc->SelectObject(&m_pen);
CPointList pl;
CCurveEx ce;
ce.SetPoints(m_spCalcPointList, 2);
ce.CurveToSpline(pl, pDC->GetMiniSmoothStep() * m_mSmoothStepFactor, 0);
dfPoint dp;
POSITION p = pl.GetHeadPosition();
if (p == NULL)
{
return;
}
dp = pl.GetNext(p);
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
while (p)
{
dp = pl.GetNext(p);
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
pdc->SelectObject(pOld);
int count = 0;
CPen pen;
pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));//<2F><><EFBFBD>ڵ<EFBFBD>ԲȦ
//pOld = (CPen*)pDC->GetDC()->SelectStockObject(BLACK_PEN);
pOld = (CPen*)pdc->SelectObject(&pen);
CRect rt;
POINT sp;
dfPoint dt;
POSITION pos = m_spCalcPointList.GetHeadPosition();
while (pos)
{
dp = m_spCalcPointList.GetNext(pos);
if (count > 0)
{
if (fabs(dt.x0 - dp.x0) < 1e-3 && //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
fabs(dt.y0 - dp.y0) < 1e-3)
continue;
}
sp = pDC->GetScreen(dp.x0, dp.y0);
rt = CalculateHandleRect(&sp);
rt.InflateRect(1, 1);
::Ellipse(hdc, rt.left, rt.top, rt.right, rt.bottom);
//pDC->GetDC()->Ellipse(&rt);
dt = dp;
count++;
}
pdc->SelectObject(pOld);
pdc->SetROP2(od);
}
void CItemCurveSpline::GetSplineRealPoints(CDC *pDC)
{
m_spPointList.AddTail(m_dpLastMousePos);//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>б<EFBFBD><D0B1><EFBFBD>
if (m_spPointList.GetCount() > m_nSplineNodes)
{
CopyPreRealPoints();//<2F><><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>б<EFBFBD>
{
m_spRealPointList.RemoveAll();
dfPoint dp, dps;
CPointList pl;
CCurveEx ce;
ce.SetPoints(m_spPointList, 2);
GetDC()->Create(pDC);
ce.CurveToSpline(pl, GetDC()->GetMiniSmoothStep() * m_mSmoothStepFactor, 0);
POSITION pos = pl.GetHeadPosition();
int end = m_spPointList.GetCount() - m_nSplineNodes;
int idx = 0;
while (pos)
{
dp = pl.GetNext(pos);
dps = m_spPointList.GetAt(m_spPointList.FindIndex(idx));
if (fabs(dp.x0 - dps.x0) <= DBL_MIN || //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
fabs(dp.y0 - dps.y0) <= DBL_MIN)
{
idx++;
}
if (idx <= end)
{
m_spRealPointList.AddTail(dp);
}
else
{
m_spRealPointList.AddTail(dp);
break;
}
}
}
}
}
void CItemCurveSpline::RedrawSplineHead(CXyDC * pDC)
{
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
int od = pdc->SetROP2(R2_NOTXORPEN);
CPen* pOld = pdc->SelectObject(&m_pen);
//<2F><><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0>
if (m_spPreRealPointList.GetCount() >= 2)
{
dfPoint dp;
POSITION p = m_spPreRealPointList.GetHeadPosition();
dp = m_spPreRealPointList.GetNext(p);
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
while (p)
{
dp = m_spPreRealPointList.GetNext(p);
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
}
//<2F><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0>
if (m_spRealPointList.GetCount() >= 2)
{
dfPoint dp;
POSITION p = m_spRealPointList.GetHeadPosition();
dp = m_spRealPointList.GetNext(p);
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
while (p)
{
dp = m_spRealPointList.GetNext(p);
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ԲȦ
/*
pdc->SelectObject(pOld);
int count = 0;
CPen pen;
pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
//pOld = (CPen*)pDC->GetDC()->SelectStockObject(BLACK_PEN);
pOld = (CPen*)pdc->SelectObject(&pen);
CRect rt;
POINT sp;
dfPoint dt;
POSITION pos = m_spPointList.GetHeadPosition();
dfPoint dp;
while (pos)
{
dp = m_spPointList.GetNext(pos);
if (count > 0)
{
if (fabs(dt.x0 - dp.x0) < 1e-3 && //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
fabs(dt.y0 - dp.y0) < 1e-3)
continue;
}
sp = pDC->GetScreen(dp.x0, dp.y0);
rt = CalculateHandleRect(&sp);
rt.InflateRect(1, 1);
pdc->Ellipse(&rt);
dt = dp;
count++;
}
*/
pdc->SelectObject(pOld);
pdc->SetROP2(od);
}
void CItemCurveSpline::DrawSplineBody(CXyDC * pDC)
{
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
int od = pdc->SetROP2(R2_NOTXORPEN);
CPen* pOld = pdc->SelectObject(&m_pen);
//<2F><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0>
if (m_spRealPointList.GetCount() >= 2)
{
dfPoint dp;
POSITION p = m_spRealPointList.GetHeadPosition();
dp = m_spRealPointList.GetNext(p);
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
while (p)
{
dp = m_spRealPointList.GetNext(p);
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
}
pdc->SelectObject(pOld);
pdc->SetROP2(od);
}
void CItemCurveSpline::GetHeadRealPoints(CXyDC* pDC)
{
if (m_spCalcPointList.GetCount() <= 1) return;
m_spHeadRealPointList.RemoveAll();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׶<EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPointList pl;
CCurveEx ce;
ce.SetPoints(m_spCalcPointList, 2);
ce.CurveToSpline(pl, pDC->GetMiniSmoothStep() * m_mSmoothStepFactor, 0);
dfPoint dp;
dfPoint dpEnd;
bool bGetHeadRealPoints = false;
if (m_spCalcPointList.GetCount() == m_nSplineNodes + 1)
{
dpEnd = m_spCalcPointList.GetAt(m_spCalcPointList.FindIndex(1));//<2F><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5>еĵڶ<C4B5><DAB6><EFBFBD><EFBFBD><EFBFBD>
}
POSITION p = pl.GetHeadPosition();
while (p)
{
dp = pl.GetNext(p);
if (fabs(dp.x0 - dpEnd.x0) <= DBL_MIN && (dp.y0 - dpEnd.y0) <= DBL_MIN)
{
m_spHeadRealPointList.AddTail(dp);
break;
}
else {
m_spHeadRealPointList.AddTail(dp);
}
}
}
void CItemCurveSpline::DrawHeadRealPoints(CXyDC * pDC)
{
if (m_spHeadRealPointList.GetCount() <= 1) return;
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
int od = pdc->SetROP2(R2_NOTXORPEN);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPen* pOld = pdc->SelectObject(&m_pen);
dfPoint dp;
POSITION p = m_spHeadRealPointList.GetHeadPosition();
if (p == NULL)
{
return;
}
dp = m_spHeadRealPointList.GetNext(p);
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
while (p)
{
dp = m_spHeadRealPointList.GetNext(p);
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
pDC->GetDC()->SelectObject(pOld);
pDC->GetDC()->SetROP2(od);
}
void CItemCurveSpline::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (!IsSplineState())
CItemCurveArc::OnLButtonDown(pDC, nFlags, point, vk);
else
{
ClearRedoList();
dfPoint dp = GetRealPoint(m_spPointList, nFlags, point);
if (m_spPointList.GetCount() == 0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ<DFBD><DAB5>б<EFBFBD>Ϊ<EFBFBD><CEAA><><D6BB><EFBFBD>׶<EFBFBD><D7B6><EFBFBD><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
m_spHeadRealPointList.RemoveAll();
m_spCalcPointList.RemoveAll();
m_spRealPointList.RemoveAll();
m_spPointList.AddTail(dp);//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׮<EFBFBD><D7AE><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
}
else if (m_spPointList.GetCount() > 0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ㲻Ϊ<E3B2BB>գ<EFBFBD><D5A3>׶<EFBFBD><D7B6><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߡ<EFBFBD><DFA1>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><E3B5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׽ڵ<D7BD>
{
dfPoint dt = m_spPointList.GetTail();
if (fabs(dt.x0 - m_dpLastMousePos.x0) > DBL_MIN || //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B2BB><EFBFBD><EFBFBD>ʱ
fabs(dt.y0 - m_dpLastMousePos.y0) > DBL_MIN)
{
GetSplineRealPoints(pDC);
}
}
m_bStretchStart = TRUE;
m_bAuxiliarySplineRedraw = FALSE;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú͵<C3BA><CDB5><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ÿ<EFBFBD><C3BF>ܲ<EFBFBD><DCB2><EFBFBD>һ<EFBFBD><D2BB>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>Ƶ<EFBFBD>ʱ<EFBFBD><CAB1>ֻȡ<D6BB><C8A1><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
//m_dpLastMousePos = dp;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
}
}
void CItemCurveSpline::CopyPreRealPoints()
{
m_spPreRealPointList.RemoveAll();
dfPoint dp;
POSITION pos = m_spRealPointList.GetHeadPosition();
while (pos)
{
dp = m_spRealPointList.GetNext(pos);
m_spPreRealPointList.AddTail(dp);
}
}
void CItemCurveSpline::CopySplineHeads(int n)
{
m_spCalcPointList.RemoveAll();
dfPoint dp;
for (int i = 0; i < n; i++)
{
dp = m_spPointList.GetAt(m_spPointList.FindIndex(i));
m_spCalcPointList.AddTail(dp);
}
}
void CItemCurveSpline::CopySplineTails(int n)
{
m_spCalcPointList.RemoveAll();
int num = m_spPointList.GetCount();
if (0 == num)
{
return;
}
dfPoint dp;
if (num <= n)
{
for (int i = 0; i < num; i++)
{
dp = m_spPointList.GetAt(m_spPointList.FindIndex(i));
m_spCalcPointList.AddTail(dp);
}
}
else
{
for (int i = num - n; i < num; i++)
{
dp = m_spPointList.GetAt(m_spPointList.FindIndex(i));
m_spCalcPointList.AddTail(dp);
}
}
}
int CItemCurveSpline::OnMouseMove(CDC* pDC, UINT nFlags, CPoint point)
{
m_pScreenDC = pDC;
/*if(!IsSplineState())
CItemCurveArc::OnMouseMove(pDC, nFlags, point, destBuffer, destLen);
else
{*/
if (m_spPointList.GetCount() == 0)
{
return 1;
}
if (m_spPointList.GetCount() == 1)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ<DFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB>
{
dfPoint dp = GetRealPoint(m_spPointList, nFlags, point);//<2F><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>90״̬ʱ<CCAC><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>λ<EFBFBD><CEBB>
GetDC()->Create(pDC);
if (m_bAuxiliarySplineRedraw)
{
EraseAuxiliarySpline(pDC);
m_dpLastMousePos = dp;
TRACE("M:m_dpLastMousePos:%f,%f\n", m_dpLastMousePos.x0, m_dpLastMousePos.y0);
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());
m_bStretchStart = FALSE;
m_bAuxiliarySplineRedraw = FALSE;
return 1;
}
if (!m_bStretchStart)
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());//<2F><>¼<EFBFBD><C2BC>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EAA3AC>xyDC<44><43><EFBFBD><EFBFBD>
}
m_dpLastMousePos = dp;
TRACE("M:m_dpLastMousePos:%f,%f\n", m_dpLastMousePos.x0, m_dpLastMousePos.y0);
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());
m_bStretchStart = FALSE;
m_bAuxiliarySplineRedraw = FALSE;
}
if (m_spPointList.GetCount() >= 2 && m_spPointList.GetCount() <= m_nSplineNodes) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ<DFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>3
{
dfPoint dp = GetRealPoint(m_spPointList, nFlags, point);//<2F><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>90״̬ʱ<CCAC><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>λ<EFBFBD><CEBB>
GetDC()->Create(pDC);
if (m_bAuxiliarySplineRedraw)
{
EraseAuxiliarySpline(pDC);
m_dpLastMousePos = dp;
TRACE("M:m_dpLastMousePos:%f,%f\n", m_dpLastMousePos.x0, m_dpLastMousePos.y0);
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());
m_bStretchStart = FALSE;
m_bAuxiliarySplineRedraw = FALSE;
return 1;
}
if (!m_bStretchStart)
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());//<2F><>¼<EFBFBD><C2BC>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>xyDC<44><43><EFBFBD><EFBFBD>
}
else {//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
m_dpLastMousePos = dp;
TRACE("M:m_dpLastMousePos:%f,%f\n", m_dpLastMousePos.x0, m_dpLastMousePos.y0);
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());
m_bStretchStart = FALSE;
m_bAuxiliarySplineRedraw = FALSE;
}
if (m_spPointList.GetCount() > m_nSplineNodes)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ<DFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
{
dfPoint dp = GetRealPoint(m_spPointList, nFlags, point);//<2F><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>90״̬ʱ<CCAC><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>λ<EFBFBD><CEBB>
GetDC()->Create(pDC);
if (m_bAuxiliarySplineRedraw)
{
EraseAuxiliarySpline(pDC);
m_dpLastMousePos = dp;
TRACE("M:m_dpLastMousePos:%f,%f\n", m_dpLastMousePos.x0, m_dpLastMousePos.y0);
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());
m_bStretchStart = FALSE;
m_bAuxiliarySplineRedraw = FALSE;
return 1;
}
if (!m_bStretchStart)
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());//<2F><>¼<EFBFBD><C2BC>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>xyDC<44><43><EFBFBD><EFBFBD>
}
else {//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
CopySplineTails(m_nSplineNodes + 1);
DrawSplineTail(GetDC());//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RedrawSplineHead(GetDC());
//GetHeadRealPoints(GetDC());
//DrawHeadRealPoints(GetDC());//<2F><>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ǰһ<C7B0><D2BB>
}
m_dpLastMousePos = dp;
TRACE("M:m_dpLastMousePos:%f,%f\n", m_dpLastMousePos.x0, m_dpLastMousePos.y0);
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());
m_bStretchStart = FALSE;
m_bAuxiliarySplineRedraw = FALSE;
}
//}
return 1;
}
void CItemCurveSpline::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (!IsSplineState())
CItemCurveArc::OnLButtonUp(pDC, nFlags, point, vk);
else
{
}
}
void CItemCurveSpline::SetCurveState(int state, CDC * pDC)
{
if (state == m_AddLineState) return;//<2F><><EFBFBD><EFBFBD>״̬<D7B4>뵱ǰ״̬<D7B4><CCAC>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_AddLineState == CURVE_STATE_SPLINE)//ԭ<><D4AD>Ϊ<EFBFBD><CEAA>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
{
AppendPoint();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
}
if (state == CURVE_STATE_SPLINE)//ԭ<><D4AD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
{
m_spPointList.RemoveAll();
if (PointList.GetCount() > 0)
{
dfPoint dp = PointList.GetTail();
m_spPointList.AddTail(dp);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
if (!m_bStretchStart)
{
EraseRubberLine();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
CopySplineTails(m_nSplineNodes);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
m_spCalcPointList.AddTail(m_dpLastMousePos);
DrawSplineTail(GetDC());
m_bStretchStart = true;
}
}
}
CItemCurveArc::SetCurveState(state, pDC);
}
void CItemCurveSpline::AutoClose(void)
{
AppendPoint();
CItemCurveArc::AutoClose();
if (PointList.IsEmpty()) return;
dfPoint dp = PointList.GetHead();
m_spPointList.AddTail(dp);
}
POSITION CItemCurveSpline::NextCurve(void)
{
AppendPoint();
return CItemCurve::NextCurve();
}
void CItemCurveSpline::AppendPoint(void)
{
if (!IsSplineState()) return;
int num = m_spPointList.GetCount();
if (num <= 1) return;
if (num >= 2 && num <= m_nSplineNodes)
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
CCurveEx ce;
ce.SetPoints(m_spCalcPointList, 2);
CPointList pl;
ce.CurveToSpline(pl, GetDC()->GetMiniSmoothStep() * 3, 0);
dfPoint dp;
POSITION pos = pl.GetHeadPosition();
while (pos)
{
dp = pl.GetNext(pos);
AddPoint(dp);
}
}
else if (num > m_nSplineNodes)
{
dfPoint dp;
POSITION pos = m_spRealPointList.GetHeadPosition();
while (pos)
{
dp = m_spRealPointList.GetNext(pos);
AddPoint(dp);
}
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
CCurveEx ce;
ce.SetPoints(m_spCalcPointList, 2);
CPointList pl;
ce.CurveToSpline(pl, GetDC()->GetMiniSmoothStep() * 3, 0);
pos = pl.GetHeadPosition();
while (pos)
{
dp = pl.GetNext(pos);
AddPoint(dp);
}
}
clearSplineData();
}
void CItemCurveSpline::clearSplineData()
{
m_spPointList.RemoveAll();
m_spRealPointList.RemoveAll();
m_spHeadRealPointList.RemoveAll();
m_spCalcPointList.RemoveAll();
}
BOOL CItemCurveSpline::IsSplineState(void)
{
if (m_AddLineState == CURVE_STATE_SPLINE)
return TRUE;
return FALSE;
}
BOOL CItemCurveSpline::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch (nChar)
{
case VK_BACK:
if (IsSplineState() && m_spPointList.GetCount() > 0)//<2F>ӵ<EFBFBD><D3B5>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ǰɾ<C7B0><C9BE>
{
RemoveTail();
//m_spPointList.RemoveTail();//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
if (m_spPointList.GetCount() > m_nSplineNodes)//<2F><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
CopyPreRealPoints();//<2F><><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>б<EFBFBD>
{
m_spRealPointList.RemoveAll();
dfPoint dp, dps;
CPointList pl;
CCurveEx ce;
ce.SetPoints(m_spPointList, 2);
GetDC()->Create(m_pScreenDC);
ce.CurveToSpline(pl, GetDC()->GetMiniSmoothStep() * m_mSmoothStepFactor, 0);
POSITION pos = pl.GetHeadPosition();
int end = m_spPointList.GetCount() - m_nSplineNodes;
int idx = 0;
while (pos)
{
dp = pl.GetNext(pos);
dps = m_spPointList.GetAt(m_spPointList.FindIndex(idx));
if (fabs(dp.x0 - dps.x0) <= DBL_MIN || //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
fabs(dp.y0 - dps.y0) <= DBL_MIN)
{
idx++;
}
if (idx <= end)
{
m_spRealPointList.AddTail(dp);
}
else
{
m_spRealPointList.AddTail(dp);
break;
}
}
}
}
return FALSE;
}
break;
case '1': //ֱ<><D6B1>
//GetView()->OnCurveStateLine();
break;
case '2': //Բ<><D4B2>
//GetView()->OnCurveStateArc();
break;
case '3': //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//GetView()->OnCurveStateSpline();
break;
case '9': //90<39><30><EFBFBD><EFBFBD>
//GetView()->OnCurveStateAngleLine();
break;
}
return CItemCurve::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CItemCurveSpline::IsOnlyPointListTail(void)
{
if (m_spPointList.GetCount() == 1 && !PointList.IsEmpty())
{
dfPoint ds = m_spPointList.GetTail();
dfPoint dp = PointList.GetTail();
if (AfxGetPublicFunction()->Distance2(ds.x0, ds.y0, dp.x0, dp.y0) <= DBL_MIN)
return TRUE;
}
return FALSE;
}
void CItemCurveSpline::OnCancel(void)
{
clearSplineData();
m_bAuxiliarySplineRedraw = FALSE;
CItemCurve::OnCancel();
}
void CItemCurveSpline::RemoveTail(void)
{
int num = m_spPointList.GetCount();
if (0 == num) return;
dfPoint dp;
dfPoint tt;
if (1 == num)
{
if (PointList.GetCount() == 0)
{
if (!m_bStretchStart)//<2F>ѻ<EFBFBD><D1BB><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
m_spPointList.RemoveAll();
}
clearSplineData();
}
if (PointList.GetCount() > 1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֱ<EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
if (!m_bStretchStart)//<2F>ѻ<EFBFBD><D1BB><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
int count = PointList.GetCount();
if (count >= 2)
{
CPen* pOld = m_pScreenDC->SelectObject(&m_pen);
dfPoint dp1, dp2;
dp1 = PointList.GetTail();
dp2 = PointList.GetAt(PointList.FindIndex(PointList.GetCount() - 2));
CPoint pt1 = GetDC()->GetScreen(dp1.x0, dp1.y0);
CPoint pt2 = GetDC()->GetScreen(dp2.x0, dp2.y0);
DrawLineScreen(pt1.x, pt1.y, pt2.x, pt2.y);
m_pScreenDC->SelectObject(pOld);
}
m_spPointList.RemoveAll();
PointList.RemoveTail();
m_spPointList.AddTail(PointList.GetTail());
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
}
return;
}
else if (PointList.GetCount() == 1)
{
if (!m_bStretchStart)//<2F>ѻ<EFBFBD><D1BB><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
m_spPointList.RemoveAll();
PointList.RemoveAll();
}
clearSplineData();
}
return;
}
if (num > 1 && num <= m_nSplineNodes)
{
m_spRealPointList.RemoveAll();
if (!m_bStretchStart)//<2F>ѻ<EFBFBD><D1BB><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
{
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
m_spPointList.RemoveTail();
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
}
else
{
CopySplineTails(m_nSplineNodes);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
dp = m_spPointList.GetTail();
m_spPointList.RemoveTail();
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(dp);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
}
return;
}
if (num > m_nSplineNodes)
{
if (!m_bStretchStart)
{
CopySplineTails(m_nSplineNodes);//<2F><><EFBFBD><EFBFBD><EFBFBD>SPLINE
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
m_spPointList.RemoveTail();//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
CopySplineTails(m_nSplineNodes);//<2F><><EFBFBD><EFBFBD><EFBFBD>SPLINE
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawRealLine(GetDC());//<2F><><EFBFBD><EFBFBD>SPLINE<4E><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dp = m_spCalcPointList.GetHead();
for (int i = m_spRealPointList.GetCount() - 1; i >= 0; i--)
{
tt = m_spRealPointList.GetAt(m_spRealPointList.FindIndex(i));
if (fabs(tt.x0 - dp.x0) <= DBL_MIN && fabs(tt.y0 - dp.y0) <= DBL_MIN)
{
break;
}
else
{
m_spRealPointList.RemoveTail();
}
}
GetDC()->Create(m_pScreenDC);
DrawRealLine(GetDC());//<2F>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GetDC()->Create(m_pScreenDC);//<2F>ػ<EFBFBD><D8BB>SPLINE
DrawSplineTail(GetDC());
}
else
{
CopySplineTails(m_nSplineNodes + 1);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
m_spPointList.RemoveTail();
CopySplineTails(m_nSplineNodes + 1);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);
DrawSplineTail(GetDC());
dp = m_spPointList.GetHead();
for (int i = m_spRealPointList.GetCount() - 1; i >= 0; i--)
{
tt = m_spRealPointList.GetAt(m_spRealPointList.FindIndex(i));
if (fabs(tt.x0 - dp.x0) <= DBL_MIN && fabs(tt.y0 - dp.y0) <= DBL_MIN)
{
break;
}
else
{
m_spRealPointList.RemoveTail();
}
}
}
return;
}
}
void CItemCurveSpline::DrawRealLine(CXyDC * pDC)
{
if (m_spRealPointList.GetCount() <= 1) return;
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
int od = pdc->SetROP2(R2_NOTXORPEN);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPen* pOld = pdc->SelectObject(&m_pen);
dfPoint dp;
POSITION p = m_spRealPointList.GetHeadPosition();
dp = m_spRealPointList.GetNext(p);
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
while (p)
{
dp = m_spRealPointList.GetNext(p);
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
pDC->GetDC()->SelectObject(pOld);
pDC->GetDC()->SetROP2(od);
}
void CItemCurveSpline::Undo(void)
{
if (m_spPointList.IsEmpty())
CItemCurveArc::Undo();
else
{
RemoveTail();
}
}
void CItemCurveSpline::Redo(void)
{
if (IsOnlyPointListTail())
{
CItemCurveArc::Redo();
m_spPointList.RemoveAll();
if (!PointList.IsEmpty())
{
dfPoint dp = PointList.GetTail();
m_spPointList.AddTail(dp);
}
}
}
BOOL CItemCurveSpline::IsCanUndo(void)
{
if (IsOnlyPointListTail())
return CItemCurveArc::IsCanUndo();
return !m_spPointList.IsEmpty();
}
BOOL CItemCurveSpline::IsCanRedo(void)
{
if (IsOnlyPointListTail())
return CItemCurveArc::IsCanRedo();
return FALSE;
}
void CItemCurveSpline::EraseAuxiliarySpline(CDC * pScreenDC)
{
CXyDC * pDC = GetDC();
if (pDC == 0)
return;
pDC->Create(pScreenDC);
CPen * pOld = pScreenDC->SelectObject(&m_pen);
int od = pScreenDC->SetROP2(R2_NOTXORPEN);
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
GetDC()->Create(m_pScreenDC);//<2F>ػ<EFBFBD><D8BB>SPLINE
DrawSplineTail(GetDC());
pScreenDC->SelectObject(pOld);
pScreenDC->SetROP2(od);
m_bAuxiliarySplineRedraw = FALSE;
}
void CItemCurveSpline::DrawAssistant(CDC * pScreenDC, int mouseX, int mouseY)
{
GetDC()->Create(pScreenDC);
CXyDC * pDC = GetDC();
if (pDC == 0)
return;
DrawSplineBody(pDC);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DrawSplineTail(pDC);
//m_bStretchStart = TRUE;
m_bAuxiliarySplineRedraw = TRUE;
m_bStretchStart = FALSE;
/*
CXyDC * pDC = GetDC();
if (pDC == 0)
return;
pDC->Create(pScreenDC);
CPen * pOld = pScreenDC->SelectObject(&m_pen);
//spline
if (m_spPointList.GetCount() == 0)
{
pScreenDC->SelectObject(pOld);
return;
}
CopySplineTails(m_nSplineNodes);
m_spCalcPointList.AddTail(m_dpLastMousePos);
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPointList pl;
CCurveEx ce;
ce.SetPoints(m_spCalcPointList, 2);
ce.CurveToSpline(pl, pDC->GetMiniSmoothStep() * m_mSmoothStepFactor, 0);
if (pl.GetCount() <= 1)
{
pScreenDC->SelectObject(pOld);
return;
}
dfPoint dp1, dp2;
POSITION p = pl.GetHeadPosition();
dp1 = pl.GetNext(p);
POINT prePt;
while (p)
{
dp2 = pl.GetNext(p);
pDC->MoveTo(dp1.x0, dp1.y0);
pDC->LineTo(dp2.x0, dp2.y0);
dp1 = dp2;
}
pScreenDC->SelectObject(pOld);
int count = 0;
CPen pen;
pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
//pOld = (CPen*)pDC->GetDC()->SelectStockObject(BLACK_PEN);
pOld = (CPen*)pScreenDC->SelectObject(&pen);
CRect rt;
POINT sp;
dfPoint dp, dt;
POSITION pos = m_spCalcPointList.GetHeadPosition();
while (pos)
{
dp = m_spCalcPointList.GetNext(pos);
if (count > 0)
{
if (fabs(dt.x0 - dp.x0) < DBL_MIN && //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
fabs(dt.y0 - dp.y0) < DBL_MIN)
continue;
}
sp = pDC->GetScreen(dp.x0, dp.y0);
rt = CalculateHandleRect(&sp);
rt.InflateRect(1, 1);
pDC->GetDC()->Ellipse(&rt);
dt = dp;
count++;
}
m_spCalcPointList.RemoveTail();
DrawSplineTail(GetDC());
DrawRealLine(GetDC());
pScreenDC->SelectObject(pOld);
m_bStretchStart = TRUE;
m_bAuxiliarySplineRedraw = FALSE;
*/
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//CItemCurveMerge
CItemCurveMerge::CItemCurveMerge(CSigmaDoc * ppDoc)
: CItemCurveSpline(ppDoc)
{
m_pItemSelect = new CItemSelectElement(ppDoc);
m_pItemSelect->EnableDraw(FALSE);
m_pItemSelect->SetCompareIdea(1);
m_pItemSelect->SetNumber(-1);
//CMainFrame* pmf = (CMainFrame*)GetDoc()->GetMainFrame();
//if(pmf)pmf->ShowToolBar(IDR_TOOLBAR_PLINE_INSERT, TRUE);
}
CItemCurveMerge::~CItemCurveMerge(void)
{
if (m_pItemSelect)delete m_pItemSelect;
m_pItemSelect = NULL;
//CMainFrame* pmf = (CMainFrame*)GetDoc()->GetMainFrame();
//if(pmf)pmf->ShowToolBar(IDR_TOOLBAR_PLINE_INSERT, FALSE);
}
BOOL CItemCurveMerge::IsMergeState(void)
{
if (m_AddLineState == CURVE_STATE_MERGE)
return TRUE;
return FALSE;
}
void CItemCurveMerge::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
GetDC()->Create(pDC);
if (IsMergeState())
{
m_pItemSelect->OnLButtonDown(pDC, nFlags, point, vk);
if (m_pItemSelect->GetSelectCount() == 1)
{
EraseScreenLines();
CPoint2D dp = GetDC()->GetReal(point);
POSITION pos = m_pItemSelect->GetSelectItem(0);
MergeElement(pos, dp);
m_pItemSelect->RemoveAllSelect(); //ѡ<><D1A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD>
RedrawScreenLines();
}
}
else
CItemCurveSpline::OnLButtonDown(pDC, nFlags, point, vk);
}
int CItemCurveMerge::OnMouseMove(CDC *pDC, UINT nFlags, CPoint point)// , BYTE*& destBuffer, int& destLen)
{
if (IsMergeState() || m_AddLineState == CURVE_STATE_LINE || m_AddLineState == CURVE_STATE_ANGLE)
{
CItemCurve::OnMouseMove(pDC, nFlags, point);
return 1;
}
SetScreenDC(pDC);
GetDC()->Create(pDC);
int count = m_ptDisposableList.GetSize() / 2;
for (int i = 0; i < count; i++)
{
dfPoint pt1 = m_ptDisposableList.GetHead();
m_ptDisposableList.RemoveHead();
dfPoint pt2 = m_ptDisposableList.GetHead();
m_ptDisposableList.RemoveHead();
DrawLine(pt1, pt2);
}
m_ptDisposableList.RemoveAll();
CItemCurveSpline::OnMouseMove(pDC, nFlags, point);// , destBuffer, destLen);
return 1;
}
void CItemCurveMerge::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (IsMergeState())
{
m_pItemSelect->OnLButtonUp(pDC, nFlags, point, vk);
}
else
CItemCurveSpline::OnLButtonUp(pDC, nFlags, point, vk);
}
void CItemCurveMerge::DrawAssistant(CDC * pScreenDC, int mouseX, int mouseY)
{
if (m_AddLineState == CURVE_STATE_SPLINE)
{
CItemCurveSpline::DrawAssistant(pScreenDC, mouseX, mouseY);
}
CItemCurve::DrawAssistant(pScreenDC, mouseX, mouseY);
}
BOOL CItemCurveMerge::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (IsMergeState())
return m_pItemSelect->OnSetCursor(pWnd, nHitTest, message);
return CItemCurveSpline::OnSetCursor(pWnd, nHitTest, message);
}
void CItemCurveMerge::EndCurve()
{
if (IsSplineState())
{
CItemCurveSpline::NextCurve();
return;
}
else
{
CItemCurve::NextCurve();
}
}
void CItemCurveMerge::AddCurve()
{
NextCurve();
}
void CItemCurveMerge::AutoClose(void)
{
AppendPoint();
if (PointList.IsEmpty())
return;
dfPoint dp = PointList.GetHead();
m_ptDisposableList.AddTail(dp); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>
m_ptDisposableList.AddTail(PointList.GetTail());
m_ptDisposableList.AddTail(m_dpLastMousePos); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4>
m_ptDisposableList.AddTail(PointList.GetTail());
AddPoint(dp);
m_dpLastMousePos = dp;
}
void CItemCurveMerge::ChangeMergeState()
{
if (m_AddLineState == CURVE_STATE_MERGE)
{
CItemCurve::RestoreCurveState();
if (PointList.IsEmpty())
return;
dfPoint dp = PointList.GetTail();
m_spPointList.AddTail(dp);
}
else
{
if (IsSplineState())
{
AppendPoint();
}
CItemCurve::SetCurveState(CURVE_STATE_MERGE, NULL);
}
}
void CItemCurveMerge::OnCancel(void)
{
switch (m_AddLineState)
{
case CURVE_STATE_MERGE:
case CURVE_STATE_LINE:
case CURVE_STATE_ARC:
case CURVE_STATE_ANGLE:
CItemCurve::OnCancel();
break;
case CURVE_STATE_SPLINE:
CItemCurveSpline::OnCancel();
default:
break;
}
}
void CItemCurveMerge::SetCurveState(int state, CDC * pDC)
{
if (state == m_AddLineState)//<2F><><EFBFBD>úϲ<C3BA><CFB2><EFBFBD><EFBFBD><EFBFBD>״̬
{
return;
}
if (state == CURVE_STATE_MERGE)
{
m_AddLineState = CURVE_STATE_MERGE;
CItemCurve::SetCurveState(CURVE_STATE_MERGE, NULL);
return;
}
if (state == CURVE_STATE_DRAWING)
{
/*CItemCurve::RestoreCurveState();
if (PointList.IsEmpty())
return;
dfPoint dp = PointList.GetTail();
m_spPointList.AddTail(dp);
return;*/
}
else
{
CItemCurveSpline::SetCurveState(state, pDC);
}
}
void CItemCurveMerge::EreaseOldLine()
{
dfPoint ptTail = PointList.GetTail();
CPoint ptT = GetDC()->GetScreen(ptTail);
CPoint ptPrev = GetDC()->GetScreen(m_dpLastMousePos);
DrawLineScreen(ptPrev.x, ptPrev.y, ptT.x, ptT.y);
}
void CItemCurveMerge::DrawLine(dfPoint pt1, dfPoint pt2)
{
CPoint pt1S = GetDC()->GetScreen(pt1);
CPoint pt2S = GetDC()->GetScreen(pt2);
DrawLineScreen(pt1S.x, pt1S.y, pt2S.x, pt2S.y);
}
void CItemCurveMerge::MergeElement(POSITION pos, CPoint2D& dp)
{
if (pos == NULL) return;
if (m_pDoc == NULL)
return;
COne* pOne = m_pDoc->GetDraw()->GetAt(pos);
if (pOne == NULL)
return;
switch (pOne->GetType())
{
case DOUBLEFOX_CURVE:
{
CCurveEx* pc = (CCurveEx*)pOne->GetValue();
double dis = AfxGetPublicFunction()->Distance2(dp.x0, dp.y0, pc->x[0], pc->y[0]);
if (dis < AfxGetPublicFunction()->Distance2(dp.x0, dp.y0, pc->x[pc->num - 1], pc->y[pc->num - 1]))//<2F><>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
{
for (int i = 0; i < pc->num; i++)
this->AddPointFromCoordinate(pc->x[i], pc->y[i]);
}
else//<2F><>β<EFBFBD><CEB2><EFBFBD><EFBFBD>
{
int lastIndex = pc->num - 1;
for (int i = lastIndex; i >= 0; i--)
this->AddPointFromCoordinate(pc->x[i], pc->y[i]);
}
m_dpLastMousePos = PointList.GetTail();
}
break;
case DOUBLEFOX_MXN:
case DOUBLEFOX_XYZ:
case DOUBLEFOX_POINT:
case DOUBLEFOX_TEXT:
case DOUBLEFOX_ELLIPSE:
case DOUBLEFOX_CIRCLE:
case DOUBLEFOX_INSERT:
case DOUBLEFOX_DRAW:
case DOUBLEFOX_DRAW_RECT:
case DOUBLEFOX_PROPORTION:
case DOUBLEFOX_FRAME:
case DOUBLEFOX_IMAGE:
case DOUBLEFOX_OLE:
case DOUBLEFOX_TREE:
case DOUBLEFOX_WMF:
case DOUBLEFOX_STATION:
case DOUBLEFOX_MTEXT:
{
CPointNameBase* pPoint = (CPointNameBase*)pOne->GetValue();
dfPoint dp;
dp.x0 = pPoint->x0;
dp.y0 = pPoint->y0;
AddPoint(dp);
}
break;
}
}
static CRect CalculateHandleRect(LPPOINT pPoint)
{
CRect rc(*pPoint, *pPoint);
//int d = m_HandleSize / 2; //m_HandleSize = 8
int d = 4;
rc.InflateRect(d, d);
return rc;
}
}//namespace