MeVisLab Toolbox Reference
WEM.h
Go to the documentation of this file.
1 /*************************************************************************************
2 **
3 ** Copyright 2007, MeVis Medical Solutions AG
4 **
5 ** The user may use this file in accordance with the license agreement provided with
6 ** the Software or, alternatively, in accordance with the terms contained in a
7 ** written agreement between the user and MeVis Medical Solutions AG.
8 **
9 ** For further information use the contact form at https://www.mevislab.de/contact
10 **
11 **************************************************************************************/
12 
13 #pragma once
14 
15 #include "MLWEMIncludes.h"
16 #include "WEMAttributes.h"
17 #include "WEMPatch.h"
18 #include "WEMTrianglePatch.h"
19 #include "WEMQuadPatch.h"
20 #include "WEMPolygonPatch.h"
21 #include "WEMBoundingBox.h"
22 
23 #ifdef WIN32
24 typedef void* HANDLE;
25 #endif
26 
27 
28 ML_START_NAMESPACE
29 
31 
34 {
36  {
37  notificationType = WEM_NOTIFICATION_NONE;
38  patchId = WEM_PATCH_ID_ALL;
39 
40  repaintFaces =
41  repaintEdges =
42  repaintNodes =
43  repaintBoundingBoxes = false;
44 
45  selectionWasClicked = false;
46  selectionFaceHit = 0;
47  selectionHitPoint.assign(0,0,0);
48  }
49 
53  int patchId;
54 
56 
57  bool repaintFaces;
58  bool repaintEdges;
59  bool repaintNodes;
61 
63 
67 };
68 
70 
72 typedef void wemNotificationCB(void* data, std::vector<WEMEventContainer> ecList);
73 
75 
76 // A define that can be used to detect if the WEM is ref counted:
77 #define ML_WEM_REFCOUNTED 1
78 
79 // Declare WEMPtr smart pointer
81 
82 class MLWEM_EXPORT WEM : public RefCountedBase
89 {
90  ML_CLASS_HEADER(WEM)
91 
92 public:
93 
95  WEM();
97  WEM(const WEM& wem);
98 
99 protected:
105  ~WEM() override;
106 
107 public:
108 
112  {
115  std::vector<WEMEventContainer> ecList;
116  };
117 
119 
121  void clone(const WEM& wem);
123  WEM* deepCopy() const override;
124 
126 
129  bool isValid() const;
130 
132 
134  void addNotificationObserver(wemNotificationCB* callback, void* userData);
136  void removeNotificationObserver(wemNotificationCB* callback, void* userData);
138  void notifyObservers(std::vector<WEMEventContainer> ecList);
140  void notifyObservers(const ml::WEMNotificationType& notificationType);
142  static void removeNotificationObserverFromAllWEMs(wemNotificationCB* callback, void* userData);
143 
145 
149  unsigned int getCurrentWEMPatchId();
151  inline void setCurrentWEMPatchId(unsigned int id) { _currentLastWEMPatchId = id; }
152 
154 
159  void addWEMPatch(WEMPatch* wemPatch, bool mergeAllPatches=false);
161  WEMTrianglePatch* addWEMPatchCopy(WEMTrianglePatch* wemPatch, bool assignNewId=false);
163  WEMQuadPatch* addWEMPatchCopy(WEMQuadPatch* wemPatch, bool assignNewId=false);
165  WEMPolygonPatch* addWEMPatchCopy(WEMPolygonPatch* wemPatch, bool assignNewId=false);
166 
169  bool removeWEMPatch(WEMPatch* wemPatch);
172  bool removeWEMPatch(unsigned int id);
175  bool removeAll();
178 
180 
182  WEMPatch* getWEMPatchAt(unsigned int index);
184  inline const WEMPatch* getWEMPatchAt(unsigned int index) const { return const_cast<WEM*>(this)->getWEMPatchAt(index); }
187  WEMPatch* getWEMPatchById(unsigned int id);
190  inline const WEMPatch* getWEMPatchById(unsigned int id) const { return const_cast<WEM*>(this)->getWEMPatchById(id); }
192  unsigned int getWEMPatchIndex(WEMPatch* wemPatch) const;
194  unsigned int getWEMPatchIndex(unsigned int id) const;
196  bool hasWEMPatch(WEMPatch* wemPatch) const;
197 
199 
201  inline unsigned int getNumWEMPatches() const { return static_cast<unsigned int>(_wemPatchList.size()); }
202 
204 
206  inline void enableRepaintObserver() { _enableRepaintObserver = true; }
208  inline void disableRepaintObserver() { _enableRepaintObserver = false; }
209 
211  inline void enableFinishedObserver() { _enableFinishedObserver = true; }
213  inline void disableFinishedObserver() { _enableFinishedObserver = false; }
214 
216  inline void enableInteractionObserver() { _enableInteractionObserver = true; }
218  inline void disableInteractionObserver() { _enableInteractionObserver = false; }
219 
221  inline void enableSelectionObserver() { _enableSelectionObserver = true; }
223  inline void disableSelectionObserver() { _enableSelectionObserver = false; }
224 
226 
228  inline bool isRepaintNotificationEnabled() const { return _enableRepaintObserver; }
230  inline bool isFinishedNotificationEnabled() const { return _enableFinishedObserver; }
232  inline bool isInteractionInitNotificationEnabled() const { return _enableInteractionObserver; }
234  inline bool isSelectionNotificationEnabled() const { return _enableSelectionObserver; }
235 
237 
239  inline int getId() const { return _uniqueId; }
241  inline std::string getName() const { return _name; }
243  inline void setName(std::string name) { _name = name; }
244 
246 
248  void saveWEMSurface(const std::string& filename, const WEMPersistenceParameters& persistenceParameters, ProgressField *progressFld = nullptr);
250  void saveWEMSurface(std::ostream& outstream, const WEMPersistenceParameters& persistenceParameters, ProgressField *progressFld = nullptr);
251 
254  bool loadWEMSurface(const std::string& filename, bool generateEdges=true, ProgressField *progressFld=nullptr);
257  bool loadWEMSurface(const std::string& filename, MLuint64 filesize, bool generateEdges = true, ProgressField *progressFld = nullptr);
258 
260 
262  bool hasPrimitiveValueListForAllPatches(std::string description) const;
264  std::vector<std::string> getRegisteredPrimitiveValueLists() const;
265 
267 
269  void flatten(WEMTrianglePatch *triPatch, WEMRequirements* requirements, TriangulationModes triangulationMode);
270 
274 
278 
282 
283 private:
284 
286  void _setIdAndName();
287 
289  static int _getUniqueId();
290 
291 #ifdef WIN32
292  void _closeFileHandles(void* hMap, HANDLE hFile, HANDLE dFile);
293 #else
294  void _closeFileHandles(void* hMap, int dFile, MLuint64 filesize);
295 #endif
296 
298  int _uniqueId;
299 
301  std::string _name;
302 
304  std::vector<WEMPatch*>_wemPatchList;
305 
308  WEMBoundingBox _boundingBox;
309 
312  unsigned int _currentLastWEMPatchId;
313 
315  std::vector<WEMNotificationCBData>_notificationObservers;
316 
318  bool _enableRepaintObserver;
320  bool _enableFinishedObserver;
322  bool _enableInteractionObserver;
324  bool _enableSelectionObserver;
325 
326 
328  static int _currentLastId;
329 
331  static std::vector<WEM*> _registeredWEMs;
332 
334  static void registerWEM(WEM* wem);
336  static void deregisterWEM(WEM* wem);
337 };
338 
340 
341 
342 ML_END_NAMESPACE
#define MLWEM_EXPORT
Definition: MLWEMSystem.h:18
void * HANDLE
Definition: WEM.h:24
Field to encapsulate an increasing float value from range [0,1].
Definition: mlFields.h:451
This class represents an axis aligned bounding box for a WEMPatch.
Base class for triangle and quad patches.
Definition: WEMPatch.h:48
This represents a WEMPatch consisting of polygons only.
This represents a WEMPatch consisting of quads only.
Definition: WEMQuadPatch.h:24
This class represents WEMPatch requirements to be used by WEMProcessor.
This represents a WEMPatch consisting of triangles only.
A WEM comprises a number of WEMPatches.
Definition: WEM.h:89
unsigned int getNumWEMPatches() const
Returns the number of WEMs in the list.
Definition: WEM.h:201
void enableRepaintObserver()
Enables the repaint observer mechanism.
Definition: WEM.h:206
bool removeAll()
Removes all WEMPatches from the list.
void enableFinishedObserver()
Enables the finished observer mechanism.
Definition: WEM.h:211
unsigned int getWEMPatchIndex(WEMPatch *wemPatch) const
Returns the index of the given WEMPatch in its list.
void setName(std::string name)
Sets name of the WEM to the given string.
Definition: WEM.h:243
bool isRepaintNotificationEnabled() const
Returns whether the repaint notification is enabled.
Definition: WEM.h:228
void flatten(WEMTrianglePatch *triPatch, WEMRequirements *requirements, TriangulationModes triangulationMode)
Flatten: joins and converts all patches to triangle patches with same normal orientation.
WEM * deepCopy() const override
Returns a deep copy of this WEM.
bool isValid() const
Returns whether this WEM is valid.
const WEMPatch * getWEMPatchAt(unsigned int index) const
Returns a pointer to the WEMPatch at the given position in the internal list.
Definition: WEM.h:184
bool isSelectionNotificationEnabled() const
Returns whether the selection notification is enabled.
Definition: WEM.h:234
bool removeWEMPatch(WEMPatch *wemPatch)
Removes a given WEMPatch from the list.
void enableSelectionObserver()
Enables the selection observer mechanism.
Definition: WEM.h:221
WEMPolygonPatch * addWEMPatchCopy(WEMPolygonPatch *wemPatch, bool assignNewId=false)
Adds a copy of the given WEMPatch (WEMPolygonPatch) to the list. Assigns optionally a new id to the p...
void enableInteractionObserver()
Enables the interaction observer mechanism.
Definition: WEM.h:216
~WEM() override
The WEM destructor is protected since the WEM ownership is managed by the WEMPtr intrusive smart poin...
WEMQuadPatch * addWEMPatchCopy(WEMQuadPatch *wemPatch, bool assignNewId=false)
Adds a copy of the given WEMPatch (WEMQuadPatch) to the list. Assigns optionally a new id to the patc...
WEM()
Standard constructor.
WEMBoundingBox * getBoundingBox()
Returns the bounding box of all patches.
void addNotificationObserver(wemNotificationCB *callback, void *userData)
Adds a notification observer to this WEM.
bool loadWEMSurface(const std::string &filename, bool generateEdges=true, ProgressField *progressFld=nullptr)
Loads the geometry from a file given by its file name.
static void removeNotificationObserverFromAllWEMs(wemNotificationCB *callback, void *userData)
Removes a certain notification observer from all WEM.
bool removeWEMPatch(unsigned int id)
Removes a WEMPatch by its id .
int getId() const
Returns the id of the WEM.
Definition: WEM.h:239
void addWEMPatch(WEMPatch *wemPatch, bool mergeAllPatches=false)
Adds the given WEMPatch as a pointer to the list.
void disableRepaintObserver()
Disables the repaint observer mechanism.
Definition: WEM.h:208
WEMTrianglePatch * addWEMPatchCopy(WEMTrianglePatch *wemPatch, bool assignNewId=false)
Adds a copy of the given WEMPatch (WEMTrianglePatch) to the list. Assigns optionally a new id to the ...
void notifyObservers(std::vector< WEMEventContainer > ecList)
Notifies all observers with the events stored in the event container list.
WEMPatch * getWEMPatchAt(unsigned int index)
Returns a pointer to the WEMPatch at the given position in the internal list.
void removeNotificationObserver(wemNotificationCB *callback, void *userData)
Removes a notification observer from this WEM.
bool isFinishedNotificationEnabled() const
Returns whether the finished notification is enabled.
Definition: WEM.h:230
void disableSelectionObserver()
Disables the selection observer mechanism.
Definition: WEM.h:223
bool hasWEMPatch(WEMPatch *wemPatch) const
Returns whether there is the given WEMPatch in the list.
std::vector< std::string > getRegisteredPrimitiveValueLists() const
Returns unique list of registered primitive value lists for all patches as a vector.
void computeBoundingBox()
(Re)Computes the bounding boxes of all patches.
void mergeAllPatchesIntoSinglePatch()
Merges all internal WEMPatches into a single WEMPatch.
void notifyObservers(const ml::WEMNotificationType &notificationType)
Notifies all observers with the given event.
WEMPatch * getWEMPatchById(unsigned int id)
Returns a pointer to the WEMPatch with the given unique id.
bool hasPrimitiveValueListForAllPatches(std::string description) const
Returns whether all patches have a PVL with the given description.
unsigned int getWEMPatchIndex(unsigned int id) const
Returns the index of the WEMPatch with the given id in its list.
bool isInteractionInitNotificationEnabled() const
Returns whether the interaction init notification is enabled.
Definition: WEM.h:232
void removeAllNoDelete()
Clear internal vector (DOES NOT DELETE WEMPatches!!!)
std::string getName() const
Returns name of the WEM.
Definition: WEM.h:241
void saveWEMSurface(std::ostream &outstream, const WEMPersistenceParameters &persistenceParameters, ProgressField *progressFld=nullptr)
Saves the geometry to a given stream.
void setCurrentWEMPatchId(unsigned int id)
Sets the current last id for WEMPatches. Do not mess with it.
Definition: WEM.h:151
void disableInteractionObserver()
Disables the interaction observer mechanism.
Definition: WEM.h:218
unsigned int getCurrentWEMPatchId()
Returns the current last id (incremented each call) for WEMPatches.
WEM(const WEM &wem)
Copy constructor.
const WEMPatch * getWEMPatchById(unsigned int id) const
Returns a pointer to the WEMPatch with the given unique id.
Definition: WEM.h:190
void saveWEMSurface(const std::string &filename, const WEMPersistenceParameters &persistenceParameters, ProgressField *progressFld=nullptr)
Saves the geometry to the given file name.
void disableFinishedObserver()
Disables the finished observer mechanism.
Definition: WEM.h:213
bool loadWEMSurface(const std::string &filename, MLuint64 filesize, bool generateEdges=true, ProgressField *progressFld=nullptr)
Loads the geometry from a file given by its file name.
void clone(const WEM &wem)
Clones the internal WEMs of the given WEM to this one.
#define ML_REFCOUNTED_PTR(CLASSNAME)
Macro that defines convenience Ptr/ConstPtr typedefs to be used instead of intrusive_ptr templates.
#define ML_CLASS_HEADER(className)
Same like ML_CLASS_HEADER_EXPORTED with a non-existing export symbol.
UINT64 MLuint64
Introduce platform-independent 64-bit unsigned integer type.
Definition: mlTypeDefs.h:425
const int WEM_PATCH_ID_ALL
Patch Id meaning: all patches.
TriangulationModes
Enumeration of the triangulation modes. Note that these are 'mirrored' in the SoWEM part.
void wemNotificationCB(void *data, std::vector< WEMEventContainer > ecList)
Defines the function signature for the callback methods that is to be touched by a WEM notification.
Definition: WEM.h:72
WEMNotificationType
Defines the available WEM notifications.
Definition: MLWEMIncludes.h:98
@ WEM_NOTIFICATION_NONE
Notification flag: no notification at all (for initializing).
Definition: MLWEMIncludes.h:99
This struct holds all necessary data for the different notifications.
Definition: WEM.h:34
int notificationType
The type of the event (None, Repaint, Selection, Finished or InteractionInit). Default: None.
Definition: WEM.h:51
bool repaintFaces
Flag: repaint the faces.
Definition: WEM.h:57
bool repaintEdges
Flag: repaint the edges.
Definition: WEM.h:58
bool selectionWasClicked
Flag: was the WEM part selected by clicking?
Definition: WEM.h:64
Vector3 selectionHitPoint
The hit point.
Definition: WEM.h:66
int patchId
The id of the WEM part for which the event is to be evaluated. Default: -1 for all parts.
Definition: WEM.h:53
bool repaintBoundingBoxes
Flag: repaint the bounding boxes.
Definition: WEM.h:60
bool repaintNodes
Flag: repaint the nodes.
Definition: WEM.h:59
int selectionFaceHit
The entryNum of the hit face.
Definition: WEM.h:65
Structure to gather persistence parameters.
This struct combines a function pointer, a user data pointer and a flag for the notification observer...
Definition: WEM.h:112
wemNotificationCB * notificationCB
The callback function that is triggered by the notification.
Definition: WEM.h:113
void * notificationCBData
The callback data that is a pointer to the observer object.
Definition: WEM.h:114
std::vector< WEMEventContainer > ecList
Each eventContainer contains all information on the type and content of the notification.
Definition: WEM.h:115