Salome HOME
untabify
[modules/smesh.git] / src / OBJECT / SMESH_Object.cxx
index 0fa50848ad5ae2847471d101681c7c57cbb4d442..94cf59d5fed22152a22ca40ad3e87d85dde2f79c 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "SMDS_Mesh.hxx"
 #include "SMDS_PolyhedralVolumeOfNodes.hxx"
+#include "SMDS_BallElement.hxx"
 #include "SMESH_Actor.h"
 #include "SMESH_ControlsDef.hxx"
 #include "SalomeApp_Application.h"
@@ -43,7 +44,7 @@
 #include <vtkIdList.h>
 #include <vtkCellArray.h>
 #include <vtkUnsignedCharArray.h>
-
+#include <vtkCellData.h>
 #include <vtkUnstructuredGrid.h>
 
 #include <memory>
@@ -103,6 +104,7 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType,
       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 if ( theNbNodes == 7 )   return VTK_BIQUADRATIC_TRIANGLE;
       else return VTK_EMPTY_CELL;
       
     case SMDSAbs_Volume:
@@ -278,7 +280,9 @@ void SMESH_VisualObjDef::buildPrs(bool buildGrid)
         //MESSAGE(myGrid->GetReferenceCount());
         //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<<myGrid->GetNumberOfCells() );
         //MESSAGE( "Update - myGrid->GetNumberOfPoints() = "<<myGrid->GetNumberOfPoints() );
-        if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"buildPrs.vtu" );
+        if( MYDEBUGWITHFILES ) {
+          SMESH::WriteUnstructuredGrid( myGrid,"myPrs.vtu" );
+        }
   }
 }
 
@@ -416,7 +420,13 @@ void SMESH_VisualObjDef::buildElemPrs()
   aConnect.reserve(VTK_CELL_SIZE);
 
   SMDS_Mesh::CheckMemory(); // PAL16631
-
+  bool hasBalls = nbEnts[ SMDSAbs_Ball ] > 0;
+  vtkDataArray* aScalars = 0;
+  if(hasBalls) {
+    aScalars = vtkDataArray::CreateDataArray(VTK_DOUBLE);
+    aScalars->SetNumberOfComponents(1);
+    aScalars->SetNumberOfTuples(aNbCells);
+  }
   for ( int i = 0; i < nbTypes; i++ ) // iterate through all types of elements
   {
     if ( nbEnts[ aTypes[ i ] ] > 0 ) {
@@ -474,8 +484,19 @@ void SMESH_VisualObjDef::buildElemPrs()
             }
           }
         }
-        aConnectivity->InsertNextCell( anIdList );
+        vtkIdType aCurId = aConnectivity->InsertNextCell( anIdList );
         aCellTypesArray->InsertNextValue( vtkElemType );
+        
+        //Store diameters of the balls
+        if(aScalars) {
+          double aDiam = 0;
+          if(aType == SMDSAbs_Ball) {
+            if (const SMDS_BallElement* ball = dynamic_cast<const SMDS_BallElement*>(anElem) ) {
+              aDiam = ball->GetDiameter();
+            }
+          }
+          aScalars->SetTuple(aCurId,&aDiam);
+        }
 
         iElem++;
       }
@@ -496,6 +517,7 @@ void SMESH_VisualObjDef::buildElemPrs()
     aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
 
   myGrid->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
+  myGrid->GetCellData()->SetScalars(aScalars);
 
   aCellLocationsArray->Delete();
   aCellTypesArray->Delete();
@@ -522,7 +544,7 @@ bool SMESH_VisualObjDef::GetEdgeNodes( const int theElemId,
   if ( anElem == 0 )
     return false;
     
-  int nbNodes = anElem->NbNodes();
+  int nbNodes = anElem->NbCornerNodes();
 
   if ( theEdgeNum < 0 || theEdgeNum > 3 || (nbNodes != 3 && nbNodes != 4) || theEdgeNum > nbNodes )
     return false;
@@ -530,7 +552,7 @@ bool SMESH_VisualObjDef::GetEdgeNodes( const int theElemId,
   vector<int> anIds( nbNodes );
   SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
   int i = 0;
-  while( anIter->more() )
+  while( anIter->more() && i < nbNodes )
     anIds[ i++ ] = anIter->next()->GetID();
 
   if ( theEdgeNum < nbNodes - 1 )