Salome HOME
54416: Extrusion 3D algo is not applicable to a prismatic shape
[modules/smesh.git] / src / OBJECT / SMESH_Actor.cxx
index 0bf3b4176b75cafffaf3ddaf8566305d77f0cce6..4344b89a4828903b34739538b2d06359293c8b1a 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019  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
@@ -732,6 +732,7 @@ void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled)
   if(myBallActor)
     myBallActor->SetCellsLabeled(theIsCellsLabeled);
 
+  SetRepresentation(GetRepresentation());
   myTimeStamp->Modified();
 }
 
@@ -1109,7 +1110,7 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
     }
     QString aTitle = QString(myScalarBarActor->GetTitle());
     aTitle.replace(QRegExp("(:\\s).*"),"\\1"+ QString::number(GetNumberControlEntities()));
-    myScalarBarActor->SetTitle(aTitle.toLatin1().constData());
+    myScalarBarActor->SetTitle(aTitle.toUtf8().constData());
 
   }
   else {
@@ -1545,7 +1546,8 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation)
         myScalarBarActor->VisibilityOn();
     }
 
-    myPickableActor->VisibilityOn();
+    if ( GetPickable( ))
+      myPickableActor->VisibilityOn();
 
     if ( GetRepresentation() != ePoint )
     {
@@ -1555,7 +1557,8 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation)
       if(myEntityMode & eBallElem    ){
         myBallActor->VisibilityOn();
       }
-      if(myEntityMode & eEdges && GetCellsLabeled() ){ // my1DActor shows labels only
+      if(myEntityMode & eEdges && ( GetCellsLabeled() || // my1DActor shows labels only
+                                    ( myControlActor == my1DActor && myControlMode != eNone ))){
         my1DActor->VisibilityOn();
       }
       if(myEntityMode & eFaces      ){
@@ -1653,95 +1656,7 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode)
     myEntityMode = theMode; // entities to show
 
     // Set cell types to extract
-
-    VTKViewer_ExtractUnstructuredGrid*    aFilter = myBaseActor->GetExtractUnstructuredGrid();
-    VTKViewer_ExtractUnstructuredGrid* aHltFilter = myHighlitableActor->GetExtractUnstructuredGrid();
-    aFilter->ClearRegisteredCellsWithType();
-    aHltFilter->ClearRegisteredCellsWithType();
-
-    bool isPassAll = ( myEntityMode == anObjectEntities && myEntityMode );
-    if ( isPassAll )
-    {
-      aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
-      aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
-    }
-    else
-    {
-      aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
-      aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
-
-      if (myEntityMode & e0DElements) {
-        aFilter->RegisterCellsWithType(VTK_VERTEX);
-        aHltFilter->RegisterCellsWithType(VTK_VERTEX);
-      }
-
-      if (myEntityMode & eBallElem) {
-        aFilter->RegisterCellsWithType(VTK_POLY_VERTEX);
-      }
-
-      if (myEntityMode & eEdges) {
-        aFilter->RegisterCellsWithType(VTK_LINE);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
-
-        aHltFilter->RegisterCellsWithType(VTK_LINE);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
-      }
-
-      if (myEntityMode & eFaces) {
-        aFilter->RegisterCellsWithType(VTK_TRIANGLE);
-        aFilter->RegisterCellsWithType(VTK_QUAD);
-        aFilter->RegisterCellsWithType(VTK_POLYGON);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
-        aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
-        aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
-
-        aHltFilter->RegisterCellsWithType(VTK_TRIANGLE);
-        aHltFilter->RegisterCellsWithType(VTK_QUAD);
-        aHltFilter->RegisterCellsWithType(VTK_POLYGON);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
-        aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
-        aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
-      }
-
-      if (myEntityMode & eVolumes) {
-        aFilter->RegisterCellsWithType(VTK_TETRA);
-        aFilter->RegisterCellsWithType(VTK_VOXEL);
-        aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
-        aFilter->RegisterCellsWithType(VTK_WEDGE);
-        aFilter->RegisterCellsWithType(VTK_PYRAMID);
-        aFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
-        aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
-        aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
-        aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
-        aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
-        aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
-
-        aHltFilter->RegisterCellsWithType(VTK_TETRA);
-        aHltFilter->RegisterCellsWithType(VTK_VOXEL);
-        aHltFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
-        aHltFilter->RegisterCellsWithType(VTK_WEDGE);
-        aHltFilter->RegisterCellsWithType(VTK_PYRAMID);
-        aHltFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
-        aHltFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
-        aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
-        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
-        aHltFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
-        aHltFilter->RegisterCellsWithType(VTK_POLYHEDRON);
-      }
-    }
-    if ( GetVisibility() )
-      aFilter->Update();
-    if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells());
+    UpdateFilter();
   }
 
   SetVisibility( GetVisibility(), myRepresentationCache != 0 );
@@ -1847,6 +1762,12 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
       if ( myRepresentation != ePoint )
         aReperesent = SMESH_DeviceActor::eInsideframe;
       break;
+    case eCustomControl:
+      if ( myControlActor == my1DActor )
+        aProp = aBackProp = my1DProp;
+      if ( myRepresentation != ePoint )
+        aReperesent = SMESH_DeviceActor::eInsideframe;
+      break;
     default:;
     }
 
@@ -2572,8 +2493,8 @@ void SMESH_ActorDef::UpdateDistribution()
     std::vector<int> nbEvents;
     std::vector<double> funValues;
     SMESH_VisualObjDef::TEntityList elems;
