From 361b4bc3db81abee7ede5ceef85462d2a774d034 Mon Sep 17 00:00:00 2001 From: Jon Jenssen Date: Thu, 4 Jun 2026 17:27:13 +0200 Subject: [PATCH] Work in progress: Support capturing snapshots with a given size. --- .../RicSnapshotViewToPdfFeature.cpp | 2 +- .../ProjectDataModel/Rim3dView.cpp | 25 ++++++++++++++ .../ProjectDataModel/Rim3dView.h | 1 + .../ProjectDataModel/RimMultiPlot.cpp | 20 +++++++++++ .../ProjectDataModel/RimMultiPlot.h | 1 + .../ProjectDataModel/RimViewWindow.cpp | 34 +++++++++++++++++++ .../ProjectDataModel/RimViewWindow.h | 4 +++ .../UserInterface/RiuMultiPlotBook.cpp | 8 +++++ .../UserInterface/RiuMultiPlotBook.h | 2 ++ 9 files changed, 96 insertions(+), 1 deletion(-) diff --git a/ApplicationLibCode/Commands/ExportCommands/RicSnapshotViewToPdfFeature.cpp b/ApplicationLibCode/Commands/ExportCommands/RicSnapshotViewToPdfFeature.cpp index 649c46b8fe..8dc6d65e34 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicSnapshotViewToPdfFeature.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicSnapshotViewToPdfFeature.cpp @@ -46,7 +46,7 @@ void RicSnapshotViewToPdfFeature::onActionTriggered( bool isChecked ) RimViewWindow* viewWindow = RiaGuiApplication::activeViewWindow(); if ( !viewWindow ) { - RiaLogging::error( "No view window is available, nothing to do" ); + RiaLogging::error( "No plot window is available, nothing to do" ); return; } diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp index cd2efece8b..e3e009caac 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp @@ -513,6 +513,31 @@ QImage Rim3dView::snapshotWindowContent() return QImage(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QImage Rim3dView::captureSnapshot( int width, int height ) +{ + QImage image; + if ( m_viewer ) + { + QSize orgSize = m_viewer->layoutWidget()->size(); + + // adjust for possible display DPI scaling + const auto ratio = m_viewer->displayScalingRatio(); + m_viewer->layoutWidget()->setFixedSize( (int)( 1.0 * width / ratio ), (int)( 1.0 * height / ratio ) ); + + image = m_viewer->snapshotImage(); + + // reset fixed size and restore original size + m_viewer->layoutWidget()->setMinimumSize( 0, 0 ); + m_viewer->layoutWidget()->setMaximumSize( QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ); + m_viewer->layoutWidget()->resize( orgSize ); + } + + return image; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.h b/ApplicationLibCode/ProjectDataModel/Rim3dView.h index d40be63b1e..a95c759816 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.h +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.h @@ -147,6 +147,7 @@ public: cvf::ref displayCoordTransform() const override; virtual std::vector legendConfigs() const = 0; + QImage captureSnapshot( int width, int height ) override; QImage snapshotWindowContent() override; void zoomAll() override; void forceShowWindowOn(); diff --git a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp index 55413b2176..d8cdbae446 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp @@ -35,6 +35,7 @@ #include "cafPdmUiToolButtonEditor.h" #include +#include #include #include @@ -639,6 +640,25 @@ QImage RimMultiPlot::snapshotWindowContent() return image; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QImage RimMultiPlot::captureSnapshot( int width, int height ) +{ + QImage image; + + if ( m_viewer.isNull() ) return image; + + QSize orgViewSize = m_viewer->size(); + + image = captureImage( m_viewer->bookWidget(), width, height ); + + m_viewer->resize( orgViewSize ); + doUpdateLayout(); + + return image; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h index 220b5d205a..d8fb7aec55 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h @@ -117,6 +117,7 @@ public: protected: QImage snapshotWindowContent() override; + QImage captureSnapshot( int width, int height ) override; QWidget* createViewWidget( QWidget* mainWindowParent ) override; void deleteViewWidget() override; diff --git a/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp b/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp index b89e045911..6ede9a37d5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -222,6 +223,39 @@ QImage RimViewWindow::snapshotWindowContent() return image; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QImage RimViewWindow::captureSnapshot( int width, int height ) +{ + return captureImage( viewWidget(), width, height ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QImage RimViewWindow::captureImage( QWidget* widget, int width, int height ) +{ + if ( !widget ) return QImage(); + + QSize orgSize = widget->size(); + + widget->setFixedSize( width, height ); + + QPixmap pix( width, height ); + pix.fill( Qt::transparent ); + + QPainter painter( &pix ); + widget->render( &painter ); + + // reset fixed size and restore original size + widget->setMinimumSize( 0, 0 ); + widget->setMaximumSize( QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ); + widget->resize( orgSize ); + + return pix.toImage(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimViewWindow.h b/ApplicationLibCode/ProjectDataModel/RimViewWindow.h index 46c0dc2054..b33fce97c5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewWindow.h +++ b/ApplicationLibCode/ProjectDataModel/RimViewWindow.h @@ -66,6 +66,8 @@ public: ads::CDockWidget* dockWidget(); ads::CDockWidget* createDockWidget(); + virtual QImage captureSnapshot( int width, int height ); + virtual QImage snapshotWindowContent(); virtual void zoomAll() = 0; @@ -99,6 +101,8 @@ protected: void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; + QImage captureImage( QWidget* widget, int width, int height ); + private: friend class RimProject; diff --git a/ApplicationLibCode/UserInterface/RiuMultiPlotBook.cpp b/ApplicationLibCode/UserInterface/RiuMultiPlotBook.cpp index 0ccb073da1..b4c9bbc7e0 100644 --- a/ApplicationLibCode/UserInterface/RiuMultiPlotBook.cpp +++ b/ApplicationLibCode/UserInterface/RiuMultiPlotBook.cpp @@ -797,3 +797,11 @@ void RiuMultiPlotBook::adjustBookFrame() { m_book->adjustSize(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QWidget* RiuMultiPlotBook::bookWidget() +{ + return m_book; +} diff --git a/ApplicationLibCode/UserInterface/RiuMultiPlotBook.h b/ApplicationLibCode/UserInterface/RiuMultiPlotBook.h index 546f8b1a0d..94e7b4ea83 100644 --- a/ApplicationLibCode/UserInterface/RiuMultiPlotBook.h +++ b/ApplicationLibCode/UserInterface/RiuMultiPlotBook.h @@ -98,6 +98,8 @@ public: // The code used to be called from RiuMultiPlotBook::showEvent(), but this caused a crash when a dock widget was hidden and shown again. void forcePerformUpdate(); + QWidget* bookWidget(); + protected: void contextMenuEvent( QContextMenuEvent* ) override;