Salome HOME
Copyright update 2022
[modules/gui.git] / src / SVTK / SVTK_Actor.cxx
index 337075bb1a4e8d52e43b9dfba5b3886709200cfc..ec6ca767df9735748ba244a30b88f3f56dd5983e 100644 (file)
@@ -1,24 +1,30 @@
-//  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;
 
@@ -62,16 +62,13 @@ SVTK_Actor
   myUnstructuredGrid->Allocate();
 }
 
-//----------------------------------------------------------------------------
 void
 SVTK_Actor
 ::Initialize()
 {
-  SetInput(GetSource());
+  SetInputData(GetSource());
 }
 
-
-//----------------------------------------------------------------------------
 void
 SVTK_Actor
 ::SetSource(vtkUnstructuredGrid* theUnstructuredGrid)
@@ -81,7 +78,7 @@ SVTK_Actor
 
   myUnstructuredGrid = theUnstructuredGrid;
 
-  SetInput(theUnstructuredGrid);
+  SetInputData(theUnstructuredGrid);
 }
 
 vtkUnstructuredGrid*
@@ -91,16 +88,15 @@ SVTK_Actor
   return myUnstructuredGrid.GetPointer();
 }
 
-
-//----------------------------------------------------------------------------
+/*!
+  Destructor
+*/
 SVTK_Actor
 ::~SVTK_Actor()
 {
 }
 
-
-//----------------------------------------------------------------------------
-const TColStd_IndexedMapOfInteger&
+const SVTK_TIndexedMapOfVtkId&
 SVTK_Actor
 ::GetMapIndex() const
 {
@@ -108,23 +104,44 @@ SVTK_Actor
 }
 
 
-//----------------------------------------------------------------------------
+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();
@@ -136,12 +153,10 @@ SVTK_Actor
   myMapIndex = theMapIndex;
 }
 
-
-//----------------------------------------------------------------------------
 void 
 SVTK_Actor
 ::MapPoints(SALOME_Actor* theMapActor,
-           const TColStd_IndexedMapOfInteger& theMapIndex)
+            const SVTK_TIndexedMapOfVtkId& theMapIndex)
 {
   myUnstructuredGrid->Initialize();
   myUnstructuredGrid->Allocate();
@@ -149,11 +164,13 @@ SVTK_Actor
   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);
@@ -165,18 +182,16 @@ SVTK_Actor
   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){
@@ -185,14 +200,14 @@ SVTK_Actor
 
     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());
+          }
+        }
       }
     }
   }
@@ -206,4 +221,47 @@ SVTK_Actor
   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);
+}