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.

928 lines
19 KiB
C++

1 month ago
#include "StdAfx.h"
#include "DCHelp.h"
#include "SigmaDoc.h"
#include ".\itemcurve.h"
#define PEN_WIDTH 2
CItemCurve::CItemCurve(CSigmaDoc * ppDoc)
: CItem(ppDoc)
, m_AddLineState(CURVE_STATE_LINE)
, m_bContinuePen(FALSE)
, m_bStretchStart(TRUE)
{
m_AddLineState = ppDoc->GetEditLineStatus() % 4;
this->SetType(ITEM_CURVE);
m_pen.CreatePen(PS_SOLID, PEN_WIDTH, PEN_COLOR);
m_oldLineState = 0;
m_bAuxiliaryCurveRedraw = FALSE;
}
CItemCurve::~CItemCurve(void)
{
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ͼ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ״̬.
*
*/
void CItemCurve::Reset(void)
{
EraseScreenLines();
PointList.RemoveAll();
m_bContinuePen = FALSE;
m_bStretchStart = TRUE;
}
void NItem::CItemCurve::OnCancel(void)
{
Reset();
}
bool NItem::CItemCurve::GetAngleAndDistance(double &angle, double &distance) const
{
if (std::isnan(m_angle) || std::isnan(m_distance))
{
return false;
}
angle = m_angle;
distance = m_distance;
return true;
}
BOOL CItemCurve::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (this->IsEditState())
return FALSE;
//GetDoc()->GetCursor().SetCursor(CursorDrawCurve);
//return GetDoc()->GetCursor().SetCursor();
return TRUE;
}
POSITION CItemCurve::InsertPointWithPointDistance(double x, double y)
{
if (PointList.GetCount() <= 1)
{
AddPointFromCoordinate(x, y);
return PointList.GetHeadPosition();
}
CCurveEx* pc = new CCurveEx;
pc->SetPoints(PointList, 2);
double x0, y0, z0, l0;
if (pc->PointDistance(x, y, l0) > 1e30)
{
delete pc;
return NULL;
}
pc->GetCoordinate(l0, x0, y0, z0);
int i = AfxGetPublicFunction()->BinarySearch(l0, pc->num, pc->l);
dfPoint dp;
dp.x0 = x0;
dp.y0 = y0;
POSITION pos = NULL;
if (i < 0)
{
pos = AddPoint(dp, TRUE);
REDO_ITEM item;
item.point = dp;
item.bHead = TRUE;
item.pos = pos;
UndoList.AddHead(item);
}
else if (i > pc->num - 1)
{
AddPointFromCoordinate(x0, y0);
pos = PointList.GetTailPosition();
}
pos = PointList.FindIndex(i);
if (pos != NULL)
{
pos = PointList.InsertAfter(pos, dp);
REDO_ITEM item;
item.point = dp;
item.bHead = FALSE;
item.pos = pos;
UndoList.AddHead(item);
}
delete pc;
return pos;
}
void CItemCurve::AddPointFromCoordinate(double x, double y)
{
dfPoint dp;
dp.x0 = x;
dp.y0 = y;
AddPoint(dp);
}
void CItemCurve::AddPoint(dfPoint point)
{
POSITION pos = AddPoint(point, FALSE);
REDO_ITEM item;
item.point = point;
item.bHead = FALSE;
item.pos = pos;
UndoList.AddHead(item);
}
void NItem::CItemCurve::AutoClose(void)
{
if (PointList.IsEmpty()) return;
dfPoint dp = PointList.GetHead();
AddPoint(dp);
m_dpLastMousePos = dp;
}
1 month ago
CSpatialIndex& NItem::CItemCurve::GetSpatialIndex()
{
if (m_pSpatialIndex == nullptr)
{
m_pSpatialIndex = std::make_unique<CSpatialIndex>(*GetDoc()->GetDraw());
}
return *m_pSpatialIndex;
}
1 month ago
void CItemCurve::GetAnglePoint(dfPoint &ddp, double angle)
{
if (PointList.GetCount() < 2) return;
dfPoint pt, pp;
POSITION p = PointList.GetTailPosition();
pt = PointList.GetPrev(p);
pp = PointList.GetPrev(p);
CPoint2D cp; cp.x0 = pp.x0; cp.y0 = pp.y0;
cp.Rotate(pt.x0, pt.y0, angle);
if (fabs(angle - 90) < 1e-10 && fabs(pt.x0 - cp.x0) < 1e-10)
{
ddp.x0 = pt.x0;
return;
}
double k, b;
AfxGetPublicFunction()->GetKB(pt.x0, pt.y0, cp.x0, cp.y0, k, b); //y=kx+b;
double a = AfxGetPublicFunction()->GetAngle(pt.x0, pt.y0, pp.x0, pp.y0);
if (fabs(a) < 45.0 || fabs(a) < 135.0)
ddp.y0 = k * ddp.x0 + b;
else
ddp.x0 = (ddp.y0 - b) / k;
}
void NItem::CItemCurve::storeAngleAndDistance(dfPoint& point1, dfPoint& point2)
{
m_angle = AfxGetPublicFunction()->GetAngle(point1.x0, point1.y0, point2.x0, point2.y0);
if (m_angle < 0)
{
m_angle += 360;
}
double a = point2.x0 - point1.x0;
double b = point2.y0 - point1.y0;
m_distance = sqrt(a * a + b * b);
}
void NItem::CItemCurve::clearAngleAndDistance()
{
m_angle = std::numeric_limits<double>::quiet_NaN();
m_distance = std::numeric_limits<double>::quiet_NaN();
}
dfPoint CItemCurve::GetRealPoint(CPointList& pl, UINT nFlags, CPoint point)
{
dfPoint dp = GetReal(point);
if (pl.GetCount() > 0)
{
CurPoint = pl.GetTail();
//if(nFlags & MK_SHIFT)//if the SHIFT key is down
if (::IsKeyDown(VK_SHIFT)) // <20><><EFBFBD><EFBFBD> shift ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>45<34><35><EFBFBD><EFBFBD>ת
1 month ago
{
1 month ago
dp = GetShiftDownPoint(CurPoint.x0, CurPoint.y0, dp.x0, dp.y0);
1 month ago
return dp;
}
1 month ago
}
if (m_AddLineState == CURVE_STATE_ANGLE)
GetAnglePoint(dp, 90.0);
if (GetDoc()->IsSnapEnabled())
{
1 month ago
std::optional<CPoint2D> snapPoint = GetSpatialIndex().GetSnapPoint(dp, m_snapRange);
1 month ago
if (snapPoint)
{
dfPoint point;
point.x0 = snapPoint.value().x0;
point.y0 = snapPoint.value().y0;
return point;
}
}
return dp;
}
void CItemCurve::OnLButtonDblClk(UINT nFlags, CPoint point)
{
dfPoint dp = GetRealPoint(PointList, nFlags, point);
if (fabs(dp.x0 - m_dpLastMousePos.x0) > ZERO || fabs(dp.y0 - m_dpLastMousePos.y0) > ZERO)
{
AddPoint(dp);
m_dpLastMousePos = dp;
}
NextCurve();
}
void CItemCurve::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>δ<EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>ߣ<EFBFBD>m_bStretchStartΪTRUE
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>β<EFBFBD><CEB2>
if (!m_bStretchStart && PointList.GetCount() > 0)
{
EraseRubberLine();
m_bStretchStart = TRUE;
}
//<2F><><EFBFBD>ӵ<EFBFBD>
dfPoint dp = GetRealPoint(PointList, nFlags, point);
AddPoint(dp);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
DrawAssistantLineLastSegment();
m_dpLastMousePos = PointList.GetTail();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
ClearRedoList();
}
int CItemCurve::OnMouseMove(CDC* pDC, UINT nFlags, CPoint point)
{
SetScreenDC(pDC);
// <20><><EFBFBD><EFBFBD> shift ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>45<34><35><EFBFBD><EFBFBD>ת,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
dfPoint dp = GetRealPoint(PointList, nFlags, point);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_bContinuePen && (nFlags & MK_LBUTTON))
{
AddPoint(dp);
}
else if (!PointList.IsEmpty())
{
dfPoint dpTail = PointList.GetTail();
storeAngleAndDistance(dpTail, dp);
CPoint ptTail = GetDC()->GetScreen(dpTail);
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>point <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>shift<66><74>ʱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>45<34><35><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPoint ptCur = GetDC()->GetScreen(dp);
CPoint ptPrev = GetDC()->GetScreen(m_dpLastMousePos);
if (m_bAuxiliaryCurveRedraw)
{
DrawRubberLine();
}
if (!m_bStretchStart)
{
DrawLineScreen(ptPrev.x, ptPrev.y, ptTail.x, ptTail.y);
}
DrawLineScreen(ptCur.x, ptCur.y, ptTail.x, ptTail.y);
}
else
{
clearAngleAndDistance();
}
m_dpLastMousePos = dp;
m_bStretchStart = FALSE;
m_bAuxiliaryCurveRedraw = FALSE;
return 1;
}
void CItemCurve::EraseAuxiliaryLines(CDC * pScreenDC)
{
CXyDC * pDC = GetDC();
if (pDC == 0)
return;
pDC->Create(pScreenDC);
if (PointList.GetCount() == 0)
return;
int od = pScreenDC->SetROP2(R2_NOTXORPEN);
CPen * pOld = pScreenDC->SelectObject(&m_pen);
dfPoint dp;
POSITION p = PointList.GetHeadPosition();
dp = PointList.GetNext(p);
pDC->MoveTo(dp.x0, dp.y0);
while (p)
{
dp = PointList.GetNext(p);
pDC->LineTo(dp.x0, dp.y0);
}
pScreenDC->SelectObject(pOld);
pScreenDC->SetROP2(od);
m_bAuxiliaryCurveRedraw = TRUE;
m_bStretchStart = TRUE;
}
void CItemCurve::DrawAssistant(CDC * pScreenDC, int mouseX, int mouseY)
{
CXyDC * pDC = GetDC();
if (pDC == 0)
return;
pDC->Create(pScreenDC);
if (PointList.GetCount() == 0)
return;
CPen * pOld = pScreenDC->SelectObject(&m_pen);
dfPoint dp;
POSITION p = PointList.GetHeadPosition();
dp = PointList.GetNext(p);
pDC->MoveTo(dp.x0, dp.y0);
while (p)
{
dp = PointList.GetNext(p);
pDC->LineTo(dp.x0, dp.y0);
}
pScreenDC->SelectObject(pOld);
if (m_AddLineState != CURVE_STATE_SPLINE)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
dp = PointList.GetTail();
pDC->MoveTo(dp.x0, dp.y0);
pDC->LineTo(m_dpLastMousePos.x0, m_dpLastMousePos.y0);
}
m_bAuxiliaryCurveRedraw = TRUE;
m_bStretchStart = TRUE;
}
/**
* @brief <EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD>ȫͼ<EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
* @param pDC
*/
void CItemCurve::OnDraw(CXyDC* pXyDC, CDC* pDC)
{
m_bStretchStart = TRUE;
}
BOOL CItemCurve::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
dfPoint dp1;
switch (nChar)
{
case VK_RETURN://VK_RETURN
NextCurve();
break;
case VK_ESCAPE:
//Reset();
break;
case VK_BACK://VK_BACK <20>ӵ<EFBFBD><D3B5>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ǰɾ<C7B0><C9BE>
{
if (m_AddLineState != CURVE_STATE_LINE)break;
RemoveAssistantLineTailPoint();
}
break;
case VK_DELETE: //<2F>ӵ<EFBFBD><D3B5>б<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>
if (m_AddLineState != CURVE_STATE_LINE)break;
RemoveAssistantLineFirstPoint();
/*pos = PointList.GetHeadPosition();
if (pos == NULL)break;
dp1 = PointList.GetAt(pos);*/
//RemoveAt(pos);
//{
// REDO_ITEM item;
// item.point = dp1;
// item.bHead = TRUE;
// item.pos = NULL;
// UndoList.AddHead(item);
//}
break;
}
return FALSE;
}
BOOL CItemCurve::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_ESCAPE)
{
//Reset();
return TRUE;
}
return FALSE;
}
void CItemCurve::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
}
int CItemCurve::GetSubMenu()
{
return 4;
}
void CItemCurve::Draw(CXyDC* pDC, CPointList& pl, COLORREF color)
{
if (pl.GetCount() <= 0) return;
CPen* pOld = pDC->GetDC()->SelectObject(&m_pen);
dfPoint dp;
POSITION p = pl.GetHeadPosition();
dp = pl.GetNext(p);
pDC->MoveTo(dp.x0, dp.y0);
pDC->LineTo(dp.x0, dp.y0);
while (p)
{
dp = pl.GetNext(p);
pDC->LineTo(dp.x0, dp.y0);
}
pDC->GetDC()->SelectObject(pOld);
}
void CItemCurve::RemoveAssistantLineTailPoint()
{
POSITION startPos = NULL;
POSITION endPos = NULL;
POSITION pos = NULL;
dfPoint startDp;
dfPoint endDp;
dfPoint dp;
CPoint startPt;
CPoint endPt;
int count = PointList.GetCount();
if (count > 1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
if (!m_bStretchStart) {
DrawRubberLine();
}
startPos = PointList.FindIndex(count - 2);
endPos = PointList.FindIndex(count - 1);
startDp = PointList.GetAt(startPos);
endDp = PointList.GetAt(endPos);
startPt = GetDC()->GetScreen(startDp);
endPt = GetDC()->GetScreen(endDp);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD>߶<EFBFBD>
CPen *pOld = m_pScreenDC->SelectObject(&m_pen);
DrawLineScreen(startPt.x, startPt.y, endPt.x, endPt.y);
m_pScreenDC->SelectObject(pOld);
////UNDO
//{
// REDO_ITEM item;
// item.point = endDp;
// item.bHead = FALSE;
// item.pos = NULL;
// UndoList.AddHead(item);
//}
PointList.RemoveTail();
//<2F>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
DrawRubberLine();
m_bStretchStart = FALSE;
}
else if (count == 1)
{
pos = PointList.FindIndex(0);
dp = PointList.GetAt(pos);
////UNDO
//{
// REDO_ITEM item;
// item.point = dp;
// item.bHead = FALSE;
// item.pos = NULL;
// UndoList.AddHead(item);
//}
Reset();
}
}
/**
* @brief <EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>xy<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
*/
void CItemCurve::DrawAssistantCurve()
{
int count = PointList.GetCount();
if (count < 2) return;
CPen* pOld = m_pScreenDC->SelectObject(&m_pen);
dfPoint dp;
POSITION p = PointList.GetHeadPosition();
dp = PointList.GetNext(p);
CPoint pt1 = GetDC()->GetScreen(dp.x0, dp.y0);
CPoint pt2;
while (p)
{
dp = PointList.GetNext(p);
pt2 = GetDC()->GetScreen(dp.x0, dp.y0);
DrawLineScreen(pt1.x, pt1.y, pt2.x, pt2.y);
pt1 = pt2;
}
m_pScreenDC->SelectObject(pOld);
}
/**
* @brief <EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>.
*
*/
void CItemCurve::DrawAssistantLineLastSegment()
{
int count = PointList.GetCount();
//<2F><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬ֻ<E3A3AC><D6BB><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
if (count < 2) return;
//ʹ<><CAB9><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD>ʻ<EFBFBD>
CPen* pOld = m_pScreenDC->SelectObject(&m_pen);
dfPoint dp1;
dfPoint dp2;
CPoint pt1;
CPoint pt2;
POSITION p1;
POSITION p2;
p1 = PointList.FindIndex(count - 1);
dp1 = PointList.GetNext(p1);
pt1 = GetDC()->GetScreen(dp1.x0, dp1.y0);
p2 = PointList.FindIndex(count - 2);
dp2 = PointList.GetNext(p2);
pt2 = GetDC()->GetScreen(dp2.x0, dp2.y0);
DrawLineScreen(pt1.x, pt1.y, pt2.x, pt2.y);
m_pScreenDC->SelectObject(pOld);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ߵĵ<EFBFBD>һ<EFBFBD><EFBFBD>.
*
*/
void CItemCurve::RemoveAssistantLineFirstPoint()
{
int count = PointList.GetCount();
//ֻ<><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><E0B5B1><EFBFBD><EFBFBD>
if (count <= 1)
{
Reset();
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPen* pOld = m_pScreenDC->SelectObject(&m_pen);
dfPoint dp1;
dfPoint dp2;
CPoint pt1;
CPoint pt2;
POSITION p1;
POSITION p2;
p1 = PointList.FindIndex(0);
dp1 = PointList.GetNext(p1);
pt1 = GetDC()->GetScreen(dp1.x0, dp1.y0);
p2 = PointList.FindIndex(1);
dp2 = PointList.GetNext(p2);
pt2 = GetDC()->GetScreen(dp2.x0, dp2.y0);
DrawLineScreen(pt1.x, pt1.y, pt2.x, pt2.y);
m_pScreenDC->SelectObject(pOld);
PointList.RemoveHead();
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
*
*/
void CItemCurve::DrawRubberLine()
{
if (!m_pScreenDC)
{
return;
}
if (PointList.GetCount() <= 0)
return;
dfPoint p1 = PointList.GetTail();
CPoint ptT = GetDC()->GetScreen(p1);
CPoint ptPrev = GetDC()->GetScreen(m_dpLastMousePos);
DrawLineScreen(ptPrev.x, ptPrev.y, ptT.x, ptT.y);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
*/
void CItemCurve::EraseRubberLine()
{
if (!m_pScreenDC)
{
return;
}
if (PointList.GetCount() <= 0)
return;
dfPoint p1 = PointList.GetTail();
CPoint ptT = GetDC()->GetScreen(p1);
CPoint ptPrev = GetDC()->GetScreen(m_dpLastMousePos);
DrawLineScreen(ptPrev.x, ptPrev.y, ptT.x, ptT.y);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>ϻ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD>h<EFBFBD>ߺͱ<EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
*/
void CItemCurve::EraseScreenLines()
{
int count = PointList.GetCount();
if (!m_bStretchStart)
{
EraseRubberLine();
}
if (count > 1)
{
DrawAssistantCurve();
}
}
POSITION CItemCurve::NextCurve(void)
{
if (PointList.GetCount() == 0) return NULL;
if (PointList.GetCount() <= 1)
{
Reset();
return NULL;
}
CCurveEx* pCurve = new CCurveEx();
pCurve->SetPoints(PointList, 2);
POSITION pos = AddElement(pCurve, DOUBLEFOX_CURVE);
Reset();
return pos;
}
void CItemCurve::RedrawScreenLines()
{
int count = PointList.GetCount();
if (!m_bStretchStart)
{
DrawRubberLine();
}
if (count > 1)
{
DrawAssistantCurve();
}
}
void CItemCurve::Undo(void)
{
if (UndoList.GetCount() == 0) return;
REDO_ITEM item, it;
item = UndoList.RemoveHead();
int i = 0;
it = item;
while (1)
{
if (item.pos)//<2F><><EFBFBD>ӵĵ㣬<C4B5><E3A3AC>Ҫɾ<D2AA><C9BE>
{
RemoveAt(it.pos);
it.pos = NULL;
}
else//ɾ<><C9BE><EFBFBD>ĵ㣬<C4B5><E3A3AC>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
{
it.pos = AddPoint(it.point, it.bHead);
}
RedoList.AddHead(it);
i++;
if (i >= item.num)break;
it = UndoList.RemoveHead();
}
}
void NItem::CItemCurve::ClearRedoList(void)
{
RedoList.RemoveAll();
}
void CItemCurve::Redo(void)
{
if (RedoList.GetCount() == 0) return;
REDO_ITEM item, it;
item = RedoList.RemoveHead();
int i = 0;
while (1)
{
it = item;
if (it.pos)
{
RemoveAt(it.pos);
it.pos = NULL;
}
else
{
it.pos = AddPoint(it.point, it.bHead);
}
UndoList.AddHead(it);
i++;
if (i >= item.num) break;
it = RedoList.RemoveHead();
}
}
BOOL CItemCurve::IsCanUndo(void)
{
return (BOOL)UndoList.GetCount();
}
BOOL CItemCurve::IsCanRedo(void)
{
return (BOOL)RedoList.GetCount();
}
int CItemCurve::RemoveAt(POSITION pos)
{
if (pos == NULL) return 0;
if (PointList.GetCount() == 0) return 0;
int result = 0;
POSITION pHead = PointList.GetHeadPosition();
POSITION pTail = PointList.GetTailPosition();
dfPoint dp1, dp2;
POSITION p = pos;
if (pos == pTail)//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
{
dp1 = PointList.GetPrev(p);
dp2 = dp1;
//DrawLine(dp1.x0,dp1.y0,PrevPoint.x0,PrevPoint.y0);
if (p)dp2 = PointList.GetPrev(p);
if (PointList.GetCount() > 1)
{
//CPen* pOld=GetDC()->GetDC()->SelectObject(&m_pen);
//DrawLine(dp1.x0,dp1.y0,dp2.x0,dp2.y0);
//GetDC()->GetDC()->SelectObject(pOld);
}
//if(PointList.GetCount()>1)
//DrawLine(dp2.x0,dp2.y0,PrevPoint.x0,PrevPoint.y0);
result = 3;
}
else if (pos == pHead)//ɾ<><C9BE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
{
dp1 = PointList.GetNext(p);
dp2 = dp1;
if (p) dp2 = PointList.GetNext(p);
//if(PointList.GetCount()==1)
// DrawLine(dp1.x0,dp1.y0,PrevPoint.x0,PrevPoint.y0);
//else
//{
// CPen* pOld=GetDC()->GetDC()->SelectObject(&m_pen);
// DrawLine(dp1.x0,dp1.y0,dp2.x0,dp2.y0);
// GetDC()->GetDC()->SelectObject(pOld);
//}
result = 1;
}
else//ɾ<><C9BE><EFBFBD>м<EFBFBD><D0BC><EFBFBD>
{
dfPoint dp = PointList.GetAt(p);
dp1 = PointList.GetNext(p); if (p) dp1 = PointList.GetAt(p);
p = pos;
dp2 = PointList.GetPrev(p); if (p) dp2 = PointList.GetPrev(p);
//CPen* pOld=GetDC()->GetDC()->SelectObject(&m_pen);
//DrawLine(dp.x0,dp.y0,dp2.x0,dp2.y0);
//DrawLine(dp.x0,dp.y0,dp1.x0,dp1.y0);
//DrawLine(dp2.x0,dp2.y0,dp1.x0,dp1.y0);
//GetDC()->GetDC()->SelectObject(pOld);
result = 2;
}
PointList.RemoveAt(pos);
return result;
}
POSITION CItemCurve::AddPoint(dfPoint point, BOOL bHead)
{
POSITION pos = NULL;
if (bHead)
{
pos = PointList.AddHead(point);
}
else
{
pos = PointList.AddTail(point);
}
return pos;
}
void CItemCurve::SetCurveState(int state, CDC * pDC)
{
m_oldLineState = m_AddLineState;
m_AddLineState = state;
m_bStretchStart = TRUE;
m_pDoc->SetEditLineStatus(m_AddLineState);
}
void CItemCurve::RestoreCurveState(void)
{
m_AddLineState = m_oldLineState;
m_pDoc->SetEditLineStatus(m_AddLineState);
}
BOOL NItem::CItemCurve::IsLineState(void)
{
if (m_AddLineState == CURVE_STATE_LINE)
return TRUE;
return FALSE;
}
COne* CItemCurve::CreateOne()
{
CCurveEx* pCurve = new CCurveEx;
if (PointList.GetCount() <= 1)
{
PointList.RemoveAll();
return NULL;
}
pCurve->SetPoints(PointList, 2);
return m_pDoc->GetDraw()->CreateOne(pCurve, DOUBLEFOX_CURVE);
return NULL;
}
int CItemCurve::PopupNameDialog(CXy* pxy, POSITION pos)
{
return 1;
/*
if(!::GetPreferences().WorkaroundEdit.m_bPopupNameDlg) return 0;
if(pos==NULL || pxy==NULL) return 0;
CDlgName dlg;
if(::GetPreferences().WorkaroundEdit.m_bContourAuto)
{
AfxGetPublicFunction()->FloatToString(dlg.m_strName, ::GetPreferences().WorkaroundEdit.m_dContourStart);
::GetPreferences().WorkaroundEdit.m_dContourStart += ::GetPreferences().WorkaroundEdit.m_dContourStep;
}
if(dlg.DoModal()!=IDOK) return 0;
COne* pOne=pxy->GetAt(pos);
pOne->SetName(dlg.m_strName);
if(::GetPreferences().WorkaroundEdit.m_bContourAuto)
{
::GetPreferences().WorkaroundEdit.m_dContourStart = atof(dlg.m_strName);
::GetPreferences().WorkaroundEdit.m_dContourStart += ::GetPreferences().WorkaroundEdit.m_dContourStep;
}
return 1;
*/
}
//void CItemCurve::OnMouseMoveStatus(CDC* pDC, UINT nFlags, CPoint point)// , BYTE*& destBuffer, int& destLen)
//{
// SetScreenDC(pDC);
// dfPoint dp=GetRealPoint(PointList,nFlags, point);
//
// //<2F><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ϣ
// //if(PointList.GetCount()>0)
// // SetStatusBarLengthInfo(CurPoint.x0, CurPoint.y0, dp.x0, dp.y0);// , destBuffer, destLen);
//
// if(m_bContinuePen && nFlags & MK_LBUTTON)
// {
// AddPoint(dp);
// }
// else if(!PointList.IsEmpty())
// {
// dfPoint p1 = PointList.GetTail();
// CPoint ptT = GetDC()->GetScreen(p1);
// //<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>point <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>shift<66><74>ʱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>45<34><35><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CPoint ptCur = GetDC()->GetScreen(dp);
// if (!m_bStretchStart)
// {
// CPoint ptPrev = GetDC()->GetScreen(PrevPoint);
// DrawLineScreen(ptPrev.x, ptPrev.y, ptT.x, ptT.y);
// }
// DrawLineScreen(ptCur.x, ptCur.y, ptT.x, ptT.y);
// m_bStretchStart = false;
// }
// PrevPoint=dp;
// //TRACE("PrevPoint:%f, %f\n", PrevPoint.x0, PrevPoint.y0);
//}
//void CItemCurve::OnMouseMove(UINT nFlags, CPoint point)
//{
// CPointList PointList;
// dfPoint CurPoint;
//
// //CItemBase* itemBase = new CItemBase();
// dfPoint dp = GetRealPoint(PointList, nFlags, point);
//
// //<2F><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ϣ
// if (PointList.GetCount() > 0)
// SetStatusBarLengthInfo(CurPoint.x0, CurPoint.y0, dp.x0, dp.y0);
//
// if (m_bContinuePen && nFlags & MK_LBUTTON)
// {
// AddPoint(dp);
// }
// else if (!PointList.IsEmpty())
// {
// dfPoint p1 = PointList.GetTail();
// DrawLineReal(PrevPoint.x0, PrevPoint.y0, p1.x0, p1.y0);
// DrawLineReal(dp.x0, dp.y0, p1.x0, p1.y0);
// }
// PrevPoint = dp;
//}
//=====================