// SMESH OBJECT : interactive object for SMESH visualization // // Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // // File : SMESH_Actor.cxx // Author : Nicolas REJNERI // Module : SMESH // $Header$ #include "SMESH_DeviceActor.h" #include "SALOME_Transform.h" #include "SALOME_TransformFilter.h" #include "SALOME_PassThroughFilter.h" #include "SALOME_ExtractUnstructuredGrid.h" #include "utilities.h" // VTK Includes #include #include #include #include #include #include #include #include #ifdef _DEBUG_ static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0; #else static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0; #endif using namespace std; vtkStandardNewMacro(SMESH_DeviceActor); SMESH_DeviceActor::SMESH_DeviceActor(){ if(MYDEBUG) MESSAGE("SMESH_DeviceActor"); myIsShrunk = false; myIsShrinkable = false; myRepresentation = eSurface; myProperty = vtkProperty::New(); myMapper = vtkPolyDataMapper::New(); vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor, myPolygonOffsetUnits); //myMapper->SetResolveCoincidentTopologyToShiftZBuffer(); //myMapper->SetResolveCoincidentTopologyZShift(0.02); myMapper->UseLookupTableScalarRangeOn(); myMapper->SetColorModeToMapScalars(); myShrinkFilter = vtkShrinkFilter::New(); myExtractUnstructuredGrid = SALOME_ExtractUnstructuredGrid::New(); myExtractUnstructuredGrid->SetStoreMapping(true); myMergeFilter = vtkMergeFilter::New(); myStoreMapping = false; myGeomFilter = SALOME_GeometryFilter::New(); myTransformFilter = SALOME_TransformFilter::New(); for(int i = 0; i < 6; i++) myPassFilter.push_back(SALOME_PassThroughFilter::New()); } SMESH_DeviceActor::~SMESH_DeviceActor(){ if(MYDEBUG) MESSAGE("~SMESH_DeviceActor"); myProperty->Delete(); myMapper->RemoveAllInputs(); myMapper->Delete(); myShrinkFilter->UnRegisterAllOutputs(); myShrinkFilter->Delete(); myExtractUnstructuredGrid->UnRegisterAllOutputs(); myExtractUnstructuredGrid->Delete(); myMergeFilter->UnRegisterAllOutputs(); myMergeFilter->Delete(); myGeomFilter->UnRegisterAllOutputs(); myGeomFilter->Delete(); myTransformFilter->UnRegisterAllOutputs(); myTransformFilter->Delete(); for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){ myPassFilter[i]->UnRegisterAllOutputs(); myPassFilter[i]->Delete(); } } void SMESH_DeviceActor::SetStoreMapping(int theStoreMapping){ myStoreMapping = theStoreMapping; Modified(); } void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){ if(theGrid){ //myIsShrinkable = theGrid->GetNumberOfCells() > 10; myIsShrinkable = true; myExtractUnstructuredGrid->SetInput(theGrid); myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput()); theGrid = static_cast(myMergeFilter->GetOutput()); int anId = 0; myPassFilter[ anId ]->SetInput( theGrid ); myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() ); anId++; // 1 myGeomFilter->SetStoreMapping( myStoreMapping ); myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() ); anId++; // 2 myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() ); myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); anId++; // 3 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); anId++; // 4 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); anId++; // 5 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); vtkLODActor::SetMapper( myMapper ); Modified(); } } SALOME_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){ return myExtractUnstructuredGrid; } vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){ myExtractUnstructuredGrid->Update(); return myExtractUnstructuredGrid->GetOutput(); } vtkMergeFilter* SMESH_DeviceActor::GetMergeFilter(){ return myMergeFilter; } vtkPolyData* SMESH_DeviceActor::GetPolyDataInput(){ return myPassFilter.back()->GetPolyDataOutput(); } unsigned long int SMESH_DeviceActor::GetMTime(){ unsigned long mTime = this->Superclass::GetMTime(); mTime = max(mTime,myExtractUnstructuredGrid->GetMTime()); mTime = max(mTime,myMergeFilter->GetMTime()); mTime = max(mTime,myGeomFilter->GetMTime()); mTime = max(mTime,myTransformFilter->GetMTime()); return mTime; } void SMESH_DeviceActor::SetTransform(SALOME_Transform* theTransform){ myTransformFilter->SetTransform(theTransform); } void SMESH_DeviceActor::SetShrink() { if ( !myIsShrinkable ) return; if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) { myShrinkFilter->SetInput( aDataSet ); myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() ); myIsShrunk = true; } } void SMESH_DeviceActor::UnShrink() { if ( !myIsShrunk ) return; if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) { myPassFilter[ 1 ]->SetInput( aDataSet ); myPassFilter[ 1 ]->Modified(); myIsShrunk = false; Modified(); } } void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){ switch(theMode){ case ePoint: myGeomFilter->SetInside(true); GetProperty()->SetRepresentation(0); break; case eInsideframe: myGeomFilter->SetInside(true); GetProperty()->SetRepresentation(1); break; default : GetProperty()->SetRepresentation(theMode); myGeomFilter->SetInside(false); } myRepresentation = theMode; myMapper->Modified(); Modified(); } void SMESH_DeviceActor::SetVisibility(int theMode){ if(!myExtractUnstructuredGrid->GetInput() || GetUnstructuredGrid()->GetNumberOfCells()){ vtkLODActor::SetVisibility(theMode); }else{ vtkLODActor::SetVisibility(false); } } int SMESH_DeviceActor::GetVisibility(){ if(!GetUnstructuredGrid()->GetNumberOfCells()){ vtkLODActor::SetVisibility(false); } return vtkLODActor::GetVisibility(); } int SMESH_DeviceActor::GetObjId(int theVtkID){ if (GetRepresentation() == ePoint){ return GetNodeObjId(theVtkID); }else{ return GetElemObjId(theVtkID); } } SMESH_DeviceActor::TVectorId SMESH_DeviceActor::GetVtkId(int theObjID){ if (GetRepresentation() == ePoint){ return GetNodeVtkId(theObjID); }else{ return GetElemVtkId(theObjID); } } int SMESH_DeviceActor::GetNodeObjId(int theVtkID){ vtkIdType aRetID = myVisualObj->GetNodeObjId(theVtkID); if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<