Back to index

salome-smesh  6.5.0
StdMeshers_LayerDistribution_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 classes
00024 //  File   : StdMeshers_LayerDistribution_i.cxx
00025 //  Author : Edward AGAPOV
00026 //  Module : SMESH
00027 //
00028 #include "StdMeshers_LayerDistribution_i.hxx"
00029 #include "SMESH_Gen_i.hxx"
00030 #include "SMESH_Gen.hxx"
00031 #include "SMESH_PythonDump.hxx"
00032 
00033 #include "Utils_CorbaException.hxx"
00034 #include "utilities.h"
00035 
00036 #include <TCollection_AsciiString.hxx>
00037 
00038 using namespace std;
00039 
00040 //=============================================================================
00046 //=============================================================================
00047 
00048 StdMeshers_LayerDistribution_i::StdMeshers_LayerDistribution_i( PortableServer::POA_ptr thePOA,
00049                                                           int                     theStudyId,
00050                                                           ::SMESH_Gen*            theGenImpl )
00051   : SALOME::GenericObj_i( thePOA ), 
00052     SMESH_Hypothesis_i( thePOA )
00053 {
00054   MESSAGE( "StdMeshers_LayerDistribution_i::StdMeshers_LayerDistribution_i" );
00055   myBaseImpl = new ::StdMeshers_LayerDistribution( theGenImpl->GetANewId(),
00056                                                    theStudyId,
00057                                                    theGenImpl );
00058 }
00059 
00060 //=============================================================================
00066 //=============================================================================
00067 
00068 StdMeshers_LayerDistribution_i::~StdMeshers_LayerDistribution_i()
00069 {
00070   MESSAGE( "StdMeshers_LayerDistribution_i::~StdMeshers_LayerDistribution_i" );
00071 }
00072 
00073 //=============================================================================
00079 //=============================================================================
00080 
00081 void StdMeshers_LayerDistribution_i::SetLayerDistribution(SMESH::SMESH_Hypothesis_ptr hyp1D)
00082      throw ( SALOME::SALOME_Exception )
00083 {
00084   ASSERT( myBaseImpl );
00085   try {
00086     SMESH_Hypothesis_i * hyp_i = SMESH::DownCast< SMESH_Hypothesis_i*>( hyp1D );
00087     bool isNewHyp = ( hyp_i->GetImpl() != this->GetImpl()->GetLayerDistribution() );
00088     this->GetImpl()->SetLayerDistribution( hyp_i->GetImpl() );
00089     myHyp = SMESH::SMESH_Hypothesis::_duplicate( hyp1D );
00090     // Remove SO of 1D hypothesis if it was published
00091     if (SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen()) {
00092       SALOMEDS::Study_var study = gen->GetCurrentStudy();
00093       SALOMEDS::SObject_var SO = gen->ObjectToSObject( study, hyp1D );
00094       if ( ! SO->_is_nil() )
00095         study->NewBuilder()->RemoveObjectWithChildren( SO );
00096     }
00097     // Update Python script: write creation of 1D hyp as it is not published and
00098     // for this, SMESH_Gen does not write it's creation
00099     if ( isNewHyp )
00100       SMESH::TPythonDump() << hyp1D << " = "
00101                            << SMESH_Gen_i::GetSMESHGen() << ".CreateHypothesis('"
00102                            << hyp_i->GetName() << "', '" << hyp_i->GetLibName() << "')";
00103   }
00104   catch ( SALOME_Exception& S_ex ) {
00105     THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM );
00106   }
00107   // Update Python script
00108   SMESH::TPythonDump() << _this() << ".SetLayerDistribution( " << hyp1D << " )";
00109 }
00110 
00111 //=============================================================================
00117 //=============================================================================
00118 
00119 SMESH::SMESH_Hypothesis_ptr StdMeshers_LayerDistribution_i::GetLayerDistribution()
00120 {
00121   SMESH::SMESH_Hypothesis_var hyp = myHyp;
00122   return hyp._retn();
00123 }
00124 
00125 //=============================================================================
00131 //=============================================================================
00132 
00133 ::StdMeshers_LayerDistribution* StdMeshers_LayerDistribution_i::GetImpl()
00134 {
00135   return ( ::StdMeshers_LayerDistribution* )myBaseImpl;
00136 }
00137 
00138 //================================================================================
00146 //================================================================================  
00147 CORBA::Boolean StdMeshers_LayerDistribution_i::IsDimSupported( SMESH::Dimension type )
00148 {
00149   return type == SMESH::DIM_3D;
00150 }
00151 
00152 //================================================================================
00157 //================================================================================
00158 
00159 char* StdMeshers_LayerDistribution_i::SaveTo()
00160 {
00161   ASSERT( myBaseImpl );
00162   std::ostringstream os;
00163 
00164   ::SMESH_Hypothesis* hyp1D = GetImpl()->GetLayerDistribution();
00165   SMESH_Hypothesis_i* hyp1D_i = SMESH::DownCast< SMESH_Hypothesis_i*>( myHyp );
00166   if ( !hyp1D || !hyp1D_i )
00167     os << "NULL_HYPO ";
00168   else {
00169     os << hyp1D->GetName() << " "
00170        << hyp1D->GetLibName() << " "
00171        << hyp1D_i->SaveTo() << " ";
00172   }
00173   os << SMESH_Hypothesis_i::SaveTo();  // to have a mark of storage version ("VARS...")
00174 
00175   return CORBA::string_dup( os.str().c_str() );
00176 }
00177 
00178 //================================================================================
00183 //================================================================================
00184 
00185 void StdMeshers_LayerDistribution_i::LoadFrom( const char* theStream )
00186 {
00187   ASSERT( myBaseImpl );
00188   std::istringstream is( theStream );
00189 
00190   string typeName, libName;
00191   if ( is >> typeName &&
00192        is >> libName )
00193   {
00194     SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen();
00195     SALOMEDS::Study_var curStudy = gen->GetCurrentStudy();
00196     gen->SetCurrentStudy( SALOMEDS::Study::_nil() ); // prevent hypo publishing
00197 
00198     try {
00199       SMESH::SMESH_Hypothesis_var hyp1D =
00200         gen->CreateHypothesis( typeName.c_str(), libName.c_str() );
00201       SMESH_Hypothesis_i* hyp1D_i = SMESH::DownCast< SMESH_Hypothesis_i*>( hyp1D );
00202       if ( hyp1D_i ) {
00203         hyp1D_i->LoadFrom( & theStream[ (streamoff) is.tellg()+1 ]);
00204         this->GetImpl()->SetLayerDistribution( hyp1D_i->GetImpl() );
00205         myHyp = hyp1D;
00206         // as hyp1D is not published, its ID changes
00207         //SMESH::TPythonDump() << _this() << ".SetLayerDistribution( " << hyp1D << " )";
00208 
00209         // restore a mark of storage version ("VARS...")
00210         SMESH_Hypothesis_i::LoadFrom( & theStream[ (streamoff)is.tellg()+1 ]);
00211       }
00212     }
00213     catch (...) {
00214     }
00215     gen->SetCurrentStudy( curStudy );  // enable hypo publishing
00216   }
00217 }
00218 
00219 //================================================================================
00223 //================================================================================
00224 
00225 void StdMeshers_LayerDistribution_i::setOldParameters (const char* theParameters)
00226 {
00227   if ( SMESH_Hypothesis_i* hyp1D_i = SMESH::DownCast< SMESH_Hypothesis_i*>( myHyp ))
00228     hyp1D_i->setOldParameters( theParameters );
00229 }