File: ContourWidget.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 (138 lines) | stat: -rw-r--r-- 5,134 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
/*****************************************************************************
 * $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 CONTOURWIDGET_H
#define CONTOURWIDGET_H

#include <Action.h>
#include <MeshComponent.h>
#include <ImageComponent.h>
#include <Transformation.h>

// disable warning generated by clang about the surrounded headers
#include <CamiTKDisableWarnings>
#include <vtkSmartPointer.h>
#include <vtkContourWidget.h>
#include <vtkBoundedPlanePointPlacer.h>
#include <CamiTKReEnableWarnings>

#include <QObject>
#include <QFrame>
#include <QMap>

/** Adding a contour widget to the currently selected image component
 * To simplify this class inherits from both CamiTK Action and VTK Command, for real life code, please
 * add a specific/separated class inheriting from vtkCommand.
 */
class ContourWidget : public camitk::Action {
    Q_OBJECT

public:
    /// Default Constructor
    ContourWidget(camitk::ActionExtension* extension);

    /// Default Destructor
    virtual ~ContourWidget() = default;

    /// method called when the action when the action is triggered (i.e. started)
    virtual QWidget* getWidget();

public slots:
    /** this method is automatically called when the action is triggered.
      * Call getTargets() method to get the list of components to use.
      * \note getTargets() is automatically filtered so that it only contains compatible components,
      * i.e., instances of ImageComponent (or a subclass).
      */
    virtual camitk::Action::ApplyStatus apply();

    /// close the current contour
    void closeContour();

    /// delete current contour, connect to current image and current mesh destroyed() signal
    void deleteContour();

    /// update the action GUI (= action widget) information (number of points)
    void update();

    // duplicate the current contour but start a new mesh
    void duplicateContour();

private:
    /// this action widget
    QFrame* myWidget;

    /// currently selected image component
    camitk::ImageComponent* currentImage;

    /// the mesh component build by the contour widget.
    /// Its frame is the same as the data image frame.
    camitk::MeshComponent* currentMesh;

    /// the interactive contour representation
    vtkSmartPointer<vtkContourWidget> contourWidget;

    /// Control the user interaction with the contour widget
    /// Produces the vtkPointSet that will be both:
    /// - the input of the transformFilter to display the contour in the 2D viewers
    /// - the MeshComponent vtkPointSet that will itself create its actors for the 3D viewer
    vtkSmartPointer<vtkCommand> contourWidgetCommand;

    /// placer for the contour representation that must
    /// - be fixed to the normal plane of the selected 2D viewer
    /// - move with the selected slice id
    /// the translation from the data frame of the image to the current slice
    /// is expressed in the data frame (e.g for the first slice the translation in 0,
    /// for the last slice it is equal to the nbVoxel*voxelSize (in the normal plane of
    /// the current 2D viewer)
    /// This placer is needed in order to show the vtkContourWidget at the correct
    /// place inside the 2D viewer and will be used by the contour representation
    /// to create the mesh at the right place in space.
    vtkSmartPointer<vtkBoundedPlanePointPlacer> frontPlanePlacer;

    /// The 2D viewer currently selected (0=axial, 1=coronal and 2=sagittal)
    int selectedViewer;

    /// initialize the contour widget
    /// @return false if the contour could not be created, true otherwise
    bool initContour();

    /// create the MeshComponent from the current contour
    void initMesh();

    /// update the contour visualization (vtkContourWidget + MeshComponent)
    void updateContourAndMesh();

    /// compute the current transformation (translation from the image main frame to the current slice)
    void updateTransformation();

    /// get the viewer string corresponding to the current selected viewer name
    /// axial = 0, coronal = 1, sagittal = 2
    QString getViewerName();

    /// get the viewer string list
    QStringList getViewerNameList();

};

#endif // CONTOURWIDGET_H