Skip to content

Commit 8e89c89

Browse files
author
Charles PIGNEROL
committed
Version 5.17.0. vtkTransformHelper class. Added CommonComputationalGeometry dependency for VTK 7.
1 parent d8560b1 commit 8e89c89

5 files changed

Lines changed: 300 additions & 3 deletions

File tree

cmake/version.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
#
44

55
set (VTK_CONTRIB_MAJOR_VERSION "5")
6-
set (VTK_CONTRIB_MINOR_VERSION "16")
7-
set (VTK_CONTRIB_RELEASE_VERSION "1")
6+
set (VTK_CONTRIB_MINOR_VERSION "17")
7+
set (VTK_CONTRIB_RELEASE_VERSION "0")
88
set (VTK_CONTRIB_VERSION ${VTK_CONTRIB_MAJOR_VERSION}.${VTK_CONTRIB_MINOR_VERSION}.${VTK_CONTRIB_RELEASE_VERSION})
99

1010

src/VtkContrib/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ if (VTK_7)
1616
set (VTK_PARALLEL_PACKAGES vtkParallelMPI vtkRenderingParallel vtkParallelCore)
1717
endif (MPI_mpi_LIBRARY)
1818
if (USE_OPENGL_BACKEND)
19-
set (VTK_REQUIRED_PACKAGES vtkRenderingLOD vtkInteractionStyle vtkFiltersHybrid vtkFiltersExtraction vtkFiltersCore #
19+
set (VTK_REQUIRED_PACKAGES vtkRenderingLOD vtkInteractionStyle vtkFiltersHybrid vtkFiltersExtraction vtkFiltersCore vtkCommonComputationalGeometry #
2020
vtkCommonTransforms vtkCommonMath vtkInteractionWidgets vtkImagingHybrid vtkRenderingOpenGL #
2121
vtkRenderingFreeType vtkRenderingLabel vtkFiltersImaging vtkRenderingGL2PS vtkIOImage vtkIOLegacy #
2222
vtkIOExport vtkIOXML vtkIOCore vtkCommonExecutionModel vtkCommonDataModel vtkRenderingAnnotation #
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/**
2+
* \file vtkSimpleTransformMemento.h
3+
* \author Charles PIGNEROL, CEA/DAM/DCLC
4+
* \date 24/03/2026
5+
*/
6+
#ifndef VTK_TRANSFORM_HELPER_H
7+
#define VTK_TRANSFORM_HELPER_H
8+
9+
#include "VtkContrib/vtk_versions.h"
10+
#include <vtkTransform.h>
11+
#include <vtkProp3D.h>
12+
13+
14+
/**
15+
* Classe permettant d'avoir des services autour de la classe vtkTransform de VTK.
16+
*/
17+
class vtkTransformHelper
18+
{
19+
public :
20+
21+
/**
22+
* Effectue une action de "shrink" de la propriété reçue en premier argument du facteur donné en second argument. Cette action
23+
* est matérialisée par une mise à l'échelle de "factor" et d'un déplacement.
24+
*/
25+
static void ShrinkProperty (vtkProp3D& prop3D, double factor);
26+
27+
/**
28+
* Effectue une action de "shrink" de la propriété reçue en premier argument du facteur donné en second argument. Cette action
29+
* est matérialisée par une mise à l'échelle de "factor" et d'un déplacement. Les coordonnées du centre de la propriété
30+
* sont transmises en argument, et non plus récupérées auprès de celle-ci.
31+
*/
32+
static void ShrinkProperty (vtkProp3D& prop3D, double factor, double xCenter, double yCenter, double zCenter);
33+
34+
/**
35+
* Classe permettant d'avoir une représentation structurée d'une instance "simple" de la classe vtkTransform, à savoir une translation et une
36+
* rotation autour de chaque axe, l'ensemble des transformations étant toutes intrinsèques ou extrinsèques.
37+
* Classe créée à la base pour pouvoir, à partir d'une instance de cette classe conservée par exemple dans une IHM, recréer une instance de
38+
* vtkTransform à partir de la méthode vtkTransformHelper::CreateTransform (vtkSimpleTransformMemento).
39+
*
40+
* Une transformation intrinsèque est nue transformation géométrique qui est appliquée directement à un objet ou à un système de coordonnées
41+
* dans son propre repère. Contrairement aux transformations extrinsèques, qui sont appliquées par rapport à un repère externe, les
42+
* transformations intrinsèques modifient les propriétés internes de l'objet ou du repère lui-même (position, orientation, forme, taille).
43+
*
44+
* Par convention :
45+
*
46+
* Transformation extrinsèque :
47+
* - Les mises à l'échelle sont effectuées en premier,
48+
* - Selon translationFirst la translation est effectuée avant ou après les rotations,
49+
* - Les rotations sont effectuées autour de Oz, puis autour de Ox, puis autour de Oy.
50+
*
51+
* Transformation intrinsèque :
52+
* - Les mises à l'échelle sont effectuées en premier,
53+
* - Selon translationFirst la translation est effectuée avant ou après les rotations,
54+
* - Les rotations sont effectuées autour de Oy (angle phi), puis autour de Oz (angle theta), puis autour de Ox (angle omega).
55+
*/
56+
struct vtkSimpleTransformMemento
57+
{
58+
public :
59+
60+
bool isExtrinsic;
61+
62+
// Les éventuelles mises à l'échelle. Effectuées avant toute autre opération.
63+
double scaleX, scaleY, scaleZ;
64+
65+
// Paramétrage transformation extrinsèque :
66+
double xoy, xoz, yoz; // theta, phi, omega
67+
double dx, dy, dz;
68+
bool translationFirst;
69+
70+
// Pour l'application cliente :
71+
void* userData;
72+
73+
/**
74+
* Instancie une transformation extrinsèque par défaut.
75+
*/
76+
vtkSimpleTransformMemento ( );
77+
78+
/**
79+
* Constructeur de copie. RAS.
80+
*/
81+
vtkSimpleTransformMemento (const vtkSimpleTransformMemento& m);
82+
83+
/**
84+
* Opérateur =. RAS.
85+
*/
86+
vtkSimpleTransformMemento& operator = (const vtkSimpleTransformMemento& m);
87+
88+
/**
89+
* Opérateur ==
90+
* @return true si les paramètres décrivent la même transformation. Dest attributs peuvent donc être différents si ils ne contribuent
91+
* pas à la description de la transformation.
92+
*/
93+
bool operator == (const vtkSimpleTransformMemento& m) const;
94+
bool operator != (const vtkSimpleTransformMemento& m) const;
95+
96+
/**
97+
* @return true si les paramètres correspondent à une absence de transformation.
98+
*/
99+
bool IsIdentity ( ) const;
100+
101+
/**
102+
* Destructeur. RAS.
103+
*/
104+
~vtkSimpleTransformMemento ( );
105+
}; // struct vtkSimpleTransformMemento
106+
107+
/**
108+
* Créé une instance de la classe vtkTransform conformément aux paramètres transmis en arguments.
109+
* La destruction de l'instance créée est à la charge de l'appelant.
110+
*/
111+
static vtkTransform* CreateTransform (const vtkSimpleTransformMemento& memento);
112+
113+
114+
private :
115+
116+
vtkTransformHelper ( );
117+
118+
vtkTransformHelper (const vtkTransformHelper&);
119+
120+
vtkTransformHelper& operator = (const vtkTransformHelper&);
121+
122+
~vtkTransformHelper ( );
123+
}; // class vtkTransformHelper
124+
125+
126+
#endif // VTK_TRANSFORM_HELPER_H
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
#include "VtkContrib/vtkTransformHelper.h"
2+
3+
#include <VtkContrib/vtkFloatingPointType.h>
4+
#include <assert.h>
5+
6+
7+
8+
// ================================================== LA STRUCTURE vtkSimpleTransformMemento ==================================================
9+
10+
vtkTransformHelper::vtkSimpleTransformMemento::vtkSimpleTransformMemento ( )
11+
: isExtrinsic (true), scaleX (1.), scaleY (1.), scaleZ (1.),
12+
xoy (0.), xoz (0.), yoz (0.), dx (0.), dy (0.), dz (0.), translationFirst (true), userData (0)
13+
{
14+
} // vtkSimpleTransformMemento
15+
16+
vtkTransformHelper::vtkSimpleTransformMemento::vtkSimpleTransformMemento (const vtkTransformHelper::vtkSimpleTransformMemento& m)
17+
: isExtrinsic (m.isExtrinsic), scaleX (m.scaleX), scaleY (m.scaleY), scaleZ (m.scaleZ),
18+
xoy (m.xoy), xoz (m.xoz), yoz (m.yoz), dx (m.dx), dy (m.dy), dz (m.dz), translationFirst (m.translationFirst), userData (m.userData)
19+
{
20+
} // vtkSimpleTransformMemento::vtkSimpleTransformMemento
21+
22+
23+
vtkTransformHelper::vtkSimpleTransformMemento& vtkTransformHelper::vtkSimpleTransformMemento::operator = (const vtkTransformHelper::vtkSimpleTransformMemento& m)
24+
{
25+
isExtrinsic = m.isExtrinsic;
26+
scaleX = m.scaleX;
27+
scaleY = m.scaleY;
28+
scaleZ = m.scaleZ;
29+
xoy = m.xoy;
30+
xoz = m.xoz;
31+
yoz = m.yoz;
32+
dx = m.dx;
33+
dy = m.dy;
34+
dz = m.dz;
35+
translationFirst = m.translationFirst;
36+
userData = m.userData;
37+
38+
return *this;
39+
} // vtkSimpleTransformMemento::operator =
40+
41+
42+
vtkTransformHelper::vtkSimpleTransformMemento::~vtkSimpleTransformMemento ( )
43+
{
44+
} // vtkSimpleTransformMemento::~vtkSimpleTransformMemento
45+
46+
47+
bool vtkTransformHelper::vtkSimpleTransformMemento::operator == (const vtkTransformHelper::vtkSimpleTransformMemento& m) const
48+
{
49+
if ((isExtrinsic != m.isExtrinsic) || (scaleX != m.scaleX) || (scaleY != m.scaleY) || (scaleZ != m.scaleZ))
50+
return false;
51+
52+
if ((isExtrinsic != m.isExtrinsic) || (xoy != m.xoy) || (xoz != m.xoz) || (yoz != m.yoz) || (dx != m.dx) || (dy != m.dy) || (dz != m.dz) || (translationFirst != m.translationFirst))
53+
return false;
54+
55+
return true;
56+
} // vtkSimpleTransformMemento::operator ==
57+
58+
59+
bool vtkTransformHelper::vtkSimpleTransformMemento::operator != (const vtkTransformHelper::vtkSimpleTransformMemento& m) const
60+
{
61+
return !(m == *this);
62+
} // vtkSimpleTransformMemento::operator !=
63+
64+
65+
bool vtkTransformHelper::vtkSimpleTransformMemento::IsIdentity ( ) const
66+
{
67+
if ((0. != xoy) || (0. != xoz) || (0. != yoz) || (0. != dx) || (0. != dy) || (0. != dz))
68+
return false;
69+
70+
return true;
71+
} // vtkSimpleTransformMemento::IsIdentity
72+
73+
74+
// ======================================================= LA CLASSE vtkTransformHelper =======================================================
75+
76+
vtkTransformHelper::vtkTransformHelper ( )
77+
{
78+
assert (0 && "vtkTransformHelper::vtkTransformHelper is not allowed.");
79+
} // vtkTransformHelper::vtkTransformHelper
80+
81+
82+
vtkTransformHelper::vtkTransformHelper (const vtkTransformHelper&)
83+
{
84+
assert (0 && "vtkTransformHelper::vtkTransformHelper is not allowed.");
85+
} // vtkTransformHelper::vtkTransformHelper (const vtkTransformHelper&)
86+
87+
88+
vtkTransformHelper& vtkTransformHelper::operator = (const vtkTransformHelper&)
89+
{
90+
assert (0 && "vtkTransformHelper::operator = is not allowed.");
91+
return *this;
92+
} // vtkTransformHelper::operator =
93+
94+
95+
vtkTransformHelper::~vtkTransformHelper ( )
96+
{
97+
assert (0 && "vtkTransformHelper::~vtkTransformHelper is not allowed.");
98+
} // vtkTransformHelper::~vtkTransformHelper
99+
100+
101+
void vtkTransformHelper::ShrinkProperty (vtkProp3D& prop3D, double factor)
102+
{
103+
vtkFloatingPointType* center = prop3D.GetCenter ( );
104+
ShrinkProperty (prop3D, factor, center [0], center [1], center [2]);
105+
} // vtkTransformHelper::ShrinkProperty (vtkProp3D& prop3D, double factor)
106+
107+
108+
void vtkTransformHelper::ShrinkProperty (vtkProp3D& prop3D, double factor,
109+
double xCenter, double yCenter, double zCenter)
110+
{
111+
vtkTransform* transform = vtkTransform::New ( );
112+
transform->PostMultiply ( );
113+
vtkFloatingPointType origin [3];
114+
prop3D.GetOrigin (origin);
115+
vtkFloatingPointType* center = prop3D.GetCenter ( );
116+
transform->Translate (-xCenter, -yCenter, -zCenter);
117+
transform->Scale (factor, factor, factor);
118+
transform->Translate (xCenter, yCenter, zCenter);
119+
transform->Translate (-origin [0], -origin [1], -origin [2]);
120+
transform->PreMultiply ( );
121+
transform->Translate (origin [0], origin [1], origin [2]);
122+
prop3D.SetPosition (transform->GetPosition ( ));
123+
prop3D.SetScale (transform->GetScale ( ));
124+
transform->Delete ( );
125+
} // vtkTransformHelper::ShrinkProperty
126+
127+
128+
vtkTransform* vtkTransformHelper::CreateTransform (const vtkTransformHelper::vtkSimpleTransformMemento& memento)
129+
{
130+
vtkTransform* transform = vtkTransform::New ( );
131+
assert (0 != transform);
132+
133+
if ((1. != memento.scaleX) || (1. != memento.scaleY) || (1. != memento.scaleZ))
134+
transform->Scale (memento.scaleX, memento.scaleY, memento.scaleZ);
135+
136+
if (true == memento.isExtrinsic)
137+
{
138+
if (false == memento.translationFirst)
139+
transform->Translate (memento.dx, memento.dy, memento.dz);
140+
transform->RotateY (memento.xoz);
141+
transform->RotateX (memento.yoz);
142+
transform->RotateZ (memento.xoy);
143+
if (true == memento.translationFirst)
144+
transform->Translate (memento.dx, memento.dy, memento.dz);
145+
} // if (true == memento.isExtrinsic)
146+
else
147+
{
148+
if (true == memento.translationFirst)
149+
transform->Translate (memento.dx, memento.dy, memento.dz);
150+
// RotateY(phi) → RotateZ(theta) → RotateX(omega) : chaque rotation s’applique dans le repère local courant,
151+
// méthode standard pour les angles de Tait-Bryan intrinsèques (ZYX) en robotique/aéronautique. Dixit mistral.ai.
152+
// Pour ce il faut inverser l'ordre des rotations par rapport à la même transformation mais à repère constant
153+
// (transformation extrinsèque).
154+
transform->RotateX (memento.yoz);
155+
transform->RotateZ (memento.xoy);
156+
transform->RotateY (memento.xoz);
157+
if (false == memento.translationFirst)
158+
transform->Translate (memento.dx, memento.dy, memento.dz);
159+
transform->PostMultiply ( );
160+
} // else if (true == memento.isExtrinsic)
161+
162+
return transform;
163+
} // vtkTransformHelper::CreateTransform
164+

versions.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Version 5.17.0 : 24/03/26
2+
================
3+
4+
Classe vtkTransformHelper.
5+
Ajout dépendance CommonComputationalGeometry pour VTK 7.
6+
7+
18
Version 5.16.1 : 27/02/26
29
================
310

0 commit comments

Comments
 (0)