File: InterfaceGeometry.h

package info (click to toggle)
camitk 6.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 389,496 kB
  • sloc: cpp: 103,476; sh: 2,448; python: 1,618; xml: 984; makefile: 128; perl: 84; sed: 20
file content (315 lines) | stat: -rw-r--r-- 13,499 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
/*****************************************************************************
 * $CAMITK_LICENCE_BEGIN$
 *
 * CamiTK - Computer Assisted Medical Intervention ToolKit
 * (c) 2001-2025 Univ. Grenoble Alpes, CNRS, Grenoble INP - UGA, TIMC, 38000 Grenoble, France
 *
 * Visit http://camitk.imag.fr for more information
 *
 * This file is part of CamiTK.
 *
 * CamiTK is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * CamiTK is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with CamiTK.  If not, see <http://www.gnu.org/licenses/>.
 *
 * $CAMITK_LICENCE_END$
 ****************************************************************************/

#ifndef INTERFACEGEOMETRY_H
#define INTERFACEGEOMETRY_H

// -- vtk stuff
#include <vtkType.h>
#include <vtkSmartPointer.h>

// -- vtk stuff classes
class vtkPointSet;
class vtkTexture;
class vtkActor;
class vtkProp;
class vtkDataArray;
class vtkAlgorithm;
class vtkAlgorithmOutput;
class vtkTransform;


namespace camitk {
/**
 * @ingroup group_sdk_libraries_core_component
 *
 * @brief
 * This class describes what are the methods to implement
 * for a Geometry (rendering parameters, input/output, filters, picking parameters...)
 *
 * An InterfaceGeometry is a kind of simplifier/wrapper for vtkPointSet.
 *
 * This class defines an "interface" (in the OOP/java meaning of the term).
 * See the introduction of GoF: "Program to an interface, not an implementation."
 * To see what Erich Gamma has to say about it: http://www.artima.com/lejava/articles/designprinciplesP.html
 * To see what Bjarne Stroustrup has to say about it: http://www.artima.com/intv/modern.html
 *
 * @see Geometry
 */
class InterfaceGeometry {

public:
    /// @enum RenderingMode (and QFlags RenderingModes) handle actor rendering options (render this InterfaceGeometry as a surface, a wireframe and set of points).
    enum RenderingMode {
        None = 0x0,      ///< no rendering mode, the InterfaceGeometry is not visible
        Surface = 0x1,   ///< the surface is visible
        Wireframe = 0x2, ///< the wireframe is visible
        Points = 0x4    ///< the points are visible
    };
    Q_DECLARE_FLAGS(RenderingModes, RenderingMode)

    /// @enum EnhancedMode (and QFlags EnhancedModes) handle the way the rendering actors will be enhanced or not (from completely hidden to highlighted)
    enum EnhancedMode {
        Normal = 0x0,       ///< the object is normally displayed
        Hidden = 0x1,       ///< the object is hidden
        Shaded = 0x2,       ///< the object is shaded
        Highlighted = 0x4  ///< the object is highlighted
    };
    Q_DECLARE_FLAGS(EnhancedModes, EnhancedMode)

    /// @enum GlyphType (and QFlags GlyphTypes) is the type of glyph attached to the geometry representation
    enum GlyphType {
        NoGlyph = 0x0,      ///< there are no glyph type attached to the geometry
        Sphere = 0x1       ///< the glyph is a nice sphere
    };
    Q_DECLARE_FLAGS(GlyphTypes, GlyphType)

    /// empty virtual destructor, to avoid memory leak
    virtual ~InterfaceGeometry() = default;

    /// @name Vtk related
    /// @{
    /// get the low-level vtk data
    virtual vtkSmartPointer<vtkPointSet> getPointSet() = 0;

    /** set the low-level data set.
     * \note if there is already a vtkPointSet, this method calls DeepCopy(ds)
     *
     * \note it is very important to overload this method in your Component subclass as this will be called by all the operators
     *  that operates a change directly on the data.
     */
    virtual void setPointSet(vtkSmartPointer<vtkPointSet>) = 0;

    /// set the point data (may contains a lookup table). \note values have to be in interval [0..1]
    virtual void setPointData(vtkSmartPointer<vtkDataArray>) = 0;

    /// set the transformation for 3D representation
    virtual void setMeshWorldTransform(vtkSmartPointer<vtkTransform>) = 0;


