Back to index

salome-smesh  6.5.0
SMESH_Hypothesis_i.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 //  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
00024 //  File   : SMESH_Hypothesis_i.cxx
00025 //  Author : Paul RASCLE, EDF
00026 //  Module : SMESH
00027 //
00028 #include <iostream>
00029 #include <sstream>
00030 #include "SMESH_Hypothesis_i.hxx"
00031 #include "SMESH_Gen_i.hxx"
00032 #include "utilities.h"
00033 
00034 using namespace std;
00035 
00036 //=============================================================================
00042 //=============================================================================
00043 
00044 SMESH_Hypothesis_i::SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA )
00045      : SALOME::GenericObj_i( thePOA )
00046 {
00047   MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Début" );
00048   myBaseImpl = 0;
00049   
00050   MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Fin" );
00051 };
00052 
00053 //=============================================================================
00059 //=============================================================================
00060 
00061 SMESH_Hypothesis_i::~SMESH_Hypothesis_i()
00062 {
00063   MESSAGE( "SMESH_Hypothesis_i::~SMESH_Hypothesis_i" );
00064   if ( myBaseImpl )
00065     delete myBaseImpl;
00066 };
00067 
00068 //=============================================================================
00074 //=============================================================================
00075 
00076 char* SMESH_Hypothesis_i::GetName()
00077 {
00078   //MESSAGE( "SMESH_Hypothesis_i::GetName" );
00079   return CORBA::string_dup( myBaseImpl->GetName() );
00080 };
00081 
00082 //=============================================================================
00088 //=============================================================================
00089 
00090 char* SMESH_Hypothesis_i::GetLibName()
00091 {
00092   MESSAGE( "SMESH_Hypothesis_i::GetLibName" );
00093   return CORBA::string_dup( myBaseImpl->GetLibName() );
00094 };
00095 
00096 //=============================================================================
00102 //=============================================================================
00103 
00104 void SMESH_Hypothesis_i::SetLibName(const char* theLibName)
00105 {
00106   MESSAGE( "SMESH_Hypothesis_i::SetLibName" );
00107   myBaseImpl->SetLibName( theLibName );
00108 };
00109 
00110 //=============================================================================
00116 //=============================================================================
00117 
00118 CORBA::Long SMESH_Hypothesis_i::GetId()
00119 {
00120   MESSAGE( "SMESH_Hypothesis_i::GetId" );
00121   return myBaseImpl->GetID();
00122 }
00123 
00124 //=============================================================================
00129 //=============================================================================
00130 bool SMESH_Hypothesis_i::IsPublished(){
00131   bool res = false;
00132   SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
00133   if(gen){
00134     SALOMEDS::SObject_var SO = 
00135       SMESH_Gen_i::ObjectToSObject(gen->GetCurrentStudy() , SMESH::SMESH_Hypothesis::_narrow(_this()));
00136     res = !SO->_is_nil();
00137   }
00138   return res;
00139 }
00140 
00141 //================================================================================
00145 //================================================================================
00146 
00147 void SMESH_Hypothesis_i::SetVarParameter (const char* theParameter,
00148                                           const char* theMethod)
00149 {
00150   if ( SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen() )
00151   {
00152     gen->UpdateParameters(theParameter);
00153 
00154     const std::vector< std::string >& pars = gen->GetLastParameters();
00155     if ( !pars.empty() )
00156       myMethod2VarParams[ theMethod ] = pars[0];
00157   }
00158 }
00159 
00160 //================================================================================
00164 //================================================================================
00165 
00166 char* SMESH_Hypothesis_i::GetVarParameter (const char* theMethod)
00167 {
00168   if ( myMethod2VarParams.count("needs update by old study"))
00169   {
00170     // restore myMethod2VarParams by old study
00171     myMethod2VarParams.clear();
00172     if ( SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen() )
00173     {
00174       CORBA::String_var oldparVar = gen->GetParameters( _this() );
00175       setOldParameters( oldparVar.in() );
00176     }
00177   }
00178   std::map< std::string, std::string >::iterator meth_param = myMethod2VarParams.find( theMethod );
00179   if ( meth_param != myMethod2VarParams.end() )
00180     return CORBA::string_dup( meth_param->second.c_str() );
00181 
00182   return CORBA::string_dup("");
00183 }
00184 
00185 //================================================================================
00189 //================================================================================
00190 
00191 void SMESH_Hypothesis_i::setOldParameters (const char* theParameters)
00192 {
00193   if ( SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen() )
00194   {
00195     TCollection_AsciiString aOldParameters(theParameters);
00196     int pos = aOldParameters.SearchFromEnd("|");
00197     if ( pos >= 0 ) aOldParameters = aOldParameters.Split(pos);
00198     pos = aOldParameters.SearchFromEnd(";*=");
00199     if ( pos >= 0 ) aOldParameters.Split(pos-1);
00200     gen->UpdateParameters( aOldParameters.ToCString() );
00201 
00202     myMethod2VarParams.clear();
00203     const std::vector< std::string >& pars = gen->GetLastParameters();
00204     for ( size_t i = 0; i < pars.size(); ++i )
00205     {
00206       std::string meth = getMethodOfParameter( i, pars.size() );
00207       myMethod2VarParams[ meth ] = pars[i];
00208     }
00209     gen->UpdateParameters(""); // clear params
00210   }
00211 }
00212 
00213 //=============================================================================
00218 //=============================================================================
00219 void SMESH_Hypothesis_i::SetParameters(const char* theParameters)
00220 {
00221   SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
00222   //char * aParameters = CORBA::string_dup(theParameters);
00223   if(gen){
00224     gen->UpdateParameters(theParameters);
00225     // if(IsPublished()) {
00226     //   SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Hypothesis::_narrow(_this()),aParameters);
00227     // }
00228     // else {
00229     //   myBaseImpl->SetParameters(gen->ParseParameters(aParameters));
00230     // }
00231   }
00232 }
00233 
00234 //=============================================================================
00239 //=============================================================================
00240 char* SMESH_Hypothesis_i::GetParameters()
00241 {
00242   SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
00243   char* aResult;
00244   if(IsPublished()) {
00245     MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get Parameters from SObject");
00246     aResult = gen->GetParameters(SMESH::SMESH_Hypothesis::_narrow(_this()));
00247   }
00248   else {
00249     MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get local parameters");
00250     aResult = myBaseImpl->GetParameters(); 
00251   }
00252   return CORBA::string_dup(aResult);
00253 }
00254 
00255 //=============================================================================
00260 //=============================================================================
00261 SMESH::ListOfParameters* SMESH_Hypothesis_i::GetLastParameters()
00262 {
00263   SMESH::ListOfParameters_var aResult = new SMESH::ListOfParameters();
00264   SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
00265   if(gen) {
00266     char *aParameters;
00267     if(IsPublished())
00268      aParameters = GetParameters();
00269     else
00270       aParameters = myBaseImpl->GetLastParameters();
00271 
00272     SALOMEDS::Study_ptr aStudy = gen->GetCurrentStudy();
00273     if(!aStudy->_is_nil()) {
00274       SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters); 
00275       if(aSections->length() > 0) {
00276         SALOMEDS::ListOfStrings aVars = aSections[aSections->length()-1];
00277         aResult->length(aVars.length());
00278         for(int i = 0;i < aVars.length();i++)
00279           aResult[i] = CORBA::string_dup( aVars[i]);
00280       }
00281     }
00282   }
00283   return aResult._retn();
00284 }
00285 
00286 //=============================================================================
00291 //=============================================================================
00292 void SMESH_Hypothesis_i::SetLastParameters(const char* theParameters)
00293 {
00294   if(!IsPublished()) {
00295     myBaseImpl->SetLastParameters(theParameters);
00296   }
00297 }
00298 //=============================================================================
00303 //=============================================================================
00304 void SMESH_Hypothesis_i::ClearParameters()
00305 {
00306   myMethod2VarParams.clear();
00307   // if(!IsPublished()) {
00308   //   myBaseImpl->ClearParameters();
00309   // }
00310 }
00311 
00312 //=============================================================================
00318 //=============================================================================
00319 
00320 ::SMESH_Hypothesis* SMESH_Hypothesis_i::GetImpl()
00321 {
00322   return myBaseImpl;
00323 }
00324 
00325 //=============================================================================
00331 //=============================================================================
00332 
00333 char* SMESH_Hypothesis_i::SaveTo()
00334 {
00335   std::ostringstream os;
00336 
00337   // assure that parameters are loaded from an old study
00338   CORBA::String_var p = GetVarParameter("");
00339 
00340   os << "VARS " << myMethod2VarParams.size()  << " ";
00341   std::map< std::string, std::string >::iterator meth_param = myMethod2VarParams.begin();
00342   for ( ; meth_param != myMethod2VarParams.end(); ++meth_param )
00343     os << meth_param->first << " "
00344        << meth_param->second.size() << " "
00345        << meth_param->second << " ";
00346 
00347   myBaseImpl->SaveTo( os );
00348   return CORBA::string_dup( os.str().c_str() );
00349 }
00350 
00351 //=============================================================================
00357 //=============================================================================
00358 
00359 void SMESH_Hypothesis_i::LoadFrom( const char* theStream )
00360 {
00361   std::istringstream is( theStream );
00362   if ( strncmp( theStream, "VARS", 4 ) == 0 )
00363   {
00364     int nbVars, len;
00365     char str[256];
00366     std::string meth;
00367     is >> str >> nbVars;
00368     for ( int i = 0; i < nbVars; ++i )
00369     {
00370       is >> meth >> len;
00371       if ( len < 256 )
00372       {
00373         is.get( str, len + 2 ); // 2 - to read at least 1 white space
00374         if ( len > 0 )
00375           myMethod2VarParams[ meth ] = std::string( str+1, len );
00376       }
00377     }
00378   }
00379   else
00380   {
00381     // we can't restore myMethod2VarParams by old study here because SObject
00382     // isn't yet bound to _this()
00383     myMethod2VarParams["needs update by old study"] = "yes";
00384   }
00385 
00386   myBaseImpl->LoadFrom( is );
00387 
00388   // let listeners know about loading (issue 0020918)
00389   myBaseImpl->NotifySubMeshesHypothesisModification();
00390 }
00391 
00392 //================================================================================
00396 //================================================================================
00397 
00398 void SMESH_Hypothesis_i::UpdateAsMeshesRestored()
00399 {
00400   // for hyps needing full data restored
00401 }