Salome HOME
0021347: [CEA 497] Visualisation into SMESH and VISU of hexagonal prism cells (MED_OC...
[modules/smesh.git] / src / OBJECT / SMESH_Object.cxx
index c12d63bfa68c6d733b7632f80495b6a7da527ed3..f2a83df939398e61668ea0afde87e970fab9846a 100644 (file)
@@ -101,6 +101,7 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType,
       else if ( theNbNodes == 4 )   return VTK_QUAD;
       else if ( theNbNodes == 6 )   return VTK_QUADRATIC_TRIANGLE;
       else if ( theNbNodes == 8 )   return VTK_QUADRATIC_QUAD;
+      else if ( theNbNodes == 9 )   return VTK_BIQUADRATIC_QUAD;
       else return VTK_EMPTY_CELL;
       
     case SMDSAbs_Volume:
@@ -109,18 +110,12 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType,
       else if ( theNbNodes == 5 )   return VTK_PYRAMID;
       else if ( theNbNodes == 6 )   return VTK_WEDGE;
       else if ( theNbNodes == 8 )   return VTK_HEXAHEDRON;
-      else if ( theNbNodes == 10 )  {
-        return VTK_QUADRATIC_TETRA;
-      }
-      else if ( theNbNodes == 20 )  {
-        return VTK_QUADRATIC_HEXAHEDRON;
-      }
-      else if ( theNbNodes == 15 )  {
-        return VTK_QUADRATIC_WEDGE;
-      }
-      else if ( theNbNodes==13 )  {
-        return VTK_QUADRATIC_PYRAMID; //VTK_CONVEX_POINT_SET;
-      }
+      else if ( theNbNodes == 12 )  return VTK_HEXAGONAL_PRISM;
+      else if ( theNbNodes == 10 )  return VTK_QUADRATIC_TETRA;
+      else if ( theNbNodes == 20 )  return VTK_QUADRATIC_HEXAHEDRON;
+      else if ( theNbNodes == 27 )  return VTK_TRIQUADRATIC_HEXAHEDRON;
+      else if ( theNbNodes == 15 )  return VTK_QUADRATIC_WEDGE;
+      else if ( theNbNodes == 13 )  return VTK_QUADRATIC_PYRAMID; //VTK_CONVEX_POINT_SET;
       else return VTK_EMPTY_CELL;
 
     default: return VTK_EMPTY_CELL;
@@ -277,7 +272,7 @@ void SMESH_VisualObjDef::buildPrs(bool buildGrid)
             GetMesh()->compactMesh();
           }
         vtkUnstructuredGrid *theGrid = GetMesh()->getGrid();
-       updateEntitiesFlags();
+        updateEntitiesFlags();
         myGrid->ShallowCopy(theGrid);
         //MESSAGE(myGrid->GetReferenceCount());
         //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<<myGrid->GetNumberOfCells() );
@@ -372,22 +367,22 @@ void SMESH_VisualObjDef::buildElemPrs()
       const TEntityList& aList = anEnts[ aTypes[ i ] ];
       TEntityList::const_iterator anIter;
       for ( anIter = aList.begin(); anIter != aList.end(); ++anIter ) {
-       if((*anIter)->GetEntityType() != SMDSEntity_Polyhedra &&
-          (*anIter)->GetEntityType() != SMDSEntity_Quad_Polyhedra) {
-         aCellsSize += (*anIter)->NbNodes() + 1;
-       } 
-       // Special case for the VTK_POLYHEDRON:
-       // itsinput cellArray is of special format.
-       //  [nCellFaces, nFace0Pts, i, j, k, nFace1Pts, i, j, k, ...]   
-       else {
-         if( const SMDS_VtkVolume* ph = dynamic_cast<const SMDS_VtkVolume*>(*anIter) ) {
-           int nbFaces = ph->NbFaces();
-           aCellsSize += (1 + ph->NbFaces());
-           for( int i = 1; i <= nbFaces; i++ ) {
-             aCellsSize += ph->NbFaceNodes(i);
-           }
-         }
-       }
+        if((*anIter)->GetEntityType() != SMDSEntity_Polyhedra &&
+           (*anIter)->GetEntityType() != SMDSEntity_Quad_Polyhedra) {
+          aCellsSize += (*anIter)->NbNodes() + 1;
+        
+        // Special case for the VTK_POLYHEDRON:
+        // itsinput cellArray is of special format.
+        //  [nCellFaces, nFace0Pts, i, j, k, nFace1Pts, i, j, k, ...]   
+        else {
+          if( const SMDS_VtkVolume* ph = dynamic_cast<const SMDS_VtkVolume*>(*anIter) ) {
+            int nbFaces = ph->NbFaces();
+            aCellsSize += (1 + ph->NbFaces());
+            for( int i = 1; i <= nbFaces; i++ ) {
+              aCellsSize += ph->NbFaceNodes(i);
+            }
+          }
+        }
       }
     }
   }
