From de903c0fe018d97ea3b5b6a58ea395d68863fef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Fri, 14 Sep 2018 11:17:14 +0200 Subject: [PATCH] #3303 Create multiple fractures dialog. Prevent overlapping option items. Remove cancel button --- .../RicCreateMultipleFracturesFeature.cpp | 13 ++--- ...RicCreateMultipleFracturesOptionItemUi.cpp | 10 ++++ .../RicCreateMultipleFracturesUi.cpp | 58 +++++++++++++++++-- .../RicCreateMultipleFracturesUi.h | 17 +++++- .../RicNewOptionItemFeature.cpp | 6 +- 5 files changed, 88 insertions(+), 16 deletions(-) diff --git a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesFeature.cpp b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesFeature.cpp index f3f786b1e1..17a2e0dcf7 100644 --- a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesFeature.cpp +++ b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesFeature.cpp @@ -47,6 +47,7 @@ CAF_CMD_SOURCE_INIT(RicCreateMultipleFracturesFeature, "RicCreateMultipleFracturesFeature"); + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -231,6 +232,7 @@ void RicCreateMultipleFracturesFeature::onActionTriggered(bool isChecked) Riu3DMainWindowTools::mainWindowWidget(), multipleFractionsUi, "Create Multiple Fractures", ""); m_dialog = &propertyDialog; + multipleFractionsUi->setParentDialog(m_dialog); propertyDialog.resize(QSize(700, 450)); @@ -239,7 +241,7 @@ void RicCreateMultipleFracturesFeature::onActionTriggered(bool isChecked) dialogButtonBox->clear(); { - QPushButton* pushButton = dialogButtonBox->addButton("Replace Fractures", QDialogButtonBox::ActionRole); + QPushButton* pushButton = dialogButtonBox->addButton(RiuCreateMultipleFractionsUi::REPLACE_FRACTURES_BUTTON_TEXT, QDialogButtonBox::ActionRole); connect(pushButton, SIGNAL(clicked()), this, SLOT(slotDeleteAndAppendFractures())); pushButton->setDefault(false); pushButton->setAutoDefault(false); @@ -247,20 +249,13 @@ void RicCreateMultipleFracturesFeature::onActionTriggered(bool isChecked) } { - QPushButton* pushButton = dialogButtonBox->addButton("Add Fractures", QDialogButtonBox::ActionRole); + QPushButton* pushButton = dialogButtonBox->addButton(RiuCreateMultipleFractionsUi::ADD_FRACTURES_BUTTON_TEXT, QDialogButtonBox::ActionRole); connect(pushButton, SIGNAL(clicked()), this, SLOT(slotAppendFractures())); pushButton->setDefault(false); pushButton->setAutoDefault(false); pushButton->setToolTip("Add new fractures"); } - { - QPushButton* pushButton = dialogButtonBox->addButton("Cancel", QDialogButtonBox::ActionRole); - connect(pushButton, SIGNAL(clicked()), this, SLOT(slotCancel())); - pushButton->setDefault(false); - pushButton->setAutoDefault(false); - } - { QPushButton* pushButton = dialogButtonBox->addButton("Close", QDialogButtonBox::ActionRole); connect(pushButton, SIGNAL(clicked()), this, SLOT(slotClose())); diff --git a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesOptionItemUi.cpp b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesOptionItemUi.cpp index 6450b92d0a..043a390077 100644 --- a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesOptionItemUi.cpp +++ b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesOptionItemUi.cpp @@ -105,10 +105,20 @@ void RicCreateMultipleFracturesOptionItemUi::fieldChangedByUi(const caf::PdmFiel const QVariant& oldValue, const QVariant& newValue) { + if (changedField == &m_topKOneBased) + { + if (m_topKOneBased > m_baseKOneBased) m_baseKOneBased = m_topKOneBased; + } + else if (changedField = &m_baseKOneBased) + { + if (m_baseKOneBased < m_topKOneBased) m_topKOneBased = m_baseKOneBased; + } + RiuCreateMultipleFractionsUi* parent = nullptr; this->firstAncestorOrThisOfType(parent); if (parent) { + parent->updateButtonsEnableState(); parent->updateConnectedEditors(); } } diff --git a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.cpp b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.cpp index 6f2b8db9d1..36a939a19b 100644 --- a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.cpp +++ b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.cpp @@ -35,6 +35,7 @@ #include "cafPdmUiTableViewEditor.h" #include "cafPdmUiTextEditor.h" #include "cafSelectionManagerTools.h" +#include "cafPdmUiPropertyViewDialog.h" #include "cvfBoundingBox.h" @@ -66,6 +67,12 @@ RicCreateMultipleFracturesOptionItemUi* firstUiOptionContainingK(size_t k, const std::vector& allUiOptions); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const QString RiuCreateMultipleFractionsUi::ADD_FRACTURES_BUTTON_TEXT = "Add Fractures"; +const QString RiuCreateMultipleFractionsUi::REPLACE_FRACTURES_BUTTON_TEXT = "Replace Fractures"; + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -87,6 +94,14 @@ RiuCreateMultipleFractionsUi::RiuCreateMultipleFractionsUi() m_fractureCreationSummary.uiCapability()->setUiEditorTypeName(caf::PdmUiTextEditor::uiEditorTypeName()); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuCreateMultipleFractionsUi::setParentDialog(QPointer dialog) +{ + m_dialog = dialog; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -117,13 +132,13 @@ std::vector RiuCreateMultipleFractionsU //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuCreateMultipleFractionsUi::insertOptionItem(RicCreateMultipleFracturesOptionItemUi* insertBeforeThisObject, +void RiuCreateMultipleFractionsUi::insertOptionItem(RicCreateMultipleFracturesOptionItemUi* insertAfterThisObject, RicCreateMultipleFracturesOptionItemUi* objectToInsert) { - size_t index = m_options.index(insertBeforeThisObject); - if (index < m_options.size()) + size_t index = m_options.index(insertAfterThisObject); + if (index < m_options.size() - 1) { - m_options.insert(index, objectToInsert); + m_options.insert(index + 1, objectToInsert); } else { @@ -350,6 +365,41 @@ std::vector RiuCreateMultipleFractionsUi::locationsForNe } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuCreateMultipleFractionsUi::updateButtonsEnableState() +{ + if (m_dialog) + { + bool hasOverlappingK = false; + const auto& opts = options(); + for (int i = 0; i < opts.size(); i++) + { + for (int j = i + 1; j < opts.size(); j++) + { + int absMin = std::min(opts[i]->topKLayer(), opts[j]->topKLayer()); + int absMax = std::max(opts[i]->baseKLayer(), opts[j]->baseKLayer()); + int leni = opts[i]->baseKLayer() - opts[i]->topKLayer() + 1; + int lenj = opts[j]->baseKLayer() - opts[j]->topKLayer() + 1; + if (absMax - absMin + 1 < leni + lenj) + { + hasOverlappingK = true; + break; + } + } + } + + for (auto button : m_dialog->dialogButtonBox()->buttons()) + { + if (button->text() == ADD_FRACTURES_BUTTON_TEXT || button->text() == REPLACE_FRACTURES_BUTTON_TEXT) + { + button->setEnabled(!hasOverlappingK); + } + } + } +} + //-------------------------------------------------------------------------------------------------- /// Internal definitions //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.h b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.h index 0767f8a571..dbbfaca32a 100644 --- a/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.h +++ b/ApplicationCode/Commands/FractureCommands/RicCreateMultipleFracturesUi.h @@ -20,6 +20,8 @@ #include "RicCreateMultipleFracturesOptionItemUi.h" +#include + #include "cafPdmChildArrayField.h" #include "cafPdmField.h" #include "cafPdmObject.h" @@ -29,6 +31,11 @@ class RimEclipseCase; class RimWellPath; class RigMainGrid; +namespace caf +{ + class PdmUiPropertyViewDialog; +} + //================================================================================================== /// //================================================================================================== @@ -60,14 +67,18 @@ class RiuCreateMultipleFractionsUi : public caf::PdmObject CAF_PDM_HEADER_INIT; public: + static const QString ADD_FRACTURES_BUTTON_TEXT; + static const QString REPLACE_FRACTURES_BUTTON_TEXT; + RiuCreateMultipleFractionsUi(); + void setParentDialog(QPointer dialog); void setValues(RimEclipseCase* eclipseCase, double minimumDistanceFromWellTip, int maxFracturesPerWell); void resetValues(); std::vector options() const; - void insertOptionItem(RicCreateMultipleFracturesOptionItemUi* insertBeforeThisObject, + void insertOptionItem(RicCreateMultipleFracturesOptionItemUi* insertAfterThisObject, RicCreateMultipleFracturesOptionItemUi* objectToInsert); void deleteOptionItem(RicCreateMultipleFracturesOptionItemUi* optionsItem); @@ -80,6 +91,8 @@ public: std::vector locationsForNewFractures() const; + void updateButtonsEnableState(); + private: virtual QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override; @@ -100,4 +113,6 @@ private: caf::PdmProxyValueField m_fractureCreationSummary; std::vector m_wellPaths; + + QPointer m_dialog; }; diff --git a/ApplicationCode/Commands/FractureCommands/RicNewOptionItemFeature.cpp b/ApplicationCode/Commands/FractureCommands/RicNewOptionItemFeature.cpp index 574a576e2d..16809fa500 100644 --- a/ApplicationCode/Commands/FractureCommands/RicNewOptionItemFeature.cpp +++ b/ApplicationCode/Commands/FractureCommands/RicNewOptionItemFeature.cpp @@ -76,14 +76,16 @@ void RicNewOptionItemFeature::onActionTriggered(bool isChecked) if (multipleFractionUi) { auto newItem = new RicCreateMultipleFracturesOptionItemUi(); + if (selectedOptionItem) { - newItem->setValues(selectedOptionItem->topKLayer(), - selectedOptionItem->baseKLayer(), + newItem->setValues(selectedOptionItem->baseKLayer() + 1, + selectedOptionItem->baseKLayer() + 1, selectedOptionItem->fractureTemplate(), selectedOptionItem->minimumSpacing()); } multipleFractionUi->insertOptionItem(selectedOptionItem, newItem); + multipleFractionUi->updateButtonsEnableState(); multipleFractionUi->updateConnectedEditors(); } }