diff --git a/cmake/version.cmake b/cmake/version.cmake index 83b3b2e..769a02d 100644 --- a/cmake/version.cmake +++ b/cmake/version.cmake @@ -3,7 +3,7 @@ # set (VTK_CONTRIB_MAJOR_VERSION "5") -set (VTK_CONTRIB_MINOR_VERSION "11") +set (VTK_CONTRIB_MINOR_VERSION "12") 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/vtkFrustumWidget.h b/src/VtkContrib/public/VtkContrib/vtkFrustumWidget.h index 56d8c71..fe8617c 100644 --- a/src/VtkContrib/public/VtkContrib/vtkFrustumWidget.h +++ b/src/VtkContrib/public/VtkContrib/vtkFrustumWidget.h @@ -7,6 +7,8 @@ #ifndef VTK_FRUSTUM_WIDGET_H #define VTK_FRUSTUM_WIDGET_H +#include "VtkContrib/vtkPolygonFilter.h" + #include #include #include @@ -212,6 +214,7 @@ class vtkFrustumWidget : public vtk3DWidget /** Le tronc et sa représentation. */ vtkSmartPointer _frustum; + vtkSmartPointer _polygonFilter; vtkSmartPointer _planes; vtkSmartPointer _frustumMapper; vtkSmartPointer _frustumActor; diff --git a/src/VtkContrib/public/VtkContrib/vtkPolygonFilter.h b/src/VtkContrib/public/VtkContrib/vtkPolygonFilter.h new file mode 100644 index 0000000..750c401 --- /dev/null +++ b/src/VtkContrib/public/VtkContrib/vtkPolygonFilter.h @@ -0,0 +1,59 @@ +#ifndef VTK_POLYGON_FILTER_H +#define VTK_POLYGON_FILTER_H + + +#include +#include +#include +#include + + +/**

Filtre permettant d'extraire les polygones d'une instance de vtkPolyData. + *

