From 6b6e2ef015461eed2549ab12d22da1b3e594a903 Mon Sep 17 00:00:00 2001 From: rnv Date: Wed, 30 Nov 2011 14:14:36 +0000 Subject: [PATCH] Fix for the bug "21427: EDF 2024 SMESH: numbering does not take into account clipping". --- src/OBJECT/Makefile.am | 8 +- src/OBJECT/SMESH_Actor.cxx | 307 +++++++++------------------- src/OBJECT/SMESH_ActorDef.h | 36 +--- src/OBJECT/SMESH_CellLabelActor.cxx | 185 +++++++++++++++++ src/OBJECT/SMESH_CellLabelActor.h | 82 ++++++++ src/OBJECT/SMESH_DeviceActor.cxx | 2 +- src/OBJECT/SMESH_NodeLabelActor.cxx | 187 +++++++++++++++++ src/OBJECT/SMESH_NodeLabelActor.h | 78 +++++++ 8 files changed, 639 insertions(+), 246 deletions(-) create mode 100644 src/OBJECT/SMESH_CellLabelActor.cxx create mode 100644 src/OBJECT/SMESH_CellLabelActor.h create mode 100644 src/OBJECT/SMESH_NodeLabelActor.cxx create mode 100644 src/OBJECT/SMESH_NodeLabelActor.h diff --git a/src/OBJECT/Makefile.am b/src/OBJECT/Makefile.am index 0264d62eb..6b38c0ca4 100644 --- a/src/OBJECT/Makefile.am +++ b/src/OBJECT/Makefile.am @@ -35,7 +35,9 @@ salomeinclude_HEADERS = \ SMESH_PreviewActorsCollection.h \ SMESH_ExtractGeometry.h \ SMESH_FaceOrientationFilter.h \ - SMESH_ScalarBarActor.h + SMESH_ScalarBarActor.h \ + SMESH_NodeLabelActor.h \ + SMESH_CellLabelActor.h # Libraries targets @@ -48,7 +50,9 @@ dist_libSMESHObject_la_SOURCES = \ SMESH_ExtractGeometry.cxx \ SMESH_ActorUtils.cxx \ SMESH_FaceOrientationFilter.cxx \ - SMESH_ScalarBarActor.cxx + SMESH_ScalarBarActor.cxx \ + SMESH_NodeLabelActor.cxx \ + SMESH_CellLabelActor.cxx libSMESHObject_la_CPPFLAGS = \ $(QT_INCLUDES) \ diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 42800dd76..4d5dcfd11 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -28,11 +28,12 @@ #include "SMESH_ActorDef.h" #include "SMESH_ActorUtils.h" #include "SMESH_DeviceActor.h" +#include "SMESH_NodeLabelActor.h" +#include "SMESH_CellLabelActor.h" #include "SMESH_ObjectDef.h" #include "SMESH_ControlsDef.hxx" #include "SMDS_UnstructuredGrid.hxx" #include "SMESH_ScalarBarActor.h" -#include "VTKViewer_CellCenters.h" #include "VTKViewer_ExtractUnstructuredGrid.h" #include "VTKViewer_FramedTextActor.h" #include "SALOME_InteractiveObject.hxx" @@ -67,10 +68,7 @@ #include #include #include -#include #include -#include -#include #include @@ -121,7 +119,8 @@ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, SMESH_ActorDef::SMESH_ActorDef() { - if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. ); - my2DActor = SMESH_DeviceActor::New(); + my2DActor = SMESH_CellLabelActor::New(); + my2DActor->SetStoreGemetryMapping(true); my2DActor->SetUserMatrix(aMatrix); my2DActor->PickableOff(); my2DActor->SetProperty(mySurfaceProp); @@ -193,7 +193,8 @@ SMESH_ActorDef::SMESH_ActorDef() aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); - my3DActor = SMESH_DeviceActor::New(); + my3DActor = SMESH_CellLabelActor::New(); + my3DActor->SetStoreGemetryMapping(true); my3DActor->SetUserMatrix(aMatrix); my3DActor->PickableOff(); my3DActor->SetProperty(mySurfaceProp); @@ -246,7 +247,8 @@ SMESH_ActorDef::SMESH_ActorDef() myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); myEdgeProp->SetLineWidth(aLineWidth); - my1DActor = SMESH_DeviceActor::New(); + my1DActor = SMESH_CellLabelActor::New(); + my1DActor->SetStoreGemetryMapping(true); my1DActor->SetUserMatrix(aMatrix); my1DActor->PickableOff(); my1DActor->SetHighlited(true); @@ -291,9 +293,9 @@ SMESH_ActorDef::SMESH_ActorDef() my0DProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); my0DProp->SetPointSize(aElem0DSize); - my0DActor = SMESH_DeviceActor::New(); + my0DActor = SMESH_CellLabelActor::New(); my0DActor->SetUserMatrix(aMatrix); - my0DActor->SetStoreClippingMapping(true); + my0DActor->SetStoreGemetryMapping(true); my0DActor->PickableOff(); my0DActor->SetVisibility(false); my0DActor->SetProperty(my0DProp); @@ -331,7 +333,7 @@ SMESH_ActorDef::SMESH_ActorDef() SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) ); myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myNodeActor = SMESH_DeviceActor::New(); + myNodeActor = SMESH_NodeLabelActor::New(); myNodeActor->SetUserMatrix(aMatrix); myNodeActor->SetStoreClippingMapping(true); myNodeActor->PickableOff(); @@ -363,11 +365,9 @@ SMESH_ActorDef::SMESH_ActorDef() //Definition of Pickable and Highlitable engines //---------------------------------------------- - myBaseActor = SMESH_DeviceActor::New(); myBaseActor->SetUserMatrix(aMatrix); myBaseActor->SetStoreGemetryMapping(true); myBaseActor->GetProperty()->SetOpacity(0.0); - myPickableActor = myBaseActor; myHighlightProp = vtkProperty::New(); @@ -430,92 +430,12 @@ SMESH_ActorDef::SMESH_ActorDef() if( !mgr ) return; - //Definition of points numbering pipeline - //--------------------------------------- - myPointsNumDataSet = vtkUnstructuredGrid::New(); - - myPtsMaskPoints = vtkMaskPoints::New(); - myPtsMaskPoints->SetInput(myPointsNumDataSet); - myPtsMaskPoints->SetOnRatio(1); - - myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New(); - myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput()); - myPtsSelectVisiblePoints->SelectInvisibleOff(); - myPtsSelectVisiblePoints->SetTolerance(0.1); - - myPtsLabeledDataMapper = vtkLabeledDataMapper::New(); - myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput()); -#if (VTK_XVERSION < 0x050200) - myPtsLabeledDataMapper->SetLabelFormat("%g"); -#endif - myPtsLabeledDataMapper->SetLabelModeToLabelScalars(); - - vtkTextProperty* aPtsTextProp = vtkTextProperty::New(); - aPtsTextProp->SetFontFamilyToTimes(); - static int aPointsFontSize = 10; - aPtsTextProp->SetFontSize(aPointsFontSize); - aPtsTextProp->SetBold(1); - aPtsTextProp->SetItalic(0); - aPtsTextProp->SetShadow(0); - myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp); - aPtsTextProp->Delete(); - myEntityMode = eAllEntity; - - myIsPointsLabeled = false; - - myPointLabels = vtkActor2D::New(); - myPointLabels->SetMapper(myPtsLabeledDataMapper); - myPointLabels->GetProperty()->SetColor(1,1,1); - myPointLabels->SetVisibility(myIsPointsLabeled); - - - //Definition of cells numbering pipeline - //--------------------------------------- - myCellsNumDataSet = vtkUnstructuredGrid::New(); - - myCellCenters = VTKViewer_CellCenters::New(); - myCellCenters->SetInput(myCellsNumDataSet); - - myClsMaskPoints = vtkMaskPoints::New(); - myClsMaskPoints->SetInput(myCellCenters->GetOutput()); - myClsMaskPoints->SetOnRatio(1); - - myClsSelectVisiblePoints = vtkSelectVisiblePoints::New(); - myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput()); - myClsSelectVisiblePoints->SelectInvisibleOff(); - myClsSelectVisiblePoints->SetTolerance(0.1); - - myClsLabeledDataMapper = vtkLabeledDataMapper::New(); - myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput()); -#if (VTK_XVERSION < 0x050200) - myClsLabeledDataMapper->SetLabelFormat("%g"); -#endif - myClsLabeledDataMapper->SetLabelModeToLabelScalars(); - - vtkTextProperty* aClsTextProp = vtkTextProperty::New(); - aClsTextProp->SetFontFamilyToTimes(); - static int aCellsFontSize = 12; - aClsTextProp->SetFontSize(aCellsFontSize); - aClsTextProp->SetBold(1); - aClsTextProp->SetItalic(0); - aClsTextProp->SetShadow(0); - myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp); - aClsTextProp->Delete(); - - myIsCellsLabeled = false; - - myCellsLabels = vtkActor2D::New(); - myCellsLabels->SetMapper(myClsLabeledDataMapper); - myCellsLabels->GetProperty()->SetColor(0,1,0); - myCellsLabels->SetVisibility(myIsCellsLabeled); - + // Clipping planes myImplicitBoolean = vtkImplicitBoolean::New(); myImplicitBoolean->SetOperationTypeToIntersection(); - - //Quadratic 2D elements representation //----------------------------------------------------------------------------- int aQuadratic2DMode = mgr->integerValue( "SMESH", "quadratic_mode", 0); @@ -596,50 +516,9 @@ SMESH_ActorDef::~SMESH_ActorDef() myNodeActor->Delete(); myBaseActor->Delete(); - myNodeExtActor->Delete(); - + myNodeExtActor->Delete(); myHighlitableActor->Delete(); - //Deleting of points numbering pipeline - //--------------------------------------- - myPointsNumDataSet->Delete(); - - // commented: porting to vtk 5.0 - // myPtsLabeledDataMapper->RemoveAllInputs(); - myPtsLabeledDataMapper->Delete(); - - // commented: porting to vtk 5.0 - // myPtsSelectVisiblePoints->UnRegisterAllOutputs(); - myPtsSelectVisiblePoints->Delete(); - - // commented: porting to vtk 5.0 - // myPtsMaskPoints->UnRegisterAllOutputs(); - myPtsMaskPoints->Delete(); - - myPointLabels->Delete(); - - - //Deleting of cells numbering pipeline - //--------------------------------------- - myCellsNumDataSet->Delete(); - - myClsLabeledDataMapper->RemoveAllInputs(); - myClsLabeledDataMapper->Delete(); - - // commented: porting to vtk 5.0 - // myClsSelectVisiblePoints->UnRegisterAllOutputs(); - myClsSelectVisiblePoints->Delete(); - - // commented: porting to vtk 5.0 - // myClsMaskPoints->UnRegisterAllOutputs(); - myClsMaskPoints->Delete(); - - // commented: porting to vtk 5.0 - // myCellCenters->UnRegisterAllOutputs(); - myCellCenters->Delete(); - - myCellsLabels->Delete(); - myImplicitBoolean->Delete(); myTimeStamp->Delete(); @@ -648,64 +527,53 @@ SMESH_ActorDef::~SMESH_ActorDef() void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) { - vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); - - myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints(); - - if ( myIsPointsLabeled ) - { - myPointsNumDataSet->ShallowCopy(aGrid); - vtkDataSet *aDataSet = myPointsNumDataSet; - - int aNbElem = aDataSet->GetNumberOfPoints(); - - vtkIntArray *anArray = vtkIntArray::New(); - anArray->SetNumberOfValues( aNbElem ); - - for ( vtkIdType anId = 0; anId < aNbElem; anId++ ) - { - int aSMDSId = myVisualObj->GetNodeObjId( anId ); - anArray->SetValue( anId, aSMDSId ); - } - - aDataSet->GetPointData()->SetScalars( anArray ); - anArray->Delete(); - myPtsMaskPoints->SetInput( aDataSet ); - myPointLabels->SetVisibility( GetVisibility() ); + if(myNodeActor) { + myNodeActor->SetPointsLabeled(theIsPointsLabeled); + SetRepresentation(GetRepresentation()); + myTimeStamp->Modified(); } - else - { - myPointLabels->SetVisibility( false ); - } - SetRepresentation(GetRepresentation()); - myTimeStamp->Modified(); } +bool SMESH_ActorDef::GetPointsLabeled() { + return myNodeActor && myNodeActor->GetPointsLabeled(); +} void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled) { - vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); - myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints(); - if(myIsCellsLabeled){ - myCellsNumDataSet->ShallowCopy(aGrid); - vtkDataSet *aDataSet = myCellsNumDataSet; - int aNbElem = aDataSet->GetNumberOfCells(); - vtkIntArray *anArray = vtkIntArray::New(); - anArray->SetNumberOfValues(aNbElem); - for(int anId = 0; anId < aNbElem; anId++){ - int aSMDSId = myVisualObj->GetElemObjId(anId); - anArray->SetValue(anId,aSMDSId); - } - aDataSet->GetCellData()->SetScalars(anArray); - myCellCenters->SetInput(aDataSet); - myCellsLabels->SetVisibility(GetVisibility()); - }else{ - myCellsLabels->SetVisibility(false); - } + if(my3DActor) + my3DActor->SetCellsLabeled(theIsCellsLabeled); + + if(my2DActor) + my2DActor->SetCellsLabeled(theIsCellsLabeled); + + if(my1DActor) + my1DActor->SetCellsLabeled(theIsCellsLabeled); + + if(my0DActor) + my0DActor->SetCellsLabeled(theIsCellsLabeled); + myTimeStamp->Modified(); } +bool SMESH_ActorDef::GetCellsLabeled() { + bool result = false; + if(my3DActor) + result = result || my3DActor->GetCellsLabeled(); + + if(my2DActor) + result = result || my2DActor->GetCellsLabeled(); + + if(my1DActor) + result = result || my1DActor->GetCellsLabeled(); + + if(my0DActor) + result = result || my0DActor->GetCellsLabeled(); + + return result; +} + + void SMESH_ActorDef::SetFacesOriented(bool theIsFacesOriented) { myIsFacesOriented = theIsFacesOriented; @@ -993,32 +861,23 @@ SetControlMode(eControl theMode, void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ - theRenderer->AddActor(myNodeActor); - theRenderer->AddActor(myBaseActor); - + theRenderer->AddActor(myBaseActor); theRenderer->AddActor(myNodeExtActor); + theRenderer->AddActor(my1DExtActor); my3DActor->AddToRender(theRenderer); my3DExtActor->AddToRender(theRenderer); my2DActor->AddToRender(theRenderer); my2DExtActor->AddToRender(theRenderer); - - theRenderer->AddActor(my1DActor); - theRenderer->AddActor(my1DExtActor); - - theRenderer->AddActor(my0DActor); + myNodeActor->AddToRender(theRenderer); + my1DActor->AddToRender(theRenderer); + my0DActor->AddToRender(theRenderer); //theRenderer->AddActor(my0DExtActor); theRenderer->AddActor(myHighlitableActor); theRenderer->AddActor2D(myScalarBarActor); - myPtsSelectVisiblePoints->SetRenderer(theRenderer); - myClsSelectVisiblePoints->SetRenderer(theRenderer); - - theRenderer->AddActor2D(myPointLabels); - theRenderer->AddActor2D(myCellsLabels); - // the superclass' method should be called at the end // (in particular, for correct work of selection) SALOME_Actor::AddToRender(theRenderer); @@ -1027,27 +886,25 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ SALOME_Actor::RemoveFromRender(theRenderer); - theRenderer->RemoveActor(myNodeActor); theRenderer->RemoveActor(myBaseActor); theRenderer->RemoveActor(myNodeExtActor); theRenderer->RemoveActor(myHighlitableActor); - theRenderer->RemoveActor(my0DActor); //theRenderer->RemoveActor(my0DExtActor); - theRenderer->RemoveActor(my1DActor); theRenderer->RemoveActor(my1DExtActor); my2DActor->RemoveFromRender(theRenderer); my2DExtActor->RemoveFromRender(theRenderer); my3DActor->RemoveFromRender(theRenderer); my3DExtActor->RemoveFromRender(theRenderer); + myNodeActor->RemoveFromRender(theRenderer); + my0DActor->RemoveFromRender(theRenderer); + my1DActor->RemoveFromRender(theRenderer); theRenderer->RemoveActor(myScalarBarActor); - theRenderer->RemoveActor(myPointLabels); - theRenderer->RemoveActor(myCellsLabels); } @@ -1306,8 +1163,6 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ my3DExtActor->VisibilityOff(); myScalarBarActor->VisibilityOff(); - myPointLabels->VisibilityOff(); - myCellsLabels->VisibilityOff(); if(GetVisibility()){ if(theIsUpdateRepersentation) @@ -1362,13 +1217,21 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ my3DActor->VisibilityOn(); } - if(myIsPointsLabeled){ - myPointLabels->VisibilityOn(); + if(myNodeActor->GetPointsLabeled()){ myNodeActor->VisibilityOn(); } - if(myIsCellsLabeled) - myCellsLabels->VisibilityOn(); + if(my0DActor) + my0DActor->UpdateLabels(); + + if(my1DActor) + my1DActor->UpdateLabels(); + + if(my2DActor) + my2DActor->UpdateLabels(); + + if(my3DActor) + my3DActor->UpdateLabels(); } #ifndef DISABLE_PLOT2DVIEWER else @@ -1622,7 +1485,7 @@ void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){ } bool SMESH_ActorDef::GetPointRepresentation(){ - return myIsPointsVisible || myIsPointsLabeled; + return myIsPointsVisible || myNodeActor->GetPointsLabeled(); } @@ -1729,12 +1592,22 @@ void SMESH_ActorDef::Update(){ if (anObjTime > aTime) SetControlMode(GetControlMode(),false); } - if(myIsPointsLabeled){ - SetPointsLabeled(myIsPointsLabeled); - } - if(myIsCellsLabeled){ - SetCellsLabeled(myIsCellsLabeled); - } + + if(myNodeActor) + myNodeActor->UpdateLabels(); + + if(my0DActor) + my0DActor->UpdateLabels(); + + if(my1DActor) + my1DActor->UpdateLabels(); + + if(my2DActor) + my2DActor->UpdateLabels(); + + if(my3DActor) + my3DActor->UpdateLabels(); + if(myIsFacesOriented){ SetFacesOriented(myIsFacesOriented); } @@ -1929,6 +1802,7 @@ SMESH_ActorDef::AddClippingPlane(vtkPlane* thePlane) myCippingPlaneCont.push_back(thePlane); if(!IsImplicitFunctionUsed()) SetImplicitFunctionUsed(true); + myNodeActor->UpdateLabels(); } return myCippingPlaneCont.size(); } @@ -1941,6 +1815,7 @@ RemoveAllClippingPlanes() myImplicitBoolean->GetFunction()->Modified(); // VTK bug myCippingPlaneCont.clear(); SetImplicitFunctionUsed(false); + myNodeActor->UpdateLabels(); } vtkIdType diff --git a/src/OBJECT/SMESH_ActorDef.h b/src/OBJECT/SMESH_ActorDef.h index 5961cbd06..6eec6aa2a 100644 --- a/src/OBJECT/SMESH_ActorDef.h +++ b/src/OBJECT/SMESH_ActorDef.h @@ -61,17 +61,14 @@ class vtkMergeFilter; class vtkPolyData; class vtkMapper; class vtkActor2D; -class vtkMaskPoints; -class vtkLabeledDataMapper; -class vtkSelectVisiblePoints; class vtkLookupTable; class vtkPlane; class vtkImplicitBoolean; class vtkTimeStamp; -class VTKViewer_CellCenters; - class SMESH_DeviceActor; +class SMESH_NodeLabelActor; +class SMESH_CellLabelActor; class SMESH_ScalarBarActor; #ifndef DISABLE_PLOT2DVIEWER @@ -167,10 +164,10 @@ class SMESH_ActorDef : public SMESH_Actor virtual void UnShrink(); virtual void SetPointsLabeled(bool theIsPointsLabeled); - virtual bool GetPointsLabeled(){ return myIsPointsLabeled;} + virtual bool GetPointsLabeled(); virtual void SetCellsLabeled(bool theIsCellsLabeled); - virtual bool GetCellsLabeled(){ return myIsCellsLabeled;} + virtual bool GetCellsLabeled(); virtual void SetFacesOriented(bool theIsFacesOriented); virtual bool GetFacesOriented(); @@ -232,7 +229,7 @@ class SMESH_ActorDef : public SMESH_Actor vtkProperty* myNodeProp; SMESH_DeviceActor* myBaseActor; - SMESH_DeviceActor* myNodeActor; + SMESH_NodeLabelActor* myNodeActor; SMESH_DeviceActor* myPickableActor; vtkProperty* myHighlightProp; @@ -244,9 +241,9 @@ class SMESH_ActorDef : public SMESH_Actor eControl myControlMode; SMESH::Controls::FunctorPtr myFunctor; vtkProperty* my2DExtProp; - SMESH_DeviceActor* my2DActor; + SMESH_CellLabelActor* my2DActor; SMESH_DeviceActor* my2DExtActor; - SMESH_DeviceActor* my3DActor; + SMESH_CellLabelActor* my3DActor; SMESH_DeviceActor* my3DExtActor; SMESH_DeviceActor* myControlActor; @@ -254,12 +251,12 @@ class SMESH_ActorDef : public SMESH_Actor SMESH_DeviceActor* myNodeExtActor; vtkProperty* my1DProp; - SMESH_DeviceActor* my1DActor; + SMESH_CellLabelActor* my1DActor; vtkProperty* my1DExtProp; SMESH_DeviceActor* my1DExtActor; vtkProperty* my0DProp; - SMESH_DeviceActor* my0DActor; + SMESH_CellLabelActor* my0DActor; vtkProperty* my0DExtProp; SMESH_DeviceActor* my0DExtActor; @@ -270,21 +267,6 @@ class SMESH_ActorDef : public SMESH_Actor bool myIsShrinkable; bool myIsShrunk; - bool myIsPointsLabeled; - vtkUnstructuredGrid* myPointsNumDataSet; - vtkActor2D *myPointLabels; - vtkMaskPoints* myPtsMaskPoints; - vtkLabeledDataMapper* myPtsLabeledDataMapper; - vtkSelectVisiblePoints* myPtsSelectVisiblePoints; - - bool myIsCellsLabeled; - vtkUnstructuredGrid* myCellsNumDataSet; - vtkActor2D *myCellsLabels; - vtkMaskPoints* myClsMaskPoints; - VTKViewer_CellCenters* myCellCenters; - vtkLabeledDataMapper* myClsLabeledDataMapper; - vtkSelectVisiblePoints* myClsSelectVisiblePoints; - vtkImplicitBoolean* myImplicitBoolean; typedef TVTKSmartPtr TPlanePtr; typedef std::vector TCippingPlaneCont; diff --git a/src/OBJECT/SMESH_CellLabelActor.cxx b/src/OBJECT/SMESH_CellLabelActor.cxx new file mode 100644 index 000000000..399bc869f --- /dev/null +++ b/src/OBJECT/SMESH_CellLabelActor.cxx @@ -0,0 +1,185 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESH_CellLabelActor.cxx +// Author : Roman NIKOLAEV +// Module : SMESH +// +#include "SMESH_CellLabelActor.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +vtkStandardNewMacro(SMESH_CellLabelActor); + +/*! + Constructor. +*/ +SMESH_CellLabelActor::SMESH_CellLabelActor() { + //Definition of cells numbering pipeline + //--------------------------------------- + myCellsNumDataSet = vtkPolyData::New(); + + myCellCenters = VTKViewer_CellCenters::New(); + myCellCenters->SetInput(myCellsNumDataSet); + + myClsMaskPoints = vtkMaskPoints::New(); + myClsMaskPoints->SetInput(myCellCenters->GetOutput()); + myClsMaskPoints->SetOnRatio(1); + + myClsSelectVisiblePoints = vtkSelectVisiblePoints::New(); + myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput()); + myClsSelectVisiblePoints->SelectInvisibleOff(); + myClsSelectVisiblePoints->SetTolerance(0.1); + + myClsLabeledDataMapper = vtkLabeledDataMapper::New(); + myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput()); + + myClsLabeledDataMapper->SetLabelFormat("%d"); + myClsLabeledDataMapper->SetLabelModeToLabelScalars(); + + vtkTextProperty* aClsTextProp = vtkTextProperty::New(); + aClsTextProp->SetFontFamilyToTimes(); + static int aCellsFontSize = 12; + aClsTextProp->SetFontSize(aCellsFontSize); + aClsTextProp->SetBold(1); + aClsTextProp->SetItalic(0); + aClsTextProp->SetShadow(0); + myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp); + aClsTextProp->Delete(); + + myIsCellsLabeled = false; + + myCellsLabels = vtkActor2D::New(); + myCellsLabels->SetMapper(myClsLabeledDataMapper); + myCellsLabels->GetProperty()->SetColor(0,1,0); + myCellsLabels->SetVisibility(myIsCellsLabeled); + + vtkCallbackCommand* callBackCommand = vtkCallbackCommand::New(); + callBackCommand->SetClientData(this); + callBackCommand->SetCallback(SMESH_CellLabelActor::ProcessEvents); + + myTransformFilter->AddObserver("VTKViewer_TransformFilter::TransformationFinished", + callBackCommand); + callBackCommand->Delete(); +} + + +/*! + Destructor. +*/ +SMESH_CellLabelActor::~SMESH_CellLabelActor() { + //Deleting of cells numbering pipeline + //--------------------------------------- + myCellsNumDataSet->Delete(); + + myClsLabeledDataMapper->RemoveAllInputs(); + myClsLabeledDataMapper->Delete(); + + // commented: porting to vtk 5.0 + // myClsSelectVisiblePoints->UnRegisterAllOutputs(); + myClsSelectVisiblePoints->Delete(); + + // commented: porting to vtk 5.0 + // myClsMaskPoints->UnRegisterAllOutputs(); + myClsMaskPoints->Delete(); + + // commented: porting to vtk 5.0 + // myCellCenters->UnRegisterAllOutputs(); + myCellCenters->Delete(); + + myCellsLabels->Delete(); +} + + +void SMESH_CellLabelActor::SetCellsLabeled(bool theIsCellsLabeled) { + myTransformFilter->Update(); + vtkPolyData* aGrid = vtkPolyData::SafeDownCast(myTransformFilter->GetOutput()); + if(!aGrid) + return; + + myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints(); + if(myIsCellsLabeled){ + myCellsNumDataSet->ShallowCopy(aGrid); + vtkDataSet *aDataSet = myCellsNumDataSet; + int aNbElem = aDataSet->GetNumberOfCells(); + vtkIntArray *anArray = vtkIntArray::New(); + anArray->SetNumberOfValues(aNbElem); + for(int anId = 0; anId < aNbElem; anId++){ + int aSMDSId = GetElemObjId(anId); + anArray->SetValue(anId,aSMDSId); + } + aDataSet->GetCellData()->SetScalars(anArray); + myCellCenters->SetInput(aDataSet); + myCellsLabels->SetVisibility(GetVisibility()); + }else{ + myCellsLabels->SetVisibility(false); + } +} + +void SMESH_CellLabelActor::SetVisibility(int theMode) +{ + SMESH_DeviceActor::SetVisibility(theMode); + myCellsLabels->VisibilityOff(); + if(myIsCellsLabeled && theMode) + myCellsLabels->VisibilityOn(); +} + +void SMESH_CellLabelActor::AddToRender(vtkRenderer* theRenderer) +{ + SMESH_DeviceActor::AddToRender(theRenderer); + myClsSelectVisiblePoints->SetRenderer(theRenderer); + theRenderer->AddActor2D(myCellsLabels); +} + +void SMESH_CellLabelActor::RemoveFromRender(vtkRenderer* theRenderer) +{ + theRenderer->RemoveActor(myCellsLabels); + SMESH_DeviceActor::RemoveFromRender(theRenderer); +} + +void SMESH_CellLabelActor::UpdateLabels() { + if(myIsCellsLabeled) + SetCellsLabeled(myIsCellsLabeled); +} + + +void SMESH_CellLabelActor::ProcessEvents(vtkObject* vtkNotUsed(theObject), + unsigned long theEvent, + void* theClientData, + void* vtkNotUsed(theCallData)) { + SMESH_CellLabelActor* self = reinterpret_cast(theClientData); + if(self) + self->UpdateLabels(); +} diff --git a/src/OBJECT/SMESH_CellLabelActor.h b/src/OBJECT/SMESH_CellLabelActor.h new file mode 100644 index 000000000..dda47fea5 --- /dev/null +++ b/src/OBJECT/SMESH_CellLabelActor.h @@ -0,0 +1,82 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESH_CellLabelActor.h +// Author : Roman NIKOLAEV +// Module : SMESH +// +#ifndef SMESH_CELL_LABEL_ACTOR_H +#define SMESH_CELL_LABEL_ACTOR_H + +#include "SMESH_DeviceActor.h" + +class vtkSelectVisiblePoints; +class vtkLabeledDataMapper; +class vtkActor2D; +class vtkMaskPoints; +class vtkPolyData; + +class VTKViewer_CellCenters; + + +class SMESHOBJECT_EXPORT SMESH_CellLabelActor : public SMESH_DeviceActor { +public: + static SMESH_CellLabelActor* New(); + + static void ProcessEvents(vtkObject* theObject, + unsigned long theEvent, + void* theClientData, + void* theCallData); + + + vtkTypeMacro(SMESH_CellLabelActor, SMESH_DeviceActor); + + + virtual void SetCellsLabeled(bool theIsCellsLabeled); + virtual bool GetCellsLabeled(){ return myIsCellsLabeled;} + + virtual void SetVisibility(int theMode); + + virtual void AddToRender(vtkRenderer* theRenderer); + virtual void RemoveFromRender(vtkRenderer* theRenderer); + + void UpdateLabels(); + +protected: + SMESH_CellLabelActor(); + ~SMESH_CellLabelActor(); + + bool myIsCellsLabeled; + vtkPolyData* myCellsNumDataSet; + vtkActor2D *myCellsLabels; + vtkMaskPoints* myClsMaskPoints; + VTKViewer_CellCenters* myCellCenters; + vtkLabeledDataMapper* myClsLabeledDataMapper; + vtkSelectVisiblePoints* myClsSelectVisiblePoints; + SMESH_DeviceActor* myBaseActor; //Pointer to the base actor + +protected: + // Not implemented. + SMESH_CellLabelActor(const SMESH_CellLabelActor&); + void operator=(const SMESH_CellLabelActor&); +}; + +#endif //SMESH_NODE_LABEL_ACTOR_H diff --git a/src/OBJECT/SMESH_DeviceActor.cxx b/src/OBJECT/SMESH_DeviceActor.cxx index fe08178a9..6032c5734 100644 --- a/src/OBJECT/SMESH_DeviceActor.cxx +++ b/src/OBJECT/SMESH_DeviceActor.cxx @@ -626,7 +626,7 @@ void SMESH_DeviceActor ::SetFacesOriented(bool theIsFacesOriented) { - if ( vtkDataSet* aDataSet = myPassFilter[ 1 ]->GetOutput() ) + if ( vtkDataSet* aDataSet = myTransformFilter->GetOutput() ) { myIsFacesOriented = theIsFacesOriented; if( theIsFacesOriented ) diff --git a/src/OBJECT/SMESH_NodeLabelActor.cxx b/src/OBJECT/SMESH_NodeLabelActor.cxx new file mode 100644 index 000000000..51c913585 --- /dev/null +++ b/src/OBJECT/SMESH_NodeLabelActor.cxx @@ -0,0 +1,187 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESH_NodeLabelActor.cxx +// Author : Roman NIKOLAEV +// Module : SMESH +// +#include "SMESH_NodeLabelActor.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +vtkStandardNewMacro(SMESH_NodeLabelActor); + +/*! + Constructor. +*/ +SMESH_NodeLabelActor::SMESH_NodeLabelActor() { + //Definition of points numbering pipeline + //--------------------------------------- + myPointsNumDataSet = vtkPolyData::New(); + + myPtsMaskPoints = vtkMaskPoints::New(); + myPtsMaskPoints->SetInput(myPointsNumDataSet); + myPtsMaskPoints->SetOnRatio(1); + + myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New(); + myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput()); + myPtsSelectVisiblePoints->SelectInvisibleOff(); + myPtsSelectVisiblePoints->SetTolerance(0.1); + + myPtsLabeledDataMapper = vtkLabeledDataMapper::New(); + myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput()); + myPtsLabeledDataMapper->SetLabelFormat("%d"); + myPtsLabeledDataMapper->SetLabelModeToLabelScalars(); + + vtkTextProperty* aPtsTextProp = vtkTextProperty::New(); + aPtsTextProp->SetFontFamilyToTimes(); + static int aPointsFontSize = 10; + aPtsTextProp->SetFontSize(aPointsFontSize); + aPtsTextProp->SetBold(1); + aPtsTextProp->SetItalic(0); + aPtsTextProp->SetShadow(0); + myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp); + aPtsTextProp->Delete(); + + myIsPointsLabeled = false; + + myPointLabels = vtkActor2D::New(); + myPointLabels->SetMapper(myPtsLabeledDataMapper); + myPointLabels->GetProperty()->SetColor(1,1,1); + myPointLabels->SetVisibility(myIsPointsLabeled); + + vtkCallbackCommand* callBackCommand = vtkCallbackCommand::New(); + callBackCommand->SetClientData(this); + callBackCommand->SetCallback(SMESH_NodeLabelActor::ProcessEvents); + + myTransformFilter->AddObserver("VTKViewer_TransformFilter::TransformationFinished", + callBackCommand); + callBackCommand->Delete(); +} + +/*! + Destructor +*/ +SMESH_NodeLabelActor::~SMESH_NodeLabelActor() { + //Deleting of points numbering pipeline + //--------------------------------------- + myPointsNumDataSet->Delete(); + + // commented: porting to vtk 5.0 + // myPtsLabeledDataMapper->RemoveAllInputs(); + myPtsLabeledDataMapper->Delete(); + + // commented: porting to vtk 5.0 + // myPtsSelectVisiblePoints->UnRegisterAllOutputs(); + myPtsSelectVisiblePoints->Delete(); + + // commented: porting to vtk 5.0 + // myPtsMaskPoints->UnRegisterAllOutputs(); + myPtsMaskPoints->Delete(); + myPointLabels->Delete(); + +} + +void SMESH_NodeLabelActor::SetPointsLabeled(bool theIsPointsLabeled) { + myTransformFilter->Update(); + vtkDataSet* aGrid = vtkPolyData::SafeDownCast(myTransformFilter->GetOutput()); + + if(!aGrid) + return; + + myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints(); + + if ( myIsPointsLabeled ) + { + myPointsNumDataSet->ShallowCopy(aGrid); + vtkDataSet *aDataSet = myPointsNumDataSet; + + int aNbElem = aDataSet->GetNumberOfPoints(); + + vtkIntArray *anArray = vtkIntArray::New(); + anArray->SetNumberOfValues( aNbElem ); + + for ( vtkIdType anId = 0; anId < aNbElem; anId++ ) + { + int aSMDSId = GetNodeObjId( anId ); + anArray->SetValue( anId, aSMDSId ); + } + + aDataSet->GetPointData()->SetScalars( anArray ); + myPtsMaskPoints->SetInput( aDataSet ); + myPointLabels->SetVisibility( GetVisibility() ); + anArray->Delete(); + } + else + { + myPointLabels->SetVisibility( false ); + } +} + + +void SMESH_NodeLabelActor::SetVisibility(int theMode) +{ + SMESH_DeviceActor::SetVisibility(theMode); + myPointLabels->VisibilityOff(); + if(myIsPointsLabeled && theMode) + myPointLabels->VisibilityOn(); +} + + +void SMESH_NodeLabelActor::AddToRender(vtkRenderer* theRenderer) +{ + SMESH_DeviceActor::AddToRender(theRenderer); + myPtsSelectVisiblePoints->SetRenderer(theRenderer); + theRenderer->AddActor2D(myPointLabels); +} + +void SMESH_NodeLabelActor::RemoveFromRender(vtkRenderer* theRenderer) +{ + theRenderer->RemoveActor(myPointLabels); + SMESH_DeviceActor::RemoveFromRender(theRenderer); +} + +void SMESH_NodeLabelActor::UpdateLabels() { + if(myIsPointsLabeled) + SetPointsLabeled(myIsPointsLabeled); +} + + +void SMESH_NodeLabelActor::ProcessEvents(vtkObject* vtkNotUsed(theObject), + unsigned long theEvent, + void* theClientData, + void* vtkNotUsed(theCallData)) { + SMESH_NodeLabelActor* self = reinterpret_cast(theClientData); + if(self) + self->UpdateLabels(); +} diff --git a/src/OBJECT/SMESH_NodeLabelActor.h b/src/OBJECT/SMESH_NodeLabelActor.h new file mode 100644 index 000000000..0a9ffaa70 --- /dev/null +++ b/src/OBJECT/SMESH_NodeLabelActor.h @@ -0,0 +1,78 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESH_NodeLabelActor.h +// Author : Roman NIKOLAEV +// Module : SMESH +// +#ifndef SMESH_NODE_LABEL_ACTOR_H +#define SMESH_NODE_LABEL_ACTOR_H + +#include "SMESH_DeviceActor.h" + +class vtkSelectVisiblePoints; +class vtkLabeledDataMapper; +class vtkActor2D; +class vtkMaskPoints; +class vtkPolyData; + + +class SMESHOBJECT_EXPORT SMESH_NodeLabelActor : public SMESH_DeviceActor { +public: + static SMESH_NodeLabelActor* New(); + + static void ProcessEvents(vtkObject* theObject, + unsigned long theEvent, + void* theClientData, + void* theCallData); + + + vtkTypeMacro(SMESH_NodeLabelActor, SMESH_DeviceActor); + + + virtual void SetPointsLabeled(bool theIsPointsLabeled); + virtual bool GetPointsLabeled(){ return myIsPointsLabeled;} + + virtual void SetVisibility(int theMode); + + virtual void AddToRender(vtkRenderer* theRenderer); + virtual void RemoveFromRender(vtkRenderer* theRenderer); + + void UpdateLabels(); + +protected: + SMESH_NodeLabelActor(); + ~SMESH_NodeLabelActor(); + + bool myIsPointsLabeled; + vtkPolyData* myPointsNumDataSet; + vtkActor2D *myPointLabels; + vtkMaskPoints* myPtsMaskPoints; + vtkLabeledDataMapper* myPtsLabeledDataMapper; + vtkSelectVisiblePoints* myPtsSelectVisiblePoints; + +protected: + // Not implemented. + SMESH_NodeLabelActor(const SMESH_NodeLabelActor&); + void operator=(const SMESH_NodeLabelActor&); +}; + +#endif //SMESH_NODE_LABEL_ACTOR_H -- 2.30.2