///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2018- Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RiaCompletionTypeCalculationScheduler.h" #include "RiaApplication.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" #include "RimEclipseCase.h" #include "RimEclipseCaseCollection.h" #include "RimEclipseView.h" #include "RimOilField.h" #include "RimProject.h" #include "RiuMainWindow.h" #include "RiuViewer.h" #include "cafPdmUiTreeView.h" #include "cafProgressState.h" #include #include #include //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaCompletionTypeCalculationScheduler* RiaCompletionTypeCalculationScheduler::instance() { static RiaCompletionTypeCalculationScheduler theInstance; return &theInstance; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews() { std::vector eclipseCases = RimProject::current()->activeOilField()->analysisModels->cases().childObjects(); scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase ) { std::vector eclipseCases; eclipseCases.push_back( eclipseCase ); scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector& eclipseCases ) { for ( RimEclipseCase* eclipseCase : eclipseCases ) { CVF_ASSERT( eclipseCase ); if ( eclipseCase->eclipseCaseData() ) { eclipseCase->eclipseCaseData() ->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) ->clearScalarResult( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::completionTypeResultName() ); // Delete virtual perforation transmissibilities, as these are the basis for the computation of completion type eclipseCase->eclipseCaseData()->setVirtualPerforationTransmissibilities( nullptr ); } m_eclipseCasesToRecalculate.push_back( eclipseCase ); } startTimer(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::slotRecalculateCompletionType() { if ( caf::ProgressState::isActive() ) { startTimer(); return; } std::set uniqueCases( m_eclipseCasesToRecalculate.begin(), m_eclipseCasesToRecalculate.end() ); Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); QModelIndex mi; if ( RiuMainWindow::instance() ) { mi = RiuMainWindow::instance()->projectTreeView()->treeView()->currentIndex(); } for ( RimEclipseCase* eclipseCase : uniqueCases ) { if ( eclipseCase ) { for ( const auto& w : eclipseCase->views() ) { RimEclipseView* eclView = dynamic_cast( w ); if ( eclView ) { eclView->calculateCompletionTypeAndRedrawIfRequired(); } } } } m_eclipseCasesToRecalculate.clear(); // Recalculation of completion type causes active view to be set to potentially a different view // Also current index in project tree is changed. Restore both to initial state. if ( activeView && activeView->viewer() ) { RiaApplication::instance()->setActiveReservoirView( activeView ); if ( RiuMainWindow::instance() ) { RiuMainWindow::instance()->setActiveViewer( activeView->viewer()->layoutWidget() ); } } if ( mi.isValid() && RiuMainWindow::instance() ) { RiuMainWindow::instance()->projectTreeView()->treeView()->setCurrentIndex( mi ); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaCompletionTypeCalculationScheduler::~RiaCompletionTypeCalculationScheduler() { delete m_recalculateCompletionTypeTimer; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaCompletionTypeCalculationScheduler::RiaCompletionTypeCalculationScheduler() : m_recalculateCompletionTypeTimer( nullptr ) { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::startTimer() { if ( !m_recalculateCompletionTypeTimer ) { m_recalculateCompletionTypeTimer = new QTimer( this ); m_recalculateCompletionTypeTimer->setSingleShot( true ); connect( m_recalculateCompletionTypeTimer, SIGNAL( timeout() ), this, SLOT( slotRecalculateCompletionType() ) ); } m_recalculateCompletionTypeTimer->start( 1500 ); }