    /** get the custom algorithm pipeline input.
      * This method returns the unmodified data that you have to use
      * as an input for your filter/algorithm.
      * I.e. if you want to temporarily apply some filter/algorithm to the InterfaceGeometry
      * call this method to get the input of your filter/algorithm pipeline.
      * Typically, your custom filter/algorithm connection should start with:
      * \code
      *    vtkSomeAlgorithm *startFilter = vtkSomeAlgorithm::New();
      *    startFilter->SetInputConnection(theAbstractGeometry->getDataPort());
      *    ...
      *    // in the end call setDataConnection()
      * \endcode
      *
      * @see setDataConnection()
      * @see Geometry
      */
    virtual vtkSmartPointer<vtkAlgorithmOutput> getDataPort() const = 0;

    /** Set/reset the connection for the InterfaceGeometry internal algorithm.
      * This method sets the input for the InterfaceGeometry mapping/rendering pipeline.
      * Your should call this method to have the correct rendering of
      * your custom filter/algorithm pipelines.
      * Typically, your custom filter/algorithm connection should end with:
      *
      * \code
      *    // begining of the custom filter/algorithm pipelines (don't forget to call getDataPort()!)
      *    ...
      *    theAbstractGeometry->setDataConnection(endFilter->GetOutputPort());
      * \endcode
      *
      * To remove your custom pipeline, either call setDataConnection(nullptr) or
      * theAbstractGeometry->setDataConnection(theAbstractGeometry->getDataPort())
      *
      * @see getDataPort()
      * @see Geometry
      */
    virtual void setDataConnection(vtkSmartPointer<vtkAlgorithmOutput>) = 0;

    /// Set a texture to this object.
    virtual void setTexture(vtkSmartPointer<vtkTexture>) = 0;

    /** This method is called when a vtkPoint included in the vtk representation was picked.
     *
     *  When the picking mode is set in InteractiveViewer to POINT_PICKING
     *  the vtk picker can select a specific vtkPoint in the big Geometry.
     *
     *  A Component re-implementing this method can manage a specific selection process (or any other suitable
     *  action).
     *
     *  @param pointId the vtkPoint id that was selected by picking
     *  @param pickingIsSelecting indicates if the current picking session is selecting or unselecting
     *  @see InteractiveViewer
     */
    virtual void pointPicked(vtkIdType pointId, bool pickingIsSelecting) = 0;

    /** This method is called when a vtkCell included in the vtk representation was picked.
     *
     *  This is the same as method getChildComponentFromVtkPointId, but for CELL_PICKING.
     *
     *  A Component re-implementing this method can manage a specific selection process (or any other suitable
     *  action).
     *
     *  @param cellId the vtkCell id that was selected by picking
     *  @param pickingIsSelecting indicates if the current picking session is selecting or unselecting
     *  @see InteractiveViewer
     */
    virtual void cellPicked(vtkIdType cellId, bool pickingIsSelecting) = 0;

    /// Return the actor for the representation mode, nullptr if the actor doesn't exist.
    virtual vtkSmartPointer<vtkActor> getActor(const RenderingModes) = 0;
    ///@}

    /// @name manage extra prop associated with an InterfaceGeometry
    /// @{
    /// TODO
    /// - put all this management into a dedicated interface
    /// - remove it from InterfaceBitMap and InterfaceGeometry
    /// - remove it from Slice and Geometry helper classes
    /// - create a new associated helper class
    /// - update Component class and all other code using it (if needed)
    /// Note : beware that Geometry requires this to manage to at least "label" and "glyph" extra actors

    /// Return the vtkProp (actors, volumes and annotations) corresponding to the given name
    virtual vtkSmartPointer<vtkProp> getProp(const QString&) = 0;

    /// return the number of additional prop
    virtual unsigned int getNumberOfProp() const = 0;

    /// return an additional prop by its index
    virtual vtkSmartPointer<vtkProp> getProp(unsigned int) = 0;

    /** remove a given additional prop.
     * @return true if effictively done
     */
    virtual bool removeProp(const QString&) = 0;

    /** insert an additional prop, defining it by its name  (default visibility = false).
     *  @return true if the additional prop was added (i.e. another additional prop of the same name does not exist)
     */
    virtual bool addProp(const QString&,  vtkSmartPointer<vtkProp>) = 0;

    /** update position and text of the label prop
     */
    virtual void updateLabel(const QString& label) = 0;

    ///@}

