#include "nmWxReservoirPropertiesDlg.h" #include #include #include #include #include #include #include #include #include #include #include "ZxBaseUtil.h" #include #include "nmWxParameterProperty.h" #include "nmDataAnalyzeManager.h" #include "nmDataWellBase.h" #include "nmGUIDrawerWidget.h" #include "nmGUIComponentLineEdit.h" #include "nmGUIComponentComboBox.h" nmWxReservoirPropertiesDlg::nmWxReservoirPropertiesDlg() { initParameters(); // 参数初始化 initUI(); // 初始化界面 setWindowTitle(tr("Reservoir Properties")); resize(800, 600); } nmWxReservoirPropertiesDlg::~nmWxReservoirPropertiesDlg() { // 删除UI组件 qDeleteAll(m_listAllComponents); } void nmWxReservoirPropertiesDlg::initParameters() { m_verticalWells.clear(); m_verticalFracturedWells.clear(); m_horizontalFracturedWells.clear(); m_vecDataFaults.clear(); m_vecDataFractures.clear(); m_vecDataRegions.clear(); // 加载已有井数据 QVector listWellData = nmDataAnalyzeManager::getCurrentInstance()->getWellDataList(); // 遍历并分类井数据 foreach (nmDataWellBase* well, listWellData) { if (auto vfWell = dynamic_cast(well)) { m_verticalFracturedWells.append(*vfWell); } else if (auto hfWell = dynamic_cast(well)) { m_horizontalFracturedWells.append(*hfWell); } else if (auto vWell = dynamic_cast(well)) { m_verticalWells.append(*vWell); } else if (auto hWell = dynamic_cast(well)) { m_horizontalWells.append(*hWell); } } // 保存初始的几何参数,用于检测是否重绘网格 m_previousVerticalWells = m_verticalWells; m_previousHorizontalWells = m_horizontalWells; m_previousVerticalFracturedWells = m_verticalFracturedWells; m_previousHorizontalFracturedWells = m_horizontalFracturedWells; // 获取油藏参数 m_reservior = nmDataAnalyzeManager::getCurrentInstance()->getReservoirDataCopy(); //获取区域标记参数 m_vecRegionMark = nmDataAnalyzeManager::getCurrentInstance()->getRegionMarkDataListCopy(); // 获取断层参数 m_vecDataFaults= nmDataAnalyzeManager::getCurrentInstance()->getFaultDataListCopy(); // 获取裂缝参数 m_vecDataFractures = nmDataAnalyzeManager::getCurrentInstance()->getFractureDataListCopy(); // 获取复合区参数 m_vecDataRegions = nmDataAnalyzeManager::getCurrentInstance()->getRegionDataListCopy(); } void nmWxReservoirPropertiesDlg::initUI() { m_pMainLayout = new QVBoxLayout(); this->setLayout(m_pMainLayout); m_pTabWidget = new QTabWidget(); m_pMainLayout->addWidget(m_pTabWidget); m_pTabWidget->addTab(initParametersUI(), tr("Parameters")); // tabWidget->addTab(initLayerPropertiesUI(), tr("Layer properties")); QHBoxLayout* buttonLayout = new QHBoxLayout; QPushButton* okButton = new QPushButton(tr("OK"), this); QPushButton* cancelButton = new QPushButton(tr("Cancel"), this); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); buttonLayout->addStretch(); buttonLayout->addWidget(okButton); buttonLayout->addWidget(cancelButton); m_pMainLayout->addLayout(buttonLayout); } QWidget* nmWxReservoirPropertiesDlg::initParametersUI() { QWidget* container = new QWidget; QVBoxLayout* containerLayout = new QVBoxLayout(container); QScrollArea* scrollArea = new QScrollArea; scrollArea->setWidgetResizable(true); QWidget* scrollContent = new QWidget; QVBoxLayout* contentLayout = new QVBoxLayout(scrollContent); //dimensionlessCheckbox = new QCheckBox(tr("Use dimensionless parameters (M,D)"), container); //layout->addWidget(dimensionlessCheckbox); QHBoxLayout* filterLayout = new QHBoxLayout; QLabel* showLabel = new QLabel(tr("Show:"), container); m_pShowComboBox = new QComboBox(container); m_pShowComboBox->addItems(QStringList() << tr("All") << tr("Tested Well") << tr("Reservoir") << tr("Layer #1") << tr("Layer #1 - Region #1") << tr("Layer #1 - Region #2") << tr("Layer #2")); filterLayout->addWidget(showLabel); filterLayout->addWidget(m_pShowComboBox); filterLayout->addStretch(); contentLayout->addLayout(filterLayout); // Add all property components setupVerticalWells(contentLayout); //setupHorizontalWells(contentLayout); setupVerticalFracturedWells(contentLayout); setupHorizontalFracturedWells(contentLayout); setupReserviorProperties(contentLayout); setupRegionMarkProperties(contentLayout); setupContourFaultProperties(contentLayout); contentLayout->addStretch(); scrollArea->setWidget(scrollContent); containerLayout->addWidget(scrollArea); return container; } void nmWxReservoirPropertiesDlg::setupVerticalWells(QVBoxLayout *layout) { for (int i = 0; i < m_verticalWells.size(); ++i) { nmDataVerticalWell& well = m_verticalWells[i]; nmGUIDrawerWidget* drawer = new nmGUIDrawerWidget(well.getWellName() + tr(" - Vertical")); QVBoxLayout* wellLayout = new QVBoxLayout; addWellComponents(wellLayout, well); drawer->setContentLayout(wellLayout); layout->addWidget(drawer); } } void nmWxReservoirPropertiesDlg::setupHorizontalWells(QVBoxLayout *layout) { for (int i = 0; i < m_horizontalWells.size(); ++i) { nmDataHorizontalWell& well = m_horizontalWells[i]; nmGUIDrawerWidget* drawer = new nmGUIDrawerWidget(well.getWellName() + tr(" - Horizontal")); QVBoxLayout* wellLayout = new QVBoxLayout; addWellComponents(wellLayout, well); drawer->setContentLayout(wellLayout); layout->addWidget(drawer); } } void nmWxReservoirPropertiesDlg::setupVerticalFracturedWells(QVBoxLayout *layout) { for (int i = 0; i < m_verticalFracturedWells.size(); ++i) { nmDataVerticalFracturedWell& well = m_verticalFracturedWells[i]; nmGUIDrawerWidget* drawer = new nmGUIDrawerWidget(well.getWellName() + tr(" - Vertical Fractured")); QVBoxLayout* wellLayout = new QVBoxLayout; addWellComponents(wellLayout, well); drawer->setContentLayout(wellLayout); layout->addWidget(drawer); } } void nmWxReservoirPropertiesDlg::setupHorizontalFracturedWells(QVBoxLayout *layout) { for (int i = 0; i < m_horizontalFracturedWells.size(); ++i) { nmDataHorizontalFracturedWell& well = m_horizontalFracturedWells[i]; nmGUIDrawerWidget* drawer = new nmGUIDrawerWidget(well.getWellName() + tr(" - Horizontal Fractured")); QVBoxLayout* wellLayout = new QVBoxLayout; addWellComponents(wellLayout, well); drawer->setContentLayout(wellLayout); layout->addWidget(drawer); } } void nmWxReservoirPropertiesDlg::setupReserviorProperties(QVBoxLayout *layout) { nmGUIDrawerWidget* drawer = new nmGUIDrawerWidget(tr("Reservoir Properties")); QVBoxLayout* reservoirLayout = new QVBoxLayout; addAttributeComponent(reservoirLayout, m_reservior.getInitialPressure()); addComboxComponent(reservoirLayout, m_reservior.getReservoirType()); addAttributeComponent(reservoirLayout, m_reservior.getPermeability()); addAttributeComponent(reservoirLayout, m_reservior.getTransmissibility()); addAttributeComponent(reservoirLayout, m_reservior.getThickness()); addAttributeComponent(reservoirLayout, m_reservior.getMiuo()); addAttributeComponent(reservoirLayout, m_reservior.getBo()); addAttributeComponent(reservoirLayout, m_reservior.getCt()); addAttributeComponent(reservoirLayout, m_reservior.getPorosity()); addAttributeComponent(reservoirLayout, m_reservior.getCf()); addAttributeComponent(reservoirLayout, m_reservior.getKxKy()); addAttributeComponent(reservoirLayout, m_reservior.getSoi()); addAttributeComponent(reservoirLayout, m_reservior.getSgi()); addAttributeComponent(reservoirLayout, m_reservior.getSwi()); drawer->setContentLayout(reservoirLayout); layout->addWidget(drawer); } void nmWxReservoirPropertiesDlg::setupRegionMarkProperties(QVBoxLayout *layout) { for (int i = 0; i < m_vecRegionMark.size(); ++i) { nmDataRegionMark& regionMark = m_vecRegionMark[i]; nmGUIDrawerWidget* drawer = new nmGUIDrawerWidget(regionMark.getRegionMarkName()); QVBoxLayout* regionLayout = new QVBoxLayout; addComboxComponent(regionLayout, regionMark.getReservoirType()); addAttributeComponent(regionLayout, regionMark.getComW()); addAttributeComponent(regionLayout, regionMark.getComKr()); addAttributeComponent(regionLayout, regionMark.getNetToGross()); drawer->setContentLayout(regionLayout); layout->addWidget(drawer); } } void nmWxReservoirPropertiesDlg::setupContourFaultProperties(QVBoxLayout *layout) { nmGUIDrawerWidget* drawer = new nmGUIDrawerWidget(tr("Contour & Faults")); QVBoxLayout* contourLayout = new QVBoxLayout; // Add faults for (int i = 0; i < m_vecDataFaults.size(); ++i) { nmGUIDrawerWidget* faultDrawer = new nmGUIDrawerWidget(m_vecDataFaults[i].getFaultName()); QVBoxLayout* faultLayout = new QVBoxLayout; setupFaultProperties(faultLayout, m_vecDataFaults[i]); faultDrawer->setContentLayout(faultLayout); contourLayout->addWidget(faultDrawer); } // Add fractures for (int i = 0; i < m_vecDataFractures.size(); ++i) { nmGUIDrawerWidget* fractureDrawer = new nmGUIDrawerWidget(m_vecDataFractures[i].getFractureName()); QVBoxLayout* fractureLayout = new QVBoxLayout; setupFractureProperties(fractureLayout, m_vecDataFractures[i]); fractureDrawer->setContentLayout(fractureLayout); contourLayout->addWidget(fractureDrawer); } // Add regions for (int i = 0; i < m_vecDataRegions.size(); ++i) { nmGUIDrawerWidget* regionDrawer = new nmGUIDrawerWidget(m_vecDataRegions[i].getRegoinName()); QVBoxLayout* regionLayout = new QVBoxLayout; setupRegionProperties(regionLayout, m_vecDataRegions[i]); regionDrawer->setContentLayout(regionLayout); contourLayout->addWidget(regionDrawer); } drawer->setContentLayout(contourLayout); layout->addWidget(drawer); } void nmWxReservoirPropertiesDlg::setupFaultProperties(QVBoxLayout *layout, nmDataFault &fault) { addComboxComponent(layout, fault.getFaultFlowModel()); addAttributeComponent(layout, fault.getFaultLeakage()); } void nmWxReservoirPropertiesDlg::setupFractureProperties(QVBoxLayout *layout, nmDataFracture &fracture) { addComboxComponent(layout, fracture.getFractureFlowModel()); addAttributeComponent(layout, fracture.getFractureDfc()); addAttributeComponent(layout, fracture.getFractureDw()); } void nmWxReservoirPropertiesDlg::setupRegionProperties(QVBoxLayout *layout, nmDataRegion ®ion) { addComboxComponent(layout, region.getRegionFlowModel()); addAttributeComponent(layout, region.getRegionLeakage()); } void nmWxReservoirPropertiesDlg::addWellComponents(QVBoxLayout *layout, nmDataVerticalWell &well) { //addAttributeComponent(layout, well.getInputWellHead()); //addAttributeComponent(layout, well.getWellHeadX()); //addAttributeComponent(layout, well.getWellHeadY()); addAttributeComponent(layout, well.getX()); addAttributeComponent(layout, well.getY()); //addAttributeComponent(layout, well.getDrillFloorElevation()); addAttributeComponent(layout, well.getRadius()); //addAttributeComponent(layout, well.getZw()); //addAttributeComponent(layout, well.getPerforationLength()); //addAttributeComponent(layout, well.getWellLength()); //addCheckBoxComponent(layout, well.getRateDependentSkin(), well.getWellName()); //addAttributeComponent(layout, well.getMyName()); //addAttributeComponent(layout, well.getMdStart()); //addAttributeComponent(layout, well.getMdEnd()); //addAttributeComponent(layout, well.getSkin()); // 获取第一段射孔的表皮系数 addAttributeComponent(layout, well.getPerforation(0)->getSkin()); //if (well.getRateDependentSkin().getValue() == "true") { // addAttributeComponent(layout, well.getdSdQ()); //} // 井筒模型为下拉框 //addComboxComponent(layout, well.getWellboreModel()); addAttributeComponent(layout, well.getWellboreStorage()); addAttributeComponent(layout, well.getFinalWellboreStorage()); //addAttributeComponent(layout, well.getCInitialCFinal()); //addAttributeComponent(layout, well.getDtChangingStorage()); //addAttributeComponent(layout, well.getLeakSkin()); //addAttributeComponent(layout, well.getBottomholeMD()); } void nmWxReservoirPropertiesDlg::addWellComponents(QVBoxLayout *layout, nmDataHorizontalWell &well) { addAttributeComponent(layout, well.getX()); addAttributeComponent(layout, well.getY()); addAttributeComponent(layout, well.getRadius()); //addAttributeComponent(layout, well.getDrillFloorElevation()); //addAttributeComponent(layout, well.getZw()); //addAttributeComponent(layout, well.getDrainAngle()); //addAttributeComponent(layout, well.getWellLength()); // addCheckBoxComponent(layout, well.getRateDependentSkin(), well.getWellName()); //addAttributeComponent(layout, well.getMyName()); //addAttributeComponent(layout, well.getMdStart()); //addAttributeComponent(layout, well.getMdEnd()); //addAttributeComponent(layout, well.getSkin()); // 获取第一段射孔的表皮系数 addAttributeComponent(layout, well.getPerforation(0)->getSkin()); // 井筒模型为下拉框 //addComboxComponent(layout, well.getWellboreModel()); addAttributeComponent(layout, well.getWellboreStorage()); //addAttributeComponent(layout, well.getBottomholeMD()); //if (well.getRateDependentSkin().getValue() == "true") { // addAttributeComponent(layout, well.getdSdQ()); //} } void nmWxReservoirPropertiesDlg::addWellComponents(QVBoxLayout *layout, nmDataVerticalFracturedWell &well) { addAttributeComponent(layout, well.getX()); addAttributeComponent(layout, well.getY()); addAttributeComponent(layout, well.getRadius()); //addAttributeComponent(layout, well.getDrillFloorElevation()); //addComboxComponent(layout, well.getFractureModel()); addAttributeComponent(layout, well.getDfc()); addAttributeComponent(layout, well.getFractureHalfLength()); //addAttributeComponent(layout, well.getFractureHeight()); //addAttributeComponent(layout, well.getFractureMidPointHeight()); //addAttributeComponent(layout, well.getWidth()); addAttributeComponent(layout, well.getFractureAngle()); //addAttributeComponent(layout, well.getZw()); //addAttributeComponent(layout, well.getPerforationLength()); //addAttributeComponent(layout, well.getWellLength()); // addCheckBoxComponent(layout, well.getRateDependentSkin(), well.getWellName()); //addAttributeComponent(layout, well.getMyName()); //addAttributeComponent(layout, well.getMdStart()); //addAttributeComponent(layout, well.getMdEnd()); //addAttributeComponent(layout, well.getSkin()); // 获取第一段射孔的表皮系数 addAttributeComponent(layout, well.getPerforation(0)->getSkin()); //addComboxComponent(layout, well.getWellboreModel()); addAttributeComponent(layout, well.getWellboreStorage()); //addAttributeComponent(layout, well.getBottomholeMD()); //if (well.getRateDependentSkin().getValue() == "true") { // addAttributeComponent(layout, well.getdSdQ()); //} } void nmWxReservoirPropertiesDlg::addWellComponents(QVBoxLayout *layout, nmDataHorizontalFracturedWell &well) { //addComboxComponent(layout, well.getModelingType()); addAttributeComponent(layout, well.getX()); addAttributeComponent(layout, well.getY()); addAttributeComponent(layout, well.getRadius()); //addAttributeComponent(layout, well.getDrillFloorElevation()); //addComboxComponent(layout, well.getFractureModel()); //addAttributeComponent(layout, well.getDfc()); addAttributeComponent(layout, well.getNumberOfFractures()); addAttributeComponent(layout, well.getFractureHalfLength()); //addAttributeComponent(layout, well.getFractureHeight()); //addAttributeComponent(layout, well.getFractureMidPointHeight()); //addAttributeComponent(layout, well.getWidth()); addAttributeComponent(layout, well.getFractureAngle()); //addAttributeComponent(layout, well.getZw()); //addAttributeComponent(layout, well.getDrainAngle()); //addAttributeComponent(layout, well.getWellLength()); //addCheckBoxComponent(layout, well.getRateDependentSkin(), well.getWellName()); //addAttributeComponent(layout, well.getMyName()); //addAttributeComponent(layout, well.getMdStart()); //addAttributeComponent(layout, well.getMdEnd()); //addAttributeComponent(layout, well.getSkin()); // 获取第一段射孔的表皮系数 addAttributeComponent(layout, well.getPerforation(0)->getSkin()); //addComboxComponent(layout, well.getWellboreModel()); addAttributeComponent(layout, well.getWellboreStorage()); //addAttributeComponent(layout, well.getBottomholeMD()); // addCheckBoxComponent(layout, well.getStimulatedZonesAroundFracture(), well.getWellName()); //if (well.getRateDependentSkin().getValue() == "true") { // addAttributeComponent(layout, well.getdSdQ()); //} //if (well.getStimulatedZonesAroundFracture().getValue() == "true") { // addAttributeComponent(layout, well.getStimulationRadius()); // addAttributeComponent(layout, well.getPermeabilityMultiplier()); // addAttributeComponent(layout, well.getPorosityMultiplier()); //} } void nmWxReservoirPropertiesDlg::addAttributeComponent(QVBoxLayout *layout, const nmDataAttribute& attribute) { // 创建一个指向 nmDataAttribute 的指针 //nmDataAttribute* pAttributePtr = new nmDataAttribute(attribute); nmGUIComponentLineEdit* component = new nmGUIComponentLineEdit(const_cast(&attribute),true); //// 设置样式表 //QString styleSheet = "QLineEdit {" // " width: 400px;" // 设置 QLineEdit 的宽度为 400px // "}" // "QLabel {" // // "}" // "QComboBox {" // " width: 50px;" // 设置 QComboBox 的宽度为 80px // "}" // "QHBoxLayout {" // "}"; //component->setStyleSheet(styleSheet); m_listAllComponents.append(component); layout->addWidget(component); } void nmWxReservoirPropertiesDlg::addComboxComponent(QVBoxLayout *layout, const nmDataAttribute& attribute) { // 创建一个指向 nmDataAttribute 的指针 nmGUIComponentComboBox* component = new nmGUIComponentComboBox(const_cast(&attribute),true); // 设置样式表 //QString styleSheet = "QLineEdit {" // "}" // "QLabel {" // "}" // "QComboBox {" // " width: 505px;" // 设置 QComboBox 的宽度为 480px // "}" // "QHBoxLayout {" // "}"; //component->setStyleSheet(styleSheet); m_listAllComponents.append(component); layout->addWidget(component); } void nmWxReservoirPropertiesDlg::accept() { // 先更新界面数据到对象 for (int i = 0; i < m_listAllComponents.size(); i++) { nmGUIComponentBase* pComUI = m_listAllComponents[i]; pComUI->updateValueToOrigin(); } // 检查井的X、Y坐标是否发生了变化 bool positionChanged = false; // 检查垂直井坐标 if (m_verticalWells.size() != m_previousVerticalWells.size()) { positionChanged = true; } else { for (int i = 0; i < m_verticalWells.size(); i++) { if (m_verticalWells[i].getX().getValue() != m_previousVerticalWells[i].getX().getValue() || m_verticalWells[i].getY().getValue() != m_previousVerticalWells[i].getY().getValue()) { positionChanged = true; break; } } } // 检查水平井坐标 if (!positionChanged) { if (m_horizontalWells.size() != m_previousHorizontalWells.size()) { positionChanged = true; } else { for (int i = 0; i < m_horizontalWells.size(); i++) { if (m_horizontalWells[i].getX().getValue() != m_previousHorizontalWells[i].getX().getValue() || m_horizontalWells[i].getY().getValue() != m_previousHorizontalWells[i].getY().getValue()) { positionChanged = true; break; } } } } // 检查垂直压裂井坐标 if (!positionChanged) { if (m_verticalFracturedWells.size() != m_previousVerticalFracturedWells.size()) { positionChanged = true; } else { for (int i = 0; i < m_verticalFracturedWells.size(); i++) { if (m_verticalFracturedWells[i].getX().getValue() != m_previousVerticalFracturedWells[i].getX().getValue() || m_verticalFracturedWells[i].getY().getValue() != m_previousVerticalFracturedWells[i].getY().getValue()) { positionChanged = true; break; } } } } // 检查水平压裂井坐标 if (!positionChanged) { if (m_horizontalFracturedWells.size() != m_previousHorizontalFracturedWells.size()) { positionChanged = true; } else { for (int i = 0; i < m_horizontalFracturedWells.size(); i++) { if (m_horizontalFracturedWells[i].getX().getValue() != m_previousHorizontalFracturedWells[i].getX().getValue() || m_horizontalFracturedWells[i].getY().getValue() != m_previousHorizontalFracturedWells[i].getY().getValue()) { positionChanged = true; break; } } } } // 保存所有修改到数据管理器 nmDataAnalyzeManager* manager = nmDataAnalyzeManager::getCurrentInstance(); manager->updateVerticalWells(m_verticalWells); manager->updateVerticalFracturedWells(m_verticalFracturedWells); manager->updateHorizontalFracturedWells(m_horizontalFracturedWells); // 更新断层数据 manager->updateFaultData(m_vecDataFaults); // 更新裂缝数据 manager->updateFractureData(m_vecDataFractures); // 更新区域数据 manager->updateRegionData(m_vecDataRegions); // 更新区域标记数据 manager->updateRegionMarkData(m_vecRegionMark); // 更新油藏数据 manager->updateReservoirData(m_reservior); // 只有井的坐标发生变化时才发出重绘网格的信号 if (positionChanged) { nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged(); } // 更新完成后,通知参数界面刷新 nmWxParameterProperty::notifyUpdateTable(); iDlgBase::accept(); } void nmWxReservoirPropertiesDlg::reject() { // 放弃所有修改,直接关闭对话框 iDlgBase::reject(); }