Salome HOME
Increment version number: 3.1.0a3
[modules/smesh.git] / src / SMESH_I / SMESH_Gen_i.cxx
index 1abae770956088b645ca49d7ae224f8c78150dcf..2806e40eb2664005d7a65075f84abdf7b26db25b 100644 (file)
@@ -93,7 +93,7 @@ using namespace std;
 #define NUM_TMP_FILES 2
 
 #ifdef _DEBUG_
-static int MYDEBUG = 0;
+static int MYDEBUG = 1;
 #else
 static int MYDEBUG = 0;
 #endif
@@ -410,7 +410,8 @@ GEOM_Client* SMESH_Gen_i::GetShapeReader()
 
 void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy )
 {
-  if(MYDEBUG) MESSAGE( "SMESH_Gen_i::SetCurrentStudy" );
+  //if(MYDEBUG)
+    MESSAGE( "SMESH_Gen_i::SetCurrentStudy" );
   myCurrentStudy = SALOMEDS::Study::_duplicate( theStudy );
   // create study context, if it doesn't exist and set current study
   int studyId = GetCurrentStudyID();
@@ -418,11 +419,14 @@ void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy )
   if ( myStudyContextMap.find( studyId ) == myStudyContextMap.end() ) {
     myStudyContextMap[ studyId ] = new StudyContext;      
   }
+
+  SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); 
+  if( !myCurrentStudy->FindComponent( "GEOM" )->_is_nil() )
+    aStudyBuilder->LoadWith( myCurrentStudy->FindComponent( "GEOM" ), GetGeomEngine() );
+
   // set current study for geom engine
-  /*
-  if ( !CORBA::is_nil( GetGeomEngine() ) )
-    GetGeomEngine()->GetCurrentStudy( myCurrentStudy->StudyId() );
-  */
+  //if ( !CORBA::is_nil( GetGeomEngine() ) )
+  //  GetGeomEngine()->GetCurrentStudy( myCurrentStudy->StudyId() );
 }
 
 //=============================================================================
@@ -725,6 +729,100 @@ CORBA::Boolean SMESH_Gen_i::IsReadyToCompute( SMESH::SMESH_Mesh_ptr theMesh,
   return false;
 }
 
