#include "nmPlotGraphicBinder.h" #include "nmObjLineFault.h" #include "nmDataFault.h" #include "nmObjLineCrack.h" #include "nmDataFracture.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); } // 名称同步:检测图元名称与数据名称是否一致,不一致则同步 void nmPlotGraphicBinder::syncFaultName(nmObjLineFault* pGraphic) { if (!pGraphic) return; nmDataFault* pData = m_mapFaultData.value(pGraphic, nullptr); if (pData && pData->getFaultName() != pGraphic->getName()) { pData->setFaultName(pGraphic->getName()); } } // 切换分析时更新绑定的 DataManager // 旧图元已由 deleteAllPlotObjs 清除,清理残留映射避免悬空指针 void nmPlotGraphicBinder::updateDataMgr(nmDataAnalyzeManager* pDataMgr) { m_mapFaultData.clear(); m_setBoundGraphics.clear(); m_mapCrackData.clear(); m_setBoundCrackGraphics.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() { } // ============ 裂缝绑定 ============ // 用户画完裂缝后:创建数据对象并建立绑定 void nmPlotGraphicBinder::createCrackForGraphic(nmObjLineCrack* pGraphic) { if (!pGraphic || !m_pDataMgr) { return; } // 创建数据对象 nmDataFracture* pData = m_pDataMgr->createFracture(); // 将图元值推入数据 pData->setFractureName(pGraphic->getName()); pData->setFracturePoints(pGraphic->getAllValues()); // 建立信号连接 _connectCrack(pGraphic, pData); m_pDataMgr->notifyDataChanged(); } // 从文件加载:绑定已有裂缝数据到已有图元 void nmPlotGraphicBinder::bindCrackToGraphic(nmObjLineCrack* pGraphic, nmDataFracture* pData) { if (!pGraphic || !pData) { return; } // 将数据值推到图元 _pushCrackDataToGraphic(pGraphic, pData); // 建立信号连接 _connectCrack(pGraphic, pData); } // 删除裂缝图元:断开连接并移除数据 void nmPlotGraphicBinder::removeCrackBinding(nmObjLineCrack* pGraphic) { if (!pGraphic) { return; } // 断开信号 _disconnectCrack(pGraphic); // 从数据中心移除 if (m_mapCrackData.contains(pGraphic)) { nmDataFracture* pData = m_mapCrackData.value(pGraphic); if (pData && m_pDataMgr) { m_pDataMgr->removeFractureData(pData); } m_mapCrackData.remove(pGraphic); } } nmDataFracture* nmPlotGraphicBinder::getCrackDataFor(nmObjLineCrack* pGraphic) { return m_mapCrackData.value(pGraphic, nullptr); } // 名称同步:检测图元名称与数据名称是否一致,不一致则同步 void nmPlotGraphicBinder::syncCrackName(nmObjLineCrack* pGraphic) { if (!pGraphic) return; nmDataFracture* pData = m_mapCrackData.value(pGraphic, nullptr); if (pData && pData->getFractureName() != pGraphic->getName()) { pData->setFractureName(pGraphic->getName()); } } // 将裂缝数据值推到图元本地副本 void nmPlotGraphicBinder::_pushCrackDataToGraphic(nmObjLineCrack* pGraphic, nmDataFracture* pData) { // 阻断信号,防止推送中触发反向同步 pGraphic->blockSignals(true); pGraphic->setName(pData->getFractureName()); int flowModel = (pData->getFractureFlowModel().getValue() == tr("Infinite Conductivity")) ? 0 : 1; pGraphic->setCrackFlowModel(flowModel); pGraphic->setCrackDfc(pData->getFractureDfc().getValue().toDouble()); pGraphic->setCrackDw(pData->getFractureDw().getValue().toDouble()); pGraphic->blockSignals(false); } // 建立裂缝图元与数据的双向信号连接 void nmPlotGraphicBinder::_connectCrack(nmObjLineCrack* pGraphic, nmDataFracture* pData) { QObject::connect(pGraphic, SIGNAL(sigFlowModelChanged(int)), this, SLOT(onGraphicCrackFlowModelChanged(int))); QObject::connect(pGraphic, SIGNAL(sigDfcChanged(double)), this, SLOT(onGraphicCrackDfcChanged(double))); QObject::connect(pGraphic, SIGNAL(sigDwChanged(double)), this, SLOT(onGraphicCrackDwChanged(double))); QObject::connect(pGraphic, SIGNAL(sigPointsChanged()), this, SLOT(onGraphicCrackPointsChanged())); QObject::connect(pGraphic, SIGNAL(sigObjVisibleChanged(bool)), this, SLOT(onGraphicCrackVisibleChanged(bool))); m_mapCrackData[pGraphic] = pData; m_setBoundCrackGraphics.insert(pGraphic); pGraphic->setGraphicBinder(this); } // 断开裂缝图元与本 Binder 的所有信号连接 void nmPlotGraphicBinder::_disconnectCrack(nmObjLineCrack* pGraphic) { QObject::disconnect(pGraphic, SIGNAL(sigFlowModelChanged(int)), this, SLOT(onGraphicCrackFlowModelChanged(int))); QObject::disconnect(pGraphic, SIGNAL(sigDfcChanged(double)), this, SLOT(onGraphicCrackDfcChanged(double))); QObject::disconnect(pGraphic, SIGNAL(sigDwChanged(double)), this, SLOT(onGraphicCrackDwChanged(double))); QObject::disconnect(pGraphic, SIGNAL(sigPointsChanged()), this, SLOT(onGraphicCrackPointsChanged())); QObject::disconnect(pGraphic, SIGNAL(sigObjVisibleChanged(bool)), this, SLOT(onGraphicCrackVisibleChanged(bool))); m_setBoundCrackGraphics.remove(pGraphic); } // 裂缝流动模型变更 void nmPlotGraphicBinder::onGraphicCrackFlowModelChanged(int model) { nmObjLineCrack* pGraphic = qobject_cast(sender()); if (!pGraphic) return; nmDataFracture* pData = m_mapCrackData.value(pGraphic, nullptr); if (!pData) return; nmDataAttribute attr = pData->getFractureFlowModel(); attr.setValue(model == 0 ? tr("Infinite Conductivity") : tr("Finite Conductivity")); pData->setFractureFlowModel(attr); } // 裂缝导流能力变更 void nmPlotGraphicBinder::onGraphicCrackDfcChanged(double dfc) { nmObjLineCrack* pGraphic = qobject_cast(sender()); if (!pGraphic) return; nmDataFracture* pData = m_mapCrackData.value(pGraphic, nullptr); if (!pData) return; nmDataAttribute attr = pData->getFractureDfc(); attr.setValue(dfc); pData->setFractureDfc(attr); } // 裂缝储能比变更 void nmPlotGraphicBinder::onGraphicCrackDwChanged(double dw) { nmObjLineCrack* pGraphic = qobject_cast(sender()); if (!pGraphic) return; nmDataFracture* pData = m_mapCrackData.value(pGraphic, nullptr); if (!pData) return; nmDataAttribute attr = pData->getFractureDw(); attr.setValue(dw); pData->setFractureDw(attr); } // 裂缝点坐标变更 void nmPlotGraphicBinder::onGraphicCrackPointsChanged() { nmObjLineCrack* pGraphic = qobject_cast(sender()); if (!pGraphic) return; nmDataFracture* pData = m_mapCrackData.value(pGraphic, nullptr); if (!pData) return; pData->setFracturePoints(pGraphic->getAllValues()); pData->setFractureName(pGraphic->getName()); if (m_pDataMgr) { m_pDataMgr->notifyDataChanged(); } } // 裂缝可见性变更 void nmPlotGraphicBinder::onGraphicCrackVisibleChanged(bool bVisible) { nmObjLineCrack* pGraphic = qobject_cast(sender()); if (!pGraphic) return; nmDataFracture* pData = m_mapCrackData.value(pGraphic, nullptr); if (!pData) return; pData->setPlotVisible(bVisible); }