#pragma once #include "iGuiPlot.h" #include "nmDefines.h" #include "nmPlot_global.h" #include #include class nmObjBase; class nmObjPointWell; class ZxDataWell; class nmDataVerticalFracturedWell; class nmDataHorizontalFracturedWell; class nmDataAnalyzeManager; class nmDataWellBase; class nmPlotGraphicBinder; class QWidget; class QResizeEvent; // 数值试井绘图载体的样例 class NM_PLOT_EXPORT nmGuiPlot : public iGuiPlot { Q_OBJECT public: explicit nmGuiPlot(bool bUseBtn = true, QWidget *parent = 0); ~nmGuiPlot(); // 初始化UI virtual void initUI(QString sTitle, QSize szDefault = QSize(265, 203)) override; // 初始化Sheet void initSheets(); // 初始化布局 virtual void initMainLayout() override; virtual QWidget* initChartLayout(QString sTitle, QSize szDefault) override; virtual void initChartView(QString sTitle, QSize szDefault) override; virtual void connectSignals() override; // 刷新图形 virtual void runUpdate() override; // Action命令执行 virtual bool runAction(QString sAction) override; // 取消当前地图绘图操作. void cancelActiveTools(); // 创建添加一个Obj nmObjBase* appendOneObj(NM_Obj_Type o, QString& sName, QVector& vec); nmObjBase* _createOneObj(NM_Obj_Type o, QString& sName); // 绑定绘图对象的信号 void bindObjSignals(ZxObjBase* pObj); // ============================== 可见性设置接口 ============================== // 边界相关 void setContourVisibility(bool bIsVisible); // 位图相关 void setImagesVisibility(bool bIsVisible); // 井相关 void setAllWellsVisible(bool bIsVisible); void setWellVisible(QString sObjName, bool bIsVisible); // 断层相关 void setAllFaultsVisible(bool bIsVisible); void setFaultVisible(QString sObjName, bool bIsVisible); // 裂缝相关 void setAllFracturesVisible(bool bIsVisible); void setFractureVisible(QString sObjName, bool bIsVisible); // 区域相关 void setAllRegionsVisible(bool bIsVisible); void setRegionVisible(QString sObjName, bool bIsVisible); // 区域标记相关 void setAllRegionMarksVisible(bool bIsVisible); void setRegionMarkVisible(QString sObjName, bool bIsVisible); #ifdef QT_DEBUG /// @brief 刷新指定的绘图对象 /// @param sName 绘图对象名称 /// @param vecX 数据点 /// @param vecY 绘图对象名称 /// @param bPressureLike 压力模式还是流量模式,通常都是压力模式 /// @param bUseY2 是否启用第二y轴(右侧) /// @param bClearAll 刷新指定绘图对象时,是否把原有所有绘图对象清除 ZxObjBase* updatePlotObjBy(QString sName, \ VecDouble& vecX, VecDouble& vecY, \ bool bPressureLike = true, \ bool bUseY2 = false, \ bool bClearAll = false); #endif public slots: /** @brief Map 首次显示稳定后,按内容和绘图区比例初始化一次坐标轴。 */ void initializeAxisView(); // Obj选择状态改变 void slotObjSelChanged(bool); // Obj数据发生了改变 void slotObjPtsChanged(); // 删除井对象 void slotDeleteWell(QString wellID); // 设置比例尺 void slotMeasuringScale(QPointF pStart, QPointF pEnd, void* obj); // 删除图元对象 void slotDeleteOneObj(QString sName, void* obj); // 删除测量对象 void deleteMeasureObjects(); // 清除当前测量对象 void clearPreviousMeasure(); // 结束测量 void finishMeasure(); // 更改坐标轴范围 void onRangeXChanged(double dMin, double dMax, \ bool bRecalTicks, \ bool bAdjustRectZoomRatio); void onRangeYChanged(double dMin, double dMax, \ bool bRecalTicks, \ bool bAdjustRectZoomRatio); signals: // 绘图对象选择状态发生改变 void sigObjSelChanged(ZxObjBase*, bool); // 绘图对象数据点发生改变 void sigObjPtsChanged(ZxObjBase*); // 开始一次测量 void sigMeasureStarted(); public: // 序列化 virtual void onSerialize(ZxSerializer* ser) override; virtual void onDeserialize(ZxSerializer* ser) override; // 反序列化后,把数据重新加入m_mapCurveData与m_mapCurveType virtual void resetAfterDeserialized() override; // 获取边界的点信息 QVector getObjsByTag(QString objTag); ZxObjBase* getWellObjById(QString id); // 获取边界的信息 QVector getOutlinePoints(); // 获取所有井的信息,包括点和半径 QVector> getWellsInformation(); // 获取所有裂缝点信息 QVector> getCracksInformation(); // 获取所有断层点信息 QVector> getFaultsInformation(); // 获取所有复合区(区域)的信息 QVector> getRegionsInformation(); // 获取所有井的图元 QVector getWellPlots(); // 获取所有井的数据指针 QVector getWellDatas(); // 获取所有井的名称 QStringList getWellNames(); // 初始化默认几何对象 void initDefultGeoObj(); // 从数据中心初始化坐标轴相关信息 void initAxisFromData(nmDataAnalyzeManager* pDataManager); // 从数据中心初始化边界对象 void initBoundaryObjFromData(nmDataAnalyzeManager* pDataManager); // 从数据中心初始化井对象 void initWellObjsFromData(nmDataAnalyzeManager* pDataManager); // 从数据中心初始化断层对象 void initFaultObjsFromData(nmDataAnalyzeManager* pDataManager); // 从数据中心初始化裂缝对象 void initFractureObjsFromData(nmDataAnalyzeManager* pDataManager); // 从数据中心初始化区域对象 void initRegionObjsFromData(nmDataAnalyzeManager* pDataManager); // 从数据中心初始化区域标记对象 void initRegionMarkObjsFromData(nmDataAnalyzeManager* pDataManager); // 清空所有图元对象 void deleteAllPlotObjs(); // 获取所有图元 QVector getAllPlots(); // 清除图元的选中状态 void clearPlotsSelectStates(); // 删除DFN生成的图元及其数据 void deleteAllDFNPlots(); // 设置所有图元是否可编辑 void setAllPlotObjectsEditable(bool editable); // 绑定由业务窗口创建的模型点对话框 void bindPointerPosDialog(QWidget* pointerPosDlg); // 根据数据中心的数据设置目前图元、刻度相关信息 bool setPlotsByDataManger(nmDataAnalyzeManager* pDataManager); // 移除井图元,通过井数据 void removeWellPlotByData(nmDataWellBase* pData); // 清空井图元 void removeAllWellPlot(); // 获取 Binder nmPlotGraphicBinder* graphicBinder() const { return m_pGraphicBinder; } protected: // 绘制Painter函数重载 virtual void paintEvent(QPaintEvent*) override; /** @brief 首次视图尚未完成时,等待有效绘图区后再次尝试初始化。 */ virtual void resizeEvent(QResizeEvent* pEvent) override; private: /** @brief 计算边界及当前可见数值对象的数据坐标包围盒。 */ bool calculateVisibleContentBounds(QRectF& oBounds) const; /** @brief 以程序方式同时应用两个坐标轴范围,并写回当前 Manager。 */ void applyAxisRange(double dXMin, double dXMax, double dYMin, double dYMax); /** @brief 按当前内容完成一次等比例视图计算,成功时返回 true。 */ bool fitInitialAxisToContent(); /** @brief 将首次视图初始化延迟到本轮布局完成后执行。 */ void scheduleInitialAxisView(); /** @brief 返回当前 Map 绑定的数据管理器,避免多窗口时误用全局当前对象。 */ nmDataAnalyzeManager* dataManager() const; int m_iRegionMarkCount; //记录创建了多少个标记区域对象 nmPlotGraphicBinder* m_pGraphicBinder; // 图元-数据绑定协调器 nmDataAnalyzeManager* m_pDataManager; // 当前 Map 借用的数据管理器,不负责销毁 bool m_bApplyingAxisRange; // 正在由程序设置坐标轴,防止提前完成首次初始化 bool m_bAxisInitializationPending; // 是否已排队一次首次坐标轴初始化 };