diff --git a/cmake/version.cmake b/cmake/version.cmake index 031bc50..8011489 100644 --- a/cmake/version.cmake +++ b/cmake/version.cmake @@ -3,7 +3,7 @@ # set (VTK_CONTRIB_MAJOR_VERSION "5") -set (VTK_CONTRIB_MINOR_VERSION "8") +set (VTK_CONTRIB_MINOR_VERSION "9") set (VTK_CONTRIB_RELEASE_VERSION "0") set (VTK_CONTRIB_VERSION ${VTK_CONTRIB_MAJOR_VERSION}.${VTK_CONTRIB_MINOR_VERSION}.${VTK_CONTRIB_RELEASE_VERSION}) diff --git a/src/VtkContrib/public/VtkContrib/vtkViewCubeActor.h b/src/VtkContrib/public/VtkContrib/vtkViewCubeActor.h index 8a0f055..796277e 100644 --- a/src/VtkContrib/public/VtkContrib/vtkViewCubeActor.h +++ b/src/VtkContrib/public/VtkContrib/vtkViewCubeActor.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -87,6 +88,11 @@ class vtkViewCubeActor : public vtkPropAssembly */ virtual void PickCallback (int x, int y); + /** + * Regarde si une face du cube est pointée aux coordonnées transmises et, le cas échéant, met cette face en surbrillance. Annule ue éventuelle surbrillance antérieure d'une autre face. + */ + virtual void HighlightCallback (int x, int y); + protected: @@ -107,22 +113,28 @@ class vtkViewCubeActor : public vtkPropAssembly vtkViewCubeActor (const vtkViewCubeActor&); vtkViewCubeActor& operator = (const vtkViewCubeActor&); - vtkRenderer *Renderer, *DrivenRenderer; + vtkRenderer *Renderer, *DrivenRenderer; /** Le "cube". */ - vtkSmartPointer CubePolyData; - vtkSmartPointer CubeActor; - vtkSmartPointer CubePolyDataMapper; + vtkSmartPointer CubePolyData, HighlightPolyData; + vtkSmartPointer CubeActor, HighlightActor; + vtkSmartPointer CubePolyDataMapper, HighlightPolyDataMapper; /** Le picking sur les faces du ViewCube. */ - vtkSmartPointer CellPicker; + vtkSmartPointer CellPicker; + + /** La dernière face pickée, éventuelle face en cours de surbrillance. */ + unsigned char LastPickedFace, HighlightedFace; /** Les labels. */ - vtkSmartPointer XPlusVectorText, XMinusVectorText, YPlusVectorText, YMinusVectorText, ZPlusVectorText, ZMinusVectorText; - vtkSmartPointer XPlusActor, XMinusActor, YPlusActor, YMinusActor, ZPlusActor, ZMinusActor; + vtkSmartPointer XPlusVectorText, XMinusVectorText, YPlusVectorText, YMinusVectorText, ZPlusVectorText, ZMinusVectorText; + vtkSmartPointer XPlusActor, XMinusActor, YPlusActor, YMinusActor, ZPlusActor, ZMinusActor; + /** Les vecteurs "orientation vers le haut". */ + vtkSmartPointer ViewUpVectors; + /** L'éventuelle transformation utilisateur. */ - vtkTransform *Transform; + vtkTransform *Transform; }; // class vtkViewCubeActor diff --git a/src/VtkContrib/vtkViewCubeActor.cpp b/src/VtkContrib/vtkViewCubeActor.cpp index 22d3c92..495577f 100644 --- a/src/VtkContrib/vtkViewCubeActor.cpp +++ b/src/VtkContrib/vtkViewCubeActor.cpp @@ -2,6 +2,7 @@ #include "VtkContrib/vtkFloatingPointType.h" #include "VtkContrib/vtkTrihedron.h" +#include #include #include #include @@ -16,6 +17,7 @@ #include #include #include +#include #include @@ -88,29 +90,111 @@ void vtkViewCubeActorPickCallback::Execute (vtkObject* caller, unsigned long eve double vp [4]; ViewCube->GetRenderer ( )->GetViewport (vp); if (ViewCube->GetRenderer ( )->IsInViewport (x, y)) - { ViewCube->PickCallback (x, y); - } - // Add your custom handling code here } // if ((0 != interactor) && (0 != ViewCube)) } // vtkViewCubeActorPickCallback::Execute +// ====================================== LA CLASSE vtkViewCubeActorHighlightCallback ====================================== + +class vtkViewCubeActorHighlightCallback : public vtkCommand +{ + public : + + static vtkViewCubeActorHighlightCallback* New ( ) + { + return new vtkViewCubeActorHighlightCallback ( ); + } + + virtual void Execute (vtkObject* caller, unsigned long eventId, void* callData); + virtual void SetViewCube (vtkViewCubeActor* viewCube) + { ViewCube = viewCube; } + + + protected : + + vtkViewCubeActorHighlightCallback ( ); + + virtual ~vtkViewCubeActorHighlightCallback ( ); + + + private : + + vtkViewCubeActorHighlightCallback (const vtkViewCubeActorHighlightCallback&); + vtkViewCubeActorHighlightCallback& operator = (const vtkViewCubeActorHighlightCallback&); + vtkViewCubeActor* ViewCube; +}; // class vtkViewCubeActorHighlightCallback + + +vtkViewCubeActorHighlightCallback::vtkViewCubeActorHighlightCallback ( ) + : vtkCommand ( ), ViewCube (0) +{ + PassiveObserverOn ( ); // Indispensable pour que Execute soit appelé. +} // vtkViewCubeActorHighlightCallback::vtkViewCubeActorHighlightCallback + + +vtkViewCubeActorHighlightCallback::vtkViewCubeActorHighlightCallback (const vtkViewCubeActorHighlightCallback&) + : vtkCommand ( ), ViewCube (0) +{ + assert (0 && "vtkViewCubeActorHighlightCallback copy constructor is not allowed."); +} // vtkViewCubeActorHighlightCallback::vtkViewCubeActorHighlightCallback + + +vtkViewCubeActorHighlightCallback& vtkViewCubeActorHighlightCallback::operator = (const vtkViewCubeActorHighlightCallback&) +{ + assert (0 && "vtkViewCubeActorHighlightCallback assignment operator is not allowed."); + return *this; +} // vtkViewCubeActorHighlightCallback::operator = + + +vtkViewCubeActorHighlightCallback::~vtkViewCubeActorHighlightCallback ( ) +{ +} // vtkViewCubeActorHighlightCallback::~vtkViewCubeActorHighlightCallback + + +void vtkViewCubeActorHighlightCallback::Execute (vtkObject* caller, unsigned long eventId, void* callData) +{ + vtkRenderWindowInteractor* interactor = reinterpret_cast(caller); + + if ((0 != interactor) && (0 != ViewCube)) + { + int x = interactor->GetEventPosition ( )[0]; + int y = interactor->GetEventPosition ( )[1]; + double vp [4]; + ViewCube->GetRenderer ( )->GetViewport (vp); + if (ViewCube->GetRenderer ( )->IsInViewport (x, y)) + ViewCube->HighlightCallback (x, y); + } // if ((0 != interactor) && (0 != ViewCube)) +} // vtkViewCubeActorHighlightCallback::Execute + + // ====================================== LA CLASSE vtkViewCubeActor ====================================== vtkViewCubeActor::vtkViewCubeActor ( ) - : vtkPropAssembly ( ), Renderer (0), DrivenRenderer (0), CubePolyData ( ), CubeActor ( ), CubePolyDataMapper ( ), CellPicker ( ), + : vtkPropAssembly ( ), Renderer (0), DrivenRenderer (0), CubePolyData ( ), HighlightPolyData ( ), CubeActor ( ), HighlightActor ( ), CubePolyDataMapper ( ), HighlightPolyDataMapper ( ), + CellPicker ( ), LastPickedFace ((unsigned char)-1), HighlightedFace ((unsigned char)-1), XPlusVectorText ( ), XMinusVectorText ( ), YPlusVectorText ( ), YMinusVectorText ( ), ZPlusVectorText ( ), ZMinusVectorText ( ), - XPlusActor ( ), XMinusActor ( ), YPlusActor ( ), YMinusActor ( ), ZPlusActor ( ), ZMinusActor ( ), + XPlusActor ( ), XMinusActor ( ), YPlusActor ( ), YMinusActor ( ), ZPlusActor ( ), ZMinusActor ( ), ViewUpVectors ( ), Transform (0) { - CubePolyData = vtkSmartPointer::New ( ); - CubeActor = vtkSmartPointer::New ( ); - CubePolyDataMapper = vtkSmartPointer::New ( ); + CubePolyData = vtkSmartPointer::New ( ); + CubeActor = vtkSmartPointer::New ( ); + CubePolyDataMapper = vtkSmartPointer::New ( ); assert (0 != CubePolyData.Get ( )); + assert (0 != CubePolyData->GetCellData ( )); assert (0 != CubeActor.Get ( )); assert (0 != CubePolyDataMapper.Get ( )); CubePolyData->Initialize ( ); + HighlightPolyData = vtkSmartPointer::New ( ); + HighlightActor = vtkSmartPointer::New ( ); + HighlightPolyDataMapper = vtkSmartPointer::New ( ); + assert (0 != HighlightPolyData.Get ( )); + assert (0 != HighlightActor.Get ( )); + assert (0 != HighlightPolyDataMapper.Get ( )); + HighlightPolyData->Initialize ( ); + ViewUpVectors = vtkSmartPointer::New ( ); + ViewUpVectors->SetName ("ViewUp"); + ViewUpVectors->SetNumberOfComponents (3); vtkSmartPointer points = vtkSmartPointer::New ( ); assert (0 != points.Get ( )); points->SetNumberOfPoints (24); @@ -153,6 +237,7 @@ vtkViewCubeActor::vtkViewCubeActor ( ) points->SetPoint (22, j2, j2, length); points->SetPoint (23, j1, j2, length); CubePolyData->SetPoints (points); + HighlightPolyData->SetPoints (points); vtkCellArray* cellArray = vtkCellArray::New ( ); vtkIdTypeArray* idsArray = vtkIdTypeArray::New ( ); @@ -161,44 +246,61 @@ vtkViewCubeActor::vtkViewCubeActor ( ) cellArray->Initialize ( ); idsArray->Initialize ( ); idsArray->SetNumberOfValues (5 * 6 + 5 * 12 + 4 * 8); // Faces + jonctions quads + triangles + CubePolyData->GetCellData ( )->SetVectors (ViewUpVectors); vtkIdType* cellsPtr = idsArray->GetPointer (0); size_t pos = 0; cellsPtr [pos++] = 4; cellsPtr [pos++] = 0; cellsPtr [pos++] = 1; cellsPtr [pos++] = 2; cellsPtr [pos++] = 3; // Bas + ViewUpVectors->InsertNextTuple3 (0., 0., 1.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 4; cellsPtr [pos++] = 5; cellsPtr [pos++] = 6; cellsPtr [pos++] = 7; // Droite + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 8; cellsPtr [pos++] = 9; cellsPtr [pos++] = 10; cellsPtr [pos++] = 11; // Haut + ViewUpVectors->InsertNextTuple3 (0., 0., 1.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 15; cellsPtr [pos++] = 14; cellsPtr [pos++] = 13; cellsPtr [pos++] = 12; // Gauche + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 19; cellsPtr [pos++] = 18; cellsPtr [pos++] = 17; cellsPtr [pos++] = 16; // Arrière + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 20; cellsPtr [pos++] = 21; cellsPtr [pos++] = 22; cellsPtr [pos++] = 23; // Avant -// cellsPtr [pos++] = 4; cellsPtr [pos++] = 0; cellsPtr [pos++] = 1; cellsPtr [pos++] = 17; cellsPtr [pos++] = 16; // Bas-Ar -cellsPtr [pos++] = 4; cellsPtr [pos++] = 16; cellsPtr [pos++] = 17; cellsPtr [pos++] = 1; cellsPtr [pos++] = 0; // Bas-Ar + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 4; cellsPtr [pos++] = 16; cellsPtr [pos++] = 17; cellsPtr [pos++] = 1; cellsPtr [pos++] = 0; // Bas-Ar + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 1; cellsPtr [pos++] = 4; cellsPtr [pos++] = 7; cellsPtr [pos++] = 2; // Bas-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 3; cellsPtr [pos++] = 2; cellsPtr [pos++] = 21; cellsPtr [pos++] = 20; // Bas-Av + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 12; cellsPtr [pos++] = 0; cellsPtr [pos++] = 3; cellsPtr [pos++] = 15; // Bas-G -// cellsPtr [pos++] = 4; cellsPtr [pos++] = 8; cellsPtr [pos++] = 9; cellsPtr [pos++] = 19; cellsPtr [pos++] = 18; // Haut-Ar -cellsPtr [pos++] = 4; cellsPtr [pos++] = 18; cellsPtr [pos++] = 19; cellsPtr [pos++] = 9; cellsPtr [pos++] = 8; // Haut-Ar -// cellsPtr [pos++] = 4; cellsPtr [pos++] = 6; cellsPtr [pos++] = 11; cellsPtr [pos++] = 8; cellsPtr [pos++] = 5; // Haut-D -cellsPtr [pos++] = 4; cellsPtr [pos++] = 5; cellsPtr [pos++] = 8; cellsPtr [pos++] = 11; cellsPtr [pos++] = 6; // Haut-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 4; cellsPtr [pos++] = 18; cellsPtr [pos++] = 19; cellsPtr [pos++] = 9; cellsPtr [pos++] = 8; // Haut-Ar + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 4; cellsPtr [pos++] = 5; cellsPtr [pos++] = 8; cellsPtr [pos++] = 11; cellsPtr [pos++] = 6; // Haut-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 11; cellsPtr [pos++] = 10; cellsPtr [pos++] = 23; cellsPtr [pos++] = 22; // Haut-Av -// cellsPtr [pos++] = 4; cellsPtr [pos++] = 10; cellsPtr [pos++] = 14; cellsPtr [pos++] = 13; cellsPtr [pos++] = 9; // Haut-G -cellsPtr [pos++] = 4; cellsPtr [pos++] = 9; cellsPtr [pos++] = 13; cellsPtr [pos++] = 14; cellsPtr [pos++] = 10; // Haut-G -// cellsPtr [pos++] = 4; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos++] = 5; cellsPtr [pos++] = 18; // Ar-D -cellsPtr [pos++] = 4; cellsPtr [pos++] = 18; cellsPtr [pos++] = 5; cellsPtr [pos++] = 4; cellsPtr [pos++] = 17; // Ar-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 4; cellsPtr [pos++] = 9; cellsPtr [pos++] = 13; cellsPtr [pos++] = 14; cellsPtr [pos++] = 10; // Haut-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 4; cellsPtr [pos++] = 18; cellsPtr [pos++] = 5; cellsPtr [pos++] = 4; cellsPtr [pos++] = 17; // Ar-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 7; cellsPtr [pos++] = 6; cellsPtr [pos++] = 22; cellsPtr [pos++] = 21; // Av-D -// cellsPtr [pos++] = 4; cellsPtr [pos++] = 19; cellsPtr [pos++] = 13; cellsPtr [pos++] = 12; cellsPtr [pos++] = 16; // Ar-G -cellsPtr [pos++] = 4; cellsPtr [pos++] = 16; cellsPtr [pos++] = 12; cellsPtr [pos++] = 13; cellsPtr [pos++] = 19; // Ar-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 4; cellsPtr [pos++] = 16; cellsPtr [pos++] = 12; cellsPtr [pos++] = 13; cellsPtr [pos++] = 19; // Ar-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 4; cellsPtr [pos++] = 14; cellsPtr [pos++] = 15; cellsPtr [pos++] = 20; cellsPtr [pos++] = 23; // Av-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 3; cellsPtr [pos++] = 10; cellsPtr [pos++] = 14; cellsPtr [pos++] = 23; // Av-H-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 3; cellsPtr [pos++] = 22; cellsPtr [pos++] = 6; cellsPtr [pos++] = 11; // Av-H-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 3; cellsPtr [pos++] = 3; cellsPtr [pos++] = 20; cellsPtr [pos++] = 15; // Av-B-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellsPtr [pos++] = 3; cellsPtr [pos++] = 2; cellsPtr [pos++] = 7; cellsPtr [pos++] = 21; // Av-B-D -// cellsPtr [pos++] = 3; cellsPtr [pos++] = 9; cellsPtr [pos++] = 13; cellsPtr [pos++] = 19; // Ar-H-G -cellsPtr [pos++] = 3; cellsPtr [pos++] = 19; cellsPtr [pos++] = 13; cellsPtr [pos++] = 9; // Ar-H-G -// cellsPtr [pos++] = 3; cellsPtr [pos++] = 18; cellsPtr [pos++] = 5; cellsPtr [pos++] = 8; // Ar-H-D -cellsPtr [pos++] = 3; cellsPtr [pos++] = 8; cellsPtr [pos++] = 5; cellsPtr [pos++] = 18; // Ar-H-D -// cellsPtr [pos++] = 3; cellsPtr [pos++] = 0; cellsPtr [pos++] = 16; cellsPtr [pos++] = 12; // Ar-B-G -cellsPtr [pos++] = 3; cellsPtr [pos++] = 12; cellsPtr [pos++] = 16; cellsPtr [pos++] = 0; // Ar-B-G -// cellsPtr [pos++] = 3; cellsPtr [pos++] = 1; cellsPtr [pos++] = 4; cellsPtr [pos++] = 17; // Ar-B-D -cellsPtr [pos++] = 3; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos++] = 7; // Ar-B-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 3; cellsPtr [pos++] = 19; cellsPtr [pos++] = 13; cellsPtr [pos++] = 9; // Ar-H-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 3; cellsPtr [pos++] = 8; cellsPtr [pos++] = 5; cellsPtr [pos++] = 18; // Ar-H-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 3; cellsPtr [pos++] = 12; cellsPtr [pos++] = 16; cellsPtr [pos++] = 0; // Ar-B-G + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); + cellsPtr [pos++] = 3; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos++] = 7; // Ar-B-D + ViewUpVectors->InsertNextTuple3 (0., 1., 0.); cellArray->SetCells (6 + 12 + 8, idsArray); CubePolyData->SetPolys (cellArray); idsArray->Delete ( ); idsArray = 0; @@ -210,6 +312,11 @@ cellsPtr [pos++] = 3; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos CubeActor->GetProperty ( )->SetColor (.75, .75, .75); CubeActor->PickableOn ( ); AddPart (CubeActor); + HighlightPolyDataMapper->SetInputData (HighlightPolyData); + HighlightPolyDataMapper->ScalarVisibilityOff ( ); + HighlightActor->SetMapper (HighlightPolyDataMapper); + HighlightActor->GetProperty ( )->SetColor (1., 0., 0.); + HighlightActor->PickableOff ( ); XPlusVectorText = vtkSmartPointer::New ( ); XMinusVectorText = vtkSmartPointer::New ( ); @@ -229,6 +336,12 @@ cellsPtr [pos++] = 3; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos YMinusActor = vtkSmartPointer::New ( ); ZPlusActor = vtkSmartPointer::New ( ); ZMinusActor = vtkSmartPointer::New ( ); + XPlusActor->PickableOff ( ); + XMinusActor->PickableOff ( ); + YPlusActor->PickableOff ( ); + YMinusActor->PickableOff ( ); + ZPlusActor->PickableOff ( ); + ZMinusActor->PickableOff ( ); XPlusVectorText->Update ( ); double* bounds = XPlusVectorText->GetOutput ( )->GetBounds ( ); double textWidth = bounds [1] - bounds [0]; @@ -246,12 +359,13 @@ cellsPtr [pos++] = 3; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos YMinusActor->SetOrigin (0.5, 0.5, 0.5); ZPlusActor->SetOrigin (0.5, 0.5, 0.5); ZMinusActor->SetOrigin (0.5, 0.5, 0.5); - XPlusActor->AddPosition (0.7, 0., textWidthScaled); - XMinusActor->AddPosition (-0.7, 0., -textWidthScaled); - YPlusActor->AddPosition (-textWidthScaled, 0.7, 0.); - YMinusActor->AddPosition (-textWidthScaled, -0.7, 0.); - ZPlusActor->AddPosition (-textWidthScaled, 0., 0.7); - ZMinusActor->SetPosition (textWidthScaled, 0., -0.7); + const double position = 0.651; // La bonne position pour que le texte soit collé au plus près de la face associée + XPlusActor->AddPosition (position, 0., textWidthScaled); + XMinusActor->AddPosition (-position, 0., -textWidthScaled); + YPlusActor->AddPosition (-textWidthScaled, position, 0.); + YMinusActor->AddPosition (-textWidthScaled, -position, 0.); + ZPlusActor->AddPosition (-textWidthScaled, 0., position); + ZMinusActor->SetPosition (textWidthScaled, 0., -position); XPlusActor->SetOrientation (0, 90, 0); XMinusActor->SetOrientation (0, -90, 0); YPlusActor->SetOrientation (-90, 0, 0); @@ -288,12 +402,6 @@ cellsPtr [pos++] = 3; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos AddPart (YMinusActor); AddPart (ZPlusActor); AddPart (ZMinusActor); -/* xPlusMapper->Delete ( ); xPlusMapper = 0; - xMinusMapper->Delete ( ); xMinusMapper = 0; - yPlusMapper->Delete ( ); yPlusMapper = 0; - yMinusMapper->Delete ( ); yMinusMapper = 0; - zPlusMapper->Delete ( ); zPlusMapper = 0; - zMinusMapper->Delete ( ); zMinusMapper = 0;*/ // Le picking sur les faces du cube : CellPicker = vtkSmartPointer::New ( ); @@ -302,7 +410,8 @@ cellsPtr [pos++] = 3; cellsPtr [pos++] = 17; cellsPtr [pos++] = 4; cellsPtr [pos vtkViewCubeActor::vtkViewCubeActor (const vtkViewCubeActor&) - : vtkPropAssembly ( ), Renderer (0), DrivenRenderer (0), CubePolyData ( ), CubeActor ( ), CubePolyDataMapper ( ), CellPicker ( ), + : vtkPropAssembly ( ), Renderer (0), DrivenRenderer (0), CubePolyData ( ), HighlightPolyData ( ), CubeActor ( ), HighlightActor ( ), CubePolyDataMapper ( ), HighlightPolyDataMapper ( ), + CellPicker ( ), LastPickedFace ((unsigned char)-1), HighlightedFace ((unsigned char)-1), XPlusVectorText ( ), XMinusVectorText ( ), YPlusVectorText ( ), YMinusVectorText ( ), ZPlusVectorText ( ), ZMinusVectorText ( ), XPlusActor ( ), XMinusActor ( ), YPlusActor ( ), YMinusActor ( ), ZPlusActor ( ), ZMinusActor ( ), Transform (0) @@ -323,75 +432,6 @@ vtkViewCubeActor::~vtkViewCubeActor ( ) if (0 != DrivenRenderer) DrivenRenderer->UnRegister (this); DrivenRenderer = 0; -/* if (0 != CellPicker) - CellPicker->Delete ( ); - CellPicker = 0; - if (0 != CubeActor) - { - RemovePart (CubeActor); - CubeActor->Delete ( ); - } - CubeActor = 0; - if (0 != XPlusActor) - { - RemovePart (XPlusActor); - XPlusActor->Delete ( ); - } - XPlusActor = 0; - if (0 != XMinusActor) - { - RemovePart (XMinusActor); - XMinusActor->Delete ( ); - } - XMinusActor = 0; - if (0 != YPlusActor) - { - RemovePart (YPlusActor); - YPlusActor->Delete ( ); - } - YPlusActor = 0; - if (0 != YMinusActor) - { - RemovePart (YMinusActor); - YMinusActor->Delete ( ); - } - YMinusActor = 0; - if (0 != ZPlusActor) - { - RemovePart (ZPlusActor); - ZPlusActor->Delete ( ); - } - ZPlusActor = 0; - if (0 != ZMinusActor) - { - RemovePart (ZMinusActor); - ZMinusActor->Delete ( ); - } - ZMinusActor = 0; - if (0 != XPlusVectorText) - XPlusVectorText->Delete ( ); - XPlusVectorText = 0; - if (0 != XMinusVectorText) - XMinusVectorText->Delete ( ); - XMinusVectorText = 0; - if (0 != YPlusVectorText) - YPlusVectorText->Delete ( ); - YPlusVectorText = 0; - if (0 != YMinusVectorText) - YMinusVectorText->Delete ( ); - YMinusVectorText = 0; - if (0 != ZPlusVectorText) - ZPlusVectorText->Delete ( ); - ZPlusVectorText = 0; - if (0 != ZMinusVectorText) - ZMinusVectorText->Delete ( ); - ZMinusVectorText = 0; - if (0 != CubePolyDataMapper) - CubePolyDataMapper->Delete ( ); - CubePolyDataMapper = 0; - if (0 != CubePolyData) - CubePolyData->Delete ( ); - CubePolyData = 0; */ if (0 != Transform) Transform->Delete ( ); Transform = 0; @@ -429,6 +469,9 @@ void vtkViewCubeActor::SetRenderers (vtkRenderer* renderer, vtkRenderer* drivenR vtkViewCubeActorPickCallback* viewCubeCommand = vtkViewCubeActorPickCallback::New ( ); viewCubeCommand->SetViewCube (this); renderer->GetRenderWindow ( )->GetInteractor ( )->AddObserver (vtkCommand::LeftButtonReleaseEvent, viewCubeCommand, 10.); + vtkViewCubeActorHighlightCallback* viewCubeHighlightCommand = vtkViewCubeActorHighlightCallback::New ( ); + viewCubeHighlightCommand->SetViewCube (this); + renderer->GetRenderWindow ( )->GetInteractor ( )->AddObserver (vtkCommand::MouseMoveEvent, viewCubeHighlightCommand, 10.); } // if (0 != renderer) if (0 != drivenRenderer) { @@ -461,25 +504,13 @@ void vtkViewCubeActor::SetTransform (vtkTransform* transform) while (0 != (property = collection->GetNextProp ( ))) { vtkActor* actor = vtkActor::SafeDownCast (property); - if (0 != actor) + if ((0 != actor) && (actor != HighlightActor)) { actor->SetUserTransform (Transform); } // if (0 != actor) } // while (0 != (property = collection->GetNextProp ( ))) -/* if (0 != CubeActor) - CubeActor->SetUserTransform (Transform); - if (0 != XPlusActor) - XPlusActor->SetUserTransform (Transform); - if (0 != XMinusActor) - XMinusActor->SetUserTransform (Transform); - if (0 != YPlusActor) - YPlusActor->SetUserTransform (Transform); - if (0 != YMinusActor) - YMinusActor->SetUserTransform (Transform); - if (0 != ZPlusActor) - ZPlusActor->SetUserTransform (Transform); - if (0 != ZMinusActor) - ZMinusActor->SetUserTransform (Transform);*/ + if (0 != HighlightActor) + HighlightActor->SetUserTransform (Transform); } // vtkViewCubeActor::SetTransform @@ -556,11 +587,70 @@ void vtkViewCubeActor::PickCallback (int x, int y) const double ypos = focalPoint [1] + normal [1] * distance; const double zpos = focalPoint [2] + normal [2] * distance; camera->SetPosition (xpos, ypos, zpos); + if (CellPicker->GetCellId ( ) == LastPickedFace) + { + assert (0 != CubePolyData); + assert (0 != CubePolyData->GetCellData ( )); + assert (0 != CubePolyData->GetCellData ( )->GetVectors ( )); + assert (CellPicker->GetCellId ( ) < CubePolyData->GetCellData ( )->GetVectors ( )->GetNumberOfTuples ( )); + double* viewup = CubePolyData->GetCellData ( )->GetVectors ( )->GetTuple (CellPicker->GetCellId ( )); + camera->SetViewUp (viewup); + camera->SetRoll (0.); + } // if (CellPicker->GetCellId ( ) == LastPickedFace) camera->ComputeViewPlaneNormal ( ); DrivenRenderer->ResetCameraClippingRange ( ); if (0 != DrivenRenderer->GetRenderWindow ( )) DrivenRenderer->GetRenderWindow ( )->Render ( ); } // if (0 != camera) + LastPickedFace = CellPicker->GetCellId ( ); } // if (0 != CellPicker->Pick (x, y, 0, Renderer)) } // vtkViewCubeActor::PickCallback + +void vtkViewCubeActor::HighlightCallback (int x, int y) +{ + if ((0 == CellPicker.Get ( )) || (0 == Renderer) || (0 == DrivenRenderer)) + return; + assert (0 != CubePolyData.Get ( )); + assert (0 != HighlightPolyData.Get ( )); + assert (0 != HighlightActor.Get ( )); + + if (0 != CellPicker->Pick (x, y, 0, Renderer)) + { + if (HighlightedFace == CellPicker->GetCellId ( )) + return; + + if ((unsigned char)-1 != HighlightedFace) + { + RemovePart (HighlightActor); + } // if ((unsigned char)-1 != HighlightedFace) + HighlightedFace = CellPicker->GetCellId ( ); + vtkIdType npts = 0; + vtkIdType* pts = 0; + CubePolyData->GetCellPoints (CellPicker->GetCellId ( ), npts, pts); + if (0 == HighlightPolyData->GetNumberOfCells ( )) + { + HighlightPolyData->Allocate (1); + HighlightPolyData->InsertNextCell (VTK_POLYGON, npts, pts); + } // if (0 == HighlightPolyData->GetNumberOfCells ( )) + else + { + HighlightPolyData->ReplaceCell (0, npts, pts); + HighlightPolyData->Modified ( ); + } // if (0 == HighlightPolyData->GetNumberOfCells ( )) + + AddPart (HighlightActor); + } // if (0 != CellPicker->Pick (x, y, 0, Renderer)) + else + { + if ((unsigned char)-1 != HighlightedFace) + { + RemovePart (HighlightActor); + } // if ((unsigned char)-1 != HighlightedFace) + HighlightedFace = (unsigned char)-1; + } // else if (0 != CellPicker->Pick (x, y, 0, Renderer)) + + if (0 != DrivenRenderer->GetRenderWindow ( )) + DrivenRenderer->GetRenderWindow ( )->Render ( ); +} // vtkViewCubeActor::HighlightCallback + diff --git a/versions.txt b/versions.txt index de09699..34d8b98 100644 --- a/versions.txt +++ b/versions.txt @@ -1,3 +1,12 @@ +Version 5.9.0 : 11/04/25 +=============== + +Améliorations de la classe vtkViewCubeActor : +- Un second clic sur une face provoque l'annulation du roulis +- Le texte est plaqué au plus près des faces +- Mise en surbrillance de la face survolée. + + Version 5.8.0 : 04/03/25 ===============