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.

918 lines
20 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_nSplineNodes = 5;
m_mSmoothStepFactor = 3;
}
CItemCurveSpline::~CItemCurveSpline(void)
{
}
void CItemCurveSpline::OnDraw(CXyDC* pDC)
{
1 month ago
}
void CItemCurveSpline::DrawSplineCurve(CXyDC* pDC, const CPointList& controlPoints)
{
if (controlPoints.GetCount() <= 1)
1 month ago
{
1 month ago
return;
1 month ago
}
1 month ago
// Build spline curve from control points
CPointList sampledPoints;
BuildSplineCurve(controlPoints, sampledPoints);
if (sampledPoints.GetCount() <= 1)
1 month ago
{
1 month ago
return;
1 month ago
}
1 month ago
// Draw the curve
1 month ago
CDC* pdc = pDC->GetDC();
HDC hdc = pdc->m_hDC;
CPen* pOld = pdc->SelectObject(&m_pen);
1 month ago
POSITION pos = sampledPoints.GetHeadPosition();
dfPoint dp = sampledPoints.GetNext(pos);
1 month ago
CPoint pt1 = pDC->GetScreen(dp.x0, dp.y0);
CPoint pt2;
POINT prePt;
1 month ago
while (pos)
1 month ago
{
1 month ago
dp = sampledPoints.GetNext(pos);
1 month ago
pt2 = pDC->GetScreen(dp.x0, dp.y0);
::MoveToEx(hdc, pt1.x, pt1.y, &prePt);
::LineTo(hdc, pt2.x, pt2.y);
pt1 = pt2;
}
1 month ago
pdc->SelectObject(pOld);
1 month ago
}
1 month ago
void CItemCurveSpline::DrawControlPointHandles(CXyDC* pDC, const CPointList& controlPoints)
1 month ago
{
1 month ago
if (controlPoints.GetCount() == 0)
1 month ago
{
return;
}
1 month ago
CDC* pdc = pDC->GetDC();
1 month ago
CPen pen;
1 month ago
pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
CPen* pOld = pdc->SelectObject(&pen);
dfPoint prevPoint;
BOOL hasPrev = FALSE;
POSITION pos = controlPoints.GetHeadPosition();
1 month ago
while (pos)
{
1 month ago
dfPoint dp = controlPoints.GetNext(pos);
// Skip duplicate points
if (hasPrev && fabs(prevPoint.x0 - dp.x0) < 1e-3 && fabs(prevPoint.y0 - dp.y0) < 1e-3)
continue;
CPoint sp = pDC->GetScreen(dp.x0, dp.y0);
CRect rt = CalculateHandleRect(&sp);
1 month ago
rt.InflateRect(1, 1);
1 month ago
pdc->Ellipse(&rt);
prevPoint = dp;
hasPrev = TRUE;
1 month ago
}
1 month ago
1 month ago
pdc->SelectObject(pOld);
}
1 month ago
void CItemCurveSpline::BuildSplineCurve(const CPointList& controlPoints, CPointList& outSampledPoints)
1 month ago
{
1 month ago
outSampledPoints.RemoveAll();
if (controlPoints.GetCount() <= 1)
1 month ago
{
1 month ago
return;
1 month ago
}
1 month ago
CCurveEx ce;
ce.SetPoints(const_cast<CPointList&>(controlPoints), 2);
ce.CurveToSpline(outSampledPoints, GetDC()->GetMiniSmoothStep() * m_mSmoothStepFactor, 0);
1 month ago
}
1 month ago
size_t CItemCurveSpline::FindCommonPrefixLength(const std::vector<CPoint>& oldPoints,
const std::vector<CPoint>& newPoints)
1 month ago
{
1 month ago
size_t commonCount = 0;
size_t minSize = (oldPoints.size() < newPoints.size())
? oldPoints.size() : newPoints.size();
for (size_t i = 0; i < minSize; i++)
1 month ago
{
1 month ago
if (oldPoints[i] == newPoints[i])
commonCount++;
else
break;
1 month ago
}
1 month ago
return commonCount;
}
1 month ago
1 month ago
void CItemCurveSpline::DrawPolylineXOR(CDC* pDC, const std::vector<CPoint>& points, size_t startIdx)
{
for (size_t i = startIdx; i + 1 < points.size(); i++)
1 month ago
{
1 month ago
pDC->MoveTo(points[i]);
pDC->LineTo(points[i + 1]);
1 month ago
}
1 month ago
}
1 month ago
1 month ago
void CItemCurveSpline::IncrementalUpdatePreview(CDC* pScreenDC, const std::vector<CPoint>& newScreenPoints)
{
size_t commonCount = FindCommonPrefixLength(m_cachedScreenPoints, newScreenPoints);
// Setup XOR drawing mode
int od = pScreenDC->SetROP2(R2_NOTXORPEN);
CPen* pOld = pScreenDC->SelectObject(&m_pen);
// Erase old different segments
if (commonCount < m_cachedScreenPoints.size())
1 month ago
{
1 month ago
// Start from commonCount-1 to ensure continuity, but don't go below 0
size_t startIdx = (commonCount > 0) ? commonCount - 1 : 0;
DrawPolylineXOR(pScreenDC, m_cachedScreenPoints, startIdx);
1 month ago
}
1 month ago
// Draw new different segments
if (commonCount < newScreenPoints.size())
{
// Start from commonCount-1 to ensure continuity, but don't go below 0
size_t startIdx = (commonCount > 0) ? commonCount - 1 : 0;
DrawPolylineXOR(pScreenDC, newScreenPoints, startIdx);
}
// Restore
pScreenDC->SelectObject(pOld);
pScreenDC->SetROP2(od);
// Update cache
m_cachedScreenPoints = newScreenPoints;
1 month ago
}
1 month ago
void CItemCurveSpline::ErasePreview(CDC* pScreenDC)
1 month ago
{
1 month ago
if (pScreenDC == 0 || m_cachedScreenPoints.size() <= 1)
return;
1 month ago
1 month ago
// Use XOR to erase using exact cached screen coordinates
int od = pScreenDC->SetROP2(R2_NOTXORPEN);
CPen* pOld = pScreenDC->SelectObject(&m_pen);
for (size_t i = 0; i + 1 < m_cachedScreenPoints.size(); i++)
1 month ago
{
1 month ago
pScreenDC->MoveTo(m_cachedScreenPoints[i]);
pScreenDC->LineTo(m_cachedScreenPoints[i + 1]);
1 month ago
}
1 month ago
pScreenDC->SelectObject(pOld);
pScreenDC->SetROP2(od);
m_cachedScreenPoints.clear();
1 month ago
}
1 month ago
void CItemCurveSpline::DrawPreview(CDC* pScreenDC)
1 month ago
{
1 month ago
if (pScreenDC == 0 || m_controlPoints.GetCount() == 0)
1 month ago
{
1 month ago
return;
1 month ago
}
1 month ago
// Build preview control points (existing + current mouse position)
CPointList previewControlPoints;
POSITION pos = m_controlPoints.GetHeadPosition();
while (pos)
1 month ago
{
1 month ago
previewControlPoints.AddTail(m_controlPoints.GetNext(pos));
1 month ago
}
1 month ago
previewControlPoints.AddTail(m_dpLastMousePos);
if (previewControlPoints.GetCount() <= 1)
1 month ago
{
return;
}
1 month ago
// Build spline curve
CPointList sampledPoints;
BuildSplineCurve(previewControlPoints, sampledPoints);
if (sampledPoints.GetCount() <= 1)
1 month ago
{
1 month ago
return;
1 month ago
}
1 month ago
// Convert to screen points
CXyDC* pDC = GetDC();
if (pDC == 0)
return;
pDC->Create(pScreenDC);
std::vector<CPoint> newScreenPoints;
pos = sampledPoints.GetHeadPosition();
1 month ago
while (pos)
{
1 month ago
dfPoint dp = sampledPoints.GetNext(pos);
CPoint pt = pDC->GetScreen(dp.x0, dp.y0);
newScreenPoints.push_back(pt);
1 month ago
}
1 month ago
if (newScreenPoints.size() < 2)
1 month ago
{
1 month ago
return;
1 month ago
}
1 month ago
// Incremental update using XOR diff
IncrementalUpdatePreview(pScreenDC, newScreenPoints);
1 month ago
}
1 month ago
void CItemCurveSpline::DrawControlPointHandles(CDC * pDC)
1 month ago
{
1 month ago
if (m_controlPoints.GetCount() > 0)
1 month ago
{
1 month ago
CXyDC* pXyDC = GetDC();
if (pXyDC)
1 month ago
{
1 month ago
pXyDC->Create(pDC);
DrawControlPointHandles(pXyDC, m_controlPoints);
1 month ago
}
}
1 month ago
}
void CItemCurveSpline::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (!IsSplineState())
1 month ago
{
1 month ago
CItemCurveArc::OnLButtonDown(pDC, nFlags, point, vk);
return;
1 month ago
}
1 month ago
ClearRedoList();
dfPoint dp = GetRealPoint(m_controlPoints, nFlags, point);
// Add control point
m_controlPoints.AddTail(dp);
TRACE("m_controlPoints.Count = %d\n", m_controlPoints.GetCount());
m_bStretchStart = TRUE;
1 month ago
}
1 month ago
1 month ago
int CItemCurveSpline::OnMouseMove(CDC* pDC, UINT nFlags, CPoint point)
{
m_pScreenDC = pDC;
1 month ago
if (m_controlPoints.GetCount() == 0)
1 month ago
{
return 1;
}
1 month ago
// Update preview point
dfPoint dp = GetRealPoint(m_controlPoints, nFlags, point);
// Update mouse position
m_dpLastMousePos = dp;
// Draw new preview (with incremental diff update)
DrawPreview(pDC);
DrawControlPointHandles(pDC);
m_bStretchStart = FALSE;
1 month ago
return 1;
}
void CItemCurveSpline::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (!IsSplineState())
{
1 month ago
CItemCurveArc::OnLButtonUp(pDC, nFlags, point, vk);
1 month ago
}
}
void CItemCurveSpline::SetCurveState(int state, CDC * pDC)
{
1 month ago
if (state == m_AddLineState)
{
return;
}
1 month ago
1 month ago
if (m_AddLineState == CURVE_STATE_SPLINE)
1 month ago
{
1 month ago
AppendPoint(); // Finalize current spline
1 month ago
}
1 month ago
if (state == CURVE_STATE_SPLINE)
1 month ago
{
1 month ago
m_controlPoints.RemoveAll();
1 month ago
if (PointList.GetCount() > 0)
{
dfPoint dp = PointList.GetTail();
1 month ago
m_controlPoints.AddTail(dp); // Start new spline from last point
1 month ago
if (!m_bStretchStart)
{
1 month ago
EraseRubberLine();
DrawPreview(pDC);
1 month ago
m_bStretchStart = true;
}
}
}
CItemCurveArc::SetCurveState(state, pDC);
}
void CItemCurveSpline::AutoClose(void)
{
AppendPoint();
CItemCurveArc::AutoClose();
if (PointList.IsEmpty()) return;
dfPoint dp = PointList.GetHead();
1 month ago
m_controlPoints.AddTail(dp);
1 month ago
}
POSITION CItemCurveSpline::NextCurve(void)
{
AppendPoint();
return CItemCurve::NextCurve();
}
void CItemCurveSpline::AppendPoint(void)
{
1 month ago
if (!IsSplineState())
1 month ago
{
1 month ago
return;
1 month ago
}
1 month ago
if (m_controlPoints.GetCount() <= 1)
1 month ago
{
1 month ago
return;
}
1 month ago
1 month ago
// Build complete spline curve including current mouse position
CPointList finalControlPoints;
POSITION pos = m_controlPoints.GetHeadPosition();
while (pos)
{
finalControlPoints.AddTail(m_controlPoints.GetNext(pos));
}
finalControlPoints.AddTail(m_dpLastMousePos);
// Convert to sampled points and add to finalized curve
CPointList sampledPoints;
BuildSplineCurve(finalControlPoints, sampledPoints);
pos = sampledPoints.GetHeadPosition();
while (pos)
{
dfPoint dp = sampledPoints.GetNext(pos);
AddPoint(dp);
1 month ago
}
1 month ago
1 month ago
clearSplineData();
}
void CItemCurveSpline::clearSplineData()
{
1 month ago
m_controlPoints.RemoveAll();
m_cachedScreenPoints.clear();
1 month ago
}
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:
1 month ago
if (IsSplineState() && m_controlPoints.GetCount() > 0)
1 month ago
{
RemoveTail();
return FALSE;
}
break;
1 month ago
case '1': //Line
1 month ago
break;
1 month ago
case '2': //Arc
1 month ago
break;
1 month ago
case '3': //Spline
1 month ago
break;
1 month ago
case '9': //90 degree
1 month ago
break;
}
return CItemCurve::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CItemCurveSpline::IsOnlyPointListTail(void)
{
1 month ago
if (m_controlPoints.GetCount() == 1 && !PointList.IsEmpty())
1 month ago
{
1 month ago
dfPoint ds = m_controlPoints.GetTail();
1 month ago
dfPoint dp = PointList.GetTail();
if (AfxGetPublicFunction()->Distance2(ds.x0, ds.y0, dp.x0, dp.y0) <= DBL_MIN)
1 month ago
{
1 month ago
return TRUE;
1 month ago
}
1 month ago
}
return FALSE;
}
void CItemCurveSpline::OnCancel(void)
{
clearSplineData();
CItemCurve::OnCancel();
}
void CItemCurveSpline::RemoveTail(void)
{
1 month ago
if (m_controlPoints.GetCount() == 0)
1 month ago
return;
1 month ago
// Normal case: multiple control points, incremental update handles erase+redraw
if (m_controlPoints.GetCount() > 1)
1 month ago
{
1 month ago
m_controlPoints.RemoveTail();
DrawPreview(m_pScreenDC);
DrawControlPointHandles(m_pScreenDC);
1 month ago
return;
}
1 month ago
// Only one control point left: erase preview and fall back to PointList
ErasePreview(m_pScreenDC);
1 month ago
1 month ago
if (PointList.IsEmpty())
{
clearSplineData();
1 month ago
return;
}
1 month ago
// Undo last finalized point
PointList.RemoveTail();
1 month ago
1 month ago
if (PointList.IsEmpty())
1 month ago
{
1 month ago
clearSplineData();
return;
1 month ago
}
1 month ago
// Restart spline from new tail of PointList
m_controlPoints.RemoveAll();
m_controlPoints.AddTail(PointList.GetTail());
DrawPreview(m_pScreenDC);
DrawControlPointHandles(m_pScreenDC);
1 month ago
}
void CItemCurveSpline::Undo(void)
{
1 month ago
if (m_controlPoints.IsEmpty())
{
1 month ago
CItemCurveArc::Undo();
1 month ago
}
1 month ago
else
{
RemoveTail();
}
}
void CItemCurveSpline::Redo(void)
{
if (IsOnlyPointListTail())
{
CItemCurveArc::Redo();
1 month ago
m_controlPoints.RemoveAll();
1 month ago
if (!PointList.IsEmpty())
{
dfPoint dp = PointList.GetTail();
1 month ago
m_controlPoints.AddTail(dp);
1 month ago
}
}
}
BOOL CItemCurveSpline::IsCanUndo(void)
{
if (IsOnlyPointListTail())
return CItemCurveArc::IsCanUndo();
1 month ago
return !m_controlPoints.IsEmpty();
1 month ago
}
BOOL CItemCurveSpline::IsCanRedo(void)
{
if (IsOnlyPointListTail())
return CItemCurveArc::IsCanRedo();
return FALSE;
}
void CItemCurveSpline::EraseAuxiliarySpline(CDC * pScreenDC)
{
1 month ago
ErasePreview(pScreenDC);
1 month ago
}
void CItemCurveSpline::DrawAssistant(CDC * pScreenDC, int mouseX, int mouseY)
{
1 month ago
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ棬<D8BB><E6A3AC><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ʧЧ<CAA7><D0A7><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
m_cachedScreenPoints.clear();
DrawPreview(pScreenDC);
DrawControlPointHandles(pScreenDC);
1 month ago
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//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);
1 month ago
m_pItemSelect->RemoveAllSelect(); //?????????
1 month ago
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();
1 month ago
m_ptDisposableList.AddTail(dp); //????????
1 month ago
m_ptDisposableList.AddTail(PointList.GetTail());
1 month ago
m_ptDisposableList.AddTail(m_dpLastMousePos); //?????
1 month ago
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();
1 month ago
m_controlPoints.AddTail(dp);
1 month ago
}
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)
{
1 month ago
if (state == m_AddLineState)//????????
1 month ago
{
return;
}
if (state == CURVE_STATE_MERGE)
{
m_AddLineState = CURVE_STATE_MERGE;
CItemCurve::SetCurveState(CURVE_STATE_MERGE, NULL);
return;
}
if (state == CURVE_STATE_DRAWING)
{
1 month ago
// No special handling needed
1 month ago
}
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]);
1 month ago
if (dis < AfxGetPublicFunction()->Distance2(dp.x0, dp.y0, pc->x[pc->num - 1], pc->y[pc->num - 1]))//????
1 month ago
{
for (int i = 0; i < pc->num; i++)
this->AddPointFromCoordinate(pc->x[i], pc->y[i]);
}
1 month ago
else//????
1 month ago
{
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