diff --git a/Include/nmNum/nmPlot/nmGuiPlot.h b/Include/nmNum/nmPlot/nmGuiPlot.h index 083cea6..3a57ae6 100644 --- a/Include/nmNum/nmPlot/nmGuiPlot.h +++ b/Include/nmNum/nmPlot/nmGuiPlot.h @@ -12,6 +12,7 @@ class nmDataVerticalFracturedWell; class nmDataHorizontalFracturedWell; class nmDataAnalyzeManager; class nmDataWellBase; +class nmPlotGraphicBinder; class QWidget; // 数值试井绘图载体的样例 @@ -208,6 +209,9 @@ class NM_PLOT_EXPORT nmGuiPlot : public iGuiPlot { // 清空井图元 void removeAllWellPlot(); + // 获取 Binder + nmPlotGraphicBinder* graphicBinder() const { return m_pGraphicBinder; } + protected: // 绘制Painter函数重载 @@ -215,4 +219,6 @@ class NM_PLOT_EXPORT nmGuiPlot : public iGuiPlot { int m_iRegionMarkCount; //记录创建了多少个标记区域对象 + nmPlotGraphicBinder* m_pGraphicBinder; // 图元-数据绑定协调器 + }; diff --git a/Include/nmNum/nmPlot/nmObjLineFault.h b/Include/nmNum/nmPlot/nmObjLineFault.h index 1e2762d..7a3dd7f 100644 --- a/Include/nmNum/nmPlot/nmObjLineFault.h +++ b/Include/nmNum/nmPlot/nmObjLineFault.h @@ -4,7 +4,8 @@ #include "nmDefines.h" #include "nmPlot_global.h" -#include "nmDataFault.h" +class nmPlotGraphicBinder; +class nmDataFault; // 数值试井绘图对象(断层) class NM_PLOT_EXPORT nmObjLineFault : public nmObjBase @@ -69,15 +70,14 @@ public: virtual void paintBack(QPainter* painter, \ const ZxPaintParam& param) override; - // 创建后调用,初始化复合区默认参数 - virtual void afterCreated() override; - // 删除断层数据对象 - virtual void removeData() override; - - public slots: - // 图元状态改变 - void onObjVisibleChanged(bool bIsVisible); +signals: + // 流动模型变更 + void sigFlowModelChanged(int model); + // 渗漏率变更 + void sigLeakageChanged(double leakage); + // 点坐标变更 + void sigPointsChanged(); public: @@ -87,9 +87,6 @@ public: double getFaultLeakage(); void setFaultLeakage(double newFaultLeakage); - void setFaultData(nmDataFault* newFaultData); - nmDataFault* getFaultData() const; - double getStartX(); void setStartX(double newValue); double getStartY(); @@ -98,7 +95,14 @@ public: void setEndX(double newValue); double getEndY(); void setEndY(double newValue); -private: - nmDataFault* m_faultData; // 断层数据对象 + // 查找数据指针 + nmDataFault* getFaultData() const; + + void setGraphicBinder(nmPlotGraphicBinder* pBinder) { m_pGraphicBinder = pBinder; } + +private: + QString m_sFlowModel; + double m_dLeakage; + nmPlotGraphicBinder* m_pGraphicBinder; }; diff --git a/Include/nmNum/nmPlot/nmPlotGraphicBinder.h b/Include/nmNum/nmPlot/nmPlotGraphicBinder.h new file mode 100644 index 0000000..5334ace --- /dev/null +++ b/Include/nmNum/nmPlot/nmPlotGraphicBinder.h @@ -0,0 +1,64 @@ +#pragma once + +#include +#include +#include + +#include "nmPlot_global.h" + +class nmDataAnalyzeManager; +class nmDataFault; +class nmObjLineFault; + +// 图元与数据绑定协调器,由 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); + + // 切换分析时更新绑定的 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); + +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); +}; diff --git a/Src/nmNum/nmPlot/nmGuiPlot.cpp b/Src/nmNum/nmPlot/nmGuiPlot.cpp index 6693c6c..ba3b0a8 100644 --- a/Src/nmNum/nmPlot/nmGuiPlot.cpp +++ b/Src/nmNum/nmPlot/nmGuiPlot.cpp @@ -48,9 +48,12 @@ #include "nmObjDeleteTool.h" #include "nmDataAnalyzeManager.h" +#include "nmDataFault.h" #include "nmDataOutline.h" #include "nmDataAxis.h" +#include "nmPlotGraphicBinder.h" + #include "ZxDataGaugeP.h" #include "ZxDataGaugeF.h" @@ -77,6 +80,9 @@ nmGuiPlot::nmGuiPlot(bool bUseBtns, QWidget *parent) : m_iRegionMarkCount = 0; + m_pGraphicBinder = new nmPlotGraphicBinder( + nmDataAnalyzeManager::getCurrentInstance(), this); + } nmGuiPlot::~nmGuiPlot() @@ -608,8 +614,8 @@ void nmGuiPlot::initFaultObjsFromData(nmDataAnalyzeManager* pDataManager) continue; } - // 3.7 绑定裂缝数据到图元对象上 - pFaultPlot->setFaultData(pDataFault); + // 3.7 通过 Binder 绑定数据(推值 + 建立信号连接) + m_pGraphicBinder->bindFaultToGraphic(pFaultPlot, pDataFault); // TODO: 设置断层其他属性 } @@ -1369,8 +1375,13 @@ void nmGuiPlot::slotDeleteOneObj(QString sName, void* obj) if(nmObj) { m_pPlot->removeObjByName(sName); - // 删除数据对象 - nmObj->removeData(); + // 先通过 Binder 清理数据绑定(如果是断层等 Binder 管理的类型) + if (nmObjLineFault* pFault = dynamic_cast(nmObj)) { + m_pGraphicBinder->removeFaultBinding(pFault); + } else { + // 其他类型回退到旧方式 + nmObj->removeData(); + } } } } else { diff --git a/Src/nmNum/nmPlot/nmGuiPlotCmdHelper.cpp b/Src/nmNum/nmPlot/nmGuiPlotCmdHelper.cpp index f06d3d7..1b4ddb3 100644 --- a/Src/nmNum/nmPlot/nmGuiPlotCmdHelper.cpp +++ b/Src/nmNum/nmPlot/nmGuiPlotCmdHelper.cpp @@ -14,12 +14,14 @@ #include "nmObjPolygonOutlineTool.h" #include "nmObjLineCrackTool.h" #include "nmObjLineFaultTool.h" +#include "nmObjLineFault.h" #include "nmObjLineMeasuringScaleTool.h" #include "nmObjPointWellTool.h" #include "nmObjLineMeasureTool.h" #include "nmGuiPlot.h" #include "nmGuiPlotCmdHelper.h" +#include "nmPlotGraphicBinder.h" #include "nmDataLogFile.h" @@ -345,7 +347,15 @@ void nmGuiPlotCmdHelper::slotObjPtsFinished(QVector& vec) { } nmObjBase* pObj = pWxPlot->appendOneObj(pTool->getNOT(), sName, vec); - pObj->afterCreated(); + // 断层创建逻辑已改由 Binder 负责(创建数据 + 建立信号连接) + if (pTool->getNOT() == NMOT_Line_Fault) { + nmObjLineFault* pFault = dynamic_cast(pObj); + if (pFault && pWxPlot->graphicBinder()) { + pWxPlot->graphicBinder()->createFaultForGraphic(pFault); + } + } else { + pObj->afterCreated(); + } } void nmGuiPlotCmdHelper::finishMeasure() diff --git a/Src/nmNum/nmPlot/nmObjLineFault.cpp b/Src/nmNum/nmPlot/nmObjLineFault.cpp index 86a6afd..b029fd8 100644 --- a/Src/nmNum/nmPlot/nmObjLineFault.cpp +++ b/Src/nmNum/nmPlot/nmObjLineFault.cpp @@ -12,7 +12,7 @@ #include "nmObjLineFault.h" -#include "nmDataAnalyzeManager.h" +#include "nmPlotGraphicBinder.h" ZX_DEFINE_DYNAMIC(nObjLineFault, nmObjLineFault) @@ -29,8 +29,6 @@ nmObjLineFault::nmObjLineFault(const QString& sName, \ } nmObjLineFault::~nmObjLineFault() { - // 断层数据由DataManager统一释放,图元只保存引用。 - m_faultData = nullptr; } void nmObjLineFault::fillPtyPano(IxPtyPano* sheet) { @@ -64,13 +62,13 @@ void nmObjLineFault::init(const QString& sName, \ nmObjLineFault::initFlags(); m_oPen = QPen(QBrush(Qt::green), \ 0.3f, Qt::SolidLine); - m_faultData = nullptr; - loadTempl(); + // 业务属性本地默认值 + m_sFlowModel = tr("Leaky"); + m_dLeakage = 1.0; + m_pGraphicBinder = nullptr; - // 连接图元可见性信号和槽 - connect(this, SIGNAL(sigObjVisibleChanged(bool)), - this, SLOT(onObjVisibleChanged(bool))); + loadTempl(); } void nmObjLineFault::initTools() { @@ -134,7 +132,8 @@ bool nmObjLineFault::_runHitTest(const QPointF& pt, int& nOption, int& nSubIndex m_vecPoints = getValueOf(pts); nOption = (int)OHO_Point; nSubIndex = i + 1; - + // 点集变更 + emit sigPointsChanged(); return true; } @@ -159,12 +158,15 @@ bool nmObjLineFault::runMove(const QPointF& pt1, int nCount = m_vecPoints.count(); QVector vecPts = getPosOf(m_vecPoints); // 屏幕值 + bool bRet = false; if(m_oHitOption == OHO_Point && m_nHitIndex >= 0) { // 如果是点,不用计算偏移量,直接将该点移动到鼠标抬起的位置即可 vecPts[m_nHitIndex] = pt2; - nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); - return moveToPos(vecPts); + bRet = moveToPos(vecPts); + // 移动后通知点集变更 + emit sigPointsChanged(); + return bRet; } else if(m_oHitOption == OHO_Bound && m_nHitIndex >= 0) { for(int i = 0; i < nCount; i++) { vecPts[i] = offsetPoint(vecPts[i], pt1, pt2); @@ -172,8 +174,10 @@ bool nmObjLineFault::runMove(const QPointF& pt1, m_dOffsetX = pt2.x() - pt1.x(); m_dOffsetY = pt2.y() - pt1.y(); - nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); - return moveToPos(vecPts); + bRet = moveToPos(vecPts); + // 移动后通知点集变更 + emit sigPointsChanged(); + return bRet; } else { return false; } @@ -191,12 +195,6 @@ void nmObjLineFault::paintBack(QPainter* painter, const ZxPaintParam& param) { painter->save(); QVector pts = getPosOf(m_vecPoints); - // 更新断层几何数据 - if (m_faultData != nullptr) { - m_faultData->setFaultName(m_sName); - m_faultData->setFaultPoints(m_vecPoints); - } - // 不选中的状态 if(!pts.empty()) { @@ -279,8 +277,6 @@ void nmObjLineFault::paintBack(QPainter* painter, const ZxPaintParam& param) { nmDataLogFile::getInstance()->writeLog("select line " + QString::number(i)); QPen pen(Qt::DashLine); - //pen.setWidth(1); // 设置线条宽度 - //pen.setColor(Qt::yellow); // 设置线条颜色 painter->setPen(pen); for(int i = 0; i < pts.count() - 1; i++) { @@ -294,79 +290,87 @@ void nmObjLineFault::paintBack(QPainter* painter, const ZxPaintParam& param) { } double nmObjLineFault::getFaultLeakage() { - return m_faultData->getFaultLeakage().getValue().toDouble(); + return m_dLeakage; } void nmObjLineFault::setFaultLeakage(double newFaultLeakage) { - // 从Data中取数据 - nmDataAttribute tempAttr = m_faultData->getFaultLeakage(); - tempAttr.setValue(newFaultLeakage); - m_faultData->setFaultLeakage(tempAttr); + m_dLeakage = newFaultLeakage; + emit sigLeakageChanged(newFaultLeakage); } int nmObjLineFault::getFaultFlowModel() { - if (m_faultData->getFaultFlowModel().getValue() == tr("Leaky")) + if (m_sFlowModel == tr("Leaky")) return 0; else return 1; } void nmObjLineFault::setFaultFlowModel(int newFaultFlowModel) { - // 从Data中取数据 - nmDataAttribute tempAttr = m_faultData->getFaultFlowModel(); if (newFaultFlowModel == 0) { - tempAttr.setValue(tr("Leaky")); + m_sFlowModel = tr("Leaky"); } else { - tempAttr.setValue(tr("Composite limit")); + m_sFlowModel = tr("Composite limit"); } - m_faultData->setFaultFlowModel(tempAttr); + emit sigFlowModelChanged(newFaultFlowModel); } double nmObjLineFault::getStartX() { - return m_faultData->getFaultPoints().first().x(); + if (!m_vecPoints.isEmpty()) + return m_vecPoints.first().x(); + return 0; } void nmObjLineFault::setStartX(double newValue) { - m_vecPoints.first().setX(newValue); - nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); + if (!m_vecPoints.isEmpty()) { + m_vecPoints.first().setX(newValue); + emit sigPointsChanged(); + } } double nmObjLineFault::getStartY() { - return m_faultData->getFaultPoints().first().y(); + if (!m_vecPoints.isEmpty()) + return m_vecPoints.first().y(); + return 0; } void nmObjLineFault::setStartY(double newValue) { - m_vecPoints.first().setY(newValue); - nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); + if (!m_vecPoints.isEmpty()) { + m_vecPoints.first().setY(newValue); + emit sigPointsChanged(); + } } double nmObjLineFault::getEndX() { - return m_faultData->getFaultPoints().last().x(); + if (!m_vecPoints.isEmpty()) + return m_vecPoints.last().x(); + return 0; } void nmObjLineFault::setEndX(double newValue) { - m_vecPoints.last().setX(newValue); - nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); + if (!m_vecPoints.isEmpty()) { + m_vecPoints.last().setX(newValue); + emit sigPointsChanged(); + } } double nmObjLineFault::getEndY() { - return m_faultData->getFaultPoints().last().y(); + if (!m_vecPoints.isEmpty()) + return m_vecPoints.last().y(); + return 0; } void nmObjLineFault::setEndY(double newValue) { - m_vecPoints.last().setY(newValue); - nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); + if (!m_vecPoints.isEmpty()) { + m_vecPoints.last().setY(newValue); + emit sigPointsChanged(); + } } void nmObjLineFault::onSerialize(ZxSerializer* ser) { nmObjBase::onSerialize(ser); - int flowModel; - if (m_faultData->getFaultFlowModel().getValue() == tr("Leaky")) - flowModel = 0; - else - flowModel = 1; + int flowModel = getFaultFlowModel(); ser->write("FlowModel", flowModel); - ser->write("Leakage", m_faultData->getFaultLeakage().getValue().toDouble()); + ser->write("Leakage", m_dLeakage); } void nmObjLineFault::onDeserialize(ZxSerializer* ser) { @@ -383,13 +387,9 @@ void nmObjLineFault::onDeserialize(ZxSerializer* ser) { void nmObjLineFault::onSaveTempl(ZxSerializer* ser) { nmObjBase::onSaveTempl(ser); - int flowModel; - if (m_faultData->getFaultFlowModel().getValue() == tr("Leaky")) - flowModel = 0; - else - flowModel = 1; - ser->write("FlowModel", flowModel); - ser->write("Leakage", m_faultData->getFaultLeakage().getValue().toDouble()); + int flowModel = getFaultFlowModel(); + ser->write("FlowModel", flowModel); + ser->write("Leakage", m_dLeakage); } void nmObjLineFault::onLoadTempl(ZxSerializer* ser) { @@ -398,40 +398,14 @@ void nmObjLineFault::onLoadTempl(ZxSerializer* ser) { double faultLeakage; ser->read("FlowModel", flowModel); ser->read("Leakage", faultLeakage); - + // 更新Data this->setFaultFlowModel(flowModel); this->setFaultLeakage(faultLeakage); } -void nmObjLineFault::setFaultData(nmDataFault* newFaultData) { - m_faultData = newFaultData; -} -nmDataFault* nmObjLineFault::getFaultData() const{ - return m_faultData; -} - -void nmObjLineFault::afterCreated() { - m_faultData = nmDataAnalyzeManager::getCurrentInstance()->createFault(); - m_faultData->setFaultName(m_sName); - m_faultData->setFaultPoints(m_vecPoints); - nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); -} - -void nmObjLineFault::removeData() { - if (m_faultData) { - // 从数据中心移除该数据 - nmDataAnalyzeManager::getCurrentInstance()->removeFaultData(m_faultData); - m_faultData = nullptr; - } -} - -void nmObjLineFault::onObjVisibleChanged(bool bIsVisible) { - if (m_faultData != nullptr) { - m_faultData->setPlotVisible(bIsVisible); - } +nmDataFault* nmObjLineFault::getFaultData() const { + if (m_pGraphicBinder) + return m_pGraphicBinder->getFaultDataFor(const_cast(this)); + return nullptr; } - - - - diff --git a/Src/nmNum/nmPlot/nmObjLineFaultTool.cpp b/Src/nmNum/nmPlot/nmObjLineFaultTool.cpp index 042eb46..3704382 100644 --- a/Src/nmNum/nmPlot/nmObjLineFaultTool.cpp +++ b/Src/nmNum/nmPlot/nmObjLineFaultTool.cpp @@ -7,6 +7,7 @@ #include "nmDataLogFile.h" #include "nmObjLineFault.h" +#include "nmDataFault.h" #include "ZxPlot.h" #include "nmObjPointWell.h" diff --git a/Src/nmNum/nmPlot/nmPlotGraphicBinder.cpp b/Src/nmNum/nmPlot/nmPlotGraphicBinder.cpp new file mode 100644 index 0000000..8aaa75e --- /dev/null +++ b/Src/nmNum/nmPlot/nmPlotGraphicBinder.cpp @@ -0,0 +1,201 @@ +#include "nmPlotGraphicBinder.h" + +#include "nmObjLineFault.h" +#include "nmDataFault.h" +#include "nmDataAnalyzeManager.h" + +#include + +nmPlotGraphicBinder::nmPlotGraphicBinder(nmDataAnalyzeManager* pDataMgr, QObject* parent) + : QObject(parent) + , m_pDataMgr(pDataMgr) +{ +} + +// 用户画完断层后:创建数据对象并建立绑定 +void nmPlotGraphicBinder::createFaultForGraphic(nmObjLineFault* pGraphic) +{ + if (!pGraphic || !m_pDataMgr) { + return; + } + + // 创建数据对象 + nmDataFault* pData = m_pDataMgr->createFault(); + + // 将图元值推入数据 + pData->setFaultName(pGraphic->getName()); + pData->setFaultPoints(pGraphic->getAllValues()); + + // 建立信号连接 + _connectFault(pGraphic, pData); + + m_pDataMgr->notifyDataChanged(); +} + +// 从文件加载:绑定已有数据到已有图元 +void nmPlotGraphicBinder::bindFaultToGraphic(nmObjLineFault* pGraphic, nmDataFault* pData) +{ + if (!pGraphic || !pData) { + return; + } + + // 将数据值推到图元 + _pushFaultDataToGraphic(pGraphic, pData); + + // 建立信号连接 + _connectFault(pGraphic, pData); +} + +// 删除图元:断开连接并移除数据 +void nmPlotGraphicBinder::removeFaultBinding(nmObjLineFault* pGraphic) +{ + if (!pGraphic) { + return; + } + + // 断开信号 + _disconnectFault(pGraphic); + + // 从数据中心移除 + if (m_mapFaultData.contains(pGraphic)) { + nmDataFault* pData = m_mapFaultData.value(pGraphic); + if (pData && m_pDataMgr) { + m_pDataMgr->removeFaultData(pData); + } + m_mapFaultData.remove(pGraphic); + } +} + +nmDataFault* nmPlotGraphicBinder::getFaultDataFor(nmObjLineFault* pGraphic) +{ + return m_mapFaultData.value(pGraphic, nullptr); +} + +// 切换分析时更新绑定的 DataManager +// 旧图元已由 deleteAllPlotObjs 清除,清理残留映射避免悬空指针 +void nmPlotGraphicBinder::updateDataMgr(nmDataAnalyzeManager* pDataMgr) +{ + m_mapFaultData.clear(); + m_setBoundGraphics.clear(); + m_pDataMgr = pDataMgr; +} + +// 将数据值推到图元本地副本 +void nmPlotGraphicBinder::_pushFaultDataToGraphic(nmObjLineFault* pGraphic, nmDataFault* pData) +{ + // 阻断信号,防止推送中触发反向同步 + pGraphic->blockSignals(true); + + pGraphic->setName(pData->getFaultName()); + + int flowModel = (pData->getFaultFlowModel().getValue() == tr("Leaky")) ? 0 : 1; + pGraphic->setFaultFlowModel(flowModel); + + pGraphic->setFaultLeakage(pData->getFaultLeakage().getValue().toDouble()); + + pGraphic->blockSignals(false); +} + +// 建立图元与数据的双向信号连接 +void nmPlotGraphicBinder::_connectFault(nmObjLineFault* pGraphic, nmDataFault* pData) +{ + QObject::connect(pGraphic, SIGNAL(sigFlowModelChanged(int)), + this, SLOT(onGraphicFlowModelChanged(int))); + + QObject::connect(pGraphic, SIGNAL(sigLeakageChanged(double)), + this, SLOT(onGraphicLeakageChanged(double))); + + QObject::connect(pGraphic, SIGNAL(sigPointsChanged()), + this, SLOT(onGraphicPointsChanged())); + + QObject::connect(pGraphic, SIGNAL(sigObjVisibleChanged(bool)), + this, SLOT(onGraphicVisibleChanged(bool))); + + m_mapFaultData[pGraphic] = pData; + + m_setBoundGraphics.insert(pGraphic); + + pGraphic->setGraphicBinder(this); +} + +// 断开图元与本 Binder 的所有信号连接 +void nmPlotGraphicBinder::_disconnectFault(nmObjLineFault* pGraphic) +{ + QObject::disconnect(pGraphic, SIGNAL(sigFlowModelChanged(int)), + this, SLOT(onGraphicFlowModelChanged(int))); + + QObject::disconnect(pGraphic, SIGNAL(sigLeakageChanged(double)), + this, SLOT(onGraphicLeakageChanged(double))); + + QObject::disconnect(pGraphic, SIGNAL(sigPointsChanged()), + this, SLOT(onGraphicPointsChanged())); + + QObject::disconnect(pGraphic, SIGNAL(sigObjVisibleChanged(bool)), + this, SLOT(onGraphicVisibleChanged(bool))); + + m_setBoundGraphics.remove(pGraphic); +} + +// 图元属性变更 → 同步到数据 + +// 流动模型变更 +void nmPlotGraphicBinder::onGraphicFlowModelChanged(int model) +{ + nmObjLineFault* pGraphic = qobject_cast(sender()); + if (!pGraphic) return; + + nmDataFault* pData = m_mapFaultData.value(pGraphic, nullptr); + if (!pData) return; + + nmDataAttribute attr = pData->getFaultFlowModel(); + attr.setValue(model == 0 ? tr("Leaky") : tr("Composite Limit")); + pData->setFaultFlowModel(attr); +} + +// 渗漏率变更 +void nmPlotGraphicBinder::onGraphicLeakageChanged(double leakage) +{ + nmObjLineFault* pGraphic = qobject_cast(sender()); + if (!pGraphic) return; + + nmDataFault* pData = m_mapFaultData.value(pGraphic, nullptr); + if (!pData) return; + + nmDataAttribute attr = pData->getFaultLeakage(); + attr.setValue(leakage); + pData->setFaultLeakage(attr); +} + +// 点坐标变更 +void nmPlotGraphicBinder::onGraphicPointsChanged() +{ + nmObjLineFault* pGraphic = qobject_cast(sender()); + if (!pGraphic) return; + + nmDataFault* pData = m_mapFaultData.value(pGraphic, nullptr); + if (!pData) return; + + pData->setFaultPoints(pGraphic->getAllValues()); + pData->setFaultName(pGraphic->getName()); + + if (m_pDataMgr) { + m_pDataMgr->notifyDataChanged(); + } +} + +// 可见性变更 +void nmPlotGraphicBinder::onGraphicVisibleChanged(bool bVisible) +{ + nmObjLineFault* pGraphic = qobject_cast(sender()); + if (!pGraphic) return; + + nmDataFault* pData = m_mapFaultData.value(pGraphic, nullptr); + if (!pData) return; + + pData->setPlotVisible(bVisible); +} + +// 数据变更(预留) +void nmPlotGraphicBinder::onDataChanged() +{ +} diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index 5db6c76..3f70a8f 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -33,6 +33,7 @@ #endif #include "nmGuiPlot.h" +#include "nmPlotGraphicBinder.h" #include "nmSubWndMain.h" #include "nmPlotDialogContext.h" #include "nmPlotDialogContextProvider.h" @@ -2443,6 +2444,12 @@ void nmSubWndMain::updateMapByDataManager(nmDataAnalyzeManager* pDataManager) m_pWxPlot->deleteAllPlotObjs(); + // 切换分析时更新 Binder 绑定的 DataManager, + // 确保用户新画断层时添加到正确的 DataManager + if(m_pWxPlot->graphicBinder()) { + m_pWxPlot->graphicBinder()->updateDataMgr(pDataManager); + } + // 根据数据中心内容绘制新图元 m_pWxPlot->setPlotsByDataManger(pDataManager); }