Back to index

salome-med  6.5.0
MESHClient.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 #include "MESHClient.hxx"
00024 #include "MEDMEM_convert.hxx"
00025 #include "UtilClient.hxx"
00026 #include "COORDINATEClient.hxx"
00027 #include "CONNECTIVITYClient.hxx"
00028 #include "FAMILYClient.hxx"
00029 #include "GROUPClient.hxx"
00030 
00031 using namespace MEDMEM;
00032 using namespace MED_EN;
00033 
00034 //=============================================================================
00038 //=============================================================================
00039 
00040 MESHClient::MESHClient(const SALOME_MED::MESH_ptr m) : 
00041   IOR_Mesh(SALOME_MED::MESH::_duplicate(m)),
00042   _complete(false)//,_refCounter(1)
00043 {
00044   if ( CORBA::is_nil( m ))
00045     throw MEDEXCEPTION("MESHClient(const SALOME_MED::MESH_ptr mesh): NULL mesh!");
00046 
00047   _coordinate = new COORDINATEClient(m, MED_FULL_INTERLACE);
00048   _connectivity = new CONNECTIVITYClient(m, MED_FULL_INTERLACE);
00049 
00050   blankCopy();
00051 }
00052 //=============================================================================
00056 //=============================================================================
00057 
00058 FAMILY * convertFamily(const SALOME_MED::FAMILY_ptr &F, MESH *M) 
00059 {
00060   return new FAMILYClient(F, M);
00061 }
00062 //=============================================================================
00066 //=============================================================================
00067 GROUP * convertGroup(const SALOME_MED::GROUP_ptr &F, MESH *M) 
00068 {
00069   return new GROUPClient(F, M);
00070 }
00071 //=============================================================================
00075 //=============================================================================
00076 void MESHClient::blankCopy()
00077 {
00078   SALOME_MED::GMESH::meshInfos_var all = IOR_Mesh->getMeshGlobal();
00079 
00080   //CORBA::String_var s;
00081   //s= IOR_Mesh->getName(); _name = s;
00082   //_spaceDimension = IOR_Mesh->getSpaceDimension();
00083   //_meshDimension  = IOR_Mesh->getMeshDimension();
00084   //_numberOfNodes  = IOR_Mesh->getNumberOfNodes();
00085   
00086   _name           = all->name;
00087   _spaceDimension = all->spaceDimension;
00088   _numberOfNodes  = all->numberOfNodes;
00089 
00090   COORDINATEClient *_coord 
00091     = dynamic_cast<COORDINATEClient*>(_coordinate);
00092   ASSERT(_coord);
00093   CONNECTIVITYClient *_connect 
00094     = dynamic_cast<CONNECTIVITYClient*>(_connectivity);
00095   ASSERT(_connect);
00096 
00097   _coord->blankCopy();
00098   _connect->blankCopy();
00099 
00100   convertCorbaArray<SALOME_MED::FAMILY_ptr>
00101     (_familyNode, 
00102      //IOR_Mesh->getFamilies(MED_NODE),
00103      &all->famNode,
00104      (void *) (convertFamily), this);
00105  
00106   convertCorbaArray<SALOME_MED::FAMILY_ptr>
00107     (_familyEdge, 
00108      //IOR_Mesh->getFamilies(MED_EDGE),
00109      &all->famEdge,
00110      (void *) (convertFamily), this);
00111  
00112   convertCorbaArray<SALOME_MED::FAMILY_ptr>
00113     (_familyFace, 
00114      //IOR_Mesh->getFamilies(MED_FACE),
00115      &all->famFace,
00116      (void *) (convertFamily), this);
00117  
00118   convertCorbaArray<SALOME_MED::FAMILY_ptr>
00119     (_familyCell, 
00120      //IOR_Mesh->getFamilies(MED_CELL),
00121      &all->famCell,
00122      (void *) (convertFamily), this);
00123  
00124   convertCorbaArray<SALOME_MED::GROUP_ptr>
00125     (_groupNode, 
00126      //IOR_Mesh->getGroups(MED_NODE),
00127      &all->groupNode,
00128      (void *) (convertGroup), this);
00129  
00130   convertCorbaArray<SALOME_MED::GROUP_ptr>
00131     (_groupEdge, 
00132      //IOR_Mesh->getGroups(MED_EDGE),
00133      &all->groupEdge,
00134      (void *) (convertGroup), this);
00135  
00136   convertCorbaArray<SALOME_MED::GROUP_ptr>
00137     (_groupFace, 
00138      //IOR_Mesh->getGroups(MED_FACE),
00139      &all->groupFace,
00140      (void *) (convertGroup), this);
00141  
00142   convertCorbaArray<SALOME_MED::GROUP_ptr>
00143     (_groupCell, 
00144      //IOR_Mesh->getGroups(MED_CELL),
00145      &all->groupCell,
00146      (void *) (convertGroup), this);
00147  
00148   _complete = false;
00149 }
00150 //=============================================================================
00154 //=============================================================================
00155 
00156 void MESHClient::fillCopy()
00157 {
00158   COORDINATEClient *_coord 
00159     = dynamic_cast<COORDINATEClient *> (_coordinate);
00160   ASSERT(_coord);
00161   CONNECTIVITYClient *_connect 
00162     = dynamic_cast<CONNECTIVITYClient *> (_connectivity);
00163   ASSERT(_connect);
00164 
00165   _coord->fillCopy();
00166   _connect->fillCopy();
00167 
00168   int size = _familyNode.size();
00169 
00170   for (int i = 0; i < size; i++)
00171     {
00172       FAMILYClient * _fam = dynamic_cast<FAMILYClient *> (_familyNode[i]);
00173       ASSERT(_fam);
00174 
00175       _fam->fillCopy();
00176     }
00177 
00178   size = _familyCell.size();
00179 
00180   for (int i = 0; i < size; i++)
00181     {
00182       FAMILYClient * _fam = dynamic_cast<FAMILYClient *> (_familyCell[i]);
00183       ASSERT(_fam);
00184 
00185       _fam->fillCopy();
00186     }
00187 
00188   size = _familyFace.size();
00189 
00190   for (int i = 0; i < size; i++)
00191     {
00192       FAMILYClient * _fam = dynamic_cast<FAMILYClient *> (_familyFace[i]);
00193       ASSERT(_fam);
00194 
00195       _fam->fillCopy();
00196     }
00197 
00198   size = _familyEdge.size();
00199 
00200   for (int i = 0; i < size; i++)
00201     {
00202       FAMILYClient * _fam = dynamic_cast<FAMILYClient *> (_familyEdge[i]);
00203       ASSERT(_fam);
00204 
00205       _fam->fillCopy();
00206     }
00207 
00208   _complete = true;
00209 }
00210 
00211 //=============================================================================
00215 //=============================================================================
00216 bool MESHClient::operator==(const MESH& other) const
00217 {
00218   const MESHClient* otherClt=dynamic_cast<const MESHClient *>(&other);
00219   if(otherClt)
00220     {
00221       if(this==otherClt)
00222         {
00223           return true;
00224         }
00225       return IOR_Mesh->areEquals(otherClt->IOR_Mesh);
00226     }
00227   return false;
00228 }
00229 
00230 //=============================================================================
00234 //=============================================================================
00235 
00236 MESHClient::~MESHClient()
00237 {
00238   IOR_Mesh->UnRegister();
00239 }
00240 
00241 //=============================================================================
00245 //=============================================================================
00246 
00247 /*void MESHClient::addReference() const
00248 {
00249   _refCounter++;
00250 }*/
00251 
00252 //=============================================================================
00256 //=============================================================================
00257 
00258 /*void MESHClient::removeReference() const
00259 {
00260   if (--_refCounter <= 0)
00261     {
00262       delete this;
00263     }
00264 }*/
00265 
00266 //=============================================================================
00270 //=============================================================================
00271 
00272 void MESHClient::write(int index/*=0*/) const
00273 {
00274   const_cast<MESHClient*>(this)->fillCopy();
00275   GMESH::write(index);
00276 }
00277 
00278 //=============================================================================
00282 //=============================================================================
00283 
00284 void MESHClient::write(const GENDRIVER &      genDriver,
00285                        MED_EN::med_mode_acces medMode) const
00286 {
00287   const_cast<MESHClient*>(this)->fillCopy();
00288   GMESH::write(genDriver);
00289 }
00290 
00291 //=============================================================================
00295 //=============================================================================
00296 
00297 void MESHClient::write(driverTypes        driverType,
00298                        const std::string& filename,
00299                        const std::string& meshname,
00300                        MED_EN::med_mode_acces medMode) const
00301 {
00302   const_cast<MESHClient*>(this)->fillCopy();
00303   GMESH::write(driverType, filename);
00304 }
00305 
00306 //================================================================================
00310 //================================================================================
00311 
00312 void MESHClient::printMySelf(ostream &os) const
00313 {
00314   MESHClient* that = (MESHClient*)this;
00315   that->fillCopy();
00316   MESH::printMySelf( os );  
00317 }