#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() 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(); auto measurement = RiaApplication::instance()->project()->measurement();
if (measurement && measurement->isInMeasurementMode()) if (measurement && measurement->measurementMode())
{ {
const RiuPickItemInfo* firstGeometryPickInfo = nullptr; const RiuPickItemInfo* firstGeometryPickInfo = nullptr;
for (const auto& info : eventObject.m_pickItemInfos) for (const auto& info : eventObject.m_pickItemInfos)
@ -98,7 +107,9 @@ bool RicMeasurementPickEventHandler::handle3dPickEvent(const Ric3dPickEvent& eve
bool isControlButtonDown = QApplication::keyboardModifiers() & Qt::ControlModifier; bool isControlButtonDown = QApplication::keyboardModifiers() & Qt::ControlModifier;
if (!isControlButtonDown) bool isPolyLineMode = m_polyLineModeEnabled != isControlButtonDown;
if (!isPolyLineMode)
{ {
if (measurement->pointsInDomainCoords().size() > 1) if (measurement->pointsInDomainCoords().size() > 1)
{ {

View File

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

View File

@ -31,6 +31,7 @@
#include <QAction> #include <QAction>
CAF_CMD_SOURCE_INIT(RicToggleMeasurementModeFeature, "RicToggleMeasurementModeFeature"); CAF_CMD_SOURCE_INIT(RicToggleMeasurementModeFeature, "RicToggleMeasurementModeFeature");
CAF_CMD_SOURCE_INIT(RicTogglePolyMeasurementModeFeature, "RicTogglePolyMeasurementModeFeature");
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
@ -54,7 +55,14 @@ bool RicToggleMeasurementModeFeature::isCommandEnabled()
void RicToggleMeasurementModeFeature::onActionTriggered(bool isChecked) void RicToggleMeasurementModeFeature::onActionTriggered(bool isChecked)
{ {
auto meas = measurement(); 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(); refreshActionLook();
} }
@ -69,7 +77,7 @@ void RicToggleMeasurementModeFeature::setupActionLook(QAction* actionToSetup)
actionToSetup->setCheckable(true); actionToSetup->setCheckable(true);
auto* meas = measurement(); auto* meas = measurement();
if (meas && meas->isInMeasurementMode()) if (meas && meas->measurementMode() == RimMeasurement::MEASURE_REGULAR)
{ {
actionToSetup->setShortcut(QKeySequence(Qt::Key_Escape)); actionToSetup->setShortcut(QKeySequence(Qt::Key_Escape));
} }
@ -87,7 +95,7 @@ bool RicToggleMeasurementModeFeature::isCommandChecked()
auto meas = measurement(); auto meas = measurement();
if (meas) if (meas)
{ {
return meas->isInMeasurementMode(); return meas->measurementMode() == RimMeasurement::MEASURE_REGULAR;
} }
return false; return false;
@ -109,3 +117,55 @@ Rim3dView* RicToggleMeasurementModeFeature::activeView() const
auto view = RiaApplication::instance()->activeReservoirView(); auto view = RiaApplication::instance()->activeReservoirView();
return view; 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; void setupActionLook(QAction* actionToSetup) override;
bool isCommandChecked() override; bool isCommandChecked() override;
private: protected:
void refreshActionLook(); void refreshActionLook();
private:
RimMeasurement* measurement() const; RimMeasurement* measurement() const;
Rim3dView* activeView() 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() RimMeasurement::RimMeasurement()
: m_isInMeasurementMode(false) : m_measurementMode(MEASURE_DISABLED)
{ {
CAF_PDM_InitObject("Measurement", ":/TextAnnotation16x16.png", "", ""); 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()->registerAsPickEventHandler();
RicMeasurementPickEventHandler::instance()->enablePolyLineMode(m_measurementMode == MEASURE_POLYLINE);
m_eventFilter = new RiuMeasurementEventFilter(this); m_eventFilter = new RiuMeasurementEventFilter(this);
m_eventFilter->registerFilter(); 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; using Vec3d = cvf::Vec3d;
public: public:
enum MeasurementMode
{
MEASURE_DISABLED = 0,
MEASURE_REGULAR,
MEASURE_POLYLINE
};
class Lengths class Lengths
{ {
public: public:
@ -60,8 +67,8 @@ public:
RimMeasurement(); RimMeasurement();
~RimMeasurement() override; ~RimMeasurement() override;
void setMeasurementMode(bool measurementMode); void setMeasurementMode(MeasurementMode measureMode);
bool isInMeasurementMode() const; MeasurementMode measurementMode() const;
void addPointInDomainCoords(const Vec3d& pointInDomainCoord); void addPointInDomainCoords(const Vec3d& pointInDomainCoord);
std::vector<Vec3d> pointsInDomainCoords() const; std::vector<Vec3d> pointsInDomainCoords() const;
@ -76,7 +83,7 @@ private:
void updateView() const; void updateView() const;
private: private:
bool m_isInMeasurementMode; MeasurementMode m_measurementMode;
std::vector<Vec3d> m_pointsInDomainCoords; std::vector<Vec3d> m_pointsInDomainCoords;
caf::PdmPointer<Rim3dView> m_sourceView; caf::PdmPointer<Rim3dView> m_sourceView;

View File

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

View File

@ -148,6 +148,7 @@
<file>ReachCircle16x16.png</file> <file>ReachCircle16x16.png</file>
<file>2DMapProjection16x16.png</file> <file>2DMapProjection16x16.png</file>
<file>Ruler24x24.png</file> <file>Ruler24x24.png</file>
<file>RulerPoly24x24.png</file>
<file>Swap.png</file> <file>Swap.png</file>
</qresource> </qresource>
<qresource prefix="/Shader/"> <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")); QToolBar* toolbar = addToolBar(tr("Measurement"));
toolbar->setObjectName(toolbar->windowTitle()); toolbar->setObjectName(toolbar->windowTitle());
auto action = cmdFeatureMgr->action("RicToggleMeasurementModeFeature"); auto measureAction = cmdFeatureMgr->action("RicToggleMeasurementModeFeature");
toolbar->addAction(action); toolbar->addAction(measureAction);
auto polyMeasureAction = cmdFeatureMgr->action("RicTogglePolyMeasurementModeFeature");
toolbar->addAction(polyMeasureAction);
} }
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
@ -895,6 +898,7 @@ void RiuMainWindow::slotRefreshViewActions()
{ {
QStringList commandIds; QStringList commandIds;
commandIds << "RicToggleMeasurementModeFeature"; commandIds << "RicToggleMeasurementModeFeature";
commandIds << "RicTogglePolyMeasurementModeFeature";
caf::CmdFeatureManager::instance()->refreshCheckedState(commandIds); caf::CmdFeatureManager::instance()->refreshCheckedState(commandIds);
} }

View File

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