#pragma once #include #include #include #include "nmPlot_global.h" #include "nmDefines.h" class nmDataAnalyzeManager; class nmDataFault; class nmObjLineFault; class nmDataFracture; class nmObjLineCrack; class nmDataOutline; class nmObjBase; class nmObjRoundOutline; class nmObjRectOutline; class nmObjPolygonOutline; class nmDataMeasure; class nmObjLineMeasure; class nmDataRegionMark; class nmObjRegionMark; class nmDataRegion; class nmObjRegion; class nmDataWellBase; class nmObjPointWell; // 图元与数据绑定协调器,由 nmGuiPlot 托管 class NM_PLOT_EXPORT nmPlotGraphicBinder : public QObject { Q_OBJECT public: explicit nmPlotGraphicBinder(nmDataAnalyzeManager* pDataMgr, QObject* parent = nullptr); // 调用:用户画完断层后 void createFaultForGraphic(nmObjLineFault* pGraphic); // 调用:从文件加载,绑定已有数据到已有图元 void bindFaultToGraphic(nmObjLineFault* pGraphic, nmDataFault* pData); // 调用:删除图元前 void removeFaultBinding(nmObjLineFault* pGraphic); // 查找图元对应的数据指针 nmDataFault* getFaultDataFor(nmObjLineFault* pGraphic); // 名称同步,由图元在 paintBack 中调用 void syncFaultName(nmObjLineFault* pGraphic); // 调用:用户画完裂缝后 void createCrackForGraphic(nmObjLineCrack* pGraphic); // 调用:从文件加载,绑定已有裂缝数据到已有图元 void bindCrackToGraphic(nmObjLineCrack* pGraphic, nmDataFracture* pData); // 调用:删除裂缝图元前 void removeCrackBinding(nmObjLineCrack* pGraphic); // 查找裂缝图元对应的数据指针 nmDataFracture* getCrackDataFor(nmObjLineCrack* pGraphic); // 名称同步,由图元在 paintBack 中调用 void syncCrackName(nmObjLineCrack* pGraphic); // 调用:用户画完圆形边界后 void createOutlineForGraphic(nmObjRoundOutline* pGraphic); // 调用:用户画完矩形边界后 void createOutlineForGraphic(nmObjRectOutline* pGraphic); // 调用:用户画完多边形边界后 void createOutlineForGraphic(nmObjPolygonOutline* pGraphic); // 调用:从文件加载,绑定已有边界数据到已有图元(三种类型通用) void bindOutlineToGraphic(nmObjBase* pGraphic, nmDataOutline* pData); // 调用:删除边界图元前(三种类型通用) void removeOutlineBinding(nmObjBase* pGraphic); // 查找边界图元对应的数据指针 nmDataOutline* getOutlineDataFor(nmObjBase* pGraphic); // 名称同步,由边界图元在 paintBack 中调用 void syncOutlineName(nmObjBase* pGraphic); // 视觉属性兜底同步(画笔宽度、填充色、透明度),由边界图元在 paintBack 中调用 void syncOutlineVisual(nmObjBase* pGraphic); // 调用:用户画完测量线后 void createMeasureForGraphic(nmObjLineMeasure* pGraphic); // 调用:删除测量线图元前 void removeMeasureBinding(nmObjLineMeasure* pGraphic); // 坐标同步:从数据对象读取起点终点,写回图元(拟合功能修改数据后由 paintBack 调用) void syncMeasurePoints(nmObjLineMeasure* pGraphic); // ==================== 区域标记图元 ==================== // 调用:用户画完区域标记后 void createRegionMarkForGraphic(nmObjRegionMark* pGraphic); // 调用:从文件加载,绑定已有区域标记数据到已有图元 void bindRegionMarkToGraphic(nmObjRegionMark* pGraphic, nmDataRegionMark* pData); // 调用:删除区域标记图元前 void removeRegionMarkBinding(nmObjRegionMark* pGraphic); // 兜底同步:名称、位置,由区域标记图元在 paintBack 中调用 void syncRegionMarkData(nmObjRegionMark* pGraphic); // 查找区域标记图元对应的数据指针 nmDataRegionMark* getRegionMarkDataFor(nmObjRegionMark* pGraphic); // ==================== 复合区图元 ==================== // 调用:用户画完复合区后 void createRegionForGraphic(nmObjRegion* pGraphic); // 调用:从文件加载,绑定已有复合区数据到已有图元 void bindRegionToGraphic(nmObjRegion* pGraphic, nmDataRegion* pData); // 调用:删除复合区图元前 void removeRegionBinding(nmObjRegion* pGraphic); // 兜底同步:名称、位置、区域标记关联,由复合区图元在 paintBack 中调用 void syncRegionData(nmObjRegion* pGraphic); // 查找复合区图元对应的数据指针 nmDataRegion* getRegionDataFor(nmObjRegion* pGraphic); // ==================== 井图元 ==================== // 调用:用户创建新井后,创建数据并建立绑定 nmDataWellBase* createWellForGraphic(nmObjPointWell* pGraphic, NM_WELL_MODEL wellType); // 调用:从文件加载,绑定已有井数据到已有图元 void bindWellToGraphic(nmObjPointWell* pGraphic, nmDataWellBase* pData); // 调用:删除井图元前 void removeWellBinding(nmObjPointWell* pGraphic); // 兜底同步:位置、名称,由井图元在 paintBack 中调用 void syncWellData(nmObjPointWell* pGraphic); // 查找井图元对应的数据指针 nmDataWellBase* getWellDataFor(nmObjPointWell* pGraphic); // 更新井图元的数据映射(编辑井后更换数据对象时使用) void updateWellDataMapping(nmObjPointWell* pGraphic, nmDataWellBase* pNewData) { m_mapWellData[pGraphic] = pNewData; } // 井相关数据中心委托方法 void calculateWellLogData(nmDataWellBase* pWellData, QVector>& pressure, QVector>& logLog, QVector>& semiLog); bool hasLayers() const; nmDataWellBase* getCurrentWellData() const; void setCurrentWellData(nmDataWellBase* pWellData); void appendWellData(nmDataWellBase* pWellData); void removeWellData(nmDataWellBase* pWellData); void notifyDataChanged(); // 切换分析时更新绑定的 DataManager,并清理旧图元的残留映射 void updateDataMgr(nmDataAnalyzeManager* pDataMgr); // 供 dataChanged 信号连接 public slots: void onDataChanged(); private slots: // 断层图元信号 → 数据同步 void onGraphicFlowModelChanged(int model); void onGraphicLeakageChanged(double leakage); void onGraphicPointsChanged(); void onGraphicVisibleChanged(bool bVisible); // 裂缝图元信号 → 数据同步 void onGraphicCrackFlowModelChanged(int model); void onGraphicCrackDfcChanged(double dfc); void onGraphicCrackDwChanged(double dw); void onGraphicCrackPointsChanged(); void onGraphicCrackVisibleChanged(bool bVisible); // 边界图元信号 → 数据同步 void onGraphicOutlinePointsChanged(); void onGraphicOutlineFlowTypeChanged(); void onGraphicOutlineVisibleChanged(bool bVisible); // 区域标记图元信号 → 数据同步 void onGraphicRegionMarkReservoirTypeChanged(int type); void onGraphicRegionMarkComKrChanged(double comKr); void onGraphicRegionMarkComWChanged(double comW); void onGraphicRegionMarkNetToGrossChanged(double netToGross); void onGraphicRegionMarkVisibleChanged(bool bVisible); // 复合区图元信号 → 数据同步 void onGraphicRegionFlowModelChanged(int model); void onGraphicRegionLeakageChanged(double leakage); private: nmDataAnalyzeManager* m_pDataMgr; // 数据中心,不持有,外部注入 // 图元 → 数据 的映射表,供 sender() 反查使用 QMap m_mapFaultData; // 已建立信号连接的图元集合,断开时用于精确匹配 QSet m_setBoundGraphics; // 图元 ←→ 数据 双向信号连接(图元 emit → Binder slot → 数据 setter) void _connectFault(nmObjLineFault* pGraphic, nmDataFault* pData); // 断开指定图元与本 Binder 的四条信号连接 void _disconnectFault(nmObjLineFault* pGraphic); // 从数据对象读取值,写入图元本地副本(加载时用) void _pushFaultDataToGraphic(nmObjLineFault* pGraphic, nmDataFault* pData); // 裂缝图元 → 数据 的映射表 QMap m_mapCrackData; // 已建立信号连接的裂缝图元集合 QSet m_setBoundCrackGraphics; // 裂缝图元 ←→ 数据 双向信号连接 void _connectCrack(nmObjLineCrack* pGraphic, nmDataFracture* pData); // 断开指定裂缝图元与本 Binder 的五条信号连接 void _disconnectCrack(nmObjLineCrack* pGraphic); // 从裂缝数据对象读取值,写入图元本地副本(加载时用) void _pushCrackDataToGraphic(nmObjLineCrack* pGraphic, nmDataFracture* pData); // 边界图元 → 数据 的映射表(三种边界类型共用) QMap m_mapOutlineData; // 已建立信号连接的边界图元集合 QSet m_setBoundOutlineGraphics; // 边界图元 ←→ 数据 信号连接(三条信号) void _connectOutline(nmObjBase* pGraphic, nmDataOutline* pData); // 断开指定边界图元与本 Binder 的信号连接 void _disconnectOutline(nmObjBase* pGraphic); // 从边界数据对象读取值,写入图元本地副本(加载时用) void _pushOutlineDataToGraphic(nmObjBase* pGraphic, nmDataOutline* pData); // 测量线图元 → 数据 的映射表 QMap m_mapMeasureData; // ==================== 区域标记图元 ==================== // 区域标记图元 → 数据 的映射表 QMap m_mapRegionMarkData; // 已建立信号连接的区域标记图元集合 QSet m_setBoundRegionMarkGraphics; // 区域标记图元 ←→ 数据 信号连接 void _connectRegionMark(nmObjRegionMark* pGraphic, nmDataRegionMark* pData); // 断开指定区域标记图元与本 Binder 的信号连接 void _disconnectRegionMark(nmObjRegionMark* pGraphic); // 从区域标记数据对象读取值,写入图元本地副本(加载时用) void _pushRegionMarkDataToGraphic(nmObjRegionMark* pGraphic, nmDataRegionMark* pData); // ==================== 复合区图元 ==================== // 复合区图元 → 数据 的映射表 QMap m_mapRegionData; // 已建立信号连接的复合区图元集合 QSet m_setBoundRegionGraphics; // 复合区图元 ←→ 数据 信号连接 void _connectRegion(nmObjRegion* pGraphic, nmDataRegion* pData); // 断开指定复合区图元与本 Binder 的信号连接 void _disconnectRegion(nmObjRegion* pGraphic); // 从复合区数据对象读取值,写入图元本地副本(加载时用) void _pushRegionDataToGraphic(nmObjRegion* pGraphic, nmDataRegion* pData); // ==================== 井图元 ==================== // 井图元 ↔ 数据 的映射表 QMap m_mapWellData; // 已建立信号连接的井图元集合 QSet m_setBoundWellGraphics; // 井图元 ←→ 数据 信号连接 void _connectWell(nmObjPointWell* pGraphic, nmDataWellBase* pData); // 断开指定井图元与本 Binder 的信号连接 void _disconnectWell(nmObjPointWell* pGraphic); // 从井数据对象读取值,写入图元本地副本(加载时用) void _pushWellDataToGraphic(nmObjPointWell* pGraphic, nmDataWellBase* pData); };