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.
nmWTAI-Platform/Include/nmNum/nmPlot/nmPlotGraphicBinder.h

339 lines
12 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 <QObject>
#include <QMap>
#include <QSet>
#include <QPair>
#include <QVector>
#include <QPointF>
#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;
class ZxDataWell;
class ZxObjText;
// 图元与数据绑定协调器,由 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);
// 井图元绘制所需的只读数据快照
struct WellRenderData {
WellRenderData();
bool valid;
NM_WELL_MODEL wellType;
double x;
double y;
double radius;
double wellLength;
double drainAngle;
QVector<QPointF> verticalFracs;
QVector<QPair<QPointF, QPointF>> horizontalFracs;
};
// 判断井图元是否已绑定井数据
bool hasWellDataFor(nmObjPointWell* pGraphic) const;
// 判断井图元是否为当前分析井
bool isCurrentWellGraphic(nmObjPointWell* pGraphic) const;
// 图元移动后,同步井位置及裂缝位置
void syncWellMoveFromGraphic(nmObjPointWell* pGraphic, NM_WELL_MODEL wellType, const QPointF& newLocation);
// 选择已有井后,确保图元已创建并绑定对应的井数据
bool ensureSelectedWellData(nmObjPointWell* pGraphic, NM_WELL_MODEL& wellType);
// 编辑井属性,并将结果同步到框架井数据和数值井数据
bool editWellForGraphic(nmObjPointWell* pGraphic, NM_WELL_MODEL& wellType, ZxObjText* pNameLabel);
// 获取井图元绘制所需的数据快照
WellRenderData getWellRenderData(nmObjPointWell* pGraphic) const;
// 同步井图元可见性到井数据
void setWellVisible(nmObjPointWell* pGraphic, bool bVisible);
// 更新井图元的数据映射(编辑井后更换数据对象时使用)
void updateWellDataMapping(nmObjPointWell* pGraphic, nmDataWellBase* pNewData) { m_mapWellData[pGraphic] = pNewData; }
// 井相关数据中心委托方法
void calculateWellLogData(nmDataWellBase* pWellData,
QVector<QVector<double>>& pressure,
QVector<QVector<double>>& logLog,
QVector<QVector<double>>& 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<nmObjLineFault*, nmDataFault*> m_mapFaultData;
// 已建立信号连接的图元集合,断开时用于精确匹配
QSet<nmObjLineFault*> m_setBoundGraphics;
// 图元 ←→ 数据 双向信号连接(图元 emit → Binder slot → 数据 setter
void _connectFault(nmObjLineFault* pGraphic, nmDataFault* pData);
// 断开指定图元与本 Binder 的四条信号连接
void _disconnectFault(nmObjLineFault* pGraphic);
// 从数据对象读取值,写入图元本地副本(加载时用)
void _pushFaultDataToGraphic(nmObjLineFault* pGraphic, nmDataFault* pData);
// 裂缝图元 → 数据 的映射表
QMap<nmObjLineCrack*, nmDataFracture*> m_mapCrackData;
// 已建立信号连接的裂缝图元集合
QSet<nmObjLineCrack*> m_setBoundCrackGraphics;
// 裂缝图元 ←→ 数据 双向信号连接
void _connectCrack(nmObjLineCrack* pGraphic, nmDataFracture* pData);
// 断开指定裂缝图元与本 Binder 的五条信号连接
void _disconnectCrack(nmObjLineCrack* pGraphic);
// 从裂缝数据对象读取值,写入图元本地副本(加载时用)
void _pushCrackDataToGraphic(nmObjLineCrack* pGraphic, nmDataFracture* pData);
// 边界图元 → 数据 的映射表(三种边界类型共用)
QMap<nmObjBase*, nmDataOutline*> m_mapOutlineData;
// 已建立信号连接的边界图元集合
QSet<nmObjBase*> m_setBoundOutlineGraphics;
// 边界图元 ←→ 数据 信号连接(三条信号)
void _connectOutline(nmObjBase* pGraphic, nmDataOutline* pData);
// 断开指定边界图元与本 Binder 的信号连接
void _disconnectOutline(nmObjBase* pGraphic);
// 从边界数据对象读取值,写入图元本地副本(加载时用)
void _pushOutlineDataToGraphic(nmObjBase* pGraphic, nmDataOutline* pData);
// 测量线图元 → 数据 的映射表
QMap<nmObjLineMeasure*, nmDataMeasure*> m_mapMeasureData;
// ==================== 区域标记图元 ====================
// 区域标记图元 → 数据 的映射表
QMap<nmObjRegionMark*, nmDataRegionMark*> m_mapRegionMarkData;
// 已建立信号连接的区域标记图元集合
QSet<nmObjRegionMark*> m_setBoundRegionMarkGraphics;
// 区域标记图元 ←→ 数据 信号连接
void _connectRegionMark(nmObjRegionMark* pGraphic, nmDataRegionMark* pData);
// 断开指定区域标记图元与本 Binder 的信号连接
void _disconnectRegionMark(nmObjRegionMark* pGraphic);
// 从区域标记数据对象读取值,写入图元本地副本(加载时用)
void _pushRegionMarkDataToGraphic(nmObjRegionMark* pGraphic, nmDataRegionMark* pData);
// ==================== 复合区图元 ====================
// 复合区图元 → 数据 的映射表
QMap<nmObjRegion*, nmDataRegion*> m_mapRegionData;
// 已建立信号连接的复合区图元集合
QSet<nmObjRegion*> m_setBoundRegionGraphics;
// 复合区图元 ←→ 数据 信号连接
void _connectRegion(nmObjRegion* pGraphic, nmDataRegion* pData);
// 断开指定复合区图元与本 Binder 的信号连接
void _disconnectRegion(nmObjRegion* pGraphic);
// 从复合区数据对象读取值,写入图元本地副本(加载时用)
void _pushRegionDataToGraphic(nmObjRegion* pGraphic, nmDataRegion* pData);
// ==================== 井图元 ====================
// 井图元 ↔ 数据 的映射表
QMap<nmObjPointWell*, nmDataWellBase*> m_mapWellData;
// 已建立信号连接的井图元集合
QSet<nmObjPointWell*> m_setBoundWellGraphics;
// 井图元 ←→ 数据 信号连接
void _connectWell(nmObjPointWell* pGraphic, nmDataWellBase* pData);
// 断开指定井图元与本 Binder 的信号连接
void _disconnectWell(nmObjPointWell* pGraphic);
// 从井数据对象读取值,写入图元本地副本(加载时用)
void _pushWellDataToGraphic(nmObjPointWell* pGraphic, nmDataWellBase* pData);
};