#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;//图件屏幕重绘后,重绘临时线 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 GetScreenPoints(const std::vector& points) const; void ZoomEraseRadius(int radius); void DrawCircle(CDC* pDC, int centerX, int centerY, int radius); /** * 绘制橡皮擦 * * \param dc CDC 对象 * \param centerX 橡皮擦中心位置 X 坐标 * \param centerY 橡皮擦中心位置 X 坐标 * \param radius */ void DrawEraser(CDC* pDC, int centerX, int centerY, int radius); /** * 绘制曲线上的节点,方便用户操作 * * \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; // 右键点击去除曲线点时的最大搜索范围,在这个范围内我们就认为被点中了 static constexpr double MAX_SEARCH_RADIUS = 2; RTree* GetSpatialTree(); /** * 获取橡皮擦路径 * * \return */ std::unique_ptr GetEraserPath() const; void SetAction(const CPositionList& plAdd, const CPositionList& plDel); void Erase(); void Redraw(); const CString redraw = "redraw"; bool m_start = false; std::vector m_path; COLORREF m_penColor = RGB(255, 0, 0); int m_eraseRadius = 10; // 删除半径 EraserMode m_mode = EraserMode::Nodes; std::unique_ptr m_nodeDrawer; std::optional> m_lastView; std::unique_ptr> m_rtree; bool isViewChanged = true; size_t m_token = 0; };