mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2519 Mohr Circle: Create plot widget
This commit is contained in:
parent
80af97c1a8
commit
d6974bfdba
@ -69,6 +69,7 @@ ${CEE_CURRENT_LIST_DIR}RiuExpressionContextMenuManager.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuCalculationsContextMenuManager.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuGridStatisticsHistogramWidget.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuTools.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuMohrsCirclePlot.h
|
||||
)
|
||||
|
||||
set (SOURCE_GROUP_SOURCE_FILES
|
||||
@ -133,6 +134,7 @@ ${CEE_CURRENT_LIST_DIR}RiuExpressionContextMenuManager.cpp
|
||||
${CEE_CURRENT_LIST_DIR}RiuCalculationsContextMenuManager.cpp
|
||||
${CEE_CURRENT_LIST_DIR}RiuGridStatisticsHistogramWidget.cpp
|
||||
${CEE_CURRENT_LIST_DIR}RiuTools.cpp
|
||||
${CEE_CURRENT_LIST_DIR}RiuMohrsCirclePlot.cpp
|
||||
)
|
||||
|
||||
list(APPEND CODE_HEADER_FILES
|
||||
@ -174,6 +176,7 @@ ${CEE_CURRENT_LIST_DIR}RiuNightchartsWidget.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuMessagePanel.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuExpressionContextMenuManager.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuCalculationsContextMenuManager.h
|
||||
${CEE_CURRENT_LIST_DIR}RiuMohrsCirclePlot.h
|
||||
)
|
||||
|
||||
list(APPEND QT_UI_FILES
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "RiuDragDrop.h"
|
||||
#include "RiuMdiSubWindow.h"
|
||||
#include "RiuMessagePanel.h"
|
||||
#include "RiuMohrsCirclePlot.h"
|
||||
#include "RiuProcessMonitor.h"
|
||||
#include "RiuProjectPropertyView.h"
|
||||
#include "RiuPropertyViewTabWidget.h"
|
||||
@ -107,6 +108,7 @@ RiuMainWindow::RiuMainWindow()
|
||||
m_mainViewer(nullptr),
|
||||
m_relPermPlotPanel(nullptr),
|
||||
m_pvtPlotPanel(nullptr),
|
||||
m_mohrsCirclePlot(nullptr),
|
||||
m_windowMenu(nullptr),
|
||||
m_blockSlotSubWindowActivated(false)
|
||||
{
|
||||
@ -597,6 +599,7 @@ void RiuMainWindow::createDockPanels()
|
||||
QDockWidget* resultPlotDock = nullptr;
|
||||
QDockWidget* relPermPlotDock = nullptr;
|
||||
QDockWidget* pvtPlotDock = nullptr;
|
||||
QDockWidget* mohrsCirclePlotDock = nullptr;
|
||||
|
||||
{
|
||||
QDockWidget* dockWidget = new QDockWidget("Property Editor", this);
|
||||
@ -640,6 +643,19 @@ void RiuMainWindow::createDockPanels()
|
||||
addDockWidget(Qt::BottomDockWidgetArea, dockPanel);
|
||||
resultPlotDock = dockPanel;
|
||||
}
|
||||
|
||||
#ifdef USE_ODB_API
|
||||
{
|
||||
QDockWidget* dockPanel = new QDockWidget("Mohr's Circle Plot", this);
|
||||
dockPanel->setObjectName("dockTimeHistoryPanel");
|
||||
dockPanel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
|
||||
m_mohrsCirclePlot = new RiuMohrsCirclePlot(dockPanel);
|
||||
dockPanel->setWidget(m_mohrsCirclePlot);
|
||||
|
||||
addDockWidget(Qt::BottomDockWidgetArea, dockPanel);
|
||||
mohrsCirclePlotDock = dockPanel;
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
QDockWidget* dockPanel = new QDockWidget("Relative Permeability Plot", this);
|
||||
@ -677,7 +693,13 @@ void RiuMainWindow::createDockPanels()
|
||||
|
||||
// Tabify docks
|
||||
tabifyDockWidget(pvtPlotDock, relPermPlotDock);
|
||||
#ifdef USE_ODB_API
|
||||
tabifyDockWidget(relPermPlotDock, mohrsCirclePlotDock);
|
||||
tabifyDockWidget(mohrsCirclePlotDock, resultPlotDock);
|
||||
#else
|
||||
tabifyDockWidget(relPermPlotDock, resultPlotDock);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -46,6 +46,7 @@ class RiuResultQwtPlot;
|
||||
class RiuViewer;
|
||||
class RiuRelativePermeabilityPlotPanel;
|
||||
class RiuPvtPlotPanel;
|
||||
class RiuMohrsCirclePlot;
|
||||
|
||||
struct RimMdiWindowGeometry;
|
||||
|
||||
@ -175,6 +176,7 @@ private:
|
||||
QPointer<RiuMessagePanel> m_messagePanel;
|
||||
|
||||
RiuResultQwtPlot* m_resultQwtPlot;
|
||||
RiuMohrsCirclePlot* m_mohrsCirclePlot;
|
||||
RiuRelativePermeabilityPlotPanel* m_relPermPlotPanel;
|
||||
RiuPvtPlotPanel* m_pvtPlotPanel;
|
||||
|
||||
|
160
ApplicationCode/UserInterface/RiuMohrsCirclePlot.cpp
Normal file
160
ApplicationCode/UserInterface/RiuMohrsCirclePlot.cpp
Normal file
@ -0,0 +1,160 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2018 Statoil 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 <http://www.gnu.org/licenses/gpl.html>
|
||||
// for more details.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "RiuMohrsCirclePlot.h"
|
||||
|
||||
#include "qwt_round_scale_draw.h"
|
||||
#include "qwt_symbol.h"
|
||||
|
||||
#include "cvfAssert.h"
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
/// \class RiuMohrsCirclePlot
|
||||
///
|
||||
///
|
||||
///
|
||||
//==================================================================================================
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RiuMohrsCirclePlot::RiuMohrsCirclePlot(QWidget* parent)
|
||||
: QwtPlot(parent)
|
||||
{
|
||||
setDefaults();
|
||||
setPrincipalsAndRedrawCircles(320, 200, 150);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RiuMohrsCirclePlot::~RiuMohrsCirclePlot()
|
||||
{
|
||||
deleteCircles();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuMohrsCirclePlot::setPrincipals(double p1, double p2, double p3)
|
||||
{
|
||||
CVF_ASSERT(p1 > p2);
|
||||
CVF_ASSERT(p2 > p3);
|
||||
|
||||
m_principal1 = p1;
|
||||
m_principal2 = p2;
|
||||
m_principal3 = p3;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuMohrsCirclePlot::setPrincipalsAndRedrawCircles(double p1, double p2, double p3)
|
||||
{
|
||||
setPrincipals(p1, p2, p3);
|
||||
|
||||
redrawCircles();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QSize RiuMohrsCirclePlot::sizeHint() const
|
||||
{
|
||||
return QSize(100, 100);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QSize RiuMohrsCirclePlot::minimumSizeHint() const
|
||||
{
|
||||
return QSize(0, 0);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuMohrsCirclePlot::redrawCircles()
|
||||
{
|
||||
deleteCircles();
|
||||
createMohrCircles();
|
||||
|
||||
for (MohrCircle circle : m_mohrCircles)
|
||||
{
|
||||
QwtSymbol* circleSymbol = new QwtSymbol(QwtSymbol::Ellipse);
|
||||
circleSymbol->setSize(2 * circle.radius, 2 * circle.radius);
|
||||
|
||||
QwtPlotMarker* circlePlotItem = new QwtPlotMarker("Circle");
|
||||
circlePlotItem->setSymbol(circleSymbol);
|
||||
circlePlotItem->setXValue(circle.centerX);
|
||||
circlePlotItem->setYValue(0);
|
||||
|
||||
m_mohrCirclesMarkers.push_back(circlePlotItem);
|
||||
circlePlotItem->attach(this);
|
||||
}
|
||||
|
||||
this->replot();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuMohrsCirclePlot::deleteCircles()
|
||||
{
|
||||
for (size_t i = 0; i < m_mohrCirclesMarkers.size(); i++)
|
||||
{
|
||||
m_mohrCirclesMarkers[i]->detach();
|
||||
delete m_mohrCirclesMarkers[i];
|
||||
}
|
||||
|
||||
m_mohrCirclesMarkers.clear();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuMohrsCirclePlot::setDefaults()
|
||||
{
|
||||
enableAxis(QwtPlot::xBottom, true);
|
||||
enableAxis(QwtPlot::yLeft, true);
|
||||
enableAxis(QwtPlot::xTop, false);
|
||||
enableAxis(QwtPlot::yRight, false);
|
||||
|
||||
this->setAxisScale(QwtPlot::yLeft, -400, 400);
|
||||
this->setAxisScale(QwtPlot::xBottom, 0, 400);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuMohrsCirclePlot::createMohrCircles()
|
||||
{
|
||||
m_mohrCircles[0].component = 2;
|
||||
m_mohrCircles[0].radius = (m_principal1 - m_principal3) / 2;
|
||||
m_mohrCircles[0].centerX = (m_principal1 + m_principal3) / 2;
|
||||
|
||||
m_mohrCircles[1].component = 1;
|
||||
m_mohrCircles[1].radius = (m_principal2 - m_principal3) / 2;
|
||||
m_mohrCircles[1].centerX = (m_principal2 + m_principal3) / 2;
|
||||
|
||||
m_mohrCircles[2].component = 3;
|
||||
m_mohrCircles[2].radius = (m_principal1 - m_principal2) / 2;
|
||||
m_mohrCircles[2].centerX = (m_principal1 + m_principal2) / 2;
|
||||
}
|
72
ApplicationCode/UserInterface/RiuMohrsCirclePlot.h
Normal file
72
ApplicationCode/UserInterface/RiuMohrsCirclePlot.h
Normal file
@ -0,0 +1,72 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2018 Statoil 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 <http://www.gnu.org/licenses/gpl.html>
|
||||
// for more details.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "qwt_plot.h"
|
||||
#include "qwt_plot_marker.h"
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
#include <array>
|
||||
|
||||
//==================================================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//==================================================================================================
|
||||
class RiuMohrsCirclePlot : public QwtPlot
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
RiuMohrsCirclePlot(QWidget* parent);
|
||||
~RiuMohrsCirclePlot();
|
||||
|
||||
void setPrincipals(double p1, double p2, double p3);
|
||||
void setPrincipalsAndRedrawCircles(double p1, double p2, double p3);
|
||||
|
||||
protected:
|
||||
virtual QSize sizeHint() const override;
|
||||
virtual QSize minimumSizeHint() const override;
|
||||
|
||||
void redrawCircles();
|
||||
void deleteCircles();
|
||||
|
||||
private:
|
||||
struct MohrCircle
|
||||
{
|
||||
MohrCircle(size_t component, double radius, double centerX)
|
||||
: component(component), radius(radius), centerX(centerX) {}
|
||||
MohrCircle() {};
|
||||
size_t component; //1, 2 or 3
|
||||
double radius;
|
||||
double centerX;
|
||||
};
|
||||
private:
|
||||
void setDefaults();
|
||||
void createMohrCircles();
|
||||
|
||||
private:
|
||||
double m_principal1;
|
||||
double m_principal2;
|
||||
double m_principal3;
|
||||
std::array<MohrCircle, 3> m_mohrCircles;
|
||||
std::vector<QwtPlotMarker*> m_mohrCirclesMarkers;
|
||||
|
||||
};
|
Loading…
Reference in New Issue
Block a user