    /// @name Helpers methods
    /// @{

    /// compute the object's bounding box [xmin,xmax, ymin,ymax, zmin,zmax]
    /// @param bounds the 6-sized double tab of the bounding box (in 3D).
    /// @warning bounds must points a 6 double-sized tab minimum.
    virtual void getBounds(double* bounds) = 0;

    /// compute the object's bounding sphere radius
    virtual double getBoundingRadius() = 0;

    /// set a given point position
    virtual void setPointPosition(const unsigned int orderNumber, const double x, const double y, const double z) = 0;

    ///@}

    /// @name rendering mode settings
    /// @{
    /// Set the actor associated to a rendering mode visible or not.
    virtual void setRenderingModes(const RenderingModes) = 0;

    /// Return if the actor associated to a rendering mode is currently visible or not.
    virtual const RenderingModes getRenderingModes() const = 0;

    /// set the enhanced mode
    virtual void setEnhancedModes(const EnhancedModes) = 0;

    /// get the current enhanced mode
    virtual const EnhancedModes getEnhancedModes() const = 0;

    /// Set the color of given representation modes.
    /// @param color the 4-sized double tab of color (r,g,b,a) of the actor.
    /// @warning color must points a 4 double-sized tab minimum.
    virtual void setActorColor(const RenderingModes, double* color) = 0;

    /// Set the color of given representation modes.
    virtual void setActorColor(const RenderingModes, const double, const double, const double) = 0;

    /// Get the color of given representation modes in the second parameter.
    /// @param color the 4-sized double tab of color (r,g,b,a) of the actor.
    /// @param ignoreEnhancedModes Return the color without considering the changes that may be due to enhanced modes (highlight)
    /// @warning color must points a 4 double-sized tab minimum.
    virtual void getActorColor(const RenderingModes mode, double* color, bool ignoreEnhancedModes = false) const = 0;

    /// Set an (r,g,b) color to all representation modes, without changing the opacity.
    virtual void setColor(const double, const double, const double) = 0;

    /// Set an (r,g,b,a) color to all representation modes.
    virtual void setColor(const double, const double, const double, const double) = 0;

    /// Set the opacity of this representation modes. WARNING color field (surfaceColor, ...) are not modified!
    virtual void setActorOpacity(const RenderingModes, const double) = 0;

    /// Return the opacity of a given renderng mode.
    virtual double getActorOpacity(const RenderingModes) const = 0;

    /// Set the opacity of this object. WARNING color field (surfaceColor, ...) are not modified!
    virtual void setOpacity(const double) = 0;

    /// Set the mapper scalar range
    virtual void setMapperScalarRange(double min, double max) = 0;

    /** Set the glyph type (a glyph is a geometric representation attached to every point in the input dataset).
      * The glyph size is needed when the type is not NoGlyph (the size value is used depending on the current GlyphTypes) :
      * - if type is Sphere, size is the radius for the sphere (this is the default)
      * - if type is NoGlyph, then no glyph are shown
      *
      * To show the glyph call getProp("glyph")->SetVisibility(true) or getProp("glyph")->VisibilityOn().
      *
      * @param type the glyph type
      * @param size size of the glyph (default is 0.0)
      */
    virtual void setGlyphType(const GlyphTypes type, const double size = 0.0) = 0;

    /** Set the lines as tubes (<b>works only for vtkDataSet representation that contains lines</b>)
     * @param isTubes activate tube representation of lines
     * @param radiusFromLength radius of tubes is computed as a proportion of line length
     * @param radiusFactor radius of tubes will be : radiusFactor*lineLength if radiusFromLength is true, radiusFactor if it is false
     * @param numberOfSides Number of sides of the tubes
     */
    virtual void setLinesAsTubes(bool isTubes = true, bool radiusFromLength = true, double radiusFactor = 1.0 / 40.0, int numberOfSides = 5) = 0;

    virtual void setColorMode(int vtkColorMode = VTK_COLOR_MODE_DEFAULT) = 0;

    ///@}
};


}

// declare the | aka OR operators
Q_DECLARE_OPERATORS_FOR_FLAGS(camitk::InterfaceGeometry::RenderingModes)
Q_DECLARE_OPERATORS_FOR_FLAGS(camitk::InterfaceGeometry::GlyphTypes)
Q_DECLARE_OPERATORS_FOR_FLAGS(camitk::InterfaceGeometry::EnhancedModes)


#endif