@@ -429,102 +424,55 @@ void SMESH_VisualObjDef::buildElemPrs()
       for ( anIter = aList.begin(); anIter != aList.end(); ++anIter )
       {
         const SMDS_MeshElement* anElem = *anIter;
-       
+        
         vtkIdType aNbNodes = anElem->NbNodes();
         anIdList->SetNumberOfIds( aNbNodes );
-       
+        const vtkIdType vtkElemType = getCellType( aType, anElem->IsPoly(), aNbNodes );
+        
         int anId = anElem->GetID();
-       
+        
         mySMDS2VTKElems.insert( TMapOfIds::value_type( anId, iElem ) );
         myVTK2SMDSElems.insert( TMapOfIds::value_type( iElem, anId ) );
-       
+        
         SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator();
-        switch (aType) {
-        case SMDSAbs_Volume: {
-          aConnect.clear();
-          std::vector<int> aConnectivities;
+        {
           // Convertions connectivities from SMDS to VTK
-         
-          if (anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE
-           anIdList->Reset();
+
+          if (aType == SMDSAbs_Volume && anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE
+            anIdList->Reset();
             if ( const SMDS_VtkVolume* ph = dynamic_cast<const SMDS_VtkVolume*>(anElem) ) {
-             int nbFaces = ph->NbFaces();
-             anIdList->InsertNextId(nbFaces);
-             for( int i = 1; i <= nbFaces; i++ ) {
-               anIdList->InsertNextId(ph->NbFaceNodes(i));
-               for(int j = 1; j <= ph->NbFaceNodes(i); j++) {
-                 const SMDS_MeshNode* n = ph->GetFaceNode(i,j);
-                 if(n) {
-                   anIdList->InsertNextId(mySMDS2VTKNodes[n->GetID()]);
-                 }
-               }
-             }
+              int nbFaces = ph->NbFaces();
+              anIdList->InsertNextId(nbFaces);
+              for( int i = 1; i <= nbFaces; i++ ) {
+                anIdList->InsertNextId(ph->NbFaceNodes(i));
+                for(int j = 1; j <= ph->NbFaceNodes(i); j++) {
+                  const SMDS_MeshNode* n = ph->GetFaceNode(i,j);
+                  if(n) {
+                    anIdList->InsertNextId(mySMDS2VTKNodes[n->GetID()]);
+                  }
+                }
+              }
             }
-           
-          } else if (aNbNodes == 4) {
-            static int anIds[] = {0,2,1,3};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-           
-          } else if (aNbNodes == 5) {
-            static int anIds[] = {0,3,2,1,4};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
-          } else if (aNbNodes == 6) {
-            static int anIds[] = {0,1,2,3,4,5};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
-          }
-          else if (aNbNodes == 8) {
-            static int anIds[] = {0,3,2,1,4,7,6,5};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
-          }
-          else if (aNbNodes == 10) {
-            static int anIds[] = {0,2,1,3,6,5,4,7,9,8};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-          }
-          else if (aNbNodes == 13) {
-            static int anIds[] = {0,3,2,1,4,8,7,6,5,9,12,11,10};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-          }
-          else if (aNbNodes == 15) {
-            //static int anIds[] = {0,2,1,3,5,4,8,7,6,11,10,9,12,14,13};
-            static int anIds[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-            //for (int k = 0; k < aNbNodes; k++) {
-            //  int nn = aConnectivities[k];
-            //  const SMDS_MeshNode* N = static_cast<const SMDS_MeshNode*> (aConnect[nn]);
-            //  cout<<"k="<<k<<"  N("<<N->X()<<","<<N->Y()<<","<<N->Z()<<")"<<endl;
-            //}
-          }
-          else if (aNbNodes == 20) {
-            static int anIds[] = {0,3,2,1,4,7,6,5,11,10,9,8,15,14,13,12,16,19,18,17};
-            for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
           }
           else {
-          }
-
-         if (!(anElem->IsPoly() && aNbNodes > 3)) {
-           if ( aConnect.empty() )
-             GetConnect(aNodesIter,aConnect);
-
-           if (aConnectivities.size() > 0) {
-             for (vtkIdType aNodeId = 0; aNodeId < aNbNodes; aNodeId++)
-               SetId(anIdList,mySMDS2VTKNodes,aConnect,aNodeId,aConnectivities[aNodeId]);
-           }
-         }
-         break;
-        }
-        default:
-          for( vtkIdType aNodeId = 0; aNodesIter->more(); aNodeId++ ){
-            const SMDS_MeshElement* aNode = aNodesIter->next();
-            anIdList->SetId( aNodeId, mySMDS2VTKNodes[aNode->GetID()] );
+            const std::vector<int>& aConnectivities =
+              SMDS_MeshCell::toVtkOrder( VTKCellType( vtkElemType ));
+            if (aConnectivities.size() > 0) {
+              aConnect.clear();
+              GetConnect(aNodesIter,aConnect);
+              for (vtkIdType aNodeId = 0; aNodeId < aNbNodes; aNodeId++)
+                SetId(anIdList,mySMDS2VTKNodes,aConnect,aNodeId,aConnectivities[aNodeId]);
+            }
+            else {
+              for( vtkIdType aNodeId = 0; aNodesIter->more(); aNodeId++ ){
+                const SMDS_MeshElement* aNode = aNodesIter->next();
+                anIdList->SetId( aNodeId, mySMDS2VTKNodes[aNode->GetID()] );
+              }
+            }
           }
         }
-
-       
         aConnectivity->InsertNextCell( anIdList );
-        aCellTypesArray->InsertNextValue( getCellType( aType, anElem->IsPoly(), aNbNodes ) );
+        aCellTypesArray->InsertNextValue( vtkElemType );
 
         iElem++;
       }
@@ -601,7 +549,7 @@ vtkUnstructuredGrid* SMESH_VisualObjDef::GetUnstructuredGrid()
   if ( !myLocalGrid && !GetMesh()->isCompacted() )
   {
     GetMesh()->compactMesh();
-       updateEntitiesFlags();
+        updateEntitiesFlags();
     vtkUnstructuredGrid *theGrid = GetMesh()->getGrid();
     myGrid->ShallowCopy(theGrid);
   }
@@ -629,29 +577,29 @@ bool SMESH_VisualObjDef::IsValid() const
 //=================================================================================
 void SMESH_VisualObjDef::updateEntitiesFlags() {
 
-       unsigned int tmp = myEntitiesState;
-       ClearEntitiesFlags();
+        unsigned int tmp = myEntitiesState;
+        ClearEntitiesFlags();
 
-       map<SMDSAbs_ElementType,int> entities = SMESH::GetEntitiesFromObject(this);
-       
+        map<SMDSAbs_ElementType,int> entities = SMESH::GetEntitiesFromObject(this);
+        
 
-       if( myEntitiesCache[SMDSAbs_0DElement] != 0 ||  myEntitiesCache[SMDSAbs_0DElement] >= entities[SMDSAbs_0DElement] )
-               myEntitiesState &= ~SMESH_Actor::e0DElements;
+        if( myEntitiesCache[SMDSAbs_0DElement] != 0 ||  myEntitiesCache[SMDSAbs_0DElement] >= entities[SMDSAbs_0DElement] )
+                myEntitiesState &= ~SMESH_Actor::e0DElements;
 
-       if( myEntitiesCache[SMDSAbs_Edge] != 0 || myEntitiesCache[SMDSAbs_Edge] >= entities[SMDSAbs_Edge] )
-               myEntitiesState &= ~SMESH_Actor::eEdges; 
+        if( myEntitiesCache[SMDSAbs_Edge] != 0 || myEntitiesCache[SMDSAbs_Edge] >= entities[SMDSAbs_Edge] )
+                myEntitiesState &= ~SMESH_Actor::eEdges; 
 
-       if( myEntitiesCache[SMDSAbs_Face] != 0 || myEntitiesCache[SMDSAbs_Face] >= entities[SMDSAbs_Face] )
-               myEntitiesState &= ~SMESH_Actor::eFaces; 
+        if( myEntitiesCache[SMDSAbs_Face] != 0 || myEntitiesCache[SMDSAbs_Face] >= entities[SMDSAbs_Face] )
+                myEntitiesState &= ~SMESH_Actor::eFaces; 
 
-       if( myEntitiesCache[SMDSAbs_Volume] != 0 || myEntitiesCache[SMDSAbs_Volume] >= entities[SMDSAbs_Volume] )
-               myEntitiesState &= ~SMESH_Actor::eVolumes;
+        if( myEntitiesCache[SMDSAbs_Volume] != 0 || myEntitiesCache[SMDSAbs_Volume] >= entities[SMDSAbs_Volume] )
+                myEntitiesState &= ~SMESH_Actor::eVolumes;
 
-       if( tmp != myEntitiesState ) {
-               myEntitiesFlag = true;
-       }
-       
-       myEntitiesCache = entities;
+        if( tmp != myEntitiesState ) {
+                myEntitiesFlag = true;
+        }
+        
+        myEntitiesCache = entities;
 }
 
 //=================================================================================
@@ -659,8 +607,8 @@ void SMESH_VisualObjDef::updateEntitiesFlags() {
 // purpose  : Clear the entities flags
 //=================================================================================
 void SMESH_VisualObjDef::ClearEntitiesFlags() {
-       myEntitiesState = SMESH_Actor::eAllEntity;
-       myEntitiesFlag = false;
+        myEntitiesState = SMESH_Actor::eAllEntity;
+        myEntitiesFlag = false;
 }
 
 //=================================================================================
@@ -668,7 +616,7 @@ void SMESH_VisualObjDef::ClearEntitiesFlags() {
 // purpose  : Return the entities flag
 //=================================================================================
 bool SMESH_VisualObjDef::GetEntitiesFlag() {
-       return myEntitiesFlag;
+        return myEntitiesFlag;
 }
 
 //=================================================================================
@@ -676,7 +624,7 @@ bool SMESH_VisualObjDef::GetEntitiesFlag() {
 // purpose  : Return the entities state
 //=================================================================================
 unsigned int SMESH_VisualObjDef::GetEntitiesState() {
-       return myEntitiesState;
+        return myEntitiesState;
 }
 
 /*