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

#pragma once
#include <QObject>
#include <QMap>
#include <QSet>
#include <QPair>
#include <QVector>
#include <QPointF>
#include "nmPlot_global.h"
2 weeks ago
#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;
2 weeks ago
class nmDataRegion;
class nmObjRegion;
2 weeks ago
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);
2 weeks ago
// ==================== 复合区图元 ====================
// 调用:用户画完复合区后
void createRegionForGraphic(nmObjRegion* pGraphic);
// 调用:从文件加载,绑定已有复合区数据到已有图元
void bindRegionToGraphic(nmObjRegion* pGraphic, nmDataRegion* pData);
// 调用:删除复合区图元前
void removeRegionBinding(nmObjRegion* pGraphic);
// 兜底同步:名称、位置、区域标记关联,由复合区图元在 paintBack 中调用
void syncRegionData(nmObjRegion* pGraphic);
// 查找复合区图元对应的数据指针
nmDataRegion* getRegionDataFor(nmObjRegion* pGraphic);
2 weeks ago
// ==================== 井图元 ====================
// 调用:用户创建新井后,创建数据并建立绑定
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);
2 weeks ago
// 更新井图元的数据映射(编辑井后更换数据对象时使用)
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);
2 weeks ago
// 复合区图元信号 → 数据同步
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);
2 weeks ago
// ==================== 复合区图元 ====================
// 复合区图元 → 数据 的映射表
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);
2 weeks ago
// ==================== 井图元 ====================
// 井图元 ↔ 数据 的映射表
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);
};