+ * @author Charles PIGNEROL, CEA/DAM/DCLC + */ +class vtkPolygonFilter : public vtkPolyDataAlgorithm +{ + public : + + /** Destructeur : RAS + */ + virtual ~vtkPolygonFilter ( ); + + /** Instanciation de cette classe. + */ + static vtkPolygonFilter* New ( ); + + vtkTypeMacro(vtkPolygonFilter,vtkPolyDataAlgorithm); + + /** + * Affiche quelques infos sur l'instance. + * @param flux d'impression + * @param indentation utilisée + */ + virtual void PrintSelf (ostream& os, vtkIndent indent); + + /** + * Effectue l'extraction. + */ + virtual int RequestData (vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector); + + + protected : + + /** Constructeur. + */ + vtkPolygonFilter ( ); + + + private : + + /** Constructeur de copie : interdit. */ + vtkPolygonFilter (const vtkPolygonFilter&); + + /** Opérateur = : interdit. */ + vtkPolygonFilter& operator = (const vtkPolygonFilter&); +}; // class vtkPolygonFilter + + +#endif // VTK_POLYGON_FILTER_H diff --git a/src/VtkContrib/vtkFrustumWidget.cpp b/src/VtkContrib/vtkFrustumWidget.cpp index 4a54adc..a5a0a10 100644 --- a/src/VtkContrib/vtkFrustumWidget.cpp +++ b/src/VtkContrib/vtkFrustumWidget.cpp @@ -237,10 +237,12 @@ vtkFrustumWidget::vtkFrustumWidget ( ) : vtk3DWidget ( ), _parallelPlanes ( ) { _frustum = vtkSmartPointer::Take (vtkFrustumSource::New ( )); + _polygonFilter = vtkSmartPointer::Take (vtkPolygonFilter::New ( )); + _polygonFilter->SetInputData (_frustum->GetOutput ( )); _planes = vtkSmartPointer::Take (vtkPlanes::New ( )); _frustumMapper = vtkSmartPointer::Take (vtkPolyDataMapper::New ( )); _frustumActor = vtkSmartPointer::Take (vtkActor::New ( )); - _frustumMapper->SetInputConnection (_frustum->GetOutputPort ( )); + _frustumMapper->SetInputData (_polygonFilter->GetOutput ( )); _frustumActor->SetMapper (_frustumMapper); _contourFilter = vtkSmartPointer::Take (vtkTubeFilter::New ( )); _contourMapper = vtkSmartPointer::Take (vtkPolyDataMapper::New ( )); @@ -312,6 +314,12 @@ void vtkFrustumWidget::SetEnabled (int enabled) { if (true == enabled) { + _polygonFilter->Update ( ); + double bounds [6] = { 0., 0., 0., 0., 0., 0. }; + GetBounds (bounds); + const double radius = sqrt ((bounds [1] - bounds [0])*(bounds [1] - bounds [0]) + (bounds [3] - bounds [2])*(bounds [3] - bounds [2]) + (bounds [5] - bounds [4])*(bounds [5] - bounds [4])) / 200.; + _contourFilter->SetRadius (radius); // 5.12.0 + _contourFilter->Update ( ); GetCurrentRenderer ( )->AddActor (_frustumActor); GetCurrentRenderer ( )->AddActor (_contourActor); } @@ -490,6 +498,7 @@ void vtkFrustumWidget::GetBounds (double bounds [6]) else { // frustum->GetBounds (bounds); + // CP : le commentaire ci-après n'est peut être plus vrai depuis l'utilisation de vtkPolygonFilter (v 5.12.0). /* On n'utilise pas frustum->GetBounds (bounds) car notre polydata contient des lignes qui parfois, de manière non reproductible, * sortent carrément du domaine observé, à savoir qu'une composante d'une coordonnée peut être de l'ordre de 10E+30 ! Parfois veut ici * dire environ 1 fois sur 15, et c'est semble-t-il toujours au premier appel de cette fonction. Problème d'initialisation d'une @@ -638,6 +647,7 @@ void vtkFrustumWidget::CreateDefaultRepresentation ( ) _planes->SetNormals (normals); _frustum->SetPlanes (_planes); _frustum->Update ( ); + _polygonFilter->Update ( ); // On confère à ce widget le look de la classe vtkImplicitPlaneWidget : _frustumActor->SetProperty (_planeWidgets [0]->GetPlaneProperty ( )); } // vtkFrustumWidget::CreateDefaultRepresentation @@ -692,6 +702,7 @@ void vtkFrustumWidget::Update (vtkFrustumWidget::vtkInternalPlaneWidget* planeWi _frustum->SetPlanes (_planes); _frustum->Modified ( ); _frustum->Update ( ); + _polygonFilter->Update ( ); // Recentrer les manipulateurs sur leur face : vtkPolyData* frustum = _frustum->GetOutput ( ); diff --git a/src/VtkContrib/vtkPolygonFilter.cpp b/src/VtkContrib/vtkPolygonFilter.cpp new file mode 100644 index 0000000..a704a2a --- /dev/null +++ b/src/VtkContrib/vtkPolygonFilter.cpp @@ -0,0 +1,90 @@ +#include "VtkContrib/vtkPolygonFilter.h" + +#include +#include +#include +#include + +#include +#include +using namespace std; + + +vtkPolygonFilter::vtkPolygonFilter ( ) + : vtkPolyDataAlgorithm ( ) +{ +} // vtkPolygonFilter::vtkPolygonFilter + + +vtkPolygonFilter::vtkPolygonFilter (const vtkPolygonFilter&) + : vtkPolyDataAlgorithm ( ) +{ + assert (0 && "vtkPolygonFilter copy constructor is not allowed."); +} // vtkPolygonFilter::vtkPolygonFilter + + +vtkPolygonFilter& vtkPolygonFilter::operator = (const vtkPolygonFilter&) +{ + assert (0 && "vtkPolygonFilter operator = is not allowed."); + return *this; +} // vtkPolygonFilter::operator = + + +vtkPolygonFilter::~vtkPolygonFilter ( ) +{ +} // vtkPolygonFilter::~vtkPolygonFilter + + +vtkPolygonFilter* vtkPolygonFilter::New ( ) +{ + return new vtkPolygonFilter ( ); +} // vtkPolygonFilter::New + + +void vtkPolygonFilter::PrintSelf (ostream& os, vtkIndent indent) +{ + Superclass::PrintSelf(os,indent); +} // vtkPolygonFilter::PrintSelf + + +#define RD_SUCCESS 1 +#define RD_FAILURE 0 +int vtkPolygonFilter::RequestData (vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) +{ + vtkPolyData* input = GetPolyDataInput (0); + vtkPolyData* output = GetOutput ( ); + vtkPoints* pointSet = 0 == input ? 0 : input->GetPoints ( ); + vtkCellArray* cells = 0 == input ? 0 : input->GetPolys ( ); + if (0 == output) + { + vtkErrorMacro(<<"vtkPolygonFilter::Execute : filter does not have any output."); + return RD_FAILURE; + } // if (0 == output) + if ((0 == input) || (0 == pointSet) || (0 == cells)) + { + vtkErrorMacro(<<"vtkPolygonFilter::Execute : filter does not have any input."); + return RD_FAILURE; + } // if (0 == input) || (0 == pointSet) || (0 == cells)) + output->Reset ( ); + + const size_t cellNum = cells->GetNumberOfCells ( ); + vtkIdType* cellsPtr = cells->GetPointer ( ); + output->SetPoints (pointSet); + output->Allocate (cellNum, cellNum); + for (int i = 0; i < cellNum; i++) + { + const vtkIdType nodeCount = *cellsPtr; + cellsPtr++; + switch (nodeCount) + { + case 3 : output->InsertNextCell (VTK_TRIANGLE, nodeCount, cellsPtr); break; + case 4 : output->InsertNextCell (VTK_QUAD, nodeCount, cellsPtr); break; + } // switch (nodeCount) + cellsPtr += nodeCount; + } // for (i = 0; i < cellNum; i++) + + output->GetCellData ( )->PassData (input->GetCellData ( )); + output->Squeeze ( ); + + return RD_SUCCESS; +} // vtkPolygonFilter::RequestData diff --git a/versions.txt b/versions.txt index fbbeb21..e085308 100644 --- a/versions.txt +++ b/versions.txt @@ -1,3 +1,16 @@ +Version 5.12.0 : 17/10/25 +================ + +Classe vtkPolygonFilter. + +Correctifs vtkFrustumWidget : +- le rayon des tubes délimitants le contour des plans est calculé au moment de l'affichage => évite que ces +tubes soient tellement fins qu'on ne les voit pas. +- Dans certains cas à la moindre interaction (zoom/rotation) la scène disparaissait (pb probable de clipping). +Cela semblait provenir des vtkLines du vtkPolyData en sortie de vtkFrustumSource dont certaines composantes +de coordonnées pouvaient être infinies. Problème semble t-il résolu en filtrant avec la classe vtkPolygonFilter. + + Version 5.11.0 : 03/10/25 ================