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.

130 lines
3.6 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD>: CItem<65><6D><EFBFBD><EFBFBD>չ
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2006-12-07
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "item.h"
#include "SpatialIndex.h"
namespace NItem
{
#define PEN_COLOR RGB(255,0,0)
#define CURVE_STATE_LINE 0
#define CURVE_STATE_ARC 1
#define CURVE_STATE_ANGLE 2
#define CURVE_STATE_SPLINE 3
#define CURVE_STATE_MERGE 4 //<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EAB9A6>
#define CURVE_STATE_DRAWING 5
class CItemCurve :
public CItem
{
public:
CItemCurve(CSigmaDoc * ppDoc);
virtual ~CItemCurve(void);
BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) override;
void OnLButtonDblClk(UINT nFlags, CPoint point) override;
void OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk) override;
void RemoveAssistantLineTailPoint();
int OnMouseMove(CDC* pDC, UINT nFlags, CPoint point) override;
void DrawAssistant(CDC * pScreenDC, int mouseX, int mouseY) override;//ͼ<><CDBC><EFBFBD><EFBFBD>Ļ<EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>ʱ<EFBFBD><CAB1>
void OnLButtonUp(CDC* pDC, UINT nFlags, CPoint point, int vk) override;
BOOL OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) override;
BOOL OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) override;
virtual void OnDraw(CXyDC* pXyDC, CDC* pDC) override;
int GetSubMenu() override;
virtual void SetCurveState(int state, CDC * pDC);
void RestoreCurveState(void);
dfPoint GetRealPoint(CPointList& pl, UINT nFlags, CPoint point);
static int PopupNameDialog(CXy* pxy, POSITION pos);
void Reset(void);
virtual void OnCancel(void) override;
bool GetAngleAndDistance(double &angle, double &distance) const;
protected:
class REDO_ITEM
{
public:
REDO_ITEM(void)
{
num=1;
bHead=FALSE;
pos=NULL;
};
dfPoint point;
BOOL bHead; //FALSEΪ<45><CEAA>βRedo,TRUEΪ<45><CEAA>ʼRedo
int num; //Redo<64>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>
POSITION pos; //PointList<73>е<EFBFBD>λ<EFBFBD>ã<EFBFBD>NULL<4C><4C>ʾɾ<CABE><C9BE><EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ӵ<EFBFBD>
};
CList<REDO_ITEM,REDO_ITEM> RedoList,UndoList;
CPen m_pen;
BOOL m_bStretchStart;
dfPoint CurPoint;
void GetAnglePoint(dfPoint &ddp, double angle);
private:
void storeAngleAndDistance(dfPoint& point1, dfPoint& point2);
void clearAngleAndDistance();
// <20><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD>ĽǶ<C4BD>
double m_angle = std::numeric_limits<double>::quiet_NaN();
// <20><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD>ߵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
double m_distance = std::numeric_limits<double>::quiet_NaN();
public:
int m_oldLineState;
int m_AddLineState;
CPointList PointList;
dfPoint m_dpLastMousePos;
BOOL m_bContinuePen;
BOOL m_bAuxiliaryCurveRedraw;//ȫͼ<C8AB>ػ棬<D8BB>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>
virtual void AutoClose(void);
virtual void AddPoint(dfPoint point);
virtual POSITION AddPoint(dfPoint point, BOOL bHead);
virtual int RemoveAt(POSITION pos);
POSITION InsertPointWithPointDistance(double x, double y);
void AddPointFromCoordinate(double x, double y);
void Draw(CXyDC* pDC, CPointList& pl, COLORREF color);
void DrawAssistantCurve();
void DrawAssistantLineLastSegment();
void RemoveAssistantLineFirstPoint();
void DrawRubberLine();
void EraseRubberLine();
void EraseAuxiliaryLines(CDC * pScreenDC);
void EraseScreenLines();
void RedrawScreenLines();
virtual POSITION NextCurve(void);
virtual void Undo(void);
virtual void Redo(void);
virtual BOOL IsCanUndo(void);
virtual BOOL IsCanRedo(void);
void ClearRedoList(void);
BOOL IsLineState(void);
COne* CItemCurve::CreateOne();
double m_isSnapEnabled = true;
double m_snapRange = 20.0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ܹ<EFBFBD><DCB9>ӳٹ<D3B3><D9B9><EFBFBD> CSpatialIndex<65><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀǰ<C4BF><C7B0>Ȼ<EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD><ECBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B9B9><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CXy <20><>ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>Ҫ<EFBFBD><D2AA>
std::unique_ptr<CSpatialIndex> m_pSpatialIndex;
//void OnMouseMove(UINT nFlags, CPoint point);
};
};