From d54ff27e7591b940f60311072bbbf9219be63c3d Mon Sep 17 00:00:00 2001 From: apo Date: Thu, 10 May 2007 15:04:31 +0000 Subject: [PATCH] Implementation of clipping planes support for ScalarMapOnDeformedShape --- src/PIPELINE/VISU_PipeLine.cxx | 1 - src/PIPELINE/VISU_PipeLine.hxx | 3 + .../VISU_ScalarMapOnDeformedShapePL.cxx | 123 ++++++++++++++---- .../VISU_ScalarMapOnDeformedShapePL.hxx | 22 +++- 4 files changed, 119 insertions(+), 30 deletions(-) diff --git a/src/PIPELINE/VISU_PipeLine.cxx b/src/PIPELINE/VISU_PipeLine.cxx index ea4f8da7..704dd556 100644 --- a/src/PIPELINE/VISU_PipeLine.cxx +++ b/src/PIPELINE/VISU_PipeLine.cxx @@ -38,7 +38,6 @@ #include #include -#include #include #include #include diff --git a/src/PIPELINE/VISU_PipeLine.hxx b/src/PIPELINE/VISU_PipeLine.hxx index 92e6296e..fc360f6b 100644 --- a/src/PIPELINE/VISU_PipeLine.hxx +++ b/src/PIPELINE/VISU_PipeLine.hxx @@ -145,12 +145,14 @@ public: vtkFloatingPointType theMinSize = 1024*1024.0); // Clipping planes + virtual void RemoveAllClippingPlanes(); vtkIdType GetNumberOfClippingPlanes() const; + virtual bool AddClippingPlane(vtkPlane* thePlane); @@ -200,6 +202,7 @@ public: const VISU::PIDMapper& GetIDMapper()const; + virtual void SetImplicitFunction(vtkImplicitFunction *theFunction); diff --git a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.cxx b/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.cxx index 6a0be83a..202d14cf 100644 --- a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.cxx +++ b/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.cxx @@ -34,6 +34,13 @@ #include "VTKViewer_TransformFilter.h" #include "VTKViewer_Transform.h" +#include "SALOME_ExtractGeometry.h" + +#include +#include +#include +#include + #include #include #include @@ -52,20 +59,25 @@ vtkStandardNewMacro(VISU_ScalarMapOnDeformedShapePL) * \li myScalars is vtk shared pointer to vtkUnstructuredGrid - scalars data */ VISU_ScalarMapOnDeformedShapePL -::VISU_ScalarMapOnDeformedShapePL() +::VISU_ScalarMapOnDeformedShapePL(): + myScalarsExtractGeometry(SALOME_ExtractGeometry::New()) { + myCellDataToPointData = VISU_CellDataToPointData::New(); + myWarpVector = vtkWarpVector::New(); - myScalarsMergeFilter = VISU_MergeFilter::New(); - myScalarsMergeFilter->SetMergingInputs(true); + myScalarsExtractGeometry->SetInput(myMergeFilter->GetOutput()); + vtkImplicitBoolean* anImplicitBoolean = vtkImplicitBoolean::New(); + myScalarsExtractGeometry->SetImplicitFunction(anImplicitBoolean); + anImplicitBoolean->SetOperationTypeToIntersection(); + anImplicitBoolean->Delete(); myScalarsExtractor = VISU_Extractor::New(); myScalarsFieldTransform = VISU_FieldTransform::New(); - myCellDataToPointData = VISU_CellDataToPointData::New(); - - myScalars = myMergeFilter->GetOutput(); + myScalarsMergeFilter = VISU_MergeFilter::New(); + myScalarsMergeFilter->SetMergingInputs(true); } /*! @@ -79,6 +91,8 @@ VISU_ScalarMapOnDeformedShapePL myScalarsMergeFilter->Delete(); + myScalarsExtractGeometry->Delete(); + myScalarsExtractor->Delete(); myScalarsFieldTransform->Delete(); @@ -86,6 +100,77 @@ VISU_ScalarMapOnDeformedShapePL myCellDataToPointData->Delete(); } +/*! + * Copy information about pipline. + * Copy scale and scalars. + */ +void +VISU_ScalarMapOnDeformedShapePL +::ShallowCopy(VISU_PipeLine *thePipeLine) +{ + VISU_ScalarMapOnDeformedShapePL *aPipeLine = dynamic_cast(thePipeLine); + if(aPipeLine){ + SetScale(aPipeLine->GetScale()); + SetScalars(aPipeLine->GetScalars()); + } + Superclass::ShallowCopy(thePipeLine); +} + +//======================================================================= +void +VISU_ScalarMapOnDeformedShapePL +::SetImplicitFunction(vtkImplicitFunction *theFunction) +{ + Superclass::SetImplicitFunction(theFunction); + + myScalarsExtractGeometry->SetImplicitFunction(theFunction); +} + + +void +VISU_ScalarMapOnDeformedShapePL +::RemoveAllClippingPlanes() +{ + Superclass::RemoveAllClippingPlanes(); + + if(vtkImplicitBoolean* aBoolean = myScalarsExtractGeometry->GetImplicitBoolean()){ + vtkImplicitFunctionCollection* aFunction = aBoolean->GetFunction(); + aFunction->RemoveAllItems(); + aBoolean->Modified(); // VTK bug + } +} + + +bool +VISU_ScalarMapOnDeformedShapePL +::AddClippingPlane(vtkPlane* thePlane) +{ + Superclass::AddClippingPlane(thePlane); + + if (thePlane) { + if (vtkImplicitBoolean* aBoolean = myScalarsExtractGeometry->GetImplicitBoolean()) { + vtkImplicitFunctionCollection* aFunction = aBoolean->GetFunction(); + aFunction->AddItem(thePlane); + + // Check, that at least one cell present after clipping. + // This check was introduced because of bug IPAL8849. + if (GetScalarsClippedInput()->GetNumberOfCells() < 1) + return false; + } + } + return true; +} + + +VISU_PipeLine::TInput* +VISU_ScalarMapOnDeformedShapePL +::GetScalarsClippedInput() +{ + if(myScalarsExtractGeometry->GetInput()) + myScalarsExtractGeometry->Update(); + return myScalarsExtractGeometry->GetOutput(); +} + //======================================================================= void VISU_ScalarMapOnDeformedShapePL @@ -169,43 +254,29 @@ VISU_ScalarMapOnDeformedShapePL SetScale(VISU_DeformedShapePL::GetDefaultScale(this)); } -/*! - * Copy information about pipline. - * Copy scale and scalars. - */ -void -VISU_ScalarMapOnDeformedShapePL -::ShallowCopy(VISU_PipeLine *thePipeLine) -{ - VISU_ScalarMapOnDeformedShapePL *aPipeLine = dynamic_cast(thePipeLine); - if(aPipeLine){ - SetScale(aPipeLine->GetScale()); - SetScalars(aPipeLine->GetScalars()); - } - Superclass::ShallowCopy(thePipeLine); -} - /*! * Set scalars. * Sets vtkDataSet with scalars values to VISU_Extractor filter for scalars extraction. */ void VISU_ScalarMapOnDeformedShapePL -::SetScalars(vtkDataSet *theScalars) +::SetScalars(TInput *theScalars) { - myScalars = theScalars; + myScalarsExtractGeometry->SetInput(theScalars); } /*! * Get pointer to input scalars. */ -vtkPointSet* +VISU_PipeLine::TInput* VISU_ScalarMapOnDeformedShapePL ::GetScalars() { - return myScalars.GetPointer(); + vtkDataSet* aDataSet = myScalarsExtractGeometry->GetInput(); + return dynamic_cast(aDataSet); } + /*! * Sets scale for deformed shape */ diff --git a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.hxx b/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.hxx index e1f805f3..cd53b31f 100644 --- a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.hxx +++ b/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.hxx @@ -55,6 +55,19 @@ public: void ShallowCopy(VISU_PipeLine *thePipeLine); + // Clipping planes + virtual + void + RemoveAllClippingPlanes(); + + virtual + bool + AddClippingPlane(vtkPlane* thePlane); + + virtual + void + SetImplicitFunction(vtkImplicitFunction *theFunction); + virtual void SetScale(vtkFloatingPointType theScale); @@ -85,10 +98,10 @@ public: virtual void - SetScalars(vtkDataSet *theScalars); + SetScalars(TInput *theScalars); virtual - vtkPointSet* + TInput* GetScalars(); public: @@ -120,11 +133,14 @@ protected: TInsertCustomPL* InsertCustomPL(); + TInput* + GetScalarsClippedInput(); + vtkFloatingPointType myScaleFactor; vtkWarpVector *myWarpVector; VISU_MergeFilter *myScalarsMergeFilter; - vtkSmartPointer myScalars; VISU_CellDataToPointData* myCellDataToPointData; + SALOME_ExtractGeometry* myScalarsExtractGeometry; VISU_FieldTransform* myScalarsFieldTransform; VISU_Extractor* myScalarsExtractor; }; -- 2.39.2