-    if ( ! dynamic_cast<SMESH_MeshObj*>(myVisualObj.get()))
-      dynamic_cast<SMESH_VisualObjDef*>(myVisualObj.get())->GetEntities( fun->GetType(), elems );
+    if ( dynamic_cast<SMESH_SubMeshObj*>(myVisualObj.get()))
+      dynamic_cast<SMESH_SubMeshObj*>(myVisualObj.get())->GetEntities( fun->GetType(), elems );
     std::vector<int> elemIds; elemIds.reserve( elems.size() );
     for ( SMESH_VisualObjDef::TEntityList::iterator e = elems.begin(); e != elems.end(); ++e)
       elemIds.push_back( (*e)->GetID());
@@ -2629,6 +2550,115 @@ void SMESH_ActorDef::SetMarkerTexture( int theMarkerId, VTK::MarkerTexture theMa
   myMarkerTexture = theMarkerTexture; // for deferred update of myHighlightActor
 }
 
+void SMESH_ActorDef::UpdateFilter()
+{
+  unsigned int anObjectEntities = eAllEntity; // entities present in my object
+
+  if(!myVisualObj->GetNbEntities(SMDSAbs_0DElement)) {
+    anObjectEntities &= ~e0DElements;
+  }
+
+  if(!myVisualObj->GetNbEntities(SMDSAbs_Ball)) {
+    anObjectEntities &= ~eBallElem;
+  }
+
+  if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)) {
+    anObjectEntities &= ~eEdges;
+  }
+
+  if(!myVisualObj->GetNbEntities(SMDSAbs_Face)) {
+    anObjectEntities &= ~eFaces;
+  }
+
+  if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)) {
+    anObjectEntities &= ~eVolumes;
+  }
+
+  VTKViewer_ExtractUnstructuredGrid*    aFilter = myBaseActor->GetExtractUnstructuredGrid();
+  VTKViewer_ExtractUnstructuredGrid* aHltFilter = myHighlitableActor->GetExtractUnstructuredGrid();
+  aFilter->ClearRegisteredCellsWithType();
+  aHltFilter->ClearRegisteredCellsWithType();
+
+  bool isPassAll = ( myEntityMode == anObjectEntities && myEntityMode );
+  if ( isPassAll )
+  {
+    aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
+    aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
+  }
+  else
+  {
+    aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
+    aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
+    if (myEntityMode & e0DElements) {
+      aFilter->RegisterCellsWithType(VTK_VERTEX);
+      aHltFilter->RegisterCellsWithType(VTK_VERTEX);
+    }
+
+    if (myEntityMode & eBallElem) {
+      aFilter->RegisterCellsWithType(VTK_POLY_VERTEX);
+    }
+    if (myEntityMode & eEdges) {
+      aFilter->RegisterCellsWithType(VTK_LINE);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
+      aHltFilter->RegisterCellsWithType(VTK_LINE);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
+    }
+
+    if (myEntityMode & eFaces) {
+      aFilter->RegisterCellsWithType(VTK_TRIANGLE);
+      aFilter->RegisterCellsWithType(VTK_QUAD);
+      aFilter->RegisterCellsWithType(VTK_POLYGON);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
+      aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
+      aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
+      aHltFilter->RegisterCellsWithType(VTK_TRIANGLE);
+      aHltFilter->RegisterCellsWithType(VTK_QUAD);
+      aHltFilter->RegisterCellsWithType(VTK_POLYGON);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
+      aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
+      aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
+    }
+
+    if (myEntityMode & eVolumes) {
+      aFilter->RegisterCellsWithType(VTK_TETRA);
+      aFilter->RegisterCellsWithType(VTK_VOXEL);
+      aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
+      aFilter->RegisterCellsWithType(VTK_WEDGE);
+      aFilter->RegisterCellsWithType(VTK_PYRAMID);
+      aFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
+      aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
+      aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
+      aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
+      aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
+      aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
+      aHltFilter->RegisterCellsWithType(VTK_TETRA);
+      aHltFilter->RegisterCellsWithType(VTK_VOXEL);
+      aHltFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
+      aHltFilter->RegisterCellsWithType(VTK_WEDGE);
+      aHltFilter->RegisterCellsWithType(VTK_PYRAMID);
+      aHltFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
+      aHltFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
+      aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
+      aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
+      aHltFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
+      aHltFilter->RegisterCellsWithType(VTK_POLYHEDRON);
+    }
+  }
+  if ( GetVisibility() )
+    aFilter->Update();
+  if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells());
+}
+
 #ifndef DISABLE_PLOT2DVIEWER
 SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram()
 {
@@ -2649,8 +2679,8 @@ SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram()
     std::vector<int> nbEvents;
     std::vector<double> funValues;
     SMESH_VisualObjDef::TEntityList elems;
-    if ( ! dynamic_cast<SMESH_MeshObj*>(myVisualObj.get()))
-      dynamic_cast<SMESH_VisualObjDef*>(myVisualObj.get())->GetEntities( fun->GetType(), elems );
+    if ( dynamic_cast<SMESH_SubMeshObj*>(myVisualObj.get()))
+      dynamic_cast<SMESH_SubMeshObj*>(myVisualObj.get())->GetEntities( fun->GetType(), elems );
     std::vector<int> elemIds;
 
     for ( SMESH_VisualObjDef::TEntityList::iterator e = elems.begin(); e != elems.end(); ++e)