mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2527 Mohr Circle: Add friction-cohesion line
This commit is contained in:
parent
fe301bfc11
commit
75bcf7dcf4
@ -36,11 +36,14 @@
|
|||||||
#include <QPainterPath>
|
#include <QPainterPath>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include "qwt_plot_curve.h"
|
||||||
#include "qwt_plot_layout.h"
|
#include "qwt_plot_layout.h"
|
||||||
#include "qwt_plot_marker.h"
|
#include "qwt_plot_marker.h"
|
||||||
#include "qwt_plot_rescaler.h"
|
#include "qwt_plot_rescaler.h"
|
||||||
#include "qwt_plot_shapeitem.h"
|
#include "qwt_plot_shapeitem.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
/// \class RiuMohrsCirclePlot
|
/// \class RiuMohrsCirclePlot
|
||||||
@ -84,11 +87,12 @@ void RiuMohrsCirclePlot::setPrincipals(double p1, double p2, double p3)
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RiuMohrsCirclePlot::setPrincipalsAndRedrawCircles(double p1, double p2, double p3)
|
void RiuMohrsCirclePlot::setPrincipalsAndRedrawPlot(double p1, double p2, double p3)
|
||||||
{
|
{
|
||||||
setPrincipals(p1, p2, p3);
|
setPrincipals(p1, p2, p3);
|
||||||
|
|
||||||
redrawCircles();
|
redrawCircles();
|
||||||
|
redrawEnvelope();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -126,6 +130,8 @@ void RiuMohrsCirclePlot::updateOnSelectionChanged(const RiuSelectionItem* select
|
|||||||
void RiuMohrsCirclePlot::clearPlot()
|
void RiuMohrsCirclePlot::clearPlot()
|
||||||
{
|
{
|
||||||
deleteCircles();
|
deleteCircles();
|
||||||
|
deleteEnvelope();
|
||||||
|
|
||||||
this->replot();
|
this->replot();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,6 +240,68 @@ void RiuMohrsCirclePlot::deleteCircles()
|
|||||||
m_circlePlotItems.clear();
|
m_circlePlotItems.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RiuMohrsCirclePlot::redrawEnvelope()
|
||||||
|
{
|
||||||
|
deleteEnvelope();
|
||||||
|
|
||||||
|
if (m_cohesion == HUGE_VAL || m_frictionAngle == HUGE_VAL)
|
||||||
|
{
|
||||||
|
this->replot();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QwtPlotCurve* qwtCurve = new QwtPlotCurve();
|
||||||
|
|
||||||
|
std::vector<double> xVals;
|
||||||
|
std::vector<double> yVals;
|
||||||
|
|
||||||
|
double tanFrictionAngle = cvf::Math::abs(cvf::Math::tan(cvf::Math::toRadians(m_frictionAngle)));
|
||||||
|
|
||||||
|
double x = m_cohesion/tanFrictionAngle;
|
||||||
|
if (m_principal1 < 0)
|
||||||
|
{
|
||||||
|
xVals.push_back(-x);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xVals.push_back(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
xVals.push_back(m_principal1*1.1);
|
||||||
|
|
||||||
|
yVals.push_back(0);
|
||||||
|
yVals.push_back((x + cvf::Math::abs(m_principal1) * 1.1) * tanFrictionAngle);
|
||||||
|
|
||||||
|
qwtCurve->setSamples(xVals.data(), yVals.data(), 2);
|
||||||
|
|
||||||
|
qwtCurve->setStyle(QwtPlotCurve::Lines);
|
||||||
|
qwtCurve->setRenderHint(QwtPlotItem::RenderAntialiased, true);
|
||||||
|
|
||||||
|
const QPen curvePen(Qt::red);
|
||||||
|
qwtCurve->setPen(curvePen);
|
||||||
|
|
||||||
|
qwtCurve->attach(this);
|
||||||
|
|
||||||
|
m_envolopePlotItem = qwtCurve;
|
||||||
|
this->replot();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RiuMohrsCirclePlot::deleteEnvelope()
|
||||||
|
{
|
||||||
|
if (m_envolopePlotItem)
|
||||||
|
{
|
||||||
|
m_envolopePlotItem->detach();
|
||||||
|
delete m_envolopePlotItem;
|
||||||
|
m_envolopePlotItem = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -272,7 +340,7 @@ void RiuMohrsCirclePlot::queryDataAndUpdatePlot(RimGeoMechView* geoMechView, siz
|
|||||||
cvf::Vec3f principalDirs[3];
|
cvf::Vec3f principalDirs[3];
|
||||||
cvf::Vec3f elmPrincipals = elmTensor.calculatePrincipals(principalDirs);
|
cvf::Vec3f elmPrincipals = elmTensor.calculatePrincipals(principalDirs);
|
||||||
|
|
||||||
setPrincipalsAndRedrawCircles(elmPrincipals[0], elmPrincipals[1], elmPrincipals[2]);
|
setPrincipalsAndRedrawPlot(elmPrincipals[0], elmPrincipals[1], elmPrincipals[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -300,6 +368,10 @@ void RiuMohrsCirclePlot::setDefaults()
|
|||||||
lineYPlotMarker->setLineStyle(QwtPlotMarker::VLine);
|
lineYPlotMarker->setLineStyle(QwtPlotMarker::VLine);
|
||||||
lineYPlotMarker->setXValue(0);
|
lineYPlotMarker->setXValue(0);
|
||||||
lineYPlotMarker->attach(this);
|
lineYPlotMarker->attach(this);
|
||||||
|
|
||||||
|
m_envolopePlotItem = nullptr;
|
||||||
|
m_cohesion = HUGE_VAL;
|
||||||
|
m_frictionAngle = HUGE_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -319,3 +391,19 @@ void RiuMohrsCirclePlot::createMohrCircles()
|
|||||||
m_mohrCircles[2].radius = (m_principal1 - m_principal2) / 2.0;
|
m_mohrCircles[2].radius = (m_principal1 - m_principal2) / 2.0;
|
||||||
m_mohrCircles[2].centerX = (m_principal1 + m_principal2) / 2.0;
|
m_mohrCircles[2].centerX = (m_principal1 + m_principal2) / 2.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RiuMohrsCirclePlot::setFrictionAngle(double frictionAngle)
|
||||||
|
{
|
||||||
|
m_frictionAngle = frictionAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RiuMohrsCirclePlot::setCohesion(double cohesion)
|
||||||
|
{
|
||||||
|
m_cohesion = cohesion;
|
||||||
|
}
|
||||||
|
@ -28,6 +28,7 @@ class RimGeoMechView;
|
|||||||
class QwtRoundScaleDraw;
|
class QwtRoundScaleDraw;
|
||||||
class QwtPlotRescaler;
|
class QwtPlotRescaler;
|
||||||
class QWidget;
|
class QWidget;
|
||||||
|
class QwtPlotCurve;
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
//
|
//
|
||||||
@ -43,7 +44,7 @@ public:
|
|||||||
~RiuMohrsCirclePlot();
|
~RiuMohrsCirclePlot();
|
||||||
|
|
||||||
void setPrincipals(double p1, double p2, double p3);
|
void setPrincipals(double p1, double p2, double p3);
|
||||||
void setPrincipalsAndRedrawCircles(double p1, double p2, double p3);
|
void setPrincipalsAndRedrawPlot(double p1, double p2, double p3);
|
||||||
|
|
||||||
void updateOnSelectionChanged(const RiuSelectionItem* selectionItem);
|
void updateOnSelectionChanged(const RiuSelectionItem* selectionItem);
|
||||||
void clearPlot();
|
void clearPlot();
|
||||||
@ -55,6 +56,9 @@ protected:
|
|||||||
void redrawCircles();
|
void redrawCircles();
|
||||||
void deleteCircles();
|
void deleteCircles();
|
||||||
|
|
||||||
|
void redrawEnvelope();
|
||||||
|
void deleteEnvelope();
|
||||||
|
|
||||||
void queryDataAndUpdatePlot(RimGeoMechView* geoMechView, size_t gridIndex, size_t cellIndex);
|
void queryDataAndUpdatePlot(RimGeoMechView* geoMechView, size_t gridIndex, size_t cellIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -67,10 +71,14 @@ private:
|
|||||||
double radius;
|
double radius;
|
||||||
double centerX;
|
double centerX;
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setDefaults();
|
void setDefaults();
|
||||||
void createMohrCircles();
|
void createMohrCircles();
|
||||||
|
|
||||||
|
void setFrictionAngle(double frictionAngle);
|
||||||
|
void setCohesion(double cohesion);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double m_principal1;
|
double m_principal1;
|
||||||
double m_principal2;
|
double m_principal2;
|
||||||
@ -80,5 +88,11 @@ private:
|
|||||||
|
|
||||||
std::vector<QwtPlotItem*> m_circlePlotItems;
|
std::vector<QwtPlotItem*> m_circlePlotItems;
|
||||||
|
|
||||||
|
QwtPlotCurve* m_envolopePlotItem;
|
||||||
|
|
||||||
|
double m_frictionAngle;
|
||||||
|
double m_cohesion;
|
||||||
|
double m_factorOfSafety;
|
||||||
|
|
||||||
QwtPlotRescaler* m_rescaler;
|
QwtPlotRescaler* m_rescaler;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user