#4226 Add polyline measurement mode

This commit is contained in:
Gaute Lindkvist 2019-03-26 14:05:05 +01:00
parent b956e6ed70
commit 009dcb5f19
12 changed files with 122 additions and 21 deletions

View File

@ -69,6 +69,15 @@ void RicMeasurementPickEventHandler::unregisterAsPickEventHandler()
RicMeasurementPickEventHandler::RicMeasurementPickEventHandler()
{}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicMeasurementPickEventHandler::enablePolyLineMode(bool polyLineModeEnabled)
{
m_polyLineModeEnabled = polyLineModeEnabled;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -76,7 +85,7 @@ bool RicMeasurementPickEventHandler::handle3dPickEvent(const Ric3dPickEvent& eve
{
auto measurement = RiaApplication::instance()->project()->measurement();
if (measurement && measurement->isInMeasurementMode())
if (measurement && measurement->measurementMode())
{
const RiuPickItemInfo* firstGeometryPickInfo = nullptr;
for (const auto& info : eventObject.m_pickItemInfos)
@ -98,7 +107,9 @@ bool RicMeasurementPickEventHandler::handle3dPickEvent(const Ric3dPickEvent& eve
bool isControlButtonDown = QApplication::keyboardModifiers() & Qt::ControlModifier;
if (!isControlButtonDown)
bool isPolyLineMode = m_polyLineModeEnabled != isControlButtonDown;
if (!isPolyLineMode)
{
if (measurement->pointsInDomainCoords().size() > 1)
{

View File

@ -28,13 +28,17 @@ class RicMeasurementPickEventHandler : public Ric3dViewPickEventHandler
public:
static RicMeasurementPickEventHandler* instance();
void registerAsPickEventHandler() override;
void unregisterAsPickEventHandler() override;
void enablePolyLineMode(bool polyLineModeEnabled);
protected:
RicMeasurementPickEventHandler();
bool handle3dPickEvent(const Ric3dPickEvent& eventObject) override;
void notifyUnregistered() override;
private:
bool m_polyLineModeEnabled;
};

View File

@ -31,6 +31,7 @@
#include <QAction>
CAF_CMD_SOURCE_INIT(RicToggleMeasurementModeFeature, "RicToggleMeasurementModeFeature");
CAF_CMD_SOURCE_INIT(RicTogglePolyMeasurementModeFeature, "RicTogglePolyMeasurementModeFeature");
//--------------------------------------------------------------------------------------------------
///
@ -54,7 +55,14 @@ bool RicToggleMeasurementModeFeature::isCommandEnabled()
void RicToggleMeasurementModeFeature::onActionTriggered(bool isChecked)
{
auto meas = measurement();
meas->setMeasurementMode(!meas->isInMeasurementMode());
if (meas->measurementMode() == RimMeasurement::MEASURE_REGULAR)
{
meas->setMeasurementMode(RimMeasurement::MEASURE_DISABLED);
}
else
{
meas->setMeasurementMode(RimMeasurement::MEASURE_REGULAR);
}
refreshActionLook();
}
@ -69,7 +77,7 @@ void RicToggleMeasurementModeFeature::setupActionLook(QAction* actionToSetup)
actionToSetup->setCheckable(true);
auto* meas = measurement();
if (meas && meas->isInMeasurementMode())
if (meas && meas->measurementMode() == RimMeasurement::MEASURE_REGULAR)
{
actionToSetup->setShortcut(QKeySequence(Qt::Key_Escape));
}
@ -87,7 +95,7 @@ bool RicToggleMeasurementModeFeature::isCommandChecked()
auto meas = measurement();
if (meas)
{
return meas->isInMeasurementMode();
return meas->measurementMode() == RimMeasurement::MEASURE_REGULAR;
}
return false;
@ -109,3 +117,55 @@ Rim3dView* RicToggleMeasurementModeFeature::activeView() const
auto view = RiaApplication::instance()->activeReservoirView();
return view;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicTogglePolyMeasurementModeFeature::onActionTriggered(bool isChecked)
{
auto meas = measurement();
if (meas->measurementMode() == RimMeasurement::MEASURE_POLYLINE)
{
meas->setMeasurementMode(RimMeasurement::MEASURE_DISABLED);
}
else
{
meas->setMeasurementMode(RimMeasurement::MEASURE_POLYLINE);
}
refreshActionLook();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicTogglePolyMeasurementModeFeature::setupActionLook(QAction* actionToSetup)
{
actionToSetup->setText("Poly Line Measurement Mode");
actionToSetup->setIcon(QIcon(":/RulerPoly24x24.png"));
actionToSetup->setCheckable(true);
auto* meas = measurement();
if (meas && meas->measurementMode() == RimMeasurement::MEASURE_POLYLINE)
{
actionToSetup->setShortcut(QKeySequence(Qt::Key_Escape));
}
else
{
actionToSetup->setShortcut(QKeySequence());
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicTogglePolyMeasurementModeFeature::isCommandChecked()
{
auto meas = measurement();
if (meas)
{
return meas->measurementMode() == RimMeasurement::MEASURE_POLYLINE;
}
return false;
}

View File

@ -39,10 +39,22 @@ protected:
void setupActionLook(QAction* actionToSetup) override;
bool isCommandChecked() override;
private:
protected:
void refreshActionLook();
private:
RimMeasurement* measurement() const;
Rim3dView* activeView() const;
};
//==================================================================================================
///
//==================================================================================================
class RicTogglePolyMeasurementModeFeature : public RicToggleMeasurementModeFeature
{
CAF_CMD_HEADER_INIT;
protected:
void onActionTriggered(bool isChecked) override;
void setupActionLook(QAction* actionToSetup) override;
bool isCommandChecked() override;
};

View File

@ -36,7 +36,7 @@ CAF_PDM_SOURCE_INIT(RimMeasurement, "RimMeasurement");
///
//--------------------------------------------------------------------------------------------------
RimMeasurement::RimMeasurement()
: m_isInMeasurementMode(false)
: m_measurementMode(MEASURE_DISABLED)
{
CAF_PDM_InitObject("Measurement", ":/TextAnnotation16x16.png", "", "");
}
@ -49,13 +49,14 @@ RimMeasurement::~RimMeasurement() {}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimMeasurement::setMeasurementMode(bool measurementMode)
void RimMeasurement::setMeasurementMode(MeasurementMode measurementMode)
{
m_isInMeasurementMode = measurementMode;
m_measurementMode = measurementMode;
if (m_isInMeasurementMode)
if (m_measurementMode != MEASURE_DISABLED)
{
RicMeasurementPickEventHandler::instance()->registerAsPickEventHandler();
RicMeasurementPickEventHandler::instance()->enablePolyLineMode(m_measurementMode == MEASURE_POLYLINE);
m_eventFilter = new RiuMeasurementEventFilter(this);
m_eventFilter->registerFilter();
}
@ -78,9 +79,9 @@ void RimMeasurement::setMeasurementMode(bool measurementMode)
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimMeasurement::isInMeasurementMode() const
RimMeasurement::MeasurementMode RimMeasurement::measurementMode() const
{
return m_isInMeasurementMode;
return m_measurementMode;
}
//--------------------------------------------------------------------------------------------------

View File

@ -38,6 +38,13 @@ class RimMeasurement : public caf::PdmObject
using Vec3d = cvf::Vec3d;
public:
enum MeasurementMode
{
MEASURE_DISABLED = 0,
MEASURE_REGULAR,
MEASURE_POLYLINE
};
class Lengths
{
public:
@ -60,8 +67,8 @@ public:
RimMeasurement();
~RimMeasurement() override;
void setMeasurementMode(bool measurementMode);
bool isInMeasurementMode() const;
void setMeasurementMode(MeasurementMode measureMode);
MeasurementMode measurementMode() const;
void addPointInDomainCoords(const Vec3d& pointInDomainCoord);
std::vector<Vec3d> pointsInDomainCoords() const;
@ -76,7 +83,7 @@ private:
void updateView() const;
private:
bool m_isInMeasurementMode;
MeasurementMode m_measurementMode;
std::vector<Vec3d> m_pointsInDomainCoords;
caf::PdmPointer<Rim3dView> m_sourceView;

View File

@ -67,7 +67,7 @@ bool RiuMeasurementEventFilter::eventFilter(QObject* obj, QEvent* event)
if (m_parent)
{
m_parent->setMeasurementMode(false);
m_parent->setMeasurementMode(RimMeasurement::MEASURE_DISABLED);
}
return true;

View File

@ -148,6 +148,7 @@
<file>ReachCircle16x16.png</file>
<file>2DMapProjection16x16.png</file>
<file>Ruler24x24.png</file>
<file>RulerPoly24x24.png</file>
<file>Swap.png</file>
</qresource>
<qresource prefix="/Shader/">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -613,8 +613,11 @@ void RiuMainWindow::createToolBars()
{
QToolBar* toolbar = addToolBar(tr("Measurement"));
toolbar->setObjectName(toolbar->windowTitle());
auto action = cmdFeatureMgr->action("RicToggleMeasurementModeFeature");
toolbar->addAction(action);
auto measureAction = cmdFeatureMgr->action("RicToggleMeasurementModeFeature");
toolbar->addAction(measureAction);
auto polyMeasureAction = cmdFeatureMgr->action("RicTogglePolyMeasurementModeFeature");
toolbar->addAction(polyMeasureAction);
}
RiaApplication* app = RiaApplication::instance();
@ -895,6 +898,7 @@ void RiuMainWindow::slotRefreshViewActions()
{
QStringList commandIds;
commandIds << "RicToggleMeasurementModeFeature";
commandIds << "RicTogglePolyMeasurementModeFeature";
caf::CmdFeatureManager::instance()->refreshCheckedState(commandIds);
}

View File

@ -354,6 +354,7 @@ void RiuViewerCommands::displayContextMenu(QMouseEvent* event)
}
menuBuilder << "RicToggleMeasurementModeFeature";
menuBuilder << "RicTogglePolyMeasurementModeFeature";
}
}