Developer Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
VolumeMeshSelectionPlugin.hh
1 /*===========================================================================*\
2  * *
3  * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40 \*===========================================================================*/
41 
42 /*===========================================================================*\
43  * *
44  * $Revision: 11942 $ *
45  * $Author: kremer $ *
46  * $Date: 2011-07-06 15:10:17 +0200 (Wed, 06 Jul 2011) $ *
47  * *
48 \*===========================================================================*/
49 
50 #ifndef VOLUMEMESHSELECTIONPLUGIN_HH
51 #define VOLUMEMESHSELECTIONPLUGIN_HH
52 
53 #include <QObject>
54 
62 #include <OpenFlipper/BasePlugin/INIInterface.hh>
67 #include <OpenFlipper/INIFile/INIFile.hh>
68 
71 
74 {
75  Q_OBJECT
76  Q_INTERFACES(BaseInterface)
77  Q_INTERFACES(KeyInterface)
78  Q_INTERFACES(INIInterface)
79  Q_INTERFACES(BackupInterface)
80  Q_INTERFACES(LoggingInterface)
81  Q_INTERFACES(ScriptInterface)
82  Q_INTERFACES(SelectionInterface)
83 
84 #if QT_VERSION >= 0x050000
85  Q_PLUGIN_METADATA(IID "org.OpenFlipper.Plugins.Plugin-SelectionVolumeMesh")
86 #endif
87 
88 public:
89 
92 
95 
96  friend class SelectVolumeAction;
97 
98 signals:
99 
100  // BaseInterface
101  void updateView();
102  void updatedObject(int, const UpdateType&);
103  void nodeVisibilityChanged(int _identifier);
104  void setSlotDescription(QString _slotName, QString _slotDescription,
105  QStringList _parameters, QStringList _descriptions);
106 
107  // LoggingInterface
108  void log(Logtype _type, QString _message);
109  void log(QString _message);
110 
111  // ScriptInterface
112  void scriptInfo(QString _functionName);
113 
114  // SelectionInterface
115  void addSelectionEnvironment(QString _modeName, QString _description, QString _icon, QString& _handleName);
116  void registerType(QString _handleName, DataType _type);
117  void addPrimitiveType(QString _handleName, QString _name, QString _icon, SelectionInterface::PrimitiveType& _typeHandle);
118  void addSelectionOperations(QString _handleName, QStringList _operationsList, QString _category, SelectionInterface::PrimitiveType _type = 0u);
119 
120  void showToggleSelectionMode(QString _handleName, bool _show, SelectionInterface::PrimitiveType _associatedTypes);
121 
122  void showVolumeLassoSelectionMode(QString _handleName, bool _show, SelectionInterface::PrimitiveType _associatedTypes);
123  void showFloodFillSelectionMode(QString _handleName, bool _show, SelectionInterface::PrimitiveType _associatedTypes);
124  void addCustomSelectionMode(QString _handleName, QString _modeName, QString _description, QString _icon,
125  SelectionInterface::PrimitiveType _associatedTypes, QString& _customIdentifier);
126 
127  void getActiveDataTypes(SelectionInterface::TypeList& _types);
128  void getActivePrimitiveType(SelectionInterface::PrimitiveType& _type);
129  void targetObjectsOnly(bool& _targetsOnly);
130 
131  void registerKeyShortcut(int _key, Qt::KeyboardModifiers _modifiers = Qt::NoModifier);
132 
133 private slots:
134 
135  // INIInterface
136  void loadIniFile(INIFile& _ini, int _id);
137  void saveIniFile(INIFile& _ini, int _id);
138 
139  // BaseInterface
140  void initializePlugin();
141  void pluginsInitialized();
142  void noguiSupported() {};
143 
144  // SelectionInterface
145  void slotSelectionOperation(QString _operation);
146  void slotToggleSelection(QMouseEvent* _event, SelectionInterface::PrimitiveType _currentType, bool _deselect);
147 
148  void slotVolumeLassoSelection(QMouseEvent* _event, SelectionInterface::PrimitiveType _currentType, bool _deselect);
149  void slotFloodFillSelection(QMouseEvent* _event, double _maxAngle, SelectionInterface::PrimitiveType _currentType, bool _deselect);
150  void slotCustomSelection(QMouseEvent *_event, SelectionInterface::PrimitiveType _currentType, QString _customIdentifier, bool _deselect);
151 
152  void slotLoadSelection(const INIFile& _file);
153  void slotSaveSelection(INIFile& _file);
154 
155  void slotKeyShortcutEvent(int _key, Qt::KeyboardModifiers _modifiers);
156 
157 public slots:
158 
159  // SelectionInterface
160  void loadSelection(int _objId, const QString& _filename);
161 
162 public:
163 
164  // BaseInterface
165  QString name() {
166  return (QString(tr("VolumeMesh Selection")));
167  };
168 
169  QString description() {
170  return (QString(tr("Allows to select VolumeMeshes")));
171  };
172 
173  //===========================================================================
176  //===========================================================================
177 private:
178 
180  void updateSlotDescriptions();
181 
184 public slots:
185 
186  QString version() {
187  return QString("1.0");
188  };
189 
190  //===========================================================================
193  //===========================================================================
194 
196  bool vertexTypeActive();
197 
199  bool edgeTypeActive();
200 
202  bool faceTypeActive();
203 
205  bool cellTypeActive();
206 
207  //===========================================================================
208 
210  void selectAllVertices(int _objectId);
211 
213  void deselectAllVertices(int _objectId);
214 
216  void invertVertexSelection(int _objectId);
217 
219  void selectVertices(int _objectId, const IdList& _ids, bool _deselect = false);
220 
222  IdList getVertexSelection(int _objectId);
223 
225  void deleteSelectedVertices(int _objectId, bool _preserveManifoldness = true);
226 
227  //===========================================================================
228 
230  void selectAllEdges(int _objectId);
231 
233  void deselectAllEdges(int _objectId);
234 
236  void invertEdgeSelection(int _objectId);
237 
239  void selectEdges(int _objectId, const IdList& _ids, bool _deselect = false);
240 
242  IdList getEdgeSelection(int _objectId);
243 
245  void deleteSelectedEdges(int _objectId, bool _preserveManifoldness = true);
246 
247  //===========================================================================
248 
250  void selectAllHalfEdges(int _objectId);
251 
253  void deselectAllHalfEdges(int _objectId);
254 
256  void invertHalfEdgeSelection(int _objectId);
257 
259  void selectHalfEdges(int _objectId, const IdList& _ids, bool _deselect = false);
260 
262  IdList getHalfEdgeSelection(int _objectId);
263 
264  //===========================================================================
265 
267  void selectAllFaces(int _objectId);
268 
270  void deselectAllFaces(int _objectId);
271 
273  void invertFaceSelection(int _objectId);
274 
276  void selectFaces(int _objectId, const IdList& _ids, bool _deselect = false);
277 
279  IdList getFaceSelection(int _objectId);
280 
282  void deleteSelectedFaces(int _objectId, bool _preserveManifoldness = true);
283 
284  //===========================================================================
285 
287  void selectAllHalfFaces(int _objectId);
288 
290  void deselectAllHalfFaces(int _objectId);
291 
293  void invertHalfFaceSelection(int _objectId);
294 
296  void selectHalfFaces(int _objectId, const IdList& _ids, bool _deselect = false);
297 
299  IdList getHalfFaceSelection(int _objectId);
300 
301  //===========================================================================
302 
304  void selectAllCells(int _objectId);
305 
307  void deselectAllCells(int _objectId);
308 
310  void invertCellSelection(int _objectId);
311 
313  void selectCells(int _objectId, const IdList& _ids, bool _deselect = false);
314 
316  IdList getCellSelection(int _objectId);
317 
319  void deleteSelectedCells(int _objectId, bool _preserveManifoldness = true);
320 
323  //===========================================================================
326  //===========================================================================
327 
328 private:
330  template<class MeshT>
331  bool volumeSelection(MeshT* _mesh, ACG::GLState& _state, QRegion *_region,
332  PrimitiveType _primitiveTypes, bool _deselection);
333 
335  template<class MeshT>
336  void floodFillSelection(MeshT* _mesh, uint _fh, double _maxAngle,
337  PrimitiveType _primitiveTypes, bool _deselection);
338 
339  // Get orthogonal orientation of neighboring cell
341  const OpenVolumeMesh::CellHandle& _ch2, unsigned char _firstOrthDirection, const HexahedralMesh* _mesh) const;
342 
343  // Get face shared by two adjacent cells
344  typedef std::pair<OpenVolumeMesh::HalfFaceHandle,OpenVolumeMesh::HalfFaceHandle> HFPair;
345  HFPair getCommonFace(const OpenVolumeMesh::CellHandle& _ch1,
346  const OpenVolumeMesh::CellHandle& _ch2, const HexahedralMesh* _mesh) const;
347 
350 
353 
355  PrimitiveType vertexType_;
356  PrimitiveType edgeType_;
357  PrimitiveType faceType_;
358  PrimitiveType cellType_;
359 
360  PrimitiveType allSupportedTypes_;
362 
364  QVector<QPoint> volumeLassoPoints_;
365 
366  // Store last picked cell for sheet selection
368  unsigned char lastPickedOrientation_;
369  std::map<OpenVolumeMesh::CellHandle, unsigned char> orientationMap_;
370 
373 };
374 
376 class SelectVolumeAction
377 {
378 public:
379  SelectVolumeAction(QRegion&_region, VolumeMeshSelectionPlugin* _plugin,
380  unsigned int _type, bool _deselection, ACG::GLState& _state)
381  : state_(_state)
382  , region_(_region)
383  , plugin_(_plugin)
384  , type_(_type)
385  , deselection_(_deselection)
386  {
387  }
388 
389  void enter(BaseNode* /*_node*/) {}
390  void leave(BaseNode* /*_node*/) {}
391 
392  bool operator()(BaseNode* _node);
393 
394 private:
395  ACG::GLState& state_;
396  QRegion& region_;
397  VolumeMeshSelectionPlugin* plugin_;
398  unsigned int type_;
399  bool deselection_;
400 };
401 //=============================================================================
402 #if defined(INCLUDE_TEMPLATES) && !defined(VOLUMEMESHSELECTIONPLUGINT_CC)
403 #define VOLUMEMESHSELECTIONPLUGINT_TEMPLATES
404 #include "VolumeMeshSelectionPluginT.cc"
405 #endif
406 
407 //=============================================================================
408 #endif // VOLUMEMESHSELECTIONPLUGIN_HH defined
409 //=============================================================================
QString columnSelectionHandle_
Handle to selection environment.
void slotCustomSelection(QMouseEvent *_event, SelectionInterface::PrimitiveType _currentType, QString _customIdentifier, bool _deselect)
Called whenever the user performs a custom selection.
PrimitiveType allSupportedTypes_
Handle to selection environment.
Interface class from which all plugins have to be created.
IdList getCellSelection(int _objectId)
Get current cell selection.
~VolumeMeshSelectionPlugin()
Default destructor.
QString sheetSelectionHandle_
Handle to selection environment.
void invertHalfFaceSelection(int _objectId)
Invert half-face selection.
bool cellTypeActive()
Is cell type active? (for use in plugins that need mesh selection)
Keyboard Event Interface.
Definition: KeyInterface.hh:76
PrimitiveType edgeType_
Handle to selection environment.
Interface class for Plugins which have to store information in ini files.
Definition: INIInterface.hh:81
PrimitiveType cellType_
Handle to selection environment.
Logtype
Log types for Message Window.
void slotToggleSelection(QMouseEvent *_event, SelectionInterface::PrimitiveType _currentType, bool _deselect)
Called whenever the user performs a toggle selection.
void selectAllHalfFaces(int _objectId)
Select all half-faces of a volume mesh.
VolumeMeshSelectionPlugin()
Default constructor.
OpenVolumeMesh::CellHandle lastPickedCell_
Handle to selection environment.
Update type class.
Definition: UpdateType.hh:70
void deleteSelectedVertices(int _objectId, bool _preserveManifoldness=true)
Delete selected vertices from mesh.
void deselectAllFaces(int _objectId)
Deselect all faces of a volume mesh.
std::pair< OpenVolumeMesh::HalfFaceHandle, OpenVolumeMesh::HalfFaceHandle > HFPair
Handle to selection environment.
void invertCellSelection(int _objectId)
Invert cell selection.
Interface for all plugins which want to use selection functions.
Interface for all Plugins which do logging to the logging window of the framework.
bool faceTypeActive()
Is face type active? (for use in plugins that need mesh selection)
void slotLoadSelection(const INIFile &_file)
Load selection for specific objects in the scene.
void slotKeyShortcutEvent(int _key, Qt::KeyboardModifiers _modifiers)
One of the previously registered keys has been pressed.
Traverse the scenegraph and call the selection function for all mesh nodes.
std::map< OpenVolumeMesh::CellHandle, unsigned char > orientationMap_
Handle to selection environment.
PrimitiveType faceType_
Handle to selection environment.
bool volumeSelection(MeshT *_mesh, ACG::GLState &_state, QRegion *_region, PrimitiveType _primitiveTypes, bool _deselection)
Surface volume selection tool.
bool edgeTypeActive()
Is vertex type active? (for use in plugins that need mesh selection)
void selectAllHalfEdges(int _objectId)
Select all half-edges of a volume mesh.
void selectCells(int _objectId, const IdList &_ids, bool _deselect=false)
Select specific cells of a volume mesh.
void selectHalfEdges(int _objectId, const IdList &_ids, bool _deselect=false)
Select specific half-edges of a volume mesh.
Class for the handling of simple configuration files.
Definition: INIFile.hh:105
void invertFaceSelection(int _objectId)
Invert face selection.
void selectAllVertices(int _objectId)
Select all vertices of a volume mesh.
bool operator()(BaseNode *_node)
Traverse the scenegraph and call the selection function for all mesh nodes.
void selectHalfFaces(int _objectId, const IdList &_ids, bool _deselect=false)
Select specific half-faces of a volume mesh.
std::vector< int > IdList
Standard Type for id Lists used for scripting.
Definition: DataTypes.hh:192
void invertEdgeSelection(int _objectId)
Invert edge selection.
PrimitiveType vertexType_
Primitive type handles:
void deleteSelectedEdges(int _objectId, bool _preserveManifoldness=true)
Delete selected edges from mesh.
void deselectAllHalfEdges(int _objectId)
Deselect all half-edges of a volume mesh.
Interface for all Plugins which provide scriptable Functions.
void selectAllFaces(int _objectId)
Select all faces of a volume mesh.
void selectFaces(int _objectId, const IdList &_ids, bool _deselect=false)
Select specific faces of a volume mesh.
IdList getVertexSelection(int _objectId)
Get current vertex selection.
bool vertexTypeActive()
Is vertex type active? (for use in plugins that need mesh selection)
void selectEdges(int _objectId, const IdList &_ids, bool _deselect=false)
Select specific edges of a volume mesh.
void deselectAllVertices(int _objectId)
Deselect all vertices of a volume mesh.
void selectVertices(int _objectId, const IdList &_ids, bool _deselect=false)
Select specific vertices of a volume mesh.
IdList getHalfFaceSelection(int _objectId)
Get current half-face selection.
void deleteSelectedCells(int _objectId, bool _preserveManifoldness=true)
Delete selected cells from mesh.
QVector< QPoint > volumeLassoPoints_
Keep volume lasso points.
void slotVolumeLassoSelection(QMouseEvent *_event, SelectionInterface::PrimitiveType _currentType, bool _deselect)
Called whenever the user performs a volume lasso selection.
void slotSelectionOperation(QString _operation)
A specific operation is requested.
void invertHalfEdgeSelection(int _objectId)
Invert half-edge selection.
IdList getHalfEdgeSelection(int _objectId)
Get current half-edge selection.
void selectAllEdges(int _objectId)
Select all edges of a volume mesh.
void floodFillSelection(MeshT *_mesh, uint _fh, double _maxAngle, PrimitiveType _primitiveTypes, bool _deselection)
Select all entities that are connected (and do not exceed the maximum dihedral angle) ...
void selectAllCells(int _objectId)
Select all cells of a volume mesh.
unsigned char lastPickedOrientation_
Handle to selection environment.
void updateSlotDescriptions()
Set slot descriptions for scripting functions.
Interface class for backup handling.
IdList getEdgeSelection(int _objectId)
Get current edge selection.
void deleteSelectedFaces(int _objectId, bool _preserveManifoldness=true)
Delete selected faces from mesh.
void invertVertexSelection(int _objectId)
Invert vertex selection.
HFPair getCommonFace(const OpenVolumeMesh::CellHandle &_ch1, const OpenVolumeMesh::CellHandle &_ch2, const HexahedralMesh *_mesh) const
Handle to selection environment.
Predefined datatypes.
Definition: DataTypes.hh:96
QString environmentHandle_
Handle to selection environment.
QString description()
Return a description of what the plugin is doing.
PrimitiveType floodFillSupportedTypes_
Handle to selection environment.
QString name()
Return a name for the plugin.
void deselectAllCells(int _objectId)
Deselect all cells of a volume mesh.
IdList getFaceSelection(int _objectId)
Get current face selection.
void deselectAllEdges(int _objectId)
Deselect all edges of a volume mesh.
void slotSaveSelection(INIFile &_file)
Save selection for all objects in the scene.
void deselectAllHalfFaces(int _objectId)
Deselect all half-faces of a volume mesh.
unsigned char getOrthogonalOrientationOfNeighborCell(const OpenVolumeMesh::CellHandle &_ch1, const OpenVolumeMesh::CellHandle &_ch2, unsigned char _firstOrthDirection, const HexahedralMesh *_mesh) const
Handle to selection environment.
void slotFloodFillSelection(QMouseEvent *_event, double _maxAngle, SelectionInterface::PrimitiveType _currentType, bool _deselect)
Called whenever the user performs a flood fill selection.