diff --git a/Applications/DataExplorer/DataView/CMakeLists.txt b/Applications/DataExplorer/DataView/CMakeLists.txt index b15829707db024ff66cb03a72cad6dc27e02c489..42ae72959334ebe37b938ecb901fb53ae4ea8808 100644 --- a/Applications/DataExplorer/DataView/CMakeLists.txt +++ b/Applications/DataExplorer/DataView/CMakeLists.txt @@ -38,6 +38,7 @@ set( SOURCES StationTabWidget.cpp StationTreeModel.cpp StationTreeView.cpp + SurfaceExtractionDialog.cpp ) # Moc Header files @@ -76,6 +77,7 @@ set( MOC_HEADERS StationTabWidget.h StationTreeModel.h StationTreeView.h + SurfaceExtractionDialog.h ) # Header files @@ -115,6 +117,7 @@ set( UIS NewProcess.ui SaveMesh.ui StationTabWidgetBase.ui + SurfaceExtraction.ui ) # Put filter in a folder diff --git a/Applications/DataExplorer/DataView/MshView.cpp b/Applications/DataExplorer/DataView/MshView.cpp index e00bebc34cc8452a9516b0d1295986d65056bede..31b88e53f6ffe4cb4bcae7c9023f510b91bbbe6a 100644 --- a/Applications/DataExplorer/DataView/MshView.cpp +++ b/Applications/DataExplorer/DataView/MshView.cpp @@ -25,6 +25,7 @@ #include "MeshLib/Node.h" #include "MeshLayerEditDialog.h" #include "MeshValueEditDialog.h" +#include "SurfaceExtractionDialog.h" #include "MshItem.h" #include "MshModel.h" #include "OGSError.h" @@ -120,7 +121,7 @@ void MshView::contextMenuEvent( QContextMenuEvent* event ) QAction* tetgenExportAction (nullptr); if (mesh_dim==3) { - surfaceMeshAction = menu.addAction("Extract surface"); + surfaceMeshAction = menu.addAction("Extract surface..."); tetgenExportAction = menu.addAction("Export to TetGen..."); } QAction* mesh2geoAction (nullptr); @@ -187,8 +188,17 @@ void MshView::extractSurfaceMesh() return; const MeshLib::Mesh* mesh = static_cast<MshModel*>(this->model())->getMesh(index); - const MathLib::Vector3 dir(0, 0, -1); - static_cast<MshModel*>(this->model())->addMesh( MeshLib::MeshSurfaceExtraction::getMeshSurface(*mesh, dir, 89) ); + SurfaceExtractionDialog dlg; + if (dlg.exec() != QDialog::Accepted) + return; + + MathLib::Vector3 const& dir (dlg.getNormal()); + int const tolerance (dlg.getTolerance()); + MeshLib::Mesh* sfc_mesh (MeshLib::MeshSurfaceExtraction::getMeshSurface(*mesh, dir, tolerance)); + if (sfc_mesh != nullptr) + static_cast<MshModel*>(this->model())->addMesh(sfc_mesh); + else + OGSError::box(" No surfaces found to extract\n using the specified parameters."); } void MshView::convertMeshToGeometry() diff --git a/Applications/DataExplorer/DataView/SurfaceExtraction.ui b/Applications/DataExplorer/DataView/SurfaceExtraction.ui new file mode 100644 index 0000000000000000000000000000000000000000..0cbdeb8d96ca8ae1b293e32b331213e5a22c4d70 --- /dev/null +++ b/Applications/DataExplorer/DataView/SurfaceExtraction.ui @@ -0,0 +1,253 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SurfaceExtraction</class> + <widget class="QDialog" name="SurfaceExtraction"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>214</height> + </rect> + </property> + <property name="windowTitle"> + <string>Extract surfaces...</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="verticalSpacing"> + <number>2</number> + </property> + <item row="0" column="2"> + <widget class="QLineEdit" name="yNormalEdit"> + <property name="minimumSize"> + <size> + <width>70</width> + <height>25</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>70</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string notr="true">0</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="surfaceNormalLabel"> + <property name="font"> + <font> + <pointsize>9</pointsize> + <weight>50</weight> + <bold>false</bold> + </font> + </property> + <property name="text"> + <string>Surface Normal:</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QLineEdit" name="zNormalEdit"> + <property name="minimumSize"> + <size> + <width>70</width> + <height>25</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>70</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string notr="true">-1</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="4" column="1" colspan="3"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="xNormalEdit"> + <property name="minimumSize"> + <size> + <width>70</width> + <height>25</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>70</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string notr="true">0</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="toleranceLabel"> + <property name="font"> + <font> + <pointsize>9</pointsize> + </font> + </property> + <property name="text"> + <string>Tolerance:</string> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QLabel" name="degreesLabel"> + <property name="font"> + <font> + <pointsize>9</pointsize> + </font> + </property> + <property name="text"> + <string>Degrees</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="4"> + <widget class="QLabel" name="surfaceNormalExplLabel"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>20</height> + </size> + </property> + <property name="text"> + <string>(The vector (0,0,0) will return the complete boundary)</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QSpinBox" name="degreesSpinBox"> + <property name="minimumSize"> + <size> + <width>70</width> + <height>25</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>70</width> + <height>16777215</height> + </size> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="maximum"> + <number>90</number> + </property> + <property name="value"> + <number>90</number> + </property> + </widget> + </item> + <item row="3" column="0" colspan="4"> + <widget class="QLabel" name="toleranceExplLabel"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>20</height> + </size> + </property> + <property name="text"> + <string>(Allowed deviation from given surface normal)</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>xNormalEdit</tabstop> + <tabstop>yNormalEdit</tabstop> + <tabstop>zNormalEdit</tabstop> + <tabstop>degreesSpinBox</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>SurfaceExtraction</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>SurfaceExtraction</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/Applications/DataExplorer/DataView/SurfaceExtractionDialog.cpp b/Applications/DataExplorer/DataView/SurfaceExtractionDialog.cpp new file mode 100644 index 0000000000000000000000000000000000000000..030c669d89e1a8908156d493388a8e83ca4a206e --- /dev/null +++ b/Applications/DataExplorer/DataView/SurfaceExtractionDialog.cpp @@ -0,0 +1,38 @@ +/** + * \file SurfaceExtractionDialog.cpp + * \author Karsten Rink + * \date 2015-01-29 + * \brief Implementation of the SaveMeshDialog class. + * + * \copyright + * Copyright (c) 2012-2015, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + */ + +#include "SurfaceExtractionDialog.h" + +#include <QDoubleValidator> + + +SurfaceExtractionDialog::SurfaceExtractionDialog(QDialog* parent) + : QDialog(parent), _tolerance(90), _dir(0,0,-1) +{ + setupUi(this); + this->xNormalEdit->setValidator(new QDoubleValidator(-1, 1, 3, xNormalEdit)); + this->yNormalEdit->setValidator(new QDoubleValidator(-1, 1, 3, yNormalEdit)); + this->zNormalEdit->setValidator(new QDoubleValidator(-1, 1, 3, zNormalEdit)); +} + +void SurfaceExtractionDialog::accept() +{ + _dir = MathLib::Vector3(xNormalEdit->text().toDouble(), + yNormalEdit->text().toDouble(), + zNormalEdit->text().toDouble()); + _tolerance = degreesSpinBox->text().toInt(); + + this->done(QDialog::Accepted); +} + diff --git a/Applications/DataExplorer/DataView/SurfaceExtractionDialog.h b/Applications/DataExplorer/DataView/SurfaceExtractionDialog.h new file mode 100644 index 0000000000000000000000000000000000000000..b298a192e9bf1a735a27e69c1e05e2147bbdd4e2 --- /dev/null +++ b/Applications/DataExplorer/DataView/SurfaceExtractionDialog.h @@ -0,0 +1,53 @@ +/** + * \file SurfaceExtractionDialog.h + * \author Karsten Rink + * \date 2015-01-29 + * \brief Definition of the SurfaceExtractionDialog class. + * + * \copyright + * Copyright (c) 2012-2015, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + */ + +#ifndef SURFACEEXTRACTIONDIALOG_H +#define SURFACEEXTRACTIONDIALOG_H + +#include "ui_SurfaceExtraction.h" +#include <QDialog> + +#include "MathLib/Vector3.h" + +namespace MeshLib { + class Mesh; +} + +/** + * \brief A dialog window for managing properties for writing meshes to files. + */ +class SurfaceExtractionDialog : public QDialog, private Ui_SurfaceExtraction +{ + Q_OBJECT + +public: + SurfaceExtractionDialog(QDialog* parent = 0); + ~SurfaceExtractionDialog() {} + + int getTolerance() const { return _tolerance; } + MathLib::Vector3 const& getNormal() const { return _dir; } + +private slots: + /// Instructions if the OK-Button has been pressed. + void accept(); + + /// Instructions if the Cancel-Button has been pressed. + void reject() { this->done(QDialog::Rejected); }; + +private: + int _tolerance; + MathLib::Vector3 _dir; +}; + +#endif //SURFACEEXTRACTIONDIALOG_H