MeVisLab Toolbox Reference
WEMPatch.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 "WEMNode.h"
16 #include "WEMEdge.h"
17 #include "WEMBoundingBox.h"
18 #include "WEMAttributes.h"
19 #include "WEMRequirements.h"
20 #include "WEMPrimitiveValueList.h"
23 #include "WEMPersistenceHelper.h"
24 
25 ML_START_NAMESPACE
26 
28 
29 class WEM;
30 class WEMPatchPersistence;
31 
34 {
35  unsigned int index;
36  double centroidZ;
37 
38  bool operator < (const CentroidIndex& c) const
39  {
40  return centroidZ < c.centroidZ;
41  }
42 };
43 
45 
48 {
49 public:
51  WEMPatch(unsigned int bs = 8192);
54  WEMPatch(WEM* wem, unsigned int bs = 8192);
56  WEMPatch(const WEMPatch& wemPatch);
58  WEMPatch(WEMPatch &&other) noexcept;
60  WEMPatch &operator=(WEMPatch &&other) noexcept;
62  virtual ~WEMPatch();
64  virtual WEMPatch* copy() = 0;
66  void dispose();
68  void addPatch(WEMPatch* wemPatch);
69 
71  inline unsigned int getBlocksize() const { return _blocksize; }
73  virtual PatchTypes getPatchType() const = 0;
75  virtual inline unsigned int getNumFaces() const { return 0; }
76 
78  inline bool isTrianglePatch() const { return getPatchType() == WEM_PATCH_TRIANGLES; }
80  inline bool isQuadPatch() const { return getPatchType() == WEM_PATCH_QUADS; }
81 
83 
85  inline unsigned int getNumNodes() const { return _nodes.num(); }
87  inline WEMIndexVector<WEMNode>* getNodes() { return &_nodes; }
89  inline const WEMIndexVector<WEMNode>* getNodes() const { return const_cast<WEMPatch*>(this)->getNodes(); }
91  inline WEMNode* getNodeAt(unsigned int index) { return _nodes.at(index); }
93  inline const WEMNode* getNodeAt(unsigned int index) const { return const_cast<WEMPatch*>(this)->getNodeAt(index); }
102  void delNode(WEMNode* node);
105  void addNodeValues(WEMNode* target, WEMNode* source, double modifier);
107  void averageNodeValues(WEMNode* target, WEMNode* source1, WEMNode* source2);
109  void extendNodeValueLists(unsigned int number, double value);
110 
112 
114  inline unsigned int getNumEdges() const { return _edges.num(); }
116  inline WEMIndexVector<WEMEdge>* getEdges() { return &_edges; }
118  inline const WEMIndexVector<WEMEdge>* getEdges() const { return const_cast<WEMPatch*>(this)->getEdges(); }
120  inline WEMEdge* getEdgeAt(unsigned int index) { return _edges.at(index); }
122  inline const WEMEdge* getEdgeAt(unsigned int index) const { return const_cast<WEMPatch*>(this)->getEdgeAt(index); }
125  inline WEMEdge* addEdge() { return _edges.append(); }
127  inline void delEdge(WEMEdge* edge) { _edges.remove(edge); }
129  inline bool hasEdges() const { return (_edges.num() > 0); }
132  void addEdgeValues(WEMEdge* target, WEMEdge* source, double modifier);
134  void extendEdgeValueLists(unsigned int number, double value);
135 
137 
139  virtual WEMFace* getFaceAt(unsigned int index) = 0;
141  virtual const WEMFace* getFaceAt(unsigned int index) const = 0;
142 
145  virtual WEMFace* addFace() = 0;
148  void addFaceValues(WEMFace* target, WEMFace* source, double modifier);
150  void extendFaceValueLists(unsigned int number, double value);
151 
153 
155  void setNodeTraversalState(bool state);
157  void setEdgeTraversalState(bool state);
159  void setFaceTraversalState(bool state);
163  void flipNormals();
166  void applyMatrix(const Matrix4& transformationMatrix);
167 
169 
171  double getArea() const;
173  double getVolume() const;
175  bool pointsOutwards() const;
176 
178 
180  inline WEMBoundingBox* getBoundingBox() { return &_boundingBox; }
182  inline const WEMBoundingBox* getBoundingBox() const { return const_cast<WEMPatch*>(this)->getBoundingBox(); }
187 
189  void translate(const Vector3& offset);
190 
192 
195  inline double getLUTMin() const
196  {
197  const WEMPrimitiveValueList* pvl = getPrimitiveValueList("LUT");
198  if (pvl) { return pvl->getMinValue(); }
199  else { return 0; }
200  }
203  inline double getLUTMax() const
204  {
205  const WEMPrimitiveValueList* pvl = getPrimitiveValueList("LUT");
206  if (pvl) { return pvl->getMaxValue(); }
207  else { return 0; }
208  }
209 
211 
213  void setType(std::string type) { _type = type; }
215  std::string getType() const { return _type; }
217  void setCreatorId(int id) { _creatorId = id; }
219  int getCreatorId() const { return _creatorId; }
220 
222 
224  inline void setWEM(WEM* wem) { _wem = wem; }
226  inline WEM* getWEM() { return _wem; }
228  inline const WEM* getWEM() const { return const_cast<WEMPatch*>(this)->getWEM(); }
229 
231 
233  inline void setLabel(std::string label) { _attributes.label = label; }
235  inline std::string getLabel() const { return _attributes.label; }
236 
238  inline void setDescription(std::string desc) { _attributes.description = desc; }
240  inline std::string getDescription() const { return _attributes.description; }
241 
243 
245  inline unsigned int getId() const { return _uniqueId; }
246 
248  inline void setId(unsigned int newId) { _uniqueId = newId; }
249 
251 
254 
256 
258  void triangulate(WEMTrianglePatch* wemPatch, TriangulationModes triangulationMode);
259 
261  void mirror();
262 
264  virtual void sortFacesByZPosition() = 0;
265 
267  WEMPatch* makeCompatible(WEMRequirements* requirements, TriangulationModes triangulationMode);
268 
270 
273  virtual void buildEdgeConnectivity();
274 
278 
281 
283 
285  void saveTo(OutStreamWrapper& ostreamWrapper, const WEMPersistenceParameters& writeParameters, WEMProgressUpdater& progressUpdater);
286 
288  unsigned int loadFrom(FileMapWrapper& mapper, const WEMPersistenceParameters& persistenceParameters, const WEMReadParameters& parameters, WEMProgressUpdater& progressUpdater);
289 
291 
295 
298  WEMPrimitiveValueList* getPrimitiveValueList(const std::string& name);
299 
302  const WEMPrimitiveValueList* getPrimitiveValueList(const std::string& name) const;
303 
306  std::vector<std::string> getRegisteredPrimitiveValueLists() const;
307 
309  const std::vector<WEMPrimitiveValueList*>& getPrimitiveValueLists() const { return _primitiveValueLists; }
310 
312  bool removePrimitiveValueList(const std::string& name);
313 
319  unsigned int getNumSingleColoredFaces();
326 
327 protected:
328 
331 
334 
335  void _getReorderedIndicesForFaces(std::vector<unsigned int>& reorderedIndices);
336 
338  unsigned int _blocksize;
344  WEM *_wem{};
346  unsigned int _uniqueId{};
348  std::string _type;
351 
356 
358  std::vector<WEMPrimitiveValueList*> _primitiveValueLists;
359 
360 private:
361 
364  void _storePrimitiveValueListValue(unsigned int i, unsigned int index, double value);
365 
366  friend class WEMPatchPersistence;
367 };
368 
370 
371 ML_END_NAMESPACE
#define MLWEM_EXPORT
Definition: MLWEMSystem.h:18
Wraps a FileMap so we can handle errors and exceptions more easily.
This class comprises some attributes that are common for a WEM and a WEMPatch.
Definition: WEMAttributes.h:25
This class represents an axis aligned bounding box for a WEMPatch.
Defines the mesh component: edge.
Definition: WEMEdge.h:30
Defines the mesh component: face.
Definition: WEMFace.h:30
Dynamic vector, based on a memory pool. Keeps track on entry numbers of stored primitives.
Defines the mesh component: node.
Definition: WEMNode.h:33
Class to save/load a WEMPatch.
Base class for triangle and quad patches.
Definition: WEMPatch.h:48
bool removePrimitiveValueList(const std::string &name)
Removes the PVL with the given name. Returns whether the operation was successful.
void delEdge(WEMEdge *edge)
Deletes an edge and erases it from the internal edges vector.
Definition: WEMPatch.h:127
const WEMIndexVector< WEMEdge > * getEdges() const
Returns the pointer to the internal edges structure.
Definition: WEMPatch.h:118
const WEMEdge * getEdgeAt(unsigned int index) const
Returns the edge at the given index.
Definition: WEMPatch.h:122
WEMEdge * addEdge()
Instantiates a new WEMEdge and adds it to the internal edges vector.
Definition: WEMPatch.h:125
void removeAllEdges()
Removes all edges.
void deleteOrphanNodes()
Deletes orphan nodes (number of edges == number of faces == 0).
unsigned int loadFrom(FileMapWrapper &mapper, const WEMPersistenceParameters &persistenceParameters, const WEMReadParameters &parameters, WEMProgressUpdater &progressUpdater)
Loads this patch from given memory map.
int getCreatorId() const
Returns the creator ID of the WEMPatch.
Definition: WEMPatch.h:219
WEMPrimitiveValueList * createOrGetPrimitiveValueList(const std::string &name)
Creates a PVL under the given name and returns a pointer to it.
WEMNode * addNodeNoUpdatePrimitiveValueLists()
Creates and returns a new node without changing the nodes PVL.
const WEMNode * getNodeAt(unsigned int index) const
Returns the node at the given index.
Definition: WEMPatch.h:93
void translate(const Vector3 &offset)
Translate all nodes by the given offset.
virtual void _delFaceUpdatePrimitiveValueLists(WEMFace *face)
Updates primitive value lists on delFace.
virtual void buildEdgeConnectivity()
Builds edge connectivity for the whole WEM.
double getArea() const
Returns the area of this patch in square mm.
int _creatorId
ID of the creator of this WEMPatch.
Definition: WEMPatch.h:350
void setEdgeTraversalState(bool state)
Sets the specified traversal state to all edges.
void setId(unsigned int newId)
Sets the unique ID of this WEMPatch. Beware: do not set this ID unless you really know what you do!
Definition: WEMPatch.h:248
WEMPatch(const WEMPatch &wemPatch)
Copy constructor.
void setNodeTraversalState(bool state)
Sets the specified traversal state to all nodes.
WEMNode * addNode()
Instantiates a new WEMNode and adds it to the internal nodes vector.
WEMIndexVector< WEMEdge > _edges
The vector that holds all the edges of the wem.
Definition: WEMPatch.h:342
void computeNormals()
Computes all normals.
WEMPatch(unsigned int bs=8192)
Standard constructor.
WEMIndexVector< WEMNode > * getNodes()
Returns the pointer to the internal nodes structure.
Definition: WEMPatch.h:87
double getVolume() const
Returns the volume of this patch in cubic mm.
unsigned int getBlocksize() const
Returns the block size for the patch.
Definition: WEMPatch.h:71
unsigned int getNumNodes() const
Returns the number of nodes in the patch.
Definition: WEMPatch.h:85
const WEMPrimitiveValueList * getPrimitiveValueList(const std::string &name) const
Returns a pointer to the PVL with the given name.
bool isSingleColored(WEMFace *face)
Returns whether the given face is single colored.
const std::vector< WEMPrimitiveValueList * > & getPrimitiveValueLists() const
Returns an array of the primitive value lists.
Definition: WEMPatch.h:309
virtual WEMFace * getFaceAt(unsigned int index)=0
Returns the face at the given index.
unsigned int getNumSingleColoredFaces()
Return the number of single-colored faces.
bool isTrianglePatch() const
Helper method to check if the patch is a triangle patch.
Definition: WEMPatch.h:78
bool isSingleColored(WEMNode *node)
Returns whether an adjacent face to the given node is single colored.
void averageNodeValues(WEMNode *target, WEMNode *source1, WEMNode *source2)
Averages the given source node values and stores values in the given target node.
std::vector< std::string > getRegisteredPrimitiveValueLists() const
Returns all available primitive value lists as a vector filled with the registered names of the PVLs.
void buildLocalEdgeConnectivity(WEMFace *face)
Builds local edge connectivity, only provided face is rebuild.
virtual unsigned int getNumFaces() const
Returns the number of faces in the patch.
Definition: WEMPatch.h:75
bool isQuadPatch() const
Helper method to check if the patch is a quad patch.
Definition: WEMPatch.h:80
virtual ~WEMPatch()
Standard destructor.
void setFaceTraversalState(bool state)
Sets the specified traversal state to all faces.
void addPatch(WEMPatch *wemPatch)
Adds the primitives of the given patch to this patch.
unsigned int _blocksize
Initial blocksize for the WEMVector, WEMObjectVector variables used.
Definition: WEMPatch.h:338
void centerByBoundingBox()
Centers the patch by its bounding box.
virtual WEMPatch * copy()=0
Create a (deep) copy of the patch.
void addNodeValues(WEMNode *target, WEMNode *source, double modifier)
Adds node values from node source to given target node.
void extendNodeValueLists(unsigned int number, double value)
Extends all node value lists with the given value.
bool hasSingleColoredPVL()
Returns whether the patch has a PVL set for single colored faces.
WEMPatch & operator=(WEMPatch &&other) noexcept
Move assignment operator.
virtual void sortFacesByZPosition()=0
Sorts the faces by the z-position of their centroids.
void addEdgeValues(WEMEdge *target, WEMEdge *source, double modifier)
Adds the edge values from edge source to given target edge.
void setWEM(WEM *wem)
Sets the internal pointer to the embracing WEM.
Definition: WEMPatch.h:224
void mirror()
Mirrors the faces in this patch.
WEMAttributes _attributes
The attributes of this WEMPatch.
Definition: WEMPatch.h:353
WEMPatch * makeCompatible(WEMRequirements *requirements, TriangulationModes triangulationMode)
Makes WEMPatch compatible with the given requirements.
bool hasAllFacesSingleColored()
Returns whether all faces are single colored.
void triangulate(WEMTrianglePatch *wemPatch, TriangulationModes triangulationMode)
Triangulates the patch and adds triangles to the given triangle patch.
WEMPatch(WEM *wem, unsigned int bs=8192)
Constructor which takes a pointer to the WEM this WEM is in.
void addFaceValues(WEMFace *target, WEMFace *source, double modifier)
Adds the face values from face source to given target face.
void extendEdgeValueLists(unsigned int number, double value)
Extends all edge value lists with given value.
double getLUTMin() const
Returns the minimum value of the LUT PVL for range determination.
Definition: WEMPatch.h:195
const WEMIndexVector< WEMNode > * getNodes() const
Returns the pointer to internal nodes structure.
Definition: WEMPatch.h:89
std::string _type
Type of this WEMPatch.
Definition: WEMPatch.h:348
void applyMatrix(const Matrix4 &transformationMatrix)
Applies the given matrix on all nodes, applies the inverse transposed matrix on all node normals,...
void extendFaceValueLists(unsigned int number, double value)
Extends all face value lists with the given value.
void setCreatorId(int id)
Sets the creator ID of the WEMPatch.
Definition: WEMPatch.h:217
void flipNormals()
Flip all normals.
WEMPatch(WEMPatch &&other) noexcept
Move c'tor.
WEMBoundingBox * getBoundingBox()
Returns the bounding box.
Definition: WEMPatch.h:180
virtual const WEMFace * getFaceAt(unsigned int index) const =0
Returns the face at the given index.
void saveTo(OutStreamWrapper &ostreamWrapper, const WEMPersistenceParameters &writeParameters, WEMProgressUpdater &progressUpdater)
Saves this patch to given output stream.
std::string getType() const
Returns the type of the WEMPatch.
Definition: WEMPatch.h:215
bool hasEdges() const
Returns whether this patch has any edges.
Definition: WEMPatch.h:129
WEMPrimitiveValueList * getPrimitiveValueList(const std::string &name)
Returns a pointer to the PVL with the given name.
bool isSingleColored(WEMEdge *edge)
Returns whether an adjacent face to the given edge is single colored.
virtual void _addFaceUpdatePrimitiveValueLists()
Updates primitive value lists on addFace.
WEMBoundingBox _boundingBox
The bounding box of this WEMPatch.
Definition: WEMPatch.h:355
const WEM * getWEM() const
Returns the internal pointer to the embracing WEM.
Definition: WEMPatch.h:228
unsigned int getNumEdges() const
Returns the number of edges in the patch.
Definition: WEMPatch.h:114
double getLUTMax() const
Returns the maximum value of the LUT PVL for range determination.
Definition: WEMPatch.h:203
void setLabel(std::string label)
Sets the 'label' attribute of this WEMPatch.
Definition: WEMPatch.h:233
void dispose()
Disposes of internal data structures.
const WEMBoundingBox * getBoundingBox() const
Returns the bounding box.
Definition: WEMPatch.h:182
void setDescription(std::string desc)
Sets the 'description' attribute of this WEMPatch.
Definition: WEMPatch.h:238
void delNode(WEMNode *node)
Deletes the given node and erases it from the internal nodes vector.
WEMIndexVector< WEMEdge > * getEdges()
Returns the pointer to the internal edges structure.
Definition: WEMPatch.h:116
bool pointsOutwards() const
Checks and returns whether this patch has most normals pointing outwards.
std::string getDescription() const
Returns the 'description' attribute of this WEMPatch.
Definition: WEMPatch.h:240
WEMEdge * getEdgeAt(unsigned int index)
Returns the edge at the given index.
Definition: WEMPatch.h:120
virtual WEMFace * addFace()=0
Instantiates a new face and adds it to the internal faces vector.
WEMIndexVector< WEMNode > _nodes
The vector that holds all the nodes of the wem.
Definition: WEMPatch.h:340
std::vector< WEMPrimitiveValueList * > _primitiveValueLists
The registered primitive value lists vector.
Definition: WEMPatch.h:358
virtual PatchTypes getPatchType() const =0
Returns the mesh type of this patch.
void setType(std::string type)
Sets the type of the WEMPatch.
Definition: WEMPatch.h:213
void computeBoundingBox()
Computes the bounding box.
void _getReorderedIndicesForFaces(std::vector< unsigned int > &reorderedIndices)
unsigned int getId() const
Returns the unique ID of this WEMPatch.
Definition: WEMPatch.h:245
WEM * getWEM()
Returns the internal pointer to the embracing WEM.
Definition: WEMPatch.h:226
std::string getLabel() const
Returns the 'label' attribute of this WEMPatch.
Definition: WEMPatch.h:235
WEMNode * getNodeAt(unsigned int index)
Returns the node at the given index.
Definition: WEMPatch.h:91
Stores a value list where the values are associated to primitives (WEMNode, WEMEdge,...
double getMaxValue() const
Returns the maximum value.
double getMinValue() const
Returns the minimum value.
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:88
boost::graph_traits< ml_graph_ptr >::vertex_descriptor source(graph_traits< ml_graph_ptr >::edge_descriptor e, const ml_graph_ptr)
Returns the vertex descriptor for u of the edge (u,v) represented by e.
boost::graph_traits< ml_graph_ptr >::vertex_descriptor target(graph_traits< ml_graph_ptr >::edge_descriptor e, const ml_graph_ptr)
Returns the vertex descriptor for v of the edge (u,v) represented by e.
TriangulationModes
Enumeration of the triangulation modes. Note that these are 'mirrored' in the SoWEM part.
PatchTypes
Enumeration of mesh types.
@ WEM_PATCH_TRIANGLES
Patch type: all faces are triangles.
@ WEM_PATCH_QUADS
Patch type: all faces are quads.
Structure used to sort faces in z-direction.
Definition: WEMPatch.h:34
double centroidZ
Definition: WEMPatch.h:36
unsigned int index
Definition: WEMPatch.h:35
Structure to gather persistence parameters.
Helper struct for updating the progress bar while loading/saving.
Helper struct for bundling parameters to keep method interfaces small.