Salome HOME
bos #20256: [CEA 18523] Porting SMESH to int 64 bits
[plugins/ghs3dplugin.git] / src / GHS3DPlugin / GHS3DPlugin_Hypothesis_i.cxx
index 21af792e85ad661f628cbbd4db373b5dd1e72e3a..b7c78bf64be0f3b984cf8b96fa3ad089704bcb8e 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2004-2016  CEA/DEN, EDF R&D
+// Copyright (C) 2004-2021  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 #include <SMESH_Mesh_i.hxx>
 #include <SMESH_Group_i.hxx>
 #include <SMESH_Gen_i.hxx>
-//#include <SMESH_TypeDefs.hxx>
 #include <SMESHDS_GroupBase.hxx>
 
-// SALOME KERNEL includes
-// #include <SALOMEDSClient.hxx>
-// #include <SALOMEDSClient_definitions.hxx>
 
 using namespace std;
 
@@ -82,6 +78,92 @@ CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetToMeshHoles()
   return this->GetImpl()->GetToMeshHoles();
 }
 
+//=============================================================================
+void GHS3DPlugin_Hypothesis_i::SetMinSize(CORBA::Double theMinSize)
+{
+  if ( GetMinSize() != theMinSize ) {
+    this->GetImpl()->SetMinSize( theMinSize );
+    SMESH::TPythonDump() << _this() << ".SetMinSize( " << theMinSize << " )";
+  }
+}
+
+//=============================================================================
+CORBA::Double GHS3DPlugin_Hypothesis_i::GetMinSize()
+{
+  return this->GetImpl()->GetMinSize();
+}
+
+//=============================================================================
+CORBA::Double GHS3DPlugin_Hypothesis_i::GetMinSizeDefault()
+{
+  return this->GetImpl()->GetMinSizeDefault();
+}
+
+//=============================================================================
+void GHS3DPlugin_Hypothesis_i::SetMaxSize(CORBA::Double theMaxSize)
+{
+  if ( GetMaxSize() != theMaxSize ) {
+    this->GetImpl()->SetMaxSize( theMaxSize );
+    SMESH::TPythonDump() << _this() << ".SetMaxSize( " << theMaxSize << " )";
+  }
+}
+
+//=============================================================================
+CORBA::Double GHS3DPlugin_Hypothesis_i::GetMaxSize()
+{
+  return this->GetImpl()->GetMaxSize();
+}
+
+//=============================================================================
+CORBA::Double GHS3DPlugin_Hypothesis_i::GetMaxSizeDefault()
+{
+  return this->GetImpl()->GetMaxSizeDefault();
+}
+
+//=============================================================================
+void GHS3DPlugin_Hypothesis_i::SetMinMaxSizeDefault( CORBA::Double theMinSize,
+                                                     CORBA::Double theMaxSize )
+{
+  this->GetImpl()->SetMinMaxSizeDefault( theMinSize, theMaxSize );
+}
+
+//=============================================================================
+/*!
+ *  Activate/deactivate volume proximity computation
+ */
+void GHS3DPlugin_Hypothesis_i::SetVolumeProximity( CORBA::Boolean toUse )
+{
+  if ( GetVolumeProximity() != toUse )
+  {
+    this->GetImpl()->SetUseVolumeProximity( toUse );
+    SMESH::TPythonDump() << _this() << ".SetVolumeProximity( " << toUse << " )";
+  }
+}
+
+CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetVolumeProximity()
+{
+  return this->GetImpl()->GetUseVolumeProximity();
+}
+
+
+//=============================================================================
+/*!
+ * Set number of surface element layers to be generated due to volume proximity
+ */
+void GHS3DPlugin_Hypothesis_i::SetNbVolumeProximityLayers( CORBA::Short nbLayers )
+{
+  if ( GetNbVolumeProximityLayers() != nbLayers )
+  {
+    this->GetImpl()->SetNbVolumeProximityLayers( nbLayers );
+    SMESH::TPythonDump() << _this() << ".SetNbVolumeProximityLayers( " << nbLayers << " )";
+  }
+}
+
+CORBA::Short GHS3DPlugin_Hypothesis_i::GetNbVolumeProximityLayers()
+{
+  return (CORBA::Short) this->GetImpl()->GetNbVolumeProximityLayers();
+}
+
 //=======================================================================
 //function : SetToMakeGroupsOfDomains
 //=======================================================================
@@ -108,7 +190,6 @@ CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetToMakeGroupsOfDomains()
 //=======================================================================
 
 void GHS3DPlugin_Hypothesis_i::SetMaximumMemory(CORBA::Float MB)
