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.

347 lines
8.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include <functional>
#include "itemfocusrect.h"
#include <GdiPlus.h>
#include "QTransformTracker.h"
#include "VoronoiMap/InterfaceElements.h"
#include "Util.h"
namespace NItem
{
/**
* 框选处理类
*/
class CItemSelect : public CItemFocusRect
{
public:
enum SelectMode
{
selnone, // 单选
netSelect,
move,
size,
};
SelectMode selectMode;
bool m_isLocationChanged;
public:
CItemSelect(CSigmaDoc * ppDoc);
virtual ~CItemSelect(void);
virtual void OnLButtonDblClk(UINT nFlags, CPoint point) override;
virtual void OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk) override;
virtual void OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk=0) override;
virtual int OnMouseMove(CDC *pDC, UINT nFlags, CPoint point) override;
void MoveElementsTo(CPoint point);
virtual void OnRButtonDown(UINT nFlags, CPoint point) override;
virtual BOOL OnMoving();
void DrawTrackPath(CDC* pDC);
virtual BOOL OnSetCursor(CPoint pt, int& handle);
BOOL OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) override;
BOOL OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) override;
virtual void OnDraw(CXyDC* pDC) override;
virtual void OnDraw(CXyDC* pXyDC, CDC* pDC) override;
/**
* 创建龟背图,如果有三角网,则根据三角网生成,如果没有,根据点和边框生成
*
* \return
*/
int CreateVoronoiMap();
int CreateVoronoiMap(POSITION& posCurve, CPositionList& addCurveList);
/**
* 创建三角网
*
* \return
*/
int CreateDelaunayMap();
int CreateDelaunayMap(POSITION& posCurve, CPositionList& addCurveList);
/**
* 对选中的点进行抽稀,剔除一些点
*
* \param minSpacing 最小间距
* \return
*/
int SimplifySelectPoints(double minSpacing);
void ReloadTrackerPath(void);
/**
* 删除选中的图元
*
*/
virtual int DeleteSelection(void);
void InvalidateSelection(void);
QTransformTracker& GetTracker();
//HTracker * GetTracker();
void EnableTracker(bool bEnbale);
//QTransformTracker* GetQTracker(void);
bool InitItemForGrid();
CPositionList m_selection; // 被选中的图元列表
CRect8 m_lastRect; // 记录最后一次选中时的 Rect
int GetSelectedCount(void);
bool GetPointsZRange(double& zMin, double& zMax);
bool SetPointsColor(CString colorItemsData, double dWidth, double dHeight);
void SelectWithinRect(CRect8 rect, BOOL bAdd = FALSE);
void SetEnableRotate(bool enable);
protected:
vector<int> SelectTypes;
void CloneSelection();
void Remove(POSITION posObj);
int nDragHandle;
CRect8 m_posRect;
bool m_bPointTextSelected; //是否是点元素的文本部分被选中
CItem * m_pItemForGrid;
//HTracker m_tracker;
QTransformTracker m_Tracker;
bool m_bTrackerEnable;
bool m_bEnableRotate;
public:
vector<int>& GetSelectTypes() { return SelectTypes; }
void SetSelectTypes(int* types, int size);
void Deselect(POSITION posObj);
void LoadRectPath(Gdiplus::GraphicsPath &path, CRect8 rect);
void LoadCurvePath(Gdiplus::GraphicsPath& path, CCurveEx* pc);
void LoadPath(POSITION pos);
void LoadPath(COne* pOne);
int EndTransformSelection(UINT nFlags, CPoint point, int handle);
BOOL TransformSelection(float* matrix, int nMode, void* pActionItem);
void SelectSameLayer(void);
void SelectSameProperty(void);
void Select(POSITION posObj, BOOL bAdd, CPoint2D& point);
void Select(POSITION posObj, BOOL bAdd = FALSE);
void Select(CPositionList& select, BOOL bAdd = FALSE);
int CurveInRegion(CCurveEx* pCurve, CCurveEx* pRgn);
int IsInside(CCurveEx* pRgn, CRect8& rgnRange, COne* pOne);
int SelectInCurve();
int SelectInCurve(int elementType);
int SelectInCurveEx(double factor);
int SelectInCurveEx(int elementType, double factor);
int SelectSamePropertyElements();
void MakeViewData(COne * pOneSelect, CString &strSelect);
int SelectByNames(CString& data);
void SelectAll(void);
void ClearAll(CDC* pDC);
void ReversalSelectAll(void);
void SelectAll(UINT nElementType, BOOL bAdd = FALSE);
virtual void CancelSelection(void);
BOOL IsSelected(POSITION pos);
int GetCountSelected(void);
void OffsetSelected(double dx, double dy);
CRect8 GetSelectedRect(void);
CRect GetTrackerRect();
void DeleteItemGrid(void);
void GetSelectedNames(CString& names);
bool Past(int nPasteMode); //0=粘贴到当前文件1=粘贴到当前层2=粘贴为符号
void PasteNative(CXy* pDraw, CPositionList& list, COleDataObject& dataObject, bool bPasteInCurrentLayer);
void Serialize (CXy* pDraw, CPositionList& list, CArchive& ar, bool bPasteInCurrentLayer);
bool WriteData(CXy* pDraw, BYTE*& outBuffer, int& destLen, int formatCode);
POSITION PasteEmbedded(CXy* pDraw, COleDataObject& dataObject, CPoint point);
void Copy(void);
BOOL IsSameType(void); //选中的信息类型是否统一
BOOL IsElementType(int nElementType);
BOOL IsCanPaste(void);
CItem* GetItemForGrid(void);
CItem* FindItemForGrid(POSITION pos, BOOL bMulElement=FALSE);
BOOL IsCanMoveCoor(COne* pOne);
POSITION SelectionToFillPath(void);
POSITION GroupSelectionToSymbol();
POSITION GroupSelectionToBlock();
BOOL UngroupAll(int& layerCount);
BOOL UngroupSymbol(POSITION pos, bool nReplaceExist, int& layerCount);
BOOL IsSelectionChanged;
CItem* GetItem() {
return m_pItemForGrid;
}
void SetItem(CItem * pOther) {
this->m_pItemForGrid = pOther;
}
/**
* 获取所有被选中的图元
*
* \return
*/
std::list<COne*> SelectionCones();
/**
* 获取选中的点数量,如果是选中了一个封闭曲线,将返回封闭曲线内的点数量
*/
int PointCount();
/**
* 元文件打散 emf
* \param pos 当前选中图元
* \return
*/
int DisperseMetaEmf(POSITION pos, CXy* pXy, long timestamp);
/**
* 保存当前图元为KML
* \param pos 当前选中图元
* \return
*/
int SaveSelectKml(POSITION pos, CXy* pXy, CString path);
protected:
CXy* SelectionToXy();
private:
/**
* 获取选中的所有多边形,如果存在未闭合,但是首尾相距不大的情况,将统计一个新的闭合曲线
*
* \return
* \note 它返回的是创建新的多边形,需要手动释放
*/
std::vector<CCurveEx*> CollectPolygons();
/**
* 判断该图元是否可以并且可编辑
*
* \param pOne
* \return
*/
static bool COneVisibleAndEditable(COne *pOne);
/**
* 收集目标图层的所有折线
*
* \param layer 图层名称
* \return
*/
std::list<CPolyline> CollectLayerPolyline(CString layer);
/**
* 获取边框内的断层线
*
* \param pBlock 边框线
* \param layerName 断层层位
* \return
*/
std::list<CCurveEx*> CollectFlts(CCurveEx *pBlock);
/**
* 获取边框内的井
*
* \param pBlock 边框线
* \return
*/
std::vector<CWellPoint> CollectWells(CCurveEx *pBlock);
/**
* 返回井后的第一个图元
*
* \return
*/
POSITION FirstPositionAfterWell();
/**
* 绘制结果到图层
*
* \param layerName 图层名称
* \param result 三角网或龟背图
* \param addCurveList 用作撤消的列表
*/
void DrawResultToLayer(CString layerName, std::list<CPolyline>& result, CPositionList& addCurveList);
/**
* 绘制三角网
*
* \param flts 断层
* \param wells 井
* \param border 边框线
* \param results 出参,绘制后的线
* \return
*/
int DrawDelaunay(std::list<CPolyline> &flts, std::vector<CWellPoint> &wells, CPolyline &border, std::list<CPolyline> *results);
/**
* 绘制龟背图
*
* \param flts 断层
* \param wells 井
* \param border 边框线
* \param results 出参,绘制后的线
* \return
*/
int DrawVorono(std::list<CPolyline> &flts, std::vector<CWellPoint> &wells, CPolyline &border, std::list<CPolyline> *results);
/**
* 通过三角网获取井信息
*
* \param flts 三角网折线
* \return
*/
std::vector<CWellPoint> GetWellByDelaunay(std::list<CPolyline> &flts);
std::list<COne*> PositionsToCones(CPositionList &list);
/**
* 获取框选区域的 PointXYZ
*
* \return
*/
std::vector<CPointXYZ> SelectedPointXYZs();
/**
* 获取封闭曲线内的点
*
* \param curves 封闭曲线
* \return
*/
std::vector<CPointXYZ> GetPointsInCurves(std::vector<CCurveEx *> &curves);
/**
* 找出需要被删除的点,即不再抽稀结果列表中的点
*
* \param removedPoints 抽稀出来的点
* \param needRemoved 出参,要被删除的节点
* \return
*/
int FindNeedRemovePoints(const std::vector<CPointXYZ> &removePoints, CPositionList &needRemoved);
/**
*
* \param points
* \param idxReserved
* \param
* \return
*/
static bool CPointXYZIdxContains(const std::vector<CPointXYZ> &points, const CPointXYZ &point);
/**
* 获取没有上下标的文本,只是移除了上下标,上下标里面的文字还在
*
* \param text
* \return
*/
CString RemoveSuperSubscript(const CString& text);
/**
* 获取上下标内容拼接成的字符串
*
* \param text
* \return
*/
CString GetSuperSubscript(const CString& text);
};
}