|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "Item.h"
|
|
|
|
|
|
#include "CurveNodeDrawer.h"
|
|
|
|
|
|
#include "IntersectionEraser.h"
|
|
|
|
|
|
#include "DrawOperator/RTree.h"
|
|
|
|
|
|
|
|
|
|
|
|
class CItemEraser : public CItem
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
CItemEraser(CSigmaDoc* ppDoc);
|
|
|
|
|
|
~CItemEraser();
|
|
|
|
|
|
|
|
|
|
|
|
void OnLButtonDblClk(UINT nFlags, CPoint point) override;
|
|
|
|
|
|
void OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk) override;
|
|
|
|
|
|
void OnLButtonUp(CDC* pDC, UINT nFlags, CPoint point, int vk) override;
|
|
|
|
|
|
void OnRButtonDown(UINT nFlags, CPoint point) override;
|
|
|
|
|
|
BOOL OnRButtonUp(UINT nFlags, CPoint point) override;
|
|
|
|
|
|
void OnMouseWheel(uint32_t button, int32_t clicks, int32_t x, int32_t y, int32_t delta) override;
|
|
|
|
|
|
int OnMouseMove(CDC* pDC, UINT nFlags, CPoint point) override;
|
|
|
|
|
|
void DrawAssistant(CDC* pDC, int mouseX, int mouseY) override;//ͼ<><CDBC><EFBFBD><EFBFBD>Ļ<EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
BOOL OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) override;
|
|
|
|
|
|
BOOL OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) override;
|
|
|
|
|
|
void OnDraw(CXyDC* pXyDC, CDC* pDC) override;
|
|
|
|
|
|
|
|
|
|
|
|
void OnCancel(void) override;
|
|
|
|
|
|
|
|
|
|
|
|
EraserMode GetEraserMode() const;
|
|
|
|
|
|
|
|
|
|
|
|
void SetEraserMode(EraserMode mode);
|
|
|
|
|
|
|
|
|
|
|
|
int GetEraserRadius() const;
|
|
|
|
|
|
|
|
|
|
|
|
void SetEraserRadius(int radius);
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
std::vector<CPoint> GetScreenPoints(const std::vector<CPoint2D>& points) const;
|
|
|
|
|
|
|
|
|
|
|
|
void ZoomEraseRadius(int radius);
|
|
|
|
|
|
|
|
|
|
|
|
void DrawCircle(CDC* pDC, int centerX, int centerY, int radius);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param dc CDC <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* \param centerX <EFBFBD><EFBFBD>Ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD> X <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* \param centerY <EFBFBD><EFBFBD>Ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD> X <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* \param radius
|
|
|
|
|
|
*/
|
|
|
|
|
|
void DrawEraser(CDC* pDC, int centerX, int centerY, int radius);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĽڵ㣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \param dc
|
|
|
|
|
|
*/
|
|
|
|
|
|
void DrawCurveNode(CDC* pDC);
|
|
|
|
|
|
|
|
|
|
|
|
int m_lastX = -1;
|
|
|
|
|
|
int m_lastY = -1;
|
|
|
|
|
|
int m_lastRadius = -1;
|
|
|
|
|
|
|
|
|
|
|
|
void ResetLast(int x, int y, int radius);
|
|
|
|
|
|
|
|
|
|
|
|
static constexpr int ZOOM_VALUE = 10;
|
|
|
|
|
|
static constexpr int MIN_ERASE_RADIUS = 10;
|
|
|
|
|
|
static constexpr int MAX_ERASE_RADIUS = 40;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
static constexpr double MAX_SEARCH_RADIUS = 2;
|
|
|
|
|
|
|
|
|
|
|
|
RTree<POSITION, double, 2>* GetSpatialTree();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Ƥ<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* \return
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::unique_ptr<CCurveEx> GetEraserPath() const;
|
|
|
|
|
|
|
|
|
|
|
|
void SetAction(const CPositionList& plAdd, const CPositionList& plDel);
|
|
|
|
|
|
|
|
|
|
|
|
void Erase();
|
|
|
|
|
|
|
|
|
|
|
|
void Redraw();
|
|
|
|
|
|
|
|
|
|
|
|
const CString redraw = "redraw";
|
|
|
|
|
|
bool m_start = false;
|
|
|
|
|
|
std::vector<CPoint2D> m_path;
|
|
|
|
|
|
COLORREF m_penColor = RGB(255, 0, 0);
|
|
|
|
|
|
int m_eraseRadius = 10; // ɾ<><C9BE><EFBFBD>뾶
|
|
|
|
|
|
EraserMode m_mode = EraserMode::Nodes;
|
|
|
|
|
|
std::unique_ptr<CurveNodeDrawer> m_nodeDrawer;
|
|
|
|
|
|
std::optional<std::pair<CRect, CRect8>> m_lastView;
|
|
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<RTree<POSITION, double, 2>> m_rtree;
|
|
|
|
|
|
bool isViewChanged = true;
|
|
|
|
|
|
size_t m_token = 0;
|
|
|
|
|
|
};
|
|
|
|
|
|
|