-  throw ( SALOME::SALOME_Exception )
 {
   if ( MB == 0 )
     THROW_SALOME_CORBA_EXCEPTION( "Invalid memory size",SALOME::BAD_PARAM );
@@ -132,7 +213,6 @@ CORBA::Float GHS3DPlugin_Hypothesis_i::GetMaximumMemory()
 //=======================================================================
 
 void GHS3DPlugin_Hypothesis_i::SetInitialMemory(CORBA::Float MB)
-  throw ( SALOME::SALOME_Exception )
 {
   if ( MB == 0 )
     THROW_SALOME_CORBA_EXCEPTION( "Invalid memory size",SALOME::BAD_PARAM );
@@ -156,7 +236,6 @@ CORBA::Float GHS3DPlugin_Hypothesis_i::GetInitialMemory()
 //=======================================================================
 
 void GHS3DPlugin_Hypothesis_i::SetOptimizationLevel(CORBA::Short level)
-  throw ( SALOME::SALOME_Exception )
 {
   ::GHS3DPlugin_Hypothesis::OptimizationLevel l =
     (::GHS3DPlugin_Hypothesis::OptimizationLevel) level;
@@ -183,7 +262,7 @@ CORBA::Short GHS3DPlugin_Hypothesis_i::GetOptimizationLevel()
 //function : SetWorkingDirectory
 //=======================================================================
 
-void GHS3DPlugin_Hypothesis_i::SetWorkingDirectory(const char* path) throw ( SALOME::SALOME_Exception )
+void GHS3DPlugin_Hypothesis_i::SetWorkingDirectory(const char* path)
 {
   if (!path )
     THROW_SALOME_CORBA_EXCEPTION( "Null working directory",SALOME::BAD_PARAM );
@@ -239,7 +318,6 @@ CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetKeepFiles()
 //=======================================================================
 
 void GHS3DPlugin_Hypothesis_i::SetVerboseLevel(CORBA::Short level)
-  throw ( SALOME::SALOME_Exception )
 {
   if (level < 0 || level > 10 )
     THROW_SALOME_CORBA_EXCEPTION( "Invalid verbose level, valid range is [0-10]",
@@ -349,9 +427,7 @@ CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetToRemoveCentralPoint()
 
 void GHS3DPlugin_Hypothesis_i::SetTextOption(const char* option)
 {
-  ASSERT(myBaseImpl);
-  this->GetImpl()->SetAdvancedOption(option);
-  SMESH::TPythonDump() << _this() << ".SetAdvancedOption( '" << option << "' )";
+  SetAdvancedOption(option);
 }
 
 //=======================================================================
@@ -360,20 +436,19 @@ void GHS3DPlugin_Hypothesis_i::SetTextOption(const char* option)
 
 char* GHS3DPlugin_Hypothesis_i::GetTextOption()
 {
-  ASSERT(myBaseImpl);
-  return CORBA::string_dup( this->GetImpl()->GetAdvancedOption().c_str() );
+  return GetAdvancedOption();
 }
 
 //=======================================================================
 //function : SetAdvancedOption
 //=======================================================================
 
-void GHS3DPlugin_Hypothesis_i::SetAdvancedOption(const char* option)
-{
-  ASSERT(myBaseImpl);
-  this->GetImpl()->SetAdvancedOption(option);
-  SMESH::TPythonDump() << _this() << ".SetAdvancedOption( '" << option << "' )";
-}
+// void GHS3DPlugin_Hypothesis_i::SetAdvancedOption(const char* option)
+// {
+//   ASSERT(myBaseImpl);
+//   this->GetImpl()->SetAdvancedOption(option);
+//   SMESH::TPythonDump() << _this() << ".SetAdvancedOption( '" << option << "' )";
+// }
 
 //=======================================================================
 //function : GetAdvancedOption
@@ -385,8 +460,274 @@ char* GHS3DPlugin_Hypothesis_i::GetAdvancedOption()
   return CORBA::string_dup( this->GetImpl()->GetAdvancedOption().c_str() );
 }
 
+//=============================================================================
+
+void GHS3DPlugin_Hypothesis_i::SetOptionValue(const char* optionName, const char* optionValue)
+{
+  ASSERT(myBaseImpl);
+  try {
+    std::string name( optionName );
+    if ( !optionValue || !optionValue[0] )
+      UnsetOption( optionName );
+
+    // basic options (visible in Advanced table)
+
+    else if ( name == "verbose" )
+      SetVerboseLevel((CORBA::Short) GetImpl()->ToInt( optionValue ));
+
+    else if ( name == "max_memory" )
+      SetMaximumMemory((CORBA::Short) GetImpl()->ToInt( optionValue ));
+
+    else if ( name == "automatic_memory" )
+      SetInitialMemory((CORBA::Short) GetImpl()->ToInt( optionValue ));
+
+    else if ( name == "no_initial_central_point" && // optimizer
+              strcmp( GetImpl()->GetName(), ::GHS3DPlugin_Hypothesis::GetHypType() ) != 0 )
+    {
+      //if ( strcmp( optionValue, ::GHS3DPlugin_Hypothesis::NoValue() ) == 0 )
+      if ( !optionValue[0] )
+        SetToRemoveCentralPoint( true );
+      else
+        SetToRemoveCentralPoint( GetImpl()->ToBool( optionValue ));
+    }
+    else if ( name == "no_internal_points"  && // optimizer
+              strcmp( GetImpl()->GetName(), ::GHS3DPlugin_Hypothesis::GetHypType() ) != 0)
+    {
+      //if ( strcmp( optionValue, ::GHS3DPlugin_Hypothesis::NoValue() ) == 0 )
+      if ( !optionValue[0] )
+        SetToRemoveCentralPoint( true );
+      else
+        SetToCreateNewNodes( GetImpl()->ToBool( optionValue ));
+    }
+    else if ( name == "min_size" )
+      SetMinSize( GetImpl()->ToDbl( optionValue ));
+
+    else if ( name == "max_size" )
+      SetMaxSize( GetImpl()->ToDbl( optionValue ));
+
+    else if ( name == "gradation" )
+      SetGradation( GetImpl()->ToDbl( optionValue ));
+
+    else if ( name == "volume_proximity_layers" )
+      SetNbVolumeProximityLayers((CORBA::Short) GetImpl()->ToInt( optionValue ));
+
+    else if ( name == "components" )
+      SetToMeshHoles( strncmp( "all", optionValue, 3 ) == 0 );
+
+    // advanced options (for backward compatibility)
+    // else if ( name == "create_tag_on_collision" ||
+    //           name == "tiny_edge_respect_geometry" )
+    //   AddOption( optionName, optionValue );
+
+    else {
+      bool valueChanged = true;
+      try {
+        valueChanged = ( this->GetImpl()->GetOptionValue( name ) != optionValue );
+      }
+      catch ( std::invalid_argument& ) {
+      }
+      if ( valueChanged )
+      {
+        this->GetImpl()->SetOptionValue(optionName, optionValue);
+        SMESH::TPythonDump() << _this() << ".SetOptionValue( '" << optionName << "', '" << optionValue << "' )";
+      }
+    }
+  } catch (const std::invalid_argument& ex) {
+    THROW_SALOME_CORBA_EXCEPTION( ex.what() ,SALOME::BAD_PARAM );
+  } catch (SALOME_Exception& ex) {
+    THROW_SALOME_CORBA_EXCEPTION( ex.what() ,SALOME::BAD_PARAM );
+  }
+}
+
+//=============================================================================
+
+char* GHS3DPlugin_Hypothesis_i::GetOptionValue(const char* optionName)
+{
+  ASSERT(myBaseImpl);
+  try {
+    bool isDefault;
+    return CORBA::string_dup(this->GetImpl()->GetOptionValue(optionName,&isDefault).c_str());
+  } catch (const std::invalid_argument& ex) {
+    THROW_SALOME_CORBA_EXCEPTION( ex.what() ,SALOME::BAD_PARAM );
+  } catch (SALOME_Exception& ex) {
+    THROW_SALOME_CORBA_EXCEPTION( ex.what() ,SALOME::BAD_PARAM );
+  }
+  return 0;
+}
+
+//=============================================================================
+
+void GHS3DPlugin_Hypothesis_i::UnsetOption(const char* optionName) {
+  ASSERT(myBaseImpl);
+  if ( !GetImpl()->GetOptionValue( optionName ).empty() )
+  {
+    this->GetImpl()->ClearOption(optionName);
+    SMESH::TPythonDump() << _this() << ".UnsetOption( '" << optionName << "' )";
+  }
+}
+
+//=============================================================================
+
+GHS3DPlugin::string_array* GHS3DPlugin_Hypothesis_i::GetOptionValues()
+{
+  GHS3DPlugin::string_array_var result = new GHS3DPlugin::string_array();
+
+  const ::GHS3DPlugin_Hypothesis::TOptionValues & opts = this->GetImpl()->GetOptionValues();
+  result->length((CORBA::ULong) opts.size());
+  int i=0;
+
+  bool isDefault;
+  ::GHS3DPlugin_Hypothesis::TOptionValues::const_iterator opIt = opts.begin();
+  for (; opIt != opts.end(); ++opIt, ++i)
+  {
+    string name_value_type = opIt->first;
+    //if (!opIt->second.empty())
+    {
+      name_value_type += ":";
+      name_value_type += GetImpl()->GetOptionValue( opIt->first, &isDefault );
+      name_value_type += isDefault ? ":0" : ":1";
+    }
+    result[i] = CORBA::string_dup(name_value_type.c_str());
+  }
+
+  return result._retn();
+}
+
+//=============================================================================
+
+GHS3DPlugin::string_array* GHS3DPlugin_Hypothesis_i::GetAdvancedOptionValues()
+{
+  GHS3DPlugin::string_array_var result = new GHS3DPlugin::string_array();
+
+  const ::GHS3DPlugin_Hypothesis::TOptionValues & custom_opts = this->GetImpl()->GetCustomOptionValues();
+  result->length((CORBA::ULong) custom_opts.size());
+  int i=0;
+
+  ::GHS3DPlugin_Hypothesis::TOptionValues::const_iterator opIt = custom_opts.begin();
+  for (; opIt != custom_opts.end(); ++opIt, ++i) {
+    string name_value_type = opIt->first;
+    if (!opIt->second.empty()) {
+      name_value_type += ":";
+      name_value_type += opIt->second;
+      name_value_type += ":1"; // user defined
+    }
+    result[i] = CORBA::string_dup(name_value_type.c_str());
+  }
+  return result._retn();
+}
+
+//=============================================================================
+
+void GHS3DPlugin_Hypothesis_i::SetOptionValues(const GHS3DPlugin::string_array& options)
+{
+  for (CORBA::ULong i = 0; i < options.length(); ++i)
+  {
+    string name_value_type = options[i].in();
+    if(name_value_type.empty())
+      continue;
+    size_t colonPos = name_value_type.find(':');
+    string name, value;
+    if (colonPos == string::npos) // ':' not found
+      name = name_value_type;
+    else {
+      name = name_value_type.substr(0, colonPos);
+      if (colonPos < name_value_type.size() - 1 && name_value_type[colonPos] != ' ') {
+        string value_type = name_value_type.substr(colonPos + 1);
+        colonPos = value_type.find(':');
+        value = value_type.substr(0, colonPos);
+        if (colonPos < value_type.size() - 1 && value_type[colonPos] != ' ')
+          if ( value_type.substr(colonPos + 1) == "0" ) // is default
+            value.clear();
+      }
+    }
+    SetOptionValue(name.c_str(), value.c_str());
+  }
+}
+
+//=============================================================================
+
+void GHS3DPlugin_Hypothesis_i::SetAdvancedOptionValues(const GHS3DPlugin::string_array& options)
+{
+  SMESH::TPythonDump dump;
+
+  string optionsAndValues;
+  for ( CORBA::ULong i = 0; i < options.length(); ++i) {
+    string name_value_type = options[i].in();
+    if(name_value_type.empty())
+      continue;
+    size_t colonPos = name_value_type.find(':');
+    string name, value;
+    if (colonPos == string::npos) // ':' not found
+      name = name_value_type;
+    else {
+      name = name_value_type.substr(0, colonPos);
+      if (colonPos < name_value_type.size() - 1 && name_value_type[colonPos] != ' ') {
+        string value_type = name_value_type.substr(colonPos + 1);
+        colonPos = value_type.find(':');
+        value = value_type.substr(0, colonPos);
+      }
+    }
+    AddOption(name.c_str(), value.c_str());
+
+    optionsAndValues += name + " " + value + " ";
+  }
+
+  if ( !optionsAndValues.empty() )
+    dump << _this() << ".SetAdvancedOptions( '" << optionsAndValues.c_str() << "' )";
+}
+
+//=============================================================================
+
+void GHS3DPlugin_Hypothesis_i::SetAdvancedOption(const char* optionsAndValues)
+{
+  if ( !optionsAndValues ) return;
+
+  SMESH::TPythonDump dump;
+
+  std::istringstream strm( optionsAndValues );
+  std::istream_iterator<std::string> sIt( strm ), sEnd;
+  for ( int nbPairs = 0; sIt != sEnd; ++nbPairs )
+  {
+    std::string option = *sIt;
+    if ( ++sIt != sEnd )
+    {
+      std::string value = *sIt;
+      ++sIt;
+      AddOption( option.c_str(), value.c_str() );
+    }
+    else
+    {
+      if ( nbPairs > 0 )
+        THROW_SALOME_CORBA_EXCEPTION( "Uneven number of options and values" ,SALOME::BAD_PARAM );
+      AddOption( option.c_str(), "" );
+    }
+  }
+  dump << _this() << ".SetAdvancedOption( '" << optionsAndValues << "' )";
+}
+
+//=============================================================================
+
+void GHS3DPlugin_Hypothesis_i::AddOption(const char* optionName, const char* optionValue)
+{
+  ASSERT(myBaseImpl);
+  bool valueChanged = ( !this->GetImpl()->HasOptionDefined(optionName) ||
+                        this->GetImpl()->GetOptionValue(optionName) != optionValue );
+  if (valueChanged) {
+    this->GetImpl()->SetOptionValue(optionName, optionValue);
+    SMESH::TPythonDump() << _this() << ".SetOptionValue( '" << optionName << "', '" << optionValue << "' )";
+  }
+}
+
+//=============================================================================
+
+char* GHS3DPlugin_Hypothesis_i::GetOption(const char* optionName)
+{
+  ASSERT(myBaseImpl);
+  return CORBA::string_dup(this->GetImpl()->GetOptionValue(optionName).c_str());
+}
+
 //=======================================================================
-//function : SetToRemoveCentralPoint
+//function : SetGradation
 //=======================================================================
 
 void GHS3DPlugin_Hypothesis_i::SetGradation(CORBA::Double gradation)
@@ -399,7 +740,7 @@ void GHS3DPlugin_Hypothesis_i::SetGradation(CORBA::Double gradation)
 }
 
 //=======================================================================
-//function : GetToRemoveCentralPoint
+//function : GetGradation
 //=======================================================================
 
 CORBA::Double GHS3DPlugin_Hypothesis_i::GetGradation()
@@ -416,7 +757,7 @@ void GHS3DPlugin_Hypothesis_i::SetStandardOutputLog(CORBA::Boolean logInStandard
 {
   ASSERT(myBaseImpl);
   this->GetImpl()->SetStandardOutputLog(logInStandardOutput);
-  SMESH::TPythonDump() << _this() << ".SetPrintLogInFile( " << !logInStandardOutput << " )";
+  SMESH::TPythonDump() << _this() << ".SetStandardOutputLog( " << logInStandardOutput << " )";
 }
 
 //=======================================================================
@@ -455,31 +796,31 @@ CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetRemoveLogOnSuccess()
 //=======================================================================
 
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertex(CORBA::Double x, CORBA::Double y, CORBA::Double z, CORBA::Double size)
-  throw (SALOME::SALOME_Exception) {
+{
   ASSERT(myBaseImpl);
   return p_SetEnforcedVertex(size, x, y, z);
 }
 
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexNamed(CORBA::Double x, CORBA::Double y, CORBA::Double z, CORBA::Double size, const char* theVertexName)
-  throw (SALOME::SALOME_Exception) {
+{
   ASSERT(myBaseImpl);
   return p_SetEnforcedVertex(size, x, y, z, theVertexName, "", "");
 }
 
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexWithGroup(CORBA::Double x, CORBA::Double y, CORBA::Double z, CORBA::Double size, const char* theGroupName)
-  throw (SALOME::SALOME_Exception) {
+{
   ASSERT(myBaseImpl);
   return p_SetEnforcedVertex(size, x, y, z, "", "", theGroupName);
 }
 
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexNamedWithGroup(CORBA::Double x, CORBA::Double y, CORBA::Double z, CORBA::Double size, const char* theVertexName, const char* theGroupName)
-  throw (SALOME::SALOME_Exception) {
+{
   ASSERT(myBaseImpl);
   return p_SetEnforcedVertex(size, x, y, z, theVertexName, "", theGroupName);
 }
 
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexGeom(GEOM::GEOM_Object_ptr theVertex, CORBA::Double size)
-  throw (SALOME::SALOME_Exception) {
+{
   ASSERT(myBaseImpl);
   
   if ((theVertex->GetShapeType() != GEOM::VERTEX) && (theVertex->GetShapeType() != GEOM::COMPOUND)) {
@@ -489,7 +830,7 @@ bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexGeom(GEOM::GEOM_Object_ptr theVe
   string theVertexEntry = theVertex->GetStudyEntry();
   CORBA::Double x = 0, y = 0, z = 0;
   CORBA::Boolean isCompound = false;
-  GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine();
+  GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine( theVertex );
   if (theVertexEntry.empty()) {
     string aName;
     if (theVertex->GetShapeType() == GEOM::VERTEX) {
@@ -521,7 +862,7 @@ bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexGeom(GEOM::GEOM_Object_ptr theVe
 }
 
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexGeomWithGroup(GEOM::GEOM_Object_ptr theVertex, CORBA::Double size, const char* theGroupName)
-  throw (SALOME::SALOME_Exception) {
+{
   ASSERT(myBaseImpl);
   
   if ((theVertex->GetShapeType() != GEOM::VERTEX) && (theVertex->GetShapeType() != GEOM::COMPOUND)) {
@@ -531,7 +872,7 @@ bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexGeomWithGroup(GEOM::GEOM_Object_
   string theVertexEntry = theVertex->GetStudyEntry();
   CORBA::Double x = 0, y = 0, z = 0;
   CORBA::Boolean isCompound = false;
-  GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine();
+  GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine( theVertex );
   if (theVertexEntry.empty()) {
     string aName;
     if (theVertex->GetShapeType() == GEOM::VERTEX) {
@@ -565,7 +906,7 @@ bool GHS3DPlugin_Hypothesis_i::SetEnforcedVertexGeomWithGroup(GEOM::GEOM_Object_
 bool GHS3DPlugin_Hypothesis_i:: p_SetEnforcedVertex(CORBA::Double size, CORBA::Double x, CORBA::Double y, CORBA::Double z,
                                                     const char* theVertexName, const char* theVertexEntry, const char* theGroupName,
                                                     CORBA::Boolean isCompound)
-  throw (SALOME::SALOME_Exception) {
+{
   ASSERT(myBaseImpl);
   bool newValue = false;
 
@@ -633,7 +974,6 @@ bool GHS3DPlugin_Hypothesis_i:: p_SetEnforcedVertex(CORBA::Double size, CORBA::D
 //=======================================================================
 
 CORBA::Double GHS3DPlugin_Hypothesis_i::GetEnforcedVertex(CORBA::Double x, CORBA::Double y, CORBA::Double z)
-  throw (SALOME::SALOME_Exception)
 {
   ASSERT(myBaseImpl);
   try {
@@ -654,7 +994,6 @@ CORBA::Double GHS3DPlugin_Hypothesis_i::GetEnforcedVertex(CORBA::Double x, CORBA
 //=======================================================================
 
 CORBA::Double GHS3DPlugin_Hypothesis_i::GetEnforcedVertexGeom(GEOM::GEOM_Object_ptr theVertex)
-  throw (SALOME::SALOME_Exception)
 {
   ASSERT(myBaseImpl);
   
@@ -664,7 +1003,7 @@ CORBA::Double GHS3DPlugin_Hypothesis_i::GetEnforcedVertexGeom(GEOM::GEOM_Object_
   
   string theVertexEntry = theVertex->GetStudyEntry();
   if (theVertexEntry.empty()) {
-    GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine();
+    GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine( theVertex );
     string aName;
     if (theVertex->GetShapeType() == GEOM::VERTEX)
       aName = "Vertex_";
@@ -703,7 +1042,7 @@ GHS3DPlugin::GHS3DEnforcedVertexList* GHS3DPlugin_Hypothesis_i::GetEnforcedVerti
   GHS3DPlugin::GHS3DEnforcedVertexList_var result = new GHS3DPlugin::GHS3DEnforcedVertexList();
 
   const ::GHS3DPlugin_Hypothesis::TGHS3DEnforcedVertexList enfVertexList = this->GetImpl()->_GetEnforcedVertices();
-  result->length( enfVertexList.size() );
+  result->length((CORBA::ULong) enfVertexList.size() );
 
   ::GHS3DPlugin_Hypothesis::TGHS3DEnforcedVertexList::const_iterator it = enfVertexList.begin();
 
@@ -716,8 +1055,8 @@ GHS3DPlugin::GHS3DEnforcedVertexList* GHS3DPlugin_Hypothesis_i::GetEnforcedVerti
     enfVertex->geomEntry = CORBA::string_dup(currentVertex->geomEntry.c_str());
     // Coords
     GHS3DPlugin::TCoords_var coords = new GHS3DPlugin::TCoords();
-    coords->length(currentVertex->coords.size());
-    for ( size_t ind = 0; ind < currentVertex->coords.size(); ind++)
+    coords->length((CORBA::ULong) currentVertex->coords.size());
+    for ( CORBA::ULong ind = 0; ind < currentVertex->coords.size(); ind++)
       coords[ind] = currentVertex->coords[ind];
     enfVertex->coords = coords;
     // Group Name
@@ -740,7 +1079,6 @@ GHS3DPlugin::GHS3DEnforcedVertexList* GHS3DPlugin_Hypothesis_i::GetEnforcedVerti
 //=======================================================================
 
 bool GHS3DPlugin_Hypothesis_i::RemoveEnforcedVertex(CORBA::Double x, CORBA::Double y, CORBA::Double z)
-  throw (SALOME::SALOME_Exception)
 {
   ASSERT(myBaseImpl);
   try {
@@ -757,7 +1095,6 @@ bool GHS3DPlugin_Hypothesis_i::RemoveEnforcedVertex(CORBA::Double x, CORBA::Doub
 }
 
 bool GHS3DPlugin_Hypothesis_i::RemoveEnforcedVertexGeom(GEOM::GEOM_Object_ptr theVertex)
-  throw (SALOME::SALOME_Exception)
 {
   ASSERT(myBaseImpl);
   
@@ -767,7 +1104,7 @@ bool GHS3DPlugin_Hypothesis_i::RemoveEnforcedVertexGeom(GEOM::GEOM_Object_ptr th
   
   string theVertexEntry = theVertex->GetStudyEntry();
   if (theVertexEntry.empty()) {
-    GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine();
+    GEOM::GEOM_Gen_ptr geomGen = SMESH_Gen_i::GetGeomEngine( theVertex );
     string aName;
     if (theVertex->GetShapeType() == GEOM::VERTEX)
       aName = "Vertex_";
@@ -826,7 +1163,7 @@ GHS3DPlugin::GHS3DEnforcedMeshList* GHS3DPlugin_Hypothesis_i::GetEnforcedMeshes(
   GHS3DPlugin::GHS3DEnforcedMeshList_var result = new GHS3DPlugin::GHS3DEnforcedMeshList();
 
   const ::GHS3DPlugin_Hypothesis::TGHS3DEnforcedMeshList enfMeshList = this->GetImpl()->_GetEnforcedMeshes();
-  result->length( enfMeshList.size() );
+  result->length((CORBA::ULong) enfMeshList.size() );
 
   ::GHS3DPlugin_Hypothesis::TGHS3DEnforcedMeshList::const_iterator it = enfMeshList.begin();
 
@@ -854,7 +1191,6 @@ GHS3DPlugin::GHS3DEnforcedMeshList* GHS3DPlugin_Hypothesis_i::GetEnforcedMeshes(
  * \brief Adds enforced elements of type elementType using another mesh/sub-mesh/mesh group theSource. The elements will be grouped in theGroupName.
  */
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedMeshWithGroup(SMESH::SMESH_IDSource_ptr theSource, SMESH::ElementType theType, const char* theGroupName)
-  throw (SALOME::SALOME_Exception)
 {
   return p_SetEnforcedMesh(theSource, theType, "", theGroupName);
 }
@@ -863,7 +1199,6 @@ bool GHS3DPlugin_Hypothesis_i::SetEnforcedMeshWithGroup(SMESH::SMESH_IDSource_pt
  * \brief Adds enforced elements of type elementType using another mesh/sub-mesh/mesh group theSource.
  */
 bool GHS3DPlugin_Hypothesis_i::SetEnforcedMesh(SMESH::SMESH_IDSource_ptr theSource, SMESH::ElementType theType)
-  throw (SALOME::SALOME_Exception)
 {
   return p_SetEnforcedMesh(theSource, theType);
 }
@@ -871,8 +1206,7 @@ bool GHS3DPlugin_Hypothesis_i::SetEnforcedMesh(SMESH::SMESH_IDSource_ptr theSour
 /*!
  * \brief OBSOLETE FUNCTION - Adds enforced elements of type elementType using another mesh/sub-mesh/mesh group theSource and a size. The elements will be grouped in theGroupName.
  */
-bool GHS3DPlugin_Hypothesis_i::SetEnforcedMeshSizeWithGroup(SMESH::SMESH_IDSource_ptr theSource, SMESH::ElementType theType, double theSize, const char* theGroupName)
-  throw (SALOME::SALOME_Exception)
+bool GHS3DPlugin_Hypothesis_i::SetEnforcedMeshSizeWithGroup(SMESH::SMESH_IDSource_ptr theSource, SMESH::ElementType theType, double /*theSize*/, const char* theGroupName)
 {
   return p_SetEnforcedMesh(theSource, theType, "", theGroupName);
 }
@@ -880,8 +1214,7 @@ bool GHS3DPlugin_Hypothesis_i::SetEnforcedMeshSizeWithGroup(SMESH::SMESH_IDSourc
 /*!
  * \brief OBSOLETE FUNCTION - Adds enforced elements of type elementType using another mesh/sub-mesh/mesh group theSource and a size.
  */
-bool GHS3DPlugin_Hypothesis_i::SetEnforcedMeshSize(SMESH::SMESH_IDSource_ptr theSource, SMESH::ElementType theType, double theSize)
-  throw (SALOME::SALOME_Exception)
+bool GHS3DPlugin_Hypothesis_i::SetEnforcedMeshSize(SMESH::SMESH_IDSource_ptr theSource, SMESH::ElementType theType, double /*theSize*/)
 {
   return p_SetEnforcedMesh(theSource, theType);
 }
@@ -890,7 +1223,6 @@ bool GHS3DPlugin_Hypothesis_i::p_SetEnforcedMesh(SMESH::SMESH_IDSource_ptr theSo
                                                  SMESH::ElementType        theType,
                                                  const char*               theName,
                                                  const char*               theGroupName)
-  throw (SALOME::SALOME_Exception)
 {
   ASSERT(myBaseImpl);
 
@@ -1023,3 +1355,134 @@ CORBA::Boolean GHS3DPlugin_Hypothesis_i::IsDimSupported( SMESH::Dimension type )
 {
   return type == SMESH::DIM_3D;
 }
+
+
+//================================================================================
+/*!
+ * \brief Return geometry this hypothesis depends on. Return false if there is no geometry parameter
+ */
+//================================================================================
+
+bool
+GHS3DPlugin_Hypothesis_i::getObjectsDependOn( std::vector< std::string > & entryArray,
+                                              std::vector< int >         & /*subIDArray*/ ) const
+{
+  typedef ::GHS3DPlugin_Hypothesis THyp;
+  const THyp* h = static_cast< const THyp*>( myBaseImpl );
+
+  {
+    const THyp::TGHS3DEnforcedVertexList& enfVertexList = h->_GetEnforcedVertices();
+    THyp::TGHS3DEnforcedVertexList::const_iterator evIt = enfVertexList.begin();
+    for ( ; evIt != enfVertexList.end(); ++evIt )
+    {
+      const THyp::TGHS3DEnforcedVertex* ev = *evIt;
+      entryArray.push_back( ev->geomEntry );
+    }
+  }
+  {
+    const THyp::TGHS3DEnforcedVertexEntryValues&
+      enfVertexEntrySizeList = h->_GetEnforcedVerticesEntrySize();
+    THyp::TGHS3DEnforcedVertexEntryValues::const_iterator entry2size;
+    for ( entry2size =  enfVertexEntrySizeList.cbegin();
+          entry2size != enfVertexEntrySizeList.cend();
+          entry2size++ )
+    {
+      entryArray.push_back( entry2size->first );
+    }
+  }
+  {
+    const THyp::TCoordsGHS3DEnforcedVertexMap&
+      coordsEnfVertexMap = h->_GetEnforcedVerticesByCoords();
+    THyp::TCoordsGHS3DEnforcedVertexMap::const_iterator size2ev = coordsEnfVertexMap.cbegin();
+    for ( ; size2ev != coordsEnfVertexMap.cend(); ++size2ev )
+    {
+      const THyp::TGHS3DEnforcedVertex* ev = size2ev->second;
+      entryArray.push_back( ev->geomEntry );
+    }
+  }
+  {
+    const THyp::TGeomEntryGHS3DEnforcedVertexMap&
+      geomEntryEnfVertexMap = h->_GetEnforcedVerticesByEntry();
+    THyp::TGeomEntryGHS3DEnforcedVertexMap::const_iterator entry2ev;
+    for ( entry2ev =  geomEntryEnfVertexMap.cbegin();
+          entry2ev != geomEntryEnfVertexMap.cend();
+          entry2ev++ )
+    {
+      entryArray.push_back( entry2ev->first );
+
+      const THyp::TGHS3DEnforcedVertex* ev = entry2ev->second;
+      entryArray.push_back( ev->geomEntry );
+    }
+  }
+
+  return entryArray.size() > 0;
+}
+
+//================================================================================
+/*!
+ * \brief Set new geometry instead of that returned by getObjectsDependOn()
+ */
+//================================================================================
+
+bool
+GHS3DPlugin_Hypothesis_i::setObjectsDependOn( std::vector< std::string > & entryArray,
+                                              std::vector< int >         & /*subIDArray*/ )
+{
+  typedef ::GHS3DPlugin_Hypothesis THyp;
+  THyp* h = static_cast< THyp*>( myBaseImpl );
+
+  size_t iEnt = 0;
+  {
+    THyp::TGHS3DEnforcedVertexList& enfVertexList =
+      const_cast<THyp::TGHS3DEnforcedVertexList& >( h->_GetEnforcedVertices() );
+    THyp::TGHS3DEnforcedVertexList::iterator evIt = enfVertexList.begin();
+    for ( ; evIt != enfVertexList.end(); ++evIt )
+    {
+      THyp::TGHS3DEnforcedVertex* ev = *evIt;
+      ev->geomEntry = entryArray[ iEnt++ ];
+    }
+  }
+  {
+    THyp::TGHS3DEnforcedVertexEntryValues& enfVertexEntrySizeListNew =
+      const_cast< THyp::TGHS3DEnforcedVertexEntryValues& > ( h->_GetEnforcedVerticesEntrySize() );
+    THyp::TGHS3DEnforcedVertexEntryValues enfVertexEntrySizeList;
+    enfVertexEntrySizeList.swap( enfVertexEntrySizeListNew );
+    THyp::TGHS3DEnforcedVertexEntryValues::const_iterator entry2size;
+    for ( entry2size =  enfVertexEntrySizeList.cbegin();
+          entry2size != enfVertexEntrySizeList.cend();
+          entry2size++, ++iEnt )
+    {
+      if ( entry2size->first.empty() == entryArray[ iEnt ].empty() )
+        enfVertexEntrySizeListNew[ entryArray[ iEnt ]] = entry2size->second;
+    }
+  }
+  {
+    THyp::TCoordsGHS3DEnforcedVertexMap& coordsEnfVertexMap =
+      const_cast< THyp::TCoordsGHS3DEnforcedVertexMap& > ( h->_GetEnforcedVerticesByCoords() );
+    THyp::TCoordsGHS3DEnforcedVertexMap::iterator size2ev = coordsEnfVertexMap.begin();
+    for ( ; size2ev != coordsEnfVertexMap.end(); ++size2ev )
+    {
+      THyp::TGHS3DEnforcedVertex* ev = size2ev->second;
+      ev->geomEntry = entryArray[ iEnt++ ];
+    }
+  }
+  {
+    THyp::TGeomEntryGHS3DEnforcedVertexMap& geomEntryEnfVertexMapNew =
+      const_cast< THyp::TGeomEntryGHS3DEnforcedVertexMap& > ( h->_GetEnforcedVerticesByEntry() );
+    THyp::TGeomEntryGHS3DEnforcedVertexMap geomEntryEnfVertexMap;
+    geomEntryEnfVertexMap.swap( geomEntryEnfVertexMapNew );
+    THyp::TGeomEntryGHS3DEnforcedVertexMap::iterator entry2ev;
+    for ( entry2ev =  geomEntryEnfVertexMap.begin();
+          entry2ev != geomEntryEnfVertexMap.end();
+          entry2ev++ )
+    {
+      const std::string& entry = entryArray[ iEnt++ ];
+      THyp::TGHS3DEnforcedVertex* ev = entry2ev->second;
+      ev->geomEntry = entryArray[ iEnt++ ];
+
+      geomEntryEnfVertexMapNew[ entry ] = ev;
+    }
+  }
+
+  return iEnt == entryArray.size();
+}