|
| 1 | +/** |
| 2 | + * Widget de saisie d'un tronc dans l'espace. |
| 3 | + * @author Charles PIGNEROL, CEA/DAM/DCLC |
| 4 | + * @date 03/10/2025 |
| 5 | + */ |
| 6 | + |
| 7 | +#ifndef VTK_FRUSTUM_WIDGET_H |
| 8 | +#define VTK_FRUSTUM_WIDGET_H |
| 9 | + |
| 10 | +#include <vtkActor.h> |
| 11 | +#include <vtk3DWidget.h> |
| 12 | +#include <vtkActor.h> |
| 13 | +#include <vtkCommand.h> |
| 14 | +#include <vtkImplicitPlaneWidget.h> |
| 15 | +#include <vtkPolyDataMapper.h> |
| 16 | +#include <vtkFrustumSource.h> |
| 17 | +#include <vtkPlane.h> |
| 18 | +#include <vtkPlanes.h> |
| 19 | +#include <vtkTubeFilter.h> |
| 20 | + |
| 21 | +#include <map> |
| 22 | +#include <vector> |
| 23 | + |
| 24 | +class vtkPlaneWidgetCallbackCommand; |
| 25 | + |
| 26 | +/** |
| 27 | + * <P>Un widget pour saisir interactivement un tronc. Un tronc est ici défini comme étant la zone intérieure à 6 plans qui en définissent la bordure. |
| 28 | + * Les plans sont numérotés de 0 à 6 comme suit : gauche, droit, haut, bas, derrière, devant.</P> |
| 29 | + * |
| 30 | + * <P>tests/frustum_widget.cpp est un exemple d'utilisation avec callback permettant de connaître le tronc défini.</P> |
| 31 | + */ |
| 32 | +class vtkFrustumWidget : public vtk3DWidget |
| 33 | +{ |
| 34 | + friend class vtkPlaneWidgetCallbackCommand; |
| 35 | + |
| 36 | + public : |
| 37 | + |
| 38 | + vtkTypeMacro(vtkFrustumWidget,vtk3DWidget) |
| 39 | + |
| 40 | + /** |
| 41 | + * Pour l'accès au paramétrage des 6 plans du tronc (ordre de la classe vtkFrustumSource). |
| 42 | + */ |
| 43 | + enum SIDE { LEFT, RIGHT, BOTTOM, TOP, BACK, FRONT }; |
| 44 | + |
| 45 | + /** |
| 46 | + * Créé une représentation de type vtkConstrainedPointHandleRepresentation2. |
| 47 | + */ |
| 48 | + virtual void CreateDefaultRepresentation ( ); |
| 49 | + |
| 50 | + /** |
| 51 | + * Instanciation de la classe. |
| 52 | + */ |
| 53 | + static vtkFrustumWidget* New ( ); |
| 54 | + |
| 55 | + //@{ |
| 56 | + /** |
| 57 | + * Methods that satisfy the superclass' API. |
| 58 | + */ |
| 59 | + virtual void SetInteractor (vtkRenderWindowInteractor* iren); |
| 60 | + virtual void SetEnabled (int); |
| 61 | + virtual void PlaceWidget(double bounds [6]); |
| 62 | + virtual void SetPlaceFactor (double factor); |
| 63 | + //@} |
| 64 | + |
| 65 | + /** |
| 66 | + * @param indice du plan modifié ou consulté. |
| 67 | + * @param nouvelle origine. |
| 68 | + * @param nouvelle normale. |
| 69 | + */ |
| 70 | + virtual void SetPlane (SIDE p, double origin [3], double normal [3]); |
| 71 | + virtual void GetPlane (SIDE p, double origin [3], double normal [3]); |
| 72 | + virtual void SetPlaneOrigin (SIDE p, double origin [3]); |
| 73 | + virtual void GetPlaneOrigin (SIDE p, double origin [3]); |
| 74 | + virtual void SetPlaneNormal (SIDE p, double normal [3]); |
| 75 | + virtual void GetPlaneNormal (SIDE p, double normal [3]); |
| 76 | + |
| 77 | + //@{ |
| 78 | + /** |
| 79 | + * Modifications des propriété du widget. |
| 80 | + */ |
| 81 | + |
| 82 | + // @param Opacité du tronc (6 plans) affiché. |
| 83 | + virtual void SetOpacity (double opacity); |
| 84 | + |
| 85 | + /** |
| 86 | + * @param Composantes RGB des 3 interacteurs axiaux (gauche/droite, bas/haut, arrière/avant). |
| 87 | + * @warning SetInteractorEnabled doit être invoqué après On ( ) pour être effectif. |
| 88 | + */ |
| 89 | + virtual void SetInteractorColor (SIDE axis, double rgb [3]); |
| 90 | + virtual void SetInteractorEnabled (SIDE axis, bool enabled); |
| 91 | + //@} |
| 92 | + |
| 93 | + /** |
| 94 | + * @return La boite englobante du tronc. |
| 95 | + */ |
| 96 | + virtual void GetBounds (double bounds [6]); |
| 97 | + |
| 98 | + /** |
| 99 | + * @return La définition du tronc. |
| 100 | + */ |
| 101 | + virtual const vtkPlanes& GetPlanes ( ) const; |
| 102 | + virtual vtkPlanes& GetPlanes ( ); |
| 103 | + |
| 104 | + /** |
| 105 | + * Modification des 6 plans. |
| 106 | + */ |
| 107 | + virtual void SetPlanes (vtkPlanes& planes); |
| 108 | + |
| 109 | + /** |
| 110 | + * Ajoute le couple de plans p1 et p2 de la liste des paires de plan devant rester parallèles. |
| 111 | + * Dans sa forme à 1 argument le second plan est celui implicitement apairé (gauche/droite, bas/haut, arrière/avant). |
| 112 | + */ |
| 113 | + virtual void AddParallelPlanes (SIDE p1, SIDE p2); |
| 114 | + virtual void AddParallelPlanes (SIDE p); |
| 115 | + |
| 116 | + /** |
| 117 | + * Enlève le couple de plans p1 et p2 de la liste des paires de plan devant rester parallèles. |
| 118 | + */ |
| 119 | + virtual void RemoveParallelPlanes (SIDE p1, SIDE p2); |
| 120 | + virtual void RemoveParallelPlanes (SIDE p); |
| 121 | + |
| 122 | + /** |
| 123 | + * @return Les couples de plans restant parallèles. |
| 124 | + */ |
| 125 | + virtual std::map<int, int> GetParallelPlanes ( ) const; |
| 126 | + |
| 127 | + |
| 128 | + protected : |
| 129 | + |
| 130 | + /** |
| 131 | + * Classe permettant de contourner des difficultés rencontrées. |
| 132 | + * Un objectif est également de ne pas grossir les interacteurs car par défaut ils prennent beaucoup de place |
| 133 | + * et il en faut 6 pour le tronc. |
| 134 | + */ |
| 135 | + class vtkInternalPlaneWidget : public vtkImplicitPlaneWidget |
| 136 | + { |
| 137 | + public : |
| 138 | + |
| 139 | + static vtkInternalPlaneWidget* New ( ); |
| 140 | + |
| 141 | + /** |
| 142 | + * Ne grossissent pas les interacteurs. |
| 143 | + */ |
| 144 | + virtual void PlaceWidget (double bounds [6]); |
| 145 | + virtual void SizeHandles ( ); |
| 146 | + |
| 147 | + /** |
| 148 | + * Nouvelle position => actualise la représentation sans recalculer la position qui est transmise en argument. |
| 149 | + */ |
| 150 | + virtual void UpdateRepresentation (double origin [3]); |
| 151 | + |
| 152 | + /** |
| 153 | + * @return Le rayon de la poignée. |
| 154 | + */ |
| 155 | + virtual double GetHandleRadius ( ); |
| 156 | + |
| 157 | + /** |
| 158 | + * Affecte la couleur transmise en argument à l'interacteur. |
| 159 | + */ |
| 160 | + virtual void SetInteractorColor (double rgb [3]); |
| 161 | + |
| 162 | + /** |
| 163 | + * (Dés)active l'interacteur tout en le laissant visible. |
| 164 | + */ |
| 165 | + virtual void SetInteractorEnabled (bool enabled); |
| 166 | + |
| 167 | + |
| 168 | + protected : |
| 169 | + |
| 170 | + vtkInternalPlaneWidget ( ); |
| 171 | + virtual ~vtkInternalPlaneWidget ( ); |
| 172 | + |
| 173 | + |
| 174 | + private : |
| 175 | + |
| 176 | + vtkInternalPlaneWidget (const vtkInternalPlaneWidget&); |
| 177 | + vtkInternalPlaneWidget& operator = (const vtkInternalPlaneWidget&); |
| 178 | + |
| 179 | + /// true si en cours de placement du widget. |
| 180 | + bool _placing; |
| 181 | + }; // class vtkInternalPlaneWidget |
| 182 | + |
| 183 | + /** |
| 184 | + * @return le p-ième plan du tronc |
| 185 | + */ |
| 186 | + virtual vtkInternalPlaneWidget* GetPlane (SIDE p); |
| 187 | + virtual const vtkInternalPlaneWidget* GetPlane (SIDE p) const; |
| 188 | + |
| 189 | + /** |
| 190 | + * Actualisation lors de la modification d'un plan. |
| 191 | + */ |
| 192 | + virtual void Update (vtkInternalPlaneWidget* caller); |
| 193 | + |
| 194 | + |
| 195 | + private : |
| 196 | + |
| 197 | + /** |
| 198 | + * Constructeur. |
| 199 | + */ |
| 200 | + vtkFrustumWidget ( ); |
| 201 | + |
| 202 | + /** |
| 203 | + * Destructeur. RAS. |
| 204 | + */ |
| 205 | + virtual ~vtkFrustumWidget ( ); |
| 206 | + |
| 207 | + /** |
| 208 | + * Constructeur et opérateur = : interdits. |
| 209 | + */ |
| 210 | + vtkFrustumWidget (const vtkFrustumWidget&); |
| 211 | + vtkFrustumWidget& operator = (const vtkFrustumWidget&); |
| 212 | + |
| 213 | + /** Le tronc et sa représentation. */ |
| 214 | + vtkSmartPointer<vtkFrustumSource> _frustum; |
| 215 | + vtkSmartPointer<vtkPlanes> _planes; |
| 216 | + vtkSmartPointer<vtkPolyDataMapper> _frustumMapper; |
| 217 | + vtkSmartPointer<vtkActor> _frustumActor; |
| 218 | + /** Le contour du tronc et sa représentation. */ |
| 219 | + vtkSmartPointer<vtkTubeFilter> _contourFilter; |
| 220 | + vtkSmartPointer<vtkPolyDataMapper> _contourMapper; |
| 221 | + vtkSmartPointer<vtkActor> _contourActor; |
| 222 | + /** Les widgets interactifs. */ |
| 223 | + std::vector<vtkSmartPointer<vtkInternalPlaneWidget>> _planeWidgets; |
| 224 | + vtkSmartPointer<vtkPlaneWidgetCallbackCommand> _planeCallback; |
| 225 | + /** Pour des opérations temporaires de récupération de données. */ |
| 226 | + vtkSmartPointer<vtkPlane> _tmpPlane; |
| 227 | + |
| 228 | + /* Les paires de plans parallèles entre-eux. */ |
| 229 | + std::map<int, int> _parallelPlanes; |
| 230 | +}; // class vtkFrustumWidget |
| 231 | + |
| 232 | + |
| 233 | +class vtkPlaneWidgetCallbackCommand : public vtkCommand |
| 234 | +{ |
| 235 | + public : |
| 236 | + |
| 237 | + static vtkPlaneWidgetCallbackCommand* New ( ) |
| 238 | + { return new vtkPlaneWidgetCallbackCommand ( ); } |
| 239 | + |
| 240 | + virtual ~vtkPlaneWidgetCallbackCommand ( ) |
| 241 | + { } |
| 242 | + |
| 243 | + virtual void Execute (vtkObject* caller, unsigned long id, void* calldata); |
| 244 | + |
| 245 | + virtual void SetFrustumWidget (vtkFrustumWidget* widget) |
| 246 | + { |
| 247 | + _frustumWidget = widget; |
| 248 | + } // SetFrustumWidget |
| 249 | + |
| 250 | + protected : |
| 251 | + |
| 252 | + vtkPlaneWidgetCallbackCommand ( ) |
| 253 | + : vtkCommand ( ), _frustumWidget (0) |
| 254 | + { } |
| 255 | + |
| 256 | + |
| 257 | + private : |
| 258 | + |
| 259 | + vtkPlaneWidgetCallbackCommand (const vtkPlaneWidgetCallbackCommand&) |
| 260 | + { assert (0 && "vtkPlaneWidgetCallbackCommand copy constructor is not allowed."); } |
| 261 | + vtkPlaneWidgetCallbackCommand& operator = (const vtkPlaneWidgetCallbackCommand&) |
| 262 | + { |
| 263 | + assert (0 && "vtkPlaneWidgetCallbackCommand assignment operator is not allowed."); |
| 264 | + return *this; |
| 265 | + } |
| 266 | + |
| 267 | + vtkFrustumWidget* _frustumWidget; |
| 268 | +}; // class vtkPlaneWidgetCallbackCommand |
| 269 | + |
| 270 | + |
| 271 | +#endif // VTK_FRUSTUM_WIDGET_H |
0 commit comments