-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE
//
-// 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.
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
-// 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.
+// 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, or (at your option) any later version.
//
-// 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
+// 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
//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
#include "SVTK_Actor.h"
#include "SALOME_Actor.h"
+#include "SVTK_Utils.h"
+
+#include "SALOME_InteractiveObject.hxx"
// VTK Includes
#include <vtkObjectFactory.h>
#include <vtkRenderer.h>
#include <vtkCell.h>
+#include <vtkVersion.h>
+#define VTK_XVERSION (VTK_MAJOR_VERSION*10000+VTK_MINOR_VERSION*100+VTK_BUILD_VERSION)
+#if VTK_XVERSION > 50700
+#include <vtkPolyhedron.h>
+#endif
#include <vtkPolyData.h>
-using namespace std;
+#include "Utils_SALOME_Exception.hxx"
+#include "utilities.h"
-static
-void
-CopyPoints(vtkUnstructuredGrid* theGrid, vtkDataSet *theSourceDataSet)
-{
- vtkPoints *aPoints = vtkPoints::New();
- vtkIdType iEnd = theSourceDataSet->GetNumberOfPoints();
- aPoints->SetNumberOfPoints(iEnd);
- for(vtkIdType i = 0; i < iEnd; i++){
- aPoints->SetPoint(i,theSourceDataSet->GetPoint(i));
- }
- theGrid->SetPoints(aPoints);
- aPoints->Delete();
-}
-
-//=======================================================================
-
-vtkStandardNewMacro(SVTK_Actor);
+vtkStandardNewMacro(SVTK_Actor)
+/*!
+ Constructor
+*/
SVTK_Actor
::SVTK_Actor():
myUnstructuredGrid(vtkUnstructuredGrid::New())
{
myIsShaded = true;
+ myIsResolveCoincidentTopology = false;
Visibility = Pickable = false;
myUnstructuredGrid->Allocate();
}
-//----------------------------------------------------------------------------
void
SVTK_Actor
::Initialize()
{
- SetInput(GetSource());
+ SetInputData(GetSource());
}
-
-//----------------------------------------------------------------------------
void
SVTK_Actor
::SetSource(vtkUnstructuredGrid* theUnstructuredGrid)
myUnstructuredGrid = theUnstructuredGrid;
- SetInput(theUnstructuredGrid);
+ SetInputData(theUnstructuredGrid);
}
vtkUnstructuredGrid*
return myUnstructuredGrid.GetPointer();
}
-
-//----------------------------------------------------------------------------
+/*!
+ Destructor
+*/
SVTK_Actor
::~SVTK_Actor()
{
}
-
-//----------------------------------------------------------------------------
-const TColStd_IndexedMapOfInteger&
+const SVTK_TIndexedMapOfVtkId&
SVTK_Actor
::GetMapIndex() const
{
}
-//----------------------------------------------------------------------------
+const SVTK_IndexedMapOfVtkIds&
+SVTK_Actor
+::GetMapCompositeIndex() const
+{
+ return myMapCompositeIndex;
+}
+
void
SVTK_Actor
::MapCells(SALOME_Actor* theMapActor,
- const TColStd_IndexedMapOfInteger& theMapIndex)
+ const SVTK_TIndexedMapOfVtkId& theMapIndex)
{
myUnstructuredGrid->Initialize();
myUnstructuredGrid->Allocate();
- vtkDataSet *aSourceDataSet = theMapActor->GetInput();
- CopyPoints(GetSource(),aSourceDataSet);
+ vtkUnstructuredGrid * aSourceGrid = (vtkUnstructuredGrid *)theMapActor->GetInput();
+ GetSource()->SetPoints( aSourceGrid->GetPoints() );
int aNbOfParts = theMapIndex.Extent();
for(int ind = 1; ind <= aNbOfParts; ind++){
int aPartId = theMapIndex( ind );
if(vtkCell* aCell = theMapActor->GetElemCell(aPartId))
- myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+ {
+#if VTK_XVERSION > 50700
+ if (aCell->GetCellType() != VTK_POLYHEDRON)
+#endif
+ myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+#if VTK_XVERSION > 50700
+ else
+ {
+ vtkPolyhedron *polyhedron = dynamic_cast<vtkPolyhedron*>(aCell);
+ if (!polyhedron)
+ throw SALOME_Exception(LOCALIZED ("not a polyhedron"));
+ vtkIdType *pts = polyhedron->GetFaces();
+ myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),pts[0], pts+1);
+ }
+#endif
+ }
}
UnShrink();
myMapIndex = theMapIndex;
}
-
-//----------------------------------------------------------------------------
void
SVTK_Actor
::MapPoints(SALOME_Actor* theMapActor,
- const TColStd_IndexedMapOfInteger& theMapIndex)
+ const SVTK_TIndexedMapOfVtkId& theMapIndex)
{
myUnstructuredGrid->Initialize();
myUnstructuredGrid->Allocate();
if(int aNbOfParts = theMapIndex.Extent()){
vtkPoints *aPoints = vtkPoints::New();
aPoints->SetNumberOfPoints(aNbOfParts);
- for(int i = 0; i < aNbOfParts; i++){
- int aPartId = theMapIndex( i+1 );
- if(float* aCoord = theMapActor->GetNodeCoord(aPartId)){
- aPoints->SetPoint(i,aCoord);
- myUnstructuredGrid->InsertNextCell(VTK_VERTEX,1,&i);
+ for(vtkIdType i = 0; i < aNbOfParts; i++){
+ vtkIdType aPartId = theMapIndex( i+1 );
+ if(double* aCoord = theMapActor->GetNodeCoord(aPartId)){
+ aPoints->SetPoint(i,aCoord);
+ // Change the type from int to vtkIdType in order to avoid compilation errors while using VTK
+ // from ParaView-3.4.0 compiled on 64-bit Debian platform with VTK_USE_64BIT_IDS = ON
+ myUnstructuredGrid->InsertNextCell(VTK_VERTEX,(vtkIdType) 1,&i);
}
}
myUnstructuredGrid->SetPoints(aPoints);
myMapIndex = theMapIndex;
}
-
-//----------------------------------------------------------------------------
void
SVTK_Actor
::MapEdge(SALOME_Actor* theMapActor,
- const TColStd_IndexedMapOfInteger& theMapIndex)
+ const SVTK_TIndexedMapOfVtkId& theMapIndex)
{
myUnstructuredGrid->Initialize();
myUnstructuredGrid->Allocate();
- vtkDataSet *aSourceDataSet = theMapActor->GetInput();
- CopyPoints(GetSource(),aSourceDataSet);
+ vtkUnstructuredGrid * aSourceGrid = (vtkUnstructuredGrid *)theMapActor->GetInput();
+ GetSource()->SetPoints( aSourceGrid->GetPoints() );
if(theMapIndex.Extent() == 2){
if(aCellId > 0){
if(vtkCell* aCell = theMapActor->GetElemCell(aCellId)){
- if(anEdgeId < 0){
- anEdgeId = -anEdgeId - 1;
- int aNbOfEdges = aCell->GetNumberOfEdges();
- if(0 <= anEdgeId || anEdgeId < aNbOfEdges){
- if(vtkCell* anEdge = aCell->GetEdge(anEdgeId))
- myUnstructuredGrid->InsertNextCell(VTK_LINE,anEdge->GetPointIds());
- }
- }
+ if(anEdgeId < 0){
+ anEdgeId = -anEdgeId - 1;
+ int aNbOfEdges = aCell->GetNumberOfEdges();
+ if(0 <= anEdgeId || anEdgeId < aNbOfEdges){
+ if(vtkCell* anEdge = aCell->GetEdge(anEdgeId))
+ myUnstructuredGrid->InsertNextCell(VTK_LINE,anEdge->GetPointIds());
+ }
+ }
}
}
}
myMapIndex = theMapIndex;
}
-//----------------------------------------------------------------------------
+void
+SVTK_Actor
+::MapEdge( SALOME_Actor* theMapActor,
+ const SVTK_IndexedMapOfVtkIds& theMapCompositeIndex) {
+ myUnstructuredGrid->Initialize();
+ myUnstructuredGrid->Allocate();
+
+ vtkUnstructuredGrid * aSourceGrid = ( vtkUnstructuredGrid * )theMapActor->GetInput();
+ GetSource()->SetPoints( aSourceGrid->GetPoints() );
+
+ vtkIdType aNbOfParts = theMapCompositeIndex.Extent();
+ for(vtkIdType ind = 1; ind <= aNbOfParts; ind++){
+ std::vector<vtkIdType> aNodesIds = theMapCompositeIndex( ind );
+ vtkSmartPointer<vtkIdList> ids = vtkSmartPointer<vtkIdList>::New();
+ ids->InsertNextId(theMapActor->GetNodeVtkId( aNodesIds[0] ) );
+ ids->InsertNextId(theMapActor->GetNodeVtkId( aNodesIds[1] ) );
+ myUnstructuredGrid->InsertNextCell(VTK_LINE,ids);
+ }
+
+ UnShrink();
+ if(theMapActor->IsShrunk()){
+ SetShrinkFactor(theMapActor->GetShrinkFactor());
+ SetShrink();
+ }
+
+ myMapCompositeIndex = theMapCompositeIndex;
+}
+
+/*!
+ To publish the actor an all its internal devices
+*/
+void
+SVTK_Actor
+::AddToRender(vtkRenderer* theRenderer)
+{
+ theRenderer->AddActor(this);
+}
+
+void
+SVTK_Actor
+::RemoveFromRender(vtkRenderer* theRenderer)
+{
+ theRenderer->RemoveActor(this);
+}