+//================================================================================
+/*!
+ * \brief Returns errors of hypotheses definintion
+  * \param theMesh - the mesh
+  * \param theSubObject - the main or sub- shape
+  * \retval SMESH::algo_error_array* - sequence of errors
+ */
+//================================================================================
+
+SMESH::algo_error_array* SMESH_Gen_i::GetAlgoState( SMESH::SMESH_Mesh_ptr theMesh, 
+                                                    GEOM::GEOM_Object_ptr theSubObject )
+      throw ( SALOME::SALOME_Exception )
+{
+  Unexpect aCatch(SALOME_SalomeException);
+  if(MYDEBUG) MESSAGE( "SMESH_Gen_i::GetAlgoState()" );
+
+  if ( CORBA::is_nil( theSubObject ) )
+    THROW_SALOME_CORBA_EXCEPTION( "bad shape object reference", SALOME::BAD_PARAM );
+
+  if ( CORBA::is_nil( theMesh ) )
+    THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference",SALOME::BAD_PARAM );
+
+  SMESH::algo_error_array_var error_array = new SMESH::algo_error_array;
+  try {
+    SMESH_Mesh_i* meshServant = SMESH::DownCast<SMESH_Mesh_i*>( theMesh );
+    ASSERT( meshServant );
+    if ( meshServant ) {
+      TopoDS_Shape myLocShape = GeomObjectToShape( theSubObject );
+      ::SMESH_Mesh& myLocMesh = meshServant->GetImpl();
+      list< ::SMESH_Gen::TAlgoStateError > error_list;
+      list< ::SMESH_Gen::TAlgoStateError >::iterator error;
+      // call ::SMESH_Gen::GetAlgoState()
+      myGen.GetAlgoState( myLocMesh, myLocShape, error_list );
+      error_array->length( error_list.size() );
+      int i = 0;
+      for ( error = error_list.begin(); error != error_list.end(); ++error )
+      {
+        // error name
+        SMESH::AlgoStateErrorName errName;
+        switch ( error->_name ) {
+        case ::SMESH_Gen::MISSING_ALGO:     errName = SMESH::MISSING_ALGO; break;
+        case ::SMESH_Gen::MISSING_HYPO:     errName = SMESH::MISSING_HYPO; break;
+        case ::SMESH_Gen::NOT_CONFORM_MESH: errName = SMESH::NOT_CONFORM_MESH; break;
+        default:
+          THROW_SALOME_CORBA_EXCEPTION( "bad error name",SALOME::BAD_PARAM );
+        }
+        // algo name
+        CORBA::String_var algoName;
+        if ( error->_algo ) {
+          if ( !myCurrentStudy->_is_nil() ) {
+            // find algo in the study
+            SALOMEDS::SComponent_var father = SALOMEDS::SComponent::_narrow
+              ( myCurrentStudy->FindComponent( ComponentDataType() ) );
+            if ( !father->_is_nil() ) {
+              SALOMEDS::ChildIterator_var itBig = myCurrentStudy->NewChildIterator( father );
+              for ( ; itBig->More(); itBig->Next() ) {
+                SALOMEDS::SObject_var gotBranch = itBig->Value();
+                if ( gotBranch->Tag() == GetAlgorithmsRootTag() ) {
+                  SALOMEDS::ChildIterator_var algoIt = myCurrentStudy->NewChildIterator( gotBranch );
+                  for ( ; algoIt->More(); algoIt->Next() ) {
+                    SALOMEDS::SObject_var algoSO = algoIt->Value();
+                    CORBA::Object_var    algoIOR = SObjectToObject( algoSO );
+                    if ( !CORBA::is_nil( algoIOR )) {
+                      SMESH_Hypothesis_i* myImpl = SMESH::DownCast<SMESH_Hypothesis_i*>( algoIOR );
+                      if ( myImpl && myImpl->GetImpl() == error->_algo ) {
+                        algoName = algoSO->GetName();
+                        break;
+                      }
+                    }
+                  } // loop on algo SO's
+                  break;
+                } // if algo tag
+              } // SMESH component iterator
+            }
+          }
+          if ( algoName.in() == 0 )
+            // use algo type name
+            algoName = CORBA::string_dup( error->_algo->GetName() );
+        }
+        // fill AlgoStateError structure
+        SMESH::AlgoStateError & errStruct = error_array[ i++ ];
+        errStruct.name         = errName;
+        errStruct.algoName     = algoName;
+        errStruct.algoDim      = error->_algoDim;
+        errStruct.isGlobalAlgo = error->_isGlobalAlgo;
+      }
+    }
+  }
+  catch ( SALOME_Exception& S_ex ) {
+    INFOS( "catch exception "<< S_ex.what() );
+  }
+  return error_array._retn();
+}
+
 //=============================================================================
 /*!
  *  SMESH_Gen_i::GetSubShapesId
@@ -1544,15 +1642,14 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
                   // Write datasets
                   if ( nbNodes )
                   {
-                    aSize[ 0 ] = nbNodes*sizeof(int);
+                    aSize[ 0 ] = nbNodes;
                     // IDS
                     string aDSName( onFace ? "Nodes on Faces" : "Nodes on Edges");
-                    aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_STRING, aSize, 1 );
+                    aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_INT32, aSize, 1 );
                     aDataset->CreateOnDisk();
                     aDataset->WriteOnDisk( aNodeIDs );
                     aDataset->CloseOnDisk();
 
-                   aSize[ 0 ] = nbNodes;
                     // U Positions
                     aDSName = ( onFace ? "Face U positions" : "Edge positions");
                     aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_FLOAT64, aSize, 1);
@@ -1658,6 +1755,13 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
        theComponent->GetStudy()->StudyId() != myCurrentStudy->StudyId() )
     SetCurrentStudy( theComponent->GetStudy() );
 
+/*  if( !theComponent->_is_nil() )
+  {
+    //SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow( theComponent->GetStudy() );
+    if( !myCurrentStudy->FindComponent( "GEOM" )->_is_nil() )
+      loadGeomData( myCurrentStudy->FindComponent( "GEOM" ) );
+  }*/
+
   StudyContext* myStudyContext = GetCurrentStudyContext();
   
   // Get temporary files location
@@ -1962,7 +2066,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              SALOMEDS::SObject_var shapeSO = myCurrentStudy->FindObjectID( refFromFile );
 
              // Make sure GEOM data are loaded first
-             loadGeomData( shapeSO->GetFatherComponent() );
+             //loadGeomData( shapeSO->GetFatherComponent() );
 
              CORBA::Object_var shapeObject = SObjectToObject( shapeSO );
              if ( !CORBA::is_nil( shapeObject ) ) {
@@ -2219,7 +2323,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
 
          if(hasData) {
            // Read sub-meshes from MED
-           if(MYDEBUG) MESSAGE("JFA - Create all sub-meshes");
+           if(MYDEBUG) MESSAGE("Create all sub-meshes");
            myReader.CreateAllSubMeshes();
 
 
@@ -2272,10 +2376,12 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
                 }
                 else // NODE IDS
                 {
-                 //PAL10195:int aSize = aDataset->GetSize()/sizeof(int);
-                 int aSize = aDataset->GetSize();       //PAL10195
-                  if (aDataset->GetType() == HDF_STRING) //PAL10195
-                    aSize /= sizeof(int);                //PAL10195
+                 int aSize = aDataset->GetSize();
+
+                  // for reading files, created from 18.07.2005 till 10.10.2005
+                  if (aDataset->GetType() == HDF_STRING)
+                    aSize /= sizeof(int);
+
                  int* ids = new int [aSize];
                   aDataset->ReadFromDisk( ids );
                   // on face or nodes?
@@ -2333,11 +2439,11 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
 
           // Recompute State (as computed sub-meshes are restored from MED)
          if ( !aShapeObject->_is_nil() ) {
-           MESSAGE("JFA - Compute State Engine ...");
+           MESSAGE("Compute State Engine ...");
            TopoDS_Shape myLocShape = GeomObjectToShape( aShapeObject );
            myNewMeshImpl->GetImpl().GetSubMesh(myLocShape)->ComputeStateEngine
               (SMESH_subMesh::SUBMESH_RESTORED);
-           MESSAGE("JFA - Compute State Engine finished");
+           MESSAGE("Compute State Engine finished");
          }
 
          // try to get groups