From: vsr Date: Wed, 6 Apr 2016 14:24:26 +0000 (+0300) Subject: 0021803: EDF 2351 : Available versions of MED in TUI function ExportMED aren't consis... X-Git-Tag: V9_0_0~3 X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=commitdiff_plain;h=d3e1cabf77f67408ac401e2d387e721605cb3b10 0021803: EDF 2351 : Available versions of MED in TUI function ExportMED aren't consistent with GUI behavior --- diff --git a/CMakeLists.txt b/CMakeLists.txt index b3e766d8d..bc57e9425 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -296,7 +296,7 @@ INCLUDE(CMakePackageConfigHelpers) # They all have to be INSTALL'd with the option "EXPORT ${PROJECT_NAME}TargetGroup" SET(_${PROJECT_NAME}_exposed_targets SMESHControls MeshDriver MeshDriverDAT MeshDriverGMF MeshDriverMED - MeshDriverSTL MeshDriverUNV MEDWrapperBase MEDWrapper MEDWrapper_V2_2 + MeshDriverSTL MeshDriverUNV MEDWrapper SMDS SMESHimpl SMESHEngine SMESHClient SMESHDS SMESHUtils StdMeshers StdMeshersEngine MeshJobManagerEngine SPADDERPluginTesterEngine SalomeIDLSMESH SalomeIDLSPADDER diff --git a/SalomeSMESHConfig.cmake.in b/SalomeSMESHConfig.cmake.in index 6fe86346c..dbe99c27e 100644 --- a/SalomeSMESHConfig.cmake.in +++ b/SalomeSMESHConfig.cmake.in @@ -138,9 +138,7 @@ SET(SMESH_MeshDriverGMF MeshDriverGMF) SET(SMESH_MeshDriverMED MeshDriverMED) SET(SMESH_MeshDriverSTL MeshDriverSTL) SET(SMESH_MeshDriverUNV MeshDriverUNV) -SET(SMESH_MEDWrapperBase MEDWrapperBase) SET(SMESH_MEDWrapper MEDWrapper) -SET(SMESH_MEDWrapper_V2_2 MEDWrapper_V2_2) IF(SALOME_SMESH_ENABLE_MEFISTO) SET(SMESH_MEFISTO2D MEFISTO2D) ENDIF(SALOME_SMESH_ENABLE_MEFISTO) diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index dc9433346..4e29fa63b 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -411,10 +411,20 @@ module SMESH */ long GetObjectId(in Object theObject); + /*! + * \brief Get version of MED format being used. + */ + string GetMEDFileVersion(); + /*! * \brief Get MED version of the file by its name. */ - boolean GetMEDVersion(in string theFileName, out MED_VERSION theVersion); + string GetMEDVersion(in string theFileName); + + /*! + * \brief Check compatibility of file with MED format being used. + */ + boolean CheckCompatibility(in string theFileName); /*! * \brief Get names of meshes defined in file with the specified name. diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index 28f0f7e90..b17139203 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -235,15 +235,6 @@ module SMESH DRS_FAIL // general failure (exception etc.) }; - /*! - * Enumeration for ExportToMED*() - */ - enum MED_VERSION - { - MED_V2_1, - MED_V2_2 - }; - /*! * \brief A structure containing information about MED file */ @@ -623,13 +614,12 @@ module SMESH boolean HasDuplicatedGroupNamesMED(); /*! - * Export Mesh to a MED Format file + * Export a Mesh to MED file. * @params - * - file : name of the MED file + * - fileName : name of the MED file * - auto_groups : boolean parameter for creating/not creating * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; * the typical use is auto_groups=false. - * - version : defines the version of format of MED file, that will be created * - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists * - autoDimension : if @c true, a space dimension of a MED mesh can be either * - 1D if all mesh nodes lie on OX coordinate axis, or @@ -637,18 +627,16 @@ module SMESH * - 3D in the rest cases. * If @a autoDimension is @c false, the space dimension is always 3. */ - void ExportToMEDX( in string file, - in boolean auto_groups, - in MED_VERSION version, - in boolean overwrite, - in boolean autoDimension) raises (SALOME::SALOME_Exception); + void ExportMED( in string fileName, + in boolean auto_groups, + in boolean overwrite, + in boolean autoDimension) raises (SALOME::SALOME_Exception); /*! * Export a [part of] Mesh into a MED file * @params * - meshPart : a part of mesh to store - * - file : name of the MED file - * - version : define the version of format of MED file, that will be created + * - fileName : name of the MED file * - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists * - autoDimension : if @c True, a space dimension for export is defined by mesh * configuration; for example a planar mesh lying on XOY plane @@ -663,31 +651,13 @@ module SMESH * - 's' stands for _solids_ field. */ void ExportPartToMED( in SMESH_IDSource meshPart, - in string file, + in string fileName, in boolean auto_groups, - in MED_VERSION version, in boolean overwrite, in boolean autoDimension, in GEOM::ListOfFields fields, in string geomAssocFields ) raises (SALOME::SALOME_Exception); - /*! - * Export Mesh to a MED Format file - * Works, just the same as ExportToMEDX, with overwrite parameter equal to true. - * The method is kept in order to support old functionality - */ - void ExportToMED( in string file, in boolean auto_groups, in MED_VERSION theVersion ) - raises (SALOME::SALOME_Exception); - - /*! - * Export Mesh to MED_V2_1 MED format - * Works, just the same as ExportToMEDX with MED_VERSION parameter equal to MED_V2_1 - * and overwrite parameter equal to true - * The method is kept in order to support old functionality - */ - void ExportMED( in string file, in boolean auto_groups ) - raises (SALOME::SALOME_Exception); - /*! * Export Mesh to SAUV formatted file * Write a temporary med file and use med2sauv @@ -695,11 +665,6 @@ module SMESH void ExportSAUV( in string file, in boolean auto_groups ) raises (SALOME::SALOME_Exception); - /*! - * Return string representation of a MED file version comprising nbDigits - */ - string GetVersionString(in MED_VERSION version, in short nbDigits); - /*! * Export Mesh to different Formats * (UNV supported version is I-DEAS 10) diff --git a/src/DriverMED/CMakeLists.txt b/src/DriverMED/CMakeLists.txt index c392d12ac..ce7b79ae4 100644 --- a/src/DriverMED/CMakeLists.txt +++ b/src/DriverMED/CMakeLists.txt @@ -25,8 +25,7 @@ INCLUDE_DIRECTORIES( ${CAS_INCLUDE_DIRS} ${VTK_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} - ${PROJECT_SOURCE_DIR}/src/MEDWrapper/Base - ${PROJECT_SOURCE_DIR}/src/MEDWrapper/Factory + ${PROJECT_SOURCE_DIR}/src/MEDWrapper ${PROJECT_SOURCE_DIR}/src/Driver ${PROJECT_SOURCE_DIR}/src/SMDS ${PROJECT_SOURCE_DIR}/src/SMESHUtils @@ -45,8 +44,6 @@ SET(_link_LIBRARIES ${Boost_LIBRARIES} MeshDriver MEDWrapper - MEDWrapperBase - MEDWrapper_V2_2 ) SET(_link_LIBRARIES_bin diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx index f6d67ea59..7954df08c 100644 --- a/src/DriverMED/DriverMED_Family.cxx +++ b/src/DriverMED/DriverMED_Family.cxx @@ -383,11 +383,7 @@ DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, } string aValue = aStr.str(); // PAL19785,0019867 - med forbids whitespace to be the last char in the name - int maxSize; - //if ( theWrapper->GetVersion() == MED::eV2_1 ) - // maxSize = MED::GetNOMLength(); - //else - maxSize = MED::GetNOMLength(); + int maxSize = MED::GetNOMLength(); int lastCharPos = min( maxSize, (int) aValue.size() ) - 1; while ( isspace( aValue[ lastCharPos ] )) aValue.resize( lastCharPos-- ); diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index 16c555eaf..49ac9c892 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -110,7 +110,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() #endif myFamilies.clear(); if(MYDEBUG) MESSAGE("Perform - myFile : "<GetNbMeshes(); @@ -1022,7 +1022,7 @@ list DriverMED_R_SMESHDS_Mesh::GetMeshNames(Status& theStatus) try { if(MYDEBUG) MESSAGE("GetMeshNames - myFile : " << myFile); theStatus = DRS_OK; - PWrapper aMed = CrWrapper(myFile); + PWrapper aMed = CrWrapperR(myFile); if (TInt aNbMeshes = aMed->GetNbMeshes()) { for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) { diff --git a/src/DriverMED/DriverMED_W_Field.cxx b/src/DriverMED/DriverMED_W_Field.cxx index e4a7e4220..475730607 100644 --- a/src/DriverMED/DriverMED_W_Field.cxx +++ b/src/DriverMED/DriverMED_W_Field.cxx @@ -254,7 +254,7 @@ Driver_Mesh::Status DriverMED_W_Field::Perform() if ( !myMesh ) return addMessage("Supporting mesh not set", /*isFatal=*/true ); - MED::PWrapper medFile = MED::CrWrapper( myFile, MED::eV2_2 ); + MED::PWrapper medFile = MED::CrWrapperW( myFile ); MED::PMeshInfo meshInfo; if ( myMeshId > 0 ) { diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index 64d6b6a3b..552a21417 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -52,7 +52,6 @@ using namespace MED; DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh(): - myMedVersion(MED::eV2_2), myAllSubMeshes (false), myDoGroupOfNodes (false), myDoGroupOfEdges (false), @@ -65,36 +64,11 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh(): myDoAllInGroups(false) {} -void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, - MED::EVersion theId) -{ - Driver_SMESHDS_Mesh::SetFile(theFileName); - myMedVersion = theId; -} - void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName) { Driver_SMESHDS_Mesh::SetFile(theFileName); } -string DriverMED_W_SMESHDS_Mesh::GetVersionString(const MED::EVersion theVersion, int theNbDigits) -{ - TInt majeur, mineur, release; - majeur = mineur = release = 0; -// if ( theVersion == eV2_1 ) -// MED::GetVersionRelease(majeur, mineur, release); -// else - MED::GetVersionRelease(majeur, mineur, release); - ostringstream name; - if ( theNbDigits > 0 ) - name << majeur; - if ( theNbDigits > 1 ) - name << "." << mineur; - if ( theNbDigits > 2 ) - name << "." << release; - return name.str(); -} - void DriverMED_W_SMESHDS_Mesh::AddGroup(SMESHDS_GroupBase* theGroup) { myGroups.push_back(theGroup); @@ -457,7 +431,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() } } - MED::PWrapper myMed = CrWrapper(myFile,myMedVersion); + MED::PWrapper myMed = CrWrapperW(myFile); PMeshInfo aMeshInfo = myMed->CrMeshInfo(aMeshDimension,aSpaceDimension,aMeshName); //MESSAGE("Add - aMeshName : "<GetName()); myMed->SetMeshInfo(aMeshInfo); diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h index a9539b9e8..fb45dc1b2 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h @@ -47,12 +47,9 @@ class MESHDRIVERMED_EXPORT DriverMED_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh DriverMED_W_SMESHDS_Mesh(); - virtual void SetFile(const std::string& theFileName); - void SetFile(const std::string& theFileName, MED::EVersion theId); + void SetFile(const std::string& theFileName); void SetAutoDimension(bool toFindOutDimension) { myAutoDimension = toFindOutDimension; } - static std::string GetVersionString(const MED::EVersion theVersion, int theNbDigits=2); - void AddGroupOfNodes(); void AddGroupOfEdges(); void AddGroupOfFaces(); @@ -77,7 +74,6 @@ class MESHDRIVERMED_EXPORT DriverMED_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh private: - MED::EVersion myMedVersion; std::list myGroups; bool myAllSubMeshes; std::vector mySubMeshes; diff --git a/src/MEDWrapper/Base/CMakeLists.txt b/src/MEDWrapper/Base/CMakeLists.txt deleted file mode 100644 index 85f66d890..000000000 --- a/src/MEDWrapper/Base/CMakeLists.txt +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# - -# --- options --- -# additional include directories -INCLUDE_DIRECTORIES( - ${HDF5_INCLUDE_DIRS} - ${Boost_INCLUDE_DIRS} - ${KERNEL_INCLUDE_DIRS} - ${MEDFILE_INCLUDE_DIRS} -) - -# additional preprocessor / compiler flags -ADD_DEFINITIONS( - ${HDF5_DEFINITIONS} - ${BOOST_DEFINITIONS} -) - -SET(_link_LIBRARIES - ${Boost_LIBRARIES} -) - -# --- headers --- - -# header files / no moc processing -SET(MEDWrapperBase_HEADERS - MED_Common.hxx - MED_Vector.hxx - MED_SharedPtr.hxx - MED_SliceArray.hxx - MED_Wrapper.hxx - MED_TWrapper.hxx - MED_Structures.hxx - MED_TStructures.hxx - MED_Algorithm.hxx - MED_GaussUtils.hxx - MED_CoordUtils.hxx - MED_Utilities.hxx - MED_GaussDef.hxx - MED_WrapperBase.hxx -) - -# --- sources --- - -# sources / static -SET(MEDWrapperBase_SOURCES - MED_Structures.cxx - MED_Wrapper.cxx - MED_Algorithm.cxx - MED_GaussUtils.cxx - MED_CoordUtils.cxx - MED_Utilities.cxx - MED_GaussDef.cxx -) - -# --- rules --- - -ADD_LIBRARY(MEDWrapperBase ${MEDWrapperBase_SOURCES}) -TARGET_LINK_LIBRARIES(MEDWrapperBase ${_link_LIBRARIES}) -INSTALL(TARGETS MEDWrapperBase EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS}) - -INSTALL(FILES ${MEDWrapperBase_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS}) diff --git a/src/MEDWrapper/Base/MED_Algorithm.cxx b/src/MEDWrapper/Base/MED_Algorithm.cxx deleted file mode 100644 index b363572b1..000000000 --- a/src/MEDWrapper/Base/MED_Algorithm.cxx +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#include "MED_Algorithm.hxx" -#include "MED_Wrapper.hxx" - -#include "MED_Utilities.hxx" - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -static int MYVALUEDEBUG = 0; -#else -// static int MYDEBUG = 0; -// static int MYVALUEDEBUG = 0; -#endif - -namespace MED -{ - //--------------------------------------------------------------- - TEntity2TGeom2ElemInfo - GetEntity2TGeom2ElemInfo(const PWrapper& theWrapper, - const PMeshInfo& theMeshInfo, - const MED::TEntityInfo& theEntityInfo) - { - MSG(MYDEBUG,"GetElemsByEntity(...)"); - TEntity2TGeom2ElemInfo anEntity2TGeom2ElemInfo; - MED::TEntityInfo::const_iterator anIter = theEntityInfo.begin(); - PElemInfo anElemInfo; - TErr anErr; - for(; anIter != theEntityInfo.end(); anIter++){ - const EEntiteMaillage& anEntity = anIter->first; - const TGeom2Size& aGeom2Size = anIter->second; - TGeom2ElemInfo& aGeom2ElemInfo = anEntity2TGeom2ElemInfo[anEntity]; - - if(anEntity == eNOEUD){ - aGeom2ElemInfo[ePOINT1] = theWrapper->GetPElemInfo(theMeshInfo); - continue; - } - - TGeom2Size::const_iterator anIter2 = aGeom2Size.begin(); - for(; anIter2 != aGeom2Size.end(); anIter2++){ - const EGeometrieElement& aGeom = anIter2->first; - aGeom2ElemInfo[aGeom] = theWrapper->GetPElemInfo(theMeshInfo,anEntity,aGeom,MED::eNOD,&anErr); - } - } - ADDMSG(MYDEBUG,"\n"); - return anEntity2TGeom2ElemInfo; - } - - - //--------------------------------------------------------------- - TFamilyInfoSet - GetFamilyInfoSet(const PWrapper& theWrapper, - const PMeshInfo& theMeshInfo) - { - MSG(MYDEBUG,"GetFamilies(...)"); - TErr anErr; - TFamilyInfoSet aFamilyInfoSet; - TInt aNbFam = theWrapper->GetNbFamilies(*theMeshInfo); - INITMSG(MYDEBUG,"GetNbFamilies() = "<GetPFamilyInfo(theMeshInfo,iFam,&anErr); - if(anErr >= 0) - aFamilyInfoSet.insert(aFamilyInfo); - } - ADDMSG(MYDEBUG,"\n"); - return aFamilyInfoSet; - } - - - //--------------------------------------------------------------- - TGroupInfo - GetGroupInfo(const TFamilyInfoSet& theFamilyInfoSet) - { - MSG(MYDEBUG,"GetFamiliesByGroup(...)"); - TGroupInfo aGroup; - TFamilyInfoSet::const_iterator anIter = theFamilyInfoSet.begin(); - for(; anIter != theFamilyInfoSet.end(); anIter++){ - const PFamilyInfo& aFamilyInfo = *anIter; - TInt aNbGroup = aFamilyInfo->GetNbGroup(); - for(TInt iGroup = 0; iGroup < aNbGroup; iGroup++){ - aGroup[aFamilyInfo->GetGroupName(iGroup)].insert(aFamilyInfo); - } - } - -#ifdef _DEBUG_ - if(MYDEBUG){ - TGroupInfo::const_iterator anIter = aGroup.begin(); - for(; anIter != aGroup.end(); anIter++){ - const std::string& aName = anIter->first; - INITMSG(MYDEBUG,"aGroupName = '"<second; - TFamilyInfoSet::const_iterator anFamIter = aFamilyInfoSet.begin(); - for(; anFamIter != aFamilyInfoSet.end(); anFamIter++){ - const PFamilyInfo& aFamilyInfo = *anFamIter; - INITMSG(MYDEBUG,"aFamilyName = '"<GetName()<<"'\n"); - } - } - ADDMSG(MYDEBUG,"\n"); - } -#endif - - return aGroup; - } - - - //--------------------------------------------------------------- - TFieldInfo2TimeStampInfoSet - GetFieldInfo2TimeStampInfoSet(const PWrapper& theWrapper, - const PMeshInfo& theMeshInfo, - const MED::TEntityInfo& theEntityInfo) - { - MSG(MYDEBUG,"GetFieldsByEntity(...)"); - TFieldInfo2TimeStampInfoSet aFieldInfo2TimeStampInfoSet; - TInt aNbFields = theWrapper->GetNbFields(); - INITMSG(MYDEBUG,"GetNbFields() = "<GetPFieldInfo(theMeshInfo,iField); - INITMSG(MYDEBUG,"aFieldName = '"<GetName()<< - "'; aNbComp = "<GetNbComp()<<"; "); - TGeom2Size aGeom2Size; - EEntiteMaillage anEntity = EEntiteMaillage(-1); - TInt aNbTimeStamps = theWrapper->GetNbTimeStamps(aFieldInfo,theEntityInfo,anEntity,aGeom2Size); - ADDMSG(MYDEBUG,"anEntity = "<GetPTimeStampInfo(aFieldInfo,anEntity,aGeom2Size,iTimeStamp); - aFieldInfo2TimeStampInfoSet[aFieldInfo].insert(aTimeStamp); - INITMSG(MYDEBUG, - "aDt = "<GetDt()<< - ", Unit = \'"<GetUnitDt()<<"\n"); - } - } - ADDMSG(MYDEBUG,"\n"); - return aFieldInfo2TimeStampInfoSet; - } - - - //--------------------------------------------------------------- - TEntite2TFieldInfo2TimeStampInfoSet - GetEntite2TFieldInfo2TimeStampInfoSet(const TFieldInfo2TimeStampInfoSet& theFieldInfo2TimeStampInfoSet) - { - TEntite2TFieldInfo2TimeStampInfoSet anEntite2TFieldInfo2TimeStampInfoSet; - TFieldInfo2TimeStampInfoSet::const_iterator anIter = theFieldInfo2TimeStampInfoSet.begin(); - for(; anIter != theFieldInfo2TimeStampInfoSet.end(); anIter++){ - const TTimeStampInfoSet& aTimeStampInfoSet = anIter->second; - //const PFieldInfo& aFieldInfo = anIter->first; - if(aTimeStampInfoSet.empty()) - continue; - const PTimeStampInfo& aTimeStampInfo = *aTimeStampInfoSet.begin(); - anEntite2TFieldInfo2TimeStampInfoSet[ConvertEntity(aTimeStampInfo->GetEntity())].insert(*anIter); - } - return anEntite2TFieldInfo2TimeStampInfoSet; - } - - - //--------------------------------------------------------------- - bool - operator<(const TFamilyTSize& theLeft, const TFamilyTSize& theRight) - { - const MED::PFamilyInfo& aLeftInfo = boost::get<0>(theLeft); - const MED::PFamilyInfo& aRightInfo = boost::get<0>(theRight); - return aLeftInfo->GetId() < aRightInfo->GetId(); - } - - - //--------------------------------------------------------------- - TEntity2FamilySet - GetEntity2FamilySet(const PWrapper& theWrapper, - const TEntity2TGeom2ElemInfo& theEntity2TGeom2ElemInfo, - const TFamilyInfoSet& theFamilyInfoSet) - { - MSG(MYDEBUG,"GetFamiliesByEntity(...)"); - TEntity2FamilySet anEntity2FamilySet; - - typedef std::map TId2Family; - TId2Family anId2Family; - TFamilyInfoSet::const_iterator anIter = theFamilyInfoSet.begin(); - for(; anIter != theFamilyInfoSet.end(); anIter++){ - const PFamilyInfo& aFamilyInfo = *anIter; - anId2Family.insert(TId2Family::value_type(aFamilyInfo->GetId(),aFamilyInfo)); - } - - if(!anId2Family.empty()){ - typedef std::map TFamilyID2Size; - typedef std::map TEntity2FamilyID; - TEntity2FamilyID anEntity2FamilyID; - - if(!theEntity2TGeom2ElemInfo.empty()){ - TEntity2TGeom2ElemInfo::const_iterator anIter = theEntity2TGeom2ElemInfo.begin(); - for(; anIter != theEntity2TGeom2ElemInfo.end(); anIter++){ - const EEntiteMaillage& anEntity = anIter->first; - TFamilyID2Size& aFamilyID2Size = anEntity2FamilyID[anEntity]; - const TGeom2ElemInfo& aGeom2ElemInfo = anIter->second; - TGeom2ElemInfo::const_iterator aGeom2ElemInfoIter = aGeom2ElemInfo.begin(); - for(; aGeom2ElemInfoIter != aGeom2ElemInfo.end(); aGeom2ElemInfoIter++){ - const PElemInfo& aElemInfo = aGeom2ElemInfoIter->second; - if(TInt aNbElem = aElemInfo->GetNbElem()){ - for(TInt i = 0; i < aNbElem; i++){ - aFamilyID2Size[aElemInfo->GetFamNum(i)] += 1; - } - } - } - } - } - - if(!anEntity2FamilyID.empty()){ - TEntity2FamilyID::const_iterator anIter = anEntity2FamilyID.begin(); - for(; anIter != anEntity2FamilyID.end(); anIter++){ - const EEntiteMaillage& anEntity = anIter->first; - INITMSG(MYDEBUG,"anEntity = "<second; - TFamilyID2Size::const_iterator anIter2 = aFamilyID2Size.begin(); - for(; anIter2 != aFamilyID2Size.end(); anIter2++){ - TInt anId = anIter2->first; - TInt aSize = anIter2->second; - TId2Family::const_iterator anIter3 = anId2Family.find(anId); - if(anIter3 != anId2Family.end()){ - const PFamilyInfo& aFamilyInfo = anIter3->second; - anEntity2FamilySet[anEntity].insert(TFamilyTSize(aFamilyInfo,aSize)); - INITMSG(MYDEBUG, - "aFamilyName = '"<GetName()<< - "' anId = "<GetId()<<"\n"); - } - } - } - } - } - ADDMSG(MYDEBUG,"\n"); - return anEntity2FamilySet; - } - - - //--------------------------------------------------------------- - TKey2Gauss - GetKey2Gauss(const PWrapper& theWrapper, - TErr* theErr, - EModeSwitch theMode) - { - INITMSG(MYDEBUG,"GetKey2Gauss - theMode = "<GetNbGauss(theErr); - for(TInt anId = 1; anId <= aNbGauss; anId++){ - TGaussInfo::TInfo aPreInfo = theWrapper->GetGaussPreInfo(anId); - PGaussInfo anInfo = theWrapper->CrGaussInfo(aPreInfo,theMode); - theWrapper->GetGaussInfo(anId,anInfo,theErr); - TGaussInfo::TKey aKey = boost::get<0>(aPreInfo); - aKey2Gauss[aKey] = anInfo; - -#ifdef _DEBUG_ - const EGeometrieElement& aGeom = boost::get<0>(aKey); - const std::string& aName = boost::get<1>(aKey); - INITMSG(MYDEBUG, - "- aGeom = "<GetNbProfiles(theErr); - for(TInt anId = 1; anId <= aNbProfiles; anId++){ - TProfileInfo::TInfo aPreInfo = theWrapper->GetProfilePreInfo(anId); - const std::string& aName = boost::get<0>(aPreInfo); - if(aName == theProfileName) - return theWrapper->GetPProfileInfo(anId,theMode,theErr); - } - return anInfo; - } - - - //--------------------------------------------------------------- - TMKey2Profile - GetMKey2Profile(const PWrapper& theWrapper, - TErr* theErr, - EModeProfil theMode) - { - INITMSG(MYDEBUG,"GetMKey2Profile - theMode = "<GetNbProfiles(theErr); - for(TInt anId = 1; anId <= aNbProfiles; anId++){ - TProfileInfo::TInfo aPreInfo = theWrapper->GetProfilePreInfo(anId); - PProfileInfo anInfo = theWrapper->GetPProfileInfo(anId,theMode,theErr); - const std::string& aName = boost::get<0>(aPreInfo); - aKey2Profile[aName] = anInfo; - -#ifdef _DEBUG_ - INITMSG(MYDEBUG, - "- aName = '"<GetSize(); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetElemNum(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); -#endif - - } - return TMKey2Profile(theMode,aKey2Profile); - } - - //--------------------------------------------------------------- - EEntiteMaillage - GetEntityByFamilyId(PGrilleInfo& theInfo,TInt theId){ - TElemNum::iterator aNodeFamIter = (theInfo->myFamNumNode).begin(); - for(;aNodeFamIter != (theInfo->myFamNumNode).end(); aNodeFamIter++){ - if(theId == *aNodeFamIter) - return eNOEUD; - } - TElemNum::iterator aCellFamIter = (theInfo->myFamNum).begin(); - for(;aCellFamIter != (theInfo->myFamNum).end(); aCellFamIter++){ - if(theId == *aCellFamIter) - return eMAILLE; - } - EXCEPTION(std::runtime_error, "GetEntityByFamilyId - fails"); - return EEntiteMaillage(-1); - } - - TFamilyID2NbCells - GetFamilyID2NbCells(PGrilleInfo& theInfo){ - TFamilyID2NbCells aFamily2NbCells; - TInt aNbNodes = theInfo->myFamNumNode.size(); - TInt aNbCells = theInfo->myFamNum.size(); - for(TInt i=0; iGetFamNumNode(i)] = 0; - for(TInt i=0; iGetFamNum(i)] = 0; - for(TInt i=0; iGetFamNumNode(i)] += 1; - for(TInt i=0; iGetFamNum(i)] += 1; - return aFamily2NbCells; - } - - EEntiteMaillage ConvertEntity(const EEntiteMaillage& aEntity){ - switch( aEntity ){ - - case eNOEUD_ELEMENT: - case eMAILLE: return eMAILLE; //eNOEUD_ELEMENT it is eMAILLE - - case eFACE: - case eARETE: - case eNOEUD: return aEntity; break; - default: return EEntiteMaillage(-1); - - } - } -} diff --git a/src/MEDWrapper/Base/MED_Algorithm.hxx b/src/MEDWrapper/Base/MED_Algorithm.hxx deleted file mode 100644 index 574851dbc..000000000 --- a/src/MEDWrapper/Base/MED_Algorithm.hxx +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#ifndef MED_Algorithm_HeaderFile -#define MED_Algorithm_HeaderFile - -#include "MED_WrapperBase.hxx" -#include "MED_Structures.hxx" - -#include - -namespace MED -{ - //--------------------------------------------------------------- - typedef std::map TGeom2ElemInfo; - typedef std::map TEntity2TGeom2ElemInfo; - - //! Get set of TElemInfo by its geometrical type and corresponding MED ENTITY - MEDWRAPPER_EXPORT - TEntity2TGeom2ElemInfo - GetEntity2TGeom2ElemInfo(const PWrapper& theWrapper, - const PMeshInfo& theMeshInfo, - const MED::TEntityInfo& theEntityInfo); - - - //--------------------------------------------------------------- - typedef std::set TFamilyInfoSet; - - //! Read set of MED FAMILIES for defined MED file - MEDWRAPPER_EXPORT - TFamilyInfoSet - GetFamilyInfoSet(const PWrapper& theWrapper, - const PMeshInfo& theMeshInfo); - - - //--------------------------------------------------------------- - typedef boost::tuple TFamilyTSize; - - bool - operator<(const TFamilyTSize& theLeft, const TFamilyTSize& theRight); - typedef std::set TFamilyTSizeSet; - - - //--------------------------------------------------------------- - typedef std::map TEntity2FamilySet; - - //! Split set of MED FAMILIES by corresponding MED ENTITY - MEDWRAPPER_EXPORT - TEntity2FamilySet - GetEntity2FamilySet(const PWrapper& theWrapper, - const TEntity2TGeom2ElemInfo& theEntity2TGeom2ElemInfo, - const TFamilyInfoSet& theFamilyInfoSet); - - - //--------------------------------------------------------------- - typedef std::map TGroupInfo; - - //! Split the input set of MED FAMILIES by corresponding MED GROUPS - MEDWRAPPER_EXPORT - TGroupInfo - GetGroupInfo(const TFamilyInfoSet& theFamilyInfoSet); - - - //--------------------------------------------------------------- - typedef std::set TTimeStampInfoSet; - typedef std::map TFieldInfo2TimeStampInfoSet; - - //! Read set of MED TIMESTAMPS groupped by corresponding MED FIELDS - MEDWRAPPER_EXPORT - TFieldInfo2TimeStampInfoSet - GetFieldInfo2TimeStampInfoSet(const PWrapper& theWrapper, - const PMeshInfo& theMeshInfo, - const MED::TEntityInfo& theEntityInfo); - - - //--------------------------------------------------------------- - typedef std::map TEntite2TFieldInfo2TimeStampInfoSet; - - //! Split the input set of MED TIMESTAMPS by corresponding MED FIELDS and MED ENTITIES - MEDWRAPPER_EXPORT - TEntite2TFieldInfo2TimeStampInfoSet - GetEntite2TFieldInfo2TimeStampInfoSet(const TFieldInfo2TimeStampInfoSet& theFieldInfo2TimeStampInfoSet); - - - //--------------------------------------------------------------- - typedef std::map TKey2Gauss; - - //! Read set of MED GAUSS - MEDWRAPPER_EXPORT - TKey2Gauss - GetKey2Gauss(const PWrapper& theWrapper, - TErr* theErr = NULL, - EModeSwitch theMode = eFULL_INTERLACE); - - - //--------------------------------------------------------------- - //! Get MED PROFILE by its name - MEDWRAPPER_EXPORT - PProfileInfo - GetProfileInfo(const PWrapper& theWrapper, - const std::string& theProfileName, - TErr* theErr = NULL, - EModeProfil theMode = eCOMPACT); - - - //--------------------------------------------------------------- - typedef std::map TKey2Profile; - typedef boost::tuple TMKey2Profile; - - //! Read set of MED PROFILES - MEDWRAPPER_EXPORT - TMKey2Profile - GetMKey2Profile(const PWrapper& theWrapper, - TErr* theErr = NULL, - EModeProfil theMode = eCOMPACT); - - //--------------------------------------------------------------- - //! Get Entity for Grille by family id. - MEDWRAPPER_EXPORT - EEntiteMaillage - GetEntityByFamilyId(PGrilleInfo& theInfo, - TInt theId); - - typedef std::map TFamilyID2NbCells; - - //! Get Number of cells for theId family, for Grille - MEDWRAPPER_EXPORT - TFamilyID2NbCells - GetFamilyID2NbCells(PGrilleInfo& theInfo); - - //! Convert eNOEUD_ELEMENT to eMAILLE - MEDWRAPPER_EXPORT - EEntiteMaillage - ConvertEntity(const EEntiteMaillage& aEntity); - -} - -#endif diff --git a/src/MEDWrapper/Base/MED_Common.hxx b/src/MEDWrapper/Base/MED_Common.hxx deleted file mode 100644 index 390e1d623..000000000 --- a/src/MEDWrapper/Base/MED_Common.hxx +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#ifndef MED_Common_HeaderFile -#define MED_Common_HeaderFile - -#include "MED_WrapperBase.hxx" - -#include -#include -#include - -#include - -#include - -#include "SALOMEconfig.h" - -#include "MED_Vector.hxx" -#include "MED_SharedPtr.hxx" -#include "MED_SliceArray.hxx" - -#ifdef WIN32 -#pragma warning(disable:4099) -#endif - -namespace MED{ - - enum EVersion {eVUnknown = -1, eV2_1, eV2_2}; - - typedef enum {eFAUX, eVRAI} EBooleen ; - typedef double TFloat; -#if defined(HAVE_F77INT64) - typedef long TInt; -#else - typedef int TInt; -#endif - typedef hid_t TIdt; - typedef herr_t TErr; - - typedef enum {eFULL_INTERLACE, eNO_INTERLACE} EModeSwitch; - - typedef enum {eFLOAT64=6, eINT=24, eLONG=26 } ETypeChamp; - - typedef enum {eNON_STRUCTURE, eSTRUCTURE} EMaillage; - - typedef enum {eCART, eCYL, eSPHER} ERepere; - - typedef enum {eNOD, eDESC} EConnectivite ; - - typedef enum {ePOINT1=1, eSEG2=102, eSEG3=103, eTRIA3=203, - eQUAD4=204, eTRIA6=206, eTRIA7=207, eQUAD8=208, eQUAD9=209,eTETRA4=304, - ePYRA5=305, ePENTA6=306, eHEXA8=308, eOCTA12=312, eTETRA10=310, - ePYRA13=313, ePENTA15=315, eHEXA20=320, eHEXA27=327, - ePOLYGONE=400, ePOLYGON2=420, ePOLYEDRE=500, eNONE=0, - eBALL=1101 /*no such a type in med.h, it's just a trick*/, - eAllGeoType=-1 } EGeometrieElement; - - typedef enum {eMAILLE, eFACE, eARETE, eNOEUD, eNOEUD_ELEMENT, eSTRUCT_ELEMENT} EEntiteMaillage; - - typedef enum {eNO_PFLMOD, eGLOBAL, eCOMPACT} EModeProfil; - - typedef enum {eGRILLE_CARTESIENNE, eGRILLE_POLAIRE, eGRILLE_STANDARD} EGrilleType; - - typedef enum {eCOOR, eCONN, eNOM, eNUM, eFAM, eCOOR_IND1, eCOOR_IND2, eCOOR_IND3} ETable; - - typedef TVector TFloatVector; - typedef TVector TStringVector; - typedef TVector TIntVector; - typedef std::set TStringSet; - - typedef std::map TGeom2Size; - typedef std::map TEntityInfo; - - typedef std::set TGeomSet; - typedef std::map TEntity2GeomSet; - - MEDWRAPPER_EXPORT - const TEntity2GeomSet& - GetEntity2GeomSet(); - - template - TInt MEDWRAPPER_EXPORT - GetDESCLength(); - - template - TInt MEDWRAPPER_EXPORT - GetIDENTLength(); - - template - TInt MEDWRAPPER_EXPORT - GetNOMLength(); - - template - TInt MEDWRAPPER_EXPORT - GetLNOMLength(); - - template - TInt MEDWRAPPER_EXPORT - GetPNOMLength(); - - template - void MEDWRAPPER_EXPORT - GetVersionRelease(TInt& majeur, TInt& mineur, TInt& release); - - template - MEDWRAPPER_EXPORT - TInt - GetNbConn(EGeometrieElement typmai, - EEntiteMaillage typent, - TInt mdim); - - MEDWRAPPER_EXPORT - TInt - GetNbNodes(EGeometrieElement typmai); - - struct TNameInfo; - typedef SharedPtr PNameInfo; - - struct TMeshInfo; - typedef SharedPtr PMeshInfo; - - struct TFamilyInfo; - typedef SharedPtr PFamilyInfo; - - struct TElemInfo; - typedef SharedPtr PElemInfo; - - struct TNodeInfo; - typedef SharedPtr PNodeInfo; - - struct TPolygoneInfo; - typedef SharedPtr PPolygoneInfo; - - struct TPolyedreInfo; - typedef SharedPtr PPolyedreInfo; - - struct TCellInfo; - typedef SharedPtr PCellInfo; - - struct TBallInfo; - typedef SharedPtr PBallInfo; - - struct TFieldInfo; - typedef SharedPtr PFieldInfo; - - struct TTimeStampInfo; - typedef SharedPtr PTimeStampInfo; - - struct TProfileInfo; - typedef SharedPtr PProfileInfo; - - struct TGaussInfo; - typedef SharedPtr PGaussInfo; - - class TGrilleInfo; - typedef SharedPtr PGrilleInfo; - - struct TTimeStampValueBase; - typedef SharedPtr PTimeStampValueBase; - - struct TWrapper; - typedef SharedPtr PWrapper; -} - - -#endif diff --git a/src/MEDWrapper/Base/MED_CoordUtils.cxx b/src/MEDWrapper/Base/MED_CoordUtils.cxx deleted file mode 100644 index a703f7a30..000000000 --- a/src/MEDWrapper/Base/MED_CoordUtils.cxx +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#include "MED_CoordUtils.hxx" -#include "MED_Utilities.hxx" - -namespace MED -{ - - enum ECoordName{eX, eY, eZ, eNone}; - - template - TFloat - GetCoord(const TCCoordSlice& theCoordSlice) - { - return theCoordSlice[TCoordId]; - } - - template<> - TFloat - GetCoord(const TCCoordSlice& theCoordSlice) - { - return 0.0; - } - - TGetCoord - aXYZGetCoord[3] = { - &GetCoord, - &GetCoord, - &GetCoord - }; - - TGetCoord - aXYGetCoord[3] = { - &GetCoord, - &GetCoord, - &GetCoord - }; - - TGetCoord - aYZGetCoord[3] = { - &GetCoord, - &GetCoord, - &GetCoord - }; - - TGetCoord - aXZGetCoord[3] = { - &GetCoord, - &GetCoord, - &GetCoord - }; - - - TGetCoord - aXGetCoord[3] = { - &GetCoord, - &GetCoord, - &GetCoord - }; - - TGetCoord - aYGetCoord[3] = { - &GetCoord, - &GetCoord, - &GetCoord - }; - - TGetCoord - aZGetCoord[3] = { - &GetCoord, - &GetCoord, - &GetCoord - }; - - - //--------------------------------------------------------------- - TCoordHelper - ::TCoordHelper(TGetCoord* theGetCoord): - myGetCoord(theGetCoord) - {} - - TFloat - TCoordHelper - ::GetCoord(TCCoordSlice& theCoordSlice, - TInt theCoordId) - { - return (*myGetCoord[theCoordId])(theCoordSlice); - } - - - //--------------------------------------------------------------- - PCoordHelper - GetCoordHelper(PNodeInfo theNodeInfo) - { - PCoordHelper aCoordHelper; - { - PMeshInfo aMeshInfo = theNodeInfo->GetMeshInfo(); - TInt aMeshDimension = aMeshInfo->GetDim(); - bool anIsDimPresent[3] = {false, false, false}; - for(int iDim = 0; iDim < aMeshDimension; iDim++){ - // PAL16857(SMESH not conform to the MED convention) -> - // 1D - always along X - // 2D - always in XOY plane - anIsDimPresent[iDim] = iDim < aMeshDimension; -// std::string aName = theNodeInfo->GetCoordName(iDim); -// if ( aName.size() > 1 ) // PAL12148, aName has size 8 or 16 -// aName = aName.substr(0,1); -// if(aName == "x" || aName == "X") -// anIsDimPresent[eX] = true; -// else if(aName == "y" || aName == "Y") -// anIsDimPresent[eY] = true; -// else if(aName == "z" || aName == "Z") -// anIsDimPresent[eZ] = true; - } - - switch(aMeshDimension){ - case 3: - aCoordHelper.reset(new TCoordHelper(aXYZGetCoord)); - break; - case 2: - if(anIsDimPresent[eY] && anIsDimPresent[eZ]) - aCoordHelper.reset(new TCoordHelper(aYZGetCoord)); - else if(anIsDimPresent[eX] && anIsDimPresent[eZ]) - aCoordHelper.reset(new TCoordHelper(aXZGetCoord)); - else - aCoordHelper.reset(new TCoordHelper(aXYGetCoord)); - break; - case 1: - if(anIsDimPresent[eY]) - aCoordHelper.reset(new TCoordHelper(aYGetCoord)); - else if(anIsDimPresent[eZ]) - aCoordHelper.reset(new TCoordHelper(aZGetCoord)); - else - aCoordHelper.reset(new TCoordHelper(aXGetCoord)); - break; - } - } - return aCoordHelper; - } -} diff --git a/src/MEDWrapper/Base/MED_CoordUtils.hxx b/src/MEDWrapper/Base/MED_CoordUtils.hxx deleted file mode 100644 index c41b43dbe..000000000 --- a/src/MEDWrapper/Base/MED_CoordUtils.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#ifndef MED_CoordUtils_HeaderFile -#define MED_CoordUtils_HeaderFile - -#include "MED_WrapperBase.hxx" - -#include "MED_Structures.hxx" - -namespace MED -{ - typedef TFloat (*TGetCoord)(const TCCoordSlice& theCoordSlice); - - - //--------------------------------------------------------------- - class MEDWRAPPER_EXPORT TCoordHelper - { - TGetCoord* myGetCoord; - - public: - TCoordHelper(TGetCoord* theGetCoord); - - TFloat - GetCoord(TCCoordSlice& theCoordSlice, - TInt theCoordId); - }; - typedef SharedPtr PCoordHelper; - - - //--------------------------------------------------------------- - MEDWRAPPER_EXPORT - PCoordHelper - GetCoordHelper(PNodeInfo theNodeInfo); - -} - -#endif diff --git a/src/MEDWrapper/Base/MED_GaussDef.cxx b/src/MEDWrapper/Base/MED_GaussDef.cxx deleted file mode 100644 index 6e22ab3f9..000000000 --- a/src/MEDWrapper/Base/MED_GaussDef.cxx +++ /dev/null @@ -1,570 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File : MED_GaussDef.hxx -// Author : Edward AGAPOV (eap) -// -#include "MED_GaussDef.hxx" -#include "MED_Utilities.hxx" -#include "MED_GaussUtils.hxx" - -namespace MED -{ - using namespace std; - using namespace MED; - //--------------------------------------------------------------- - - void TGaussDef::add(const double x, const double weight) - { - if ( dim() != 1 ) - EXCEPTION( logic_error,"dim() != 1"); - if ( myWeights.capacity() == myWeights.size() ) - EXCEPTION( logic_error,"Extra gauss point"); - myCoords.push_back( x ); - myWeights.push_back( weight ); - } - void TGaussDef::add(const double x, const double y, const double weight) - { - if ( dim() != 2 ) - EXCEPTION( logic_error,"dim() != 2"); - if ( myWeights.capacity() == myWeights.size() ) - EXCEPTION( logic_error,"Extra gauss point"); - myCoords.push_back( x ); - myCoords.push_back( y ); - myWeights.push_back( weight ); - } - void TGaussDef::add(const double x, const double y, const double z, const double weight) - { - if ( dim() != 3 ) - EXCEPTION( logic_error,"dim() != 3"); - if ( myWeights.capacity() == myWeights.size() ) - EXCEPTION( logic_error,"Extra gauss point"); - myCoords.push_back( x ); - myCoords.push_back( y ); - myCoords.push_back( z ); - myWeights.push_back( weight ); - } - void TGaussDef::setRefCoords(const TShapeFun& aShapeFun) - { - myRefCoords.reserve( aShapeFun.myRefCoord.size() ); - myRefCoords.assign( aShapeFun.myRefCoord.begin(), - aShapeFun.myRefCoord.end() ); - } - - - //--------------------------------------------------------------- - /*! - * \brief Fill definition of gauss points family - */ - //--------------------------------------------------------------- - - TGaussDef::TGaussDef(const int geom, const int nbGauss, const int variant) - { - myType = geom; - myCoords .reserve( nbGauss * dim() ); - myWeights.reserve( nbGauss ); - - switch ( geom ) { - - case eSEG2: - case eSEG3: - if (geom == eSEG2) setRefCoords( TSeg2a() ); - else setRefCoords( TSeg3a() ); - switch ( nbGauss ) { - case 1: { - add( 0.0, 2.0 ); break; - } - case 2: { - const double a = 0.577350269189626; - add( a, 1.0 ); - add( -a, 1.0 ); break; - } - case 3: { - const double a = 0.774596669241; - const double P1 = 1./1.8; - const double P2 = 1./1.125; - add( -a, P1 ); - add( 0, P2 ); - add( a, P1 ); break; - } - case 4: { - const double a = 0.339981043584856, b = 0.861136311594053; - const double P1 = 0.652145154862546, P2 = 0.347854845137454 ; - add( a, P1 ); - add( -a, P1 ); - add( b, P2 ); - add( -b, P2 ); break; - } - default: - EXCEPTION( logic_error,"Invalid nb of gauss points for SEG"< alfa - const double a = (6 + sqrt(15.))/21.; - const double b = (6 - sqrt(15.))/21.; - const double P1 = (155 + sqrt(15.))/2400.; - const double P2 = (155 - sqrt(15.))/2400.; //___ - add( -d, 1/3., 1/3., c1*9/80. );//___ - add( -d, a, a, c1*P1 ); - add( -d, 1-2*a, a, c1*P1 ); - add( -d, a, 1-2*a, c1*P1 );//___ - add( -d, b, b, c1*P2 ); - add( -d, 1-2*b, b, c1*P2 ); - add( -d, b, 1-2*b, c1*P2 );//___ - add( 0., 1/3., 1/3., c2*9/80. );//___ - add( 0., a, a, c2*P1 ); - add( 0., 1-2*a, a, c2*P1 ); - add( 0., a, 1-2*a, c2*P1 );//___ - add( 0., b, b, c2*P2 ); - add( 0., 1-2*b, b, c2*P2 ); - add( 0., b, 1-2*b, c2*P2 );//___ - add( d, 1/3., 1/3., c1*9/80. );//___ - add( d, a, a, c1*P1 ); - add( d, 1-2*a, a, c1*P1 ); - add( d, a, 1-2*a, c1*P1 );//___ - add( d, b, b, c1*P2 ); - add( d, 1-2*b, b, c1*P2 ); - add( d, b, 1-2*b, c1*P2 );//___ - break; - } - default: - EXCEPTION( logic_error,"Invalid nb of gauss points for PENTA: " < - -namespace MED -{ - class TShapeFun; - typedef std::vector TDoubleVector; - /*! - * \brief Description of family of integration points - */ - struct TGaussDef - { - int myType; //!< element geometry (EGeometrieElement or med_geometrie_element) - TDoubleVector myRefCoords; //!< description of reference points - TDoubleVector myCoords; //!< coordinates of Gauss points - TDoubleVector myWeights; //!< weights, len(weights)== - - /*! - * \brief Creates definition of gauss points family - * \param geomType - element geometry (EGeometrieElement or med_geometrie_element) - * \param nbPoints - nb gauss point - * \param variant - [1-3] to choose the variant of definition - * - * Throws in case of invalid parameters - * variant == 1 refers to "Fonctions de forme et points d'integration - * des elements finis" v7.4 by J. PELLET, X. DESROCHES, 15/09/05 - * variant == 2 refers to the same doc v6.4 by J.P. LEFEBVRE, X. DESROCHES, 03/07/03 - * variant == 3 refers to the same doc v6.4, second variant for 2D elements - */ - MEDWRAPPER_EXPORT TGaussDef(const int geomType, const int nbPoints, const int variant=1); - - MEDWRAPPER_EXPORT int dim() const { return myType/100; } - MEDWRAPPER_EXPORT int nbPoints() const { return myWeights.capacity(); } - - private: - void add(const double x, const double weight); - void add(const double x, const double y, const double weight); - void add(const double x, const double y, const double z, const double weight); - void setRefCoords(const TShapeFun& aShapeFun); - }; -} - -#endif diff --git a/src/MEDWrapper/Base/MED_GaussUtils.cxx b/src/MEDWrapper/Base/MED_GaussUtils.cxx deleted file mode 100644 index 7ce7b07db..000000000 --- a/src/MEDWrapper/Base/MED_GaussUtils.cxx +++ /dev/null @@ -1,2172 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#include "MED_GaussUtils.hxx" -#include "MED_Utilities.hxx" - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -static int MYVALUEDEBUG = 0; -#else -// static int MYDEBUG = 0; -// static int MYVALUEDEBUG = 0; -#endif - -//#define _DEBUG_REF_COORDS_ - -namespace MED -{ - //--------------------------------------------------------------- - TGaussCoord - ::TGaussCoord(): - TModeSwitchInfo(eFULL_INTERLACE), - myNbElem(0), - myNbGauss(0), - myDim(0), - myGaussStep(0) - { - } - - void - TGaussCoord - ::Init(TInt theNbElem, - TInt theNbGauss, - TInt theDim, - EModeSwitch theMode) - { - myModeSwitch = theMode; - - myNbElem = theNbElem; - myNbGauss = theNbGauss; - myDim = theDim; - - myGaussStep = myNbGauss*myDim; - - myGaussCoord.resize(theNbElem*myGaussStep); - } - - - TInt - TGaussCoord - ::GetNbElem() const - { - return myNbElem; - } - - TInt - TGaussCoord - ::GetNbGauss() const - { - return myNbGauss; - } - - TInt - TGaussCoord - ::GetDim() const - { - return myDim; - } - - unsigned char* - TGaussCoord - ::GetValuePtr() - { - return (unsigned char*)&(myGaussCoord[0]); - } - - - TCCoordSliceArr - TGaussCoord - ::GetCoordSliceArr(TInt theElemId) const - { - TCCoordSliceArr aCoordSliceArr(myNbGauss); - if(GetModeSwitch() == eFULL_INTERLACE){ - TInt anId = theElemId*myGaussStep; - for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ - aCoordSliceArr[anGaussId] = - TCCoordSlice(myGaussCoord,std::slice(anId,myDim,1)); - anId += myDim; - } - } - else{ - for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ - aCoordSliceArr[anGaussId] = - TCCoordSlice(myGaussCoord,std::slice(theElemId,myDim,myGaussStep)); - } - } - return aCoordSliceArr; - } - - - TCoordSliceArr - TGaussCoord - ::GetCoordSliceArr(TInt theElemId) - { - TCoordSliceArr aCoordSliceArr(myNbGauss); - if(GetModeSwitch() == eFULL_INTERLACE){ - TInt anId = theElemId*myGaussStep; - for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ - aCoordSliceArr[anGaussId] = - TCoordSlice(myGaussCoord,std::slice(anId,myDim,1)); - anId += myDim; - } - } - else{ - for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ - aCoordSliceArr[anGaussId] = - TCoordSlice(myGaussCoord,std::slice(theElemId,myDim,myGaussStep)); - } - } - return aCoordSliceArr; - } - - - //--------------------------------------------------------------- - inline - bool - IsEqual(TFloat theLeft, TFloat theRight) - { - static TFloat EPS = 1.0E-3; - if(fabs(theLeft) + fabs(theRight) > EPS) - return fabs(theLeft-theRight)/(fabs(theLeft)+fabs(theRight)) < EPS; - return true; - } - - - //--------------------------------------------------------------- - class TShapeFun::TFun - { - TFloatVector myFun; - TInt myNbRef; - - public: - - void - Init(TInt theNbGauss, - TInt theNbRef) - { - myFun.resize(theNbGauss*theNbRef); - myNbRef = theNbRef; - } - - TCFloatVecSlice - GetFunSlice(TInt theGaussId) const - { - return TCFloatVecSlice(myFun,std::slice(theGaussId*myNbRef,myNbRef,1)); - } - - TFloatVecSlice - GetFunSlice(TInt theGaussId) - { - return TFloatVecSlice(myFun,std::slice(theGaussId*myNbRef,myNbRef,1)); - } - }; - - //--------------------------------------------------------------- - - TShapeFun::TShapeFun(TInt theDim, TInt theNbRef): - myRefCoord(theNbRef*theDim), - myDim(theDim), - myNbRef(theNbRef) - {} - - TCCoordSlice - TShapeFun::GetCoord(TInt theRefId) const - { - return TCCoordSlice(myRefCoord,std::slice(theRefId*myDim,myDim,1)); - } - - TCoordSlice - TShapeFun::GetCoord(TInt theRefId) - { - return TCoordSlice(myRefCoord,std::slice(theRefId*myDim,myDim,1)); - } - - void - TShapeFun::GetFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const - { - TInt aNbRef = theRef.size(); - TInt aNbGauss = theGauss.size(); - theFun.Init(aNbGauss,aNbRef); - } - - bool - TShapeFun::IsSatisfy(const TCCoordSliceArr& theRefCoord) const - { - TInt aNbRef = theRefCoord.size(); - TInt aNbRef2 = GetNbRef(); - INITMSG(MYDEBUG,"TShapeFun::IsSatisfy "<< - "- aNbRef("<GetDim(); - TInt aNbGauss = theGauss.size(); - - bool anIsSubMesh = !theElemNum.empty(); - TInt aNbElem; - if(anIsSubMesh) - aNbElem = theElemNum.size(); - else - aNbElem = theCellInfo.GetNbElem(); - - theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); - - TFun aFun; - InitFun(theRef,theGauss,aFun); - TInt aConnDim = theCellInfo.GetConnDim(); - - INITMSG(MYDEBUG,"aDim = "<GetDim(); - static TInt aNbGauss = 1; - - bool anIsSubMesh = !theElemNum.empty(); - TInt aNbElem; - if(anIsSubMesh) - aNbElem = theElemNum.size(); - else - aNbElem = theCellInfo.GetNbElem(); - - theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); - - TInt aConnDim = theCellInfo.GetConnDim(); - - INITMSGA(MYDEBUG,0, - "- aDim = "<GetDim(); - static TInt aNbGauss = 1; - - bool anIsSubMesh = !theElemNum.empty(); - TInt aNbElem; - if(anIsSubMesh) - aNbElem = theElemNum.size(); - else - aNbElem = thePolygoneInfo.GetNbElem(); - - theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); - - INITMSGA(MYDEBUG,0, - "- aDim = "<GetDim(); - static TInt aNbGauss = 1; - - bool anIsSubMesh = !theElemNum.empty(); - TInt aNbElem; - if(anIsSubMesh) - aNbElem = theElemNum.size(); - else - aNbElem = thePolyedreInfo.GetNbElem(); - - theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); - - INITMSGA(MYDEBUG,0, - "- aDim = "< TCCoordSliceArr; - typedef TVector TCoordSliceArr; - - //! Define a helper class to handle Gauss Points coordinates - class MEDWRAPPER_EXPORT TGaussCoord: - virtual TModeSwitchInfo - { - TInt myNbElem; - TInt myNbGauss; - TInt myDim; - - TInt myGaussStep; - - TNodeCoord myGaussCoord; - - public: - - TGaussCoord(); - - //! To init the class - void - Init(TInt theNbElem, - TInt theNbGauss, - TInt theDim, - EModeSwitch theMode = eFULL_INTERLACE); - - TInt - GetNbElem() const; - - TInt - GetNbGauss() const; - - TInt - GetDim() const; - - unsigned char* - GetValuePtr(); - - //! Get slice of the coordinate that corresponds to defined cell (const version) - TCCoordSliceArr - GetCoordSliceArr(TInt theElemId) const; - - //! Get slice of the coordinate that corresponds to defined cell - TCoordSliceArr - GetCoordSliceArr(TInt theElemId); - }; - typedef SharedPtr PGaussCoord; - - - //--------------------------------------------------------------- - //! To calculate Gauss Points coordinates - MEDWRAPPER_EXPORT - bool - GetGaussCoord3D(const TGaussInfo& theGaussInfo, - const TCellInfo& theCellInfo, - const TNodeInfo& theNodeInfo, - TGaussCoord& theGaussCoord, - const TElemNum& theElemNum = TElemNum(), - EModeSwitch theMode = eFULL_INTERLACE); - - - //--------------------------------------------------------------- - //! To calculate Gauss Points coordinates for defined TCellInfo as its bary center - MEDWRAPPER_EXPORT - bool - GetBaryCenter(const TCellInfo& theCellInfo, - const TNodeInfo& theNodeInfo, - TGaussCoord& theGaussCoord, - const TElemNum& theElemNum = TElemNum(), - EModeSwitch theMode = eFULL_INTERLACE); - - //! To calculate Gauss Points coordinates for defined TPolygoneInfo as its bary center - MEDWRAPPER_EXPORT - bool - GetBaryCenter(const TPolygoneInfo& thePolygoneInfo, - const TNodeInfo& theNodeInfo, - TGaussCoord& theGaussCoord, - const TElemNum& theElemNum = TElemNum(), - EModeSwitch theMode = eFULL_INTERLACE); - - //! To calculate Gauss Points coordinates for defined TPolyedreInfo as its bary center - MEDWRAPPER_EXPORT - bool - GetBaryCenter(const TPolyedreInfo& thePolyedreInfo, - const TNodeInfo& theNodeInfo, - TGaussCoord& theGaussCoord, - const TElemNum& theElemNum = TElemNum(), - EModeSwitch theMode = eFULL_INTERLACE); - - //--------------------------------------------------------------- - //! Shape function definitions - //--------------------------------------------------------------- - struct MEDWRAPPER_EXPORT TShapeFun - { - class TFun; - - TFloatVector myRefCoord; - TInt myDim; - TInt myNbRef; - - TShapeFun(TInt theDim = 0, TInt theNbRef = 0); - - TInt GetNbRef() const { return myNbRef; } - - TCCoordSlice GetCoord(TInt theRefId) const; - - TCoordSlice GetCoord(TInt theRefId); - - void GetFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - virtual - void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const = 0; - virtual - bool IsSatisfy(const TCCoordSliceArr& theRefCoord) const; - - bool Eval(const TCellInfo& theCellInfo, - const TNodeInfo& theNodeInfo, - const TElemNum& theElemNum, - const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TGaussCoord& theGaussCoord, - EModeSwitch theMode); - }; - //--------------------------------------------------------------- - struct TSeg2a: TShapeFun { - TSeg2a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TSeg3a: TShapeFun { - TSeg3a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTria3a: TShapeFun { - TTria3a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTria6a: TShapeFun { - TTria6a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTria3b: TShapeFun { - TTria3b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTria6b: TShapeFun { - TTria6b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TQuad4a: TShapeFun { - TQuad4a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TQuad8a: TShapeFun { - TQuad8a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TQuad9a: TShapeFun { - TQuad9a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TQuad4b: TShapeFun { - TQuad4b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TQuad8b: TShapeFun { - TQuad8b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TQuad9b: TShapeFun { - TQuad9b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTetra4a: TShapeFun { - TTetra4a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTetra10a: TShapeFun { - TTetra10a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTetra4b: TShapeFun { - TTetra4b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TTetra10b: TShapeFun { - TTetra10b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct THexa8a: TShapeFun { - THexa8a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct THexa20a: TShapeFun { - THexa20a(TInt theDim = 3, TInt theNbRef = 20); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct THexa27a: THexa20a { - THexa27a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct THexa8b: TShapeFun { - THexa8b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct THexa20b: TShapeFun { - THexa20b(TInt theDim = 3, TInt theNbRef = 20); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPenta6a: TShapeFun { - TPenta6a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPenta6b: TShapeFun { - TPenta6b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPenta15a: TShapeFun { - TPenta15a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPenta15b: TShapeFun { - TPenta15b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPyra5a: TShapeFun { - TPyra5a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPyra5b: TShapeFun { - TPyra5b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPyra13a: TShapeFun { - TPyra13a(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - struct TPyra13b: TShapeFun { - TPyra13b(); - virtual void InitFun(const TCCoordSliceArr& theRef, - const TCCoordSliceArr& theGauss, - TFun& theFun) const; - }; - //--------------------------------------------------------------- - -} - -#endif diff --git a/src/MEDWrapper/Base/MED_SharedPtr.hxx b/src/MEDWrapper/Base/MED_SharedPtr.hxx deleted file mode 100644 index 914946c29..000000000 --- a/src/MEDWrapper/Base/MED_SharedPtr.hxx +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#ifndef MED_SharedPtr_HeaderFile -#define MED_SharedPtr_HeaderFile - -#include - -namespace MED -{ - - //! To extend the boost::shared_ptr to support such features automatic dynamic cast - /*! - All entities of the MEDWrapper package are handled as pointer. - This class was introduced to provide correct and flexible memory management - for all of the MEDWrapper objects. - */ - template class SharedPtr: public boost::shared_ptr - { - public: - //! Default constructor - SharedPtr() {} - - //! Construct the class by any type of a pointer - template - explicit SharedPtr(Y * p): - boost::shared_ptr(p) - {} - - //! Construct the class by any specialisation of the class - template - SharedPtr(SharedPtr const & r): - boost::shared_ptr(boost::dynamic_pointer_cast(r)) - {} - - //! Copy-constructor - template - SharedPtr& - operator=(SharedPtr const & r) - { - SharedPtr(r).swap(*this); - return *this; - } - - //! Introduce a flexible way to reset the wrapped pointer - template - SharedPtr& - operator()(Y * p) // Y must be complete - { - return operator=(SharedPtr(p)); - } - - //! Introduce a flexible way to reset the wrapped pointer - template - SharedPtr& - operator()(SharedPtr const & r) // Y must be complete - { - return operator=(SharedPtr(r)); - } - - //! To provide a flexible way to use reference to the wrapped pointer (const version) - operator const T& () const - { - return *(this->get()); - } - - //! To provide a flexible way to use reference to the wrapped pointer - operator T& () - { - return *(this->get()); - } - }; - -} - - -#endif diff --git a/src/MEDWrapper/Base/MED_SliceArray.hxx b/src/MEDWrapper/Base/MED_SliceArray.hxx deleted file mode 100644 index 24e01f6f4..000000000 --- a/src/MEDWrapper/Base/MED_SliceArray.hxx +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#ifndef MED_SliceArray_HeaderFile -#define MED_SliceArray_HeaderFile - -#ifdef WIN32 // for correctly compiling "valarray" in modules, which includes this file - #undef max - #undef min -#endif - -#include -#include - -//#if defined(_DEBUG_) -# define MED_TCSLICE_CHECK_RANGE -//#endif - -namespace MED -{ - //--------------------------------------------------------------- - //! This class intends to provide a uniform way to handle multidimensional data (const version) - /*! - It just contains a pointer to real sequence and implement proper calculation of its indexes. - This class deals with constant pointer to the sources data and provides const method to - read them (data). - */ - template - class TCSlice - { - const TValueType* myCValuePtr; //!< Reference to source multidimensional data - size_t mySourceSize; //!< Size of the source multidimensional data - std::slice mySlice; //!< Defines algorithm of index calculation - - protected: - void - check_id(size_t theId) const - { - long int anId = -1; - if(theId < mySlice.size()){ - anId = mySlice.start() + theId*mySlice.stride(); - if(anId < (long int)mySourceSize) - return; - } - throw std::out_of_range("TCSlice::check_id"); - } - - //! Calculate internal index to get proper element from the source multidimensional data - size_t - calculate_id(size_t theId) const - { - return mySlice.start() + theId*mySlice.stride(); - } - - size_t - get_id(size_t theId) const - { -#ifdef MED_TCSLICE_CHECK_RANGE - check_id(theId); -#endif - return calculate_id(theId); - } - - size_t - get_id_at(size_t theId) const - { - check_id(theId); - return calculate_id(theId); - } - - public: - typedef TValueType value_type; - - //! Construct the class from bare pointer - TCSlice(const value_type* theValuePtr, - size_t theSourceSize, - const std::slice& theSlice): - myCValuePtr(theValuePtr), - mySourceSize(theSourceSize), - mySlice(theSlice) - {} - - //! Construct the class from corresponding container - TCSlice(const TVector& theContainer, - const std::slice& theSlice): - myCValuePtr(&theContainer[0]), - mySourceSize(theContainer.size()), - mySlice(theSlice) - {} - - //! Default constructor (dangerous) - TCSlice(): - myCValuePtr(NULL) - {} - - //! Get element by its number (const version) - const value_type& - operator[](size_t theId) const - { - return *(myCValuePtr + get_id(theId)); - } - - const value_type& - at(size_t theId) const - { - return *(myCValuePtr + get_id_at(theId)); - } - - //! Get range of the order numbers - size_t - size() const - { - return mySlice.size(); - } - }; - - - //--------------------------------------------------------------- - //! This class extends TCSlice functionality for non-constant case - template - class TSlice: public TCSlice - { - TValueType* myValuePtr; - - public: - typedef TValueType value_type; - typedef TCSlice TSupperClass; - - //! Construct the class from bare pointer - TSlice(value_type* theValuePtr, - size_t theSourceSize, - const std::slice& theSlice): - TSupperClass(theValuePtr, theSourceSize, theSlice), - myValuePtr(theValuePtr) - {} - - //! Construct the class from corresponding container - TSlice(TVector& theContainer, - const std::slice& theSlice): - TSupperClass(theContainer, theSlice), - myValuePtr(&theContainer[0]) - {} - - //! Default constructor (dangerous) - TSlice(): - myValuePtr(NULL) - {} - - //! Get element by its number - value_type& - operator[](size_t theId) - { - return *(myValuePtr + this->get_id(theId)); - } - - value_type& - at(size_t theId) - { - return *(myValuePtr + this->get_id_at(theId)); - } - }; - -} - -#undef MED_TCSLICE_CHECK_RANGE - -#endif diff --git a/src/MEDWrapper/Base/MED_Structures.cxx b/src/MEDWrapper/Base/MED_Structures.cxx deleted file mode 100644 index ec1fd661e..000000000 --- a/src/MEDWrapper/Base/MED_Structures.cxx +++ /dev/null @@ -1,865 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File : MED_Structure.cxx -// Author : Eugeny NIKOLAEV -// -#include "MED_Structures.hxx" -#include "MED_Utilities.hxx" - -#include - -using namespace MED; - -namespace MED -{ - TInt - GetNbNodes(EGeometrieElement typmai) - { - return typmai%100; - } - - std::string - GetString(TInt theId, - TInt theStep, - const TString& theString) - { - const char* aPos = &theString[theId*theStep]; - TInt aSize = std::min(TInt(strlen(aPos)),theStep); - return std::string(aPos,aSize); - } - - void - SetString(TInt theId, - TInt theStep, - TString& theString, - const std::string& theValue) - { - TInt aSize = std::min(TInt(theValue.size()+1),theStep); - char* aPos = &theString[theId*theStep]; - strncpy(aPos,theValue.c_str(),aSize); - } - - void - SetString(TInt theId, - TInt theStep, - TString& theString, - const TString& theValue) - { - TInt aSize = std::min(TInt(theValue.size()+1),theStep); - char* aPos = &theString[theId*theStep]; - const char* aValue = &theValue[0]; - strncpy(aPos,aValue,aSize); - } - - TInt - GetDimGaussCoord(EGeometrieElement theGeom) - { - return theGeom/100; - } - - TInt - GetNbRefCoord(EGeometrieElement theGeom) - { - return (theGeom%100); - } - - //--------------------------------------------------------------- - PFloatTimeStampValue - CastToFloatTimeStampValue(const PTimeStampValueBase& theTimeStampValue) - { - return theTimeStampValue; - } - - PIntTimeStampValue - CastToIntTimeStampValue(const PTimeStampValueBase& theTimeStampValue) - { - return theTimeStampValue; - } -} - -//--------------------------------------------------------------- -TInt -TFamilyInfo -::GetAttrId(TInt theId) const -{ - return myAttrId[theId]; -} - -TInt -TFamilyInfo -::GetAttrVal(TInt theId) const -{ - return myAttrVal[theId]; -} - -void -TFamilyInfo -::SetAttrId(TInt theId,TInt theVal) -{ - myAttrId[theId] = theVal; -} - -void -TFamilyInfo -::SetAttrVal(TInt theId,TInt theVal) -{ - myAttrVal[theId] = theVal; -} - -//--------------------------------------------------------------- -TInt -TElemInfo -::GetFamNum(TInt theId) const -{ - return (*myFamNum)[theId]; -} - -void -TElemInfo -::SetFamNum(TInt theId, TInt theVal) -{ - (*myFamNum)[theId] = theVal; - myIsFamNum = eVRAI; -} - -TInt -TElemInfo -::GetElemNum(TInt theId) const -{ - return (*myElemNum)[theId]; -} - -void -TElemInfo -::SetElemNum(TInt theId, TInt theVal) -{ - (*myElemNum)[theId] = theVal; -} - -//--------------------------------------------------------------- -TCCoordSlice -TNodeInfo -::GetCoordSlice(TInt theId) const -{ - TInt aDim = myMeshInfo->GetSpaceDim(); - if(GetModeSwitch() == eFULL_INTERLACE) - return TCCoordSlice(*myCoord, std::slice(theId*aDim, aDim, 1)); - else - return TCCoordSlice(*myCoord, std::slice(theId, aDim, aDim)); -} - -TCoordSlice -TNodeInfo -::GetCoordSlice(TInt theId) -{ - TInt aDim = myMeshInfo->GetSpaceDim(); - if(GetModeSwitch() == eFULL_INTERLACE) - return TCoordSlice(*myCoord, std::slice(theId*aDim,aDim,1)); - else - return TCoordSlice(*myCoord, std::slice(theId,aDim,aDim)); -} - -//--------------------------------------------------------------- -TCConnSlice -TCellInfo -::GetConnSlice(TInt theElemId) const -{ - if(GetModeSwitch() == eFULL_INTERLACE) - return TCConnSlice(*myConn, std::slice(GetConnDim()*theElemId, GetNbNodes(myGeom), 1)); - else - return TCConnSlice(*myConn, std::slice(theElemId, GetNbNodes(myGeom), GetConnDim())); -} - -TConnSlice -TCellInfo -::GetConnSlice(TInt theElemId) -{ - if(GetModeSwitch() == eFULL_INTERLACE) - return TConnSlice(*myConn, std::slice(GetConnDim()*theElemId, GetNbNodes(myGeom), 1)); - else - return TConnSlice(*myConn, std::slice(theElemId, GetNbNodes(myGeom), GetConnDim())); -} - - -//--------------------------------------------------------------- -TInt -TPolygoneInfo -::GetNbConn(TInt theElemId) const -{ - return (*myIndex)[theElemId + 1] - (*myIndex)[theElemId]; -} - -TCConnSlice -TPolygoneInfo -::GetConnSlice(TInt theElemId) const -{ - return TCConnSlice(*myConn, std::slice((*myIndex)[theElemId] - 1, GetNbConn(theElemId), 1)); -} - -TConnSlice -TPolygoneInfo -::GetConnSlice(TInt theElemId) -{ - return TConnSlice(*myConn, std::slice((*myIndex)[theElemId] - 1, GetNbConn(theElemId), 1)); -} - - -//--------------------------------------------------------------- -TInt -TPolyedreInfo -::GetNbFaces(TInt theElemId) const -{ - return (*myIndex)[theElemId+1] - (*myIndex)[theElemId]; -} - -TInt -TPolyedreInfo -::GetNbNodes(TInt theElemId) const -{ - TInt aNbNodes = 0; - TInt aNbFaces = GetNbFaces(theElemId); - TInt aStartFaceId = (*myIndex)[theElemId] - 1; - for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){ - TInt aCurrentId = (*myFaces)[aStartFaceId]; - TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId; - aNbNodes += aDiff; - } - return aNbNodes; -} - -TCConnSliceArr -TPolyedreInfo -::GetConnSliceArr(TInt theElemId) const -{ - TInt aNbFaces = GetNbFaces(theElemId); - TCConnSliceArr aConnSliceArr(aNbFaces); - TInt aStartFaceId = (*myIndex)[theElemId] - 1; - for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){ - TInt aCurrentId = (*myFaces)[aStartFaceId]; - TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId; - aConnSliceArr[aFaceId] = - TCConnSlice(*myConn, std::slice(aCurrentId - 1, aDiff, 1)); - } - return aConnSliceArr; -} - -TConnSliceArr -TPolyedreInfo -::GetConnSliceArr(TInt theElemId) -{ - TInt aNbFaces = GetNbFaces(theElemId); - TConnSliceArr aConnSliceArr(aNbFaces); - TInt aStartFaceId = (*myIndex)[theElemId] - 1; - for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){ - TInt aCurrentId = (*myFaces)[aStartFaceId]; - TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId; - aConnSliceArr[aFaceId] = - TConnSlice(*myConn, std::slice(aCurrentId - 1, aDiff, 1)); - } - return aConnSliceArr; -} - - -//--------------------------------------------------------------- -TMeshValueBase -::TMeshValueBase(): - myNbElem(0), - myNbComp(0), - myNbGauss(0), - myStep(0) -{} - -void -TMeshValueBase -::Allocate(TInt theNbElem, - TInt theNbGauss, - TInt theNbComp, - EModeSwitch theMode) -{ - myModeSwitch = theMode; - - myNbElem = theNbElem; - myNbGauss = theNbGauss; - myNbComp = theNbComp; - - myStep = theNbComp*theNbGauss; -} - -size_t -TMeshValueBase -::GetSize() const -{ - return myNbElem * myStep; -} - -size_t -TMeshValueBase -::GetNbVal() const -{ - return myNbElem * myNbGauss; -} - -size_t -TMeshValueBase -::GetNbGauss() const -{ - return myNbGauss; -} - -size_t -TMeshValueBase -::GetStep() const -{ - return myStep; -} - - -//--------------------------------------------------------------- -TInt -TProfileInfo -::GetElemNum(TInt theId) const -{ - return (*myElemNum)[theId]; -} - -void -TProfileInfo -::SetElemNum(TInt theId,TInt theVal) -{ - (*myElemNum)[theId] = theVal; -} - -//--------------------------------------------------------------- -bool -TGaussInfo::TLess -::operator()(const TKey& theLeft, const TKey& theRight) const -{ - EGeometrieElement aLGeom = boost::get<0>(theLeft); - EGeometrieElement aRGeom = boost::get<0>(theRight); - if(aLGeom != aRGeom) - return aLGeom < aRGeom; - - const std::string& aLStr = boost::get<1>(theLeft); - const std::string& aRStr = boost::get<1>(theRight); - return aLStr < aRStr; -} - -bool -TGaussInfo::TLess -::operator()(const TGaussInfo& theLeft, const TGaussInfo& theRight) const -{ - if(!&theLeft) - return true; - - if(!&theRight) - return false; - - if(theLeft.myGeom != theRight.myGeom) - return theLeft.myGeom < theRight.myGeom; - - if(theLeft.myRefCoord != theRight.myRefCoord) - return theLeft.myRefCoord < theRight.myRefCoord; - - return theLeft.myGaussCoord < theRight.myGaussCoord; -} - -TCCoordSlice -TGaussInfo -::GetRefCoordSlice(TInt theId) const -{ - if(GetModeSwitch() == eFULL_INTERLACE) - return TCCoordSlice(myRefCoord,std::slice(theId*GetDim(),GetDim(),1)); - else - return TCCoordSlice(myRefCoord,std::slice(theId,GetDim(),GetDim())); -} - -TCoordSlice -TGaussInfo -::GetRefCoordSlice(TInt theId) -{ - if(GetModeSwitch() == eFULL_INTERLACE) - return TCoordSlice(myRefCoord,std::slice(theId*GetDim(),GetDim(),1)); - else - return TCoordSlice(myRefCoord,std::slice(theId,GetDim(),GetDim())); -} - -TCCoordSlice -TGaussInfo -::GetGaussCoordSlice(TInt theId) const -{ - if(GetModeSwitch() == eFULL_INTERLACE) - return TCCoordSlice(myGaussCoord,std::slice(theId*GetDim(),GetDim(),1)); - else - return TCCoordSlice(myGaussCoord,std::slice(theId,GetDim(),GetDim())); -} - -TCoordSlice -TGaussInfo -::GetGaussCoordSlice(TInt theId) -{ - if(GetModeSwitch() == eFULL_INTERLACE) - return TCoordSlice(myGaussCoord,std::slice(theId*GetDim(),GetNbGauss(),1)); - else - return TCoordSlice(myGaussCoord,std::slice(theId,GetNbGauss(),GetDim())); -} - - -//--------------------------------------------------------------- -TInt -TTimeStampInfo -::GetNbGauss(EGeometrieElement theGeom) const -{ - TGeom2NbGauss::const_iterator anIter = myGeom2NbGauss.find(theGeom); - if(anIter == myGeom2NbGauss.end()) - return 1;//EXCEPTION(runtime_error,"TTimeStampInfo::GetNbGauss - myGeom2NbGauss.find(theGeom) fails"); - - return anIter->second; -} - - -//--------------------------------------------------------------- -// TGrilleInfo structure methods -//--------------------------------------------------------------- -const EGrilleType& -TGrilleInfo -::GetGrilleType() const -{ - return myGrilleType; -} - -EGrilleType -TGrilleInfo -::GetGrilleType() -{ - return myGrilleType; -} - -void -TGrilleInfo -::SetGrilleType(EGrilleType theGrilleType) -{ - myGrilleType = theGrilleType; -} - -const -TIndexes& -TGrilleInfo -::GetMapOfIndexes() const -{ - return myIndixes; -} - -TIndexes& -TGrilleInfo -::GetMapOfIndexes() -{ - return myIndixes; -} - -const -TFloatVector& -TGrilleInfo -::GetIndexes(TInt theAxisNumber) const -{ - TIndexes::const_iterator aIter=myIndixes.find(theAxisNumber); - if(aIter==myIndixes.end()) - EXCEPTION(std::runtime_error, "const TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber); fails"); - return aIter->second; -} - -TFloatVector& -TGrilleInfo -::GetIndexes(TInt theAxisNumber) -{ - TIndexes::iterator aIter=myIndixes.find(theAxisNumber); - if(aIter==myIndixes.end()) - EXCEPTION(std::runtime_error, "TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber="<second; -} - -TInt -TGrilleInfo -::GetNbIndexes(TInt theAxisNumber) -{ - const TFloatVector& aVector=GetIndexes(theAxisNumber); - return aVector.size(); -} - -TInt -TGrilleInfo -::GetNbNodes() -{ - TInt nbNodes=0; - TInt aDim = myMeshInfo->GetDim(); - for(int i=0;iGetGrilleStructure()[i]; - else - nbNodes = nbNodes*this->GetGrilleStructure()[i]; - - return nbNodes; -} - -TInt -TGrilleInfo -::GetNbCells() -{ - TInt nbCells=0; - TInt aDim = myMeshInfo->GetDim(); - for(int i=0;iGetGrilleStructure()[i]-1; - else - nbCells = nbCells*(this->GetGrilleStructure()[i]-1); - return nbCells; -} - -TInt -TGrilleInfo -::GetNbSubCells() -{ - TInt nb=0; - TInt aDim = myMeshInfo->GetDim(); - switch (aDim) { - case 3: - nb = - (myGrilleStructure[0] ) * (myGrilleStructure[1]-1) * (myGrilleStructure[2]-1) + - (myGrilleStructure[0]-1) * (myGrilleStructure[1] ) * (myGrilleStructure[2]-1) + - (myGrilleStructure[0]-1) * (myGrilleStructure[1]-1) * (myGrilleStructure[2] ); - break; - case 2: - nb = - (myGrilleStructure[0] ) * (myGrilleStructure[1]-1) + - (myGrilleStructure[0]-1) * (myGrilleStructure[1] ); - break; - } - return nb; -} - -EGeometrieElement -TGrilleInfo -::GetGeom() -{ - TInt aDim = myMeshInfo->GetDim(); - switch(aDim){ - case 1: - return eSEG2; - case 2: - return eQUAD4; - case 3: - return eHEXA8; - default: - return eNONE; - } -} - -EGeometrieElement -TGrilleInfo -::GetSubGeom() -{ - TInt aDim = myMeshInfo->GetDim(); - switch(aDim){ - case 2: - return eSEG2; - case 3: - return eQUAD4; - } - return eNONE; -} - -EEntiteMaillage -TGrilleInfo -::GetEntity() -{ - return eMAILLE; -} - -EEntiteMaillage -TGrilleInfo -::GetSubEntity() -{ - TInt aDim = myMeshInfo->GetDim(); - switch(aDim){ - case 2: - return eARETE; - case 3: - return eFACE; - } - return EEntiteMaillage(-1); -} - -const -TIntVector& -TGrilleInfo -::GetGrilleStructure() const -{ - return myGrilleStructure; -} - -TIntVector -TGrilleInfo -::GetGrilleStructure() -{ - return myGrilleStructure; -} - -void -TGrilleInfo -::SetGrilleStructure(TInt theAxis,TInt theNb) -{ - if(theAxis >= 0 && theAxis <=2 && theNb >= 0) - myGrilleStructure[theAxis]=theNb; -} - -const -TNodeCoord& -TGrilleInfo -::GetNodeCoord() const -{ - return myCoord; -} - -TNodeCoord& -TGrilleInfo -::GetNodeCoord() -{ - return myCoord; -} - -TNodeCoord -TGrilleInfo -::GetCoord(TInt theId) -{ - TNodeCoord aCoord; - TInt aDim = myMeshInfo->GetDim(); - TInt aNbNodes = this->GetNbNodes(); - aCoord.resize(aDim); - - if(theId >= aNbNodes) - EXCEPTION(std::runtime_error, "TGrilleInfo::GetCoord - theId out of range"); - - if(myGrilleType == eGRILLE_STANDARD){ - switch(aDim){ - case 3: - aCoord[2] = myCoord[aDim*theId+2]; - case 2: - aCoord[1] = myCoord[aDim*theId+1]; - case 1:{ - aCoord[0] = myCoord[aDim*theId]; - break; - } - } - } else { - - TFloatVector aVecX = this->GetIndexes(0); - TInt nbIndxX = this->GetNbIndexes(0); - - switch(aDim){ - case 1:{ - aCoord[0] = aVecX[theId]; - break; - } - case 2:{ - TFloatVector aVecY = this->GetIndexes(1); - TInt i,j,k; - i = j = k = 0; - i = theId % nbIndxX; - j = theId / nbIndxX; - if(myGrilleType == eGRILLE_CARTESIENNE){ - aCoord[0] = aVecX[i]; - aCoord[1] = aVecY[j]; - } else { // eGRILLE_POLAIRE (cylindrical) - aCoord[0] = aVecX[i] * cos(aVecY[j]); - aCoord[1] = aVecX[i] * sin(aVecY[j]); - } - break; - } - case 3:{ - TFloatVector aVecY = this->GetIndexes(1); - TInt nbIndxY = this->GetNbIndexes(1); - TFloatVector aVecZ = this->GetIndexes(2); - TInt i,j,k; - i = j = k = 0; - - i = theId % nbIndxX; - j = (theId / nbIndxX) % nbIndxY; - k = theId / (nbIndxX*nbIndxY); - - if(myGrilleType == eGRILLE_CARTESIENNE){ - aCoord[0] = aVecX[i]; - aCoord[1] = aVecY[j]; - aCoord[2] = aVecZ[k]; - } else { // eGRILLE_POLAIRE (cylindrical) - aCoord[0] = aVecX[i] * cos(aVecY[j]); - aCoord[1] = aVecX[i] * sin(aVecY[j]); - aCoord[2] = aVecZ[k]; - } - - break; - } - } - } - - return aCoord; -} - -TIntVector -TGrilleInfo -::GetConn(TInt theId, const bool isSub) -{ - TIntVector anIndexes; - TInt aDim = myMeshInfo->GetDim(); - - TInt idx; - TInt iMin, jMin, kMin, iMax, jMax, kMax; - TInt loc[3]; - - loc[0] = loc[1] = loc[2] = 0; - iMin = iMax = jMin = jMax = kMin = kMax = 0; - - switch(aDim) { - case 3: - { - TInt nbX = this->GetGrilleStructure()[0]; - TInt nbY = this->GetGrilleStructure()[1]; - TInt nbZ = this->GetGrilleStructure()[2]; - TInt d01 = nbX*nbY, dX = 1, dY = 1, dZ = 1; - if ( isSub ) - { - if ( theId < nbX * (nbY-1) * (nbZ-1)) - { // face is normal to X axis - dX = 0; - } - else if ( theId < nbX * (nbY-1) * (nbZ-1) + (nbX-1) * nbY * (nbZ-1)) - { // face is normal to Y axis - theId -= nbX * (nbY-1) * (nbZ-1); - dY = 0; - } - else - { - theId -= nbX * (nbY-1) * (nbZ-1) + (nbX-1) * nbY * (nbZ-1); - dZ = 0; - } - } - //else - { - iMin = theId % (nbX - dX); - jMin = (theId / (nbX - dX)) % (nbY - dY); - kMin = theId / ((nbX - dX) * (nbY - dY)); - iMax = iMin+dX; - jMax = jMin+dY; - kMax = kMin+dZ; - } - for (loc[2]=kMin; loc[2]<=kMax; loc[2]++) - for (loc[1]=jMin; loc[1]<=jMax; loc[1]++) - for (loc[0]=iMin; loc[0]<=iMax; loc[0]++) - { - idx = loc[0] + loc[1]*nbX + loc[2]*d01; - anIndexes.push_back(idx); - } - break; - } - case 2: - { - TInt nbX = this->GetGrilleStructure()[0]; - TInt nbY = this->GetGrilleStructure()[1]; - TInt dX = 1, dY = 1; - if ( isSub ) - { - if ( theId < nbX * (nbY-1)) - { // edge is normal to X axis - dX = 0; - } - else - { - theId -= nbX * (nbY-1); - dY = 0; - } - } - iMin = theId % (nbX-dX); - jMin = theId / (nbX-dX); - iMax = iMin+dX; - jMax = jMin+dY; - for (loc[1]=jMin; loc[1]<=jMax; loc[1]++) - for (loc[0]=iMin; loc[0]<=iMax; loc[0]++) - { - idx = loc[0] + loc[1]*nbX; - anIndexes.push_back(idx); - } - break; - } - case 1: - { - iMin = theId; - for (loc[0]=iMin; loc[0]<=iMin+1; loc[0]++) - { - idx = loc[0]; - anIndexes.push_back(idx); - } - break; - } - } - - return anIndexes; -} - -TInt -TGrilleInfo -::GetFamNumNode(TInt theId) const -{ - return myFamNumNode[theId]; -} - -void -TGrilleInfo -::SetFamNumNode(TInt theId,TInt theVal) -{ - myFamNumNode[theId] = theVal; -} - -TInt -TGrilleInfo -::GetFamNum(TInt theId) const -{ - return myFamNum[theId]; -} - -void -TGrilleInfo -::SetFamNum(TInt theId,TInt theVal) -{ - myFamNum[theId] = theVal; -} - -TInt -TGrilleInfo -::GetFamSubNum(TInt theId) const -{ - return myFamSubNum[theId]; -} - -void -TGrilleInfo -::SetFamSubNum(TInt theId,TInt theVal) -{ - myFamSubNum[theId] = theVal; -} diff --git a/src/MEDWrapper/Base/MED_Structures.hxx b/src/MEDWrapper/Base/MED_Structures.hxx deleted file mode 100644 index b6029949b..000000000 --- a/src/MEDWrapper/Base/MED_Structures.hxx +++ /dev/null @@ -1,1081 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#ifndef MED_Structures_HeaderFile -#define MED_Structures_HeaderFile - -#include "MED_Common.hxx" -#include "MED_Utilities.hxx" - -#ifdef WIN32 -#pragma warning(disable:4251) -#endif - -namespace MED -{ - - //--------------------------------------------------------------- - //! Defines a type for managing sequence of strings - typedef TVector TString; - typedef SharedPtr PString; - - //! Extract a substring from the sequence of the strings - MEDWRAPPER_EXPORT - std::string - GetString(TInt theId, TInt theStep, - const TString& theString); - - //! Set a substring in the sequence of the strings - MEDWRAPPER_EXPORT - void - SetString(TInt theId, TInt theStep, - TString& theString, - const std::string& theValue); - - //! Set a substring in the sequence of the strings - MEDWRAPPER_EXPORT - void - SetString(TInt theId, TInt theStep, - TString& theString, - const TString& theValue); - - //--------------------------------------------------------------- - //! Define a parent class for all MEDWrapper classes - struct MEDWRAPPER_EXPORT TBase - { - virtual ~TBase() {} - }; - - - //--------------------------------------------------------------- - //! Define a parent class for all named MED entities - struct MEDWRAPPER_EXPORT TNameInfo: virtual TBase - { - TString myName; //!< Keeps its name - virtual std::string GetName() const = 0; //!< Gets its name - virtual void SetName(const std::string& theValue) = 0; //!< Set a new name - virtual void SetName(const TString& theValue) = 0; //!< Set a new name - }; - - - //--------------------------------------------------------------- - //! Define a parent class for all MED entities that contains a sequence of numbers - /*! - It defines through corresponding enumeration (EModeSwitch) how the sequence - should be interpreted in C or Fortran mode (eFULL_INTERLACE or eNON_INTERLACE). - */ - struct MEDWRAPPER_EXPORT TModeSwitchInfo: virtual TBase - { - //! To construct instance of the class by default - TModeSwitchInfo(): - myModeSwitch(eFULL_INTERLACE) - {} - - //! To construct instance of the class - TModeSwitchInfo(EModeSwitch theModeSwitch): - myModeSwitch(theModeSwitch) - {} - - EModeSwitch myModeSwitch; //!< Keeps the - EModeSwitch GetModeSwitch() const { return myModeSwitch;} - }; - - - //--------------------------------------------------------------- - //! Define a base class which represents MED Mesh entity - struct MEDWRAPPER_EXPORT TMeshInfo: virtual TNameInfo - { - TInt myDim; //!< Dimension of the mesh (0, 1, 2 or 3) - TInt GetDim() const { return myDim;} //!< Gets dimension of the mesh - - TInt mySpaceDim; - TInt GetSpaceDim() const { return mySpaceDim; } - - EMaillage myType; //!< Type of the mesh - EMaillage GetType() const { return myType;} //!< Gets type of the mesh - - TString myDesc; //!< Description of the mesh - virtual std::string GetDesc() const = 0; //!< Get description for the mesh - virtual void SetDesc(const std::string& theValue) = 0; //!< Sets description for the mesh - - - }; - - - //--------------------------------------------------------------- - typedef TVector TIntVector; - typedef TSlice TIntVecSlice; - typedef TCSlice TCIntVecSlice; - - typedef TIntVector TFamAttr; - - //! Define a base class which represents MED Family entity - struct MEDWRAPPER_EXPORT TFamilyInfo: virtual TNameInfo - { - PMeshInfo myMeshInfo; //!< A reference to correspondig MED Mesh - //! Get a reference to corresponding MED Mesh - const PMeshInfo& GetMeshInfo() const { return myMeshInfo;} - - TInt myId; //!< An unique index of the MED FAMILY - TInt GetId() const { return myId;} //!< Gets number of the MED FAMILY - void SetId(TInt theId) { myId = theId;} //! Define number of the MED FAMILY - - TInt myNbGroup; //!< Defines number MED Groups connected to - //! Gets number of MED GROUPS the MED FAMILY is bound to - TInt GetNbGroup() const { return myNbGroup;} - - //! Contains sequence of the names for the MED Groups connected to - TString myGroupNames; - //! Gets name of a bound MED GROUP by its number - virtual std::string GetGroupName(TInt theId) const = 0; - //! Sets name of the defined MED GROUP by its number - virtual void SetGroupName(TInt theId, const std::string& theValue) = 0; - - TInt myNbAttr; //!< Defines number of the MED Family attributes - //! Gets number of attached attributes for the MED FAMILY - TInt GetNbAttr() const { return myNbAttr;} - - //! Defines sequence of the indexes of the MED Family attributes - TFamAttr myAttrId; - //! Get MED FAMILY attribute by its number - TInt GetAttrId(TInt theId) const; - //! Set MED FAMILY attribute by its number - void SetAttrId(TInt theId, TInt theVal); - - //! Defines sequence of the values of the MED Family attributes - TFamAttr myAttrVal; - //! Get MED FAMILY attribute by its number - TInt GetAttrVal(TInt theId) const; - //! Set MED FAMILY attribute by its number - void SetAttrVal(TInt theId, TInt theVal); - - //! Defines sequence of the names of the MED Family attributes - TString myAttrDesc; - //! Get value of the MED FAMILY attribute by its number - virtual std::string GetAttrDesc(TInt theId) const = 0; - //! Set value of the MED FAMILY attribute by its number - virtual void SetAttrDesc(TInt theId, const std::string& theValue) = 0; - }; - - - //--------------------------------------------------------------- - typedef TIntVector TElemNum; - typedef SharedPtr PElemNum; - - //! Define a parent class for all MED entities that describes mesh entites such as nodes and cells. - struct MEDWRAPPER_EXPORT TElemInfo: virtual TBase - { - PMeshInfo myMeshInfo; //!< A reference to correspondig MED Mesh - //! Get a reference to corresponding MED Mesh - const PMeshInfo& GetMeshInfo() const { return myMeshInfo;} - - TInt myNbElem; // TFloatVector; - typedef TSlice TFloatVecSlice; - typedef TCSlice TCFloatVecSlice; - - typedef TFloatVector TNodeCoord; - typedef SharedPtr PNodeCoord; - - typedef TFloatVecSlice TCoordSlice; - typedef TCFloatVecSlice TCCoordSlice; - - //! Define a base class which represents MED Nodes entity - struct MEDWRAPPER_EXPORT TNodeInfo: - virtual TElemInfo, - virtual TModeSwitchInfo - { - PNodeCoord myCoord; //!< Contains all nodal coordinates - - //! Gives coordinates for mesh node by its number (const version) - TCCoordSlice GetCoordSlice(TInt theId) const; - //! Gives coordinates for mesh node by its number - TCoordSlice GetCoordSlice(TInt theId); - - ERepere mySystem; //!< Defines, which coordinate system is used - //! Get which coordinate system is used for the node describing - ERepere GetSystem() const { return mySystem;} - //! Set coordinate system to be used for the node describing - void SetSystem(ERepere theSystem) { mySystem = theSystem;} - - TString myCoordNames; //!< Contains names for the coordinate dimensions - //! Get name of the coordinate dimension by its order number - virtual std::string GetCoordName(TInt theId) const = 0; - //! Set name of the coordinate dimension by its order number - virtual void SetCoordName(TInt theId, const std::string& theValue) = 0; - - TString myCoordUnits; //!< Contains units for the coordinate dimensions - //! Get name of unit for the coordinate dimension by its order number - virtual std::string GetCoordUnit(TInt theId) const = 0; - //! Set name of unit for the coordinate dimension by its order number - virtual void SetCoordUnit(TInt theId, const std::string& theValue) = 0; - }; - - - //--------------------------------------------------------------- - typedef TIntVecSlice TConnSlice; - typedef TCIntVecSlice TCConnSlice; - - //! Define a base class which represents MED Cells entity - struct MEDWRAPPER_EXPORT TCellInfo: - virtual TElemInfo, - virtual TModeSwitchInfo - { - EEntiteMaillage myEntity; //!< Defines the MED Entity where the mesh cells belongs to - //! Find out what MED ENTITY the cells belong to - EEntiteMaillage GetEntity() const { return myEntity;} - - EGeometrieElement myGeom; //!< Defines the MED Geometric type of the instance - //! Find out what MED geometrical type the cells belong to - EGeometrieElement GetGeom() const { return myGeom;} - - EConnectivite myConnMode; //!< Defines connectivity mode - //! Find out in what connectivity the cells are written - EConnectivite GetConnMode() const { return myConnMode;} - - virtual TInt GetConnDim() const = 0; //!< Gives step in the connectivity sequence - - PElemNum myConn; //!< Defines sequence which describe connectivity for each of mesh cell - - //! Gives connectivities for mesh cell by its number (const version) - TCConnSlice GetConnSlice(TInt theElemId) const; - //! Gives connectivities for mesh cell by its number - TConnSlice GetConnSlice(TInt theElemId); - }; - - //--------------------------------------------------------------- - //! Define a base class which represents MED Polygon entity - struct MEDWRAPPER_EXPORT TPolygoneInfo: - virtual TElemInfo - { - //! Defines the MED Entity where the polygons belongs to - EEntiteMaillage myEntity; // MED_FACE|MED_MAILLE - //! Find out what MED ENTITY the MED Polygons belong to - EEntiteMaillage GetEntity() const { return myEntity;} - - //! Defines the MED Geometric type of the instance - EGeometrieElement myGeom; // ePOLYGONE - //! Find out what MED geometrical type the MED Polygons belong to - EGeometrieElement GetGeom() const { return ePOLYGONE;} - - //! Defines connectivity mode - EConnectivite myConnMode; // eNOD|eDESC(eDESC not used) - //! Find out in what connectivity the cells are written - EConnectivite GetConnMode() const { return myConnMode;} - - PElemNum myConn; //!< Table de connectivities - PElemNum myIndex; //!< Table de indexes - - //! Gives number of the connectivities for the defined polygon - TInt GetNbConn(TInt theElemId) const; - - //! Gives connectivities for polygon by its number (const version) - TCConnSlice GetConnSlice(TInt theElemId) const; - //! Gives connectivities for polygon by its number - TConnSlice GetConnSlice(TInt theElemId); - }; - - //--------------------------------------------------------------- - //! Define a class representing MED_BALL structure element. - // - // This could be a generic class for any structure element - // holding any number of contant and variable attributes - // but it's too hard to implement - // - struct MEDWRAPPER_EXPORT TBallInfo: - virtual TCellInfo - { - TFloatVector myDiameters; - }; - - //--------------------------------------------------------------- - typedef TVector TCConnSliceArr; - typedef TVector TConnSliceArr; - - //! Define a base class which represents MED Polyedre entity - struct MEDWRAPPER_EXPORT TPolyedreInfo: - virtual TElemInfo - { - //! Defines the MED Entity where the polyedres belongs to - EEntiteMaillage myEntity; // MED_FACE|MED_MAILLE - //! Find out what MED ENTITY the MED Polyedres belong to - EEntiteMaillage GetEntity() const { return myEntity;} - - //! Defines the MED Geometric type of the instance - EGeometrieElement myGeom; // ePOLYEDRE - //! Find out what MED geometrical type the MED Polyedres belong to - EGeometrieElement GetGeom() const { return ePOLYEDRE;} - - //! Defines connectivity mode - EConnectivite myConnMode; // eNOD|eDESC(eDESC not used) - //! Find out in what connectivity the cells are written - EConnectivite GetConnMode() const { return myConnMode;} - - PElemNum myConn; //!< Table de connectivities - PElemNum myFaces; //!< Table de faces indexes - PElemNum myIndex; //!< Table de indexes - - //! Gives number of the faces for the defined polyedre (const version) - TInt GetNbFaces(TInt theElemId) const; - //! Gives number of the nodes for the defined polyedre - TInt GetNbNodes(TInt theElemId) const; - - //! Gives sequence of the face connectivities for polyedre by its number (const version) - TCConnSliceArr GetConnSliceArr(TInt theElemId) const; - //! Gives sequence of the face connectivities for polyedre by its number - TConnSliceArr GetConnSliceArr(TInt theElemId); - }; - - //--------------------------------------------------------------- - //! Define a base class which represents MED Field entity - struct MEDWRAPPER_EXPORT TFieldInfo: - virtual TNameInfo - { - PMeshInfo myMeshInfo; //!< A reference to corresponding MED Mesh - //! Get a reference to corresponding MED Mesh - const PMeshInfo& GetMeshInfo() const { return myMeshInfo;} - - ETypeChamp myType; //!< Defines type of MED Field - //! Find out what type of MED FIELD is used - ETypeChamp GetType() const { return myType;} - - TInt myNbComp; //!< Defines number of components stored in the field - //! Get number of components for MED FIELD - TInt GetNbComp() const { return myNbComp;} - - EBooleen myIsLocal; //!< Defines if the MED Field is local - //! Find out if MED FIELD is local or not - EBooleen GetIsLocal() const { return myIsLocal;} - - TInt myNbRef; //!< Defines number of references of the field - //! Find out number of references for the MED FIELD - TInt GetNbRef() const { return myNbRef;} - - TString myCompNames; //!< Contains names for each of MED Field components - //! Get name of the component by its order number - virtual std::string GetCompName(TInt theId) const = 0; - //! Set name for the component by its order number - virtual void SetCompName(TInt theId, const std::string& theValue) = 0; - - TString myUnitNames; //!< Contains units for each of MED Field components - //! Get unit of the component by its order number - virtual std::string GetUnitName(TInt theId) const = 0; - //! Set unit for the component by its order number - virtual void SetUnitName(TInt theId, const std::string& theValue) = 0; - - }; - - - //--------------------------------------------------------------- - //! Get dimension of the Gauss coordinates for the defined type of mesh cell - MEDWRAPPER_EXPORT - TInt - GetDimGaussCoord(EGeometrieElement theGeom); - - //! Get number of referenced nodes for the defined type of mesh cell - MEDWRAPPER_EXPORT - TInt - GetNbRefCoord(EGeometrieElement theGeom); - - typedef TFloatVector TWeight; - - //! The class represents MED Gauss entity - struct MEDWRAPPER_EXPORT TGaussInfo: - virtual TNameInfo, - virtual TModeSwitchInfo - { - typedef boost::tuple TKey; - typedef boost::tuple TInfo; - struct MEDWRAPPER_EXPORT TLess - { - bool - operator()(const TKey& theLeft, const TKey& theRight) const; - - bool - operator()(const TGaussInfo& theLeft, const TGaussInfo& theRight) const; - }; - - //! Defines, which geometrical type the MED Gauss entity belongs to - EGeometrieElement myGeom; - //! Find out what MED geometrical type the MED GAUSS entity belong to - EGeometrieElement GetGeom() const { return myGeom;} - - //! Contains coordinates for the refereced nodes - TNodeCoord myRefCoord; - - //! Gives coordinates for the referenced node by its number - TCCoordSlice GetRefCoordSlice(TInt theId) const; - //! Gives coordinates for the referenced node by its number - TCoordSlice GetRefCoordSlice(TInt theId); - - //! Contains coordinates for the Gauss points - TNodeCoord myGaussCoord; - - //! Gives coordinates for the Gauss points by its number - TCCoordSlice GetGaussCoordSlice(TInt theId) const; - //! Gives coordinates for the Gauss points by its number - TCoordSlice GetGaussCoordSlice(TInt theId); - - //! Contains wheights for the Gauss points - TWeight myWeight; - - //! Gives number of the referenced nodes - TInt GetNbRef() const { return GetNbRefCoord(GetGeom());} - - //! Gives dimension of the referenced nodes - TInt GetDim() const { return GetDimGaussCoord(GetGeom());} - - //! Gives number of the Gauss Points - TInt GetNbGauss() const { return (TInt)(myGaussCoord.size()/GetDim());} - }; - - - //--------------------------------------------------------------- - typedef std::map TGeom2Gauss; - typedef std::map TGeom2NbGauss; - - //! Define a base class which represents MED TimeStamp - struct MEDWRAPPER_EXPORT TTimeStampInfo: - virtual TBase - { - PFieldInfo myFieldInfo; //!< A reference to correspondig MED Field - //! Get a reference to corresponding MED Field - const PFieldInfo& GetFieldInfo() const { return myFieldInfo;} - - //! Defines the MED Entity where the MED TimeStamp belongs to - EEntiteMaillage myEntity; - //! Find out to what MED Entity the MED TimeStamp belong to - EEntiteMaillage GetEntity() const { return myEntity;} - - //! Keeps map of number of cells per geometric type where the MED TimeStamp belongs to - TGeom2Size myGeom2Size; - //! Get map of number of cells per geometric type where the MED TimeStamp belongs to - const TGeom2Size& GetGeom2Size() const { return myGeom2Size;} - - TGeom2NbGauss myGeom2NbGauss; //!< Keeps number of the Gauss Points for the MED TimeStamp - TInt GetNbGauss(EGeometrieElement theGeom) const; //!< Gives number of the Gauss Points for the MED TimeStamp - - TInt myNumDt; //!< Keeps number in time for the MED TimeStamp - TInt GetNumDt() const { return myNumDt;} //!< Defines number in time for the MED TimeStamp - - TInt myNumOrd; //!< Keeps number for the MED TimeStamp - TInt GetNumOrd() const { return myNumOrd;} //!< Defines number for the MED TimeStamp - - TFloat myDt; //!< Keeps time for the MED TimeStamp - TFloat GetDt() const { return myDt;} //!< Defines time for the MED TimeStamp - - //! Keeps map of MED Gauss entityes per geometric type - TGeom2Gauss myGeom2Gauss; - //! Gets a map of MED Gauss entityes per geometric type - const TGeom2Gauss& GetGeom2Gauss() const { return myGeom2Gauss;} - - TString myUnitDt; //!< Defines unit for the time for the MED TimeStamp - //! Get unit of time for the MED TimeStamp - virtual std::string GetUnitDt() const = 0; - //! Set unit of time for the MED TimeStamp - virtual void SetUnitDt(const std::string& theValue) = 0; - }; - - - //--------------------------------------------------------------- - //! The class represents MED Profile entity - struct MEDWRAPPER_EXPORT TProfileInfo: - virtual TNameInfo - { - typedef std::string TKey; - typedef boost::tuple TInfo; - - EModeProfil myMode; //!< Keeps mode for the MED Profile - //! Find out what mode of MED Profile is used - EModeProfil GetMode() const { return myMode;} - //! Set mode for the MED Profile - void SetMode(EModeProfil theMode) { myMode = theMode;} - - PElemNum myElemNum; //!< Keeps sequence of cell by its number which belong to the profile - //! Get number of mesh elelemts by its order number - TInt GetElemNum(TInt theId) const; - //! Set number of mesh elelemts by its order number - void SetElemNum(TInt theId, TInt theVal); - - //! Find out if the MED Profile defined - bool IsPresent() const { return GetName() != "";} - - //! Find out size of the MED Profile - TInt GetSize() const { return (TInt)myElemNum->size();} - }; - - - //--------------------------------------------------------------- - //! The class is a helper one. It provide safe and flexible way to get access to values for a MED TimeStamp - struct MEDWRAPPER_EXPORT TMeshValueBase: - virtual TModeSwitchInfo - { - TInt myNbElem; - TInt myNbComp; - TInt myNbGauss; - TInt myStep; - - TMeshValueBase(); - - //! Initialize the class - void - Allocate(TInt theNbElem, - TInt theNbGauss, - TInt theNbComp, - EModeSwitch theMode = eFULL_INTERLACE); - - //! Returns size of the value container - size_t - GetSize() const; - - //! Returns MED interpetation of the value size - size_t - GetNbVal() const; - - //! Returns number of Gauss Points bounded with the value - size_t - GetNbGauss() const; - - //! Returns step inside of the data array - size_t - GetStep() const; - - //! Returns bare pointer on the internal value representation - virtual - unsigned char* - GetValuePtr() = 0; - }; - - //--------------------------------------------------------------- - //! The class is a helper one. It provide safe and flexible way to get access to values for a MED TimeStamp - template - struct TTMeshValue: - virtual TMeshValueBase - { - typedef TValueType TValue; - typedef typename TValueType::value_type TElement; - - typedef TSlice TValueSlice; - typedef TCSlice TCValueSlice; - - typedef TVector TCValueSliceArr; - typedef TVector TValueSliceArr; - - TValue myValue; - - //! Initialize the class - void - Allocate(TInt theNbElem, - TInt theNbGauss, - TInt theNbComp, - EModeSwitch theMode = eFULL_INTERLACE) - { - TMeshValueBase::Allocate(theNbElem, theNbGauss, theNbComp, theMode); - myValue.resize(theNbElem * this->GetStep()); - } - - //! Returns bare pointer on the internal value representation - virtual - unsigned char* - GetValuePtr() - { - return (unsigned char*)&myValue[0]; - } - - //! Returns bare pointer on the internal value representation - virtual - TElement* - GetPointer() - { - return &myValue[0]; - } - - //! Returns bare pointer on the internal value representation - virtual - const TElement* - GetPointer() const - { - return &myValue[0]; - } - - //! Iteration through Gauss Points by their components - TCValueSliceArr - GetGaussValueSliceArr(TInt theElemId) const - { - TCValueSliceArr aValueSliceArr(myNbGauss); - if(GetModeSwitch() == eFULL_INTERLACE){ - TInt anId = theElemId * myStep; - for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ - aValueSliceArr[aGaussId] = - TCValueSlice(myValue, std::slice(anId, myNbComp, 1)); - anId += myNbComp; - } - } - else{ - for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ - aValueSliceArr[aGaussId] = - TCValueSlice(myValue, std::slice(theElemId, myNbComp, myStep)); - } - } - return aValueSliceArr; - } - - //! Iteration through Gauss Points by their components - TValueSliceArr - GetGaussValueSliceArr(TInt theElemId) - { - TValueSliceArr aValueSliceArr(myNbGauss); - if(GetModeSwitch() == eFULL_INTERLACE){ - TInt anId = theElemId*myStep; - for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ - aValueSliceArr[aGaussId] = - TValueSlice(myValue, std::slice(anId, myNbComp, 1)); - anId += myNbComp; - } - } - else{ - for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ - aValueSliceArr[aGaussId] = - TValueSlice(myValue, std::slice(theElemId, myNbComp, myStep)); - } - } - return aValueSliceArr; - } - - //! Iteration through components by corresponding Gauss Points - TCValueSliceArr - GetCompValueSliceArr(TInt theElemId) const - { - TCValueSliceArr aValueSliceArr(myNbComp); - if(GetModeSwitch() == eFULL_INTERLACE){ - TInt anId = theElemId*myStep; - for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){ - aValueSliceArr[aCompId] = - TCValueSlice(myValue, std::slice(anId, myNbGauss, myNbComp)); - anId += 1; - } - } - else{ - for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){ - aValueSliceArr[aCompId] = - TCValueSlice(myValue, std::slice(theElemId, myNbGauss, myStep)); - } - } - return aValueSliceArr; - } - - //! Iteration through components by corresponding Gauss Points - TValueSliceArr - GetCompValueSliceArr(TInt theElemId) - { - if(GetModeSwitch() == eFULL_INTERLACE){ - TValueSliceArr aValueSliceArr(myNbComp); - TInt anId = theElemId*myStep; - for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){ - aValueSliceArr[aCompId] = - TValueSlice(myValue, std::slice(anId, myNbGauss, myNbComp)); - anId += 1; - } - return aValueSliceArr; - } - else{ - TValueSliceArr aValueSliceArr(myNbGauss); - for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ - aValueSliceArr[aGaussId] = - TValueSlice(myValue,std::slice(theElemId, myNbComp, myStep)); - } - return aValueSliceArr; - } - } - }; - - typedef TTMeshValue TFloatMeshValue; - typedef TTMeshValue TIntMeshValue; - - //--------------------------------------------------------------- - // Backward compatibility declarations - typedef TFloatVector TValue; - typedef TSlice TValueSlice; - typedef TCSlice TCValueSlice; - - typedef TVector TCValueSliceArr; - typedef TVector TValueSliceArr; - - typedef TFloatMeshValue TMeshValue; - typedef std::map TGeom2Value; - - //--------------------------------------------------------------- - typedef std::map TGeom2Profile; - typedef std::set TGeom; - - //! The class is a base class for MED TimeStamp values holder - struct MEDWRAPPER_EXPORT TTimeStampValueBase: - virtual TModeSwitchInfo - { - //! A reference to correspondig MED TimeStamp - PTimeStampInfo myTimeStampInfo; - //!< Get a reference to correspondig MED TimeStamp - const PTimeStampInfo& GetTimeStampInfo() const { return myTimeStampInfo;} - - //! Keeps set of MED EGeometrieElement which contains values for the timestamp - TGeomSet myGeomSet; - const TGeomSet& GetGeomSet() const { return myGeomSet;} - - //! Keeps map of MED Profiles per geometric type - TGeom2Profile myGeom2Profile; - //! Gets a map of MED Profiles per geometric type - const TGeom2Profile& GetGeom2Profile() const { return myGeom2Profile;} - - //! Gets type of the champ - virtual - ETypeChamp - GetTypeChamp() const = 0; - - //! Allocates values for the given geometry - virtual - void - AllocateValue(EGeometrieElement theGeom, - TInt theNbElem, - TInt theNbGauss, - TInt theNbComp, - EModeSwitch theMode = eFULL_INTERLACE) = 0; - - virtual - size_t - GetValueSize(EGeometrieElement theGeom) const = 0; - - virtual - size_t - GetNbVal(EGeometrieElement theGeom) const = 0; - - virtual - size_t - GetNbGauss(EGeometrieElement theGeom) const = 0; - - virtual - unsigned char* - GetValuePtr(EGeometrieElement theGeom) = 0; - }; - - - //--------------------------------------------------------------- - //! The class implements a container for MED TimeStamp values - template - struct TTimeStampValue: - virtual TTimeStampValueBase - { - typedef TMeshValueType TTMeshValue; - typedef SharedPtr PTMeshValue; - typedef typename TMeshValueType::TElement TElement; - typedef std::map TTGeom2Value; - - ETypeChamp myTypeChamp; //second; - } - - //! Gets MED TimeStamp values for the given geometric type - PTMeshValue& - GetMeshValuePtr(EGeometrieElement theGeom) - { - myGeomSet.insert(theGeom); - if(myGeom2Value.find(theGeom) == myGeom2Value.end()){ - myGeom2Value[theGeom] = PTMeshValue(new TTMeshValue()); - return myGeom2Value[theGeom]; - } - return myGeom2Value[theGeom]; - } - - //! Gets MED TimeStamp values for the given geometric type (const version) - const TTMeshValue& - GetMeshValue(EGeometrieElement theGeom) const - { - return *(this->GetMeshValuePtr(theGeom)); - } - - //! Gets MED TimeStamp values for the given geometric type - TTMeshValue& - GetMeshValue(EGeometrieElement theGeom) - { - return *(this->GetMeshValuePtr(theGeom)); - } - }; - - - //--------------------------------------------------------------- - typedef TTimeStampValue TFloatTimeStampValue; - typedef SharedPtr PFloatTimeStampValue; - - PFloatTimeStampValue MEDWRAPPER_EXPORT - CastToFloatTimeStampValue(const PTimeStampValueBase& theTimeStampValue); - - typedef TTimeStampValue TIntTimeStampValue; - typedef SharedPtr PIntTimeStampValue; - - PIntTimeStampValue MEDWRAPPER_EXPORT - CastToIntTimeStampValue(const PTimeStampValueBase& theTimeStampValue); - - - //--------------------------------------------------------------- - template - void - CopyTimeStampValue(SharedPtr > theTimeStampValueFrom, - SharedPtr > theTimeStampValueTo) - { - typedef TTimeStampValue TimeStampValueTypeFrom; - typedef TTimeStampValue TimeStampValueTypeTo; - typedef typename TMeshValueTypeTo::TElement TElementTo; - - typename TimeStampValueTypeFrom::TTGeom2Value& aGeom2Value = theTimeStampValueFrom->myGeom2Value; - typename TimeStampValueTypeFrom::TTGeom2Value::const_iterator anIter = aGeom2Value.begin(); - for(; anIter != aGeom2Value.end(); anIter++){ - const EGeometrieElement& aGeom = anIter->first; - const typename TimeStampValueTypeFrom::TTMeshValue& aMeshValue = *anIter->second; - typename TimeStampValueTypeTo::TTMeshValue& aMeshValue2 = theTimeStampValueTo->GetMeshValue(aGeom); - aMeshValue2.Allocate(aMeshValue.myNbElem, - aMeshValue.myNbGauss, - aMeshValue.myNbComp, - aMeshValue.myModeSwitch); - const typename TimeStampValueTypeFrom::TTMeshValue::TValue& aValue = aMeshValue.myValue; - typename TimeStampValueTypeTo::TTMeshValue::TValue& aValue2 = aMeshValue2.myValue; - TInt aSize = aValue.size(); - for(TInt anId = 0; anId < aSize; anId++) - aValue2[anId] = TElementTo(aValue[anId]); - } - } - - template - void - CopyTimeStampValue(SharedPtr > theTimeStampValueFrom, - SharedPtr > theTimeStampValueTo) - { - typedef TTimeStampValue TimeStampValueType; - typename TimeStampValueType::TTGeom2Value& aGeom2Value = theTimeStampValueFrom->myGeom2Value; - typename TimeStampValueType::TTGeom2Value::const_iterator anIter = aGeom2Value.begin(); - for(; anIter != aGeom2Value.end(); anIter++){ - const EGeometrieElement& aGeom = anIter->first; - const typename TimeStampValueType::TTMeshValue& aMeshValue = *anIter->second; - typename TimeStampValueType::TTMeshValue& aMeshValue2 = theTimeStampValueTo->GetMeshValue(aGeom); - aMeshValue2 = aMeshValue; - } - } - - //--------------------------------------------------------------- - inline - void - CopyTimeStampValueBase(const PTimeStampValueBase& theValueFrom, - const PTimeStampValueBase& theValueTo) - { - if(theValueFrom->GetTypeChamp() == theValueTo->GetTypeChamp()){ - if(theValueFrom->GetTypeChamp() == eFLOAT64) - CopyTimeStampValue(theValueFrom, theValueTo); - else if(theValueFrom->GetTypeChamp() == eINT) - CopyTimeStampValue(theValueFrom, theValueTo); - }else{ - if(theValueFrom->GetTypeChamp() == eFLOAT64 && theValueTo->GetTypeChamp() == eINT) - CopyTimeStampValue(theValueFrom, theValueTo); - else if(theValueFrom->GetTypeChamp() == eINT && theValueTo->GetTypeChamp() == eFLOAT64) - CopyTimeStampValue(theValueFrom, theValueTo); - } - } - - - //--------------------------------------------------------------- - // Backward compatibility declarations - typedef TFloatTimeStampValue TTimeStampVal; - typedef PFloatTimeStampValue PTimeStampVal; - - //--------------------------------------------------------------- - typedef std::map TIndexes; - typedef std::map TNames; - - //! Define a base class which represents MED Grille (structured mesh) - struct MEDWRAPPER_EXPORT TGrilleInfo: - virtual TModeSwitchInfo - { - - PMeshInfo myMeshInfo; - const PMeshInfo& GetMeshInfo() const { return myMeshInfo;} - - TNodeCoord myCoord; //!< Contains all nodal coordinates, now used only for eGRILLE_STANDARD - //! Gives coordinates for mesh nodes (const version) - const TNodeCoord& GetNodeCoord() const; - TNodeCoord& GetNodeCoord(); - //! Gives coordinates for mesh node by its number, array index from 0 - TNodeCoord GetCoord(TInt theId); - //! Gives ids of nodes for mesh cell or sub-cell by its number, array index from 0 - TIntVector GetConn(TInt theId, const bool isSub=false); - - EGrilleType myGrilleType; //!< Defines grille type (eGRILLE_CARTESIENNE,eGRILLE_POLAIRE,eGRILLE_STANDARD) - //!Gets grille type (const version) - const EGrilleType& GetGrilleType() const; - //!Gets grille type - EGrilleType GetGrilleType(); - //!Sets grille type - void SetGrilleType(EGrilleType theGrilleType); - - - - TString myCoordNames; //!< Contains names for the coordinate dimensions - //! Get name of the coordinate dimension by its order number - virtual std::string GetCoordName(TInt theId) const = 0 ; - //! Set name of the coordinate dimension by its order number - virtual void SetCoordName(TInt theId, const std::string& theValue) = 0; - - TString myCoordUnits; //!< Contains units for the coordinate dimensions - //! Get name of unit for the coordinate dimension by its order number - virtual std::string GetCoordUnit(TInt theId) const = 0; - //! Set name of unit for the coordinate dimension by its order number - virtual void SetCoordUnit(TInt theId, const std::string& theValue) = 0; - - - //! Map of index of axes and Table of indexes for certain axe, now used for eGRILLE_CARTESIENNE and eGRILLE_POLAIRE - TIndexes myIndixes; - //!Gets a map of Tables (const version) - const TIndexes& GetMapOfIndexes() const ; - //!Gets a map of Tables - TIndexes& GetMapOfIndexes(); - //!Gets a Table of indexes for certain axe(const version) - const TFloatVector& GetIndexes(TInt theAxisNumber) const; - //!Gets a Table of indexes for certain axe - TFloatVector& GetIndexes(TInt theAxisNumber); - //!Gets a number of indices per axe - TInt GetNbIndexes(TInt theAxisNumber); - - TInt GetNbNodes();//! Return count of all points - TInt GetNbCells();//! Return count of all cells - TInt GetNbSubCells();//! Return count of all entities of - EGeometrieElement GetGeom();//! Return geometry of cells (calculated from mesh dimension) - EGeometrieElement GetSubGeom();//! Return geometry of subcells (calculated from mesh dimension) - EEntiteMaillage GetEntity();//! Return entity (eMAILLE) - EEntiteMaillage GetSubEntity();//! Return sub entity - - /*! - *Vector of grille structure (Example: {3,4,5}, 3 nodes in X axe, 4 nodes in Y axe, ...) - */ - TIntVector myGrilleStructure; - //!Gets grille structure(const version) - const TIntVector& GetGrilleStructure() const; - //!Gets grille structure - TIntVector GetGrilleStructure(); - //!Sets the grille structure of theAxis axe to theNb. - void SetGrilleStructure(TInt theAxis,TInt theNb); - - /*! - *Defines sequence MED Family indexes for corresponding mesh entites - */ - TElemNum myFamNum; - //! Get number of a MED FAMILY by order number of the mesh element - TInt GetFamNum(TInt theId) const; - //! Set number of a MED FAMILY for the mesh element with the order number - void SetFamNum(TInt theId, TInt theVal); - - /*! - *Defines sequence MED Family indexes for sub entites - */ - TElemNum myFamSubNum; - //! Get number of a MED FAMILY by order number of sub element - TInt GetFamSubNum(TInt theId) const; - //! Set number of a MED FAMILY for theId-th sub element - void SetFamSubNum(TInt theId, TInt theVal); - - /*! - *Defines sequence MED Family indexes for corresponding mesh nodes - */ - TElemNum myFamNumNode; - //! Get number of a MED FAMILY by order number of the mesh node - TInt GetFamNumNode(TInt theId) const; - //! Set number of a MED FAMILY for the mesh node with the order number - void SetFamNumNode(TInt theId, TInt theVal); - - }; - - -} - -#endif diff --git a/src/MEDWrapper/Base/MED_TStructures.hxx b/src/MEDWrapper/Base/MED_TStructures.hxx deleted file mode 100644 index b2475c8c0..000000000 --- a/src/MEDWrapper/Base/MED_TStructures.hxx +++ /dev/null @@ -1,1215 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#ifndef MED_TStructures_HeaderFile -#define MED_TStructures_HeaderFile - -#include "MED_Structures.hxx" - -#ifdef WIN32 -#pragma warning(disable:4250) -#endif - -namespace MED -{ - //--------------------------------------------------------------- - //! To provide a common way to handle values of MEDWrapper types as native MED types - template - struct TValueHolder - { - TValue& myValue; - TRepresentation myRepresentation; - - TValueHolder(TValue& theValue): - myValue(theValue), - myRepresentation(TRepresentation(theValue)) - {} - - ~TValueHolder() - { - myValue = TValue(myRepresentation); - } - - TRepresentation* - operator& () - { - return &myRepresentation; - } - - operator TRepresentation () const - { - return myRepresentation; - } - - const TValue& - operator() () const - { - return myValue; - } - }; - - //! To customize TValueHolder common template definition for TVector - template - struct TValueHolder, TRepresentation> - { - typedef TVector TValue; - TValue& myValue; - TRepresentation* myRepresentation; - - TValueHolder(TValue& theValue): - myValue(theValue) - { - if(theValue.empty()) - myRepresentation = (TRepresentation*)NULL; - else - myRepresentation = (TRepresentation*)&theValue[0]; - } - - TRepresentation* - operator& () - { - return myRepresentation; - } - }; - - //--------------------------------------------------------------- - template - struct TTNameInfo: virtual TNameInfo - { - TTNameInfo(const std::string& theValue) - { - myName.resize(GetNOMLength()+1); - SetName(theValue); - } - - virtual - std::string - GetName() const - { - return GetString(0, GetNOMLength(), myName); - } - - virtual - void - SetName(const std::string& theValue) - { - SetString(0, GetNOMLength(), myName, theValue); - } - - virtual - void - SetName(const TString& theValue) - { - SetString(0, GetNOMLength(), myName, theValue); - } - }; - - - //--------------------------------------------------------------- - template - struct TTMeshInfo: - virtual TMeshInfo, - virtual TTNameInfo - { - typedef TTNameInfo TNameInfoBase; - - TTMeshInfo(const PMeshInfo& theInfo): - TNameInfoBase(theInfo->GetName()) - { - myDim = theInfo->GetDim(); - mySpaceDim = theInfo->GetSpaceDim(); - myType = theInfo->GetType(); - - myDesc.resize(GetDESCLength()+1); - SetDesc(theInfo->GetDesc()); - } - - TTMeshInfo(TInt theDim, TInt theSpaceDim, - const std::string& theValue, - EMaillage theType, - const std::string& theDesc): - TNameInfoBase(theValue) - { - myDim = theDim; - mySpaceDim = theSpaceDim; - myType = theType; - - myDesc.resize(GetDESCLength()+1); - SetDesc(theDesc); - } - - virtual - std::string - GetDesc() const - { - return GetString(0, GetDESCLength(), myDesc); - } - - virtual - void - SetDesc(const std::string& theValue) - { - SetString(0, GetDESCLength(), myDesc, theValue); - } - }; - - - //--------------------------------------------------------------- - template - struct TTFamilyInfo: - virtual TFamilyInfo, - virtual TTNameInfo - { - typedef TTNameInfo TNameInfoBase; - - TTFamilyInfo(const PMeshInfo& theMeshInfo, const PFamilyInfo& theInfo): - TNameInfoBase(theInfo->GetName()) - { - myMeshInfo = theMeshInfo; - - myId = theInfo->GetId(); - - myNbGroup = theInfo->GetNbGroup(); - myGroupNames.resize(myNbGroup*GetLNOMLength()+1); - if(myNbGroup){ - for(TInt anId = 0; anId < myNbGroup; anId++){ - SetGroupName(anId,theInfo->GetGroupName(anId)); - } - } - - myNbAttr = theInfo->GetNbAttr(); - myAttrId.resize(myNbAttr); - myAttrVal.resize(myNbAttr); - myAttrDesc.resize(myNbAttr*GetDESCLength()+1); - if(myNbAttr){ - for(TInt anId = 0; anId < myNbAttr; anId++){ - SetAttrDesc(anId,theInfo->GetAttrDesc(anId)); - myAttrVal[anId] = theInfo->GetAttrVal(anId); - myAttrId[anId] = theInfo->GetAttrId(anId); - } - } - } - - TTFamilyInfo(const PMeshInfo& theMeshInfo, - TInt theNbGroup, - TInt theNbAttr, - TInt theId, - const std::string& theValue): - TNameInfoBase(theValue) - { - myMeshInfo = theMeshInfo; - - myId = theId; - - myNbGroup = theNbGroup; - myGroupNames.resize(theNbGroup*GetLNOMLength()+1); - - myNbAttr = theNbAttr; - myAttrId.resize(theNbAttr); - myAttrVal.resize(theNbAttr); - myAttrDesc.resize(theNbAttr*GetDESCLength()+1); - } - - TTFamilyInfo(const PMeshInfo& theMeshInfo, - const std::string& theValue, - TInt theId, - const TStringSet& theGroupNames, - const TStringVector& theAttrDescs, - const TIntVector& theAttrIds, - const TIntVector& theAttrVals): - TNameInfoBase(theValue) - { - myMeshInfo = theMeshInfo; - - myId = theId; - - myNbGroup = (TInt)theGroupNames.size(); - myGroupNames.resize(myNbGroup*GetLNOMLength()+1); - if(myNbGroup){ - TStringSet::const_iterator anIter = theGroupNames.begin(); - for(TInt anId = 0; anIter != theGroupNames.end(); anIter++, anId++){ - const std::string& aVal = *anIter; - SetGroupName(anId,aVal); - } - } - - myNbAttr = (TInt)theAttrDescs.size(); - myAttrId.resize(myNbAttr); - myAttrVal.resize(myNbAttr); - myAttrDesc.resize(myNbAttr*GetDESCLength()+1); - if(myNbAttr){ - for(TInt anId = 0, anEnd = (TInt)theAttrDescs.size(); anId < anEnd; anId++){ - SetAttrDesc(anId,theAttrDescs[anId]); - myAttrVal[anId] = theAttrVals[anId]; - myAttrId[anId] = theAttrIds[anId]; - } - } - } - - virtual - std::string - GetGroupName(TInt theId) const - { - return GetString(theId, GetLNOMLength(), myGroupNames); - } - - virtual - void - SetGroupName(TInt theId, const std::string& theValue) - { - SetString(theId, GetLNOMLength(), myGroupNames, theValue); - } - - virtual - std::string - GetAttrDesc(TInt theId) const - { - return GetString(theId, GetDESCLength(), myAttrDesc); - } - - virtual - void - SetAttrDesc(TInt theId, const std::string& theValue) - { - SetString(theId, GetDESCLength(), myAttrDesc, theValue); - } - }; - - - //--------------------------------------------------------------- - template - struct TTElemInfo: virtual TElemInfo - { - TTElemInfo(const PMeshInfo& theMeshInfo, const PElemInfo& theInfo) - { - myMeshInfo = theMeshInfo; - - myNbElem = theInfo->GetNbElem(); - myFamNum.reset(new TElemNum(myNbElem)); - myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum() - - myIsElemNum = theInfo->IsElemNum(); - if(theInfo->IsElemNum()) - myElemNum.reset(new TElemNum(myNbElem)); - else - myElemNum.reset(new TElemNum()); - - myIsElemNames = theInfo->IsElemNames(); - if(theInfo->IsElemNames()) - myElemNames.reset(new TString(myNbElem*GetPNOMLength() + 1)); - else - myElemNames.reset(new TString()); - - if(theInfo->GetNbElem()){ - for(TInt anId = 0; anId < myNbElem; anId++){ - SetFamNum(anId, theInfo->GetFamNum(anId)); - } - if(theInfo->IsElemNum() == eVRAI){ - for(TInt anId = 0; anId < myNbElem; anId++){ - SetElemNum(anId, theInfo->GetElemNum(anId)); - } - } - if(theInfo->IsElemNames() == eVRAI){ - for(TInt anId = 0; anId < myNbElem; anId++){ - SetElemName(anId,theInfo->GetElemName(anId)); - } - } - } - } - - TTElemInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - EBooleen theIsElemNum, - EBooleen theIsElemNames) - { - myMeshInfo = theMeshInfo; - - myNbElem = theNbElem; - myFamNum.reset(new TElemNum(theNbElem)); - myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum() - - myIsElemNum = theIsElemNum; - if(theIsElemNum) - myElemNum.reset(new TElemNum(theNbElem)); - else - myElemNum.reset(new TElemNum()); - - myIsElemNames = theIsElemNames; - if(theIsElemNames) - myElemNames.reset(new TString(theNbElem*GetPNOMLength() + 1)); - else - myElemNames.reset(new TString()); - } - - TTElemInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - const TIntVector& theFamilyNums, - const TIntVector& theElemNums, - const TStringVector& theElemNames) - { - myMeshInfo = theMeshInfo; - - myNbElem = theNbElem; - myFamNum.reset(new TElemNum(theNbElem)); - myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum() - - myIsElemNum = theElemNums.size()? eVRAI: eFAUX; - if(myIsElemNum) - myElemNum.reset(new TElemNum(theNbElem)); - else - myElemNum.reset(new TElemNum()); - - myIsElemNames = theElemNames.size()? eVRAI: eFAUX; - if(myIsElemNames) - myElemNames.reset(new TString(theNbElem*GetPNOMLength() + 1)); - else - myElemNames.reset(new TString()); - - if(theNbElem){ - - if(theFamilyNums.size()) - *myFamNum = theFamilyNums; - - if(myIsElemNum) - *myElemNum = theElemNums; - - if(myIsElemNames){ - for(TInt anId = 0; anId < theNbElem; anId++){ - const std::string& aVal = theElemNames[anId]; - SetElemName(anId,aVal); - } - } - } - } - - virtual - std::string - GetElemName(TInt theId) const - { - return GetString(theId,GetPNOMLength(), *myElemNames); - } - - virtual - void - SetElemName(TInt theId, const std::string& theValue) - { - SetString(theId,GetPNOMLength(), *myElemNames, theValue); - } - }; - - - //--------------------------------------------------------------- - template - struct TTNodeInfo: - virtual TNodeInfo, - virtual TTElemInfo - { - typedef TTElemInfo TElemInfoBase; - - TTNodeInfo(const PMeshInfo& theMeshInfo, const PNodeInfo& theInfo): - TNodeInfo(theInfo), - TElemInfoBase(theMeshInfo, theInfo) - { - myModeSwitch = theInfo->GetModeSwitch(); - - mySystem = theInfo->GetSystem(); - - myCoord.reset(new TNodeCoord(*theInfo->myCoord)); - - TInt aSpaceDim = theMeshInfo->GetSpaceDim(); - - myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); - for(TInt anId = 0; anId < aSpaceDim; anId++) - SetCoordName(anId,theInfo->GetCoordName(anId)); - - myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); - for(TInt anId = 0; anId < aSpaceDim; anId++) - SetCoordUnit(anId,theInfo->GetCoordUnit(anId)); - } - - TTNodeInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - EModeSwitch theMode, - ERepere theSystem, - EBooleen theIsElemNum, - EBooleen theIsElemNames): - TModeSwitchInfo(theMode), - TElemInfoBase(theMeshInfo, - theNbElem, - theIsElemNum, - theIsElemNames) - { - mySystem = theSystem; - - myCoord.reset(new TNodeCoord(theNbElem * theMeshInfo->mySpaceDim)); - - myCoordUnits.resize(theMeshInfo->mySpaceDim*GetPNOMLength()+1); - - myCoordNames.resize(theMeshInfo->mySpaceDim*GetPNOMLength()+1); - } - - - TTNodeInfo(const PMeshInfo& theMeshInfo, - const TFloatVector& theNodeCoords, - EModeSwitch theMode, - ERepere theSystem, - const TStringVector& theCoordNames, - const TStringVector& theCoordUnits, - const TIntVector& theFamilyNums, - const TIntVector& theElemNums, - const TStringVector& theElemNames): - TModeSwitchInfo(theMode), - TElemInfoBase(theMeshInfo, - (TInt)theNodeCoords.size()/theMeshInfo->GetDim(), - theFamilyNums, - theElemNums, - theElemNames) - { - mySystem = theSystem; - - myCoord.reset(new TNodeCoord(theNodeCoords)); - - TInt aSpaceDim = theMeshInfo->GetSpaceDim(); - - myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); - if(!theCoordNames.empty()) - for(TInt anId = 0; anId < aSpaceDim; anId++) - SetCoordName(anId,theCoordNames[anId]); - - myCoordUnits.resize(aSpaceDim*GetPNOMLength() + 1); - if(!theCoordUnits.empty()) - for(TInt anId = 0; anId < aSpaceDim; anId++) - SetCoordUnit(anId, theCoordUnits[anId]); - } - - virtual - std::string - GetCoordName(TInt theId) const - { - return GetString(theId,GetPNOMLength(),myCoordNames); - } - - virtual - void - SetCoordName(TInt theId, const std::string& theValue) - { - SetString(theId,GetPNOMLength(),myCoordNames,theValue); - } - - virtual - std::string - GetCoordUnit(TInt theId) const - { - return GetString(theId,GetPNOMLength(),myCoordUnits); - } - - virtual - void - SetCoordUnit(TInt theId, const std::string& theValue) - { - SetString(theId,GetPNOMLength(),myCoordUnits,theValue); - } - }; - - //--------------------------------------------------------------- - template - struct TTPolygoneInfo: - virtual TPolygoneInfo, - virtual TTElemInfo - { - typedef TTElemInfo TElemInfoBase; - - TTPolygoneInfo(const PMeshInfo& theMeshInfo, const PPolygoneInfo& theInfo): - TElemInfoBase(theMeshInfo,theInfo) - { - myEntity = theInfo->GetEntity(); - myGeom = theInfo->GetGeom(); - - myIndex.reset(new TElemNum(*theInfo->myIndex)); - myConn.reset(new TElemNum(*theInfo->myConn)); - - myConnMode = theInfo->GetConnMode(); - } - - TTPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - TInt theConnSize, - EConnectivite theConnMode, - EBooleen theIsElemNum, - EBooleen theIsElemNames): - TElemInfoBase(theMeshInfo, - theNbElem, - theIsElemNum, - theIsElemNames) - { - myEntity = theEntity; - myGeom = theGeom; - - myIndex.reset(new TElemNum(theNbElem + 1)); - myConn.reset(new TElemNum(theConnSize)); - - myConnMode = theConnMode; - } - - TTPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theIndexes, - const TIntVector& theConnectivities, - EConnectivite theConnMode, - const TIntVector& theFamilyNums, - const TIntVector& theElemNums, - const TStringVector& theElemNames): - TElemInfoBase(theMeshInfo, - (TInt)theIndexes.size() - 1, - theFamilyNums, - theElemNums, - theElemNames) - { - myEntity = theEntity; - myGeom = theGeom; - - myIndex.reset(new TElemNum(theIndexes)); - myConn.reset(new TElemNum(theConnectivities)); - - myConnMode = theConnMode; - } - }; - - //--------------------------------------------------------------- - template - struct TTPolyedreInfo: - virtual TPolyedreInfo, - virtual TTElemInfo - { - typedef TTElemInfo TElemInfoBase; - - TTPolyedreInfo(const PMeshInfo& theMeshInfo, const PPolyedreInfo& theInfo): - TElemInfoBase(theMeshInfo,theInfo) - { - myEntity = theInfo->GetEntity(); - myGeom = theInfo->GetGeom(); - - myIndex.reset(new TElemNum(*theInfo->myIndex)); - myFaces.reset(new TElemNum(*theInfo->myFaces)); - myConn.reset(new TElemNum(*theInfo->myConn)); - - myConnMode = theInfo->GetConnMode(); - } - - TTPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - TInt theNbFaces, - TInt theConnSize, - EConnectivite theConnMode, - EBooleen theIsElemNum, - EBooleen theIsElemNames): - TElemInfoBase(theMeshInfo, - theNbElem, - theIsElemNum, - theIsElemNames) - { - myEntity = theEntity; - myGeom = theGeom; - - myIndex.reset(new TElemNum(theNbElem + 1)); - myFaces.reset(new TElemNum(theNbFaces)); - myConn.reset(new TElemNum(theConnSize)); - - myConnMode = theConnMode; - } - - TTPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theIndexes, - const TIntVector& theFaces, - const TIntVector& theConnectivities, - EConnectivite theConnMode, - const TIntVector& theFamilyNums, - const TIntVector& theElemNums, - const TStringVector& theElemNames): - TElemInfoBase(theMeshInfo, - (TInt)theIndexes.size()-1, - theFamilyNums, - theElemNums, - theElemNames) - { - myEntity = theEntity; - myGeom = theGeom; - - myIndex.reset(new TElemNum(theIndexes)); - myFaces.reset(new TElemNum(theFaces)); - myConn.reset(new TElemNum(theConnectivities)); - - myConnMode = theConnMode; - } - }; - - //--------------------------------------------------------------- - template - struct TTCellInfo: - virtual TCellInfo, - virtual TTElemInfo - { - typedef TTElemInfo TElemInfoBase; - - TTCellInfo(const PMeshInfo& theMeshInfo, const PCellInfo& theInfo): - TElemInfoBase(theMeshInfo,theInfo) - { - myEntity = theInfo->GetEntity(); - myGeom = theInfo->GetGeom(); - myConnMode = theInfo->GetConnMode(); - - TInt aConnDim = GetNbNodes(myGeom); - TInt aNbConn = GetNbConn(myGeom, myEntity, myMeshInfo->myDim); - myConn.reset(new TElemNum(myNbElem * aNbConn)); - for(TInt anElemId = 0; anElemId < myNbElem; anElemId++){ - TConnSlice aConnSlice = GetConnSlice(anElemId); - TCConnSlice aConnSlice2 = theInfo->GetConnSlice(anElemId); - for(TInt anConnId = 0; anConnId < aConnDim; anConnId++){ - aConnSlice[anConnId] = aConnSlice2[anConnId]; - } - } - } - - TTCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - EConnectivite theConnMode, - EBooleen theIsElemNum, - EBooleen theIsElemNames, - EModeSwitch theMode): - TModeSwitchInfo(theMode), - TElemInfoBase(theMeshInfo, - theNbElem, - theIsElemNum, - theIsElemNames) - { - myEntity = theEntity; - myGeom = theGeom; - - myConnMode = theConnMode; - TInt aNbConn = GetNbConn(theGeom, myEntity, theMeshInfo->myDim); - myConn.reset(new TElemNum(theNbElem * aNbConn)); - } - - TTCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theConnectivities, - EConnectivite theConnMode, - const TIntVector& theFamilyNums, - const TIntVector& theElemNums, - const TStringVector& theElemNames, - EModeSwitch theMode): - TModeSwitchInfo(theMode), - TElemInfoBase(theMeshInfo, - (TInt)theConnectivities.size() / GetNbNodes(theGeom), - theFamilyNums, - theElemNums, - theElemNames) - { - myEntity = theEntity; - myGeom = theGeom; - - myConnMode = theConnMode; - TInt aConnDim = GetNbNodes(myGeom); - TInt aNbConn = GetNbConn(myGeom, myEntity, myMeshInfo->myDim); - myConn.reset(new TElemNum(myNbElem * aNbConn)); - for(TInt anElemId = 0; anElemId < myNbElem; anElemId++){ - TConnSlice aConnSlice = GetConnSlice(anElemId); - for(TInt anConnId = 0; anConnId < aConnDim; anConnId++){ - aConnSlice[anConnId] = theConnectivities[anElemId*aConnDim + anConnId]; - } - } - } - - virtual - TInt - GetConnDim() const - { - return GetNbConn(myGeom, myEntity, myMeshInfo->myDim); - } - - }; - - //--------------------------------------------------------------- - template - struct TTBallInfo: - virtual TBallInfo, - virtual TTCellInfo - { - typedef TTCellInfo TCellInfoBase; - - TTBallInfo(const PMeshInfo& theMeshInfo, const PBallInfo& theInfo): - TCellInfoBase::TElemInfoBase(theMeshInfo, theInfo), - TCellInfoBase(theMeshInfo,theInfo) - { - myDiameters = theInfo->myDiameters; - } - - TTBallInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - EBooleen theIsElemNum ): - TCellInfoBase::TElemInfoBase(theMeshInfo, - theNbElem, - theIsElemNum, - /*theIsElemNames=*/eFAUX), - TCellInfoBase(theMeshInfo, - eSTRUCT_ELEMENT, - eBALL, - theNbElem, - /*EConnectivite=*/eNOD, - theIsElemNum, - /*theIsElemNames=*/eFAUX, - eFULL_INTERLACE) - { - myDiameters.resize( theNbElem ); - } - - TTBallInfo(const PMeshInfo& theMeshInfo, - const TIntVector& theNodes, - TFloatVector& theDiameters, - const TIntVector& theFamilyNums, - const TIntVector& theElemNums): - TCellInfoBase::TElemInfoBase(theMeshInfo, - (TInt)std::max(theNodes.size(),theDiameters.size() ), - theFamilyNums, - theElemNums, - TStringVector()), - TCellInfoBase(theMeshInfo, - eSTRUCT_ELEMENT, - eBALL, - theNodes, - /*EConnectivite=*/eNOD, - theFamilyNums, - theElemNums, - TStringVector(), - eFULL_INTERLACE) - { - myDiameters.swap( theDiameters ); - } - }; - - //--------------------------------------------------------------- - template - struct TTFieldInfo: - virtual TFieldInfo, - virtual TTNameInfo - { - typedef TTNameInfo TNameInfoBase; - - TTFieldInfo(const PMeshInfo& theMeshInfo, const PFieldInfo& theInfo): - TNameInfoBase(theInfo->GetName()) - { - myMeshInfo = theMeshInfo; - - myNbComp = theInfo->GetNbComp(); - myCompNames.resize(myNbComp*GetPNOMLength()+1); - for(TInt anId = 0; anId < myNbComp; anId++){ - SetCompName(anId,theInfo->GetCompName(anId)); - } - - myUnitNames.resize(myNbComp*GetPNOMLength()+1); - for(TInt anId = 0; anId < myNbComp; anId++){ - SetUnitName(anId,theInfo->GetUnitName(anId)); - } - - myType = theInfo->GetType(); - - myIsLocal = theInfo->GetIsLocal(); - myNbRef = theInfo->GetNbRef(); - } - - TTFieldInfo(const PMeshInfo& theMeshInfo, - TInt theNbComp, - ETypeChamp theType, - const std::string& theValue, - EBooleen theIsLocal, - TInt theNbRef): - TNameInfoBase(theValue) - { - myMeshInfo = theMeshInfo; - - myNbComp = theNbComp; - myCompNames.resize(theNbComp*GetPNOMLength()+1); - myUnitNames.resize(theNbComp*GetPNOMLength()+1); - - myType = theType; - - myIsLocal = theIsLocal; - myNbRef = theNbRef; - } - - virtual - std::string - GetCompName(TInt theId) const - { - return GetString(theId,GetPNOMLength(),myCompNames); - } - - virtual - void - SetCompName(TInt theId, const std::string& theValue) - { - SetString(theId,GetPNOMLength(),myCompNames,theValue); - } - - virtual - std::string - GetUnitName(TInt theId) const - { - return GetString(theId,GetPNOMLength(),myUnitNames); - } - - virtual - void - SetUnitName(TInt theId, const std::string& theValue) - { - SetString(theId,GetPNOMLength(),myUnitNames,theValue); - } - }; - - - //--------------------------------------------------------------- - template - struct TTGaussInfo: - virtual TGaussInfo, - virtual TTNameInfo - { - typedef TTNameInfo TNameInfoBase; - - TTGaussInfo(const TGaussInfo::TInfo& theInfo, - EModeSwitch theMode): - TModeSwitchInfo(theMode), - TNameInfoBase(boost::get<1>(boost::get<0>(theInfo))) - { - const TGaussInfo::TKey& aKey = boost::get<0>(theInfo); - - myGeom = boost::get<0>(aKey); - myRefCoord.resize(GetNbRef()*GetDim()); - - TInt aNbGauss = boost::get<1>(theInfo); - myGaussCoord.resize(aNbGauss*GetDim()); - myWeight.resize(aNbGauss); - } - }; - - - //--------------------------------------------------------------- - template - struct TTTimeStampInfo: virtual TTimeStampInfo - { - TTTimeStampInfo(const PFieldInfo& theFieldInfo, const PTimeStampInfo& theInfo) - { - myFieldInfo = theFieldInfo; - - myEntity = theInfo->GetEntity(); - myGeom2Size = theInfo->GetGeom2Size(); - - myNumDt = theInfo->GetNumDt(); - myNumOrd = theInfo->GetNumOrd(); - myDt = theInfo->GetDt(); - - myUnitDt.resize(GetPNOMLength()+1); - SetUnitDt(theInfo->GetUnitDt()); - - myGeom2NbGauss = theInfo->myGeom2NbGauss; - myGeom2Gauss = theInfo->GetGeom2Gauss(); - } - - TTTimeStampInfo(const PFieldInfo& theFieldInfo, - EEntiteMaillage theEntity, - const TGeom2Size& theGeom2Size, - const TGeom2NbGauss& theGeom2NbGauss, - TInt theNumDt, - TInt theNumOrd, - TFloat theDt, - const std::string& theUnitDt, - const TGeom2Gauss& theGeom2Gauss) - { - myFieldInfo = theFieldInfo; - - myEntity = theEntity; - myGeom2Size = theGeom2Size; - - myNumDt = theNumDt; - myNumOrd = theNumDt; - myDt = theDt; - - myUnitDt.resize(GetPNOMLength()+1); - SetUnitDt(theUnitDt); - - myGeom2NbGauss = theGeom2NbGauss; - myGeom2Gauss = theGeom2Gauss; - } - - virtual - std::string - GetUnitDt() const - { - return GetString(0,GetPNOMLength(),myUnitDt); - } - - virtual - void - SetUnitDt(const std::string& theValue) - { - SetString(0,GetPNOMLength(),myUnitDt,theValue); - } - }; - - - //--------------------------------------------------------------- - template - struct TTProfileInfo: - virtual TProfileInfo, - virtual TTNameInfo - { - typedef TTNameInfo TNameInfoBase; - - TTProfileInfo(const TProfileInfo::TInfo& theInfo, - EModeProfil theMode): - TNameInfoBase(boost::get<0>(theInfo)) - { - TInt aSize = boost::get<1>(theInfo); - myElemNum.reset(new TElemNum(aSize)); - myMode = aSize > 0? theMode: eNO_PFLMOD; - } - }; - - - //--------------------------------------------------------------- - template - struct TTTimeStampValue: virtual TTimeStampValue - { - TTTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - const PTimeStampValueBase& theInfo, - ETypeChamp theTypeChamp) - { - typedef TTimeStampValue TCompatible; - if(TCompatible* aCompatible = dynamic_cast(theInfo.get())){ - this->myTimeStampInfo = theTimeStampInfo; - this->myTypeChamp = theTypeChamp; - this->myGeom2Profile = aCompatible->GetGeom2Profile(); - this->myGeom2Value = aCompatible->myGeom2Value; - this->myGeomSet = aCompatible->GetGeomSet(); - }else - EXCEPTION(std::runtime_error,"TTTimeStampValue::TTTimeStampValue - use incompatible arguments!"); - } - - TTTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - ETypeChamp theTypeChamp, - const TGeom2Profile& theGeom2Profile, - EModeSwitch theMode): - TModeSwitchInfo(theMode) - { - this->myTimeStampInfo = theTimeStampInfo; - - this->myTypeChamp = theTypeChamp; - - this->myGeom2Profile = theGeom2Profile; - - TInt aNbComp = theTimeStampInfo->myFieldInfo->myNbComp; - - const TGeom2Size& aGeom2Size = theTimeStampInfo->GetGeom2Size(); - TGeom2Size::const_iterator anIter = aGeom2Size.begin(); - for(; anIter != aGeom2Size.end(); anIter++){ - const EGeometrieElement& aGeom = anIter->first; - TInt aNbElem = anIter->second; - - MED::PProfileInfo aProfileInfo; - MED::TGeom2Profile::const_iterator anIter = theGeom2Profile.find(aGeom); - if(anIter != theGeom2Profile.end()) - aProfileInfo = anIter->second; - - if(aProfileInfo && aProfileInfo->IsPresent()) - aNbElem = aProfileInfo->GetSize(); - - TInt aNbGauss = theTimeStampInfo->GetNbGauss(aGeom); - - this->GetMeshValue(aGeom).Allocate(aNbElem,aNbGauss,aNbComp); - } - } - - virtual - size_t - GetValueSize(EGeometrieElement theGeom) const - { - return this->GetMeshValue(theGeom).GetSize(); - } - - virtual - size_t - GetNbVal(EGeometrieElement theGeom) const - { - return this->GetMeshValue(theGeom).GetNbVal(); - } - - virtual - size_t - GetNbGauss(EGeometrieElement theGeom) const - { - return this->GetMeshValue(theGeom).GetNbGauss(); - } - - virtual - void - AllocateValue(EGeometrieElement theGeom, - TInt theNbElem, - TInt theNbGauss, - TInt theNbComp, - EModeSwitch theMode = eFULL_INTERLACE) - { - this->GetMeshValue(theGeom).Allocate(theNbElem,theNbGauss,theNbComp,theMode); - } - - virtual - unsigned char* - GetValuePtr(EGeometrieElement theGeom) - { - return this->GetMeshValue(theGeom).GetValuePtr(); - } - }; - - //--------------------------------------------------------------- - template - struct TTGrilleInfo: - virtual TGrilleInfo - { - TTGrilleInfo(const PMeshInfo& theMeshInfo, - const PGrilleInfo& theInfo) - { - myMeshInfo = theMeshInfo; - - myCoord = theInfo->GetNodeCoord(); - - myGrilleType = theInfo->GetGrilleType(); - - myCoordNames = theInfo->myCoordNames; - - myCoordUnits = theInfo->myCoordUnits; - - myIndixes = theInfo->GetMapOfIndexes(); - - myGrilleStructure = theInfo->GetGrilleStructure(); - - myGrilleType = theInfo->GetGrilleType(); - - myFamNumNode.resize(theInfo->GetNbNodes()); - myFamNumNode = theInfo->myFamNumNode; - - myFamNum = theInfo->myFamNum; - } - - TTGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type, - const TInt nnoeuds) - { - myMeshInfo = theMeshInfo; - TInt aSpaceDim = theMeshInfo->GetSpaceDim(); - if(type == eGRILLE_STANDARD){ - myCoord.resize(aSpaceDim*nnoeuds); - myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); - myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); - } else { //if(type == eGRILLE_CARTESIENNE){ - myCoordNames.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); - myCoordUnits.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); - } - myGrilleStructure.resize(aSpaceDim); - myFamNumNode.resize(nnoeuds); - } - - TTGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type) - { - myMeshInfo = theMeshInfo; - TInt aSpaceDim = theMeshInfo->GetSpaceDim(); - if(type == eGRILLE_STANDARD){ - myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); - myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); - } else {// if(type == eGRILLE_CARTESIENNE){ - myCoordNames.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); - myCoordUnits.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); - } - myGrilleStructure.resize(aSpaceDim); - } - - TTGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type, - const MED::TIntVector& nbNodeVec) - { - myMeshInfo = theMeshInfo; - - TInt aSpaceDim = theMeshInfo->GetSpaceDim(); - if(type == eGRILLE_STANDARD){ - myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); - myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); - } else {// if(type == eGRILLE_CARTESIENNE){ - myCoordNames.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); - myCoordUnits.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); - } - - if(type != eGRILLE_STANDARD) - for(unsigned int aAxe=0;aAxe(),myCoordNames); - } - - virtual - void - SetCoordName(TInt theId, const std::string& theValue) - { - SetString(theId,GetPNOMLength(),myCoordNames,theValue); - } - - virtual - std::string - GetCoordUnit(TInt theId) const - { - return GetString(theId,GetPNOMLength(),myCoordUnits); - } - - virtual - void - SetCoordUnit(TInt theId, const std::string& theValue) - { - SetString(theId,GetPNOMLength(),myCoordUnits,theValue); - } - - }; -} - -#endif diff --git a/src/MEDWrapper/Base/MED_TWrapper.hxx b/src/MEDWrapper/Base/MED_TWrapper.hxx deleted file mode 100644 index 4a719be3b..000000000 --- a/src/MEDWrapper/Base/MED_TWrapper.hxx +++ /dev/null @@ -1,578 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#ifndef MED_TWrapper_HeaderFile -#define MED_TWrapper_HeaderFile - -#include "MED_TStructures.hxx" -#include "MED_Wrapper.hxx" - -namespace MED -{ - - template - class TTWrapper: public TWrapper - { - public: - //---------------------------------------------------------------------------- - //! Gets version of the MED library used for the MED file - virtual - EVersion - GetVersion() - { - return eVersion; - } - - //---------------------------------------------------------------------------- - virtual - PMeshInfo - CrMeshInfo(TInt theDim = 0, TInt theSpaceDim = 0, - const std::string& theValue = "", - EMaillage theType = eNON_STRUCTURE, - const std::string& theDesc = "") - { - return PMeshInfo(new TTMeshInfo - (theDim, - theSpaceDim, - theValue, - theType, - theDesc)); - } - - virtual - PMeshInfo - CrMeshInfo(const PMeshInfo& theInfo) - { - return PMeshInfo(new TTMeshInfo(theInfo)); - } - - - //---------------------------------------------------------------------------- - virtual - PFamilyInfo - CrFamilyInfo(const PMeshInfo& theMeshInfo, - TInt theNbGroup = 0, - TInt theNbAttr = 0, - TInt theId = 0, - const std::string& theValue = "") - { - return PFamilyInfo(new TTFamilyInfo - (theMeshInfo, - theNbGroup, - theNbAttr, - theId, - theValue)); - } - - virtual - PFamilyInfo - CrFamilyInfo(const PMeshInfo& theMeshInfo, - const std::string& theValue, - TInt theId, - const MED::TStringSet& theGroupNames, - const MED::TStringVector& theAttrDescs = MED::TStringVector(), - const MED::TIntVector& theAttrIds = MED::TIntVector(), - const MED::TIntVector& theAttrVals = MED::TIntVector()) - { - return PFamilyInfo(new TTFamilyInfo - (theMeshInfo, - theValue, - theId, - theGroupNames, - theAttrDescs, - theAttrIds, - theAttrVals)); - } - - virtual - PFamilyInfo - CrFamilyInfo(const PMeshInfo& theMeshInfo, - const PFamilyInfo& theInfo) - { - return PFamilyInfo(new TTFamilyInfo - (theMeshInfo, - theInfo)); - } - - //---------------------------------------------------------------------------- - virtual - PElemInfo - CrElemInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) - { - return PElemInfo(new TTElemInfo - (theMeshInfo, - theNbElem, - theIsElemNum, - theIsElemNames)); - } - - virtual - PElemInfo - CrElemInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - const TIntVector& theFamNum, - const TIntVector& aElemNum, - const TStringVector& aElemNames) - { - return PElemInfo(new TTElemInfo - (theMeshInfo, - theNbElem, - theFamNum, - aElemNum, - aElemNames)); - } - - //---------------------------------------------------------------------------- - virtual - PNodeInfo - CrNodeInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - EModeSwitch theMode = eFULL_INTERLACE, - ERepere theSystem = eCART, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) - { - return PNodeInfo(new TTNodeInfo - (theMeshInfo, - theNbElem, - theMode, - theSystem, - theIsElemNum, - theIsElemNames)); - } - - virtual - PNodeInfo - CrNodeInfo(const PMeshInfo& theMeshInfo, - const TFloatVector& theNodeCoords, - EModeSwitch theMode = eFULL_INTERLACE, - ERepere theSystem = eCART, - const TStringVector& theCoordNames = TStringVector(), - const TStringVector& theCoordUnits = TStringVector(), - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector()) - { - return PNodeInfo(new TTNodeInfo - (theMeshInfo, - theNodeCoords, - theMode, - theSystem, - theCoordNames, - theCoordUnits, - theFamilyNums, - theElemNums, - theElemNames)); - } - - virtual - PNodeInfo - CrNodeInfo(const PMeshInfo& theMeshInfo, - const PNodeInfo& theInfo) - { - return PNodeInfo(new TTNodeInfo - (theMeshInfo, - theInfo)); - } - - //---------------------------------------------------------------------------- - virtual - PPolygoneInfo - CrPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - TInt theConnSize, - EConnectivite theConnMode = eNOD, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) - { - return PPolygoneInfo(new TTPolygoneInfo - (theMeshInfo, - theEntity, - theGeom, - theNbElem, - theConnSize, - theConnMode, - theIsElemNum, - theIsElemNames)); - } - - virtual - PPolygoneInfo - CrPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theIndexes, - const TIntVector& theConnectivities, - EConnectivite theConnMode = eNOD, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector()) - { - return PPolygoneInfo(new TTPolygoneInfo - (theMeshInfo, - theEntity, - theGeom, - theIndexes, - theConnectivities, - theConnMode, - theFamilyNums, - theElemNums, - theElemNames)); - } - - virtual - PPolygoneInfo - CrPolygoneInfo(const PMeshInfo& theMeshInfo, - const PPolygoneInfo& theInfo) - { - return PPolygoneInfo(new TTPolygoneInfo - (theMeshInfo, - theInfo)); - } - - //---------------------------------------------------------------------------- - virtual - PPolyedreInfo - CrPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - TInt theNbFaces, - TInt theConnSize, - EConnectivite theConnMode = eNOD, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) - { - return PPolyedreInfo(new TTPolyedreInfo - (theMeshInfo, - theEntity, - theGeom, - theNbElem, - theNbFaces, - theConnSize, - theConnMode, - theIsElemNum, - theIsElemNames)); - } - - virtual - PPolyedreInfo - CrPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theIndexes, - const TIntVector& theFaces, - const TIntVector& theConnectivities, - EConnectivite theConnMode = eNOD, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector()) - { - return PPolyedreInfo(new TTPolyedreInfo - (theMeshInfo, - theEntity, - theGeom, - theIndexes, - theFaces, - theConnectivities, - theConnMode, - theFamilyNums, - theElemNums, - theElemNames)); - } - - virtual - PPolyedreInfo - CrPolyedreInfo(const PMeshInfo& theMeshInfo, - const PPolyedreInfo& theInfo) - { - return PPolyedreInfo(new TTPolyedreInfo - (theMeshInfo, - theInfo)); - } - - //---------------------------------------------------------------------------- - virtual - PCellInfo - CrCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - EConnectivite theConnMode = eNOD, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI, - EModeSwitch theMode = eFULL_INTERLACE) - { - return PCellInfo(new TTCellInfo - (theMeshInfo, - theEntity, - theGeom, - theNbElem, - theConnMode, - theIsElemNum, - theIsElemNames, - theMode)); - } - - virtual - PCellInfo - CrCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theConnectivities, - EConnectivite theConnMode = eNOD, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector(), - EModeSwitch theMode = eFULL_INTERLACE) - { - return PCellInfo(new TTCellInfo - (theMeshInfo, - theEntity, - theGeom, - theConnectivities, - theConnMode, - theFamilyNums, - theElemNums, - theElemNames, - theMode)); - } - - virtual - PCellInfo - CrCellInfo(const PMeshInfo& theMeshInfo, - const PCellInfo& theInfo) - { - return PCellInfo(new TTCellInfo - (theMeshInfo, - theInfo)); - } - - //---------------------------------------------------------------------------- - //! Creates a MEDWrapper MED Balls representation - virtual PBallInfo CrBallInfo(const PMeshInfo& theMeshInfo, - TInt theNbBalls, - EBooleen theIsElemNum = eVRAI) - { - return PBallInfo( new TTBallInfo( theMeshInfo, theNbBalls, theIsElemNum )); - } - - //! Creates a MEDWrapper MED Balls representation - virtual PBallInfo CrBallInfo(const PMeshInfo& theMeshInfo, - const TIntVector& theNodes, - TFloatVector& theDiameters, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector()) - { - return PBallInfo( new TTBallInfo( theMeshInfo, theNodes, theDiameters, - theFamilyNums, theElemNums)); - } - - //! A copy-constructor for the MEDWrapper MED Balls representation - virtual PBallInfo CrBallInfo(const PMeshInfo& theMeshInfo, - const PBallInfo& theInfo) - { - return PBallInfo( new TTBallInfo( theMeshInfo, theInfo )); - } - - //---------------------------------------------------------------------------- - virtual - PFieldInfo - CrFieldInfo(const PMeshInfo& theMeshInfo, - TInt theNbComp = 0, - ETypeChamp theType = eFLOAT64, - const std::string& theValue = "", - EBooleen theIsLocal = eVRAI, - TInt theNbRef = 1) - { - return PFieldInfo(new TTFieldInfo - (theMeshInfo, - theNbComp, - theType, - theValue, - theIsLocal, - theNbRef)); - } - - virtual - PFieldInfo - CrFieldInfo(const PMeshInfo& theMeshInfo, - const PFieldInfo& theInfo) - { - return PFieldInfo(new TTFieldInfo - (theMeshInfo, - theInfo)); - } - - - //---------------------------------------------------------------------------- - virtual - PTimeStampInfo - CrTimeStampInfo(const PFieldInfo& theFieldInfo, - EEntiteMaillage theEntity, - const TGeom2Size& theGeom2Size, - const TGeom2NbGauss& theGeom2NbGauss = TGeom2NbGauss(), - TInt theNumDt = 0, - TInt theNumOrd = 0, - TFloat theDt = 0, - const std::string& theUnitDt = "", - const TGeom2Gauss& theGeom2Gauss = TGeom2Gauss()) - { - return PTimeStampInfo(new TTTimeStampInfo - (theFieldInfo, - theEntity, - theGeom2Size, - theGeom2NbGauss, - theNumDt, - theNumOrd, - theDt, - theUnitDt, - theGeom2Gauss)); - } - - virtual - PTimeStampInfo - CrTimeStampInfo(const PFieldInfo& theFieldInfo, - const PTimeStampInfo& theInfo) - { - return PTimeStampInfo(new TTTimeStampInfo - (theFieldInfo, - theInfo)); - } - - - //---------------------------------------------------------------------------- - virtual - PGaussInfo - CrGaussInfo(const TGaussInfo::TInfo& theInfo, - EModeSwitch theMode = eFULL_INTERLACE) - { - return PGaussInfo(new TTGaussInfo - (theInfo, - theMode)); - } - - - //---------------------------------------------------------------------------- - virtual - PProfileInfo - CrProfileInfo(const TProfileInfo::TInfo& theInfo, - EModeProfil theMode = eCOMPACT) - { - return PProfileInfo(new TTProfileInfo - (theInfo, - theMode)); - } - - - //---------------------------------------------------------------------------- - virtual - PTimeStampValueBase - CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - ETypeChamp theTypeChamp, - const TGeom2Profile& theGeom2Profile = TGeom2Profile(), - EModeSwitch theMode = eFULL_INTERLACE) - { - if(theTypeChamp == eFLOAT64) - return PTimeStampValueBase(new TTTimeStampValue - (theTimeStampInfo, - theTypeChamp, - theGeom2Profile, - theMode)); - return PTimeStampValueBase(new TTTimeStampValue - (theTimeStampInfo, - theTypeChamp, - theGeom2Profile, - theMode)); - } - - virtual - PTimeStampValueBase - CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - const PTimeStampValueBase& theInfo, - ETypeChamp theTypeChamp) - { - if(theTypeChamp == eFLOAT64) - return PTimeStampValueBase(new TTTimeStampValue - (theTimeStampInfo, - theInfo, - theTypeChamp)); - return PTimeStampValueBase(new TTTimeStampValue - (theTimeStampInfo, - theInfo, - theTypeChamp)); - } - - //---------------------------------------------------------------------------- - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const PGrilleInfo& theInfo) - { - return PGrilleInfo(new TTGrilleInfo - (theMeshInfo, - theInfo)); - } - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type) - { - return PGrilleInfo(new TTGrilleInfo - (theMeshInfo, - type)); - } - - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type, - const TInt& nbNodes) - { - return PGrilleInfo(new TTGrilleInfo - (theMeshInfo, - type, - nbNodes)); - } - - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type, - const MED::TIntVector& nbNodeVec) - { - return PGrilleInfo(new TTGrilleInfo - (theMeshInfo, - type, - nbNodeVec)); - } - //---------------------------------------------------------------------------- - }; - -} - - -#endif diff --git a/src/MEDWrapper/Base/MED_Utilities.cxx b/src/MEDWrapper/Base/MED_Utilities.cxx deleted file mode 100644 index 7366f22d8..000000000 --- a/src/MEDWrapper/Base/MED_Utilities.cxx +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#include "MED_Utilities.hxx" -#include "MED_Common.hxx" - -using namespace std; - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -// static int MYDEBUG = 0; -#endif - - -int MED::PrefixPrinter::myCounter = 0; - -MED::PrefixPrinter::PrefixPrinter(bool theIsActive): - myIsActive(theIsActive) -{ - if(myIsActive) - myCounter++; - MSG(MYDEBUG,"MED::PrefixPrinter::PrefixPrinter(...)- "< -#include -#include -#include -#include - - -namespace MED -{ - class MEDWRAPPER_EXPORT PrefixPrinter - { - static int myCounter; - bool myIsActive; - public: - PrefixPrinter(bool theIsActive = true); - ~PrefixPrinter(); - - static std::string GetPrefix(); - }; -} - -#ifdef _DEBUG_ - #define MSG(deb,msg) if(deb) std::cout< -#include - -//#if defined(_DEBUG_) -# define MED_TVECTOR_CHECK_RANGE -//#endif - -namespace MED -{ - - //! Main purpose to introduce the class was to customize operator [] - template > - class TVector : public std::vector<_Tp, _Alloc> - { - public: - typedef size_t size_type; - - typedef std::vector<_Tp, _Alloc> superclass; - typedef typename superclass::allocator_type allocator_type; - - typedef _Tp value_type; - typedef value_type& reference; - typedef const value_type& const_reference; - - protected: - void - check_range(size_type __n) const - { - if (__n >= this->size()) - throw std::out_of_range("TVector [] access out of range"); - } - - const_reference - get_value(size_type __n) const - { - return superclass::operator[](__n); - } - - reference - get_value(size_type __n) - { - return superclass::operator[](__n); - } - - public: - explicit - TVector(const allocator_type& __a = allocator_type()): - superclass(__a) - {} - - TVector(size_type __n, const value_type& __val, - const allocator_type& __a = allocator_type()): - superclass(__n, __val, __a) - {} - - explicit - TVector(size_type __n): - superclass(__n) - {} - - TVector(const TVector& __x): - superclass(__x) - {} - - template - TVector(_InputIterator __first, _InputIterator __last, - const allocator_type& __a = allocator_type()): - superclass(__first, __last, __a) - {} - - template - TVector(TVector<_Yp, _Al> __y): - superclass(__y.begin(), __y.end()) - {} - - TVector& - operator=(const TVector& __x) - { - superclass::operator=(__x); - return *this; - } - - template - TVector& - operator=(TVector<_Yp, _Al> __y) - { - this->assign(__y.begin(), __y.end()); - return *this; - } - - reference - operator[](size_type __n) - { -#if defined(MED_TVECTOR_CHECK_RANGE) - check_range(__n); -#endif - return get_value(__n); - } - - const_reference - operator[](size_type __n) const - { -#if defined(MED_TVECTOR_CHECK_RANGE) - check_range(__n); -#endif - return get_value(__n); - } - - reference - at(size_type __n) - { - check_range(__n); - return get_value(__n); - } - - const_reference - at(size_type __n) const - { - check_range(__n); - return get_value(__n); - } - }; - -} - -#undef MED_TVECTOR_CHECK_RANGE - -#endif diff --git a/src/MEDWrapper/Base/MED_Wrapper.cxx b/src/MEDWrapper/Base/MED_Wrapper.cxx deleted file mode 100644 index 745872228..000000000 --- a/src/MEDWrapper/Base/MED_Wrapper.cxx +++ /dev/null @@ -1,707 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File : MED_Wrapper.cxx -// Author : Alexey PETROV -// -#include "MED_Wrapper.hxx" -#include "MED_Utilities.hxx" - -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -static int MYVALUEDEBUG = 0; -#else -// static int MYDEBUG = 0; -// static int MYVALUEDEBUG = 0; -#endif - -namespace MED -{ - TLockProxy - ::TLockProxy(TWrapper* theWrapper): - myWrapper(theWrapper) - { -#if BOOST_VERSION >= 103500 - myWrapper->myMutex.lock(); -#else - boost::detail::thread::lock_ops::lock(myWrapper->myMutex); -#endif - INITMSG(MYDEBUG,"TLockProxy() - this -"<GetGroupName(iGroup); - INITMSG(MYDEBUG,"aGroupName = '"<myDim; - TInt aNbElem = anInfo->GetNbElem(); - INITMSG(MYDEBUG,"GetPNodeInfo: "); - { - INITMSG(MYDEBUG,"aCoords: "<myCoord; - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - for(TInt iDim = 0, anId = iElem*aDim; iDim < aDim; iDim++, anId++){ - ADDMSG(MYVALUEDEBUG,aCoord[anId]<<","); - } - ADDMSG(MYVALUEDEBUG," "); - } - ADDMSG(MYDEBUG, std::endl); - - BEGMSG(MYVALUEDEBUG, "GetFamNum: "); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetFamNum(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); - - if(anInfo->IsElemNum()){ - BEGMSG(MYVALUEDEBUG,"GetElemNum: "); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetElemNum(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); - } - } - ADDMSG(MYDEBUG, std::endl); -#endif - - return anInfo; - } - - //---------------------------------------------------------------------------- - PPolygoneInfo - TWrapper - ::GetPPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode) - { - if(theMeshInfo->GetType() != eNON_STRUCTURE) - return PPolygoneInfo(); - - TInt aNbElem = GetNbPolygones(theMeshInfo,theEntity,theGeom,theConnMode); - TInt aConnSize = GetPolygoneConnSize(theMeshInfo,theEntity,theGeom,theConnMode); - PPolygoneInfo anInfo = CrPolygoneInfo(theMeshInfo,theEntity,theGeom,aNbElem,aConnSize,theConnMode); - GetPolygoneInfo(anInfo); - -#ifdef _DEBUG_ - INITMSG(MYDEBUG,"GetPPolygoneInfo"<< - " - theGeom = "<GetConnSlice(iElem); - TInt aConnDim = aConnSlice.size(); - for(TInt iConn = 0; iConn < aConnDim; iConn++){ - ADDMSG(MYVALUEDEBUG,aConnSlice[iConn]<<","); - } - ADDMSG(MYDEBUG," "); - } - ADDMSG(MYDEBUG, std::endl); -#endif - - return anInfo; - } - - //---------------------------------------------------------------------------- - PPolyedreInfo - TWrapper - ::GetPPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode) - { - if(theMeshInfo->GetType() != eNON_STRUCTURE) - return PPolyedreInfo(); - TInt aNbElem = GetNbPolyedres(theMeshInfo,theEntity,theGeom,theConnMode); - TInt aNbFaces, aConnSize; - GetPolyedreConnSize(theMeshInfo,aNbFaces,aConnSize,theConnMode); - PPolyedreInfo anInfo = CrPolyedreInfo(theMeshInfo,theEntity,theGeom,aNbElem,aNbFaces,aConnSize,theConnMode); - GetPolyedreInfo(anInfo); - -#ifdef _DEBUG_ - INITMSG(MYDEBUG,"GetPPolyedreInfo"<< - " - theGeom = "<GetConnSliceArr(iElem); - TInt aNbFaces = aConnSliceArr.size(); - ADDMSG(MYDEBUG,"{"); - for(TInt iFace = 0; iFace < aNbFaces; iFace++){ - TCConnSlice aConnSlice = aConnSliceArr[iFace]; - TInt aNbConn = aConnSlice.size(); - ADDMSG(MYDEBUG,"["); - for(TInt iConn = 0; iConn < aNbConn; iConn++){ - ADDMSG(MYVALUEDEBUG,aConnSlice[iConn]<<","); - } - ADDMSG(MYDEBUG,"] "); - } - ADDMSG(MYDEBUG,"} "); - } - ADDMSG(MYDEBUG, std::endl); -#endif - - return anInfo; - } - - //---------------------------------------------------------------------------- - PElemInfo - TWrapper - ::GetPElemInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode, - TErr* theErr) - { - EMaillage aType = theMeshInfo->GetType(); - if(aType == eNON_STRUCTURE){ - switch(theGeom){ - case ePOINT1: - if(theEntity == eNOEUD) - return GetPNodeInfo(theMeshInfo,theErr); - return GetPCellInfo(theMeshInfo,theEntity,theGeom,theConnMode,theErr); - break; - case ePOLYGONE: - return GetPPolygoneInfo(theMeshInfo,theEntity,theGeom,theConnMode); - break; - case ePOLYEDRE: - return GetPPolyedreInfo(theMeshInfo,theEntity,theGeom,theConnMode); - break; - default: - return GetPCellInfo(theMeshInfo,theEntity,theGeom,theConnMode,theErr); - } - } else { - PGrilleInfo aGrille = GetPGrilleInfo(theMeshInfo); - - TInt nbElems; - EBooleen theIsElemNum = eFAUX; - // nodes - switch(theGeom){ - case ePOINT1: - nbElems = aGrille->GetNbNodes(); - theIsElemNum = eVRAI; - break; - case eSEG2: - case eQUAD4: - case eHEXA8: - nbElems = aGrille->GetNbCells(); - break; - default: - nbElems = 0; - } - - TIntVector aFamNum; - TIntVector aElemNum; - TStringVector aElemNames; - - PElemInfo aElemInfo; - - if(theGeom == ePOINT1){ - aElemInfo = CrElemInfo(theMeshInfo, - nbElems, - theIsElemNum); - MED::TElemInfo &aTElemInfo = *aElemInfo; - - // must be reimplemente in connection with mesh type eSTRUCTURE -// GetNumeration(aTElemInfo, -// nbElems, -// theEntity, -// theGeom, -// theErr); - - GetFamilies(aTElemInfo, - nbElems, - theEntity, - theGeom, - theErr); - - // must be reimplemente in connection with mesh type eSTRUCTURE -// GetNames(aTElemInfo, -// nbElems, -// theEntity, -// theGeom, -// theErr); - } else { - aElemInfo = CrElemInfo(theMeshInfo, - nbElems, - aFamNum, - aElemNum, - aElemNames); - } - - return aElemInfo; - } - return PElemInfo(); - } - - - //---------------------------------------------------------------------------- - PCellInfo - TWrapper - ::GetPCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode, - TErr* theErr) - { - if(theMeshInfo->GetType() != eNON_STRUCTURE) - return PCellInfo(); - TInt aNbElem = GetNbCells(theMeshInfo,theEntity,theGeom,theConnMode); - PCellInfo anInfo = CrCellInfo(theMeshInfo,theEntity,theGeom,aNbElem,theConnMode); - GetCellInfo(anInfo,theErr); - -#ifdef _DEBUG_ - TInt aConnDim = anInfo->GetConnDim(); - INITMSG(MYDEBUG,"GetPCellInfo - theEntity = "<GetConnSlice(iElem); - for(TInt iConn = 0; iConn < aConnDim; iConn++){ - ADDMSG(MYVALUEDEBUG,aConnSlice[iConn]<<","); - } - ADDMSG(MYVALUEDEBUG," "); - } - ADDMSG(MYDEBUG, std::endl); - - BEGMSG(MYVALUEDEBUG,"GetPCellInfo - GetFamNum: "); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetFamNum(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); - - if(anInfo->IsElemNum()){ - BEGMSG(MYVALUEDEBUG,"GetPCellInfo - GetElemNum: "); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetElemNum(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); - } - ADDMSG(MYDEBUG, std::endl); -#endif - - return anInfo; - } - - //---------------------------------------------------------------------------- - //! Read a MEDWrapped representation of MED Balls from the MED file - PBallInfo - TWrapper - ::GetPBallInfo(const PMeshInfo& theMeshInfo) - { - TInt nbBalls = GetNbBalls(theMeshInfo); - if ( nbBalls < 1 ) return PBallInfo(); - - PBallInfo anInfo = CrBallInfo( theMeshInfo, nbBalls ); - GetBallInfo(anInfo); - - return anInfo; - } - //---------------------------------------------------------------------------- - PFieldInfo - TWrapper - ::GetPFieldInfo(const PMeshInfo& theMeshInfo, - TInt theId, - TErr* theErr) - { - TInt aNbComp = GetNbComp(theId); - PFieldInfo anInfo = CrFieldInfo(theMeshInfo,aNbComp); - GetFieldInfo(theId,*anInfo,theErr); - -#ifdef _DEBUG_ - INITMSG(MYDEBUG, - "GetPFieldInfo "<< - "- aName = '"<GetName()<<"'"<< - "; aType = "<GetType()<< - "; aNbComp = "<myGeom2NbGauss; - TGeom2NbGauss::const_iterator anIter = aGeom2NbGauss.begin(); - for(; anIter != aGeom2NbGauss.end(); anIter++){ - const EGeometrieElement& aGeom = anIter->first; - INITMSG(MYDEBUG,"aGeom = "<GetFieldInfo(); - return CrTimeStampValue(theTimeStampInfo, - aFieldInfo->GetType(), - theGeom2Profile, - theMode); - } - - //---------------------------------------------------------------------------- - PTimeStampValueBase - TWrapper - ::CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - const PTimeStampValueBase& theInfo) - { - PFieldInfo aFieldInfo = theTimeStampInfo->GetFieldInfo(); - return CrTimeStampValue(theTimeStampInfo, - theInfo, - aFieldInfo->GetType()); - } - - //---------------------------------------------------------------------------- - template - void - Print(SharedPtr theTimeStampValue) - { - INITMSG(MYDEBUG,"Print - TimeStampValue\n"); - typename TimeStampValueType::TTGeom2Value& aGeom2Value = theTimeStampValue->myGeom2Value; - typename TimeStampValueType::TTGeom2Value::const_iterator anIter = aGeom2Value.begin(); - for(; anIter != aGeom2Value.end(); anIter++){ - const EGeometrieElement& aGeom = anIter->first; - const typename TimeStampValueType::TTMeshValue& aMeshValue = anIter->second; - TInt aNbElem = aMeshValue.myNbElem; - TInt aNbGauss = aMeshValue.myNbGauss; - TInt aNbComp = aMeshValue.myNbComp; - INITMSG(MYDEBUG,"aGeom = "<GetFieldInfo(); - PTimeStampValueBase anInfo = CrTimeStampValue(theTimeStampInfo, - aFieldInfo->GetType()); - GetTimeStampValue(anInfo, - theMKey2Profile, - theKey2Gauss, - theErr); -#ifdef _DEBUG_ - if(aFieldInfo->GetType() == eFLOAT64) - Print(anInfo); - else - Print(anInfo); -#endif - return anInfo; - } - - //---------------------------------------------------------------------------- - void - TWrapper - ::GetTimeStampVal(const PTimeStampVal& theVal, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr) - { - PTimeStampInfo aTimeStampInfo = theVal->GetTimeStampInfo(); - PFieldInfo aFieldInfo = aTimeStampInfo->GetFieldInfo(); - if(aFieldInfo->GetType() == eFLOAT64) - GetTimeStampValue(theVal, - theMKey2Profile, - theKey2Gauss, - theErr); - else{ - PTimeStampValueBase aVal = CrTimeStampValue(aTimeStampInfo, - theVal, - eINT); - GetTimeStampValue(aVal, - theMKey2Profile, - theKey2Gauss, - theErr); - CopyTimeStampValueBase(aVal, theVal); - } - } - - //---------------------------------------------------------------------------- - void - TWrapper - ::SetTimeStamp(const PTimeStampVal& theVal, - TErr* theErr) - { - PTimeStampInfo aTimeStampInfo = theVal->GetTimeStampInfo(); - PFieldInfo aFieldInfo = aTimeStampInfo->GetFieldInfo(); - if(aFieldInfo->GetType() == eFLOAT64) - SetTimeStampValue(theVal, theErr); - else{ - PTimeStampValueBase aVal = CrTimeStampValue(aTimeStampInfo, - eINT, - theVal->GetGeom2Profile(), - theVal->GetModeSwitch()); - CopyTimeStampValueBase(theVal, aVal); - SetTimeStampValue(aVal, theErr); - } - } - - //---------------------------------------------------------------------------- - PTimeStampVal - TWrapper - ::CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo, - const TGeom2Profile& theGeom2Profile, - EModeSwitch theMode) - { - return CrTimeStampValue(theTimeStampInfo, - eFLOAT64, - theGeom2Profile, - theMode); - } - - //---------------------------------------------------------------------------- - PTimeStampVal - TWrapper - ::CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo, - const PTimeStampVal& theInfo) - { - return CrTimeStampValue(theTimeStampInfo, - theInfo, - eFLOAT64); - } - - //---------------------------------------------------------------------------- - PTimeStampVal - TWrapper - ::GetPTimeStampVal(const PTimeStampInfo& theTimeStampInfo, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr) - { - PTimeStampVal anInfo = CrTimeStampVal(theTimeStampInfo); - GetTimeStampVal(anInfo, - theMKey2Profile, - theKey2Gauss, - theErr); - return anInfo; - } - - //---------------------------------------------------------------------------- - PGrilleInfo - TWrapper - ::GetPGrilleInfo(const PMeshInfo& theMeshInfo) - { - if(theMeshInfo->GetType() != eSTRUCTURE) - return PGrilleInfo(); - - EGrilleType type; - GetGrilleType(*theMeshInfo,type); - PGrilleInfo anInfo; - if(type == eGRILLE_STANDARD){ - const TInt nnoeuds = GetNbNodes(*theMeshInfo); - anInfo = CrGrilleInfo(theMeshInfo,type,nnoeuds); - } - else { - TIntVector aVec; - aVec.resize(theMeshInfo->GetDim()); - for(int aAxe=0;aAxeGetDim();aAxe++){ - ETable aATable = eCOOR_IND1; - switch(aAxe){ - case 0: - aATable = eCOOR_IND1; - break; - case 1: - aATable = eCOOR_IND2; - break; - case 2: - aATable = eCOOR_IND3; - break; - } - aVec[aAxe] = GetNbNodes(*theMeshInfo,aATable); - } - anInfo = CrGrilleInfo(theMeshInfo,type,aVec); - } - - GetGrilleInfo(anInfo); - anInfo->SetGrilleType(type); - -#ifdef _DEBUG_ - INITMSG(MYDEBUG,"GetPGrilleInfo: "); - { - TInt aNbElem = anInfo->GetNbNodes(); - BEGMSG(MYVALUEDEBUG,"GetFamNumNode: "); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetFamNumNode(iElem)<<", "); - } - TInt aNbCells = anInfo->GetNbCells(); - BEGMSG(MYVALUEDEBUG,"GetFamNum: "); - for(TInt iElem = 0; iElem < aNbCells; iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetFamNum(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); - BEGMSG(MYVALUEDEBUG,"GetCoordName: "); - for(TInt iElem = 0; iElem < theMeshInfo->GetDim(); iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetCoordName(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); - BEGMSG(MYVALUEDEBUG,"GetCoordUnit: "); - for(TInt iElem = 0; iElem < theMeshInfo->GetDim(); iElem++){ - ADDMSG(MYVALUEDEBUG,anInfo->GetCoordUnit(iElem)<<", "); - } - ADDMSG(MYVALUEDEBUG, std::endl); - - } -#endif - - return anInfo; - } - - //---------------------------------------------------------------------------- - PGrilleInfo - TWrapper - ::GetPGrilleInfo(const PMeshInfo& theMeshInfo, - const PGrilleInfo& theInfo) - { - PGrilleInfo anInfo = CrGrilleInfo(theMeshInfo,theInfo); - return anInfo; - } -} diff --git a/src/MEDWrapper/Base/MED_Wrapper.hxx b/src/MEDWrapper/Base/MED_Wrapper.hxx deleted file mode 100644 index 8a7075524..000000000 --- a/src/MEDWrapper/Base/MED_Wrapper.hxx +++ /dev/null @@ -1,1052 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#ifndef MED_Wrapper_HeaderFile -#define MED_Wrapper_HeaderFile - -#include "MED_WrapperBase.hxx" - -#include "MED_Structures.hxx" -#include "MED_Algorithm.hxx" - -#include - -namespace MED -{ - - //---------------------------------------------------------------------------- - //! Define a base class that wraps the MED API - struct MEDWRAPPER_EXPORT TWrapper - { - typedef boost::mutex TMutex; - //! This is a synchronization primitive which allow to support thread safety for the MED access - TMutex myMutex; - - virtual - ~TWrapper(); - - //---------------------------------------------------------------------------- - //! Gets version of the MED library used for the MED file - virtual - EVersion - GetVersion() = 0; - - //---------------------------------------------------------------------------- - //! Creates a MEDWrapper MED Mesh representation - virtual - PMeshInfo - CrMeshInfo(TInt theDim = 0, TInt theSpaceDim = 0, - const std::string& theValue = "", - EMaillage theType = eNON_STRUCTURE, - const std::string& theDesc = "") = 0; - - //! A copy-constructor for the MEDWrapper MED Mesh representation - virtual - PMeshInfo - CrMeshInfo(const PMeshInfo& theInfo) = 0; - - //! Read number of MED Mesh entities in the defined MED file - virtual - TInt - GetNbMeshes(TErr* theErr = NULL) = 0; - - //! Read a MEDWrapper MED Mesh representation by its number - virtual - void - GetMeshInfo(TInt theMeshId, - TMeshInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Write the MEDWrapper MED Mesh representation in the defined MED file - virtual - void - SetMeshInfo(const TMeshInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Read a MEDWrapper MED Mesh representation by its number - virtual - PMeshInfo - GetPMeshInfo(TInt theId, - TErr* theErr = NULL); - - - //---------------------------------------------------------------------------- - //! Read number of MED Family entities in the defined MED file - virtual - TInt - GetNbFamilies(const TMeshInfo& theMeshInfo, - TErr* theErr = NULL) = 0; - - //! Read number of attributes for defined MED Family - virtual - TInt - GetNbFamAttr(TInt theFamId, - const TMeshInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Read number of MED Groups where MED Family with the number belong to - virtual - TInt - GetNbFamGroup(TInt theFamId, - const TMeshInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Read a MEDWrapper MED Family representation by its number - virtual - void - GetFamilyInfo(TInt theFamId, - TFamilyInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Write a MEDWrapper MED Family representation by its number - virtual - void - SetFamilyInfo(const TFamilyInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Creates a MEDWrapper MED Family representation - virtual - PFamilyInfo - CrFamilyInfo(const PMeshInfo& theMeshInfo, - TInt theNbGroup = 0, - TInt theNbAttr = 0, - TInt theId = 0, - const std::string& theValue = "") = 0; - - //! Creates a MEDWrapper MED Family representation - virtual - PFamilyInfo - CrFamilyInfo(const PMeshInfo& theMeshInfo, - const std::string& theValue, - TInt theId, - const TStringSet& theGroupNames, - const TStringVector& theAttrDescs = TStringVector(), - const TIntVector& theAttrIds = TIntVector(), - const TIntVector& theAttrVals = TIntVector()) = 0; - - //! A copy-constructor for the MEDWrapper MED Family representation - virtual - PFamilyInfo - CrFamilyInfo(const PMeshInfo& theMeshInfo, - const PFamilyInfo& theInfo) = 0; - - //! Write a MEDWrapper MED Family representation by its number - PFamilyInfo - GetPFamilyInfo(const PMeshInfo& theMeshInfo, - TInt theId, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - //! Read sequence of names for any descendant of TElemInfo - virtual - void - GetNames(TElemInfo& theInfo, - TInt theNb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL) - {} - - //! Read sequence of numerous for any descendant of TElemInfo - virtual - void - GetNumeration(TElemInfo& theInfo, - TInt theNb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL) - {} - - //! Read sequence MED Family indexes for any descendant of TElemInfo - virtual - void - GetFamilies(TElemInfo& theInfo, - TInt theNb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL) - {} - - //! Write sequence of names for any descendant of TElemInfo - virtual - void - SetNames(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL) - {} - - //! Write sequence of numerous for any descendant of TElemInfo - virtual - void - SetNumeration(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL) - {} - - //! Write sequence MED Family indexes for any descendant of TElemInfo - virtual - void - SetFamilies(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL) - {} - - //! Read a MEDWrapper MED Element representation from defined MED file - PElemInfo - GetPElemInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity = eNOEUD, - EGeometrieElement theGeom = ePOINT1, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - //! Read number of nodes in defined MED Mesh - virtual - TInt - GetNbNodes(const TMeshInfo& theMeshInfo, - TErr* theErr = NULL) = 0; - - virtual - TInt - GetNbNodes(const TMeshInfo& theMeshInfo, - ETable theTable, - TErr* theErr = NULL) - { - return 0; - } - - //! Read a MEDWrapper MED Nodes representation from defined MED file - virtual - void - GetNodeInfo(TNodeInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Write the MEDWrapper MED Nodes representation into defined MED file - virtual - void - SetNodeInfo(const TNodeInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Creates a MEDWrapper MED Nodes representation - virtual - PElemInfo - CrElemInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) - { - return PElemInfo(); - } - - //! Creates a MEDWrapper MED Nodes representation - virtual - PElemInfo - CrElemInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - const TIntVector& theFamNum, - const TIntVector& aElemNum, - const TStringVector& aElemNames) - { - return PElemInfo(); - } - - //! Creates a MEDWrapper MED Nodes representation - virtual - PNodeInfo - CrNodeInfo(const PMeshInfo& theMeshInfo, - TInt theNbElem, - EModeSwitch theMode = eFULL_INTERLACE, - ERepere theSystem = eCART, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) = 0; - - //! Creates a MEDWrapper MED Nodes representation - virtual - PNodeInfo - CrNodeInfo(const PMeshInfo& theMeshInfo, - const TFloatVector& theNodeCoords, - EModeSwitch theMode = eFULL_INTERLACE, - ERepere theSystem = eCART, - const TStringVector& theCoordNames = TStringVector(), - const TStringVector& theCoordUnits = TStringVector(), - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector()) = 0; - - //! A copy-constructor for the MEDWrapper MED Nodes representation - virtual - PNodeInfo - CrNodeInfo(const PMeshInfo& theMeshInfo, - const PNodeInfo& theInfo) = 0; - - //! Read a MEDWrapper MED Nodes representation from defined MED file - PNodeInfo - GetPNodeInfo(const PMeshInfo& theMeshInfo, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - //! Read a MEDWrapper MED Polygones representation from defined MED file - /*! This feature is supported only for version of 2.2 and higher */ - virtual - void - GetPolygoneInfo(TPolygoneInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Write a MEDWrapper MED Polygones representation from defined MED file - /*! This feature is supported only for version of 2.2 and higher */ - virtual - void - SetPolygoneInfo(const TPolygoneInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Read number of MED Polygones in defined MED Mesh - /*! This feature is supported only for version of 2.2 and higher */ - virtual - TInt - GetNbPolygones(const TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL) - { - return 0; - } - - //! Read connectivity infroamtion for the MED Polygones in defined MED Mesh - /*! This feature is supported only for version of 2.2 and higher */ - virtual - TInt - GetPolygoneConnSize(const TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL) - { - return 0; - } - - //! Creates a MEDWrapper MED Polygones representation - /*! This feature is supported only for version of 2.2 and higher */ - virtual - PPolygoneInfo - CrPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - TInt theConnSize, - EConnectivite theConnMode = eNOD, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) - { - return PPolygoneInfo(); - } - - //! Creates a MEDWrapper MED Polygones representation - /*! This feature is supported only for version of 2.2 and higher */ - virtual - PPolygoneInfo - CrPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theIndexes, - const TIntVector& theConnectivities, - EConnectivite theConnMode = eNOD, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector()) - { - return PPolygoneInfo(); - } - - //! A copy-constructor for the MEDWrapper MED Polygones representation - virtual - PPolygoneInfo - CrPolygoneInfo(const PMeshInfo& theMeshInfo, - const PPolygoneInfo& theInfo) - { - return PPolygoneInfo(); - } - - //! Read a MEDWrapper MED Polygones representation from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - PPolygoneInfo - GetPPolygoneInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD); - - //---------------------------------------------------------------------------- - //! Read a MEDWrapper MED Polyedres representation from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - virtual - void - GetPolyedreInfo(TPolyedreInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Write a MEDWrapper MED Polyedres representation from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - virtual - void - SetPolyedreInfo(const TPolyedreInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Read number of MED Polyedres in defined MED Mesh - /*! This feature is support only for version of 2.2 and higher */ - virtual - TInt - GetNbPolyedres(const TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL) - { - return 0; - } - - //! Read connectivity infroamtion for the MED Polyedres in defined MED Mesh - /*! This feature is support only for version of 2.2 and higher */ - virtual - void - GetPolyedreConnSize(const TMeshInfo& theMeshInfo, - TInt& theNbFaces, - TInt& theConnSize, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL) - { - theNbFaces = theConnSize = 0; - } - - virtual - PPolyedreInfo - CrPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - TInt theNbFaces, - TInt theConnSize, - EConnectivite theConnMode = eNOD, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI) - { - return PPolyedreInfo(); - } - - //! Creates a MEDWrapper MED Polyedres representation - /*! This feature is support only for version of 2.2 and higher */ - virtual - PPolyedreInfo - CrPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theIndexes, - const TIntVector& theFaces, - const TIntVector& theConnectivities, - EConnectivite theConnMode = eNOD, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector()) - { - return PPolyedreInfo(); - } - - //! A copy-constructor for the MEDWrapper MED Polyedres representation - virtual - PPolyedreInfo - CrPolyedreInfo(const PMeshInfo& theMeshInfo, - const PPolyedreInfo& theInfo) - { - return PPolyedreInfo(); - } - - //! Read a MEDWrapper MED Polyedres representation from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - PPolyedreInfo - GetPPolyedreInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD); - - //---------------------------------------------------------------------------- - //! Get TEntityInfo which contains brief information about existing cells and their destribution among MED ENTITIES - virtual - TEntityInfo - GetEntityInfo(const TMeshInfo& theMeshInfo, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL) = 0; - - //! Read number of cells for defined MED Mesh, ENTITY and geometrical type with define mode of connectivity - virtual - TInt - GetNbCells(const TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL) = 0; - - //! Read a MEDWrapper MED Cells representation from defined MED file - virtual - void - GetCellInfo(TCellInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Write the MEDWrapper MED Cells representation into defined MED file - virtual - void - SetCellInfo(const TCellInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Creates a MEDWrapper MED Cells representation - virtual - PCellInfo - CrCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TInt theNbElem, - EConnectivite theConnMode = eNOD, - EBooleen theIsElemNum = eVRAI, - EBooleen theIsElemNames = eVRAI, - EModeSwitch theMode = eFULL_INTERLACE) = 0; - - //! Creates a MEDWrapper MED Cells representation - virtual - PCellInfo - CrCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - const TIntVector& theConnectivities, - EConnectivite theConnMode = eNOD, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector(), - const TStringVector& theElemNames = TStringVector(), - EModeSwitch theMode = eFULL_INTERLACE) = 0; - - //! A copy-constructor for the MEDWrapper MED Cells representation - virtual - PCellInfo - CrCellInfo(const PMeshInfo& theMeshInfo, - const PCellInfo& theInfo) = 0; - - //! Read a MEDWrapper MED Cells representation from defined MED file - PCellInfo - GetPCellInfo(const PMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - //! Read number of balls in the Mesh - /*! This feature is supported since version 3.0 */ - virtual - TInt - GetNbBalls(const TMeshInfo& theMeshInfo) - { - return 0; - } - - //! Read a MEDWrapped representation of MED_BALL from the MED file - /*! This feature is supported since version 3.0 */ - virtual - void - GetBallInfo(TBallInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Write a MEDWrapped representation of MED_BALL to the MED file - /*! This feature is supported since version 3.0 */ - virtual - void - SetBallInfo(const TBallInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Creates a MEDWrapper MED Balls representation - /*! This feature is supported since version 3.0 */ - virtual - PBallInfo - CrBallInfo(const PMeshInfo& theMeshInfo, - TInt theNbBalls, - EBooleen theIsElemNum = eVRAI) - { - return PBallInfo(); - } - - //! Creates a MEDWrapper MED Balls representation - /*! This feature is supported since version 3.0 */ - virtual - PBallInfo - CrBallInfo(const PMeshInfo& theMeshInfo, - const TIntVector& theNodes, - TFloatVector& theDiameters, - const TIntVector& theFamilyNums = TIntVector(), - const TIntVector& theElemNums = TIntVector()) - { - return PBallInfo(); - } - - //! A copy-constructor for the MEDWrapped MED Balls representation - virtual - PBallInfo - CrBallInfo(const PMeshInfo& theMeshInfo, - const PBallInfo& theInfo) - { - return PBallInfo(); - } - - //! Read a MEDWrapped MED Balls representation from defined MED file - /*! This feature is supported since version 3.0 */ - virtual - PBallInfo - GetPBallInfo(const PMeshInfo& theMeshInfo); - - //---------------------------------------------------------------------------- - //! Read number of MED FIELDS in defined MED Mesh - virtual - TInt - GetNbFields(TErr* theErr = NULL) = 0; - - //! Read number of components for the defined MED FIELD by its order number - virtual - TInt - GetNbComp(TInt theFieldId, - TErr* theErr = NULL) = 0; - - //! Read MEDWrapper MED FIELD representation by its order number - virtual - void - GetFieldInfo(TInt theFieldId, - TFieldInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Write MEDWrapper MED FIELD representation into defined MED file - virtual - void - SetFieldInfo(const TFieldInfo& theInfo, - TErr* theErr = NULL) = 0; - - - //! Creates a MEDWrapper MED FIELD representation - virtual - PFieldInfo - CrFieldInfo(const PMeshInfo& theMeshInfo, - TInt theNbComp = 0, - ETypeChamp theType = eFLOAT64, - const std::string& theValue = "", - EBooleen theIsLocal = eVRAI, - TInt theNbRef = 1) = 0; - - //! A copy-constructor for the MEDWrapper MED FIELD representation - virtual - PFieldInfo - CrFieldInfo(const PMeshInfo& theMeshInfo, - const PFieldInfo& theInfo) = 0; - - //! Read a MEDWrapper MED FIELD representation from defined MED file - PFieldInfo - GetPFieldInfo(const PMeshInfo& theMeshInfo, - TInt theId, - TErr* theErr = NULL); - - - //---------------------------------------------------------------------------- - //! Read number of MED GAUSS in defined MED Mesh - /*! This feature is support only for version of 2.2 and higher */ - virtual - TInt - GetNbGauss(TErr* theErr = NULL) - { - return TInt(); - } - - //! Read brief MED GAUSS information by its order number from defined MED Mesh - /*! This feature is support only for version of 2.2 and higher */ - virtual - TGaussInfo::TInfo - GetGaussPreInfo(TInt theId, - TErr* theErr = NULL) - { - return TGaussInfo::TInfo( TGaussInfo::TKey(ePOINT1,""),0 ); - } - - //! Read a MEDWrapper MED GAUSS representation by its order number from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - virtual - void - GetGaussInfo(TInt theId, - TGaussInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Creates a MEDWrapper MED GAUSS representation - /*! This feature is support only for version of 2.2 and higher */ - virtual - PGaussInfo - CrGaussInfo(const TGaussInfo::TInfo& theInfo, - EModeSwitch theMode = eFULL_INTERLACE) = 0; - - - //---------------------------------------------------------------------------- - //! Read number of MED TIMESTAMPS in defined MED Mesh - /*! - By the way some additional information can be obtained: - - to what MED ENTITY the MED TIMESTAMP conntected to; - - on what geometrical types the MED TIMESTAMP defined to. - */ - virtual - TInt - GetNbTimeStamps(const TFieldInfo& theInfo, - const TEntityInfo& theEntityInfo, - EEntiteMaillage& theEntity, - TGeom2Size& theGeom2Size, - TErr* theErr = NULL) = 0; - - //! Read MEDWrapper MED TIMESTAMP representation by its order number - virtual - void - GetTimeStampInfo(TInt theTimeStampId, - TTimeStampInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Creates a MEDWrapper MED TIMESTAMP representation - virtual - PTimeStampInfo - CrTimeStampInfo(const PFieldInfo& theFieldInfo, - EEntiteMaillage theEntity, - const TGeom2Size& theGeom2Size, - const TGeom2NbGauss& theGeom2NbGauss = TGeom2NbGauss(), - TInt theNumDt = 0, - TInt theNumOrd = 0, - TFloat theDt = 0, - const std::string& theUnitDt = "", - const TGeom2Gauss& theGeom2Gauss = TGeom2Gauss()) = 0; - - //! A copy-constructor for the MEDWrapper MED TIMESTAMP representation - virtual - PTimeStampInfo - CrTimeStampInfo(const PFieldInfo& theFieldInfo, - const PTimeStampInfo& theInfo) = 0; - - //! Read MEDWrapper MED TIMESTAMP representation by its order number - PTimeStampInfo - GetPTimeStampInfo(const PFieldInfo& theFieldInfo, - EEntiteMaillage theEntity, - const TGeom2Size& theGeom2Size, - TInt theId, - TErr* theErr = NULL); - - - //---------------------------------------------------------------------------- - //! Read number of MED PROFILES in defined MED Mesh - virtual - TInt - GetNbProfiles(TErr* theErr = NULL) = 0; - - //! Read brief MED PROFILE information by its order number from defined MED Mesh - virtual - TProfileInfo::TInfo - GetProfilePreInfo(TInt theId, - TErr* theErr = NULL) = 0; - - //! Read a MEDWrapper MED PROFILE representation by its order number from defined MED file - virtual - void - GetProfileInfo(TInt theId, - TProfileInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Creates a MEDWrapper MED PROFILE representation - virtual - PProfileInfo - CrProfileInfo(const TProfileInfo::TInfo& theInfo, - EModeProfil theMode = eCOMPACT) = 0; - - //! Write a MEDWrapper MED PROFILE representation - virtual - void - SetProfileInfo(const TProfileInfo& theInfo, - TErr* theErr = NULL) = 0; - - //! Read a MEDWrapper MED PROFILE representation by its order number from defined MED file - PProfileInfo - GetPProfileInfo(TInt theId, - EModeProfil theMode = eCOMPACT, - TErr* theErr = NULL); - - - //---------------------------------------------------------------------------- - //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file - virtual - void - GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr = NULL) = 0; - - //! Write the values for MEDWrapper MED TIEMSTAMP to defined MED file - virtual - void - SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, - TErr* theErr = NULL) = 0; - - //! Creates the values for MEDWrapper MED TIEMSTAMP representation - virtual - PTimeStampValueBase - CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - ETypeChamp theTypeChamp, - const TGeom2Profile& theGeom2Profile = TGeom2Profile(), - EModeSwitch theMode = eFULL_INTERLACE) = 0; - - //! Creates the values for MEDWrapper MED TIEMSTAMP representation - virtual - PTimeStampValueBase - CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - const TGeom2Profile& theGeom2Profile = TGeom2Profile(), - EModeSwitch theMode = eFULL_INTERLACE); - - //! A copy-constructor for the values for MEDWrapper MED TIEMSTAMP representation - virtual - PTimeStampValueBase - CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - const PTimeStampValueBase& theInfo, - ETypeChamp theTypeChamp) = 0; - - //! A copy-constructor for the values for MEDWrapper MED TIEMSTAMP representation - virtual - PTimeStampValueBase - CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - const PTimeStampValueBase& theInfo); - - //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file - PTimeStampValueBase - GetPTimeStampValue(const PTimeStampInfo& theTimeStampInfo, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - // Backward compatibility declarations - //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file - virtual - void - GetTimeStampVal(const PTimeStampVal& theVal, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr = NULL); - - //! Write the values for MEDWrapper MED TIEMSTAMP to defined MED file - virtual - void - SetTimeStamp(const PTimeStampVal& theVal, - TErr* theErr = NULL); - - //! Creates the values for MEDWrapper MED TIEMSTAMP representation - virtual - PTimeStampVal - CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo, - const TGeom2Profile& theGeom2Profile = TGeom2Profile(), - EModeSwitch theMode = eFULL_INTERLACE); - - //! A copy-constructor for the values for MEDWrapper MED TIEMSTAMP representation - virtual - PTimeStampVal - CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo, - const PTimeStampVal& theInfo); - - //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file - PTimeStampVal - GetPTimeStampVal(const PTimeStampInfo& theTimeStampInfo, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - //! Read a MEDWrapper MED Grille representation from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - PGrilleInfo - GetPGrilleInfo(const PMeshInfo& theMeshInfo); - - //! Read a MEDWrapper MED Grille representation from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - PGrilleInfo - GetPGrilleInfo(const PMeshInfo& theMeshInfo, - const PGrilleInfo& theInfo); - - //! Read a MEDWrapper MED Grille representation from defined MED file - /*! This feature is support only for version of 2.2 and higher */ - virtual - void - GetGrilleInfo(TGrilleInfo& theInfo, - TErr* theErr = NULL) - {} - - //! Write the MEDWrapper MED Grille representation into defined MED file - /*! This feature is support only for version of 2.2 and higher */ - virtual - void - SetGrilleInfo(const TGrilleInfo& theInfo, - TErr* theErr = NULL) - {} - - /*! This feature is support only for version of 2.2 and higher */ - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const PGrilleInfo& theGrilleInfo) - { - return PGrilleInfo(); - } - - /*! This feature is support only for version of 2.2 and higher */ - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo) - { - return PGrilleInfo(); - } - - /*! This feature is support only for version of 2.2 and higher */ - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type) - { - return PGrilleInfo(); - } - - /*! This feature is support only for version of 2.2 and higher */ - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type, - const TInt& nbNodes) - { - return PGrilleInfo(); - } - - /*! This feature is support only for version of 2.2 and higher */ - virtual - PGrilleInfo - CrGrilleInfo(const PMeshInfo& theMeshInfo, - const EGrilleType& type, - const MED::TIntVector& nbNodeVec) - { - return PGrilleInfo(); - } - - /*! This feature is support only for version of 2.2 and higher */ - virtual - void - GetGrilleType(const TMeshInfo& theMeshInfo, - EGrilleType& type, - TErr* theErr = NULL) - { - } - - }; - - - //---------------------------------------------------------------------------- - //! This class provide thread-safety for MEDWrapper interaction - class MEDWRAPPER_EXPORT TLockProxy - { - TLockProxy& operator=(const TLockProxy& ); - TWrapper* myWrapper; - - public: - TLockProxy(TWrapper* theWrapper); - - ~TLockProxy(); - - TWrapper * operator-> () const; - }; - - - //---------------------------------------------------------------------------- - //! To specialize the SharedPtr for TWrapper - template<> - class MEDWRAPPER_EXPORT SharedPtr: public boost::shared_ptr - { - public: - SharedPtr() {} - - template - explicit SharedPtr(Y * p): - boost::shared_ptr(p) - {} - - template - SharedPtr(SharedPtr const & r): - boost::shared_ptr(boost::dynamic_pointer_cast(r)) - {} - - template - SharedPtr& - operator=(SharedPtr const & r) - { - SharedPtr(r).swap(*this); - return *this; - } - - template - SharedPtr& - operator()(Y * p) // Y must be complete - { - return operator=(SharedPtr(p)); - } - - template - SharedPtr& - operator()(SharedPtr const & r) // Y must be complete - { - return operator=(SharedPtr(r)); - } - - TLockProxy operator-> () const // never throws - { - return TLockProxy(this->get()); - } - - protected: - operator const TWrapper& () const; - - operator TWrapper& (); - - TWrapper& operator* () const; - - TWrapper * get() const // never throws - { - return boost::shared_ptr::get(); - } - }; - - //---------------------------------------------------------------------------- - typedef SharedPtr PWrapper; -} - -#endif diff --git a/src/MEDWrapper/Base/MED_WrapperBase.hxx b/src/MEDWrapper/Base/MED_WrapperBase.hxx deleted file mode 100755 index 03913a9ed..000000000 --- a/src/MEDWrapper/Base/MED_WrapperBase.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File : MED_WrapperBase.hxx -// Author : Alexander A. BORODIN -// -#ifndef _MED_WrapperBase_HXX_ -#define _MED_WrapperBase_HXX_ - -#ifdef WIN32 - #if defined MEDWRAPPER_BASE_EXPORTS || defined MEDWrapperBase_EXPORTS - #if defined WIN32 - #define MEDWRAPPER_EXPORT __declspec( dllexport ) - #else - #define MEDWRAPPER_EXPORT - #endif - #else - #if defined WIN32 - #define MEDWRAPPER_EXPORT __declspec( dllimport ) - #else - #define MEDWRAPPER_EXPORT - #endif - #endif -#else - #define MEDWRAPPER_EXPORT -#endif - -#endif diff --git a/src/MEDWrapper/CMakeLists.txt b/src/MEDWrapper/CMakeLists.txt index 73883730b..4e3bca1ed 100644 --- a/src/MEDWrapper/CMakeLists.txt +++ b/src/MEDWrapper/CMakeLists.txt @@ -17,6 +17,70 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -ADD_SUBDIRECTORY(Base) -ADD_SUBDIRECTORY(V2_2) -ADD_SUBDIRECTORY(Factory) +# --- options --- +# additional include directories +INCLUDE_DIRECTORIES( + ${Boost_INCLUDE_DIRS} + ${HDF5_INCLUDE_DIRS} + ${MEDFILE_INCLUDE_DIRS} + ${KERNEL_INCLUDE_DIRS} +) + +# additional preprocessor / compiler flags +ADD_DEFINITIONS( + ${BOOST_DEFINITIONS} + ${HDF5_DEFINITIONS} +) + +SET(_link_LIBRARIES + ${Boost_LIBRARIES} + ${HDF5_LIBS} + ${MEDFILE_C_LIBRARIES} +) + +# --- headers --- + +# header files / no moc processing +SET(MEDWrapper_HEADERS + MED_Algorithm.hxx + MED_Common.hxx + MED_CoordUtils.hxx + MED_Factory.hxx + MED_GaussDef.hxx + MED_GaussUtils.hxx + MED_SharedPtr.hxx + MED_SliceArray.hxx + MED_Structures.hxx + MED_TStructures.hxx + MED_Utilities.hxx + MED_Vector.hxx + MED_Wrapper.hxx + MED_WrapperDef.hxx +) + +# --- sources --- + +# sources / static +SET(MEDWrapper_SOURCES + MED_Algorithm.cxx + MED_Common.cxx + MED_CoordUtils.cxx + MED_Factory.cxx + MED_GaussDef.cxx + MED_GaussUtils.cxx + MED_Structures.cxx + MED_Utilities.cxx + MED_Wrapper.cxx +) + +# --- rules --- + +ADD_LIBRARY(MEDWrapper ${MEDWrapper_SOURCES}) +TARGET_LINK_LIBRARIES(MEDWrapper ${_link_LIBRARIES}) +INSTALL(TARGETS MEDWrapper EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS}) + +ADD_EXECUTABLE(mprint_version mprint_version.cxx) +TARGET_LINK_LIBRARIES(mprint_version ${MEDFILE_C_LIBRARIES}) +INSTALL(TARGETS mprint_version EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_BINS}) + +INSTALL(FILES ${MEDWrapper_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS}) diff --git a/src/MEDWrapper/Factory/CMakeLists.txt b/src/MEDWrapper/Factory/CMakeLists.txt deleted file mode 100644 index 0a84ab90e..000000000 --- a/src/MEDWrapper/Factory/CMakeLists.txt +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# - -# --- options --- -# additional include directories -INCLUDE_DIRECTORIES( - ${HDF5_INCLUDE_DIRS} - ${Boost_INCLUDE_DIRS} - ${MEDFILE_INCLUDE_DIRS} - ${KERNEL_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR}/../Base - ${CMAKE_CURRENT_SOURCE_DIR}/../V2_2 -) - -# additional preprocessor / compiler flags -ADD_DEFINITIONS( - ${HDF5_DEFINITIONS} - ${BOOST_DEFINITIONS} -) - -SET(_link_LIBRARIES - MEDWrapperBase - MEDWrapper_V2_2 - ${Boost_LIBRARIES} - ${MEDFILE_C_LIBRARIES} -) - -# --- headers --- - -# header files / no moc processing -SET(MEDWrapper_HEADERS - MED_Factory.hxx - MED_WrapperFactory.hxx -) - -# --- sources --- - -# sources / static -SET(MEDWrapper_SOURCES - MED_Factory.cxx -) - -# --- rules --- - -ADD_LIBRARY(MEDWrapper ${MEDWrapper_SOURCES}) -TARGET_LINK_LIBRARIES(MEDWrapper ${_link_LIBRARIES} ${MED_medloader} ) -INSTALL(TARGETS MEDWrapper EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS}) - -ADD_EXECUTABLE(mprint_version mprint_version.cxx) -TARGET_LINK_LIBRARIES(mprint_version ${_link_LIBRARIES} MEDWrapper) - -ADD_EXECUTABLE(MED_Test MED_Test.cxx) -TARGET_LINK_LIBRARIES(MED_Test ${_link_LIBRARIES} MEDWrapper) - -INSTALL(TARGETS mprint_version MED_Test EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_BINS}) - -INSTALL(FILES ${MEDWrapper_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS}) diff --git a/src/MEDWrapper/Factory/MED_Factory.cxx b/src/MEDWrapper/Factory/MED_Factory.cxx deleted file mode 100644 index 49d47fad5..000000000 --- a/src/MEDWrapper/Factory/MED_Factory.cxx +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#include "MED_Factory.hxx" -#include "MED_Utilities.hxx" -#include "MED_V2_2_Wrapper.hxx" - -#include -#include -#include - -#include -extern "C" -{ -#ifndef WIN32 - #include -#endif -} - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -namespace MED -{ - - EVersion GetVersionId(const std::string& theFileName, - bool theDoPreCheckInSeparateProcess) - { - INITMSG(MYDEBUG,"GetVersionId - theFileName = '"<&1 > /dev/null"; - - std::string aCommand = aStr.str(); - int aStatus = system(aCommand.c_str()); - - BEGMSG( MYDEBUG,"aCommand = '" << aCommand << "'; aStatus = " << aStatus - << "; errno = " << errno << " = " << strerror( errno ) << std::endl ); - if ( aStatus != 0 && errno != EAGAIN && errno != ENOMEM ) // "Cannot allocate memory" is OK - return aVersion; - } -#endif - // check compatibility of hdf and med versions - med_bool hdfok, medok; - MEDfileCompatibility(theFileName.c_str(), &hdfok, &medok); - if ((!hdfok) /*|| (!medok)*/) // med-2.1 is KO since med-3.0.0 - return aVersion; - - // Next, try to open the file trough the MED API - const char* aFileName = theFileName.c_str(); - med_idt aFid = MEDfileOpen(aFileName,MED_ACC_RDONLY); - - MSG(MYDEBUG,"GetVersionId - theFileName = '"<GetNbProfiles() = "<GetNbProfiles()<GetNbMeshes(); - BEGMSG(MYDEBUG,"GetNbMeshes() = "<GetPMeshInfo(iMesh); - INITMSG(MYDEBUG,"aMeshInfo->GetName() = '"<GetName()<<"'"<GetEntityInfo(aMeshInfo); - - TEntity2TGeom2ElemInfo anEntity2TGeom2ElemInfo = - GetEntity2TGeom2ElemInfo(aMed,aMeshInfo,aEntityInfo); - - TFieldInfo2TimeStampInfoSet aFieldInfo2TimeStampInfoSet = - GetFieldInfo2TimeStampInfoSet(aMed,aMeshInfo,aEntityInfo); - - TEntite2TFieldInfo2TimeStampInfoSet anEntite2TFieldInfo2TimeStampInfoSet = - GetEntite2TFieldInfo2TimeStampInfoSet(aFieldInfo2TimeStampInfoSet); - - TEntite2TFieldInfo2TimeStampInfoSet::const_iterator anEntite2TFieldInfo2TimeStampInfoSetIter = - anEntite2TFieldInfo2TimeStampInfoSet.begin(); - for(; anEntite2TFieldInfo2TimeStampInfoSetIter != anEntite2TFieldInfo2TimeStampInfoSet.end(); anEntite2TFieldInfo2TimeStampInfoSetIter++){ - const TFieldInfo2TimeStampInfoSet& aFieldInfo2TimeStampInfoSet = anEntite2TFieldInfo2TimeStampInfoSetIter->second; - TFieldInfo2TimeStampInfoSet::const_iterator aFieldInfo2TimeStampInfoSetIter = aFieldInfo2TimeStampInfoSet.begin(); - for(; aFieldInfo2TimeStampInfoSetIter != aFieldInfo2TimeStampInfoSet.end(); aFieldInfo2TimeStampInfoSetIter++){ - PFieldInfo aFieldInfo = aFieldInfo2TimeStampInfoSetIter->first; - INITMSG(MYDEBUG, - "GetPFieldInfo "<< - "- aName = '"<GetName()<<"'"<< - "; aType = "<GetType()<< - "; aNbComp = "<GetNbComp()<< - std::endl); - const TTimeStampInfoSet& aTimeStampInfoSet = aFieldInfo2TimeStampInfoSetIter->second; - TTimeStampInfoSet::const_iterator aTimeStampInfoSettIter = aTimeStampInfoSet.begin(); - for(; aTimeStampInfoSettIter != aTimeStampInfoSet.end(); aTimeStampInfoSettIter++){ - PTimeStampInfo aTimeStampInfo = *aTimeStampInfoSettIter; - INITMSG(MYDEBUG, - "GetPTimeStampInfo "<< - "- anEntity = "<GetEntity()<< - "; aNumDt = "<GetNumDt()<< - std::endl); - PTimeStampValueBase aTimeStampValue = - aMed->GetPTimeStampValue(aTimeStampInfo, - aMKey2Profile, - aKey2Gauss); - } - } - } - - continue; - - TFamilyInfoSet aFamilyInfoSet = GetFamilyInfoSet(aMed,aMeshInfo); - - TEntity2FamilySet aEntity2FamilySet = - GetEntity2FamilySet(aMed,anEntity2TGeom2ElemInfo,aFamilyInfoSet); - - TGroupInfo aGroupInfo = GetGroupInfo(aFamilyInfoSet); - - PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo); - TEntity2TGeom2ElemInfo::const_iterator anIter = anEntity2TGeom2ElemInfo.begin(); - for(; anIter != anEntity2TGeom2ElemInfo.end(); anIter++){ - const EEntiteMaillage& anEntity = anIter->first; - if(anEntity != eNOEUD){ - const TGeom2ElemInfo& aGeom2ElemInfo = anIter->second; - TKey2Gauss::const_iterator anIter2 = aKey2Gauss.begin(); - for(; anIter2 != aKey2Gauss.end(); anIter2++){ - const TGaussInfo::TKey& aKey = anIter2->first; - EGeometrieElement aGeom = boost::get<0>(aKey); - TGeom2ElemInfo::const_iterator anIter3 = aGeom2ElemInfo.find(aGeom); - if(anIter3 != aGeom2ElemInfo.end()){ - if(PCellInfo aCellInfo = anIter3->second){ - PGaussInfo aGaussInfo = anIter2->second; - TGaussCoord aGaussCoord; - GetGaussCoord3D(aGaussInfo,aCellInfo,aNodeInfo,aGaussCoord); - } - } - } - } - } - - } - } - MSG(MYDEBUG,"OK"); -} - - -void CopyMed(const PWrapper& theMed, - const PWrapper& theMed2, - int theIncr) -{ - TKey2Gauss aKey2Gauss = GetKey2Gauss(theMed); - TMKey2Profile aMKey2Profile = GetMKey2Profile(theMed); - - TInt aNbMeshes = theMed->GetNbMeshes(); - MSG(MYDEBUG,"aNbMeshes = "<GetPMeshInfo(iMesh+1); -#ifdef _DEBUG_ - TInt aDim = aMeshInfo->myDim; - aName = aMeshInfo->GetName(); - INITMSG(MYDEBUG,"GetMeshInfo - aName = '"<CrMeshInfo(aMeshInfo); - if(MYWRITEDEBUG){ - aName = aMeshInfo2->GetName(); - - aName[0] += theIncr; - aMeshInfo2->SetName(aName); - theMed2->SetMeshInfo(aMeshInfo2); - BEGMSG(MYDEBUG,"aNbMeshes2 = "<GetNbMeshes()<<"\n"); - } - - TEntityInfo aEntityInfo = theMed->GetEntityInfo(aMeshInfo); - - //continue; - - TInt aNbFields = theMed->GetNbFields(); - MSG(MYDEBUG,"GetNbFields() = "<GetPFieldInfo(aMeshInfo,iField+1); -#ifdef _DEBUG_ - TInt aNbComp = aFieldInfo->GetNbComp(); - INITMSG(MYDEBUG,"aName = '"<GetName()<<"'; aNbComp = "<CrFieldInfo(aMeshInfo2,aFieldInfo); - - if(MYWRITEDEBUG){ - aName = aFieldInfo->GetName(); - aName[0] += theIncr; - aFieldInfo2->SetName(aName); - theMed2->SetFieldInfo(aFieldInfo2); - } - - EEntiteMaillage anEntity; - TGeom2Size aGeom2Size; - TInt aNbTimeStamps = - theMed->GetNbTimeStamps(aFieldInfo,aEntityInfo,anEntity,aGeom2Size); - { - INITMSG(MYDEBUG,"GetNbTimeStamps = "<GetPTimeStampInfo(aFieldInfo,anEntity,aGeom2Size,iTimeStamp+1); -#ifdef _DEBUG_ - TInt aNumDt = aTimeStampInfo->GetNumDt(); - INITMSG(MYDEBUG,"aNumDt = "<CrTimeStampInfo(aFieldInfo2,aTimeStampInfo); - - PTimeStampValueBase aTimeStampValue = - theMed->GetPTimeStampValue(aTimeStampInfo, - aMKey2Profile, - aKey2Gauss); - - PTimeStampValueBase aTimeStampValue2 = - theMed->CrTimeStampValue(aTimeStampInfo2, - aTimeStampValue); - - if(MYWRITEDEBUG) theMed2->SetTimeStamp(aTimeStampValue2); - } - } - } - - TInt aNbFam = theMed->GetNbFamilies(aMeshInfo); - MSG(MYDEBUG,"GetNbFamilies() = "<GetPFamilyInfo(aMeshInfo,iFam+1); - TInt aNbGroup = aFamilyInfo->GetNbGroup(); -#ifdef _DEBUG_ - TInt aNbAttr = aFamilyInfo->GetNbAttr(); -#endif - TInt anId = aFamilyInfo->GetId(); - if(anId == 0) - continue; - - aName = aFamilyInfo->GetName(); -#ifdef _DEBUG_ - INITMSG(MYDEBUG,"aName = '"<CrFamilyInfo(aMeshInfo2,aFamilyInfo); - for(TInt iGroup = 0; iGroup < aNbGroup; iGroup++){ - aName = aFamilyInfo->GetGroupName(iGroup); - INITMSG(MYDEBUG,"aGroupName = '"<SetGroupName(iGroup,aName); - } - - if(MYWRITEDEBUG){ - aName = aFamilyInfo->GetName(); - aName[0] += theIncr; - aFamilyInfo2->SetName(aName); - theMed2->SetFamilyInfo(aFamilyInfo2); - INITMSG(MYDEBUG,"GetNbFamilies = "<GetNbFamilies(aMeshInfo2)<GetPNodeInfo(aMeshInfo); - PNodeInfo aNodeInfo2 = theMed->CrNodeInfo(aMeshInfo2,aNodeInfo); - if(MYWRITEDEBUG) theMed2->SetNodeInfo(aNodeInfo2); - continue; - } - TGeom2Size& aGeom2Size = anEntityInfoIter->second; - TGeom2Size::iterator aGeomIter = aGeom2Size.begin(); - for(; aGeomIter != aGeom2Size.end(); aGeomIter++){ - const EGeometrieElement& aGeom = aGeomIter->first; -#ifdef _DEBUG_ - const TInt& aNbElem = aGeomIter->second; - INITMSG(MYDEBUG,"aGeom = "<GetPPolygoneInfo(aMeshInfo,anEntity,aGeom); - PPolygoneInfo aPolygoneInfo2 = theMed->CrPolygoneInfo(aMeshInfo2,aPolygoneInfo); - if(MYWRITEDEBUG) theMed2->SetPolygoneInfo(aPolygoneInfo2); - break; - } - case ePOLYEDRE: { - PPolyedreInfo aPolyedreInfo = theMed->GetPPolyedreInfo(aMeshInfo,anEntity,aGeom); - PPolyedreInfo aPolyedreInfo2 = theMed->CrPolyedreInfo(aMeshInfo2,aPolyedreInfo); - if(MYWRITEDEBUG) theMed2->SetPolyedreInfo(aPolyedreInfo2); - break; - } - default: - PCellInfo aCellInfo = theMed->GetPCellInfo(aMeshInfo,anEntity,aGeom); - PCellInfo aCellInfo2 = theMed2->CrCellInfo(aMeshInfo2,aCellInfo); - if(MYWRITEDEBUG) theMed2->SetCellInfo(aCellInfo2); - } - } - } - - } - MSG(MYDEBUG,"OK"); -} - - -void CopyMed(const std::string& theFileName, - const std::string& theFileName2, - MED::EVersion theVersion, - int theNbCopy) -{ - MSG(MYDEBUG,"CopyMed - theFileName = '"< - -#include -#include - -int main (int argc, char **argv) -{ - med_idt aFid = MEDfileOpen(argv[1],MED_ACC_RDONLY); - if(aFid < 0) - exit(1); - - med_int aMajor, aMinor, aRelease; - med_err aRet = MEDfileNumVersionRd(aFid,&aMajor,&aMinor,&aRelease); - MEDfileClose(aFid); - if(aRet < 0) { - // VSR: simulate med 2.3.6 behavior, med file version is assumed to 2.1 - aMajor=2; - aMinor=aRelease=-1; - } - - printf("%d.%d.%d\n",aMajor,aMinor,aRelease); -} diff --git a/src/MEDWrapper/MED_Algorithm.cxx b/src/MEDWrapper/MED_Algorithm.cxx new file mode 100644 index 000000000..e48654aa2 --- /dev/null +++ b/src/MEDWrapper/MED_Algorithm.cxx @@ -0,0 +1,373 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_Algorithm.hxx" +#include "MED_Wrapper.hxx" +#include "MED_Utilities.hxx" + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +static int MYVALUEDEBUG = 0; +#else +static int MYDEBUG = 0; +static int MYVALUEDEBUG = 0; +#endif + +namespace MED +{ + //--------------------------------------------------------------- + TEntity2TGeom2ElemInfo + GetEntity2TGeom2ElemInfo(const PWrapper& theWrapper, + const PMeshInfo& theMeshInfo, + const MED::TEntityInfo& theEntityInfo) + { + MSG(MYDEBUG,"GetElemsByEntity(...)"); + TEntity2TGeom2ElemInfo anEntity2TGeom2ElemInfo; + MED::TEntityInfo::const_iterator anIter = theEntityInfo.begin(); + PElemInfo anElemInfo; + TErr anErr; + for(; anIter != theEntityInfo.end(); anIter++){ + const EEntiteMaillage& anEntity = anIter->first; + const TGeom2Size& aGeom2Size = anIter->second; + TGeom2ElemInfo& aGeom2ElemInfo = anEntity2TGeom2ElemInfo[anEntity]; + + if(anEntity == eNOEUD){ + aGeom2ElemInfo[ePOINT1] = theWrapper->GetPElemInfo(theMeshInfo); + continue; + } + + TGeom2Size::const_iterator anIter2 = aGeom2Size.begin(); + for(; anIter2 != aGeom2Size.end(); anIter2++){ + const EGeometrieElement& aGeom = anIter2->first; + aGeom2ElemInfo[aGeom] = theWrapper->GetPElemInfo(theMeshInfo,anEntity,aGeom,MED::eNOD,&anErr); + } + } + ADDMSG(MYDEBUG,"\n"); + return anEntity2TGeom2ElemInfo; + } + + //--------------------------------------------------------------- + TFamilyInfoSet + GetFamilyInfoSet(const PWrapper& theWrapper, + const PMeshInfo& theMeshInfo) + { + MSG(MYDEBUG,"GetFamilies(...)"); + TErr anErr; + TFamilyInfoSet aFamilyInfoSet; + TInt aNbFam = theWrapper->GetNbFamilies(*theMeshInfo); + INITMSG(MYDEBUG,"GetNbFamilies() = "<GetPFamilyInfo(theMeshInfo,iFam,&anErr); + if(anErr >= 0) + aFamilyInfoSet.insert(aFamilyInfo); + } + ADDMSG(MYDEBUG,"\n"); + return aFamilyInfoSet; + } + + //--------------------------------------------------------------- + TGroupInfo + GetGroupInfo(const TFamilyInfoSet& theFamilyInfoSet) + { + MSG(MYDEBUG,"GetFamiliesByGroup(...)"); + TGroupInfo aGroup; + TFamilyInfoSet::const_iterator anIter = theFamilyInfoSet.begin(); + for(; anIter != theFamilyInfoSet.end(); anIter++){ + const PFamilyInfo& aFamilyInfo = *anIter; + TInt aNbGroup = aFamilyInfo->GetNbGroup(); + for(TInt iGroup = 0; iGroup < aNbGroup; iGroup++){ + aGroup[aFamilyInfo->GetGroupName(iGroup)].insert(aFamilyInfo); + } + } + +#ifdef _DEBUG_ + if(MYDEBUG){ + TGroupInfo::const_iterator anIter = aGroup.begin(); + for(; anIter != aGroup.end(); anIter++){ + const std::string& aName = anIter->first; + INITMSG(MYDEBUG,"aGroupName = '"<second; + TFamilyInfoSet::const_iterator anFamIter = aFamilyInfoSet.begin(); + for(; anFamIter != aFamilyInfoSet.end(); anFamIter++){ + const PFamilyInfo& aFamilyInfo = *anFamIter; + INITMSG(MYDEBUG,"aFamilyName = '"<GetName()<<"'\n"); + } + } + ADDMSG(MYDEBUG,"\n"); + } +#endif + + return aGroup; + } + + //--------------------------------------------------------------- + TFieldInfo2TimeStampInfoSet + GetFieldInfo2TimeStampInfoSet(const PWrapper& theWrapper, + const PMeshInfo& theMeshInfo, + const MED::TEntityInfo& theEntityInfo) + { + MSG(MYDEBUG,"GetFieldsByEntity(...)"); + TFieldInfo2TimeStampInfoSet aFieldInfo2TimeStampInfoSet; + TInt aNbFields = theWrapper->GetNbFields(); + INITMSG(MYDEBUG,"GetNbFields() = "<GetPFieldInfo(theMeshInfo,iField); + INITMSG(MYDEBUG,"aFieldName = '"<GetName()<< + "'; aNbComp = "<GetNbComp()<<"; "); + TGeom2Size aGeom2Size; + EEntiteMaillage anEntity = EEntiteMaillage(-1); + TInt aNbTimeStamps = theWrapper->GetNbTimeStamps(aFieldInfo,theEntityInfo,anEntity,aGeom2Size); + ADDMSG(MYDEBUG,"anEntity = "<GetPTimeStampInfo(aFieldInfo,anEntity,aGeom2Size,iTimeStamp); + aFieldInfo2TimeStampInfoSet[aFieldInfo].insert(aTimeStamp); + INITMSG(MYDEBUG, + "aDt = "<GetDt()<< + ", Unit = \'"<GetUnitDt()<<"\n"); + } + } + ADDMSG(MYDEBUG,"\n"); + return aFieldInfo2TimeStampInfoSet; + } + + //--------------------------------------------------------------- + TEntite2TFieldInfo2TimeStampInfoSet + GetEntite2TFieldInfo2TimeStampInfoSet(const TFieldInfo2TimeStampInfoSet& theFieldInfo2TimeStampInfoSet) + { + TEntite2TFieldInfo2TimeStampInfoSet anEntite2TFieldInfo2TimeStampInfoSet; + TFieldInfo2TimeStampInfoSet::const_iterator anIter = theFieldInfo2TimeStampInfoSet.begin(); + for(; anIter != theFieldInfo2TimeStampInfoSet.end(); anIter++){ + const TTimeStampInfoSet& aTimeStampInfoSet = anIter->second; + //const PFieldInfo& aFieldInfo = anIter->first; + if(aTimeStampInfoSet.empty()) + continue; + const PTimeStampInfo& aTimeStampInfo = *aTimeStampInfoSet.begin(); + anEntite2TFieldInfo2TimeStampInfoSet[ConvertEntity(aTimeStampInfo->GetEntity())].insert(*anIter); + } + return anEntite2TFieldInfo2TimeStampInfoSet; + } + + //--------------------------------------------------------------- + bool + operator<(const TFamilyTSize& theLeft, const TFamilyTSize& theRight) + { + const MED::PFamilyInfo& aLeftInfo = boost::get<0>(theLeft); + const MED::PFamilyInfo& aRightInfo = boost::get<0>(theRight); + return aLeftInfo->GetId() < aRightInfo->GetId(); + } + + //--------------------------------------------------------------- + TEntity2FamilySet + GetEntity2FamilySet(const PWrapper& theWrapper, + const TEntity2TGeom2ElemInfo& theEntity2TGeom2ElemInfo, + const TFamilyInfoSet& theFamilyInfoSet) + { + MSG(MYDEBUG,"GetFamiliesByEntity(...)"); + TEntity2FamilySet anEntity2FamilySet; + + typedef std::map TId2Family; + TId2Family anId2Family; + TFamilyInfoSet::const_iterator anIter = theFamilyInfoSet.begin(); + for(; anIter != theFamilyInfoSet.end(); anIter++){ + const PFamilyInfo& aFamilyInfo = *anIter; + anId2Family.insert(TId2Family::value_type(aFamilyInfo->GetId(),aFamilyInfo)); + } + + if(!anId2Family.empty()){ + typedef std::map TFamilyID2Size; + typedef std::map TEntity2FamilyID; + TEntity2FamilyID anEntity2FamilyID; + + if(!theEntity2TGeom2ElemInfo.empty()){ + TEntity2TGeom2ElemInfo::const_iterator anIter = theEntity2TGeom2ElemInfo.begin(); + for(; anIter != theEntity2TGeom2ElemInfo.end(); anIter++){ + const EEntiteMaillage& anEntity = anIter->first; + TFamilyID2Size& aFamilyID2Size = anEntity2FamilyID[anEntity]; + const TGeom2ElemInfo& aGeom2ElemInfo = anIter->second; + TGeom2ElemInfo::const_iterator aGeom2ElemInfoIter = aGeom2ElemInfo.begin(); + for(; aGeom2ElemInfoIter != aGeom2ElemInfo.end(); aGeom2ElemInfoIter++){ + const PElemInfo& aElemInfo = aGeom2ElemInfoIter->second; + if(TInt aNbElem = aElemInfo->GetNbElem()){ + for(TInt i = 0; i < aNbElem; i++){ + aFamilyID2Size[aElemInfo->GetFamNum(i)] += 1; + } + } + } + } + } + + if(!anEntity2FamilyID.empty()){ + TEntity2FamilyID::const_iterator anIter = anEntity2FamilyID.begin(); + for(; anIter != anEntity2FamilyID.end(); anIter++){ + const EEntiteMaillage& anEntity = anIter->first; + INITMSG(MYDEBUG,"anEntity = "<second; + TFamilyID2Size::const_iterator anIter2 = aFamilyID2Size.begin(); + for(; anIter2 != aFamilyID2Size.end(); anIter2++){ + TInt anId = anIter2->first; + TInt aSize = anIter2->second; + TId2Family::const_iterator anIter3 = anId2Family.find(anId); + if(anIter3 != anId2Family.end()){ + const PFamilyInfo& aFamilyInfo = anIter3->second; + anEntity2FamilySet[anEntity].insert(TFamilyTSize(aFamilyInfo,aSize)); + INITMSG(MYDEBUG, + "aFamilyName = '"<GetName()<< + "' anId = "<GetId()<<"\n"); + } + } + } + } + } + ADDMSG(MYDEBUG,"\n"); + return anEntity2FamilySet; + } + + //--------------------------------------------------------------- + TKey2Gauss + GetKey2Gauss(const PWrapper& theWrapper, + TErr* theErr, + EModeSwitch theMode) + { + INITMSG(MYDEBUG,"GetKey2Gauss - theMode = "<GetNbGauss(theErr); + for(TInt anId = 1; anId <= aNbGauss; anId++){ + TGaussInfo::TInfo aPreInfo = theWrapper->GetGaussPreInfo(anId); + PGaussInfo anInfo = theWrapper->CrGaussInfo(aPreInfo,theMode); + theWrapper->GetGaussInfo(anId,anInfo,theErr); + TGaussInfo::TKey aKey = boost::get<0>(aPreInfo); + aKey2Gauss[aKey] = anInfo; + +#ifdef _DEBUG_ + const EGeometrieElement& aGeom = boost::get<0>(aKey); + const std::string& aName = boost::get<1>(aKey); + INITMSG(MYDEBUG, + "- aGeom = "<GetNbProfiles(theErr); + for(TInt anId = 1; anId <= aNbProfiles; anId++){ + TProfileInfo::TInfo aPreInfo = theWrapper->GetProfilePreInfo(anId); + const std::string& aName = boost::get<0>(aPreInfo); + if(aName == theProfileName) + return theWrapper->GetPProfileInfo(anId,theMode,theErr); + } + return anInfo; + } + + //--------------------------------------------------------------- + TMKey2Profile + GetMKey2Profile(const PWrapper& theWrapper, + TErr* theErr, + EModeProfil theMode) + { + INITMSG(MYDEBUG,"GetMKey2Profile - theMode = "<GetNbProfiles(theErr); + for(TInt anId = 1; anId <= aNbProfiles; anId++){ + TProfileInfo::TInfo aPreInfo = theWrapper->GetProfilePreInfo(anId); + PProfileInfo anInfo = theWrapper->GetPProfileInfo(anId,theMode,theErr); + const std::string& aName = boost::get<0>(aPreInfo); + aKey2Profile[aName] = anInfo; + +#ifdef _DEBUG_ + INITMSG(MYDEBUG, + "- aName = '"<GetSize(); + for(TInt iElem = 0; iElem < aNbElem; iElem++){ + ADDMSG(MYVALUEDEBUG,anInfo->GetElemNum(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); +#endif + + } + return TMKey2Profile(theMode,aKey2Profile); + } + + //--------------------------------------------------------------- + EEntiteMaillage + GetEntityByFamilyId(PGrilleInfo& theInfo, + TInt theId) + { + TElemNum::iterator aNodeFamIter = (theInfo->myFamNumNode).begin(); + for(;aNodeFamIter != (theInfo->myFamNumNode).end(); aNodeFamIter++){ + if(theId == *aNodeFamIter) + return eNOEUD; + } + TElemNum::iterator aCellFamIter = (theInfo->myFamNum).begin(); + for(;aCellFamIter != (theInfo->myFamNum).end(); aCellFamIter++){ + if(theId == *aCellFamIter) + return eMAILLE; + } + EXCEPTION(std::runtime_error, "GetEntityByFamilyId - fails"); + return EEntiteMaillage(-1); + } + + //--------------------------------------------------------------- + TFamilyID2NbCells + GetFamilyID2NbCells(PGrilleInfo& theInfo) + { + TFamilyID2NbCells aFamily2NbCells; + TInt aNbNodes = theInfo->myFamNumNode.size(); + TInt aNbCells = theInfo->myFamNum.size(); + for(TInt i=0; iGetFamNumNode(i)] = 0; + for(TInt i=0; iGetFamNum(i)] = 0; + for(TInt i=0; iGetFamNumNode(i)] += 1; + for(TInt i=0; iGetFamNum(i)] += 1; + return aFamily2NbCells; + } + + //--------------------------------------------------------------- + EEntiteMaillage + ConvertEntity(const EEntiteMaillage& aEntity) + { + switch( aEntity ){ + case eNOEUD_ELEMENT: + case eMAILLE: + return eMAILLE; // eNOEUD_ELEMENT is eMAILLE + case eFACE: + case eARETE: + case eNOEUD: + return aEntity; + default: + break; + } + return EEntiteMaillage(-1); + } +} diff --git a/src/MEDWrapper/MED_Algorithm.hxx b/src/MEDWrapper/MED_Algorithm.hxx new file mode 100644 index 000000000..0ecadad6b --- /dev/null +++ b/src/MEDWrapper/MED_Algorithm.hxx @@ -0,0 +1,146 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_Algorithm_HeaderFile +#define MED_Algorithm_HeaderFile + +#include "MED_WrapperDef.hxx" +#include "MED_Structures.hxx" + +#include + +#include +#include + +namespace MED +{ + //--------------------------------------------------------------- + typedef std::map TGeom2ElemInfo; + typedef std::map TEntity2TGeom2ElemInfo; + typedef std::set TFamilyInfoSet; + typedef std::map TGroupInfo; + typedef boost::tuple TFamilyTSize; + typedef std::set TFamilyTSizeSet; + typedef std::map TEntity2FamilySet; + typedef std::set TTimeStampInfoSet; + typedef std::map TFieldInfo2TimeStampInfoSet; + typedef std::map TEntite2TFieldInfo2TimeStampInfoSet; + typedef std::map TKey2Gauss; + typedef std::map TKey2Profile; + typedef boost::tuple TMKey2Profile; + typedef std::map TFamilyID2NbCells; + + //--------------------------------------------------------------- + //! Get set of TElemInfo by its geometrical type and corresponding MED ENTITY + MEDWRAPPER_EXPORT + TEntity2TGeom2ElemInfo + GetEntity2TGeom2ElemInfo(const PWrapper& theWrapper, + const PMeshInfo& theMeshInfo, + const MED::TEntityInfo& theEntityInfo); + + //--------------------------------------------------------------- + //! Read set of MED FAMILIES for defined MED file + MEDWRAPPER_EXPORT + TFamilyInfoSet + GetFamilyInfoSet(const PWrapper& theWrapper, + const PMeshInfo& theMeshInfo); + + //--------------------------------------------------------------- + //! Compare two MED FAMILIES + MEDWRAPPER_EXPORT + bool + operator<(const TFamilyTSize& theLeft, const TFamilyTSize& theRight); + + //--------------------------------------------------------------- + //! Split set of MED FAMILIES by corresponding MED ENTITY + MEDWRAPPER_EXPORT + TEntity2FamilySet + GetEntity2FamilySet(const PWrapper& theWrapper, + const TEntity2TGeom2ElemInfo& theEntity2TGeom2ElemInfo, + const TFamilyInfoSet& theFamilyInfoSet); + + //--------------------------------------------------------------- + //! Split the input set of MED FAMILIES by corresponding MED GROUPS + MEDWRAPPER_EXPORT + TGroupInfo + GetGroupInfo(const TFamilyInfoSet& theFamilyInfoSet); + + //--------------------------------------------------------------- + //! Read set of MED TIMESTAMPS groupped by corresponding MED FIELDS + MEDWRAPPER_EXPORT + TFieldInfo2TimeStampInfoSet + GetFieldInfo2TimeStampInfoSet(const PWrapper& theWrapper, + const PMeshInfo& theMeshInfo, + const MED::TEntityInfo& theEntityInfo); + + //--------------------------------------------------------------- + //! Split the input set of MED TIMESTAMPS by corresponding MED FIELDS and MED ENTITIES + MEDWRAPPER_EXPORT + TEntite2TFieldInfo2TimeStampInfoSet + GetEntite2TFieldInfo2TimeStampInfoSet(const TFieldInfo2TimeStampInfoSet& theFieldInfo2TimeStampInfoSet); + + //--------------------------------------------------------------- + //! Read set of MED GAUSS + MEDWRAPPER_EXPORT + TKey2Gauss + GetKey2Gauss(const PWrapper& theWrapper, + TErr* theErr = NULL, + EModeSwitch theMode = eFULL_INTERLACE); + + //--------------------------------------------------------------- + //! Get MED PROFILE by its name + MEDWRAPPER_EXPORT + PProfileInfo + GetProfileInfo(const PWrapper& theWrapper, + const std::string& theProfileName, + TErr* theErr = NULL, + EModeProfil theMode = eCOMPACT); + + //--------------------------------------------------------------- + //! Read set of MED PROFILES + MEDWRAPPER_EXPORT + TMKey2Profile + GetMKey2Profile(const PWrapper& theWrapper, + TErr* theErr = NULL, + EModeProfil theMode = eCOMPACT); + + //--------------------------------------------------------------- + //! Get Entity for Grille by family id. + MEDWRAPPER_EXPORT + EEntiteMaillage + GetEntityByFamilyId(PGrilleInfo& theInfo, + TInt theId); + + //--------------------------------------------------------------- + //! Get Number of cells for theId family, for Grille + MEDWRAPPER_EXPORT + TFamilyID2NbCells + GetFamilyID2NbCells(PGrilleInfo& theInfo); + + //--------------------------------------------------------------- + //! Convert eNOEUD_ELEMENT to eMAILLE + MEDWRAPPER_EXPORT + EEntiteMaillage + ConvertEntity(const EEntiteMaillage& aEntity); +} + +#endif // MED_Algorithm_HeaderFile diff --git a/src/MEDWrapper/MED_Common.cxx b/src/MEDWrapper/MED_Common.cxx new file mode 100644 index 000000000..8eb8db747 --- /dev/null +++ b/src/MEDWrapper/MED_Common.cxx @@ -0,0 +1,121 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_Common.hxx" +#include + +namespace MED +{ + TInt + GetDESCLength() + { + return 200; + } + + TInt + GetIDENTLength() + { + return 8; + } + + TInt + GetNOMLength() + { + return 64; + } + + TInt + GetLNOMLength() + { + return 80; + } + + TInt + GetPNOMLength() + { + return 16; + } + + void + GetVersionRelease(TInt& major, TInt& minor, TInt& release) + { + major = MED_MAJOR_NUM; + minor = MED_MINOR_NUM; + release = MED_RELEASE_NUM; + } + + TInt + GetNbConn(EGeometrieElement typmai, + EEntiteMaillage typent, + TInt mdim) + { + return typmai % 100; + } + + TInt + GetNbNodes(EGeometrieElement typmai) + { + return typmai % 100; + } + + const MED::TEntity2GeomSet& GetEntity2GeomSet() + { + static MED::TEntity2GeomSet Entity2GeomSet; + + if ( Entity2GeomSet.empty() ) { + TGeomSet& aGeomARETESet = Entity2GeomSet[MED::eARETE]; + aGeomARETESet.insert(MED::eSEG2); + aGeomARETESet.insert(MED::eSEG3); + + TGeomSet& aGeomFACESet = Entity2GeomSet[MED::eFACE]; + aGeomFACESet.insert(MED::eTRIA3); + aGeomFACESet.insert(MED::eQUAD4); + aGeomFACESet.insert(MED::eTRIA6); + aGeomFACESet.insert(MED::eTRIA7); + aGeomFACESet.insert(MED::eQUAD8); + aGeomFACESet.insert(MED::eQUAD9); + aGeomFACESet.insert(MED::ePOLYGONE); + aGeomFACESet.insert(MED::ePOLYGON2); + + TGeomSet& aGeomMAILLESet = Entity2GeomSet[MED::eMAILLE]; + aGeomMAILLESet.insert(MED::ePOINT1); + aGeomMAILLESet.insert(aGeomARETESet.begin(), aGeomARETESet.end()); + aGeomMAILLESet.insert(aGeomFACESet.begin(), aGeomFACESet.end()); + aGeomMAILLESet.insert(MED::eTETRA4); + aGeomMAILLESet.insert(MED::ePYRA5); + aGeomMAILLESet.insert(MED::ePENTA6); + aGeomMAILLESet.insert(MED::eHEXA8); + aGeomMAILLESet.insert(MED::eOCTA12); + aGeomMAILLESet.insert(MED::eTETRA10); + aGeomMAILLESet.insert(MED::ePYRA13); + aGeomMAILLESet.insert(MED::ePENTA15); + aGeomMAILLESet.insert(MED::eHEXA20); + aGeomMAILLESet.insert(MED::eHEXA27); + aGeomMAILLESet.insert(MED::ePOLYEDRE); + + /* This combination allows reading nb of models of structure elements */ + Entity2GeomSet[MED::eSTRUCT_ELEMENT].insert(MED::eAllGeoType); + } + + return Entity2GeomSet; + } +} diff --git a/src/MEDWrapper/MED_Common.hxx b/src/MEDWrapper/MED_Common.hxx new file mode 100644 index 000000000..798585d8e --- /dev/null +++ b/src/MEDWrapper/MED_Common.hxx @@ -0,0 +1,174 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_Common_HeaderFile +#define MED_Common_HeaderFile + +#include "MED_WrapperDef.hxx" +#include "MED_Vector.hxx" +#include "MED_SharedPtr.hxx" + +#include +#include +#include + +#include + +#ifdef WIN32 +#pragma warning(disable:4099) +#endif + +namespace MED +{ + typedef enum {eFAUX, eVRAI} EBooleen; + typedef double TFloat; +#if defined(HAVE_F77INT64) + typedef long TInt; +#else + typedef int TInt; +#endif + typedef hid_t TIdt; + typedef herr_t TErr; + + typedef enum {eFULL_INTERLACE, eNO_INTERLACE} EModeSwitch; + + typedef enum {eFLOAT64=6, eINT=24, eLONG=26} ETypeChamp; + + typedef enum {eNON_STRUCTURE, eSTRUCTURE} EMaillage; + + typedef enum {eCART, eCYL, eSPHER} ERepere; + + typedef enum {eNOD, eDESC} EConnectivite; + + typedef enum {ePOINT1=1, eSEG2=102, eSEG3=103, eTRIA3=203, + eQUAD4=204, eTRIA6=206, eTRIA7=207, eQUAD8=208, eQUAD9=209, eTETRA4=304, + ePYRA5=305, ePENTA6=306, eHEXA8=308, eOCTA12=312, eTETRA10=310, + ePYRA13=313, ePENTA15=315, eHEXA20=320, eHEXA27=327, + ePOLYGONE=400, ePOLYGON2=420, ePOLYEDRE=500, eNONE=0, + eBALL=1101, // no such a type in med.h, it's just a trick + eAllGeoType=-1} EGeometrieElement; + + typedef enum {eMAILLE, eFACE, eARETE, eNOEUD, eNOEUD_ELEMENT, eSTRUCT_ELEMENT} EEntiteMaillage; + + typedef enum {eNO_PFLMOD, eGLOBAL, eCOMPACT} EModeProfil; + + typedef enum {eGRILLE_CARTESIENNE, eGRILLE_POLAIRE, eGRILLE_STANDARD} EGrilleType; + + typedef enum {eCOOR, eCONN, eNOM, eNUM, eFAM, eCOOR_IND1, eCOOR_IND2, eCOOR_IND3} ETable; + + typedef TVector TIntVector; + typedef TVector TFloatVector; + typedef TVector TStringVector; + typedef std::set TStringSet; + + typedef std::map TGeom2Size; + typedef std::map TEntityInfo; + + typedef std::set TGeomSet; + typedef std::map TEntity2GeomSet; + + struct TNameInfo; + typedef SharedPtr PNameInfo; + + struct TMeshInfo; + typedef SharedPtr PMeshInfo; + + struct TFamilyInfo; + typedef SharedPtr PFamilyInfo; + + struct TElemInfo; + typedef SharedPtr PElemInfo; + + struct TNodeInfo; + typedef SharedPtr PNodeInfo; + + struct TPolygoneInfo; + typedef SharedPtr PPolygoneInfo; + + struct TPolyedreInfo; + typedef SharedPtr PPolyedreInfo; + + struct TCellInfo; + typedef SharedPtr PCellInfo; + + struct TBallInfo; + typedef SharedPtr PBallInfo; + + struct TFieldInfo; + typedef SharedPtr PFieldInfo; + + struct TTimeStampInfo; + typedef SharedPtr PTimeStampInfo; + + struct TProfileInfo; + typedef SharedPtr PProfileInfo; + + struct TGaussInfo; + typedef SharedPtr PGaussInfo; + + class TGrilleInfo; + typedef SharedPtr PGrilleInfo; + + struct TTimeStampValueBase; + typedef SharedPtr PTimeStampValueBase; + + struct TWrapper; + typedef SharedPtr PWrapper; + + MEDWRAPPER_EXPORT + TInt + GetDESCLength(); + + MEDWRAPPER_EXPORT + TInt + GetIDENTLength(); + + MEDWRAPPER_EXPORT + TInt + GetNOMLength(); + + MEDWRAPPER_EXPORT + TInt + GetLNOMLength(); + + MEDWRAPPER_EXPORT + TInt + GetPNOMLength(); + + MEDWRAPPER_EXPORT + void + GetVersionRelease(TInt&, TInt&, TInt&); + + MEDWRAPPER_EXPORT + TInt + GetNbConn(EGeometrieElement, EEntiteMaillage, TInt); + + MEDWRAPPER_EXPORT + TInt + GetNbNodes(EGeometrieElement typmai); + + MEDWRAPPER_EXPORT + const TEntity2GeomSet& + GetEntity2GeomSet(); +} + +#endif // MED_Common_HeaderFile diff --git a/src/MEDWrapper/MED_CoordUtils.cxx b/src/MEDWrapper/MED_CoordUtils.cxx new file mode 100644 index 000000000..889d8c87f --- /dev/null +++ b/src/MEDWrapper/MED_CoordUtils.cxx @@ -0,0 +1,156 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_CoordUtils.hxx" +#include "MED_Utilities.hxx" + +namespace MED +{ + enum ECoordName{eX, eY, eZ, eNone}; + + template + TFloat + GetCoord(const TCCoordSlice& theCoordSlice) + { + return theCoordSlice[TCoordId]; + } + + template<> + TFloat + GetCoord(const TCCoordSlice& theCoordSlice) + { + return 0.0; + } + + TGetCoord + aXYZGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord + }; + + TGetCoord + aXYGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord + }; + + TGetCoord + aYZGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord + }; + + TGetCoord + aXZGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord + }; + + TGetCoord + aXGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord + }; + + TGetCoord + aYGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord + }; + + TGetCoord + aZGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord + }; + + //--------------------------------------------------------------- + TCoordHelper + ::TCoordHelper(TGetCoord* theGetCoord): + myGetCoord(theGetCoord) + {} + + TFloat + TCoordHelper + ::GetCoord(TCCoordSlice& theCoordSlice, + TInt theCoordId) + { + return (*myGetCoord[theCoordId])(theCoordSlice); + } + + //--------------------------------------------------------------- + PCoordHelper + GetCoordHelper(PNodeInfo theNodeInfo) + { + PCoordHelper aCoordHelper; + { + PMeshInfo aMeshInfo = theNodeInfo->GetMeshInfo(); + TInt aMeshDimension = aMeshInfo->GetDim(); + bool anIsDimPresent[3] = {false, false, false}; + for(int iDim = 0; iDim < aMeshDimension; iDim++){ + // PAL16857(SMESH not conform to the MED convention) -> + // 1D - always along X + // 2D - always in XOY plane + anIsDimPresent[iDim] = iDim < aMeshDimension; +// std::string aName = theNodeInfo->GetCoordName(iDim); +// if ( aName.size() > 1 ) // PAL12148, aName has size 8 or 16 +// aName = aName.substr(0,1); +// if(aName == "x" || aName == "X") +// anIsDimPresent[eX] = true; +// else if(aName == "y" || aName == "Y") +// anIsDimPresent[eY] = true; +// else if(aName == "z" || aName == "Z") +// anIsDimPresent[eZ] = true; + } + + switch(aMeshDimension){ + case 3: + aCoordHelper.reset(new TCoordHelper(aXYZGetCoord)); + break; + case 2: + if(anIsDimPresent[eY] && anIsDimPresent[eZ]) + aCoordHelper.reset(new TCoordHelper(aYZGetCoord)); + else if(anIsDimPresent[eX] && anIsDimPresent[eZ]) + aCoordHelper.reset(new TCoordHelper(aXZGetCoord)); + else + aCoordHelper.reset(new TCoordHelper(aXYGetCoord)); + break; + case 1: + if(anIsDimPresent[eY]) + aCoordHelper.reset(new TCoordHelper(aYGetCoord)); + else if(anIsDimPresent[eZ]) + aCoordHelper.reset(new TCoordHelper(aZGetCoord)); + else + aCoordHelper.reset(new TCoordHelper(aXGetCoord)); + break; + } + } + return aCoordHelper; + } +} diff --git a/src/MEDWrapper/MED_CoordUtils.hxx b/src/MEDWrapper/MED_CoordUtils.hxx new file mode 100644 index 000000000..c72219579 --- /dev/null +++ b/src/MEDWrapper/MED_CoordUtils.hxx @@ -0,0 +1,53 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_CoordUtils_HeaderFile +#define MED_CoordUtils_HeaderFile + +#include "MED_WrapperDef.hxx" +#include "MED_Structures.hxx" + +namespace MED +{ + typedef TFloat (*TGetCoord)(const TCCoordSlice& theCoordSlice); + + //--------------------------------------------------------------- + class MEDWRAPPER_EXPORT TCoordHelper + { + TGetCoord* myGetCoord; + + public: + TCoordHelper(TGetCoord* theGetCoord); + + TFloat + GetCoord(TCCoordSlice& theCoordSlice, + TInt theCoordId); + }; + typedef SharedPtr PCoordHelper; + + //--------------------------------------------------------------- + MEDWRAPPER_EXPORT + PCoordHelper + GetCoordHelper(PNodeInfo theNodeInfo); +} + +#endif // MED_CoordUtils_HeaderFile diff --git a/src/MEDWrapper/MED_Factory.cxx b/src/MEDWrapper/MED_Factory.cxx new file mode 100644 index 000000000..02b7e866e --- /dev/null +++ b/src/MEDWrapper/MED_Factory.cxx @@ -0,0 +1,120 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_Factory.hxx" +#include "MED_Utilities.hxx" +#include "MED_Wrapper.hxx" + +#include +#include +#include + +#include +extern "C" +{ +#ifndef WIN32 + #include +#endif +} + +namespace MED +{ + bool exists(const std::string& fileName) + { +#ifdef WIN32 + return (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES); +#else + return (access(fileName.c_str(), F_OK) == 0); +#endif + } + + bool CheckCompatibility(const std::string& fileName) + { + bool ok = false; + // check that file is accessible + if ( exists(fileName) ) { + // check HDF5 && MED compatibility + med_bool hdfok, medok; + MEDfileCompatibility(fileName.c_str(), &hdfok, &medok); + if ( hdfok && medok ) { + med_idt aFid = MEDfileOpen(fileName.c_str(), MED_ACC_RDONLY); + if (aFid >= 0) { + med_int major, minor, release; + med_err ret = MEDfileNumVersionRd(aFid, &major, &minor, &release); + if (ret >= 0) { + int version = 100*major + minor; + if (version >= 202) + ok = true; + } + } + MEDfileClose(aFid); + } + } + return ok; + } + + bool GetMEDVersion(const std::string& fileName, int& major, int& minor, int& release) + { + bool ok = false; + major = minor = release = 0; + med_idt aFid = MEDfileOpen(fileName.c_str(), MED_ACC_RDONLY); + if (aFid >= 0) { + med_int _major, _minor, _release; + med_err ret = MEDfileNumVersionRd(aFid, &_major, &_minor, &_release); + if (ret == 0) { + major = _major; + minor = _minor; + release = _release; + ok = true; + } + MEDfileClose(aFid); + } + return ok; + } + + std::string GetMEDVersion(const std::string& fileName) + { + std::string version; + int major, minor, release; + if (GetMEDVersion(fileName, major, minor, release)) { + std::ostringstream os; + os << major << "." << minor << "." << release; + version = os.str(); + } + return version; + } + + PWrapper CrWrapperR(const std::string& fileName) + { + if (!CheckCompatibility(fileName)) { + EXCEPTION(std::runtime_error, "Cannot open file '"< + +namespace MED +{ + MEDWRAPPER_EXPORT + std::string GetMEDVersion( const std::string& ); + + MEDWRAPPER_EXPORT + bool GetMEDVersion( const std::string&, int&, int&, int& ); + + MEDWRAPPER_EXPORT + bool CheckCompatibility( const std::string& ); + + MEDWRAPPER_EXPORT + PWrapper CrWrapperR( const std::string& ); + + MEDWRAPPER_EXPORT + PWrapper CrWrapperW( const std::string& ); +} + +#endif // MED_Factory_HeaderFile diff --git a/src/MEDWrapper/MED_GaussDef.cxx b/src/MEDWrapper/MED_GaussDef.cxx new file mode 100644 index 000000000..c45af1f0a --- /dev/null +++ b/src/MEDWrapper/MED_GaussDef.cxx @@ -0,0 +1,565 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_GaussDef.hxx" +#include "MED_Utilities.hxx" +#include "MED_GaussUtils.hxx" + +namespace MED +{ + //--------------------------------------------------------------- + + void TGaussDef::add(const double x, const double weight) + { + if ( dim() != 1 ) + EXCEPTION( std::logic_error,"dim() != 1"); + if ( myWeights.capacity() == myWeights.size() ) + EXCEPTION( std::logic_error,"Extra gauss point"); + myCoords.push_back( x ); + myWeights.push_back( weight ); + } + void TGaussDef::add(const double x, const double y, const double weight) + { + if ( dim() != 2 ) + EXCEPTION( std::logic_error,"dim() != 2"); + if ( myWeights.capacity() == myWeights.size() ) + EXCEPTION( std::logic_error,"Extra gauss point"); + myCoords.push_back( x ); + myCoords.push_back( y ); + myWeights.push_back( weight ); + } + void TGaussDef::add(const double x, const double y, const double z, const double weight) + { + if ( dim() != 3 ) + EXCEPTION( std::logic_error,"dim() != 3"); + if ( myWeights.capacity() == myWeights.size() ) + EXCEPTION( std::logic_error,"Extra gauss point"); + myCoords.push_back( x ); + myCoords.push_back( y ); + myCoords.push_back( z ); + myWeights.push_back( weight ); + } + void TGaussDef::setRefCoords(const TShapeFun& aShapeFun) + { + myRefCoords.reserve( aShapeFun.myRefCoord.size() ); + myRefCoords.assign( aShapeFun.myRefCoord.begin(), + aShapeFun.myRefCoord.end() ); + } + + //--------------------------------------------------------------- + /*! + * \brief Fill definition of gauss points family + */ + //--------------------------------------------------------------- + + TGaussDef::TGaussDef(const int geom, const int nbGauss, const int variant) + { + myType = geom; + myCoords .reserve( nbGauss * dim() ); + myWeights.reserve( nbGauss ); + + switch ( geom ) { + + case eSEG2: + case eSEG3: + if (geom == eSEG2) setRefCoords( TSeg2a() ); + else setRefCoords( TSeg3a() ); + switch ( nbGauss ) { + case 1: { + add( 0.0, 2.0 ); break; + } + case 2: { + const double a = 0.577350269189626; + add( a, 1.0 ); + add( -a, 1.0 ); break; + } + case 3: { + const double a = 0.774596669241; + const double P1 = 1./1.8; + const double P2 = 1./1.125; + add( -a, P1 ); + add( 0, P2 ); + add( a, P1 ); break; + } + case 4: { + const double a = 0.339981043584856, b = 0.861136311594053; + const double P1 = 0.652145154862546, P2 = 0.347854845137454 ; + add( a, P1 ); + add( -a, P1 ); + add( b, P2 ); + add( -b, P2 ); break; + } + default: + EXCEPTION( std::logic_error,"Invalid nb of gauss points for SEG"< alfa + const double a = (6 + sqrt(15.))/21.; + const double b = (6 - sqrt(15.))/21.; + const double P1 = (155 + sqrt(15.))/2400.; + const double P2 = (155 - sqrt(15.))/2400.; //___ + add( -d, 1/3., 1/3., c1*9/80. );//___ + add( -d, a, a, c1*P1 ); + add( -d, 1-2*a, a, c1*P1 ); + add( -d, a, 1-2*a, c1*P1 );//___ + add( -d, b, b, c1*P2 ); + add( -d, 1-2*b, b, c1*P2 ); + add( -d, b, 1-2*b, c1*P2 );//___ + add( 0., 1/3., 1/3., c2*9/80. );//___ + add( 0., a, a, c2*P1 ); + add( 0., 1-2*a, a, c2*P1 ); + add( 0., a, 1-2*a, c2*P1 );//___ + add( 0., b, b, c2*P2 ); + add( 0., 1-2*b, b, c2*P2 ); + add( 0., b, 1-2*b, c2*P2 );//___ + add( d, 1/3., 1/3., c1*9/80. );//___ + add( d, a, a, c1*P1 ); + add( d, 1-2*a, a, c1*P1 ); + add( d, a, 1-2*a, c1*P1 );//___ + add( d, b, b, c1*P2 ); + add( d, 1-2*b, b, c1*P2 ); + add( d, b, 1-2*b, c1*P2 );//___ + break; + } + default: + EXCEPTION( std::logic_error,"Invalid nb of gauss points for PENTA: " < + +namespace MED +{ + class TShapeFun; + typedef std::vector TDoubleVector; + + /*! + * \brief Description of family of integration points + */ + struct TGaussDef + { + int myType; //!< element geometry (EGeometrieElement or med_geometrie_element) + TDoubleVector myRefCoords; //!< description of reference points + TDoubleVector myCoords; //!< coordinates of Gauss points + TDoubleVector myWeights; //!< weights, len(weights)== + + /*! + * \brief Creates definition of gauss points family + * \param geomType - element geometry (EGeometrieElement or med_geometrie_element) + * \param nbPoints - nb gauss point + * \param variant - [1-3] to choose the variant of definition + * + * Throws in case of invalid parameters + * variant == 1 refers to "Fonctions de forme et points d'integration + * des elements finis" v7.4 by J. PELLET, X. DESROCHES, 15/09/05 + * variant == 2 refers to the same doc v6.4 by J.P. LEFEBVRE, X. DESROCHES, 03/07/03 + * variant == 3 refers to the same doc v6.4, second variant for 2D elements + */ + MEDWRAPPER_EXPORT TGaussDef(const int geomType, const int nbPoints, const int variant=1); + + MEDWRAPPER_EXPORT int dim() const { return myType/100; } + MEDWRAPPER_EXPORT int nbPoints() const { return myWeights.capacity(); } + + private: + void add(const double x, const double weight); + void add(const double x, const double y, const double weight); + void add(const double x, const double y, const double z, const double weight); + void setRefCoords(const TShapeFun& aShapeFun); + }; +} + +#endif // MED_GaussDef_HeaderFile diff --git a/src/MEDWrapper/MED_GaussUtils.cxx b/src/MEDWrapper/MED_GaussUtils.cxx new file mode 100644 index 000000000..1d2846361 --- /dev/null +++ b/src/MEDWrapper/MED_GaussUtils.cxx @@ -0,0 +1,2106 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_GaussUtils.hxx" +#include "MED_Utilities.hxx" + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +static int MYVALUEDEBUG = 0; +#else +static int MYDEBUG = 0; +static int MYVALUEDEBUG = 0; +#endif + +namespace MED +{ + //--------------------------------------------------------------- + TGaussCoord + ::TGaussCoord(): + TModeSwitchInfo(eFULL_INTERLACE), + myNbElem(0), + myNbGauss(0), + myDim(0), + myGaussStep(0) + { + } + + void + TGaussCoord + ::Init(TInt theNbElem, + TInt theNbGauss, + TInt theDim, + EModeSwitch theMode) + { + myModeSwitch = theMode; + + myNbElem = theNbElem; + myNbGauss = theNbGauss; + myDim = theDim; + + myGaussStep = myNbGauss*myDim; + + myGaussCoord.resize(theNbElem*myGaussStep); + } + + TInt + TGaussCoord + ::GetNbElem() const + { + return myNbElem; + } + + TInt + TGaussCoord + ::GetNbGauss() const + { + return myNbGauss; + } + + TInt + TGaussCoord + ::GetDim() const + { + return myDim; + } + + unsigned char* + TGaussCoord + ::GetValuePtr() + { + return (unsigned char*)&(myGaussCoord[0]); + } + + TCCoordSliceArr + TGaussCoord + ::GetCoordSliceArr(TInt theElemId) const + { + TCCoordSliceArr aCoordSliceArr(myNbGauss); + if(GetModeSwitch() == eFULL_INTERLACE){ + TInt anId = theElemId*myGaussStep; + for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ + aCoordSliceArr[anGaussId] = + TCCoordSlice(myGaussCoord,std::slice(anId,myDim,1)); + anId += myDim; + } + } + else{ + for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ + aCoordSliceArr[anGaussId] = + TCCoordSlice(myGaussCoord,std::slice(theElemId,myDim,myGaussStep)); + } + } + return aCoordSliceArr; + } + + TCoordSliceArr + TGaussCoord + ::GetCoordSliceArr(TInt theElemId) + { + TCoordSliceArr aCoordSliceArr(myNbGauss); + if(GetModeSwitch() == eFULL_INTERLACE){ + TInt anId = theElemId*myGaussStep; + for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ + aCoordSliceArr[anGaussId] = + TCoordSlice(myGaussCoord,std::slice(anId,myDim,1)); + anId += myDim; + } + } + else{ + for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){ + aCoordSliceArr[anGaussId] = + TCoordSlice(myGaussCoord,std::slice(theElemId,myDim,myGaussStep)); + } + } + return aCoordSliceArr; + } + + //--------------------------------------------------------------- + inline + bool + IsEqual(TFloat theLeft, TFloat theRight) + { + static TFloat EPS = 1.0E-3; + if(fabs(theLeft) + fabs(theRight) > EPS) + return fabs(theLeft-theRight)/(fabs(theLeft)+fabs(theRight)) < EPS; + return true; + } + + //--------------------------------------------------------------- + class TShapeFun::TFun + { + TFloatVector myFun; + TInt myNbRef; + + public: + + void + Init(TInt theNbGauss, + TInt theNbRef) + { + myFun.resize(theNbGauss*theNbRef); + myNbRef = theNbRef; + } + + TCFloatVecSlice + GetFunSlice(TInt theGaussId) const + { + return TCFloatVecSlice(myFun,std::slice(theGaussId*myNbRef,myNbRef,1)); + } + + TFloatVecSlice + GetFunSlice(TInt theGaussId) + { + return TFloatVecSlice(myFun,std::slice(theGaussId*myNbRef,myNbRef,1)); + } + }; + + //--------------------------------------------------------------- + + TShapeFun::TShapeFun(TInt theDim, TInt theNbRef): + myRefCoord(theNbRef*theDim), + myDim(theDim), + myNbRef(theNbRef) + {} + + TCCoordSlice + TShapeFun::GetCoord(TInt theRefId) const + { + return TCCoordSlice(myRefCoord,std::slice(theRefId*myDim,myDim,1)); + } + + TCoordSlice + TShapeFun::GetCoord(TInt theRefId) + { + return TCoordSlice(myRefCoord,std::slice(theRefId*myDim,myDim,1)); + } + + void + TShapeFun::GetFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const + { + TInt aNbRef = theRef.size(); + TInt aNbGauss = theGauss.size(); + theFun.Init(aNbGauss,aNbRef); + } + + bool + TShapeFun::IsSatisfy(const TCCoordSliceArr& theRefCoord) const + { + TInt aNbRef = theRefCoord.size(); + TInt aNbRef2 = GetNbRef(); + INITMSG(MYDEBUG,"TShapeFun::IsSatisfy "<< + "- aNbRef("<GetDim(); + TInt aNbGauss = theGauss.size(); + + bool anIsSubMesh = !theElemNum.empty(); + TInt aNbElem; + if(anIsSubMesh) + aNbElem = theElemNum.size(); + else + aNbElem = theCellInfo.GetNbElem(); + + theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); + + TFun aFun; + InitFun(theRef,theGauss,aFun); + TInt aConnDim = theCellInfo.GetConnDim(); + + INITMSG(MYDEBUG,"aDim = "<GetDim(); + static TInt aNbGauss = 1; + + bool anIsSubMesh = !theElemNum.empty(); + TInt aNbElem; + if(anIsSubMesh) + aNbElem = theElemNum.size(); + else + aNbElem = theCellInfo.GetNbElem(); + + theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); + + TInt aConnDim = theCellInfo.GetConnDim(); + + INITMSGA(MYDEBUG,0, + "- aDim = "<GetDim(); + static TInt aNbGauss = 1; + + bool anIsSubMesh = !theElemNum.empty(); + TInt aNbElem; + if(anIsSubMesh) + aNbElem = theElemNum.size(); + else + aNbElem = thePolygoneInfo.GetNbElem(); + + theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); + + INITMSGA(MYDEBUG,0, + "- aDim = "<GetDim(); + static TInt aNbGauss = 1; + + bool anIsSubMesh = !theElemNum.empty(); + TInt aNbElem; + if(anIsSubMesh) + aNbElem = theElemNum.size(); + else + aNbElem = thePolyedreInfo.GetNbElem(); + + theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); + + INITMSGA(MYDEBUG,0, + "- aDim = "< TCCoordSliceArr; + typedef TVector TCoordSliceArr; + + //! Define a helper class to handle Gauss Points coordinates + class MEDWRAPPER_EXPORT TGaussCoord: + virtual TModeSwitchInfo + { + TInt myNbElem; + TInt myNbGauss; + TInt myDim; + + TInt myGaussStep; + + TNodeCoord myGaussCoord; + + public: + + TGaussCoord(); + + //! To init the class + void + Init(TInt theNbElem, + TInt theNbGauss, + TInt theDim, + EModeSwitch theMode = eFULL_INTERLACE); + + TInt + GetNbElem() const; + + TInt + GetNbGauss() const; + + TInt + GetDim() const; + + unsigned char* + GetValuePtr(); + + //! Get slice of the coordinate that corresponds to defined cell (const version) + TCCoordSliceArr + GetCoordSliceArr(TInt theElemId) const; + + //! Get slice of the coordinate that corresponds to defined cell + TCoordSliceArr + GetCoordSliceArr(TInt theElemId); + }; + typedef SharedPtr PGaussCoord; + + //--------------------------------------------------------------- + //! To calculate Gauss Points coordinates + MEDWRAPPER_EXPORT + bool + GetGaussCoord3D(const TGaussInfo& theGaussInfo, + const TCellInfo& theCellInfo, + const TNodeInfo& theNodeInfo, + TGaussCoord& theGaussCoord, + const TElemNum& theElemNum = TElemNum(), + EModeSwitch theMode = eFULL_INTERLACE); + + //--------------------------------------------------------------- + //! To calculate Gauss Points coordinates for defined TCellInfo as its bary center + MEDWRAPPER_EXPORT + bool + GetBaryCenter(const TCellInfo& theCellInfo, + const TNodeInfo& theNodeInfo, + TGaussCoord& theGaussCoord, + const TElemNum& theElemNum = TElemNum(), + EModeSwitch theMode = eFULL_INTERLACE); + + //! To calculate Gauss Points coordinates for defined TPolygoneInfo as its bary center + MEDWRAPPER_EXPORT + bool + GetBaryCenter(const TPolygoneInfo& thePolygoneInfo, + const TNodeInfo& theNodeInfo, + TGaussCoord& theGaussCoord, + const TElemNum& theElemNum = TElemNum(), + EModeSwitch theMode = eFULL_INTERLACE); + + //! To calculate Gauss Points coordinates for defined TPolyedreInfo as its bary center + MEDWRAPPER_EXPORT + bool + GetBaryCenter(const TPolyedreInfo& thePolyedreInfo, + const TNodeInfo& theNodeInfo, + TGaussCoord& theGaussCoord, + const TElemNum& theElemNum = TElemNum(), + EModeSwitch theMode = eFULL_INTERLACE); + + //--------------------------------------------------------------- + //! Shape function definitions + //--------------------------------------------------------------- + struct MEDWRAPPER_EXPORT TShapeFun + { + class TFun; + + TFloatVector myRefCoord; + TInt myDim; + TInt myNbRef; + + TShapeFun(TInt theDim = 0, TInt theNbRef = 0); + + TInt GetNbRef() const { return myNbRef; } + + TCCoordSlice GetCoord(TInt theRefId) const; + + TCoordSlice GetCoord(TInt theRefId); + + void GetFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + virtual + void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const = 0; + virtual + bool IsSatisfy(const TCCoordSliceArr& theRefCoord) const; + + bool Eval(const TCellInfo& theCellInfo, + const TNodeInfo& theNodeInfo, + const TElemNum& theElemNum, + const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TGaussCoord& theGaussCoord, + EModeSwitch theMode); + }; + //--------------------------------------------------------------- + struct TSeg2a: TShapeFun { + TSeg2a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TSeg3a: TShapeFun { + TSeg3a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTria3a: TShapeFun { + TTria3a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTria6a: TShapeFun { + TTria6a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTria3b: TShapeFun { + TTria3b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTria6b: TShapeFun { + TTria6b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TQuad4a: TShapeFun { + TQuad4a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TQuad8a: TShapeFun { + TQuad8a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TQuad9a: TShapeFun { + TQuad9a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TQuad4b: TShapeFun { + TQuad4b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TQuad8b: TShapeFun { + TQuad8b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TQuad9b: TShapeFun { + TQuad9b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTetra4a: TShapeFun { + TTetra4a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTetra10a: TShapeFun { + TTetra10a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTetra4b: TShapeFun { + TTetra4b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TTetra10b: TShapeFun { + TTetra10b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct THexa8a: TShapeFun { + THexa8a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct THexa20a: TShapeFun { + THexa20a(TInt theDim = 3, TInt theNbRef = 20); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct THexa27a: THexa20a { + THexa27a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct THexa8b: TShapeFun { + THexa8b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct THexa20b: TShapeFun { + THexa20b(TInt theDim = 3, TInt theNbRef = 20); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPenta6a: TShapeFun { + TPenta6a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPenta6b: TShapeFun { + TPenta6b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPenta15a: TShapeFun { + TPenta15a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPenta15b: TShapeFun { + TPenta15b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPyra5a: TShapeFun { + TPyra5a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPyra5b: TShapeFun { + TPyra5b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPyra13a: TShapeFun { + TPyra13a(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- + struct TPyra13b: TShapeFun { + TPyra13b(); + virtual void InitFun(const TCCoordSliceArr& theRef, + const TCCoordSliceArr& theGauss, + TFun& theFun) const; + }; + //--------------------------------------------------------------- +} + +#endif // MED_GaussUtils_HeaderFile diff --git a/src/MEDWrapper/MED_SharedPtr.hxx b/src/MEDWrapper/MED_SharedPtr.hxx new file mode 100644 index 000000000..09dc7ad92 --- /dev/null +++ b/src/MEDWrapper/MED_SharedPtr.hxx @@ -0,0 +1,93 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_SharedPtr_HeaderFile +#define MED_SharedPtr_HeaderFile + +#include + +namespace MED +{ + //! To extend the boost::shared_ptr to support such features automatic dynamic cast + /*! + All entities of the MEDWrapper package are handled as pointer. + This class was introduced to provide correct and flexible memory management + for all of the MEDWrapper objects. + */ + template class SharedPtr: public boost::shared_ptr + { + public: + //! Default constructor + SharedPtr() {} + + //! Construct the class by any type of a pointer + template + explicit SharedPtr(Y * p): + boost::shared_ptr(p) + {} + + //! Construct the class by any specialisation of the class + template + SharedPtr(SharedPtr const & r): + boost::shared_ptr(boost::dynamic_pointer_cast(r)) + {} + + //! Copy-constructor + template + SharedPtr& + operator=(SharedPtr const & r) + { + SharedPtr(r).swap(*this); + return *this; + } + + //! Introduce a flexible way to reset the wrapped pointer + template + SharedPtr& + operator()(Y * p) // Y must be complete + { + return operator=(SharedPtr(p)); + } + + //! Introduce a flexible way to reset the wrapped pointer + template + SharedPtr& + operator()(SharedPtr const & r) // Y must be complete + { + return operator=(SharedPtr(r)); + } + + //! To provide a flexible way to use reference to the wrapped pointer (const version) + operator const T& () const + { + return *(this->get()); + } + + //! To provide a flexible way to use reference to the wrapped pointer + operator T& () + { + return *(this->get()); + } + }; +} + +#endif // MED_SharedPtr_HeaderFile diff --git a/src/MEDWrapper/MED_SliceArray.hxx b/src/MEDWrapper/MED_SliceArray.hxx new file mode 100644 index 000000000..1833b5540 --- /dev/null +++ b/src/MEDWrapper/MED_SliceArray.hxx @@ -0,0 +1,184 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_SliceArray_HeaderFile +#define MED_SliceArray_HeaderFile + +#ifdef WIN32 // for correct compiling of "valarray" in modules, which include this file + #undef max + #undef min +#endif + +#include +#include + +//#if defined(_DEBUG_) +# define MED_TCSLICE_CHECK_RANGE +//#endif + +namespace MED +{ + //--------------------------------------------------------------- + //! This class intends to provide a uniform way to handle multidimensional data (const version) + /*! + It just contains a pointer to real sequence and implement proper calculation of its indexes. + This class deals with constant pointer to the sources data and provides const method to + read them (data). + */ + template + class TCSlice + { + const TValueType* myCValuePtr; //!< Reference to source multidimensional data + size_t mySourceSize; //!< Size of the source multidimensional data + std::slice mySlice; //!< Defines algorithm of index calculation + + protected: + void + check_id(size_t theId) const + { + long int anId = -1; + if(theId < mySlice.size()){ + anId = mySlice.start() + theId*mySlice.stride(); + if(anId < (long int)mySourceSize) + return; + } + throw std::out_of_range("TCSlice::check_id"); + } + + //! Calculate internal index to get proper element from the source multidimensional data + size_t + calculate_id(size_t theId) const + { + return mySlice.start() + theId*mySlice.stride(); + } + + size_t + get_id(size_t theId) const + { +#ifdef MED_TCSLICE_CHECK_RANGE + check_id(theId); +#endif + return calculate_id(theId); + } + + size_t + get_id_at(size_t theId) const + { + check_id(theId); + return calculate_id(theId); + } + + public: + typedef TValueType value_type; + + //! Construct the class from bare pointer + TCSlice(const value_type* theValuePtr, + size_t theSourceSize, + const std::slice& theSlice): + myCValuePtr(theValuePtr), + mySourceSize(theSourceSize), + mySlice(theSlice) + {} + + //! Construct the class from corresponding container + TCSlice(const TVector& theContainer, + const std::slice& theSlice): + myCValuePtr(&theContainer[0]), + mySourceSize(theContainer.size()), + mySlice(theSlice) + {} + + //! Default constructor (dangerous) + TCSlice(): + myCValuePtr(NULL) + {} + + //! Get element by its number (const version) + const value_type& + operator[](size_t theId) const + { + return *(myCValuePtr + get_id(theId)); + } + + const value_type& + at(size_t theId) const + { + return *(myCValuePtr + get_id_at(theId)); + } + + //! Get range of the order numbers + size_t + size() const + { + return mySlice.size(); + } + }; + + //--------------------------------------------------------------- + //! This class extends TCSlice functionality for non-constant case + template + class TSlice: public TCSlice + { + TValueType* myValuePtr; + + public: + typedef TValueType value_type; + typedef TCSlice TSupperClass; + + //! Construct the class from bare pointer + TSlice(value_type* theValuePtr, + size_t theSourceSize, + const std::slice& theSlice): + TSupperClass(theValuePtr, theSourceSize, theSlice), + myValuePtr(theValuePtr) + {} + + //! Construct the class from corresponding container + TSlice(TVector& theContainer, + const std::slice& theSlice): + TSupperClass(theContainer, theSlice), + myValuePtr(&theContainer[0]) + {} + + //! Default constructor (dangerous) + TSlice(): + myValuePtr(NULL) + {} + + //! Get element by its number + value_type& + operator[](size_t theId) + { + return *(myValuePtr + this->get_id(theId)); + } + + value_type& + at(size_t theId) + { + return *(myValuePtr + this->get_id_at(theId)); + } + }; +} + +#undef MED_TCSLICE_CHECK_RANGE + +#endif // MED_SliceArray_HeaderFile diff --git a/src/MEDWrapper/MED_Structures.cxx b/src/MEDWrapper/MED_Structures.cxx new file mode 100644 index 000000000..f5caca0ee --- /dev/null +++ b/src/MEDWrapper/MED_Structures.cxx @@ -0,0 +1,849 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_Structures.hxx" +#include "MED_Utilities.hxx" + +#include + +namespace MED +{ + std::string + GetString(TInt theId, + TInt theStep, + const TString& theString) + { + const char* aPos = &theString[theId*theStep]; + TInt aSize = std::min(TInt(strlen(aPos)),theStep); + return std::string(aPos,aSize); + } + + void + SetString(TInt theId, + TInt theStep, + TString& theString, + const std::string& theValue) + { + TInt aSize = std::min(TInt(theValue.size()+1),theStep); + char* aPos = &theString[theId*theStep]; + strncpy(aPos,theValue.c_str(),aSize); + } + + void + SetString(TInt theId, + TInt theStep, + TString& theString, + const TString& theValue) + { + TInt aSize = std::min(TInt(theValue.size()+1),theStep); + char* aPos = &theString[theId*theStep]; + const char* aValue = &theValue[0]; + strncpy(aPos,aValue,aSize); + } + + TInt + GetDimGaussCoord(EGeometrieElement theGeom) + { + return theGeom/100; + } + + TInt + GetNbRefCoord(EGeometrieElement theGeom) + { + return (theGeom%100); + } + + //--------------------------------------------------------------- + PFloatTimeStampValue + CastToFloatTimeStampValue(const PTimeStampValueBase& theTimeStampValue) + { + return theTimeStampValue; + } + + PIntTimeStampValue + CastToIntTimeStampValue(const PTimeStampValueBase& theTimeStampValue) + { + return theTimeStampValue; + } + + //--------------------------------------------------------------- + TInt + TFamilyInfo + ::GetAttrId(TInt theId) const + { + return myAttrId[theId]; + } + + TInt + TFamilyInfo + ::GetAttrVal(TInt theId) const + { + return myAttrVal[theId]; + } + + void + TFamilyInfo + ::SetAttrId(TInt theId,TInt theVal) + { + myAttrId[theId] = theVal; + } + + void + TFamilyInfo + ::SetAttrVal(TInt theId,TInt theVal) + { + myAttrVal[theId] = theVal; + } + + //--------------------------------------------------------------- + TInt + TElemInfo + ::GetFamNum(TInt theId) const + { + return (*myFamNum)[theId]; + } + + void + TElemInfo + ::SetFamNum(TInt theId, TInt theVal) + { + (*myFamNum)[theId] = theVal; + myIsFamNum = eVRAI; + } + + TInt + TElemInfo + ::GetElemNum(TInt theId) const + { + return (*myElemNum)[theId]; + } + + void + TElemInfo + ::SetElemNum(TInt theId, TInt theVal) + { + (*myElemNum)[theId] = theVal; + } + + //--------------------------------------------------------------- + TCCoordSlice + TNodeInfo + ::GetCoordSlice(TInt theId) const + { + TInt aDim = myMeshInfo->GetSpaceDim(); + if(GetModeSwitch() == eFULL_INTERLACE) + return TCCoordSlice(*myCoord, std::slice(theId*aDim, aDim, 1)); + else + return TCCoordSlice(*myCoord, std::slice(theId, aDim, aDim)); + } + + TCoordSlice + TNodeInfo + ::GetCoordSlice(TInt theId) + { + TInt aDim = myMeshInfo->GetSpaceDim(); + if(GetModeSwitch() == eFULL_INTERLACE) + return TCoordSlice(*myCoord, std::slice(theId*aDim,aDim,1)); + else + return TCoordSlice(*myCoord, std::slice(theId,aDim,aDim)); + } + + //--------------------------------------------------------------- + TCConnSlice + TCellInfo + ::GetConnSlice(TInt theElemId) const + { + if(GetModeSwitch() == eFULL_INTERLACE) + return TCConnSlice(*myConn, std::slice(GetConnDim()*theElemId, GetNbNodes(myGeom), 1)); + else + return TCConnSlice(*myConn, std::slice(theElemId, GetNbNodes(myGeom), GetConnDim())); + } + + TConnSlice + TCellInfo + ::GetConnSlice(TInt theElemId) + { + if(GetModeSwitch() == eFULL_INTERLACE) + return TConnSlice(*myConn, std::slice(GetConnDim()*theElemId, GetNbNodes(myGeom), 1)); + else + return TConnSlice(*myConn, std::slice(theElemId, GetNbNodes(myGeom), GetConnDim())); + } + + //--------------------------------------------------------------- + TInt + TPolygoneInfo + ::GetNbConn(TInt theElemId) const + { + return (*myIndex)[theElemId + 1] - (*myIndex)[theElemId]; + } + + TCConnSlice + TPolygoneInfo + ::GetConnSlice(TInt theElemId) const + { + return TCConnSlice(*myConn, std::slice((*myIndex)[theElemId] - 1, GetNbConn(theElemId), 1)); + } + + TConnSlice + TPolygoneInfo + ::GetConnSlice(TInt theElemId) + { + return TConnSlice(*myConn, std::slice((*myIndex)[theElemId] - 1, GetNbConn(theElemId), 1)); + } + + //--------------------------------------------------------------- + TInt + TPolyedreInfo + ::GetNbFaces(TInt theElemId) const + { + return (*myIndex)[theElemId+1] - (*myIndex)[theElemId]; + } + + TInt + TPolyedreInfo + ::GetNbNodes(TInt theElemId) const + { + TInt aNbNodes = 0; + TInt aNbFaces = GetNbFaces(theElemId); + TInt aStartFaceId = (*myIndex)[theElemId] - 1; + for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){ + TInt aCurrentId = (*myFaces)[aStartFaceId]; + TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId; + aNbNodes += aDiff; + } + return aNbNodes; + } + + TCConnSliceArr + TPolyedreInfo + ::GetConnSliceArr(TInt theElemId) const + { + TInt aNbFaces = GetNbFaces(theElemId); + TCConnSliceArr aConnSliceArr(aNbFaces); + TInt aStartFaceId = (*myIndex)[theElemId] - 1; + for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){ + TInt aCurrentId = (*myFaces)[aStartFaceId]; + TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId; + aConnSliceArr[aFaceId] = + TCConnSlice(*myConn, std::slice(aCurrentId - 1, aDiff, 1)); + } + return aConnSliceArr; + } + + TConnSliceArr + TPolyedreInfo + ::GetConnSliceArr(TInt theElemId) + { + TInt aNbFaces = GetNbFaces(theElemId); + TConnSliceArr aConnSliceArr(aNbFaces); + TInt aStartFaceId = (*myIndex)[theElemId] - 1; + for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){ + TInt aCurrentId = (*myFaces)[aStartFaceId]; + TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId; + aConnSliceArr[aFaceId] = + TConnSlice(*myConn, std::slice(aCurrentId - 1, aDiff, 1)); + } + return aConnSliceArr; + } + + //--------------------------------------------------------------- + TMeshValueBase + ::TMeshValueBase(): + myNbElem(0), + myNbComp(0), + myNbGauss(0), + myStep(0) + {} + + void + TMeshValueBase + ::Allocate(TInt theNbElem, + TInt theNbGauss, + TInt theNbComp, + EModeSwitch theMode) + { + myModeSwitch = theMode; + + myNbElem = theNbElem; + myNbGauss = theNbGauss; + myNbComp = theNbComp; + + myStep = theNbComp*theNbGauss; + } + + size_t + TMeshValueBase + ::GetSize() const + { + return myNbElem * myStep; + } + + size_t + TMeshValueBase + ::GetNbVal() const + { + return myNbElem * myNbGauss; + } + + size_t + TMeshValueBase + ::GetNbGauss() const + { + return myNbGauss; + } + + size_t + TMeshValueBase + ::GetStep() const + { + return myStep; + } + + //--------------------------------------------------------------- + TInt + TProfileInfo + ::GetElemNum(TInt theId) const + { + return (*myElemNum)[theId]; + } + + void + TProfileInfo + ::SetElemNum(TInt theId,TInt theVal) + { + (*myElemNum)[theId] = theVal; + } + + //--------------------------------------------------------------- + bool + TGaussInfo::TLess + ::operator()(const TKey& theLeft, const TKey& theRight) const + { + EGeometrieElement aLGeom = boost::get<0>(theLeft); + EGeometrieElement aRGeom = boost::get<0>(theRight); + if(aLGeom != aRGeom) + return aLGeom < aRGeom; + + const std::string& aLStr = boost::get<1>(theLeft); + const std::string& aRStr = boost::get<1>(theRight); + return aLStr < aRStr; + } + + bool + TGaussInfo::TLess + ::operator()(const TGaussInfo& theLeft, const TGaussInfo& theRight) const + { + if(!&theLeft) + return true; + + if(!&theRight) + return false; + + if(theLeft.myGeom != theRight.myGeom) + return theLeft.myGeom < theRight.myGeom; + + if(theLeft.myRefCoord != theRight.myRefCoord) + return theLeft.myRefCoord < theRight.myRefCoord; + + return theLeft.myGaussCoord < theRight.myGaussCoord; + } + + TCCoordSlice + TGaussInfo + ::GetRefCoordSlice(TInt theId) const + { + if(GetModeSwitch() == eFULL_INTERLACE) + return TCCoordSlice(myRefCoord,std::slice(theId*GetDim(),GetDim(),1)); + else + return TCCoordSlice(myRefCoord,std::slice(theId,GetDim(),GetDim())); + } + + TCoordSlice + TGaussInfo + ::GetRefCoordSlice(TInt theId) + { + if(GetModeSwitch() == eFULL_INTERLACE) + return TCoordSlice(myRefCoord,std::slice(theId*GetDim(),GetDim(),1)); + else + return TCoordSlice(myRefCoord,std::slice(theId,GetDim(),GetDim())); + } + + TCCoordSlice + TGaussInfo + ::GetGaussCoordSlice(TInt theId) const + { + if(GetModeSwitch() == eFULL_INTERLACE) + return TCCoordSlice(myGaussCoord,std::slice(theId*GetDim(),GetDim(),1)); + else + return TCCoordSlice(myGaussCoord,std::slice(theId,GetDim(),GetDim())); + } + + TCoordSlice + TGaussInfo + ::GetGaussCoordSlice(TInt theId) + { + if(GetModeSwitch() == eFULL_INTERLACE) + return TCoordSlice(myGaussCoord,std::slice(theId*GetDim(),GetNbGauss(),1)); + else + return TCoordSlice(myGaussCoord,std::slice(theId,GetNbGauss(),GetDim())); + } + + //--------------------------------------------------------------- + TInt + TTimeStampInfo + ::GetNbGauss(EGeometrieElement theGeom) const + { + TGeom2NbGauss::const_iterator anIter = myGeom2NbGauss.find(theGeom); + if(anIter == myGeom2NbGauss.end()) + return 1;//EXCEPTION(runtime_error,"TTimeStampInfo::GetNbGauss - myGeom2NbGauss.find(theGeom) fails"); + + return anIter->second; + } + + //--------------------------------------------------------------- + // TGrilleInfo structure methods + //--------------------------------------------------------------- + const EGrilleType& + TGrilleInfo + ::GetGrilleType() const + { + return myGrilleType; + } + + EGrilleType + TGrilleInfo + ::GetGrilleType() + { + return myGrilleType; + } + + void + TGrilleInfo + ::SetGrilleType(EGrilleType theGrilleType) + { + myGrilleType = theGrilleType; + } + + const + TIndexes& + TGrilleInfo + ::GetMapOfIndexes() const + { + return myIndixes; + } + + TIndexes& + TGrilleInfo + ::GetMapOfIndexes() + { + return myIndixes; + } + + const + TFloatVector& + TGrilleInfo + ::GetIndexes(TInt theAxisNumber) const + { + TIndexes::const_iterator aIter=myIndixes.find(theAxisNumber); + if(aIter==myIndixes.end()) + EXCEPTION(std::runtime_error, "const TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber); fails"); + return aIter->second; + } + + TFloatVector& + TGrilleInfo + ::GetIndexes(TInt theAxisNumber) + { + TIndexes::iterator aIter=myIndixes.find(theAxisNumber); + if(aIter==myIndixes.end()) + EXCEPTION(std::runtime_error, "TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber="<second; + } + + TInt + TGrilleInfo + ::GetNbIndexes(TInt theAxisNumber) + { + const TFloatVector& aVector=GetIndexes(theAxisNumber); + return aVector.size(); + } + + TInt + TGrilleInfo + ::GetNbNodes() + { + TInt nbNodes=0; + TInt aDim = myMeshInfo->GetDim(); + for(int i=0;iGetGrilleStructure()[i]; + else + nbNodes = nbNodes*this->GetGrilleStructure()[i]; + + return nbNodes; + } + + TInt + TGrilleInfo + ::GetNbCells() + { + TInt nbCells=0; + TInt aDim = myMeshInfo->GetDim(); + for(int i=0;iGetGrilleStructure()[i]-1; + else + nbCells = nbCells*(this->GetGrilleStructure()[i]-1); + return nbCells; + } + + TInt + TGrilleInfo + ::GetNbSubCells() + { + TInt nb=0; + TInt aDim = myMeshInfo->GetDim(); + switch (aDim) { + case 3: + nb = + (myGrilleStructure[0] ) * (myGrilleStructure[1]-1) * (myGrilleStructure[2]-1) + + (myGrilleStructure[0]-1) * (myGrilleStructure[1] ) * (myGrilleStructure[2]-1) + + (myGrilleStructure[0]-1) * (myGrilleStructure[1]-1) * (myGrilleStructure[2] ); + break; + case 2: + nb = + (myGrilleStructure[0] ) * (myGrilleStructure[1]-1) + + (myGrilleStructure[0]-1) * (myGrilleStructure[1] ); + break; + } + return nb; + } + + EGeometrieElement + TGrilleInfo + ::GetGeom() + { + TInt aDim = myMeshInfo->GetDim(); + switch(aDim){ + case 1: + return eSEG2; + case 2: + return eQUAD4; + case 3: + return eHEXA8; + default: + return eNONE; + } + } + + EGeometrieElement + TGrilleInfo + ::GetSubGeom() + { + TInt aDim = myMeshInfo->GetDim(); + switch(aDim){ + case 2: + return eSEG2; + case 3: + return eQUAD4; + } + return eNONE; + } + + EEntiteMaillage + TGrilleInfo + ::GetEntity() + { + return eMAILLE; + } + + EEntiteMaillage + TGrilleInfo + ::GetSubEntity() + { + TInt aDim = myMeshInfo->GetDim(); + switch(aDim){ + case 2: + return eARETE; + case 3: + return eFACE; + } + return EEntiteMaillage(-1); + } + + const + TIntVector& + TGrilleInfo + ::GetGrilleStructure() const + { + return myGrilleStructure; + } + + TIntVector + TGrilleInfo + ::GetGrilleStructure() + { + return myGrilleStructure; + } + + void + TGrilleInfo + ::SetGrilleStructure(TInt theAxis,TInt theNb) + { + if(theAxis >= 0 && theAxis <=2 && theNb >= 0) + myGrilleStructure[theAxis]=theNb; + } + + const + TNodeCoord& + TGrilleInfo + ::GetNodeCoord() const + { + return myCoord; + } + + TNodeCoord& + TGrilleInfo + ::GetNodeCoord() + { + return myCoord; + } + + TNodeCoord + TGrilleInfo + ::GetCoord(TInt theId) + { + TNodeCoord aCoord; + TInt aDim = myMeshInfo->GetDim(); + TInt aNbNodes = this->GetNbNodes(); + aCoord.resize(aDim); + + if(theId >= aNbNodes) + EXCEPTION(std::runtime_error, "TGrilleInfo::GetCoord - theId out of range"); + + if(myGrilleType == eGRILLE_STANDARD){ + switch(aDim){ + case 3: + aCoord[2] = myCoord[aDim*theId+2]; + case 2: + aCoord[1] = myCoord[aDim*theId+1]; + case 1:{ + aCoord[0] = myCoord[aDim*theId]; + break; + } + } + } else { + + TFloatVector aVecX = this->GetIndexes(0); + TInt nbIndxX = this->GetNbIndexes(0); + + switch(aDim){ + case 1:{ + aCoord[0] = aVecX[theId]; + break; + } + case 2:{ + TFloatVector aVecY = this->GetIndexes(1); + TInt i,j,k; + i = j = k = 0; + i = theId % nbIndxX; + j = theId / nbIndxX; + if(myGrilleType == eGRILLE_CARTESIENNE){ + aCoord[0] = aVecX[i]; + aCoord[1] = aVecY[j]; + } else { // eGRILLE_POLAIRE (cylindrical) + aCoord[0] = aVecX[i] * cos(aVecY[j]); + aCoord[1] = aVecX[i] * sin(aVecY[j]); + } + break; + } + case 3:{ + TFloatVector aVecY = this->GetIndexes(1); + TInt nbIndxY = this->GetNbIndexes(1); + TFloatVector aVecZ = this->GetIndexes(2); + TInt i,j,k; + i = j = k = 0; + + i = theId % nbIndxX; + j = (theId / nbIndxX) % nbIndxY; + k = theId / (nbIndxX*nbIndxY); + + if(myGrilleType == eGRILLE_CARTESIENNE){ + aCoord[0] = aVecX[i]; + aCoord[1] = aVecY[j]; + aCoord[2] = aVecZ[k]; + } else { // eGRILLE_POLAIRE (cylindrical) + aCoord[0] = aVecX[i] * cos(aVecY[j]); + aCoord[1] = aVecX[i] * sin(aVecY[j]); + aCoord[2] = aVecZ[k]; + } + + break; + } + } + } + + return aCoord; + } + + TIntVector + TGrilleInfo + ::GetConn(TInt theId, const bool isSub) + { + TIntVector anIndexes; + TInt aDim = myMeshInfo->GetDim(); + + TInt idx; + TInt iMin, jMin, kMin, iMax, jMax, kMax; + TInt loc[3]; + + loc[0] = loc[1] = loc[2] = 0; + iMin = iMax = jMin = jMax = kMin = kMax = 0; + + switch(aDim) { + case 3: + { + TInt nbX = this->GetGrilleStructure()[0]; + TInt nbY = this->GetGrilleStructure()[1]; + TInt nbZ = this->GetGrilleStructure()[2]; + TInt d01 = nbX*nbY, dX = 1, dY = 1, dZ = 1; + if ( isSub ) + { + if ( theId < nbX * (nbY-1) * (nbZ-1)) + { // face is normal to X axis + dX = 0; + } + else if ( theId < nbX * (nbY-1) * (nbZ-1) + (nbX-1) * nbY * (nbZ-1)) + { // face is normal to Y axis + theId -= nbX * (nbY-1) * (nbZ-1); + dY = 0; + } + else + { + theId -= nbX * (nbY-1) * (nbZ-1) + (nbX-1) * nbY * (nbZ-1); + dZ = 0; + } + } + //else + { + iMin = theId % (nbX - dX); + jMin = (theId / (nbX - dX)) % (nbY - dY); + kMin = theId / ((nbX - dX) * (nbY - dY)); + iMax = iMin+dX; + jMax = jMin+dY; + kMax = kMin+dZ; + } + for (loc[2]=kMin; loc[2]<=kMax; loc[2]++) + for (loc[1]=jMin; loc[1]<=jMax; loc[1]++) + for (loc[0]=iMin; loc[0]<=iMax; loc[0]++) + { + idx = loc[0] + loc[1]*nbX + loc[2]*d01; + anIndexes.push_back(idx); + } + break; + } + case 2: + { + TInt nbX = this->GetGrilleStructure()[0]; + TInt nbY = this->GetGrilleStructure()[1]; + TInt dX = 1, dY = 1; + if ( isSub ) + { + if ( theId < nbX * (nbY-1)) + { // edge is normal to X axis + dX = 0; + } + else + { + theId -= nbX * (nbY-1); + dY = 0; + } + } + iMin = theId % (nbX-dX); + jMin = theId / (nbX-dX); + iMax = iMin+dX; + jMax = jMin+dY; + for (loc[1]=jMin; loc[1]<=jMax; loc[1]++) + for (loc[0]=iMin; loc[0]<=iMax; loc[0]++) + { + idx = loc[0] + loc[1]*nbX; + anIndexes.push_back(idx); + } + break; + } + case 1: + { + iMin = theId; + for (loc[0]=iMin; loc[0]<=iMin+1; loc[0]++) + { + idx = loc[0]; + anIndexes.push_back(idx); + } + break; + } + } + + return anIndexes; + } + + TInt + TGrilleInfo + ::GetFamNumNode(TInt theId) const + { + return myFamNumNode[theId]; + } + + void + TGrilleInfo + ::SetFamNumNode(TInt theId,TInt theVal) + { + myFamNumNode[theId] = theVal; + } + + TInt + TGrilleInfo + ::GetFamNum(TInt theId) const + { + return myFamNum[theId]; + } + + void + TGrilleInfo + ::SetFamNum(TInt theId,TInt theVal) + { + myFamNum[theId] = theVal; + } + + TInt + TGrilleInfo + ::GetFamSubNum(TInt theId) const + { + return myFamSubNum[theId]; + } + + void + TGrilleInfo + ::SetFamSubNum(TInt theId,TInt theVal) + { + myFamSubNum[theId] = theVal; + } +} diff --git a/src/MEDWrapper/MED_Structures.hxx b/src/MEDWrapper/MED_Structures.hxx new file mode 100644 index 000000000..8e9beae88 --- /dev/null +++ b/src/MEDWrapper/MED_Structures.hxx @@ -0,0 +1,1072 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_Structures_HeaderFile +#define MED_Structures_HeaderFile + +#include "MED_WrapperDef.hxx" +#include "MED_Common.hxx" +#include "MED_Utilities.hxx" +#include "MED_SliceArray.hxx" + +#include + +#ifdef WIN32 +#pragma warning(disable:4251) +#endif + +namespace MED +{ + //--------------------------------------------------------------- + //! Defines a type for managing sequence of strings + typedef TVector TString; + typedef SharedPtr PString; + + //--------------------------------------------------------------- + //! Extract a substring from the sequence of the strings + MEDWRAPPER_EXPORT + std::string + GetString(TInt theId, + TInt theStep, + const TString& theString); + + //--------------------------------------------------------------- + //! Set a substring in the sequence of the strings + MEDWRAPPER_EXPORT + void + SetString(TInt theId, + TInt theStep, + TString& theString, + const std::string& theValue); + + //--------------------------------------------------------------- + //! Set a substring in the sequence of the strings + MEDWRAPPER_EXPORT + void + SetString(TInt theId, + TInt theStep, + TString& theString, + const TString& theValue); + + //--------------------------------------------------------------- + //! Define a parent class for all MEDWrapper classes + struct MEDWRAPPER_EXPORT TBase + { + virtual ~TBase() {} + }; + + //--------------------------------------------------------------- + //! Define a parent class for all named MED entities + struct MEDWRAPPER_EXPORT TNameInfo: virtual TBase + { + TString myName; //!< Keeps its name + virtual std::string GetName() const = 0; //!< Gets its name + virtual void SetName(const std::string& theValue) = 0; //!< Set a new name + virtual void SetName(const TString& theValue) = 0; //!< Set a new name + }; + + //--------------------------------------------------------------- + //! Define a parent class for all MED entities that contains a sequence of numbers + /*! + It defines through corresponding enumeration (EModeSwitch) how the sequence + should be interpreted in C or Fortran mode (eFULL_INTERLACE or eNON_INTERLACE). + */ + struct MEDWRAPPER_EXPORT TModeSwitchInfo: virtual TBase + { + //! To construct instance of the class by default + TModeSwitchInfo(): + myModeSwitch(eFULL_INTERLACE) + {} + + //! To construct instance of the class + TModeSwitchInfo(EModeSwitch theModeSwitch): + myModeSwitch(theModeSwitch) + {} + + EModeSwitch myModeSwitch; //!< Keeps the interlace mode + EModeSwitch GetModeSwitch() const { return myModeSwitch; } + }; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Mesh entity + struct MEDWRAPPER_EXPORT TMeshInfo: virtual TNameInfo + { + TInt myDim; //!< Dimension of the mesh (0, 1, 2 or 3) + TInt GetDim() const { return myDim; } //!< Gets dimension of the mesh + + TInt mySpaceDim; + TInt GetSpaceDim() const { return mySpaceDim; } + + EMaillage myType; //!< Type of the mesh + EMaillage GetType() const { return myType; } //!< Gets type of the mesh + + TString myDesc; //!< Description of the mesh + virtual std::string GetDesc() const = 0; //!< Get description for the mesh + virtual void SetDesc(const std::string& theValue) = 0; //!< Sets description for the mesh + }; + + //--------------------------------------------------------------- + typedef TSlice TIntVecSlice; + typedef TCSlice TCIntVecSlice; + typedef TIntVector TFamAttr; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Family entity + struct MEDWRAPPER_EXPORT TFamilyInfo: virtual TNameInfo + { + PMeshInfo myMeshInfo; //!< A reference to correspondig MED Mesh + //! Get a reference to corresponding MED Mesh + const PMeshInfo& GetMeshInfo() const { return myMeshInfo; } + + TInt myId; //!< An unique index of the MED FAMILY + TInt GetId() const { return myId; } //!< Gets number of the MED FAMILY + void SetId(TInt theId) { myId = theId; } //! Define number of the MED FAMILY + + TInt myNbGroup; //!< Defines number MED Groups connected to + //! Gets number of MED GROUPS the MED FAMILY is bound to + TInt GetNbGroup() const { return myNbGroup; } + + //! Contains sequence of the names for the MED Groups connected to + TString myGroupNames; + //! Gets name of a bound MED GROUP by its number + virtual std::string GetGroupName(TInt theId) const = 0; + //! Sets name of the defined MED GROUP by its number + virtual void SetGroupName(TInt theId, const std::string& theValue) = 0; + + TInt myNbAttr; //!< Defines number of the MED Family attributes + //! Gets number of attached attributes for the MED FAMILY + TInt GetNbAttr() const { return myNbAttr; } + + //! Defines sequence of the indexes of the MED Family attributes + TFamAttr myAttrId; + //! Get MED FAMILY attribute by its number + TInt GetAttrId(TInt theId) const; + //! Set MED FAMILY attribute by its number + void SetAttrId(TInt theId, TInt theVal); + + //! Defines sequence of the values of the MED Family attributes + TFamAttr myAttrVal; + //! Get MED FAMILY attribute by its number + TInt GetAttrVal(TInt theId) const; + //! Set MED FAMILY attribute by its number + void SetAttrVal(TInt theId, TInt theVal); + + //! Defines sequence of the names of the MED Family attributes + TString myAttrDesc; + //! Get value of the MED FAMILY attribute by its number + virtual std::string GetAttrDesc(TInt theId) const = 0; + //! Set value of the MED FAMILY attribute by its number + virtual void SetAttrDesc(TInt theId, const std::string& theValue) = 0; + }; + + //--------------------------------------------------------------- + typedef TIntVector TElemNum; + typedef SharedPtr PElemNum; + + //--------------------------------------------------------------- + //! Define a parent class for all MED entities that describes mesh entites such as nodes and cells. + struct MEDWRAPPER_EXPORT TElemInfo: virtual TBase + { + PMeshInfo myMeshInfo; //!< A reference to correspondig MED Mesh + //! Get a reference to corresponding MED Mesh + const PMeshInfo& GetMeshInfo() const { return myMeshInfo; } + + TInt myNbElem; // TFloatVecSlice; + typedef TCSlice TCFloatVecSlice; + typedef TFloatVector TNodeCoord; + typedef SharedPtr PNodeCoord; + typedef TFloatVecSlice TCoordSlice; + typedef TCFloatVecSlice TCCoordSlice; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Nodes entity + struct MEDWRAPPER_EXPORT TNodeInfo: + virtual TElemInfo, + virtual TModeSwitchInfo + { + PNodeCoord myCoord; //!< Contains all nodal coordinates + + //! Gives coordinates for mesh node by its number (const version) + TCCoordSlice GetCoordSlice(TInt theId) const; + //! Gives coordinates for mesh node by its number + TCoordSlice GetCoordSlice(TInt theId); + + ERepere mySystem; //!< Defines, which coordinate system is used + //! Get which coordinate system is used for the node describing + ERepere GetSystem() const { return mySystem; } + //! Set coordinate system to be used for the node describing + void SetSystem(ERepere theSystem) { mySystem = theSystem; } + + TString myCoordNames; //!< Contains names for the coordinate dimensions + //! Get name of the coordinate dimension by its order number + virtual std::string GetCoordName(TInt theId) const = 0; + //! Set name of the coordinate dimension by its order number + virtual void SetCoordName(TInt theId, const std::string& theValue) = 0; + + TString myCoordUnits; //!< Contains units for the coordinate dimensions + //! Get name of unit for the coordinate dimension by its order number + virtual std::string GetCoordUnit(TInt theId) const = 0; + //! Set name of unit for the coordinate dimension by its order number + virtual void SetCoordUnit(TInt theId, const std::string& theValue) = 0; + }; + + //--------------------------------------------------------------- + typedef TIntVecSlice TConnSlice; + typedef TCIntVecSlice TCConnSlice; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Cells entity + struct MEDWRAPPER_EXPORT TCellInfo: + virtual TElemInfo, + virtual TModeSwitchInfo + { + EEntiteMaillage myEntity; //!< Defines the MED Entity where the mesh cells belongs to + //! Find out what MED ENTITY the cells belong to + EEntiteMaillage GetEntity() const { return myEntity; } + + EGeometrieElement myGeom; //!< Defines the MED Geometric type of the instance + //! Find out what MED geometrical type the cells belong to + EGeometrieElement GetGeom() const { return myGeom; } + + EConnectivite myConnMode; //!< Defines connectivity mode + //! Find out in what connectivity the cells are writen + EConnectivite GetConnMode() const { return myConnMode; } + + virtual TInt GetConnDim() const = 0; //!< Gives step in the connectivity sequence + + PElemNum myConn; //!< Defines sequence which describe connectivity for each of mesh cell + + //! Gives connectivities for mesh cell by its number (const version) + TCConnSlice GetConnSlice(TInt theElemId) const; + //! Gives connectivities for mesh cell by its number + TConnSlice GetConnSlice(TInt theElemId); + }; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Polygon entity + struct MEDWRAPPER_EXPORT TPolygoneInfo: + virtual TElemInfo + { + //! Defines the MED Entity where the polygons belongs to + EEntiteMaillage myEntity; // MED_FACE|MED_MAILLE + //! Find out what MED ENTITY the MED Polygons belong to + EEntiteMaillage GetEntity() const { return myEntity; } + + //! Defines the MED Geometric type of the instance + EGeometrieElement myGeom; // ePOLYGONE + //! Find out what MED geometrical type the MED Polygons belong to + EGeometrieElement GetGeom() const { return ePOLYGONE; } + + //! Defines connectivity mode + EConnectivite myConnMode; // eNOD|eDESC(eDESC not used) + //! Find out in what connectivity the cells are writen + EConnectivite GetConnMode() const { return myConnMode; } + + PElemNum myConn; //!< Table de connectivities + PElemNum myIndex; //!< Table de indexes + + //! Gives number of the connectivities for the defined polygon + TInt GetNbConn(TInt theElemId) const; + + //! Gives connectivities for polygon by its number (const version) + TCConnSlice GetConnSlice(TInt theElemId) const; + //! Gives connectivities for polygon by its number + TConnSlice GetConnSlice(TInt theElemId); + }; + + //--------------------------------------------------------------- + //! Define a class representing MED_BALL structure element. + /*! + This could be a generic class for any structure element + holding any number of contant and variable attributes + but it's too hard to implement + */ + struct MEDWRAPPER_EXPORT TBallInfo: + virtual TCellInfo + { + TFloatVector myDiameters; + }; + + //--------------------------------------------------------------- + typedef TVector TCConnSliceArr; + typedef TVector TConnSliceArr; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Polyedre entity + struct MEDWRAPPER_EXPORT TPolyedreInfo: + virtual TElemInfo + { + //! Defines the MED Entity where the polyedres belongs to + EEntiteMaillage myEntity; // MED_FACE|MED_MAILLE + //! Find out what MED ENTITY the MED Polyedres belong to + EEntiteMaillage GetEntity() const { return myEntity; } + + //! Defines the MED Geometric type of the instance + EGeometrieElement myGeom; // ePOLYEDRE + //! Find out what MED geometrical type the MED Polyedres belong to + EGeometrieElement GetGeom() const { return ePOLYEDRE; } + + //! Defines connectivity mode + EConnectivite myConnMode; // eNOD|eDESC(eDESC not used) + //! Find out in what connectivity the cells are writen + EConnectivite GetConnMode() const { return myConnMode; } + + PElemNum myConn; //!< Table de connectivities + PElemNum myFaces; //!< Table de faces indexes + PElemNum myIndex; //!< Table de indexes + + //! Gives number of the faces for the defined polyedre (const version) + TInt GetNbFaces(TInt theElemId) const; + //! Gives number of the nodes for the defined polyedre + TInt GetNbNodes(TInt theElemId) const; + + //! Gives sequence of the face connectivities for polyedre by its number (const version) + TCConnSliceArr GetConnSliceArr(TInt theElemId) const; + //! Gives sequence of the face connectivities for polyedre by its number + TConnSliceArr GetConnSliceArr(TInt theElemId); + }; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Field entity + struct MEDWRAPPER_EXPORT TFieldInfo: + virtual TNameInfo + { + PMeshInfo myMeshInfo; //!< A reference to corresponding MED Mesh + //! Get a reference to corresponding MED Mesh + const PMeshInfo& GetMeshInfo() const { return myMeshInfo; } + + ETypeChamp myType; //!< Defines type of MED Field + //! Find out what type of MED FIELD is used + ETypeChamp GetType() const { return myType; } + + TInt myNbComp; //!< Defines number of components stored in the field + //! Get number of components for MED FIELD + TInt GetNbComp() const { return myNbComp; } + + EBooleen myIsLocal; //!< Defines if the MED Field is local + //! Find out if MED FIELD is local or not + EBooleen GetIsLocal() const { return myIsLocal; } + + TInt myNbRef; //!< Defines number of references of the field + //! Find out number of references for the MED FIELD + TInt GetNbRef() const { return myNbRef; } + + TString myCompNames; //!< Contains names for each of MED Field components + //! Get name of the component by its order number + virtual std::string GetCompName(TInt theId) const = 0; + //! Set name for the component by its order number + virtual void SetCompName(TInt theId, const std::string& theValue) = 0; + + TString myUnitNames; //!< Contains units for each of MED Field components + //! Get unit of the component by its order number + virtual std::string GetUnitName(TInt theId) const = 0; + //! Set unit for the component by its order number + virtual void SetUnitName(TInt theId, const std::string& theValue) = 0; + }; + + //--------------------------------------------------------------- + //! Get dimension of the Gauss coordinates for the defined type of mesh cell + MEDWRAPPER_EXPORT + TInt + GetDimGaussCoord(EGeometrieElement theGeom); + + //--------------------------------------------------------------- + //! Get number of referenced nodes for the defined type of mesh cell + MEDWRAPPER_EXPORT + TInt + GetNbRefCoord(EGeometrieElement theGeom); + + //--------------------------------------------------------------- + typedef TFloatVector TWeight; + + //--------------------------------------------------------------- + //! The class represents MED Gauss entity + struct MEDWRAPPER_EXPORT TGaussInfo: + virtual TNameInfo, + virtual TModeSwitchInfo + { + typedef boost::tuple TKey; + typedef boost::tuple TInfo; + struct MEDWRAPPER_EXPORT TLess + { + bool + operator()(const TKey& theLeft, const TKey& theRight) const; + + bool + operator()(const TGaussInfo& theLeft, const TGaussInfo& theRight) const; + }; + + //! Defines, which geometrical type the MED Gauss entity belongs to + EGeometrieElement myGeom; + //! Find out what MED geometrical type the MED GAUSS entity belong to + EGeometrieElement GetGeom() const { return myGeom; } + + //! Contains coordinates for the refereced nodes + TNodeCoord myRefCoord; + + //! Gives coordinates for the referenced node by its number + TCCoordSlice GetRefCoordSlice(TInt theId) const; + //! Gives coordinates for the referenced node by its number + TCoordSlice GetRefCoordSlice(TInt theId); + + //! Contains coordinates for the Gauss points + TNodeCoord myGaussCoord; + + //! Gives coordinates for the Gauss points by its number + TCCoordSlice GetGaussCoordSlice(TInt theId) const; + //! Gives coordinates for the Gauss points by its number + TCoordSlice GetGaussCoordSlice(TInt theId); + + //! Contains wheights for the Gauss points + TWeight myWeight; + + //! Gives number of the referenced nodes + TInt GetNbRef() const { return GetNbRefCoord(GetGeom()); } + + //! Gives dimension of the referenced nodes + TInt GetDim() const { return GetDimGaussCoord(GetGeom()); } + + //! Gives number of the Gauss Points + TInt GetNbGauss() const { return (TInt)(myGaussCoord.size() / GetDim()); } + }; + + //--------------------------------------------------------------- + typedef std::map TGeom2Gauss; + typedef std::map TGeom2NbGauss; + + //--------------------------------------------------------------- + //! Define a base class which represents MED TimeStamp + struct MEDWRAPPER_EXPORT TTimeStampInfo: + virtual TBase + { + PFieldInfo myFieldInfo; //!< A reference to correspondig MED Field + //! Get a reference to corresponding MED Field + const PFieldInfo& GetFieldInfo() const { return myFieldInfo; } + + //! Defines the MED Entity where the MED TimeStamp belongs to + EEntiteMaillage myEntity; + //! Find out to what MED Entity the MED TimeStamp belong to + EEntiteMaillage GetEntity() const { return myEntity; } + + //! Keeps map of number of cells per geometric type where the MED TimeStamp belongs to + TGeom2Size myGeom2Size; + //! Get map of number of cells per geometric type where the MED TimeStamp belongs to + const TGeom2Size& GetGeom2Size() const { return myGeom2Size; } + + TGeom2NbGauss myGeom2NbGauss; //!< Keeps number of the Gauss Points for the MED TimeStamp + TInt GetNbGauss(EGeometrieElement theGeom) const; //!< Gives number of the Gauss Points for the MED TimeStamp + + TInt myNumDt; //!< Keeps number in time for the MED TimeStamp + TInt GetNumDt() const { return myNumDt; } //!< Defines number in time for the MED TimeStamp + + TInt myNumOrd; //!< Keeps number for the MED TimeStamp + TInt GetNumOrd() const { return myNumOrd; } //!< Defines number for the MED TimeStamp + + TFloat myDt; //!< Keeps time for the MED TimeStamp + TFloat GetDt() const { return myDt; } //!< Defines time for the MED TimeStamp + + //! Keeps map of MED Gauss entityes per geometric type + TGeom2Gauss myGeom2Gauss; + //! Gets a map of MED Gauss entityes per geometric type + const TGeom2Gauss& GetGeom2Gauss() const { return myGeom2Gauss; } + + TString myUnitDt; //!< Defines unit for the time for the MED TimeStamp + //! Get unit of time for the MED TimeStamp + virtual std::string GetUnitDt() const = 0; + //! Set unit of time for the MED TimeStamp + virtual void SetUnitDt(const std::string& theValue) = 0; + }; + + //--------------------------------------------------------------- + //! The class represents MED Profile entity + struct MEDWRAPPER_EXPORT TProfileInfo: + virtual TNameInfo + { + typedef std::string TKey; + typedef boost::tuple TInfo; + + EModeProfil myMode; //!< Keeps mode for the MED Profile + //! Find out what mode of MED Profile is used + EModeProfil GetMode() const { return myMode; } + //! Set mode for the MED Profile + void SetMode(EModeProfil theMode) { myMode = theMode; } + + PElemNum myElemNum; //!< Keeps sequence of cell by its number which belong to the profile + //! Get number of mesh elelemts by its order number + TInt GetElemNum(TInt theId) const; + //! Set number of mesh elelemts by its order number + void SetElemNum(TInt theId, TInt theVal); + + //! Find out if the MED Profile defined + bool IsPresent() const { return GetName() != ""; } + + //! Find out size of the MED Profile + TInt GetSize() const { return (TInt)myElemNum->size(); } + }; + + //--------------------------------------------------------------- + //! The class is a helper one. It provide safe and flexible way to get access to values for a MED TimeStamp + struct MEDWRAPPER_EXPORT TMeshValueBase: + virtual TModeSwitchInfo + { + TInt myNbElem; + TInt myNbComp; + TInt myNbGauss; + TInt myStep; + + TMeshValueBase(); + + //! Initialize the class + void + Allocate(TInt theNbElem, + TInt theNbGauss, + TInt theNbComp, + EModeSwitch theMode = eFULL_INTERLACE); + + //! Returns size of the value container + size_t + GetSize() const; + + //! Returns MED interpetation of the value size + size_t + GetNbVal() const; + + //! Returns number of Gauss Points bounded with the value + size_t + GetNbGauss() const; + + //! Returns step inside of the data array + size_t + GetStep() const; + + //! Returns bare pointer on the internal value representation + virtual + unsigned char* + GetValuePtr() = 0; + }; + + //--------------------------------------------------------------- + //! The class is a helper one. It provide safe and flexible way to get access to values for a MED TimeStamp + template + struct TTMeshValue: + virtual TMeshValueBase + { + typedef TValueType TValue; + typedef typename TValueType::value_type TElement; + + typedef TSlice TValueSlice; + typedef TCSlice TCValueSlice; + + typedef TVector TCValueSliceArr; + typedef TVector TValueSliceArr; + + TValue myValue; + + //! Initialize the class + void + Allocate(TInt theNbElem, + TInt theNbGauss, + TInt theNbComp, + EModeSwitch theMode = eFULL_INTERLACE) + { + TMeshValueBase::Allocate(theNbElem, theNbGauss, theNbComp, theMode); + myValue.resize(theNbElem * this->GetStep()); + } + + //! Returns bare pointer on the internal value representation + virtual + unsigned char* + GetValuePtr() + { + return (unsigned char*)&myValue[0]; + } + + //! Returns bare pointer on the internal value representation + virtual + TElement* + GetPointer() + { + return &myValue[0]; + } + + //! Returns bare pointer on the internal value representation + virtual + const TElement* + GetPointer() const + { + return &myValue[0]; + } + + //! Iteration through Gauss Points by their components + TCValueSliceArr + GetGaussValueSliceArr(TInt theElemId) const + { + TCValueSliceArr aValueSliceArr(myNbGauss); + if(GetModeSwitch() == eFULL_INTERLACE){ + TInt anId = theElemId * myStep; + for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ + aValueSliceArr[aGaussId] = + TCValueSlice(myValue, std::slice(anId, myNbComp, 1)); + anId += myNbComp; + } + } + else{ + for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ + aValueSliceArr[aGaussId] = + TCValueSlice(myValue, std::slice(theElemId, myNbComp, myStep)); + } + } + return aValueSliceArr; + } + + //! Iteration through Gauss Points by their components + TValueSliceArr + GetGaussValueSliceArr(TInt theElemId) + { + TValueSliceArr aValueSliceArr(myNbGauss); + if(GetModeSwitch() == eFULL_INTERLACE){ + TInt anId = theElemId*myStep; + for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ + aValueSliceArr[aGaussId] = + TValueSlice(myValue, std::slice(anId, myNbComp, 1)); + anId += myNbComp; + } + } + else{ + for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ + aValueSliceArr[aGaussId] = + TValueSlice(myValue, std::slice(theElemId, myNbComp, myStep)); + } + } + return aValueSliceArr; + } + + //! Iteration through components by corresponding Gauss Points + TCValueSliceArr + GetCompValueSliceArr(TInt theElemId) const + { + TCValueSliceArr aValueSliceArr(myNbComp); + if(GetModeSwitch() == eFULL_INTERLACE){ + TInt anId = theElemId*myStep; + for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){ + aValueSliceArr[aCompId] = + TCValueSlice(myValue, std::slice(anId, myNbGauss, myNbComp)); + anId += 1; + } + } + else{ + for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){ + aValueSliceArr[aCompId] = + TCValueSlice(myValue, std::slice(theElemId, myNbGauss, myStep)); + } + } + return aValueSliceArr; + } + + //! Iteration through components by corresponding Gauss Points + TValueSliceArr + GetCompValueSliceArr(TInt theElemId) + { + if(GetModeSwitch() == eFULL_INTERLACE){ + TValueSliceArr aValueSliceArr(myNbComp); + TInt anId = theElemId*myStep; + for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){ + aValueSliceArr[aCompId] = + TValueSlice(myValue, std::slice(anId, myNbGauss, myNbComp)); + anId += 1; + } + return aValueSliceArr; + } + else{ + TValueSliceArr aValueSliceArr(myNbGauss); + for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){ + aValueSliceArr[aGaussId] = + TValueSlice(myValue,std::slice(theElemId, myNbComp, myStep)); + } + return aValueSliceArr; + } + } + }; + + //--------------------------------------------------------------- + typedef TTMeshValue TFloatMeshValue; + typedef TTMeshValue TIntMeshValue; + + //--------------------------------------------------------------- + // Backward compatibility declarations + typedef TFloatVector TValue; + typedef TSlice TValueSlice; + typedef TCSlice TCValueSlice; + + typedef TVector TCValueSliceArr; + typedef TVector TValueSliceArr; + + typedef TFloatMeshValue TMeshValue; + typedef std::map TGeom2Value; + + //--------------------------------------------------------------- + typedef std::map TGeom2Profile; + typedef std::set TGeom; + + //--------------------------------------------------------------- + //! The class is a base class for MED TimeStamp values holder + struct MEDWRAPPER_EXPORT TTimeStampValueBase: + virtual TModeSwitchInfo + { + //! A reference to correspondig MED TimeStamp + PTimeStampInfo myTimeStampInfo; + //!< Get a reference to correspondig MED TimeStamp + const PTimeStampInfo& GetTimeStampInfo() const { return myTimeStampInfo; } + + //! Keeps set of MED EGeometrieElement which contains values for the timestamp + TGeomSet myGeomSet; + const TGeomSet& GetGeomSet() const { return myGeomSet; } + + //! Keeps map of MED Profiles per geometric type + TGeom2Profile myGeom2Profile; + //! Gets a map of MED Profiles per geometric type + const TGeom2Profile& GetGeom2Profile() const { return myGeom2Profile; } + + //! Gets type of the champ + virtual + ETypeChamp + GetTypeChamp() const = 0; + + //! Allocates values for the given geometry + virtual + void + AllocateValue(EGeometrieElement theGeom, + TInt theNbElem, + TInt theNbGauss, + TInt theNbComp, + EModeSwitch theMode = eFULL_INTERLACE) = 0; + + virtual + size_t + GetValueSize(EGeometrieElement theGeom) const = 0; + + virtual + size_t + GetNbVal(EGeometrieElement theGeom) const = 0; + + virtual + size_t + GetNbGauss(EGeometrieElement theGeom) const = 0; + + virtual + unsigned char* + GetValuePtr(EGeometrieElement theGeom) = 0; + }; + + //--------------------------------------------------------------- + //! The class implements a container for MED TimeStamp values + template + struct TTimeStampValue: + virtual TTimeStampValueBase + { + typedef TMeshValueType TTMeshValue; + typedef SharedPtr PTMeshValue; + typedef typename TMeshValueType::TElement TElement; + typedef std::map TTGeom2Value; + + ETypeChamp myTypeChamp; //second; + } + + //! Gets MED TimeStamp values for the given geometric type + PTMeshValue& + GetMeshValuePtr(EGeometrieElement theGeom) + { + myGeomSet.insert(theGeom); + if(myGeom2Value.find(theGeom) == myGeom2Value.end()){ + myGeom2Value[theGeom] = PTMeshValue(new TTMeshValue()); + return myGeom2Value[theGeom]; + } + return myGeom2Value[theGeom]; + } + + //! Gets MED TimeStamp values for the given geometric type (const version) + const TTMeshValue& + GetMeshValue(EGeometrieElement theGeom) const + { + return *(this->GetMeshValuePtr(theGeom)); + } + + //! Gets MED TimeStamp values for the given geometric type + TTMeshValue& + GetMeshValue(EGeometrieElement theGeom) + { + return *(this->GetMeshValuePtr(theGeom)); + } + }; + + //--------------------------------------------------------------- + typedef TTimeStampValue TFloatTimeStampValue; + typedef SharedPtr PFloatTimeStampValue; + + PFloatTimeStampValue MEDWRAPPER_EXPORT + CastToFloatTimeStampValue(const PTimeStampValueBase& theTimeStampValue); + + typedef TTimeStampValue TIntTimeStampValue; + typedef SharedPtr PIntTimeStampValue; + + PIntTimeStampValue MEDWRAPPER_EXPORT + CastToIntTimeStampValue(const PTimeStampValueBase& theTimeStampValue); + + //--------------------------------------------------------------- + template + void + CopyTimeStampValue(SharedPtr > theTimeStampValueFrom, + SharedPtr > theTimeStampValueTo) + { + typedef TTimeStampValue TimeStampValueTypeFrom; + typedef TTimeStampValue TimeStampValueTypeTo; + typedef typename TMeshValueTypeTo::TElement TElementTo; + + typename TimeStampValueTypeFrom::TTGeom2Value& aGeom2Value = theTimeStampValueFrom->myGeom2Value; + typename TimeStampValueTypeFrom::TTGeom2Value::const_iterator anIter = aGeom2Value.begin(); + for(; anIter != aGeom2Value.end(); anIter++){ + const EGeometrieElement& aGeom = anIter->first; + const typename TimeStampValueTypeFrom::TTMeshValue& aMeshValue = *anIter->second; + typename TimeStampValueTypeTo::TTMeshValue& aMeshValue2 = theTimeStampValueTo->GetMeshValue(aGeom); + aMeshValue2.Allocate(aMeshValue.myNbElem, + aMeshValue.myNbGauss, + aMeshValue.myNbComp, + aMeshValue.myModeSwitch); + const typename TimeStampValueTypeFrom::TTMeshValue::TValue& aValue = aMeshValue.myValue; + typename TimeStampValueTypeTo::TTMeshValue::TValue& aValue2 = aMeshValue2.myValue; + TInt aSize = aValue.size(); + for(TInt anId = 0; anId < aSize; anId++) + aValue2[anId] = TElementTo(aValue[anId]); + } + } + + //--------------------------------------------------------------- + template + void + CopyTimeStampValue(SharedPtr > theTimeStampValueFrom, + SharedPtr > theTimeStampValueTo) + { + typedef TTimeStampValue TimeStampValueType; + typename TimeStampValueType::TTGeom2Value& aGeom2Value = theTimeStampValueFrom->myGeom2Value; + typename TimeStampValueType::TTGeom2Value::const_iterator anIter = aGeom2Value.begin(); + for(; anIter != aGeom2Value.end(); anIter++){ + const EGeometrieElement& aGeom = anIter->first; + const typename TimeStampValueType::TTMeshValue& aMeshValue = *anIter->second; + typename TimeStampValueType::TTMeshValue& aMeshValue2 = theTimeStampValueTo->GetMeshValue(aGeom); + aMeshValue2 = aMeshValue; + } + } + + //--------------------------------------------------------------- + inline + void + CopyTimeStampValueBase(const PTimeStampValueBase& theValueFrom, + const PTimeStampValueBase& theValueTo) + { + if(theValueFrom->GetTypeChamp() == theValueTo->GetTypeChamp()){ + if(theValueFrom->GetTypeChamp() == eFLOAT64) + CopyTimeStampValue(theValueFrom, theValueTo); + else if(theValueFrom->GetTypeChamp() == eINT) + CopyTimeStampValue(theValueFrom, theValueTo); + }else{ + if(theValueFrom->GetTypeChamp() == eFLOAT64 && theValueTo->GetTypeChamp() == eINT) + CopyTimeStampValue(theValueFrom, theValueTo); + else if(theValueFrom->GetTypeChamp() == eINT && theValueTo->GetTypeChamp() == eFLOAT64) + CopyTimeStampValue(theValueFrom, theValueTo); + } + } + + //--------------------------------------------------------------- + // Backward compatibility declarations + typedef TFloatTimeStampValue TTimeStampVal; + typedef PFloatTimeStampValue PTimeStampVal; + + //--------------------------------------------------------------- + typedef std::map TIndexes; + typedef std::map TNames; + + //--------------------------------------------------------------- + //! Define a base class which represents MED Grille (structured mesh) + struct MEDWRAPPER_EXPORT TGrilleInfo: + virtual TModeSwitchInfo + { + PMeshInfo myMeshInfo; + const PMeshInfo& GetMeshInfo() const { return myMeshInfo; } + + TNodeCoord myCoord; //!< Contains all nodal coordinates, now used only for eGRILLE_STANDARD + //! Gives coordinates for mesh nodes (const version) + const TNodeCoord& GetNodeCoord() const; + TNodeCoord& GetNodeCoord(); + //! Gives coordinates for mesh node by its number, array index from 0 + TNodeCoord GetCoord(TInt theId); + //! Gives ids of nodes for mesh cell or sub-cell by its number, array index from 0 + TIntVector GetConn(TInt theId, const bool isSub=false); + + EGrilleType myGrilleType; //!< Defines grille type (eGRILLE_CARTESIENNE,eGRILLE_POLAIRE,eGRILLE_STANDARD) + //!Gets grille type (const version) + const EGrilleType& GetGrilleType() const; + //!Gets grille type + EGrilleType GetGrilleType(); + //!Sets grille type + void SetGrilleType(EGrilleType theGrilleType); + + TString myCoordNames; //!< Contains names for the coordinate dimensions + //! Get name of the coordinate dimension by its order number + virtual std::string GetCoordName(TInt theId) const = 0 ; + //! Set name of the coordinate dimension by its order number + virtual void SetCoordName(TInt theId, const std::string& theValue) = 0; + + TString myCoordUnits; //!< Contains units for the coordinate dimensions + //! Get name of unit for the coordinate dimension by its order number + virtual std::string GetCoordUnit(TInt theId) const = 0; + //! Set name of unit for the coordinate dimension by its order number + virtual void SetCoordUnit(TInt theId, const std::string& theValue) = 0; + + //! Map of index of axes and Table of indexes for certain axe, now used for eGRILLE_CARTESIENNE and eGRILLE_POLAIRE + TIndexes myIndixes; + //!Gets a map of Tables (const version) + const TIndexes& GetMapOfIndexes() const ; + //!Gets a map of Tables + TIndexes& GetMapOfIndexes(); + //!Gets a Table of indexes for certain axe(const version) + const TFloatVector& GetIndexes(TInt theAxisNumber) const; + //!Gets a Table of indexes for certain axe + TFloatVector& GetIndexes(TInt theAxisNumber); + //!Gets a number of indices per axe + TInt GetNbIndexes(TInt theAxisNumber); + + TInt GetNbNodes();//! Return count of all points + TInt GetNbCells();//! Return count of all cells + TInt GetNbSubCells();//! Return count of all entities of + EGeometrieElement GetGeom();//! Return geometry of cells (calculated from mesh dimension) + EGeometrieElement GetSubGeom();//! Return geometry of subcells (calculated from mesh dimension) + EEntiteMaillage GetEntity();//! Return entity (eMAILLE) + EEntiteMaillage GetSubEntity();//! Return sub entity + + /*! + *Vector of grille structure (Example: {3,4,5}, 3 nodes in X axe, 4 nodes in Y axe, ...) + */ + TIntVector myGrilleStructure; + //!Gets grille structure(const version) + const TIntVector& GetGrilleStructure() const; + //!Gets grille structure + TIntVector GetGrilleStructure(); + //!Sets the grille structure of theAxis axe to theNb. + void SetGrilleStructure(TInt theAxis,TInt theNb); + + /*! + *Defines sequence MED Family indexes for corresponding mesh entites + */ + TElemNum myFamNum; + //! Get number of a MED FAMILY by order number of the mesh element + TInt GetFamNum(TInt theId) const; + //! Set number of a MED FAMILY for the mesh element with the order number + void SetFamNum(TInt theId, TInt theVal); + + /*! + *Defines sequence MED Family indexes for sub entites + */ + TElemNum myFamSubNum; + //! Get number of a MED FAMILY by order number of sub element + TInt GetFamSubNum(TInt theId) const; + //! Set number of a MED FAMILY for theId-th sub element + void SetFamSubNum(TInt theId, TInt theVal); + + /*! + *Defines sequence MED Family indexes for corresponding mesh nodes + */ + TElemNum myFamNumNode; + //! Get number of a MED FAMILY by order number of the mesh node + TInt GetFamNumNode(TInt theId) const; + //! Set number of a MED FAMILY for the mesh node with the order number + void SetFamNumNode(TInt theId, TInt theVal); + }; +} + +#endif // MED_Structures_HeaderFile diff --git a/src/MEDWrapper/MED_TStructures.hxx b/src/MEDWrapper/MED_TStructures.hxx new file mode 100644 index 000000000..b687ce369 --- /dev/null +++ b/src/MEDWrapper/MED_TStructures.hxx @@ -0,0 +1,1193 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_TStructures_HeaderFile +#define MED_TStructures_HeaderFile + +#include "MED_Structures.hxx" + +#ifdef WIN32 +#pragma warning(disable:4250) +#endif + +namespace MED +{ + //--------------------------------------------------------------- + //! To provide a common way to handle values of MEDWrapper types as native MED types + template + struct TValueHolder + { + TValue& myValue; + TRepresentation myRepresentation; + + TValueHolder(TValue& theValue): + myValue(theValue), + myRepresentation(TRepresentation(theValue)) + {} + + ~TValueHolder() + { + myValue = TValue(myRepresentation); + } + + TRepresentation* + operator& () + { + return &myRepresentation; + } + + operator TRepresentation () const + { + return myRepresentation; + } + + const TValue& + operator() () const + { + return myValue; + } + }; + + //! To customize TValueHolder common template definition for TVector + template + struct TValueHolder, TRepresentation> + { + typedef TVector TValue; + TValue& myValue; + TRepresentation* myRepresentation; + + TValueHolder(TValue& theValue): + myValue(theValue) + { + if(theValue.empty()) + myRepresentation = (TRepresentation*)NULL; + else + myRepresentation = (TRepresentation*)&theValue[0]; + } + + TRepresentation* + operator& () + { + return myRepresentation; + } + }; + + //--------------------------------------------------------------- + struct TTNameInfo: virtual TNameInfo + { + TTNameInfo(const std::string& theValue) + { + myName.resize(GetNOMLength()+1); + SetName(theValue); + } + + virtual + std::string + GetName() const + { + return GetString(0, GetNOMLength(), myName); + } + + virtual + void + SetName(const std::string& theValue) + { + SetString(0, GetNOMLength(), myName, theValue); + } + + virtual + void + SetName(const TString& theValue) + { + SetString(0, GetNOMLength(), myName, theValue); + } + }; + + //--------------------------------------------------------------- + struct TTMeshInfo: + virtual TMeshInfo, + virtual TTNameInfo + { + typedef TTNameInfo TNameInfoBase; + + TTMeshInfo(const PMeshInfo& theInfo): + TNameInfoBase(theInfo->GetName()) + { + myDim = theInfo->GetDim(); + mySpaceDim = theInfo->GetSpaceDim(); + myType = theInfo->GetType(); + + myDesc.resize(GetDESCLength()+1); + SetDesc(theInfo->GetDesc()); + } + + TTMeshInfo(TInt theDim, TInt theSpaceDim, + const std::string& theValue, + EMaillage theType, + const std::string& theDesc): + TNameInfoBase(theValue) + { + myDim = theDim; + mySpaceDim = theSpaceDim; + myType = theType; + + myDesc.resize(GetDESCLength()+1); + SetDesc(theDesc); + } + + virtual + std::string + GetDesc() const + { + return GetString(0, GetDESCLength(), myDesc); + } + + virtual + void + SetDesc(const std::string& theValue) + { + SetString(0, GetDESCLength(), myDesc, theValue); + } + }; + + //--------------------------------------------------------------- + struct TTFamilyInfo: + virtual TFamilyInfo, + virtual TTNameInfo + { + typedef TTNameInfo TNameInfoBase; + + TTFamilyInfo(const PMeshInfo& theMeshInfo, const PFamilyInfo& theInfo): + TNameInfoBase(theInfo->GetName()) + { + myMeshInfo = theMeshInfo; + + myId = theInfo->GetId(); + + myNbGroup = theInfo->GetNbGroup(); + myGroupNames.resize(myNbGroup*GetLNOMLength()+1); + if(myNbGroup){ + for(TInt anId = 0; anId < myNbGroup; anId++){ + SetGroupName(anId,theInfo->GetGroupName(anId)); + } + } + + myNbAttr = theInfo->GetNbAttr(); + myAttrId.resize(myNbAttr); + myAttrVal.resize(myNbAttr); + myAttrDesc.resize(myNbAttr*GetDESCLength()+1); + if(myNbAttr){ + for(TInt anId = 0; anId < myNbAttr; anId++){ + SetAttrDesc(anId,theInfo->GetAttrDesc(anId)); + myAttrVal[anId] = theInfo->GetAttrVal(anId); + myAttrId[anId] = theInfo->GetAttrId(anId); + } + } + } + + TTFamilyInfo(const PMeshInfo& theMeshInfo, + TInt theNbGroup, + TInt theNbAttr, + TInt theId, + const std::string& theValue): + TNameInfoBase(theValue) + { + myMeshInfo = theMeshInfo; + + myId = theId; + + myNbGroup = theNbGroup; + myGroupNames.resize(theNbGroup*GetLNOMLength()+1); + + myNbAttr = theNbAttr; + myAttrId.resize(theNbAttr); + myAttrVal.resize(theNbAttr); + myAttrDesc.resize(theNbAttr*GetDESCLength()+1); + } + + TTFamilyInfo(const PMeshInfo& theMeshInfo, + const std::string& theValue, + TInt theId, + const TStringSet& theGroupNames, + const TStringVector& theAttrDescs, + const TIntVector& theAttrIds, + const TIntVector& theAttrVals): + TNameInfoBase(theValue) + { + myMeshInfo = theMeshInfo; + + myId = theId; + + myNbGroup = (TInt)theGroupNames.size(); + myGroupNames.resize(myNbGroup*GetLNOMLength()+1); + if(myNbGroup){ + TStringSet::const_iterator anIter = theGroupNames.begin(); + for(TInt anId = 0; anIter != theGroupNames.end(); anIter++, anId++){ + const std::string& aVal = *anIter; + SetGroupName(anId,aVal); + } + } + + myNbAttr = (TInt)theAttrDescs.size(); + myAttrId.resize(myNbAttr); + myAttrVal.resize(myNbAttr); + myAttrDesc.resize(myNbAttr*GetDESCLength()+1); + if(myNbAttr){ + for(TInt anId = 0, anEnd = (TInt)theAttrDescs.size(); anId < anEnd; anId++){ + SetAttrDesc(anId,theAttrDescs[anId]); + myAttrVal[anId] = theAttrVals[anId]; + myAttrId[anId] = theAttrIds[anId]; + } + } + } + + virtual + std::string + GetGroupName(TInt theId) const + { + return GetString(theId, GetLNOMLength(), myGroupNames); + } + + virtual + void + SetGroupName(TInt theId, const std::string& theValue) + { + SetString(theId, GetLNOMLength(), myGroupNames, theValue); + } + + virtual + std::string + GetAttrDesc(TInt theId) const + { + return GetString(theId, GetDESCLength(), myAttrDesc); + } + + virtual + void + SetAttrDesc(TInt theId, const std::string& theValue) + { + SetString(theId, GetDESCLength(), myAttrDesc, theValue); + } + }; + + //--------------------------------------------------------------- + struct TTElemInfo: virtual TElemInfo + { + TTElemInfo(const PMeshInfo& theMeshInfo, const PElemInfo& theInfo) + { + myMeshInfo = theMeshInfo; + + myNbElem = theInfo->GetNbElem(); + myFamNum.reset(new TElemNum(myNbElem)); + myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum() + + myIsElemNum = theInfo->IsElemNum(); + if(theInfo->IsElemNum()) + myElemNum.reset(new TElemNum(myNbElem)); + else + myElemNum.reset(new TElemNum()); + + myIsElemNames = theInfo->IsElemNames(); + if(theInfo->IsElemNames()) + myElemNames.reset(new TString(myNbElem*GetPNOMLength() + 1)); + else + myElemNames.reset(new TString()); + + if(theInfo->GetNbElem()){ + for(TInt anId = 0; anId < myNbElem; anId++){ + SetFamNum(anId, theInfo->GetFamNum(anId)); + } + if(theInfo->IsElemNum() == eVRAI){ + for(TInt anId = 0; anId < myNbElem; anId++){ + SetElemNum(anId, theInfo->GetElemNum(anId)); + } + } + if(theInfo->IsElemNames() == eVRAI){ + for(TInt anId = 0; anId < myNbElem; anId++){ + SetElemName(anId,theInfo->GetElemName(anId)); + } + } + } + } + + TTElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EBooleen theIsElemNum, + EBooleen theIsElemNames) + { + myMeshInfo = theMeshInfo; + + myNbElem = theNbElem; + myFamNum.reset(new TElemNum(theNbElem)); + myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum() + + myIsElemNum = theIsElemNum; + if(theIsElemNum) + myElemNum.reset(new TElemNum(theNbElem)); + else + myElemNum.reset(new TElemNum()); + + myIsElemNames = theIsElemNames; + if(theIsElemNames) + myElemNames.reset(new TString(theNbElem*GetPNOMLength() + 1)); + else + myElemNames.reset(new TString()); + } + + TTElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames) + { + myMeshInfo = theMeshInfo; + + myNbElem = theNbElem; + myFamNum.reset(new TElemNum(theNbElem)); + myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum() + + myIsElemNum = theElemNums.size()? eVRAI: eFAUX; + if(myIsElemNum) + myElemNum.reset(new TElemNum(theNbElem)); + else + myElemNum.reset(new TElemNum()); + + myIsElemNames = theElemNames.size()? eVRAI: eFAUX; + if(myIsElemNames) + myElemNames.reset(new TString(theNbElem*GetPNOMLength() + 1)); + else + myElemNames.reset(new TString()); + + if(theNbElem){ + + if(theFamilyNums.size()) + *myFamNum = theFamilyNums; + + if(myIsElemNum) + *myElemNum = theElemNums; + + if(myIsElemNames){ + for(TInt anId = 0; anId < theNbElem; anId++){ + const std::string& aVal = theElemNames[anId]; + SetElemName(anId,aVal); + } + } + } + } + + virtual + std::string + GetElemName(TInt theId) const + { + return GetString(theId,GetPNOMLength(), *myElemNames); + } + + virtual + void + SetElemName(TInt theId, const std::string& theValue) + { + SetString(theId,GetPNOMLength(), *myElemNames, theValue); + } + }; + + //--------------------------------------------------------------- + struct TTNodeInfo: + virtual TNodeInfo, + virtual TTElemInfo + { + typedef TTElemInfo TElemInfoBase; + + TTNodeInfo(const PMeshInfo& theMeshInfo, const PNodeInfo& theInfo): + TNodeInfo(theInfo), + TElemInfoBase(theMeshInfo, theInfo) + { + myModeSwitch = theInfo->GetModeSwitch(); + + mySystem = theInfo->GetSystem(); + + myCoord.reset(new TNodeCoord(*theInfo->myCoord)); + + TInt aSpaceDim = theMeshInfo->GetSpaceDim(); + + myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); + for(TInt anId = 0; anId < aSpaceDim; anId++) + SetCoordName(anId,theInfo->GetCoordName(anId)); + + myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); + for(TInt anId = 0; anId < aSpaceDim; anId++) + SetCoordUnit(anId,theInfo->GetCoordUnit(anId)); + } + + TTNodeInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EModeSwitch theMode, + ERepere theSystem, + EBooleen theIsElemNum, + EBooleen theIsElemNames): + TModeSwitchInfo(theMode), + TElemInfoBase(theMeshInfo, + theNbElem, + theIsElemNum, + theIsElemNames) + { + mySystem = theSystem; + + myCoord.reset(new TNodeCoord(theNbElem * theMeshInfo->mySpaceDim)); + + myCoordUnits.resize(theMeshInfo->mySpaceDim*GetPNOMLength()+1); + + myCoordNames.resize(theMeshInfo->mySpaceDim*GetPNOMLength()+1); + } + + + TTNodeInfo(const PMeshInfo& theMeshInfo, + const TFloatVector& theNodeCoords, + EModeSwitch theMode, + ERepere theSystem, + const TStringVector& theCoordNames, + const TStringVector& theCoordUnits, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames): + TModeSwitchInfo(theMode), + TElemInfoBase(theMeshInfo, + (TInt)theNodeCoords.size()/theMeshInfo->GetDim(), + theFamilyNums, + theElemNums, + theElemNames) + { + mySystem = theSystem; + + myCoord.reset(new TNodeCoord(theNodeCoords)); + + TInt aSpaceDim = theMeshInfo->GetSpaceDim(); + + myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); + if(!theCoordNames.empty()) + for(TInt anId = 0; anId < aSpaceDim; anId++) + SetCoordName(anId,theCoordNames[anId]); + + myCoordUnits.resize(aSpaceDim*GetPNOMLength() + 1); + if(!theCoordUnits.empty()) + for(TInt anId = 0; anId < aSpaceDim; anId++) + SetCoordUnit(anId, theCoordUnits[anId]); + } + + virtual + std::string + GetCoordName(TInt theId) const + { + return GetString(theId,GetPNOMLength(),myCoordNames); + } + + virtual + void + SetCoordName(TInt theId, const std::string& theValue) + { + SetString(theId,GetPNOMLength(),myCoordNames,theValue); + } + + virtual + std::string + GetCoordUnit(TInt theId) const + { + return GetString(theId,GetPNOMLength(),myCoordUnits); + } + + virtual + void + SetCoordUnit(TInt theId, const std::string& theValue) + { + SetString(theId,GetPNOMLength(),myCoordUnits,theValue); + } + }; + + //--------------------------------------------------------------- + struct TTPolygoneInfo: + virtual TPolygoneInfo, + virtual TTElemInfo + { + typedef TTElemInfo TElemInfoBase; + + TTPolygoneInfo(const PMeshInfo& theMeshInfo, const PPolygoneInfo& theInfo): + TElemInfoBase(theMeshInfo,theInfo) + { + myEntity = theInfo->GetEntity(); + myGeom = theInfo->GetGeom(); + + myIndex.reset(new TElemNum(*theInfo->myIndex)); + myConn.reset(new TElemNum(*theInfo->myConn)); + + myConnMode = theInfo->GetConnMode(); + } + + TTPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + TInt theConnSize, + EConnectivite theConnMode, + EBooleen theIsElemNum, + EBooleen theIsElemNames): + TElemInfoBase(theMeshInfo, + theNbElem, + theIsElemNum, + theIsElemNames) + { + myEntity = theEntity; + myGeom = theGeom; + + myIndex.reset(new TElemNum(theNbElem + 1)); + myConn.reset(new TElemNum(theConnSize)); + + myConnMode = theConnMode; + } + + TTPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theIndexes, + const TIntVector& theConnectivities, + EConnectivite theConnMode, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames): + TElemInfoBase(theMeshInfo, + (TInt)theIndexes.size() - 1, + theFamilyNums, + theElemNums, + theElemNames) + { + myEntity = theEntity; + myGeom = theGeom; + + myIndex.reset(new TElemNum(theIndexes)); + myConn.reset(new TElemNum(theConnectivities)); + + myConnMode = theConnMode; + } + }; + + //--------------------------------------------------------------- + struct TTPolyedreInfo: + virtual TPolyedreInfo, + virtual TTElemInfo + { + typedef TTElemInfo TElemInfoBase; + + TTPolyedreInfo(const PMeshInfo& theMeshInfo, const PPolyedreInfo& theInfo): + TElemInfoBase(theMeshInfo,theInfo) + { + myEntity = theInfo->GetEntity(); + myGeom = theInfo->GetGeom(); + + myIndex.reset(new TElemNum(*theInfo->myIndex)); + myFaces.reset(new TElemNum(*theInfo->myFaces)); + myConn.reset(new TElemNum(*theInfo->myConn)); + + myConnMode = theInfo->GetConnMode(); + } + + TTPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + TInt theNbFaces, + TInt theConnSize, + EConnectivite theConnMode, + EBooleen theIsElemNum, + EBooleen theIsElemNames): + TElemInfoBase(theMeshInfo, + theNbElem, + theIsElemNum, + theIsElemNames) + { + myEntity = theEntity; + myGeom = theGeom; + + myIndex.reset(new TElemNum(theNbElem + 1)); + myFaces.reset(new TElemNum(theNbFaces)); + myConn.reset(new TElemNum(theConnSize)); + + myConnMode = theConnMode; + } + + TTPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theIndexes, + const TIntVector& theFaces, + const TIntVector& theConnectivities, + EConnectivite theConnMode, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames): + TElemInfoBase(theMeshInfo, + (TInt)theIndexes.size()-1, + theFamilyNums, + theElemNums, + theElemNames) + { + myEntity = theEntity; + myGeom = theGeom; + + myIndex.reset(new TElemNum(theIndexes)); + myFaces.reset(new TElemNum(theFaces)); + myConn.reset(new TElemNum(theConnectivities)); + + myConnMode = theConnMode; + } + }; + + //--------------------------------------------------------------- + struct TTCellInfo: + virtual TCellInfo, + virtual TTElemInfo + { + typedef TTElemInfo TElemInfoBase; + + TTCellInfo(const PMeshInfo& theMeshInfo, const PCellInfo& theInfo): + TElemInfoBase(theMeshInfo,theInfo) + { + myEntity = theInfo->GetEntity(); + myGeom = theInfo->GetGeom(); + myConnMode = theInfo->GetConnMode(); + + TInt aConnDim = GetNbNodes(myGeom); + TInt aNbConn = GetNbConn(myGeom, myEntity, myMeshInfo->myDim); + myConn.reset(new TElemNum(myNbElem * aNbConn)); + for(TInt anElemId = 0; anElemId < myNbElem; anElemId++){ + TConnSlice aConnSlice = GetConnSlice(anElemId); + TCConnSlice aConnSlice2 = theInfo->GetConnSlice(anElemId); + for(TInt anConnId = 0; anConnId < aConnDim; anConnId++){ + aConnSlice[anConnId] = aConnSlice2[anConnId]; + } + } + } + + TTCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + EConnectivite theConnMode, + EBooleen theIsElemNum, + EBooleen theIsElemNames, + EModeSwitch theMode): + TModeSwitchInfo(theMode), + TElemInfoBase(theMeshInfo, + theNbElem, + theIsElemNum, + theIsElemNames) + { + myEntity = theEntity; + myGeom = theGeom; + + myConnMode = theConnMode; + TInt aNbConn = GetNbConn(theGeom, myEntity, theMeshInfo->myDim); + myConn.reset(new TElemNum(theNbElem * aNbConn)); + } + + TTCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theConnectivities, + EConnectivite theConnMode, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames, + EModeSwitch theMode): + TModeSwitchInfo(theMode), + TElemInfoBase(theMeshInfo, + (TInt)theConnectivities.size() / GetNbNodes(theGeom), + theFamilyNums, + theElemNums, + theElemNames) + { + myEntity = theEntity; + myGeom = theGeom; + + myConnMode = theConnMode; + TInt aConnDim = GetNbNodes(myGeom); + TInt aNbConn = GetNbConn(myGeom, myEntity, myMeshInfo->myDim); + myConn.reset(new TElemNum(myNbElem * aNbConn)); + for(TInt anElemId = 0; anElemId < myNbElem; anElemId++){ + TConnSlice aConnSlice = GetConnSlice(anElemId); + for(TInt anConnId = 0; anConnId < aConnDim; anConnId++){ + aConnSlice[anConnId] = theConnectivities[anElemId*aConnDim + anConnId]; + } + } + } + + virtual + TInt + GetConnDim() const + { + return GetNbConn(myGeom, myEntity, myMeshInfo->myDim); + } + + }; + + //--------------------------------------------------------------- + struct TTBallInfo: + virtual TBallInfo, + virtual TTCellInfo + { + typedef TTCellInfo TCellInfoBase; + + TTBallInfo(const PMeshInfo& theMeshInfo, const PBallInfo& theInfo): + TCellInfoBase::TElemInfoBase(theMeshInfo, theInfo), + TCellInfoBase(theMeshInfo,theInfo) + { + myDiameters = theInfo->myDiameters; + } + + TTBallInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EBooleen theIsElemNum ): + TCellInfoBase::TElemInfoBase(theMeshInfo, + theNbElem, + theIsElemNum, + /*theIsElemNames=*/eFAUX), + TCellInfoBase(theMeshInfo, + eSTRUCT_ELEMENT, + eBALL, + theNbElem, + /*EConnectivite=*/eNOD, + theIsElemNum, + /*theIsElemNames=*/eFAUX, + eFULL_INTERLACE) + { + myDiameters.resize( theNbElem ); + } + + TTBallInfo(const PMeshInfo& theMeshInfo, + const TIntVector& theNodes, + TFloatVector& theDiameters, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums): + TCellInfoBase::TElemInfoBase(theMeshInfo, + (TInt)std::max(theNodes.size(),theDiameters.size() ), + theFamilyNums, + theElemNums, + TStringVector()), + TCellInfoBase(theMeshInfo, + eSTRUCT_ELEMENT, + eBALL, + theNodes, + /*EConnectivite=*/eNOD, + theFamilyNums, + theElemNums, + TStringVector(), + eFULL_INTERLACE) + { + myDiameters.swap( theDiameters ); + } + }; + + //--------------------------------------------------------------- + struct TTFieldInfo: + virtual TFieldInfo, + virtual TTNameInfo + { + typedef TTNameInfo TNameInfoBase; + + TTFieldInfo(const PMeshInfo& theMeshInfo, const PFieldInfo& theInfo): + TNameInfoBase(theInfo->GetName()) + { + myMeshInfo = theMeshInfo; + + myNbComp = theInfo->GetNbComp(); + myCompNames.resize(myNbComp*GetPNOMLength()+1); + for(TInt anId = 0; anId < myNbComp; anId++){ + SetCompName(anId,theInfo->GetCompName(anId)); + } + + myUnitNames.resize(myNbComp*GetPNOMLength()+1); + for(TInt anId = 0; anId < myNbComp; anId++){ + SetUnitName(anId,theInfo->GetUnitName(anId)); + } + + myType = theInfo->GetType(); + + myIsLocal = theInfo->GetIsLocal(); + myNbRef = theInfo->GetNbRef(); + } + + TTFieldInfo(const PMeshInfo& theMeshInfo, + TInt theNbComp, + ETypeChamp theType, + const std::string& theValue, + EBooleen theIsLocal, + TInt theNbRef): + TNameInfoBase(theValue) + { + myMeshInfo = theMeshInfo; + + myNbComp = theNbComp; + myCompNames.resize(theNbComp*GetPNOMLength()+1); + myUnitNames.resize(theNbComp*GetPNOMLength()+1); + + myType = theType; + + myIsLocal = theIsLocal; + myNbRef = theNbRef; + } + + virtual + std::string + GetCompName(TInt theId) const + { + return GetString(theId,GetPNOMLength(),myCompNames); + } + + virtual + void + SetCompName(TInt theId, const std::string& theValue) + { + SetString(theId,GetPNOMLength(),myCompNames,theValue); + } + + virtual + std::string + GetUnitName(TInt theId) const + { + return GetString(theId,GetPNOMLength(),myUnitNames); + } + + virtual + void + SetUnitName(TInt theId, const std::string& theValue) + { + SetString(theId,GetPNOMLength(),myUnitNames,theValue); + } + }; + + //--------------------------------------------------------------- + struct TTGaussInfo: + virtual TGaussInfo, + virtual TTNameInfo + { + typedef TTNameInfo TNameInfoBase; + + TTGaussInfo(const TGaussInfo::TInfo& theInfo, + EModeSwitch theMode): + TModeSwitchInfo(theMode), + TNameInfoBase(boost::get<1>(boost::get<0>(theInfo))) + { + const TGaussInfo::TKey& aKey = boost::get<0>(theInfo); + + myGeom = boost::get<0>(aKey); + myRefCoord.resize(GetNbRef()*GetDim()); + + TInt aNbGauss = boost::get<1>(theInfo); + myGaussCoord.resize(aNbGauss*GetDim()); + myWeight.resize(aNbGauss); + } + }; + + //--------------------------------------------------------------- + struct TTTimeStampInfo: virtual TTimeStampInfo + { + TTTimeStampInfo(const PFieldInfo& theFieldInfo, const PTimeStampInfo& theInfo) + { + myFieldInfo = theFieldInfo; + + myEntity = theInfo->GetEntity(); + myGeom2Size = theInfo->GetGeom2Size(); + + myNumDt = theInfo->GetNumDt(); + myNumOrd = theInfo->GetNumOrd(); + myDt = theInfo->GetDt(); + + myUnitDt.resize(GetPNOMLength()+1); + SetUnitDt(theInfo->GetUnitDt()); + + myGeom2NbGauss = theInfo->myGeom2NbGauss; + myGeom2Gauss = theInfo->GetGeom2Gauss(); + } + + TTTimeStampInfo(const PFieldInfo& theFieldInfo, + EEntiteMaillage theEntity, + const TGeom2Size& theGeom2Size, + const TGeom2NbGauss& theGeom2NbGauss, + TInt theNumDt, + TInt theNumOrd, + TFloat theDt, + const std::string& theUnitDt, + const TGeom2Gauss& theGeom2Gauss) + { + myFieldInfo = theFieldInfo; + + myEntity = theEntity; + myGeom2Size = theGeom2Size; + + myNumDt = theNumDt; + myNumOrd = theNumDt; + myDt = theDt; + + myUnitDt.resize(GetPNOMLength()+1); + SetUnitDt(theUnitDt); + + myGeom2NbGauss = theGeom2NbGauss; + myGeom2Gauss = theGeom2Gauss; + } + + virtual + std::string + GetUnitDt() const + { + return GetString(0,GetPNOMLength(),myUnitDt); + } + + virtual + void + SetUnitDt(const std::string& theValue) + { + SetString(0,GetPNOMLength(),myUnitDt,theValue); + } + }; + + //--------------------------------------------------------------- + struct TTProfileInfo: + virtual TProfileInfo, + virtual TTNameInfo + { + typedef TTNameInfo TNameInfoBase; + + TTProfileInfo(const TProfileInfo::TInfo& theInfo, + EModeProfil theMode): + TNameInfoBase(boost::get<0>(theInfo)) + { + TInt aSize = boost::get<1>(theInfo); + myElemNum.reset(new TElemNum(aSize)); + myMode = aSize > 0? theMode: eNO_PFLMOD; + } + }; + + //--------------------------------------------------------------- + template + struct TTTimeStampValue: virtual TTimeStampValue + { + TTTimeStampValue(const PTimeStampInfo& theTimeStampInfo, + const PTimeStampValueBase& theInfo, + ETypeChamp theTypeChamp) + { + typedef TTimeStampValue TCompatible; + if(TCompatible* aCompatible = dynamic_cast(theInfo.get())){ + this->myTimeStampInfo = theTimeStampInfo; + this->myTypeChamp = theTypeChamp; + this->myGeom2Profile = aCompatible->GetGeom2Profile(); + this->myGeom2Value = aCompatible->myGeom2Value; + this->myGeomSet = aCompatible->GetGeomSet(); + }else + EXCEPTION(std::runtime_error,"TTTimeStampValue::TTTimeStampValue - use incompatible arguments!"); + } + + TTTimeStampValue(const PTimeStampInfo& theTimeStampInfo, + ETypeChamp theTypeChamp, + const TGeom2Profile& theGeom2Profile, + EModeSwitch theMode): + TModeSwitchInfo(theMode) + { + this->myTimeStampInfo = theTimeStampInfo; + + this->myTypeChamp = theTypeChamp; + + this->myGeom2Profile = theGeom2Profile; + + TInt aNbComp = theTimeStampInfo->myFieldInfo->myNbComp; + + const TGeom2Size& aGeom2Size = theTimeStampInfo->GetGeom2Size(); + TGeom2Size::const_iterator anIter = aGeom2Size.begin(); + for(; anIter != aGeom2Size.end(); anIter++){ + const EGeometrieElement& aGeom = anIter->first; + TInt aNbElem = anIter->second; + + MED::PProfileInfo aProfileInfo; + MED::TGeom2Profile::const_iterator anIter = theGeom2Profile.find(aGeom); + if(anIter != theGeom2Profile.end()) + aProfileInfo = anIter->second; + + if(aProfileInfo && aProfileInfo->IsPresent()) + aNbElem = aProfileInfo->GetSize(); + + TInt aNbGauss = theTimeStampInfo->GetNbGauss(aGeom); + + this->GetMeshValue(aGeom).Allocate(aNbElem,aNbGauss,aNbComp); + } + } + + virtual + size_t + GetValueSize(EGeometrieElement theGeom) const + { + return this->GetMeshValue(theGeom).GetSize(); + } + + virtual + size_t + GetNbVal(EGeometrieElement theGeom) const + { + return this->GetMeshValue(theGeom).GetNbVal(); + } + + virtual + size_t + GetNbGauss(EGeometrieElement theGeom) const + { + return this->GetMeshValue(theGeom).GetNbGauss(); + } + + virtual + void + AllocateValue(EGeometrieElement theGeom, + TInt theNbElem, + TInt theNbGauss, + TInt theNbComp, + EModeSwitch theMode = eFULL_INTERLACE) + { + this->GetMeshValue(theGeom).Allocate(theNbElem,theNbGauss,theNbComp,theMode); + } + + virtual + unsigned char* + GetValuePtr(EGeometrieElement theGeom) + { + return this->GetMeshValue(theGeom).GetValuePtr(); + } + }; + + //--------------------------------------------------------------- + struct TTGrilleInfo: + virtual TGrilleInfo + { + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo) + { + myMeshInfo = theMeshInfo; + + myCoord = theInfo->GetNodeCoord(); + + myGrilleType = theInfo->GetGrilleType(); + + myCoordNames = theInfo->myCoordNames; + + myCoordUnits = theInfo->myCoordUnits; + + myIndixes = theInfo->GetMapOfIndexes(); + + myGrilleStructure = theInfo->GetGrilleStructure(); + + myGrilleType = theInfo->GetGrilleType(); + + myFamNumNode.resize(theInfo->GetNbNodes()); + myFamNumNode = theInfo->myFamNumNode; + + myFamNum = theInfo->myFamNum; + } + + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const TInt nnoeuds) + { + myMeshInfo = theMeshInfo; + TInt aSpaceDim = theMeshInfo->GetSpaceDim(); + if(type == eGRILLE_STANDARD){ + myCoord.resize(aSpaceDim*nnoeuds); + myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); + myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); + } else { //if(type == eGRILLE_CARTESIENNE){ + myCoordNames.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); + myCoordUnits.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); + } + myGrilleStructure.resize(aSpaceDim); + myFamNumNode.resize(nnoeuds); + } + + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type) + { + myMeshInfo = theMeshInfo; + TInt aSpaceDim = theMeshInfo->GetSpaceDim(); + if(type == eGRILLE_STANDARD){ + myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); + myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); + } else {// if(type == eGRILLE_CARTESIENNE){ + myCoordNames.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); + myCoordUnits.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); + } + myGrilleStructure.resize(aSpaceDim); + } + + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const MED::TIntVector& nbNodeVec) + { + myMeshInfo = theMeshInfo; + + TInt aSpaceDim = theMeshInfo->GetSpaceDim(); + if(type == eGRILLE_STANDARD){ + myCoordNames.resize(aSpaceDim*GetPNOMLength()+1); + myCoordUnits.resize(aSpaceDim*GetPNOMLength()+1); + } else {// if(type == eGRILLE_CARTESIENNE){ + myCoordNames.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); + myCoordUnits.resize(aSpaceDim*GetPNOMLength()+aSpaceDim); + } + + if(type != eGRILLE_STANDARD) + for(unsigned int aAxe=0;aAxe +#include +#include +#include +#include + +namespace MED +{ + class MEDWRAPPER_EXPORT PrefixPrinter + { + static int myCounter; + bool myIsActive; + public: + PrefixPrinter(bool theIsActive = true); + ~PrefixPrinter(); + + static std::string GetPrefix(); + }; +} + +#ifdef _DEBUG_ + #define MSG(deb,msg) if(deb) std::cout< +#include + +//#if defined(_DEBUG_) +# define MED_TVECTOR_CHECK_RANGE +//#endif + +namespace MED +{ + //! Main purpose to introduce the class was to customize operator [] + template > + class TVector : public std::vector<_Tp, _Alloc> + { + public: + typedef size_t size_type; + + typedef std::vector<_Tp, _Alloc> superclass; + typedef typename superclass::allocator_type allocator_type; + + typedef _Tp value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + + protected: + void + check_range(size_type __n) const + { + if (__n >= this->size()) + throw std::out_of_range("TVector [] access out of range"); + } + + const_reference + get_value(size_type __n) const + { + return superclass::operator[](__n); + } + + reference + get_value(size_type __n) + { + return superclass::operator[](__n); + } + + public: + explicit + TVector(const allocator_type& __a = allocator_type()): + superclass(__a) + {} + + TVector(size_type __n, const value_type& __val, + const allocator_type& __a = allocator_type()): + superclass(__n, __val, __a) + {} + + explicit + TVector(size_type __n): + superclass(__n) + {} + + TVector(const TVector& __x): + superclass(__x) + {} + + template + TVector(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()): + superclass(__first, __last, __a) + {} + + template + TVector(TVector<_Yp, _Al> __y): + superclass(__y.begin(), __y.end()) + {} + + TVector& + operator=(const TVector& __x) + { + superclass::operator=(__x); + return *this; + } + + template + TVector& + operator=(TVector<_Yp, _Al> __y) + { + this->assign(__y.begin(), __y.end()); + return *this; + } + + reference + operator[](size_type __n) + { +#if defined(MED_TVECTOR_CHECK_RANGE) + check_range(__n); +#endif + return get_value(__n); + } + + const_reference + operator[](size_type __n) const + { +#if defined(MED_TVECTOR_CHECK_RANGE) + check_range(__n); +#endif + return get_value(__n); + } + + reference + at(size_type __n) + { + check_range(__n); + return get_value(__n); + } + + const_reference + at(size_type __n) const + { + check_range(__n); + return get_value(__n); + } + }; +} + +#undef MED_TVECTOR_CHECK_RANGE + +#endif // MED_Vector_HeaderFile diff --git a/src/MEDWrapper/MED_Wrapper.cxx b/src/MEDWrapper/MED_Wrapper.cxx new file mode 100644 index 000000000..dbabc2a2d --- /dev/null +++ b/src/MEDWrapper/MED_Wrapper.cxx @@ -0,0 +1,4053 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MED_Wrapper.hxx" +#include "MED_TStructures.hxx" +#include "MED_Utilities.hxx" + +#include +#include + +#include + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +static int MYVALUEDEBUG = 0; +#else +static int MYDEBUG = 0; +static int MYVALUEDEBUG = 0; +#endif + +namespace MED +{ + //--------------------------------------------------------------- + TLockProxy + ::TLockProxy(TWrapper* theWrapper): + myWrapper(theWrapper) + { +#if BOOST_VERSION >= 103500 + myWrapper->myMutex.lock(); +#else + boost::detail::thread::lock_ops::lock(myWrapper->myMutex); +#endif + INITMSG(MYDEBUG, "TLockProxy() - this -"<Open(theMode, theErr); + } + + ~TFileWrapper() + { + myFile->Close(); + } + }; + + //---------------------------------------------------------------------------- + template + void + Print(SharedPtr theTimeStampValue) + { + INITMSG(MYDEBUG,"Print - TimeStampValue\n"); + typename TimeStampValueType::TTGeom2Value& aGeom2Value = theTimeStampValue->myGeom2Value; + typename TimeStampValueType::TTGeom2Value::const_iterator anIter = aGeom2Value.begin(); + for (; anIter != aGeom2Value.end(); anIter++) { + const EGeometrieElement& aGeom = anIter->first; + const typename TimeStampValueType::TTMeshValue& aMeshValue = anIter->second; + TInt aNbElem = aMeshValue.myNbElem; + TInt aNbGauss = aMeshValue.myNbGauss; + TInt aNbComp = aMeshValue.myNbComp; + INITMSG(MYDEBUG, "aGeom = "<Open(eLECTURE_ECRITURE, &aRet); + // if (aRet < 0) + // myFile->Close(); + // myFile->Open(eLECTURE_AJOUT, &aRet); + // } + if (aRet < 0) { + myFile->Close(); + myFile->Open(eLECTURE, &aRet); + } + if (aRet < 0) { + myFile->Close(); + myFile->Open(eCREATION, &aRet); + } + } + + //---------------------------------------------------------------------------- + TWrapper:: + ~TWrapper() + { + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbMeshes(TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return -1; + + return MEDnMesh(myFile->Id()); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetMeshInfo(TInt theMeshId, + MED::TMeshInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + TValueHolder aMeshName(theInfo.myName); + TValueHolder aDim(theInfo.myDim); + TValueHolder aSpaceDim(theInfo.mySpaceDim); + TValueHolder aType(theInfo.myType); + char dtunit[MED_SNAME_SIZE+1]; + med_sorting_type sorttype; + med_int nstep; + med_axis_type at; + int naxis = MEDmeshnAxis(myFile->Id(), theMeshId); + char *axisname = new char[naxis*MED_SNAME_SIZE+1]; + char *axisunit = new char[naxis*MED_SNAME_SIZE+1]; + TErr aRet = MEDmeshInfo(myFile->Id(), + theMeshId, + &aMeshName, + &aSpaceDim, + &aDim, + &aType, + &theInfo.myDesc[0], + dtunit, + &sorttype, + &nstep, + &at, + axisname, + axisunit); + delete [] axisname; + delete [] axisunit; + if (aRet < 0) + EXCEPTION(std::runtime_error, "GetMeshInfo - MEDmeshInfo(...)"); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetMeshInfo(const MED::TMeshInfo& theInfo, + TErr* theErr) + { + TErr aRet; + SetMeshInfo(theInfo, eLECTURE_ECRITURE, &aRet); + + if (aRet < 0) + SetMeshInfo(theInfo, eLECTURE_AJOUT, &aRet); + + if (aRet < 0) + SetMeshInfo(theInfo, eCREATION, &aRet); + + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetMeshInfo(const MED::TMeshInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TMeshInfo& anInfo = const_cast(theInfo); + + TValueHolder aMeshName(anInfo.myName); + TValueHolder aDim(anInfo.myDim); + TValueHolder aSpaceDim(anInfo.mySpaceDim); + TValueHolder aType(anInfo.myType); + TValueHolder aDesc(anInfo.myDesc); + + char *nam = new char[aSpaceDim*MED_SNAME_SIZE+1]; + std::fill(nam, nam+aSpaceDim*MED_SNAME_SIZE+1, '\0'); + char *unit = new char[aSpaceDim*MED_SNAME_SIZE+1]; + std::fill(unit, unit+aSpaceDim*MED_SNAME_SIZE+1, '\0'); + TErr aRet = MEDmeshCr(myFile->Id(), + &aMeshName, + aSpaceDim, + aDim, + aType, + &aDesc, + "", + MED_SORT_DTIT, + MED_CARTESIAN, + nam, + unit); + delete [] nam; + delete [] unit; + + //if (aRet == 0) + // aRet = MEDunvCr(myFile->Id(),&aMeshName); + + INITMSG(MYDEBUG, "TWrapper::SetMeshInfo - MED_MODE_ACCES = "<(theInfo); + TValueHolder aName(anInfo.myName); + return MEDnFamily(myFile->Id(), &aName); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbFamAttr(TInt theFamId, + const MED::TMeshInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return -1; + + MED::TMeshInfo& anInfo = const_cast(theInfo); + + TValueHolder aName(anInfo.myName); + + return MEDnFamily23Attribute(myFile->Id(), &aName, theFamId); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbFamGroup(TInt theFamId, + const MED::TMeshInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return -1; + + MED::TMeshInfo& anInfo = const_cast(theInfo); + + TValueHolder aName(anInfo.myName); + + return MEDnFamilyGroup(myFile->Id(), &aName, theFamId); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetFamilyInfo(TInt theFamId, + MED::TFamilyInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aFamilyName(theInfo.myName); + TValueHolder aFamilyId(theInfo.myId); + TValueHolder anAttrId(theInfo.myAttrId); + TValueHolder anAttrVal(theInfo.myAttrVal); + TValueHolder anAttrDesc(theInfo.myAttrDesc); + TValueHolder aGroupNames(theInfo.myGroupNames); + + TErr aRet = MEDfamily23Info(myFile->Id(), + &aMeshName, + theFamId, + &aFamilyName, + &anAttrId, + &anAttrVal, + &anAttrDesc, + &aFamilyId, + &aGroupNames); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetFamilyInfo - MEDfamily23Info(...) - "<< + " aMeshInfo.myName = '"<<&aMeshName<< + "'; theFamId = "<GetType() != eNON_STRUCTURE) + // return PFamilyInfo(); + + TInt aNbAttr = GetNbFamAttr(theId, *theMeshInfo); + TInt aNbGroup = GetNbFamGroup(theId, *theMeshInfo); + PFamilyInfo anInfo = CrFamilyInfo(theMeshInfo, aNbGroup, aNbAttr); + GetFamilyInfo(theId, *anInfo, theErr); + +#ifdef _DEBUG_ + std::string aName = anInfo->GetName(); + INITMSG(MYDEBUG, "GetPFamilyInfo - aFamilyName = '"<GetGroupName(iGroup); + INITMSG(MYDEBUG, "aGroupName = '"< aMeshName (aMeshInfo.myName); + TValueHolder anElemNames(theInfo.myElemNames); + TValueHolder anEntity (theEntity); + TValueHolder aGeom (theGeom); + + TErr aRet = MEDmeshEntityNameRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + &anElemNames); + + theInfo.myIsElemNames = aRet != 0? eFAUX : eVRAI ; + + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetNames(const TElemInfo& theInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + SetNames(theInfo, eLECTURE_ECRITURE, theEntity, theGeom, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetNames(const TElemInfo& theInfo, + EModeAcces theMode, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + if (theGeom == eBALL) + theGeom = GetBallGeom(theInfo.myMeshInfo); + + MED::TElemInfo& anInfo = const_cast(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TErr aRet = 0; + if (theInfo.myIsElemNames) { + TValueHolder aMeshName (aMeshInfo.myName); + TValueHolder anElemNames(anInfo.myElemNames); + TValueHolder anEntity (theEntity); + TValueHolder aGeom (theGeom); + + aRet = MEDmeshEntityNameWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + (TInt)anInfo.myElemNames->size(), + &anElemNames); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetNames - MEDmeshEntityNameWr(...)"); + } + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetNumeration(TElemInfo& theInfo, + TInt theNb, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + if (theGeom == eBALL) + theGeom = GetBallGeom(theInfo.myMeshInfo); + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder anElemNum(theInfo.myElemNum); + TValueHolder anEntity (theEntity); + TValueHolder aGeom (theGeom); + + TErr aRet = MEDmeshEntityNumberRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + &anElemNum); + + theInfo.myIsElemNum = aRet != 0? eFAUX : eVRAI; + + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetNumeration(const TElemInfo& theInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + SetNumeration(theInfo, eLECTURE_ECRITURE, theEntity, theGeom, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetNumeration(const TElemInfo& theInfo, + EModeAcces theMode, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + if (theGeom == eBALL) + theGeom = GetBallGeom(theInfo.myMeshInfo); + + MED::TElemInfo& anInfo = const_cast(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TErr aRet = 0; + if (theInfo.myIsElemNum) { + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder anElemNum(anInfo.myElemNum); + TValueHolder anEntity (theEntity); + TValueHolder aGeom (theGeom); + + aRet = MEDmeshEntityNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + (TInt)anInfo.myElemNum->size(), + &anElemNum); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetNumeration - MEDmeshEntityNumberWr(...)"); + } + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetFamilies(TElemInfo& theInfo, + TInt theNb, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + if (theGeom == eBALL) + theGeom = GetBallGeom(theInfo.myMeshInfo); + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aFamNum (theInfo.myFamNum); + TValueHolder anEntity (theEntity); + TValueHolder aGeom (theGeom); + + TErr aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + &aFamNum); + + if (aRet < 0) { + // if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files + { + int aSize = (int)theInfo.myFamNum->size(); + theInfo.myFamNum->clear(); + theInfo.myFamNum->resize(aSize,0); + aRet = 0; + } + // else + // EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...) of CELLS"); + } + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetFamilies(const TElemInfo& theInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + SetFamilies(theInfo, eLECTURE_ECRITURE, theEntity, theGeom, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetFamilies(const TElemInfo& theInfo, + EModeAcces theMode, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + if (theGeom == eBALL) + theGeom = GetBallGeom(theInfo.myMeshInfo); + + MED::TElemInfo& anInfo = const_cast(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aFamNum (anInfo.myFamNum); + TValueHolder anEntity (theEntity); + TValueHolder aGeom (theGeom); + + TErr aRet = MEDmeshEntityFamilyNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + (TInt)anInfo.myFamNum->size(), + &aFamNum); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetFamilies - MEDmeshEntityFamilyNumberWr(...)"); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbNodes(const MED::TMeshInfo& theMeshInfo, + TErr* theErr) + { + return GetNbNodes(theMeshInfo, eCOOR, theErr); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbNodes(const MED::TMeshInfo& theMeshInfo, + ETable theTable, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return -1; + + MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aTable(theTable); + med_bool chgt,trsf; + return MEDmeshnEntity(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + aTable, + MED_NO_CMODE, + &chgt, + &trsf); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetNodeInfo(MED::TNodeInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aDim(aMeshInfo.myDim); + TValueHolder aCoord(theInfo.myCoord); + TValueHolder aModeSwitch(theInfo.myModeSwitch); + TValueHolder aSystem(theInfo.mySystem); + TValueHolder aCoordNames(theInfo.myCoordNames); + TValueHolder aCoordUnits(theInfo.myCoordUnits); + TValueHolder anElemNames(theInfo.myElemNames); + //TValueHolder anIsElemNames(theInfo.myIsElemNames); + TValueHolder anElemNum(theInfo.myElemNum); + //TValueHolder anIsElemNum(theInfo.myIsElemNum); + TValueHolder aFamNum(theInfo.myFamNum); + TValueHolder aNbElem(theInfo.myNbElem); + + TErr aRet = MEDmeshNodeCoordinateRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + aModeSwitch, + &aCoord); + + TErr aRet2 =MEDmeshEntityFamilyNumberRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + &aFamNum); + if (aRet2 < 0) { + // if (aRet2 == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files + { + int mySize = (int)theInfo.myFamNum->size(); + theInfo.myFamNum->clear(); + theInfo.myFamNum->resize(mySize,0); + } + // else + // EXCEPTION(std::runtime_error,"GetNodeInfo - MEDmeshEntityFamilyNumberRd(...)"); + } + + if (MEDmeshEntityNameRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + &anElemNames) < 0) theInfo.myIsElemNames=eFAUX; + + if (MEDmeshEntityNumberRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + &anElemNum) < 0) theInfo.myIsElemNum=eFAUX; + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetNodeInfo - MEDmeshNodeCoordinateRd(...)"); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetNodeInfo(const MED::TNodeInfo& theInfo, + TErr* theErr) + { + TErr aRet; + SetNodeInfo(theInfo, eLECTURE_ECRITURE, &aRet); + + if (aRet < 0) + SetNodeInfo(theInfo, eLECTURE_AJOUT, &aRet); + + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetNodeInfo(const MED::TNodeInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TNodeInfo& anInfo = const_cast(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TValueHolder aMeshName (aMeshInfo.myName); + TValueHolder aCoord (anInfo.myCoord); + TValueHolder aModeSwitch (anInfo.myModeSwitch); + TValueHolder aSystem (anInfo.mySystem); + TValueHolder aCoordNames (anInfo.myCoordNames); + TValueHolder aCoordUnits (anInfo.myCoordUnits); + TValueHolder anElemNames (anInfo.myElemNames); + TValueHolder anIsElemNames(anInfo.myIsElemNames); + TValueHolder anElemNum (anInfo.myElemNum); + TValueHolder anIsElemNum (anInfo.myIsElemNum); + TValueHolder aFamNum (anInfo.myFamNum); + TValueHolder aNbElem (anInfo.myNbElem); + + TErr aRet = MEDmeshNodeCoordinateWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NO_DT, + aModeSwitch, + aNbElem, + &aCoord); + + MEDmeshEntityFamilyNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + aNbElem, + &aFamNum); + if (anIsElemNames) + MEDmeshEntityNameWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + aNbElem, + &anElemNames); + if (anIsElemNum) + MEDmeshEntityNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + aNbElem, + &anElemNum); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetNodeInfo - MEDmeshNodeCoordinateWr(...)"); + } + + //---------------------------------------------------------------------------- + PNodeInfo + TWrapper + ::CrNodeInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EModeSwitch theMode, + ERepere theSystem, + EBooleen theIsElemNum, + EBooleen theIsElemNames) + { + return PNodeInfo(new TTNodeInfo + (theMeshInfo, + theNbElem, + theMode, + theSystem, + theIsElemNum, + theIsElemNames)); + } + + //---------------------------------------------------------------------------- + PNodeInfo + TWrapper + ::CrNodeInfo(const PMeshInfo& theMeshInfo, + const TFloatVector& theNodeCoords, + EModeSwitch theMode, + ERepere theSystem, + const TStringVector& theCoordNames, + const TStringVector& theCoordUnits, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames) + { + return PNodeInfo(new TTNodeInfo + (theMeshInfo, + theNodeCoords, + theMode, + theSystem, + theCoordNames, + theCoordUnits, + theFamilyNums, + theElemNums, + theElemNames)); + } + + //---------------------------------------------------------------------------- + PNodeInfo + TWrapper + ::CrNodeInfo(const PMeshInfo& theMeshInfo, + const PNodeInfo& theInfo) + { + return PNodeInfo(new TTNodeInfo + (theMeshInfo, + theInfo)); + } + + //---------------------------------------------------------------------------- + PNodeInfo + TWrapper + ::GetPNodeInfo(const PMeshInfo& theMeshInfo, + TErr* theErr) + { + TInt aNbElems = GetNbNodes(*theMeshInfo); + if (aNbElems == 0) { + return PNodeInfo(); + } + + PNodeInfo anInfo = CrNodeInfo(theMeshInfo, aNbElems); + GetNodeInfo(*anInfo, theErr); + +#ifdef _DEBUG_ + TInt aDim = theMeshInfo->myDim; + TInt aNbElem = anInfo->GetNbElem(); + INITMSG(MYDEBUG, "GetPNodeInfo: "); + { + INITMSG(MYDEBUG, "aCoords: "<myCoord; + for (TInt iElem = 0; iElem < aNbElem; iElem++) { + for (TInt iDim = 0, anId = iElem*aDim; iDim < aDim; iDim++, anId++) { + ADDMSG(MYVALUEDEBUG, aCoord[anId]<<","); + } + ADDMSG(MYVALUEDEBUG, " "); + } + ADDMSG(MYDEBUG, std::endl); + + BEGMSG(MYVALUEDEBUG, "GetFamNum: "); + for (TInt iElem = 0; iElem < aNbElem; iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetFamNum(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); + + if (anInfo->IsElemNum()) { + BEGMSG(MYVALUEDEBUG, "GetElemNum: "); + for (TInt iElem = 0; iElem < aNbElem; iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetElemNum(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); + } + } + ADDMSG(MYDEBUG, std::endl); +#endif + + return anInfo; + } + + //---------------------------------------------------------------------------- + PElemInfo + TWrapper + ::CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EBooleen theIsElemNum, + EBooleen theIsElemNames) + { + return PElemInfo(new TTElemInfo + (theMeshInfo, + theNbElem, + theIsElemNum, + theIsElemNames)); + } + + //---------------------------------------------------------------------------- + PElemInfo + TWrapper + ::CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + const TIntVector& theFamNum, + const TIntVector& aElemNum, + const TStringVector& aElemNames) + { + return PElemInfo(new TTElemInfo + (theMeshInfo, + theNbElem, + theFamNum, + aElemNum, + aElemNames)); + } + + //---------------------------------------------------------------------------- + PElemInfo + TWrapper + ::GetPElemInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode, + TErr* theErr) + { + EMaillage aType = theMeshInfo->GetType(); + if (aType == eNON_STRUCTURE) { + switch (theGeom) { + case ePOINT1: + if (theEntity == eNOEUD) + return GetPNodeInfo(theMeshInfo, theErr); + return GetPCellInfo(theMeshInfo, theEntity, theGeom, theConnMode, theErr); + break; + case ePOLYGONE: + return GetPPolygoneInfo(theMeshInfo, theEntity, theGeom, theConnMode); + break; + case ePOLYEDRE: + return GetPPolyedreInfo(theMeshInfo, theEntity, theGeom, theConnMode); + break; + default: + return GetPCellInfo(theMeshInfo, theEntity, theGeom, theConnMode, theErr); + } + } + else { + PGrilleInfo aGrille = GetPGrilleInfo(theMeshInfo); + + TInt nbElems; + EBooleen theIsElemNum = eFAUX; + // nodes + switch (theGeom) { + case ePOINT1: + nbElems = aGrille->GetNbNodes(); + theIsElemNum = eVRAI; + break; + case eSEG2: + case eQUAD4: + case eHEXA8: + nbElems = aGrille->GetNbCells(); + break; + default: + nbElems = 0; + } + + TIntVector aFamNum; + TIntVector aElemNum; + TStringVector aElemNames; + + PElemInfo aElemInfo; + + if (theGeom == ePOINT1) { + aElemInfo = CrElemInfo(theMeshInfo, + nbElems, + theIsElemNum); + MED::TElemInfo &aTElemInfo = *aElemInfo; + + // must be reimplemente in connection with mesh type eSTRUCTURE + // GetNumeration(aTElemInfo, + // nbElems, + // theEntity, + // theGeom, + // theErr); + + GetFamilies(aTElemInfo, + nbElems, + theEntity, + theGeom, + theErr); + + // must be reimplemente in connection with mesh type eSTRUCTURE + // GetNames(aTElemInfo, + // nbElems, + // theEntity, + // theGeom, + // theErr); + } + else { + aElemInfo = CrElemInfo(theMeshInfo, + nbElems, + aFamNum, + aElemNum, + aElemNames); + } + + return aElemInfo; + } + return PElemInfo(); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbPolygones(const MED::TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode, + TErr* theErr) + { + return GetNbCells(theMeshInfo, theEntity, theGeom, theConnMode, theErr); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetPolygoneConnSize(const MED::TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return 0; + + MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); + + TValueHolder aMeshName(aMeshInfo.myName); + med_int aTaille = 0; + med_bool chgt,trsf; + aTaille=MEDmeshnEntity(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + med_entity_type(theEntity), + med_geometry_type(theGeom), + MED_CONNECTIVITY, + med_connectivity_mode(theConnMode), + &chgt, + &trsf); + + if (aTaille < 0) + EXCEPTION(std::runtime_error, "GetPolygoneInfo - MEDmeshnEntity(...)"); + + return TInt(aTaille); + } + + //----------------------------------------------------------------- + void + TWrapper + ::GetPolygoneInfo(MED::TPolygoneInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder anIndex (theInfo.myIndex); + TValueHolder aConn (theInfo.myConn); + TValueHolder anEntity (theInfo.myEntity); + TValueHolder aGeom (theInfo.myGeom); + TValueHolder aConnMode(theInfo.myConnMode); + TInt aNbElem = (TInt)theInfo.myElemNum->size(); + + TErr aRet; + aRet = MEDmeshPolygon2Rd(myFile->Id(), &aMeshName, + MED_NO_DT, MED_NO_IT, + anEntity, aGeom, + aConnMode, &anIndex, &aConn); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetPolygoneInfo - MEDmeshPolygonRd(...)"); + + if (theInfo.myIsElemNames) { + GetNames(theInfo, aNbElem, theInfo.myEntity, theInfo.myGeom, &aRet); + if (theErr) + *theErr = aRet; + } + + if (theInfo.myIsElemNum) { + GetNumeration(theInfo, aNbElem, theInfo.myEntity, theInfo.myGeom, &aRet); + if (theErr) + *theErr = aRet; + } + + GetFamilies(theInfo, aNbElem, theInfo.myEntity, theInfo.myGeom, &aRet); + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetPolygoneInfo(const MED::TPolygoneInfo& theInfo, + TErr* theErr) + { + SetPolygoneInfo(theInfo, eLECTURE_ECRITURE, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetPolygoneInfo(const MED::TPolygoneInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TPolygoneInfo& anInfo = const_cast(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder anIndex (anInfo.myIndex); + TValueHolder aConn (anInfo.myConn); + TValueHolder anEntity (anInfo.myEntity); + TValueHolder aGeom (anInfo.myGeom); + TValueHolder aConnMode(anInfo.myConnMode); + + TErr aRet = MEDmeshPolygon2Wr(myFile->Id(), &aMeshName, + MED_NO_DT, MED_NO_IT, MED_UNDEF_DT, + anEntity, aGeom, + aConnMode, anInfo.myNbElem + 1, + &anIndex, &aConn); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetPolygoneInfo - MEDmeshPolygonWr(...)"); + + SetNames(anInfo, theInfo.myEntity, anInfo.myGeom, &aRet); + if (theErr) + *theErr = aRet; + + SetNumeration(anInfo, theInfo.myEntity, anInfo.myGeom, &aRet); + if (theErr) + *theErr = aRet; + + SetFamilies(anInfo, theInfo.myEntity, anInfo.myGeom, &aRet); + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + PPolygoneInfo + TWrapper + ::CrPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + TInt theConnSize, + EConnectivite theConnMode, + EBooleen theIsElemNum, + EBooleen theIsElemNames) + { + return PPolygoneInfo(new TTPolygoneInfo + (theMeshInfo, + theEntity, + theGeom, + theNbElem, + theConnSize, + theConnMode, + theIsElemNum, + theIsElemNames)); + } + + //---------------------------------------------------------------------------- + PPolygoneInfo + TWrapper + ::CrPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theIndexes, + const TIntVector& theConnectivities, + EConnectivite theConnMode, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames) + { + return PPolygoneInfo(new TTPolygoneInfo + (theMeshInfo, + theEntity, + theGeom, + theIndexes, + theConnectivities, + theConnMode, + theFamilyNums, + theElemNums, + theElemNames)); + } + + //---------------------------------------------------------------------------- + PPolygoneInfo + TWrapper + ::CrPolygoneInfo(const PMeshInfo& theMeshInfo, + const PPolygoneInfo& theInfo) + { + return PPolygoneInfo(new TTPolygoneInfo + (theMeshInfo, + theInfo)); + } + + //---------------------------------------------------------------------------- + PPolygoneInfo + TWrapper + ::GetPPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode) + { + if (theMeshInfo->GetType() != eNON_STRUCTURE) + return PPolygoneInfo(); + + TInt aNbElem = GetNbPolygones(theMeshInfo, theEntity, theGeom, theConnMode); + TInt aConnSize = GetPolygoneConnSize(theMeshInfo, theEntity, theGeom, theConnMode); + PPolygoneInfo anInfo = CrPolygoneInfo(theMeshInfo, theEntity, theGeom, aNbElem, aConnSize, theConnMode); + GetPolygoneInfo(anInfo); + +#ifdef _DEBUG_ + INITMSG(MYDEBUG, "GetPPolygoneInfo"<< + " - theGeom = "<GetConnSlice(iElem); + TInt aConnDim = aConnSlice.size(); + for (TInt iConn = 0; iConn < aConnDim; iConn++) { + ADDMSG(MYVALUEDEBUG, aConnSlice[iConn]<<","); + } + ADDMSG(MYDEBUG, " "); + } + ADDMSG(MYDEBUG, std::endl); +#endif + + return anInfo; + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbPolyedres(const MED::TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode, + TErr* theErr) + { + return GetNbCells(theMeshInfo, theEntity, theGeom, theConnMode, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetPolyedreConnSize(const TMeshInfo& theMeshInfo, + TInt& theNbFaces, + TInt& theConnSize, + EConnectivite theConnMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + EXCEPTION(std::runtime_error, "GetPolyedreConnSize - (...)"); + + MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aConnMode(theConnMode); + //TValueHolder aNbFaces(theNbFaces); + //TValueHolder aConnSize(theConnSize); + + med_bool chgt, trsf; + theNbFaces = MEDmeshnEntity(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_CELL, + MED_POLYHEDRON, + MED_INDEX_NODE, + aConnMode, + &chgt, + &trsf); + + theConnSize = MEDmeshnEntity(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_CELL, + MED_POLYHEDRON, + MED_CONNECTIVITY, + aConnMode, + &chgt, + &trsf); + + if (theNbFaces < 0 || theConnSize<0) + EXCEPTION(std::runtime_error, "GetPolygoneInfo - MEDmeshnEntity(...)"); + + } + + //----------------------------------------------------------------- + void + TWrapper + ::GetPolyedreInfo(TPolyedreInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TInt aNbElem = (TInt)theInfo.myElemNum->size(); + TValueHolder anIndex(theInfo.myIndex); + TValueHolder aFaces(theInfo.myFaces); + TValueHolder aConn(theInfo.myConn); + TValueHolder aConnMode(theInfo.myConnMode); + + TErr aRet; + aRet = MEDmeshPolyhedronRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_CELL, + aConnMode, + &anIndex, + &aFaces, + &aConn); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetPolygoneInfo - MEDmeshPolyhedronRd(...)"); + + if (theInfo.myIsElemNames) { + GetNames(theInfo, aNbElem, theInfo.myEntity, ePOLYEDRE, &aRet); + if (theErr) + *theErr = aRet; + } + + if (theInfo.myIsElemNum) { + GetNumeration(theInfo, aNbElem, theInfo.myEntity, ePOLYEDRE, &aRet); + if (theErr) + *theErr = aRet; + } + + GetFamilies(theInfo, aNbElem, theInfo.myEntity, ePOLYEDRE, &aRet); + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetPolyedreInfo(const TPolyedreInfo& theInfo, + TErr* theErr) + { + SetPolyedreInfo(theInfo, eLECTURE_ECRITURE, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetPolyedreInfo(const MED::TPolyedreInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TPolyedreInfo& anInfo = const_cast(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder anIndex(anInfo.myIndex); + TValueHolder aFaces(anInfo.myFaces); + TValueHolder aConn(anInfo.myConn); + TValueHolder aConnMode(anInfo.myConnMode); + + TErr aRet; + aRet = MEDmeshPolyhedronWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_UNDEF_DT, + MED_CELL, + aConnMode, + anInfo.myNbElem+1, + &anIndex, + (TInt)anInfo.myFaces->size(), + &aFaces, + &aConn); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetPolyedreInfo - MEDmeshPolyhedronWr(...)"); + + TValueHolder anEntity(anInfo.myEntity); + + if (theInfo.myIsElemNames) { + TValueHolder anElemNames(anInfo.myElemNames); + aRet = MEDmeshEntityNameWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + MED_POLYHEDRON, + (TInt)anInfo.myElemNames->size(), + &anElemNames); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetPolyedreInfo - MEDmeshEntityNameWr(...)"); + } + + if (theInfo.myIsElemNum) { + TValueHolder anElemNum(anInfo.myElemNum); + aRet = MEDmeshEntityNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + MED_POLYHEDRON, + (TInt)anInfo.myElemNum->size(), + &anElemNum); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetPolyedreInfo - MEDmeshEntityNumberWr(...)"); + } + + TValueHolder aFamNum(anInfo.myFamNum); + aRet = MEDmeshEntityFamilyNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + MED_POLYHEDRON, + (TInt)anInfo.myFamNum->size(), + &aFamNum); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetPolyedreInfo - MEDmeshEntityFamilyNumberWr(...)"); + } + + //---------------------------------------------------------------------------- + PPolyedreInfo + TWrapper + ::CrPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + TInt theNbFaces, + TInt theConnSize, + EConnectivite theConnMode, + EBooleen theIsElemNum, + EBooleen theIsElemNames) + { + return PPolyedreInfo(new TTPolyedreInfo + (theMeshInfo, + theEntity, + theGeom, + theNbElem, + theNbFaces, + theConnSize, + theConnMode, + theIsElemNum, + theIsElemNames)); + } + + //---------------------------------------------------------------------------- + PPolyedreInfo + TWrapper + ::CrPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theIndexes, + const TIntVector& theFaces, + const TIntVector& theConnectivities, + EConnectivite theConnMode, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames) + { + return PPolyedreInfo(new TTPolyedreInfo + (theMeshInfo, + theEntity, + theGeom, + theIndexes, + theFaces, + theConnectivities, + theConnMode, + theFamilyNums, + theElemNums, + theElemNames)); + } + + //---------------------------------------------------------------------------- + PPolyedreInfo + TWrapper + ::CrPolyedreInfo(const PMeshInfo& theMeshInfo, + const PPolyedreInfo& theInfo) + { + return PPolyedreInfo(new TTPolyedreInfo + (theMeshInfo, + theInfo)); + } + + //---------------------------------------------------------------------------- + PPolyedreInfo + TWrapper + ::GetPPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode) + { + if (theMeshInfo->GetType() != eNON_STRUCTURE) + return PPolyedreInfo(); + TInt aNbElem = GetNbPolyedres(theMeshInfo, theEntity, theGeom, theConnMode); + TInt aNbFaces, aConnSize; + GetPolyedreConnSize(theMeshInfo, aNbFaces, aConnSize, theConnMode); + PPolyedreInfo anInfo = CrPolyedreInfo(theMeshInfo, theEntity, theGeom, aNbElem, aNbFaces, aConnSize, theConnMode); + GetPolyedreInfo(anInfo); + +#ifdef _DEBUG_ + INITMSG(MYDEBUG, "GetPPolyedreInfo"<< + " - theGeom = "<GetConnSliceArr(iElem); + TInt aNbFaces = aConnSliceArr.size(); + ADDMSG(MYDEBUG, "{"); + for (TInt iFace = 0; iFace < aNbFaces; iFace++) { + TCConnSlice aConnSlice = aConnSliceArr[iFace]; + TInt aNbConn = aConnSlice.size(); + ADDMSG(MYDEBUG, "["); + for (TInt iConn = 0; iConn < aNbConn; iConn++) { + ADDMSG(MYVALUEDEBUG, aConnSlice[iConn]<<","); + } + ADDMSG(MYDEBUG, "] "); + } + ADDMSG(MYDEBUG, "} "); + } + ADDMSG(MYDEBUG, std::endl); +#endif + + return anInfo; + } + + //----------------------------------------------------------------- + TEntityInfo + TWrapper + ::GetEntityInfo(const MED::TMeshInfo& theMeshInfo, + EConnectivite theConnMode, + TErr* theErr) + { + TEntityInfo anInfo; + + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return anInfo; + + if (theMeshInfo.GetType() == eNON_STRUCTURE) { + TInt aNbElem = GetNbNodes(theMeshInfo); + if (aNbElem > 0) { + anInfo[eNOEUD][ePOINT1] = aNbElem; + const TEntity2GeomSet& anEntity2GeomSet = GetEntity2GeomSet(); + TEntity2GeomSet::const_iterator anIter = anEntity2GeomSet.begin(); + TEntity2GeomSet::const_iterator anIterEnd = anEntity2GeomSet.end(); + for (; anIter != anIterEnd; anIter++) { + const EEntiteMaillage& anEntity = anIter->first; + const TGeomSet& aGeomSet = anIter->second; + TGeomSet::const_iterator anIter2 = aGeomSet.begin(); + TGeomSet::const_iterator anIterEnd2 = aGeomSet.end(); + for (; anIter2 != anIterEnd2; anIter2++) { + const EGeometrieElement& aGeom = *anIter2; + aNbElem = GetNbCells(theMeshInfo, anEntity, aGeom, theConnMode, theErr); + if (aNbElem > 0) { + if (anEntity == eSTRUCT_ELEMENT) { + const TInt nbStructTypes = aNbElem; + for (TInt structType = 0; structType < nbStructTypes; ++structType) { + // check type name to keep only "MED_BALL" structured element + TValueHolder aMeshName((TString&) theMeshInfo.myName); + char geotypename[ MED_NAME_SIZE + 1] = ""; + med_geometry_type geotype; + MEDmeshEntityInfo(myFile->Id(), &aMeshName, MED_NO_DT, MED_NO_IT, + med_entity_type(anEntity), structType+1, + geotypename, &geotype); + if (strcmp(geotypename, MED_BALL_NAME) == 0) { + aNbElem = GetNbCells(theMeshInfo, anEntity, EGeometrieElement(geotype), + theConnMode, theErr); + if (aNbElem > 0) + anInfo[anEntity][EGeometrieElement(geotype)] = aNbElem; + } + } + } + else { + anInfo[anEntity][aGeom] = aNbElem; + } + } + } + } + } + } + else { // eSTRUCTURE + EGrilleType aGrilleType; + TInt aNbNodes = 1; + TInt aNbElem = 1; + TInt aNbSub = 0; + TInt aDim = theMeshInfo.GetDim(); + EGeometrieElement aGeom, aSubGeom; + EEntiteMaillage aSubEntity = eMAILLE; + + GetGrilleType(theMeshInfo, aGrilleType); + + TIntVector aStruct(aDim); + if (aGrilleType == eGRILLE_STANDARD) + { + GetGrilleStruct(theMeshInfo, aStruct, theErr); + } + else + { // eGRILLE_CARTESIENNE and eGRILLE_POLAIRE + ETable aTable[3] = { eCOOR_IND1, eCOOR_IND2, eCOOR_IND3 }; + for (med_int anAxis = 0; anAxis < aDim; anAxis++) + aStruct[ anAxis ] = GetNbNodes(theMeshInfo, aTable[anAxis]); + } + for (med_int i = 0; i < aDim; i++) { + aNbNodes = aNbNodes * aStruct[i]; + aNbElem = aNbElem * (aStruct[i] - 1); + } + switch (aDim) { + case 1: + aGeom = eSEG2; + break; + case 2: + aGeom = eQUAD4; + aSubGeom = eSEG2; + aSubEntity = eARETE; + aNbSub = + (aStruct[0]) * (aStruct[1]-1) + + (aStruct[0]-1) * (aStruct[1]); + break; + case 3: + aGeom = eHEXA8; + aSubGeom = eQUAD4; + aSubEntity = eFACE; + aNbSub = + (aStruct[0]) * (aStruct[1]-1) * (aStruct[2]-1) + + (aStruct[0]-1) * (aStruct[1]) * (aStruct[2]-1) + + (aStruct[0]-1) * (aStruct[1]-1) * (aStruct[2]); + break; + } + anInfo[eNOEUD][ePOINT1] = aNbNodes; + anInfo[eMAILLE][aGeom] = aNbElem; + if (aDim > 1) + anInfo[aSubEntity][aSubGeom] = aNbSub; + } + return anInfo; + } + + //----------------------------------------------------------------- + TInt + TWrapper + ::GetNbCells(const MED::TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return -1; + + MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); + TValueHolder aMeshName(aMeshInfo.myName); + med_bool chgt, trsf; + switch (theGeom) + { + case MED::ePOLYGONE: + case MED::ePOLYGON2: + { + return MEDmeshnEntity(myFile->Id(), &aMeshName, + MED_NO_DT, MED_NO_IT, + med_entity_type(theEntity), med_geometry_type(theGeom), + MED_INDEX_NODE, med_connectivity_mode(theConnMode), + &chgt, &trsf)-1; + } + case MED::ePOLYEDRE: + { + return MEDmeshnEntity(myFile->Id(), &aMeshName, + MED_NO_DT, MED_NO_IT, + med_entity_type(theEntity), MED_POLYHEDRON, + MED_INDEX_FACE, med_connectivity_mode(theConnMode), + &chgt, &trsf)-1; + } + case MED::eBALL: + { + return GetNbBalls(theMeshInfo); + } + default: + { + return MEDmeshnEntity(myFile->Id(), &aMeshName, + MED_NO_DT, MED_NO_IT, + med_entity_type(theEntity), med_geometry_type(theGeom), + MED_CONNECTIVITY, med_connectivity_mode(theConnMode), + &chgt, &trsf); + } + } + return 0; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetCellInfo(MED::TCellInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + TValueHolder aMeshName (aMeshInfo.myName); + TValueHolder aConn (theInfo.myConn); + TValueHolder aModeSwitch (theInfo.myModeSwitch); + TValueHolder anElemNames (theInfo.myElemNames); + TValueHolder anIsElemNames(theInfo.myIsElemNames); + TValueHolder anElemNum (theInfo.myElemNum); + TValueHolder anIsElemNum (theInfo.myIsElemNum); + TValueHolder aFamNum (theInfo.myFamNum); + TValueHolder anIsFamNum (theInfo.myIsFamNum); + TValueHolder anEntity (theInfo.myEntity); + TValueHolder aGeom (theInfo.myGeom); + TValueHolder aConnMode (theInfo.myConnMode); + + TErr aRet; + aRet = MEDmeshElementRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + aConnMode, + aModeSwitch, + &aConn, + &anIsElemNames, + &anElemNames, + &anIsElemNum, + &anElemNum, + &anIsFamNum, + &aFamNum); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetCellInfo - MEDmeshElementRd(...)"); + + if (anIsFamNum == MED_FALSE) + { + int mySize = (int) theInfo.myFamNum->size(); + theInfo.myFamNum->clear(); + theInfo.myFamNum->resize(mySize, 0); + } + + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetCellInfo(const MED::TCellInfo& theInfo, + TErr* theErr) + { + SetCellInfo(theInfo, eLECTURE_ECRITURE, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetCellInfo(const MED::TCellInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TCellInfo& anInfo = const_cast(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TValueHolder aMeshName (aMeshInfo.myName); + TValueHolder aConn (anInfo.myConn); + TValueHolder aModeSwitch (anInfo.myModeSwitch); + TValueHolder anElemNames (anInfo.myElemNames); + TValueHolder anIsElemNames(anInfo.myIsElemNames); + TValueHolder anElemNum (anInfo.myElemNum); + TValueHolder anIsElemNum (anInfo.myIsElemNum); + TValueHolder aFamNum (anInfo.myFamNum); + TValueHolder anIsFamNum (anInfo.myIsFamNum); + TValueHolder anEntity (anInfo.myEntity); + TValueHolder aGeom (anInfo.myGeom); + TValueHolder aConnMode (anInfo.myConnMode); + TValueHolder aNbElem (anInfo.myNbElem); + + TErr aRet; + aRet = MEDmeshElementConnectivityWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_UNDEF_DT, + anEntity, + aGeom, + aConnMode, + aModeSwitch, + aNbElem, + &aConn); + + MEDmeshEntityFamilyNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + aNbElem, + &aFamNum); + if (anIsElemNames) + MEDmeshEntityNameWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + aNbElem, + &anElemNames); + if (anIsElemNum) + MEDmeshEntityNumberWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + anEntity, + aGeom, + aNbElem, + &anElemNum); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetCellInfo - MEDmeshElementWr(...)"); + } + + //---------------------------------------------------------------------------- + PCellInfo + TWrapper + ::CrCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + EConnectivite theConnMode, + EBooleen theIsElemNum, + EBooleen theIsElemNames, + EModeSwitch theMode) + { + return PCellInfo(new TTCellInfo + (theMeshInfo, + theEntity, + theGeom, + theNbElem, + theConnMode, + theIsElemNum, + theIsElemNames, + theMode)); + } + + //---------------------------------------------------------------------------- + PCellInfo + TWrapper + ::CrCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theConnectivities, + EConnectivite theConnMode, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums, + const TStringVector& theElemNames, + EModeSwitch theMode) + { + return PCellInfo(new TTCellInfo + (theMeshInfo, + theEntity, + theGeom, + theConnectivities, + theConnMode, + theFamilyNums, + theElemNums, + theElemNames, + theMode)); + } + + //---------------------------------------------------------------------------- + PCellInfo + TWrapper + ::CrCellInfo(const PMeshInfo& theMeshInfo, + const PCellInfo& theInfo) + { + return PCellInfo(new TTCellInfo + (theMeshInfo, + theInfo)); + } + + //---------------------------------------------------------------------------- + PCellInfo + TWrapper + ::GetPCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode, + TErr* theErr) + { + if (theMeshInfo->GetType() != eNON_STRUCTURE) + return PCellInfo(); + TInt aNbElem = GetNbCells(theMeshInfo, theEntity, theGeom, theConnMode); + PCellInfo anInfo = CrCellInfo(theMeshInfo, theEntity, theGeom, aNbElem, theConnMode); + GetCellInfo(anInfo, theErr); + +#ifdef _DEBUG_ + TInt aConnDim = anInfo->GetConnDim(); + INITMSG(MYDEBUG, "GetPCellInfo - theEntity = "<GetConnSlice(iElem); + for (TInt iConn = 0; iConn < aConnDim; iConn++) { + ADDMSG(MYVALUEDEBUG, aConnSlice[iConn]<<","); + } + ADDMSG(MYVALUEDEBUG, " "); + } + ADDMSG(MYDEBUG, std::endl); + + BEGMSG(MYVALUEDEBUG, "GetPCellInfo - GetFamNum: "); + for (TInt iElem = 0; iElem < aNbElem; iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetFamNum(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); + + if (anInfo->IsElemNum()) { + BEGMSG(MYVALUEDEBUG, "GetPCellInfo - GetElemNum: "); + for (TInt iElem = 0; iElem < aNbElem; iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetElemNum(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); + } + ADDMSG(MYDEBUG, std::endl); +#endif + + return anInfo; + } + + //---------------------------------------------------------------------------- + EGeometrieElement + TWrapper + ::GetBallGeom(const TMeshInfo& theMeshInfo) + { + TFileWrapper aFileWrapper(myFile, eLECTURE); + + // read med_geometry_type of "MED_BALL" element + char geotypename[ MED_NAME_SIZE + 1] = MED_BALL_NAME; + return EGeometrieElement(MEDstructElementGeotype(myFile->Id(), geotypename)); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbBalls(const TMeshInfo& theMeshInfo) + { + TFileWrapper aFileWrapper(myFile, eLECTURE); + + EGeometrieElement ballType = GetBallGeom(theMeshInfo); + if (ballType < 0) + return 0; + + return GetNbCells(theMeshInfo, eSTRUCT_ELEMENT, ballType, eNOD); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetBallInfo(TBallInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + // check geometry of MED_BALL + if (theInfo.myGeom == eBALL) + { + theInfo.myGeom = GetBallGeom(*theInfo.myMeshInfo); + if (theInfo.myGeom < 0) { + if (!theErr) + EXCEPTION(std::runtime_error, "GetBallInfo - no balls in the mesh"); + *theErr = theInfo.myGeom; + return; + } + } + + // read nodes ids + GetCellInfo(theInfo); + + // read diameters + TValueHolder aMeshName (theInfo.myMeshInfo->myName); + TValueHolder aGeom (theInfo.myGeom); + TValueHolder aDiam (theInfo.myDiameters); + char varattname[ MED_NAME_SIZE + 1] = MED_BALL_DIAMETER; + + TErr aRet = MEDmeshStructElementVarAttRd(myFile->Id(), &aMeshName, + MED_NO_DT, MED_NO_IT, + aGeom, + varattname, + &aDiam); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetBallInfo - pb at reading diameters"); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetBallInfo(const TBallInfo& theInfo, + TErr* theErr) + { + SetBallInfo(theInfo, eLECTURE_ECRITURE, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetBallInfo(const TBallInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + TErr ret; + char ballsupportname[MED_NAME_SIZE+1] = "BALL_SUPPORT_MESH"; + EGeometrieElement ballGeom = GetBallGeom(*theInfo.myMeshInfo); + if (ballGeom < 0) + { + // no ball model in the file, create support mesh for it + char dummyname [MED_NAME_SIZE*3+1] = ""; + if ((ret = MEDsupportMeshCr(myFile->Id(), + ballsupportname, + theInfo.myMeshInfo->GetSpaceDim(), + theInfo.myMeshInfo->GetDim(), + "Support mesh for a ball model", + MED_CARTESIAN, + /*axisname=*/dummyname, + /*unitname=*/dummyname)) < 0) { + if (!theErr) + EXCEPTION(std::runtime_error, "SetBallInfo - MEDsupportMeshCr"); + *theErr = ret; + return; + } + // write coordinates of 1 node + med_float coord[3] = {0, 0, 0}; + if ((ret = MEDmeshNodeCoordinateWr(myFile->Id(), + ballsupportname, MED_NO_DT, MED_NO_IT, 0.0, + MED_FULL_INTERLACE, /*nnode=*/1, coord)) < 0) { + if (!theErr) + EXCEPTION(std::runtime_error, "SetBallInfo - MEDmeshNodeCoordinateWr"); + *theErr = ret; + return; + } + // ball model creation + char geotypename[ MED_NAME_SIZE + 1] = MED_BALL_NAME; + if ((ballGeom = (EGeometrieElement) MEDstructElementCr(myFile->Id(), + geotypename, + theInfo.myMeshInfo->GetSpaceDim(), + ballsupportname, + MED_NODE,MED_NONE)) < 0) { + if (!theErr) + EXCEPTION(std::runtime_error, "SetBallInfo - MEDstructElementCr"); + *theErr = ret; + return; + } + // create diameter attribute + if ((ret = MEDstructElementVarAttCr(myFile->Id(), + geotypename, MED_BALL_DIAMETER, + MED_ATT_FLOAT64, /*ncomp=*/1)) < 0) { + if (!theErr) + EXCEPTION(std::runtime_error, "SetBallInfo - MEDstructElementVarAttCr"); + *theErr = ret; + return; + } + } // ballGeom < 0 + + TBallInfo& aBallInfo = ((TBallInfo&) theInfo); + aBallInfo.myGeom = ballGeom; + + // write node ids + SetCellInfo(theInfo, theMode, theErr); + if (theErr && theErr < 0) + return; + + // write diameter + TValueHolder aMeshName (aBallInfo.myMeshInfo->myName); + TValueHolder aGeom (aBallInfo.myGeom); + TValueHolder aDiam (aBallInfo.myDiameters); + ret = MEDmeshStructElementVarAttWr(myFile->Id(), &aMeshName, + MED_NO_DT, MED_NO_IT, + aGeom, MED_BALL_DIAMETER, + theInfo.myNbElem, &aDiam); + if (theErr) + *theErr = ret; + else if (ret < 0) + EXCEPTION(std::runtime_error, "SetBallInfo - MEDmeshStructElementVarAttWr"); + } + + //---------------------------------------------------------------------------- + PBallInfo + TWrapper + ::CrBallInfo(const PMeshInfo& theMeshInfo, + TInt theNbBalls, + EBooleen theIsElemNum) + { + return PBallInfo(new TTBallInfo(theMeshInfo, theNbBalls, theIsElemNum)); + } + + //---------------------------------------------------------------------------- + PBallInfo + TWrapper + ::CrBallInfo(const PMeshInfo& theMeshInfo, + const TIntVector& theNodes, + TFloatVector& theDiameters, + const TIntVector& theFamilyNums, + const TIntVector& theElemNums) + { + return PBallInfo(new TTBallInfo(theMeshInfo, theNodes, theDiameters, + theFamilyNums, theElemNums)); + } + + //---------------------------------------------------------------------------- + PBallInfo + TWrapper + ::CrBallInfo(const PMeshInfo& theMeshInfo, + const PBallInfo& theInfo) + { + return PBallInfo(new TTBallInfo(theMeshInfo, theInfo)); + } + + //---------------------------------------------------------------------------- + PBallInfo + TWrapper + ::GetPBallInfo(const PMeshInfo& theMeshInfo) + { + TInt nbBalls = GetNbBalls(theMeshInfo); + if (nbBalls < 1) return PBallInfo(); + + PBallInfo anInfo = CrBallInfo(theMeshInfo, nbBalls); + GetBallInfo(anInfo); + + return anInfo; + } + + //----------------------------------------------------------------- + TInt + TWrapper + ::GetNbFields(TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return -1; + + return MEDnField(myFile->Id()); + } + + //---------------------------------------------------------------------------- + TInt + TWrapper + ::GetNbComp(TInt theFieldId, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return -1; + + return MEDfieldnComponent(myFile->Id(), theFieldId); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetFieldInfo(TInt theFieldId, + MED::TFieldInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + TString aFieldName(256); // Protect from memory problems with too long names + TValueHolder aType(theInfo.myType); + TValueHolder aCompNames(theInfo.myCompNames); + TValueHolder anUnitNames(theInfo.myUnitNames); + MED::TMeshInfo& aMeshInfo = theInfo.myMeshInfo; + + TErr aRet; + med_bool local; + char dtunit[MED_SNAME_SIZE+1]; + char local_mesh_name[MED_NAME_SIZE+1]=""; + med_int nbofstp; + theInfo.myNbComp = MEDfieldnComponent(myFile->Id(), theFieldId); + aRet = MEDfieldInfo(myFile->Id(), + theFieldId, + &aFieldName[0], + local_mesh_name, + &local, + &aType, + &aCompNames, + &anUnitNames, + dtunit, + &nbofstp); + + if (strcmp(&aMeshInfo.myName[0], local_mesh_name) != 0) { + if (theErr) + *theErr = -1; + return; + } + + theInfo.SetName(aFieldName); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetFieldInfo - MEDfieldInfo(...)"); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetFieldInfo(const MED::TFieldInfo& theInfo, + TErr* theErr) + { + TErr aRet; + SetFieldInfo(theInfo, eLECTURE_ECRITURE, &aRet); + + if (aRet < 0) + SetFieldInfo(theInfo, eLECTURE_AJOUT, &aRet); + + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetFieldInfo(const MED::TFieldInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TFieldInfo& anInfo = const_cast(theInfo); + + TValueHolder aFieldName(anInfo.myName); + TValueHolder aType(anInfo.myType); + TValueHolder aCompNames(anInfo.myCompNames); + TValueHolder anUnitNames(anInfo.myUnitNames); + MED::TMeshInfo& aMeshInfo = anInfo.myMeshInfo; + TErr aRet; + char dtunit[MED_SNAME_SIZE+1]; + std::fill(dtunit, dtunit+MED_SNAME_SIZE+1, '\0'); + aRet = MEDfieldCr(myFile->Id(), + &aFieldName, + aType, + anInfo.myNbComp, + &aCompNames, + &anUnitNames, + dtunit, + &aMeshInfo.myName[0]); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetFieldInfo - MEDfieldCr(...)"); + } + + //---------------------------------------------------------------------------- + PFieldInfo + TWrapper + ::CrFieldInfo(const PMeshInfo& theMeshInfo, + TInt theNbComp, + ETypeChamp theType, + const std::string& theValue, + EBooleen theIsLocal, + TInt theNbRef) + { + return PFieldInfo(new TTFieldInfo + (theMeshInfo, + theNbComp, + theType, + theValue, + theIsLocal, + theNbRef)); + } + + //---------------------------------------------------------------------------- + PFieldInfo + TWrapper + ::CrFieldInfo(const PMeshInfo& theMeshInfo, + const PFieldInfo& theInfo) + { + return PFieldInfo(new TTFieldInfo + (theMeshInfo, + theInfo)); + } + + //---------------------------------------------------------------------------- + PFieldInfo + TWrapper + ::GetPFieldInfo(const PMeshInfo& theMeshInfo, + TInt theId, + TErr* theErr) + { + TInt aNbComp = GetNbComp(theId); + PFieldInfo anInfo = CrFieldInfo(theMeshInfo, aNbComp); + GetFieldInfo(theId, *anInfo, theErr); + +#ifdef _DEBUG_ + INITMSG(MYDEBUG, + "GetPFieldInfo "<< + "- aName = '"<GetName()<<"'"<< + "; aType = "<GetType()<< + "; aNbComp = "<Id()); + } + + //---------------------------------------------------------------------------- + TGaussInfo::TInfo + TWrapper + ::GetGaussPreInfo(TInt theId, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return TGaussInfo::TInfo(TGaussInfo::TKey(ePOINT1, ""), 0); + + med_int aNbGaussPoints = med_int(); + TVector aName(GetNOMLength()+1); + med_geometry_type aGeom = MED_NONE; + + TErr aRet; + med_int dim; + char geointerpname[MED_NAME_SIZE+1] = ""; + char ipointstructmeshname[MED_NAME_SIZE+1] = ""; + med_int nsectionmeshcell; + med_geometry_type sectiongeotype; + aRet = MEDlocalizationInfo (myFile->Id(), + theId, + &aName[0], + &aGeom, + &dim, + &aNbGaussPoints, + geointerpname, + ipointstructmeshname, + &nsectionmeshcell, + §iongeotype); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetGaussPreInfo - MEDlocalizationInfo(...)"); + return TGaussInfo::TInfo(TGaussInfo::TKey(EGeometrieElement(aGeom), &aName[0]), + TInt(aNbGaussPoints)); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetGaussInfo(TInt theId, + TGaussInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + TValueHolder aRefCoord(theInfo.myRefCoord); + TValueHolder aGaussCoord(theInfo.myGaussCoord); + TValueHolder aWeight(theInfo.myWeight); + TValueHolder aModeSwitch(theInfo.myModeSwitch); + TValueHolder aGaussName(theInfo.myName); + + TErr aRet; + aRet = MEDlocalizationRd(myFile->Id(), + &aGaussName, + aModeSwitch, + &aRefCoord, + &aGaussCoord, + &aWeight); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetGaussInfo - MEDlocalizationRd(...)"); + } + + //---------------------------------------------------------------------------- + PGaussInfo + TWrapper + ::CrGaussInfo(const TGaussInfo::TInfo& theInfo, + EModeSwitch theMode) + { + return PGaussInfo(new TTGaussInfo + (theInfo, + theMode)); + } + + //----------------------------------------------------------------- + TInt + TWrapper + ::GetNbTimeStamps(const MED::TFieldInfo& theInfo, + const MED::TEntityInfo& theEntityInfo, + EEntiteMaillage& theEntity, + TGeom2Size& theGeom2Size, + TErr* theErr) + { + theEntity = EEntiteMaillage(-1); + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr) { + if (theEntityInfo.empty()) + *theErr = -1; + if (*theErr < 0) + return -1; + } + else if (theEntityInfo.empty()) + EXCEPTION(std::runtime_error, "GetNbTimeStamps - There is no any Entity on the Mesh"); + + bool anIsPerformAdditionalCheck = GetNbMeshes() > 1; + + theGeom2Size.clear(); + TInt aNbTimeStamps = 0; + TIdt anId = myFile->Id(); + + MED::TFieldInfo& anInfo = const_cast(theInfo); + TValueHolder aFieldName(anInfo.myName); + MED::TMeshInfo& aMeshInfo = anInfo.myMeshInfo; + + // workaround for IPAL13676 + MED::TEntityInfo localEntityInfo = theEntityInfo; + TEntityInfo::iterator anLocalIter = localEntityInfo.find(eMAILLE); + if (anLocalIter != localEntityInfo.end()) { + localEntityInfo[eNOEUD_ELEMENT] = anLocalIter->second; + } + + TEntityInfo::const_iterator anIter = localEntityInfo.begin(); + for (; anIter != localEntityInfo.end(); anIter++) { + med_entity_type anEntity = med_entity_type(anIter->first); + const TGeom2Size& aGeom2Size = anIter->second; + TGeom2Size::const_iterator anGeomIter = aGeom2Size.begin(); + for (; anGeomIter != aGeom2Size.end(); anGeomIter++) { + med_geometry_type aGeom = med_geometry_type(anGeomIter->first); + char aMeshName[MED_NAME_SIZE+1]; + med_bool islocal; + med_field_type ft; + char dtunit[MED_SNAME_SIZE+1]; + med_int myNbComp = MEDfieldnComponentByName(anId, &aFieldName); + char *cname=new char[myNbComp*MED_SNAME_SIZE+1]; + char *unitname=new char[myNbComp*MED_SNAME_SIZE+1]; + TInt aNbStamps; + MEDfieldInfoByName(anId, + &aFieldName, + aMeshName, + &islocal, + &ft, + cname, + unitname, + dtunit, + &aNbStamps); + delete [] cname; + delete [] unitname; + med_int nval = 0; + med_int aNumDt; + med_int aNumOrd; + med_float aDt; + if (aNbStamps > 0) + { + MEDfieldComputingStepInfo(anId, + &aFieldName, + 1, + &aNumDt, + &aNumOrd, + &aDt); + char profilename[MED_NAME_SIZE+1]; + char locname[MED_NAME_SIZE+1]; + med_int profilsize; + med_int aNbGauss; + + // protection from crash (division by zero) + // inside MEDfieldnValueWithProfile function + // caused by the workaround for IPAL13676 (see above) + if (anEntity == MED_NODE_ELEMENT && aGeom % 100 == 0) + continue; + + nval = MEDfieldnValueWithProfile(anId, + &aFieldName, + aNumDt, + aNumOrd, + anEntity, + med_geometry_type(aGeom), + 1, + MED_COMPACT_STMODE, + profilename, + &profilsize, + locname, + &aNbGauss); + } + bool anIsSatisfied =(nval > 0); + if (anIsSatisfied) { + INITMSG(MYDEBUG, + "GetNbTimeStamps aNbTimeStamps = "<second; + theEntity = EEntiteMaillage(anEntity); + aNbTimeStamps = aNbStamps; + } + } + if (!theGeom2Size.empty()) + break; + } + return aNbTimeStamps; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetTimeStampInfo(TInt theTimeStampId, + MED::TTimeStampInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + const TGeom2Size& aGeom2Size = theInfo.myGeom2Size; + + if (theErr) { + if (aGeom2Size.empty()) + *theErr = -1; + if (*theErr < 0) + return; + } + else if (aGeom2Size.empty()) + EXCEPTION(std::runtime_error, "GetTimeStampInfo - There is no any cell"); + + MED::TFieldInfo& aFieldInfo = *theInfo.myFieldInfo; + MED::TMeshInfo& aMeshInfo = *aFieldInfo.myMeshInfo; + + TValueHolder aFieldName(aFieldInfo.myName); + TValueHolder anEntity(theInfo.myEntity); + TValueHolder aNumDt(theInfo.myNumDt); + TValueHolder aNumOrd(theInfo.myNumOrd); + TValueHolder anUnitDt(theInfo.myUnitDt); + TValueHolder aDt(theInfo.myDt); + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder anIsLocal(aFieldInfo.myIsLocal); + TValueHolder aNbRef(aFieldInfo.myNbRef); + + TGeom2NbGauss& aGeom2NbGauss = theInfo.myGeom2NbGauss; + + // just to get a time stamp unit (anUnitDt) + med_field_type aFieldType; + med_int aNbComp = MEDfieldnComponentByName(myFile->Id(), &aFieldName); + char *aCompName = new char[aNbComp*MED_SNAME_SIZE+1]; + char *aCompUnit = new char[aNbComp*MED_SNAME_SIZE+1]; + TInt aNbStamps; + MEDfieldInfoByName(myFile->Id(), + &aFieldName, + &aMeshName, + &anIsLocal, + &aFieldType, + aCompName, + aCompUnit, + &anUnitDt, + &aNbStamps); + delete [] aCompName; + delete [] aCompUnit; + + TGeom2Size::const_iterator anIter = aGeom2Size.begin(); + for (; anIter != aGeom2Size.end(); anIter++) { + const EGeometrieElement& aGeom = anIter->first; + med_int aNbGauss = -1; + + TErr aRet; + aRet = MEDfieldComputingStepInfo(myFile->Id(), + &aFieldName, + theTimeStampId, + &aNumDt, + &aNumOrd, + &aDt); + char profilename[MED_NAME_SIZE+1]; + med_int profilsize; + char locname[MED_NAME_SIZE+1]; + MEDfieldnValueWithProfile(myFile->Id(), + &aFieldName, + aNumDt, + aNumOrd, + anEntity, + med_geometry_type(aGeom), + 1, + MED_COMPACT_STMODE, + profilename, + &profilsize, + locname, + &aNbGauss); + + static TInt MAX_NB_GAUSS_POINTS = 32; + if (aNbGauss <= 0 || aNbGauss > MAX_NB_GAUSS_POINTS) + aNbGauss = 1; + + aGeom2NbGauss[aGeom] = aNbGauss; + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetTimeStampInfo - MEDfieldnValueWithProfile(...)"); + } + } + + //---------------------------------------------------------------------------- + PTimeStampInfo + TWrapper + ::CrTimeStampInfo(const PFieldInfo& theFieldInfo, + EEntiteMaillage theEntity, + const TGeom2Size& theGeom2Size, + const TGeom2NbGauss& theGeom2NbGauss, + TInt theNumDt, + TInt theNumOrd, + TFloat theDt, + const std::string& theUnitDt, + const TGeom2Gauss& theGeom2Gauss) + { + return PTimeStampInfo(new TTTimeStampInfo + (theFieldInfo, + theEntity, + theGeom2Size, + theGeom2NbGauss, + theNumDt, + theNumOrd, + theDt, + theUnitDt, + theGeom2Gauss)); + } + + //---------------------------------------------------------------------------- + PTimeStampInfo + TWrapper + ::CrTimeStampInfo(const PFieldInfo& theFieldInfo, + const PTimeStampInfo& theInfo) + { + return PTimeStampInfo(new TTTimeStampInfo + (theFieldInfo, + theInfo)); + } + + //---------------------------------------------------------------------------- + PTimeStampInfo + TWrapper + ::GetPTimeStampInfo(const PFieldInfo& theFieldInfo, + EEntiteMaillage theEntity, + const TGeom2Size& theGeom2Size, + TInt theId, + TErr* theErr) + { + PTimeStampInfo anInfo = CrTimeStampInfo(theFieldInfo, theEntity, theGeom2Size); + GetTimeStampInfo(theId, *anInfo, theErr); + +#ifdef _DEBUG_ + INITMSG(MYDEBUG, "GetPTimeStampInfo - anEntity = "<GetEntity()<<"\n"); + TGeom2NbGauss& aGeom2NbGauss = anInfo->myGeom2NbGauss; + TGeom2NbGauss::const_iterator anIter = aGeom2NbGauss.begin(); + for (; anIter != aGeom2NbGauss.end(); anIter++) { + const EGeometrieElement& aGeom = anIter->first; + INITMSG(MYDEBUG, "aGeom = "<Id()); + } + + //---------------------------------------------------------------------------- + TProfileInfo::TInfo + TWrapper + ::GetProfilePreInfo(TInt theId, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return TProfileInfo::TInfo(); + + med_int aSize = -1; + TVector aName(GetNOMLength()+1); + + TErr aRet; + aRet = MEDprofileInfo(myFile->Id(), + theId, + &aName[0], + &aSize); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetProfilePreInfo - MEDprofileInfo(...)"); + + return TProfileInfo::TInfo(&aName[0], aSize); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetProfileInfo(TInt theId, + TProfileInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + TProfileInfo& anInfo = const_cast(theInfo); + TValueHolder anElemNum(anInfo.myElemNum); + TValueHolder aProfileName(anInfo.myName); + + TErr aRet; + aRet = MEDprofileRd(myFile->Id(), + &aProfileName, + &anElemNum); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetProfileInfo - MEDprofileRd(...)"); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetProfileInfo(const TProfileInfo& theInfo, + TErr* theErr) + { + TErr aRet; + SetProfileInfo(theInfo, eLECTURE_ECRITURE, &aRet); + + if (aRet < 0) + SetProfileInfo(theInfo, eLECTURE_AJOUT, &aRet); + + if (aRet < 0) + SetProfileInfo(theInfo, eCREATION, &aRet); + + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetProfileInfo(const TProfileInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + TProfileInfo& anInfo = const_cast(theInfo); + TValueHolder anElemNum(anInfo.myElemNum); + TValueHolder aProfileName(anInfo.myName); + + TErr aRet; + aRet = MEDprofileWr(myFile->Id(), // descripteur du fichier. + &aProfileName, // tableau de valeurs du profil. + theInfo.GetSize(), // taille du profil. + &anElemNum); // nom profil. + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetProfileInfo - MEDprofileWr(...)"); + } + + //---------------------------------------------------------------------------- + PProfileInfo + TWrapper + ::CrProfileInfo(const TProfileInfo::TInfo& theInfo, + EModeProfil theMode) + { + return PProfileInfo(new TTProfileInfo + (theInfo, + theMode)); + } + + //---------------------------------------------------------------------------- + PProfileInfo + TWrapper + ::GetPProfileInfo(TInt theId, + EModeProfil theMode, + TErr* theErr) + { + TProfileInfo::TInfo aPreInfo = GetProfilePreInfo(theId); + PProfileInfo anInfo = CrProfileInfo(aPreInfo, theMode); + GetProfileInfo(theId, *anInfo, theErr); + + return anInfo; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, + const TMKey2Profile& theMKey2Profile, + const TKey2Gauss& theKey2Gauss, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + TIdt anId = myFile->Id(); + + TValueHolder aModeSwitch(theTimeStampValue->myModeSwitch); + MED::TGeom2Profile& aGeom2Profile = theTimeStampValue->myGeom2Profile; + + MED::PTimeStampInfo aTimeStampInfo = theTimeStampValue->myTimeStampInfo; + TValueHolder anEntity(aTimeStampInfo->myEntity); + TValueHolder aNumDt(aTimeStampInfo->myNumDt); + TValueHolder aNumOrd(aTimeStampInfo->myNumOrd); + + MED::PFieldInfo aFieldInfo = aTimeStampInfo->myFieldInfo; + TValueHolder aFieldName(aFieldInfo->myName); + TValueHolder anIsLocal(aFieldInfo->myIsLocal); + + MED::PMeshInfo aMeshInfo = aFieldInfo->myMeshInfo; + TValueHolder aMeshName(aMeshInfo->myName); + + TGeom2Gauss& aGeom2Gauss = aTimeStampInfo->myGeom2Gauss; + TVector aGaussName(GetNOMLength()+1); + + med_storage_mode aProfileMode = med_storage_mode(boost::get<0>(theMKey2Profile)); + MED::TKey2Profile aKey2Profile = boost::get<1>(theMKey2Profile); + TVector aProfileName(GetNOMLength()+1); + + TGeom2Size& aGeom2Size = aTimeStampInfo->myGeom2Size; + TGeom2Size::iterator anIter = aGeom2Size.begin(); + for (; anIter != aGeom2Size.end(); anIter++) { + EGeometrieElement aGeom = anIter->first; + TInt aNbElem = anIter->second; + med_int profilesize, aNbGauss; + + TInt aNbVal = MEDfieldnValueWithProfile(anId, + &aFieldName, + aNumDt, + aNumOrd, + anEntity, + med_geometry_type(aGeom), + 1, + aProfileMode, + &aProfileName[0], + &profilesize, + &aGaussName[0], + &aNbGauss); + + if (aNbVal <= 0) { + if (theErr) { + *theErr = -1; + return; + } + EXCEPTION(std::runtime_error, "GetTimeStampValue - MEDfieldnValueWithProfile(...) - aNbVal == "<myNbComp; + TInt aNbValue = aNbVal;// / aNbGauss; rules in MED changed + theTimeStampValue->AllocateValue(aGeom, + aNbValue, + aNbGauss, + aNbComp); + TInt aValueSize = theTimeStampValue->GetValueSize(aGeom); + + INITMSG(MYDEBUG, + "TWrapper::GetTimeStampValue - aGeom = "<second; + aGeom2Gauss[aGeom] = aGaussInfo; + } + } + + MED::PProfileInfo aProfileInfo; + if (strcmp(&aProfileName[0], MED_NO_PROFILE) != 0) { + MED::TKey2Profile::const_iterator anIter = aKey2Profile.find(&aProfileName[0]); + if (anIter != aKey2Profile.end()) { + aProfileInfo = anIter->second; + aGeom2Profile[aGeom] = aProfileInfo; + } + } + + if (aGaussInfo && aNbGauss != aGaussInfo->GetNbGauss()) { + if (theErr) { + *theErr = MED_FALSE; + return; + } + EXCEPTION(std::runtime_error, "GetTimeStampValue - aNbGauss != aGaussInfo->GetNbGauss()"); + } + + if (aProfileInfo && aProfileInfo->IsPresent()) { + TInt aNbSubElem = aProfileInfo->GetSize(); + TInt aProfileSize = aNbSubElem*aNbComp*aNbGauss; + if (aProfileSize != aValueSize) { + if (theErr) { + *theErr = -1; + return; + } + EXCEPTION(std::runtime_error, + "GetTimeStampValue - aProfileSize("<Id(); + + TValueHolder aModeSwitch(theTimeStampValue->myModeSwitch); + MED::TGeom2Profile& aGeom2Profile = theTimeStampValue->myGeom2Profile; + + MED::PTimeStampInfo aTimeStampInfo = theTimeStampValue->myTimeStampInfo; + TValueHolder anEntity(aTimeStampInfo->myEntity); + TValueHolder aNumDt(aTimeStampInfo->myNumDt); + TValueHolder aNumOrd(aTimeStampInfo->myNumOrd); + TValueHolder anUnitDt(aTimeStampInfo->myUnitDt); + TValueHolder aDt(aTimeStampInfo->myDt); + MED::TGeom2Gauss& aGeom2Gauss = aTimeStampInfo->myGeom2Gauss; + + MED::PFieldInfo aFieldInfo = aTimeStampInfo->myFieldInfo; + TValueHolder aFieldName(aFieldInfo->myName); + + MED::PMeshInfo aMeshInfo = aFieldInfo->myMeshInfo; + TValueHolder aMeshName(aMeshInfo->myName); + + const TGeomSet& aGeomSet = theTimeStampValue->myGeomSet; + TGeomSet::const_iterator anIter = aGeomSet.begin(); + for (; anIter != aGeomSet.end(); anIter++) { + EGeometrieElement aGeom = *anIter; + + TVector aGaussName(GetNOMLength()+1); + MED::TGeom2Gauss::const_iterator aGaussIter = aGeom2Gauss.find(aGeom); + if (aGaussIter != aGeom2Gauss.end()) { + MED::PGaussInfo aGaussInfo = aGaussIter->second; + strcpy(&aGaussName[0], &aGaussInfo->myName[0]); + } + + TVector aProfileName(GetNOMLength()+1); + med_storage_mode aProfileMode = med_storage_mode(eNO_PFLMOD); + MED::TGeom2Profile::const_iterator aProfileIter = aGeom2Profile.find(aGeom); + if (aProfileIter != aGeom2Profile.end()) { + MED::PProfileInfo aProfileInfo = aProfileIter->second; + aProfileMode = med_storage_mode(aProfileInfo->myMode); + strcpy(&aProfileName[0], &aProfileInfo->myName[0]); + } + + med_int aNbVal = theTimeStampValue->GetNbVal(aGeom); + + aRet = MEDfieldValueWithProfileWr(anId, + &aFieldName, + aNumDt, + aNumOrd, + aDt, + anEntity, + med_geometry_type(aGeom), + aProfileMode, + &aProfileName[0], + &aGaussName[0], + aModeSwitch, + MED_ALL_CONSTITUENT, + aNbVal, + theTimeStampValue->GetValuePtr(aGeom)); + if (aRet < 0) { + if (theErr) { + *theErr = MED_FALSE; + break; + } + EXCEPTION(std::runtime_error, "SetTimeStampValue - MEDfieldValueWithProfileWr(...)"); + } + + } + + INITMSG(MYDEBUG, "TWrapper::SetTimeStampValue - MED_MODE_ACCES = "<GetNbNodes(); + BEGMSG(MYVALUEDEBUG, "GetFamNumNode: "); + for (TInt iElem = 0; iElem < aNbElem; iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetFamNumNode(iElem)<<", "); + } + TInt aNbCells = anInfo->GetNbCells(); + BEGMSG(MYVALUEDEBUG, "GetFamNum: "); + for (TInt iElem = 0; iElem < aNbCells; iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetFamNum(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); + BEGMSG(MYVALUEDEBUG, "GetCoordName: "); + for (TInt iElem = 0; iElem < theMeshInfo->GetDim(); iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetCoordName(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); + BEGMSG(MYVALUEDEBUG, "GetCoordUnit: "); + for (TInt iElem = 0; iElem < theMeshInfo->GetDim(); iElem++) { + ADDMSG(MYVALUEDEBUG, anInfo->GetCoordUnit(iElem)<<", "); + } + ADDMSG(MYVALUEDEBUG, std::endl); + + } +#endif + + return anInfo; + } + + //---------------------------------------------------------------------------- + PGrilleInfo + TWrapper + ::GetPGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo) + { + PGrilleInfo anInfo = CrGrilleInfo(theMeshInfo, theInfo); + return anInfo; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetGrilleInfo(TGrilleInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + TValueHolder aMeshName(aMeshInfo.myName); + EMaillage aMaillageType = aMeshInfo.myType; + + GetGrilleType(aMeshInfo, theInfo.myGrilleType, theErr); + EGrilleType aGrilleType = theInfo.myGrilleType; + + TErr aRet = 0; + if (aMaillageType == eSTRUCTURE && aGrilleType == eGRILLE_STANDARD) { + GetGrilleStruct(aMeshInfo, theInfo.myGrilleStructure, theErr); + + TValueHolder aCoord(theInfo.myCoord); + TValueHolder aModeSwitch(theInfo.myModeSwitch); + TValueHolder aCoordNames(theInfo.myCoordNames); + TValueHolder aCoordUnits(theInfo.myCoordUnits); + //med_axis_type aRepere; + + aRet = MEDmeshNodeCoordinateRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + aModeSwitch, + &aCoord); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetGrilleInfo - MEDmeshNodeCoordinateRd(...)"); + + //TInt aNbNodes = theInfo.GetNbNodes();//GetNbFamilies(aMeshInfo); + TValueHolder aFamNumNode(theInfo.myFamNumNode); + + aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_NODE, + MED_NO_GEOTYPE, + &aFamNumNode); + + if (aRet < 0) { + // if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files + { + int mySize = (int)theInfo.myFamNumNode.size(); + theInfo.myFamNumNode.clear(); + theInfo.myFamNumNode.resize(mySize,0); + aRet = 0; + } + // else + // EXCEPTION(std::runtime_error, "GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...)"); + } + if (theErr) + *theErr = aRet; + + //============================ + } + + if (aMaillageType == eSTRUCTURE && aGrilleType != eGRILLE_STANDARD) { + ETable aTable = eCOOR_IND1; + for (med_int anAxis = 1; anAxis <= aMeshInfo.myDim; anAxis++) { + switch (anAxis) { + case 1: + aTable = eCOOR_IND1; + break; + case 2: + aTable = eCOOR_IND2; + break; + case 3: + aTable = eCOOR_IND3; + break; + default: + aRet = -1; + } + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetGrilleInfo - anAxis number out of range(...)"); + + TInt aNbIndexes = GetNbNodes(aMeshInfo, aTable); + if (aNbIndexes < 0) + EXCEPTION(std::runtime_error, "GetGrilleInfo - Erreur a la lecture de la taille de l'indice"); + + TValueHolder anIndexes(theInfo.GetIndexes(anAxis-1)); + //TValueHolder table(aTable); + //char aCompNames[MED_SNAME_SIZE+1]; + //char anUnitNames[MED_SNAME_SIZE+1]; + aRet=MEDmeshGridIndexCoordinateRd(myFile->Id(), + &aMeshName, + MED_NO_DT,MED_NO_IT, + anAxis, + &anIndexes); + + //theInfo.SetCoordName(anAxis-1, aCompNames); + //theInfo.SetCoordUnit(anAxis-1, anUnitNames); + theInfo.SetGrilleStructure(anAxis-1, aNbIndexes); + + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetGrilleInfo - MEDindicesCoordLire(...)"); + } + } + + EGeometrieElement aGeom = theInfo.GetGeom(); + EEntiteMaillage aEntity = theInfo.GetEntity(); + TInt aNbCells = theInfo.GetNbCells(); + + theInfo.myFamNum.resize(aNbCells); + TValueHolder aFamNum(theInfo.myFamNum); + + aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), + &aMeshName, MED_NO_DT, MED_NO_IT, med_entity_type(aEntity), + med_geometry_type(aGeom), &aFamNum); + + if (aMeshInfo.myDim == 3) + { + aGeom = theInfo.GetSubGeom(); + aEntity = theInfo.GetSubEntity(); + aNbCells = theInfo.GetNbSubCells(); + + theInfo.myFamSubNum.resize(aNbCells, 0); + TValueHolder aFamNum(theInfo.myFamSubNum); + + aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + med_entity_type(aEntity), + med_geometry_type(aGeom), + &aFamNum); + } + if (aRet < 0) { + // if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files + { + int mySize = (int)theInfo.myFamNumNode.size(); + theInfo.myFamNumNode.clear(); + theInfo.myFamNumNode.resize(mySize, 0); + aRet = 0; + } + // else + // EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...)"); + } + if (theErr) + *theErr = aRet; + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetGrilleInfo(const MED::TGrilleInfo& theInfo, + TErr* theErr) + { + SetGrilleInfo(theInfo, eLECTURE_ECRITURE, theErr); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::SetGrilleInfo(const MED::TGrilleInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + if (theInfo.myMeshInfo->myType != eSTRUCTURE) + return; + TFileWrapper aFileWrapper(myFile, theMode, theErr); + + if (theErr && *theErr < 0) + return; + + MED::TGrilleInfo& anInfo = const_cast(theInfo); + + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + TValueHolder aMeshName(aMeshInfo.myName); + + TValueHolder aGrilleType(anInfo.myGrilleType); + + TErr aRet = 0; + aRet = MEDmeshGridTypeRd(myFile->Id(), + &aMeshName, + &aGrilleType); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "SetGrilleInfo - MEDmeshGridTypeRd(...)"); + + if (anInfo.myGrilleType == eGRILLE_STANDARD) { + TValueHolder aCoord(anInfo.myCoord); + TValueHolder aModeSwitch(anInfo.myModeSwitch); + TValueHolder aCoordNames(anInfo.myCoordNames); + TValueHolder aCoordUnits(anInfo.myCoordUnits); + med_int aNbNoeuds = med_int(anInfo.myCoord.size() / aMeshInfo.myDim); + //med_axis_type aRepere = MED_CARTESIAN; + + aRet = MEDmeshNodeCoordinateWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_UNDEF_DT, + aModeSwitch, + aNbNoeuds, + &aCoord); + + if (aRet < 0) + EXCEPTION(std::runtime_error, "SetGrilleInfo - MEDmeshNodeCoordinateWr(...)"); + + TValueHolder aGrilleStructure(anInfo.myGrilleStructure); + aRet = MEDmeshGridStructWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_UNDEF_DT, + &aGrilleStructure); + if (aRet < 0) + EXCEPTION(std::runtime_error, "SetGrilleInfo - MEDmeshGridStructWr(...)"); + + } + else { + for (med_int aAxis = 0; aAxis < aMeshInfo.myDim; aAxis++) { + aRet = MEDmeshGridIndexCoordinateWr(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + MED_UNDEF_DT, + aAxis+1, + anInfo.GetIndexes(aAxis).size(), + &anInfo.GetIndexes(aAxis)[0]); + + if (aRet < 0) + EXCEPTION(std::runtime_error, "SetGrilleInfo - MEDmeshGridIndexCoordinateWr(...)"); + } + + } + + return; + } + + //---------------------------------------------------------------------------- + PGrilleInfo + TWrapper + ::CrGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo) + { + return PGrilleInfo(new TTGrilleInfo + (theMeshInfo, + theInfo)); + } + + //---------------------------------------------------------------------------- + PGrilleInfo + TWrapper + ::CrGrilleInfo(const PMeshInfo& theMeshInfo) + { + return PGrilleInfo(); // not implemented???? + } + + //---------------------------------------------------------------------------- + PGrilleInfo + TWrapper + ::CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type) + { + return PGrilleInfo(new TTGrilleInfo + (theMeshInfo, + type)); + } + + //---------------------------------------------------------------------------- + PGrilleInfo + TWrapper + ::CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const TInt& nbNodes) + { + return PGrilleInfo(new TTGrilleInfo + (theMeshInfo, + type, + nbNodes)); + } + + //---------------------------------------------------------------------------- + PGrilleInfo + TWrapper + ::CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const MED::TIntVector& nbNodeVec) + { + return PGrilleInfo(new TTGrilleInfo + (theMeshInfo, + type, + nbNodeVec)); + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetGrilleType(const MED::TMeshInfo& theMeshInfo, + EGrilleType& theGridType, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + EXCEPTION(std::runtime_error, " GetGrilleType - aFileWrapper (...)"); + + MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); + + if (aMeshInfo.myType == eSTRUCTURE) { + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aGridType(theGridType); + TErr aRet = MEDmeshGridTypeRd(myFile->Id(), + &aMeshName, + &aGridType); + + if (aRet < 0) + EXCEPTION(std::runtime_error, "GetGrilleInfo - MEDmeshGridTypeRd(...)"); + } + } + + //---------------------------------------------------------------------------- + void + TWrapper + ::GetGrilleStruct(const MED::TMeshInfo& theMeshInfo, + TIntVector& theStruct, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile, eLECTURE, theErr); + + if (theErr && *theErr < 0) + return; + + TErr aRet; + MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); + + TValueHolder aMeshName(aMeshInfo.myName); + TValueHolder aGridStructure(theStruct); + + aRet = MEDmeshGridStructRd(myFile->Id(), + &aMeshName, + MED_NO_DT, + MED_NO_IT, + &aGridStructure); + if (theErr) + *theErr = aRet; + else if (aRet < 0) + EXCEPTION(std::runtime_error, "GetGrilleInfo - MEDmeshGridStructRd(...)"); + } +} diff --git a/src/MEDWrapper/MED_Wrapper.hxx b/src/MEDWrapper/MED_Wrapper.hxx new file mode 100644 index 000000000..841eb4eca --- /dev/null +++ b/src/MEDWrapper/MED_Wrapper.hxx @@ -0,0 +1,1027 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_Wrapper_HeaderFile +#define MED_Wrapper_HeaderFile + +#include "MED_WrapperDef.hxx" +#include "MED_Structures.hxx" +#include "MED_Algorithm.hxx" + +#include + +namespace MED +{ + //---------------------------------------------------------------------------- + class TFile; + typedef boost::shared_ptr PFile; + + typedef enum {eLECTURE, eLECTURE_ECRITURE, eLECTURE_AJOUT, eCREATION} EModeAcces; + + //---------------------------------------------------------------------------- + //! Class that wraps the MED API + class MEDWRAPPER_EXPORT TWrapper + { + friend class TLockProxy; + + typedef boost::mutex TMutex; + //! Synchronization primitive that allows supporting thread safety for the MED access + TMutex myMutex; + + TWrapper(); + TWrapper(const TWrapper&); + TWrapper& operator=(const TWrapper&); + + public: + TWrapper(const std::string& theFileName); + + virtual + ~TWrapper(); + + //! Read number of MED Mesh entities in the MED file + virtual + TInt + GetNbMeshes(TErr* theErr = NULL); + + //! Read a MEDWrapper MED Mesh representation by its number + virtual + void + GetMeshInfo(TInt theMeshId, + TMeshInfo& theInfo, + TErr* theErr = NULL); + + //! Write the MEDWrapper MED Mesh representation into the MED file + virtual + void + SetMeshInfo(const TMeshInfo& theInfo, + TErr* theErr = NULL); + + void + SetMeshInfo(const MED::TMeshInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED Mesh representation + virtual + PMeshInfo + CrMeshInfo(TInt theDim = 0, + TInt theSpaceDim = 0, + const std::string& theValue = "", + EMaillage theType = eNON_STRUCTURE, + const std::string& theDesc = ""); + + //! Copy constructor for the MEDWrapper MED Mesh representation + virtual + PMeshInfo + CrMeshInfo(const PMeshInfo& theInfo); + + //! Get a MEDWrapper MED Mesh representation by its number + virtual + PMeshInfo + GetPMeshInfo(TInt theId, + TErr* theErr = NULL); + + //! Read number of MED Family entities in the MED file + virtual + TInt + GetNbFamilies(const TMeshInfo& theMeshInfo, + TErr* theErr = NULL); + + //! Read number of attributes for MED Family + virtual + TInt + GetNbFamAttr(TInt theFamId, + const TMeshInfo& theInfo, + TErr* theErr = NULL); + + //! Read number of MED Groups to which the MED Family belongs to + virtual + TInt + GetNbFamGroup(TInt theFamId, + const TMeshInfo& theInfo, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED Family representation by its number + virtual + void + GetFamilyInfo(TInt theFamId, + TFamilyInfo& theInfo, + TErr* theErr = NULL); + + //! Write a MEDWrapper MED Family representation into the MED file + virtual + void + SetFamilyInfo(const TFamilyInfo& theInfo, + TErr* theErr = NULL); + + void + SetFamilyInfo(const MED::TFamilyInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED Family representation + virtual + PFamilyInfo + CrFamilyInfo(const PMeshInfo& theMeshInfo, + TInt theNbGroup = 0, + TInt theNbAttr = 0, + TInt theId = 0, + const std::string& theValue = ""); + + //! Create a MEDWrapper MED Family representation + virtual + PFamilyInfo + CrFamilyInfo(const PMeshInfo& theMeshInfo, + const std::string& theValue, + TInt theId, + const TStringSet& theGroupNames, + const TStringVector& theAttrDescs = TStringVector(), + const TIntVector& theAttrIds = TIntVector(), + const TIntVector& theAttrVals = TIntVector()); + + //! Copy constructor for the MEDWrapper MED Family representation + virtual + PFamilyInfo + CrFamilyInfo(const PMeshInfo& theMeshInfo, + const PFamilyInfo& theInfo); + + //! Get a MEDWrapper MED Family representation by its number + PFamilyInfo + GetPFamilyInfo(const PMeshInfo& theMeshInfo, + TInt theId, + TErr* theErr = NULL); + + //! Read sequence of names for any descendant of TElemInfo + virtual + void + GetNames(TElemInfo& theInfo, + TInt theNb, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + //! Write sequence of names for any descendant of TElemInfo + virtual + void + SetNames(const TElemInfo& theInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + void + SetNames(const TElemInfo& theInfo, + EModeAcces theMode, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + //! Read sequence of numerated data for any descendant of TElemInfo + virtual + void + GetNumeration(TElemInfo& theInfo, + TInt theNb, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + //! Write sequence of numerated data for any descendant of TElemInfo + virtual + void + SetNumeration(const TElemInfo& theInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + void + SetNumeration(const TElemInfo& theInfo, + EModeAcces theMode, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + //! Read sequence of MED Families' indices for any descendant of TElemInfo + virtual + void + GetFamilies(TElemInfo& theInfo, + TInt theNb, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + //! Write sequence of MED Families' indices for any descendant of TElemInfo + virtual + void + SetFamilies(const TElemInfo& theInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + void + SetFamilies(const TElemInfo& theInfo, + EModeAcces theMode, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TErr* theErr = NULL); + + //! Read number of nodes in MED Mesh + virtual + TInt + GetNbNodes(const TMeshInfo& theMeshInfo, + TErr* theErr = NULL); + + virtual + TInt + GetNbNodes(const TMeshInfo& theMeshInfo, + ETable theTable, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED Nodes representation from the MED file + virtual + void + GetNodeInfo(TNodeInfo& theInfo, + TErr* theErr = NULL); + + //! Write the MEDWrapper MED Nodes representation into the MED file + virtual + void + SetNodeInfo(const TNodeInfo& theInfo, + TErr* theErr = NULL); + + void + SetNodeInfo(const MED::TNodeInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED Nodes representation + virtual + PNodeInfo + CrNodeInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EModeSwitch theMode = eFULL_INTERLACE, + ERepere theSystem = eCART, + EBooleen theIsElemNum = eVRAI, + EBooleen theIsElemNames = eVRAI); + + //! Create a MEDWrapper MED Nodes representation + virtual + PNodeInfo + CrNodeInfo(const PMeshInfo& theMeshInfo, + const TFloatVector& theNodeCoords, + EModeSwitch theMode = eFULL_INTERLACE, + ERepere theSystem = eCART, + const TStringVector& theCoordNames = TStringVector(), + const TStringVector& theCoordUnits = TStringVector(), + const TIntVector& theFamilyNums = TIntVector(), + const TIntVector& theElemNums = TIntVector(), + const TStringVector& theElemNames = TStringVector()); + + //! Copy constructor for the MEDWrapper MED Nodes representation + virtual + PNodeInfo + CrNodeInfo(const PMeshInfo& theMeshInfo, + const PNodeInfo& theInfo); + + //! Get a MEDWrapper MED Nodes representation from the MED file + PNodeInfo + GetPNodeInfo(const PMeshInfo& theMeshInfo, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED Elements representation + virtual + PElemInfo + CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EBooleen theIsElemNum = eVRAI, + EBooleen theIsElemNames = eVRAI); + + //! Create a MEDWrapper MED Elements representation + virtual + PElemInfo + CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + const TIntVector& theFamNum, + const TIntVector& aElemNum, + const TStringVector& aElemNames); + + //! Get a MEDWrapper MED Element representation from the MED file + PElemInfo + GetPElemInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity = eNOEUD, + EGeometrieElement theGeom = ePOINT1, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read number of MED Polygones in MED Mesh + virtual + TInt + GetNbPolygones(const TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read connectivity information for the MED Polygones in defined MED Mesh + virtual + TInt + GetPolygoneConnSize(const TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED Polygones representation from the MED file + virtual + void + GetPolygoneInfo(TPolygoneInfo& theInfo, + TErr* theErr = NULL); + + //! Write a MEDWrapper MED Polygones representation into the MED file + virtual + void + SetPolygoneInfo(const TPolygoneInfo& theInfo, + TErr* theErr = NULL); + + void + SetPolygoneInfo(const MED::TPolygoneInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED Polygones representation + virtual + PPolygoneInfo + CrPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + TInt theConnSize, + EConnectivite theConnMode = eNOD, + EBooleen theIsElemNum = eVRAI, + EBooleen theIsElemNames = eVRAI); + + //! Create a MEDWrapper MED Polygones representation + virtual + PPolygoneInfo + CrPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theIndexes, + const TIntVector& theConnectivities, + EConnectivite theConnMode = eNOD, + const TIntVector& theFamilyNums = TIntVector(), + const TIntVector& theElemNums = TIntVector(), + const TStringVector& theElemNames = TStringVector()); + + //! Copy constructor for the MEDWrapper MED Polygones representation + virtual + PPolygoneInfo + CrPolygoneInfo(const PMeshInfo& theMeshInfo, + const PPolygoneInfo& theInfo); + + //! Get a MEDWrapper MED Polygones representation from the MED file + PPolygoneInfo + GetPPolygoneInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode = eNOD); + + //! Read number of MED Polyedres in MED Mesh + virtual + TInt + GetNbPolyedres(const TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read connectivity information for the MED Polyedres in MED Mesh + virtual + void + GetPolyedreConnSize(const TMeshInfo& theMeshInfo, + TInt& theNbFaces, + TInt& theConnSize, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED Polyedres representation from the MED file + virtual + void + GetPolyedreInfo(TPolyedreInfo& theInfo, + TErr* theErr = NULL); + + //! Write a MEDWrapper MED Polyedres representation into the MED file + virtual + void + SetPolyedreInfo(const TPolyedreInfo& theInfo, + TErr* theErr = NULL); + + void + SetPolyedreInfo(const MED::TPolyedreInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED Polyedres representation + virtual + PPolyedreInfo + CrPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + TInt theNbFaces, + TInt theConnSize, + EConnectivite theConnMode = eNOD, + EBooleen theIsElemNum = eVRAI, + EBooleen theIsElemNames = eVRAI); + + //! Create a MEDWrapper MED Polyedres representation + virtual + PPolyedreInfo + CrPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theIndexes, + const TIntVector& theFaces, + const TIntVector& theConnectivities, + EConnectivite theConnMode = eNOD, + const TIntVector& theFamilyNums = TIntVector(), + const TIntVector& theElemNums = TIntVector(), + const TStringVector& theElemNames = TStringVector()); + + //! Copy constructor for the MEDWrapper MED Polyedres representation + virtual + PPolyedreInfo + CrPolyedreInfo(const PMeshInfo& theMeshInfo, + const PPolyedreInfo& theInfo); + + //! Get a MEDWrapper MED Polyedres representation from the MED file + PPolyedreInfo + GetPPolyedreInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode = eNOD); + + //! Get TEntityInfo which contains brief information about existing cells + // and their destribution among MED ENTITIES + virtual + TEntityInfo + GetEntityInfo(const TMeshInfo& theMeshInfo, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read number of cells for defined MED Mesh, ENTITY and geometrical type with given connectivity mode + virtual + TInt + GetNbCells(const TMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED Cells representation from the MED file + virtual + void + GetCellInfo(TCellInfo& theInfo, + TErr* theErr = NULL); + + //! Write the MEDWrapper MED Cells representation into the MED file + virtual + void + SetCellInfo(const TCellInfo& theInfo, + TErr* theErr = NULL); + + void + SetCellInfo(const MED::TCellInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED Cells representation + virtual + PCellInfo + CrCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + TInt theNbElem, + EConnectivite theConnMode = eNOD, + EBooleen theIsElemNum = eVRAI, + EBooleen theIsElemNames = eVRAI, + EModeSwitch theMode = eFULL_INTERLACE); + + //! Create a MEDWrapper MED Cells representation + virtual + PCellInfo + CrCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + const TIntVector& theConnectivities, + EConnectivite theConnMode = eNOD, + const TIntVector& theFamilyNums = TIntVector(), + const TIntVector& theElemNums = TIntVector(), + const TStringVector& theElemNames = TStringVector(), + EModeSwitch theMode = eFULL_INTERLACE); + + //! Copy constructor for the MEDWrapper MED Cells representation + virtual + PCellInfo + CrCellInfo(const PMeshInfo& theMeshInfo, + const PCellInfo& theInfo); + + //! Get a MEDWrapper MED Cells representation from the MED file + PCellInfo + GetPCellInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + + //! Read geom type of MED_BALL structural element + EGeometrieElement + GetBallGeom(const TMeshInfo& theMeshInfo); + + //! Read number of balls in the Mesh + /*! This feature is supported since version 3.0 */ + virtual + TInt + GetNbBalls(const TMeshInfo& theMeshInfo); + + //! Read a MEDWrapper representation of MED_BALL from the MED file + /*! This feature is supported since version 3.0 */ + virtual + void + GetBallInfo(TBallInfo& theInfo, + TErr* theErr = NULL); + + //! Write a MEDWrapper representation of MED_BALL into the MED file + /*! This feature is supported since version 3.0 */ + virtual + void + SetBallInfo(const TBallInfo& theInfo, + TErr* theErr = NULL); + + void + SetBallInfo(const TBallInfo& theInfo, + EModeAcces theMode, + TErr* theErr); + + //! Create a MEDWrapper MED Balls representation + /*! This feature is supported since version 3.0 */ + virtual + PBallInfo + CrBallInfo(const PMeshInfo& theMeshInfo, + TInt theNbBalls, + EBooleen theIsElemNum = eVRAI); + + //! Create a MEDWrapper MED Balls representation + /*! This feature is supported since version 3.0 */ + virtual + PBallInfo + CrBallInfo(const PMeshInfo& theMeshInfo, + const TIntVector& theNodes, + TFloatVector& theDiameters, + const TIntVector& theFamilyNums = TIntVector(), + const TIntVector& theElemNums = TIntVector()); + + //! Copy constructor for the MEDWrapper MED Balls representation + /*! This feature is supported since version 3.0 */ + virtual + PBallInfo + CrBallInfo(const PMeshInfo& theMeshInfo, + const PBallInfo& theInfo); + + //! Get a MEDWrapper MED Balls representation from the MED file + /*! This feature is supported since version 3.0 */ + virtual + PBallInfo + GetPBallInfo(const PMeshInfo& theMeshInfo); + + //! Read number of MED FIELDS in the MED Mesh + virtual + TInt + GetNbFields(TErr* theErr = NULL); + + //! Read number of components for the MED FIELD by its order number + virtual + TInt + GetNbComp(TInt theFieldId, + TErr* theErr = NULL); + + //! Read MEDWrapper MED FIELD representation from the MED file by its order number + virtual + void + GetFieldInfo(TInt theFieldId, + TFieldInfo& theInfo, + TErr* theErr = NULL); + + //! Write MEDWrapper MED FIELD representation into the MED file + virtual + void + SetFieldInfo(const TFieldInfo& theInfo, + TErr* theErr = NULL); + + void + SetFieldInfo(const MED::TFieldInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED FIELD representation + virtual + PFieldInfo + CrFieldInfo(const PMeshInfo& theMeshInfo, + TInt theNbComp = 0, + ETypeChamp theType = eFLOAT64, + const std::string& theValue = "", + EBooleen theIsLocal = eVRAI, + TInt theNbRef = 1); + + //! Copy constructor for the MEDWrapper MED FIELD representation + virtual + PFieldInfo + CrFieldInfo(const PMeshInfo& theMeshInfo, + const PFieldInfo& theInfo); + + //! Get a MEDWrapper MED FIELD representation from the MED file + PFieldInfo + GetPFieldInfo(const PMeshInfo& theMeshInfo, + TInt theId, + TErr* theErr = NULL); + + //! Read number of MED GAUSS in the MED Mesh + virtual + TInt + GetNbGauss(TErr* theErr = NULL); + + //! Read brief MED GAUSS information by its order number from the MED file + virtual + TGaussInfo::TInfo + GetGaussPreInfo(TInt theId, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED GAUSS representation by its order number from the MED file + virtual + void + GetGaussInfo(TInt theId, + TGaussInfo& theInfo, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED GAUSS representation + virtual + PGaussInfo + CrGaussInfo(const TGaussInfo::TInfo& theInfo, + EModeSwitch theMode = eFULL_INTERLACE); + + //! Read number of MED TIMESTAMPS in the MED Mesh + /*! + In addition, the following information can be obtained: + - what MED ENTITY the MED TIMESTAMP is connected to; + - what geometrical types the MED TIMESTAMP is defined on. + */ + virtual + TInt + GetNbTimeStamps(const TFieldInfo& theInfo, + const TEntityInfo& theEntityInfo, + EEntiteMaillage& theEntity, + TGeom2Size& theGeom2Size, + TErr* theErr = NULL); + + //! Read MEDWrapper MED TIMESTAMP representation by its order number from the MED file + virtual + void + GetTimeStampInfo(TInt theTimeStampId, + TTimeStampInfo& theInfo, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampInfo + CrTimeStampInfo(const PFieldInfo& theFieldInfo, + EEntiteMaillage theEntity, + const TGeom2Size& theGeom2Size, + const TGeom2NbGauss& theGeom2NbGauss = TGeom2NbGauss(), + TInt theNumDt = 0, + TInt theNumOrd = 0, + TFloat theDt = 0, + const std::string& theUnitDt = "", + const TGeom2Gauss& theGeom2Gauss = TGeom2Gauss()); + + //! Copy constructor for the MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampInfo + CrTimeStampInfo(const PFieldInfo& theFieldInfo, + const PTimeStampInfo& theInfo); + + //! Get MEDWrapper MED TIMESTAMP representation from the MED file + PTimeStampInfo + GetPTimeStampInfo(const PFieldInfo& theFieldInfo, + EEntiteMaillage theEntity, + const TGeom2Size& theGeom2Size, + TInt theId, + TErr* theErr = NULL); + + //! Read number of MED PROFILES in the MED file + virtual + TInt + GetNbProfiles(TErr* theErr = NULL); + + //! Read brief MED PROFILE information by its order number from the MED file + virtual + TProfileInfo::TInfo + GetProfilePreInfo(TInt theId, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED PROFILE representation by its order number from the MED file + virtual + void + GetProfileInfo(TInt theId, + TProfileInfo& theInfo, + TErr* theErr = NULL); + + //! Write a MEDWrapper MED PROFILE representation into the MED file + virtual + void + SetProfileInfo(const TProfileInfo& theInfo, + TErr* theErr = NULL); + + void + SetProfileInfo(const TProfileInfo& theInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create a MEDWrapper MED PROFILE representation + virtual + PProfileInfo + CrProfileInfo(const TProfileInfo::TInfo& theInfo, + EModeProfil theMode = eCOMPACT); + + //! Get a MEDWrapper MED PROFILE representation from the MED file + PProfileInfo + GetPProfileInfo(TInt theId, + EModeProfil theMode = eCOMPACT, + TErr* theErr = NULL); + + //! Read the values for MEDWrapper MED TIMESTAMP from the MED file + virtual + void + GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, + const TMKey2Profile& theMKey2Profile, + const TKey2Gauss& theKey2Gauss, + TErr* theErr = NULL); + + //! Write the values for MEDWrapper MED TIMESTAMP into the MED file + virtual + void + SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, + TErr* theErr = NULL); + + void + SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create the values for MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampValueBase + CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, + ETypeChamp theTypeChamp, + const TGeom2Profile& theGeom2Profile = TGeom2Profile(), + EModeSwitch theMode = eFULL_INTERLACE); + + //! Create the values for MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampValueBase + CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, + const TGeom2Profile& theGeom2Profile = TGeom2Profile(), + EModeSwitch theMode = eFULL_INTERLACE); + + //! Copy constructor for the values for MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampValueBase + CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, + const PTimeStampValueBase& theInfo, + ETypeChamp theTypeChamp); + + //! Copy constructor for the values for MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampValueBase + CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo, + const PTimeStampValueBase& theInfo); + + //! Get the values for MEDWrapper MED TIMESTAMP from the MED file + PTimeStampValueBase + GetPTimeStampValue(const PTimeStampInfo& theTimeStampInfo, + const TMKey2Profile& theMKey2Profile, + const TKey2Gauss& theKey2Gauss, + TErr* theErr = NULL); + + // + // Backward compatibility declarations + // + + //! Read the values for MEDWrapper MED TIMESTAMP from the MED file + virtual + void + GetTimeStampVal(const PTimeStampVal& theVal, + const TMKey2Profile& theMKey2Profile, + const TKey2Gauss& theKey2Gauss, + TErr* theErr = NULL); + + //! Write the values for MEDWrapper MED TIMESTAMP into the MED file + virtual + void + SetTimeStamp(const PTimeStampVal& theVal, + TErr* theErr = NULL); + + //! Create the values for MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampVal + CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo, + const TGeom2Profile& theGeom2Profile = TGeom2Profile(), + EModeSwitch theMode = eFULL_INTERLACE); + + //! Copy constructor for the values for MEDWrapper MED TIMESTAMP representation + virtual + PTimeStampVal + CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo, + const PTimeStampVal& theInfo); + + //! Get the values for MEDWrapper MED TIMESTAMP from the MED file + PTimeStampVal + GetPTimeStampVal(const PTimeStampInfo& theTimeStampInfo, + const TMKey2Profile& theMKey2Profile, + const TKey2Gauss& theKey2Gauss, + TErr* theErr = NULL); + + //! Read a MEDWrapper MED Grille representation from the MED file + PGrilleInfo + GetPGrilleInfo(const PMeshInfo& theMeshInfo); + + //! Read a MEDWrapper MED Grille representation from the MED file + PGrilleInfo + GetPGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo); + + //! Read a MEDWrapper MED Grille representation from the MED file + virtual + void + GetGrilleInfo(TGrilleInfo& theInfo, + TErr* theErr = NULL); + + //! Write the MEDWrapper MED Grille representation into the MED file + virtual + void + SetGrilleInfo(const TGrilleInfo& theInfo, + TErr* theErr = NULL); + + void + SetGrilleInfo(const MED::TGrilleInfo& theGrilleInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + //! Create the MEDWrapper MED Grille representation + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theGrilleInfo); + + //! Create the MEDWrapper MED Grille representation + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo); + + //! Create the MEDWrapper MED Grille representation + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type); + + //! Create the MEDWrapper MED Grille representation + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const TInt& nbNodes); + + //! Create the MEDWrapper MED Grille representation + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const MED::TIntVector& nbNodeVec); + + //! Get a MEDWrapper MED Grille type + virtual + void + GetGrilleType(const TMeshInfo& theMeshInfo, + EGrilleType& type, + TErr* theErr = NULL); + + //! Get a MEDWrapper MED Grille structure + void + GetGrilleStruct(const MED::TMeshInfo& theMeshInfo, + TIntVector& theStruct, + TErr* theErr = NULL); + + protected: + PFile myFile; + }; + + //---------------------------------------------------------------------------- + typedef SharedPtr PWrapper; + + //---------------------------------------------------------------------------- + //! This class provides thread-safety for MEDWrapper interaction + class MEDWRAPPER_EXPORT TLockProxy + { + TLockProxy& operator=(const TLockProxy& ); + TWrapper* myWrapper; + + public: + TLockProxy(TWrapper* theWrapper); + ~TLockProxy(); + + TWrapper* operator->() const; + }; + + //---------------------------------------------------------------------------- + //! Specialization of SharedPtr for TWrapper + template<> + class MEDWRAPPER_EXPORT SharedPtr: public boost::shared_ptr + { + public: + SharedPtr() {} + + SharedPtr(TWrapper* p): + boost::shared_ptr(p) + {} + + template + explicit SharedPtr(Y* p): + boost::shared_ptr(p) + {} + + template + SharedPtr(const SharedPtr& r): + boost::shared_ptr(boost::dynamic_pointer_cast(r)) + {} + + template + SharedPtr& + operator=(const SharedPtr& r) + { + SharedPtr(r).swap(*this); + return *this; + } + + template + SharedPtr& + operator()(Y* p) // Y must be complete + { + return operator=(SharedPtr(p)); + } + + template + SharedPtr& + operator()(const SharedPtr& r) // Y must be complete + { + return operator=(SharedPtr(r)); + } + + TLockProxy + operator->() const // never throws + { + return TLockProxy(this->get()); + } + + protected: + operator const TWrapper&() const; + + operator TWrapper&(); + + TWrapper& + operator*() const; + + TWrapper* + get() const // never throws + { + return boost::shared_ptr::get(); + } + }; +} + +#endif // MED_Wrapper_HeaderFile diff --git a/src/MEDWrapper/MED_WrapperDef.hxx b/src/MEDWrapper/MED_WrapperDef.hxx new file mode 100755 index 000000000..473abaabb --- /dev/null +++ b/src/MEDWrapper/MED_WrapperDef.hxx @@ -0,0 +1,36 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MED_WrapperDef_HeaderFile +#define MED_WrapperDef_HeaderFile + +#ifdef WIN32 +# if defined(MEDWRAPPER_EXPORTS) || defined(MEDWrapper_EXPORTS) +# define MEDWRAPPER_EXPORT __declspec( dllexport ) +# else +# define MEDWRAPPER_EXPORT __declspec( dllimport ) +# endif // WIN32 +#else +# define MEDWRAPPER_EXPORT +#endif + +#endif // MED_WrapperDef_HeaderFile diff --git a/src/MEDWrapper/V2_2/CMakeLists.txt b/src/MEDWrapper/V2_2/CMakeLists.txt deleted file mode 100644 index e62780c87..000000000 --- a/src/MEDWrapper/V2_2/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# - -# --- options --- -# additional include directories -INCLUDE_DIRECTORIES( - ${MEDFILE_INCLUDE_DIRS} - ${HDF5_INCLUDE_DIRS} - ${Boost_INCLUDE_DIRS} - ${KERNEL_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR}/../Base -) - -# additional preprocessor / compiler flags -ADD_DEFINITIONS( - ${HDF5_DEFINITIONS} - ${BOOST_DEFINITIONS} -) - -SET(_link_LIBRARIES - ${HDF5_LIBS} - ${MEDFILE_C_LIBRARIES} - ${Boost_LIBRARIES} - MEDWrapperBase -) - -# --- headers --- - -# header files / no moc processing -SET(MEDWrapper_V2_2_HEADERS - MED_V2_2_Wrapper.hxx -) - -# --- sources --- - -# sources / static -SET(MEDWrapper_V2_2_SOURCES - MED_V2_2_Wrapper.cxx -) - -# --- rules --- - -ADD_LIBRARY(MEDWrapper_V2_2 ${MEDWrapper_V2_2_SOURCES}) -TARGET_LINK_LIBRARIES(MEDWrapper_V2_2 ${_link_LIBRARIES}) -INSTALL(TARGETS MEDWrapper_V2_2 EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS}) - -INSTALL(FILES ${MEDWrapper_V2_2_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS}) diff --git a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx b/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx deleted file mode 100644 index 934839742..000000000 --- a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx +++ /dev/null @@ -1,2882 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#include "MED_V2_2_Wrapper.hxx" -#include "MED_Algorithm.hxx" -#include "MED_Utilities.hxx" - -#include -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -// #else -// static int MYDEBUG = 0; -#endif - - - -namespace MED -{ - template<> - TInt - GetDESCLength() - { - return 200; - } - - template<> - TInt - GetIDENTLength() - { - return 8; - } - - template<> - TInt - GetNOMLength() - { - return 64; - } - - template<> - TInt - GetLNOMLength() - { - return 80; - } - - template<> - TInt - GetPNOMLength() - { - return 16; - } - - template<> - void - GetVersionRelease(TInt& majeur, TInt& mineur, TInt& release) - { - majeur=MED_MAJOR_NUM; - mineur=MED_MINOR_NUM; - release=MED_RELEASE_NUM; - } - - template<> - TInt - GetNbConn(EGeometrieElement typmai, - EEntiteMaillage typent, - TInt mdim) - { - return typmai%100; - } - - namespace V2_2 - { - - //--------------------------------------------------------------- - class TFile{ - TFile(); - TFile(const TFile&); - - public: - TFile(const std::string& theFileName): - myCount(0), - myFid(0), - myFileName(theFileName) - {} - - ~TFile() - { - Close(); - } - - void - Open(EModeAcces theMode, TErr* theErr = NULL) - { - if(myCount++ == 0){ - const char* aFileName = myFileName.c_str(); - myFid = MEDfileOpen(aFileName,med_access_mode(theMode)); - } - if(theErr) - *theErr = TErr(myFid); - else if(myFid < 0) - EXCEPTION(std::runtime_error,"TFile - MEDfileOpen('"<Open(theMode,theErr); - } - - ~TFileWrapper() - { - myFile->Close(); - } - }; - - - //--------------------------------------------------------------- - TVWrapper::TVWrapper(const std::string& theFileName): - myFile(new TFile(theFileName)) - { - TErr aRet; - myFile->Open( eLECTURE_ECRITURE, &aRet ); - // if(aRet < 0) - // myFile->Close(); - // myFile->Open( eLECTURE_AJOUT, &aRet ); - // } - if(aRet < 0) { - myFile->Close(); - myFile->Open( eLECTURE, &aRet ); - } - if(aRet < 0) { - myFile->Close(); - myFile->Open( eCREATION, &aRet ); - } - } - - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbMeshes(TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - return MEDnMesh(myFile->Id()); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetMeshInfo(TInt theMeshId, - MED::TMeshInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - TValueHolder aMeshName(theInfo.myName); - TValueHolder aDim(theInfo.myDim); - TValueHolder aSpaceDim(theInfo.mySpaceDim); - TValueHolder aType(theInfo.myType); - char dtunit[MED_SNAME_SIZE+1]; - med_sorting_type sorttype; - med_int nstep; - med_axis_type at; - int naxis=MEDmeshnAxis(myFile->Id(),theMeshId); - char *axisname=new char[naxis*MED_SNAME_SIZE+1]; - char *axisunit=new char[naxis*MED_SNAME_SIZE+1]; - TErr aRet = MEDmeshInfo(myFile->Id(), - theMeshId, - &aMeshName, - &aSpaceDim, - &aDim, - &aType, - &theInfo.myDesc[0], - dtunit, - &sorttype, - &nstep, - &at, - axisname, - axisunit); - delete [] axisname; - delete [] axisunit; - if(aRet < 0) - EXCEPTION(std::runtime_error,"GetMeshInfo - MEDmeshInfo(...)"); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetMeshInfo(const MED::TMeshInfo& theInfo, - EModeAcces theMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TMeshInfo& anInfo = const_cast(theInfo); - - TValueHolder aMeshName(anInfo.myName); - TValueHolder aDim(anInfo.myDim); - TValueHolder aSpaceDim(anInfo.mySpaceDim); - TValueHolder aType(anInfo.myType); - TValueHolder aDesc(anInfo.myDesc); - - char *nam=new char[aSpaceDim*MED_SNAME_SIZE+1]; - std::fill(nam,nam+aSpaceDim*MED_SNAME_SIZE+1,'\0'); - char *unit=new char[aSpaceDim*MED_SNAME_SIZE+1]; - std::fill(unit,unit+aSpaceDim*MED_SNAME_SIZE+1,'\0'); - TErr aRet = MEDmeshCr(myFile->Id(), - &aMeshName, - aSpaceDim, - aDim, - aType, - &aDesc, - "", - MED_SORT_DTIT, - MED_CARTESIAN, - nam, - unit); - delete [] nam; - delete [] unit; - - //if(aRet == 0) - // aRet = MEDunvCr(myFile->Id(),&aMeshName); - - INITMSG(MYDEBUG,"TVWrapper::SetMeshInfo - MED_MODE_ACCES = "<(theInfo); - TValueHolder aName(anInfo.myName); - return MEDnFamily(myFile->Id(),&aName); - } - - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbFamAttr(TInt theFamId, - const MED::TMeshInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - MED::TMeshInfo& anInfo = const_cast(theInfo); - - TValueHolder aName(anInfo.myName); - - return MEDnFamily23Attribute(myFile->Id(),&aName,theFamId); - } - - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbFamGroup(TInt theFamId, - const MED::TMeshInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - MED::TMeshInfo& anInfo = const_cast(theInfo); - - TValueHolder aName(anInfo.myName); - - return MEDnFamilyGroup(myFile->Id(),&aName,theFamId); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetFamilyInfo(TInt theFamId, - MED::TFamilyInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aFamilyName(theInfo.myName); - TValueHolder aFamilyId(theInfo.myId); - TValueHolder anAttrId(theInfo.myAttrId); - TValueHolder anAttrVal(theInfo.myAttrVal); - TValueHolder anAttrDesc(theInfo.myAttrDesc); - TValueHolder aGroupNames(theInfo.myGroupNames); - - TErr aRet = MEDfamily23Info(myFile->Id(), - &aMeshName, - theFamId, - &aFamilyName, - &anAttrId, - &anAttrVal, - &anAttrDesc, - &aFamilyId, - &aGroupNames); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetFamilyInfo - MEDfamily23Info(...) - "<< - " aMeshInfo.myName = '"<<&aMeshName<< - "'; theFamId = "< aMeshName (aMeshInfo.myName); - TValueHolder anElemNames(theInfo.myElemNames); - TValueHolder anEntity (theEntity); - TValueHolder aGeom (theGeom); - - TErr aRet = MEDmeshEntityNameRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - &anElemNames); - - theInfo.myIsElemNames = aRet != 0? eFAUX : eVRAI ; - - if(theErr) - *theErr = aRet; - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetNumeration(TElemInfo& theInfo, - TInt theNb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - if ( theGeom == eBALL ) - theGeom = GetBallGeom( theInfo.myMeshInfo ); - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder anElemNum(theInfo.myElemNum); - TValueHolder anEntity (theEntity); - TValueHolder aGeom (theGeom); - - TErr aRet = MEDmeshEntityNumberRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - &anElemNum); - - theInfo.myIsElemNum = aRet != 0? eFAUX : eVRAI; - - if(theErr) - *theErr = aRet; - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetFamilies(TElemInfo& theInfo, - TInt theNb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - if ( theGeom == eBALL ) - theGeom = GetBallGeom( theInfo.myMeshInfo ); - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aFamNum (theInfo.myFamNum); - TValueHolder anEntity (theEntity); - TValueHolder aGeom (theGeom); - - TErr aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - &aFamNum); - - if(aRet < 0) - { -// if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files - { - int aSize = (int)theInfo.myFamNum->size(); - theInfo.myFamNum->clear(); - theInfo.myFamNum->resize(aSize,0); - aRet = 0; - } -// else -// EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...) of CELLS"); - } - if(theErr) - *theErr = aRet; - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetNames(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - SetNames(theInfo,eLECTURE_ECRITURE,theEntity,theGeom,theErr); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetNames(const TElemInfo& theInfo, - EModeAcces theMode, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - if ( theGeom == eBALL ) - theGeom = GetBallGeom( theInfo.myMeshInfo ); - - MED::TElemInfo& anInfo = const_cast(theInfo); - MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; - - TErr aRet = 0; - if(theInfo.myIsElemNames) - { - TValueHolder aMeshName (aMeshInfo.myName); - TValueHolder anElemNames(anInfo.myElemNames); - TValueHolder anEntity (theEntity); - TValueHolder aGeom (theGeom); - - aRet = MEDmeshEntityNameWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - (TInt)anInfo.myElemNames->size(), - &anElemNames); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetNames - MEDmeshEntityNameWr(...)"); - } - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetNumeration(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - SetNumeration(theInfo,eLECTURE_ECRITURE,theEntity,theGeom,theErr); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetNumeration(const TElemInfo& theInfo, - EModeAcces theMode, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - if ( theGeom == eBALL ) - theGeom = GetBallGeom( theInfo.myMeshInfo ); - - MED::TElemInfo& anInfo = const_cast(theInfo); - MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; - - TErr aRet = 0; - if(theInfo.myIsElemNum) - { - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder anElemNum(anInfo.myElemNum); - TValueHolder anEntity (theEntity); - TValueHolder aGeom (theGeom); - - aRet = MEDmeshEntityNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - (TInt)anInfo.myElemNum->size(), - &anElemNum); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetNumeration - MEDmeshEntityNumberWr(...)"); - } - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetFamilies(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - SetFamilies(theInfo,eLECTURE_ECRITURE,theEntity,theGeom,theErr); - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetFamilies(const TElemInfo& theInfo, - EModeAcces theMode, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - if ( theGeom == eBALL ) - theGeom = GetBallGeom( theInfo.myMeshInfo ); - - MED::TElemInfo& anInfo = const_cast(theInfo); - MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aFamNum (anInfo.myFamNum); - TValueHolder anEntity (theEntity); - TValueHolder aGeom (theGeom); - - TErr aRet = MEDmeshEntityFamilyNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - (TInt)anInfo.myFamNum->size(), - &aFamNum); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetFamilies - MEDmeshEntityFamilyNumberWr(...)"); - } - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbNodes(const MED::TMeshInfo& theMeshInfo, - ETable theTable, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aTable(theTable); - med_bool chgt,trsf; - return MEDmeshnEntity(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE, - aTable, - MED_NO_CMODE, - &chgt, - &trsf); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetNodeInfo(MED::TNodeInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aDim(aMeshInfo.myDim); - TValueHolder aCoord(theInfo.myCoord); - TValueHolder aModeSwitch(theInfo.myModeSwitch); - TValueHolder aSystem(theInfo.mySystem); - TValueHolder aCoordNames(theInfo.myCoordNames); - TValueHolder aCoordUnits(theInfo.myCoordUnits); - TValueHolder anElemNames(theInfo.myElemNames); - //TValueHolder anIsElemNames(theInfo.myIsElemNames); - TValueHolder anElemNum(theInfo.myElemNum); - //TValueHolder anIsElemNum(theInfo.myIsElemNum); - TValueHolder aFamNum(theInfo.myFamNum); - TValueHolder aNbElem(theInfo.myNbElem); - - TErr aRet = MEDmeshNodeCoordinateRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - aModeSwitch, - &aCoord); - - TErr aRet2 =MEDmeshEntityFamilyNumberRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE , - &aFamNum); - if (aRet2 < 0) - { -// if (aRet2 == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files - { - int mySize = (int)theInfo.myFamNum->size(); - theInfo.myFamNum->clear(); - theInfo.myFamNum->resize(mySize,0); - } -// else -// EXCEPTION(std::runtime_error,"GetNodeInfo - MEDmeshEntityFamilyNumberRd(...)"); - } - - if ( MEDmeshEntityNameRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE , - &anElemNames) < 0) theInfo.myIsElemNames=eFAUX; - - if ( MEDmeshEntityNumberRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE , - &anElemNum) < 0 ) theInfo.myIsElemNum=eFAUX; - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetNodeInfo - MEDmeshNodeCoordinateRd(...)"); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetNodeInfo(const MED::TNodeInfo& theInfo, - EModeAcces theMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TNodeInfo& anInfo = const_cast(theInfo); - MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; - - TValueHolder aMeshName (aMeshInfo.myName); - TValueHolder aCoord (anInfo.myCoord); - TValueHolder aModeSwitch (anInfo.myModeSwitch); - TValueHolder aSystem (anInfo.mySystem); - TValueHolder aCoordNames (anInfo.myCoordNames); - TValueHolder aCoordUnits (anInfo.myCoordUnits); - TValueHolder anElemNames (anInfo.myElemNames); - TValueHolder anIsElemNames(anInfo.myIsElemNames); - TValueHolder anElemNum (anInfo.myElemNum); - TValueHolder anIsElemNum (anInfo.myIsElemNum); - TValueHolder aFamNum (anInfo.myFamNum); - TValueHolder aNbElem (anInfo.myNbElem); - - TErr aRet = MEDmeshNodeCoordinateWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NO_DT, - aModeSwitch, - aNbElem, - &aCoord); - - MEDmeshEntityFamilyNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE, - aNbElem, - &aFamNum); - if(anIsElemNames) - MEDmeshEntityNameWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE, - aNbElem, - &anElemNames); - if(anIsElemNum) - MEDmeshEntityNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE, - aNbElem, - &anElemNum); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetNodeInfo - MEDmeshNodeCoordinateWr(...)"); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetNodeInfo(const MED::TNodeInfo& theInfo, - TErr* theErr) - { - TErr aRet; - SetNodeInfo(theInfo,eLECTURE_ECRITURE,&aRet); - - if(aRet < 0) - SetNodeInfo(theInfo,eLECTURE_AJOUT,&aRet); - - if(theErr) - *theErr = aRet; - } - - - //----------------------------------------------------------------- - void - TVWrapper - ::GetPolygoneInfo(MED::TPolygoneInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder anIndex (theInfo.myIndex); - TValueHolder aConn (theInfo.myConn); - TValueHolder anEntity (theInfo.myEntity); - TValueHolder aGeom (theInfo.myGeom); - TValueHolder aConnMode(theInfo.myConnMode); - TInt aNbElem = (TInt)theInfo.myElemNum->size(); - - TErr aRet; - aRet = MEDmeshPolygon2Rd(myFile->Id(), &aMeshName, - MED_NO_DT, MED_NO_IT, - anEntity, aGeom, - aConnMode, &anIndex, &aConn); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshPolygonRd(...)"); - - if(theInfo.myIsElemNames){ - GetNames(theInfo,aNbElem,theInfo.myEntity,theInfo.myGeom,&aRet); - if(theErr) - *theErr = aRet; - } - - if(theInfo.myIsElemNum){ - GetNumeration(theInfo,aNbElem,theInfo.myEntity,theInfo.myGeom,&aRet); - if(theErr) - *theErr = aRet; - } - - GetFamilies(theInfo,aNbElem,theInfo.myEntity,theInfo.myGeom,&aRet); - if(theErr) - *theErr = aRet; - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetPolygoneInfo(const MED::TPolygoneInfo& theInfo, - TErr* theErr) - { - SetPolygoneInfo(theInfo,eLECTURE_ECRITURE,theErr); - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetPolygoneInfo(const MED::TPolygoneInfo& theInfo, - EModeAcces theMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TPolygoneInfo& anInfo = const_cast(theInfo); - MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder anIndex (anInfo.myIndex); - TValueHolder aConn (anInfo.myConn); - TValueHolder anEntity (anInfo.myEntity); - TValueHolder aGeom (anInfo.myGeom); - TValueHolder aConnMode(anInfo.myConnMode); - - TErr aRet = MEDmeshPolygon2Wr(myFile->Id(), &aMeshName, - MED_NO_DT, MED_NO_IT, MED_UNDEF_DT, - anEntity, aGeom, - aConnMode, anInfo.myNbElem + 1, - &anIndex, &aConn); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetPolygoneInfo - MEDmeshPolygonWr(...)"); - - SetNames(anInfo,theInfo.myEntity,anInfo.myGeom,&aRet); - if(theErr) - *theErr = aRet; - - SetNumeration(anInfo,theInfo.myEntity,anInfo.myGeom,&aRet); - if(theErr) - *theErr = aRet; - - SetFamilies(anInfo,theInfo.myEntity,anInfo.myGeom,&aRet); - if(theErr) - *theErr = aRet; - } - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbPolygones(const MED::TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode, - TErr* theErr) - { - return GetNbCells(theMeshInfo,theEntity,theGeom,theConnMode,theErr); - } - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetPolygoneConnSize(const MED::TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return 0; - - MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); - - TValueHolder aMeshName(aMeshInfo.myName); - med_int aTaille = 0; - med_bool chgt,trsf; - aTaille=MEDmeshnEntity(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - med_entity_type(theEntity), - med_geometry_type(theGeom), - MED_CONNECTIVITY, - med_connectivity_mode(theConnMode), - &chgt, - &trsf); - - - if(aTaille < 0) - EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshnEntity(...)"); - - return TInt(aTaille); - } - - //----------------------------------------------------------------- - void - TVWrapper - ::GetPolyedreInfo(TPolyedreInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TInt aNbElem = (TInt)theInfo.myElemNum->size(); - TValueHolder anIndex(theInfo.myIndex); - TValueHolder aFaces(theInfo.myFaces); - TValueHolder aConn(theInfo.myConn); - TValueHolder aConnMode(theInfo.myConnMode); - - TErr aRet; - aRet = MEDmeshPolyhedronRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_CELL, - aConnMode, - &anIndex, - &aFaces, - &aConn); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshPolyhedronRd(...)"); - - if(theInfo.myIsElemNames){ - GetNames(theInfo,aNbElem,theInfo.myEntity,ePOLYEDRE,&aRet); - if(theErr) - *theErr = aRet; - } - - if(theInfo.myIsElemNum){ - GetNumeration(theInfo,aNbElem,theInfo.myEntity,ePOLYEDRE,&aRet); - if(theErr) - *theErr = aRet; - } - - GetFamilies(theInfo,aNbElem,theInfo.myEntity,ePOLYEDRE,&aRet); - if(theErr) - *theErr = aRet; - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetPolyedreInfo(const TPolyedreInfo& theInfo, - TErr* theErr) - { - SetPolyedreInfo(theInfo,eLECTURE_ECRITURE,theErr); - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetPolyedreInfo(const MED::TPolyedreInfo& theInfo, - EModeAcces theMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TPolyedreInfo& anInfo = const_cast(theInfo); - MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder anIndex(anInfo.myIndex); - TValueHolder aFaces(anInfo.myFaces); - TValueHolder aConn(anInfo.myConn); - TValueHolder aConnMode(anInfo.myConnMode); - - TErr aRet; - aRet = MEDmeshPolyhedronWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_UNDEF_DT, - MED_CELL, - aConnMode, - anInfo.myNbElem+1, - &anIndex, - (TInt)anInfo.myFaces->size(), - &aFaces, - &aConn); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshPolyhedronWr(...)"); - - TValueHolder anEntity(anInfo.myEntity); - - if(theInfo.myIsElemNames){ - TValueHolder anElemNames(anInfo.myElemNames); - aRet = MEDmeshEntityNameWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - MED_POLYHEDRON, - (TInt)anInfo.myElemNames->size(), - &anElemNames); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshEntityNameWr(...)"); - } - - if(theInfo.myIsElemNum){ - TValueHolder anElemNum(anInfo.myElemNum); - aRet = MEDmeshEntityNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - MED_POLYHEDRON, - (TInt)anInfo.myElemNum->size(), - &anElemNum); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshEntityNumberWr(...)"); - } - - - TValueHolder aFamNum(anInfo.myFamNum); - aRet = MEDmeshEntityFamilyNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - MED_POLYHEDRON, - (TInt)anInfo.myFamNum->size(), - &aFamNum); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshEntityFamilyNumberWr(...)"); - } - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbPolyedres(const MED::TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode, - TErr* theErr) - { - return GetNbCells(theMeshInfo,theEntity,theGeom,theConnMode,theErr); - } - - //---------------------------------------------------------------------------- - void - TVWrapper ::GetPolyedreConnSize(const TMeshInfo& theMeshInfo, - TInt& theNbFaces, - TInt& theConnSize, - EConnectivite theConnMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - EXCEPTION(std::runtime_error,"GetPolyedreConnSize - (...)"); - - MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aConnMode(theConnMode); - //TValueHolder aNbFaces(theNbFaces); - //TValueHolder aConnSize(theConnSize); - - med_bool chgt,trsf; - theNbFaces = MEDmeshnEntity(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_CELL, - MED_POLYHEDRON, - MED_INDEX_NODE, - aConnMode, - &chgt, - &trsf); - - theConnSize = MEDmeshnEntity(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_CELL, - MED_POLYHEDRON, - MED_CONNECTIVITY, - aConnMode, - &chgt, - &trsf); - - if(theNbFaces < 0 || theConnSize<0) - EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshnEntity(...)"); - - } - - //----------------------------------------------------------------- - TEntityInfo - TVWrapper - ::GetEntityInfo(const MED::TMeshInfo& theMeshInfo, - EConnectivite theConnMode, - TErr* theErr) - { - TEntityInfo anInfo; - - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return anInfo; - - if(theMeshInfo.GetType() == eNON_STRUCTURE) { - TInt aNbElem = GetNbNodes(theMeshInfo); - if(aNbElem > 0){ - anInfo[eNOEUD][ePOINT1] = aNbElem; - const TEntity2GeomSet& anEntity2GeomSet = GetEntity2GeomSet(); - TEntity2GeomSet::const_iterator anIter = anEntity2GeomSet.begin(); - TEntity2GeomSet::const_iterator anIterEnd = anEntity2GeomSet.end(); - for(; anIter != anIterEnd; anIter++){ - const EEntiteMaillage& anEntity = anIter->first; - const TGeomSet& aGeomSet = anIter->second; - TGeomSet::const_iterator anIter2 = aGeomSet.begin(); - TGeomSet::const_iterator anIterEnd2 = aGeomSet.end(); - for(; anIter2 != anIterEnd2; anIter2++){ - const EGeometrieElement& aGeom = *anIter2; - aNbElem = GetNbCells(theMeshInfo,anEntity,aGeom,theConnMode,theErr); - if(aNbElem > 0) { - if ( anEntity == eSTRUCT_ELEMENT ) { - const TInt nbStructTypes = aNbElem; - for ( TInt structType = 0; structType < nbStructTypes; ++structType ) { - // check type name to keep only "MED_BALL" structured element - TValueHolder aMeshName((TString&) theMeshInfo.myName ); - char geotypename[ MED_NAME_SIZE + 1] = ""; - med_geometry_type geotype; - MEDmeshEntityInfo( myFile->Id(), &aMeshName, MED_NO_DT, MED_NO_IT, - med_entity_type(anEntity), structType+1, - geotypename, &geotype); - if ( strcmp( geotypename, MED_BALL_NAME ) == 0 ) { - aNbElem = GetNbCells( theMeshInfo, anEntity, EGeometrieElement(geotype), - theConnMode, theErr); - if ( aNbElem > 0 ) - anInfo[anEntity][EGeometrieElement(geotype)] = aNbElem; - } - } - } - else { - anInfo[anEntity][aGeom] = aNbElem; - } - } - } - } - } - } else { // eSTRUCTURE - EGrilleType aGrilleType; - TInt aNbNodes = 1; - TInt aNbElem = 1; - TInt aNbSub = 0; - TInt aDim = theMeshInfo.GetDim(); - EGeometrieElement aGeom, aSubGeom; - EEntiteMaillage aSubEntity = eMAILLE; - - GetGrilleType(theMeshInfo, aGrilleType); - - TIntVector aStruct(aDim); - if(aGrilleType == eGRILLE_STANDARD) - { - GetGrilleStruct(theMeshInfo, aStruct, theErr); - } - else - { // eGRILLE_CARTESIENNE and eGRILLE_POLAIRE - ETable aTable[3] = { eCOOR_IND1, eCOOR_IND2, eCOOR_IND3 }; - for(med_int anAxis = 0; anAxis < aDim; anAxis++) - aStruct[ anAxis ] = GetNbNodes(theMeshInfo, aTable[anAxis]); - } - for(med_int i = 0; i < aDim; i++){ - aNbNodes = aNbNodes * aStruct[i]; - aNbElem = aNbElem * (aStruct[i] - 1); - } - switch(aDim){ - case 1: - aGeom = eSEG2; - break; - case 2: - aGeom = eQUAD4; - aSubGeom = eSEG2; - aSubEntity = eARETE; - aNbSub = - (aStruct[0] ) * (aStruct[1]-1) + - (aStruct[0]-1) * (aStruct[1] ); - break; - case 3: - aGeom = eHEXA8; - aSubGeom = eQUAD4; - aSubEntity = eFACE; - aNbSub = - (aStruct[0] ) * (aStruct[1]-1) * (aStruct[2]-1) + - (aStruct[0]-1) * (aStruct[1] ) * (aStruct[2]-1) + - (aStruct[0]-1) * (aStruct[1]-1) * (aStruct[2] ); - break; - } - anInfo[eNOEUD][ePOINT1] = aNbNodes; - anInfo[eMAILLE][aGeom] = aNbElem; - if ( aDim > 1 ) - anInfo[aSubEntity][aSubGeom] = aNbSub; - } - return anInfo; - } - - - //----------------------------------------------------------------- - TInt TVWrapper::GetNbCells(const MED::TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); - TValueHolder aMeshName(aMeshInfo.myName); - med_bool chgt,trsf; - switch ( theGeom ) - { - case MED::ePOLYGONE: - case MED::ePOLYGON2: - { - return MEDmeshnEntity(myFile->Id(),&aMeshName, - MED_NO_DT,MED_NO_IT, - med_entity_type(theEntity),med_geometry_type(theGeom), - MED_INDEX_NODE,med_connectivity_mode(theConnMode), - &chgt,&trsf)-1; - } - case MED::ePOLYEDRE: - { - return MEDmeshnEntity(myFile->Id(),&aMeshName, - MED_NO_DT,MED_NO_IT, - med_entity_type(theEntity),MED_POLYHEDRON, - MED_INDEX_FACE,med_connectivity_mode(theConnMode), - &chgt,&trsf)-1; - } - case MED::eBALL: - { - return GetNbBalls( theMeshInfo ); - } - default: - { - return MEDmeshnEntity(myFile->Id(),&aMeshName, - MED_NO_DT,MED_NO_IT, - med_entity_type(theEntity),med_geometry_type(theGeom), - MED_CONNECTIVITY,med_connectivity_mode(theConnMode), - &chgt,&trsf); - } - } - return 0; - } - - - //---------------------------------------------------------------------------- - void TVWrapper::GetCellInfo(MED::TCellInfo& theInfo, TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - - TValueHolder aMeshName (aMeshInfo.myName); - TValueHolder aConn (theInfo.myConn); - TValueHolder aModeSwitch (theInfo.myModeSwitch); - TValueHolder anElemNames (theInfo.myElemNames); - TValueHolder anIsElemNames(theInfo.myIsElemNames); - TValueHolder anElemNum (theInfo.myElemNum); - TValueHolder anIsElemNum (theInfo.myIsElemNum); - TValueHolder aFamNum (theInfo.myFamNum); - TValueHolder anIsFamNum (theInfo.myIsFamNum); - TValueHolder anEntity (theInfo.myEntity); - TValueHolder aGeom (theInfo.myGeom); - TValueHolder aConnMode (theInfo.myConnMode); - - TErr aRet; - aRet = MEDmeshElementRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - aConnMode, - aModeSwitch, - &aConn, - &anIsElemNames, - &anElemNames, - &anIsElemNum, - &anElemNum, - &anIsFamNum, - &aFamNum); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetCellInfo - MEDmeshElementRd(...)"); - - if (anIsFamNum == MED_FALSE) - { - int mySize = (int) theInfo.myFamNum->size(); - theInfo.myFamNum->clear(); - theInfo.myFamNum->resize(mySize, 0); - } - - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetCellInfo(const MED::TCellInfo& theInfo, - EModeAcces theMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TCellInfo& anInfo = const_cast(theInfo); - MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; - - TValueHolder aMeshName (aMeshInfo.myName); - TValueHolder aConn (anInfo.myConn); - TValueHolder aModeSwitch (anInfo.myModeSwitch); - TValueHolder anElemNames (anInfo.myElemNames); - TValueHolder anIsElemNames(anInfo.myIsElemNames); - TValueHolder anElemNum (anInfo.myElemNum); - TValueHolder anIsElemNum (anInfo.myIsElemNum); - TValueHolder aFamNum (anInfo.myFamNum); - TValueHolder anIsFamNum (anInfo.myIsFamNum); - TValueHolder anEntity (anInfo.myEntity); - TValueHolder aGeom (anInfo.myGeom); - TValueHolder aConnMode (anInfo.myConnMode); - TValueHolder aNbElem (anInfo.myNbElem); - - TErr aRet; - aRet = MEDmeshElementConnectivityWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_UNDEF_DT, - anEntity, - aGeom, - aConnMode, - aModeSwitch, - aNbElem, - &aConn); - - MEDmeshEntityFamilyNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - aNbElem, - &aFamNum); - if(anIsElemNames) - MEDmeshEntityNameWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - aNbElem, - &anElemNames); - if(anIsElemNum) - MEDmeshEntityNumberWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - anEntity, - aGeom, - aNbElem, - &anElemNum); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetCellInfo - MEDmeshElementWr(...)"); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetCellInfo(const MED::TCellInfo& theInfo, - TErr* theErr) - { - SetCellInfo(theInfo,eLECTURE_ECRITURE,theErr); - } - - //---------------------------------------------------------------------------- - //! Read geom type of MED_BALL structural element - EGeometrieElement TVWrapper::GetBallGeom(const TMeshInfo& theMeshInfo) - { - TFileWrapper aFileWrapper(myFile,eLECTURE); - - // read med_geometry_type of "MED_BALL" element - char geotypename[ MED_NAME_SIZE + 1] = MED_BALL_NAME; - return EGeometrieElement( MEDstructElementGeotype( myFile->Id(), geotypename ) ); - } - - //---------------------------------------------------------------------------- - //! Read number of balls in the Mesh - TInt TVWrapper::GetNbBalls(const TMeshInfo& theMeshInfo) - { - TFileWrapper aFileWrapper(myFile,eLECTURE); - - EGeometrieElement ballType = GetBallGeom( theMeshInfo ); - if ( ballType < 0 ) - return 0; - - return GetNbCells( theMeshInfo, eSTRUCT_ELEMENT, ballType, eNOD ); - } - - //---------------------------------------------------------------------------- - //! Read a MEDWrapped representation of MED_BALL from the MED file - void TVWrapper::GetBallInfo(TBallInfo& theInfo, TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - // check geometry of MED_BALL - if ( theInfo.myGeom == eBALL ) - { - theInfo.myGeom = GetBallGeom( *theInfo.myMeshInfo ); - if ( theInfo.myGeom < 0 ) { - if ( !theErr ) - EXCEPTION(std::runtime_error,"GetBallInfo - no balls in the mesh"); - *theErr = theInfo.myGeom; - return; - } - } - - // read nodes ids - GetCellInfo( theInfo ); - - // read diameters - TValueHolder aMeshName (theInfo.myMeshInfo->myName); - TValueHolder aGeom (theInfo.myGeom); - TValueHolder aDiam (theInfo.myDiameters); - char varattname[ MED_NAME_SIZE + 1] = MED_BALL_DIAMETER; - - TErr aRet = MEDmeshStructElementVarAttRd( myFile->Id(), &aMeshName, - MED_NO_DT, MED_NO_IT, - aGeom, - varattname, - &aDiam); - if ( theErr ) - *theErr = aRet; - else if ( aRet < 0 ) - EXCEPTION(std::runtime_error,"GetBallInfo - pb at reading diameters"); - } - - - //---------------------------------------------------------------------------- - //! Write a MEDWrapped representation of MED_BALL to the MED file - void TVWrapper::SetBallInfo(const TBallInfo& theInfo, EModeAcces theMode, TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - TErr ret; - char ballsupportname[MED_NAME_SIZE+1]="BALL_SUPPORT_MESH"; - EGeometrieElement ballGeom = GetBallGeom( *theInfo.myMeshInfo ); - if ( ballGeom < 0 ) - { - // no ball model in the file, create support mesh for it - char dummyname [MED_NAME_SIZE*3+1]=""; - if (( ret = MEDsupportMeshCr( myFile->Id(), - ballsupportname, - theInfo.myMeshInfo->GetSpaceDim(), - theInfo.myMeshInfo->GetDim(), - "Support mesh for a ball model", - MED_CARTESIAN, - /*axisname=*/dummyname, /*unitname=*/dummyname)) < 0) { - if ( !theErr ) - EXCEPTION(std::runtime_error,"SetBallInfo - MEDsupportMeshCr"); - *theErr = ret; - return; - } - // write coordinates of 1 node - med_float coord[3] = {0,0,0}; - if ((ret = MEDmeshNodeCoordinateWr(myFile->Id(), - ballsupportname, MED_NO_DT, MED_NO_IT, 0.0, - MED_FULL_INTERLACE, /*nnode=*/1, coord)) < 0) { - if ( !theErr ) - EXCEPTION(std::runtime_error,"SetBallInfo - MEDmeshNodeCoordinateWr"); - *theErr = ret; - return; - } - // ball model creation - char geotypename[ MED_NAME_SIZE + 1] = MED_BALL_NAME; - if (( ballGeom = (EGeometrieElement) MEDstructElementCr(myFile->Id(), - geotypename, - theInfo.myMeshInfo->GetSpaceDim(), - ballsupportname, - MED_NODE,MED_NONE)) < 0 ) { - if ( !theErr ) - EXCEPTION(std::runtime_error,"SetBallInfo - MEDstructElementCr"); - *theErr = ret; - return; - } - // create diameter attribute - if (( ret = MEDstructElementVarAttCr(myFile->Id(), - geotypename, MED_BALL_DIAMETER, - MED_ATT_FLOAT64, /*ncomp=*/1)) < 0) { - if ( !theErr ) - EXCEPTION(std::runtime_error,"SetBallInfo - MEDstructElementVarAttCr"); - *theErr = ret; - return; - } - } // ballGeom < 0 - - TBallInfo& aBallInfo = ((TBallInfo&) theInfo ); - aBallInfo.myGeom = ballGeom; - - // write node ids - SetCellInfo(theInfo,theMode,theErr); - if ( theErr && theErr < 0 ) - return; - - // write diameter - TValueHolder aMeshName (aBallInfo.myMeshInfo->myName); - TValueHolder aGeom (aBallInfo.myGeom); - TValueHolder aDiam (aBallInfo.myDiameters); - ret = MEDmeshStructElementVarAttWr(myFile->Id(), &aMeshName, - MED_NO_DT, MED_NO_IT, - aGeom, MED_BALL_DIAMETER, - theInfo.myNbElem, &aDiam); - if ( theErr ) - *theErr = ret; - else if ( ret < 0 ) - EXCEPTION(std::runtime_error,"SetBallInfo - MEDmeshStructElementVarAttWr"); - } - - //---------------------------------------------------------------------------- - //! Write a MEDWrapped representation of MED_BALL to the MED file - void TVWrapper::SetBallInfo(const TBallInfo& theInfo, TErr* theErr) - { - SetBallInfo( theInfo, eLECTURE_ECRITURE, theErr ); - } - - //----------------------------------------------------------------- - TInt - TVWrapper - ::GetNbFields(TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - return MEDnField(myFile->Id()); - } - - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbComp(TInt theFieldId, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - return MEDfieldnComponent(myFile->Id(),theFieldId); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetFieldInfo(TInt theFieldId, - MED::TFieldInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - TString aFieldName(256); // Protect from memory problems with too long names - TValueHolder aType(theInfo.myType); - TValueHolder aCompNames(theInfo.myCompNames); - TValueHolder anUnitNames(theInfo.myUnitNames); - MED::TMeshInfo& aMeshInfo = theInfo.myMeshInfo; - - TErr aRet; - med_bool local; - char dtunit[MED_SNAME_SIZE+1]; - char local_mesh_name[MED_NAME_SIZE+1]=""; - med_int nbofstp; - theInfo.myNbComp = MEDfieldnComponent(myFile->Id(),theFieldId); - aRet = MEDfieldInfo(myFile->Id(), - theFieldId, - &aFieldName[0], - local_mesh_name, - &local, - &aType, - &aCompNames, - &anUnitNames, - dtunit, - &nbofstp); - - if(strcmp(&aMeshInfo.myName[0],local_mesh_name) != 0 ) { - if(theErr) - *theErr = -1; - return; - } - - theInfo.SetName(aFieldName); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetFieldInfo - MEDfieldInfo(...)"); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetFieldInfo(const MED::TFieldInfo& theInfo, - EModeAcces theMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TFieldInfo& anInfo = const_cast(theInfo); - - TValueHolder aFieldName(anInfo.myName); - TValueHolder aType(anInfo.myType); - TValueHolder aCompNames(anInfo.myCompNames); - TValueHolder anUnitNames(anInfo.myUnitNames); - MED::TMeshInfo& aMeshInfo = anInfo.myMeshInfo; - TErr aRet; - char dtunit[MED_SNAME_SIZE+1]; - std::fill(dtunit,dtunit+MED_SNAME_SIZE+1,'\0'); - aRet = MEDfieldCr(myFile->Id(), - &aFieldName, - aType, - anInfo.myNbComp, - &aCompNames, - &anUnitNames, - dtunit, - &aMeshInfo.myName[0]); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetFieldInfo - MEDfieldCr(...)"); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::SetFieldInfo(const MED::TFieldInfo& theInfo, - TErr* theErr) - { - TErr aRet; - SetFieldInfo(theInfo,eLECTURE_ECRITURE,&aRet); - - if(aRet < 0) - SetFieldInfo(theInfo,eLECTURE_AJOUT,&aRet); - - if(theErr) - *theErr = aRet; - } - - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbGauss(TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - return MEDnLocalization(myFile->Id()); - } - - - //---------------------------------------------------------------------------- - TGaussInfo::TInfo - TVWrapper - ::GetGaussPreInfo(TInt theId, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return TGaussInfo::TInfo( TGaussInfo::TKey(ePOINT1,""),0 ); - - med_int aNbGaussPoints = med_int(); - TVector aName(GetNOMLength()+1); - med_geometry_type aGeom = MED_NONE; - - TErr aRet; - med_int dim; - char geointerpname[MED_NAME_SIZE+1]=""; - char ipointstructmeshname[MED_NAME_SIZE+1]=""; - med_int nsectionmeshcell; - med_geometry_type sectiongeotype; - aRet = MEDlocalizationInfo (myFile->Id(), - theId, - &aName[0], - &aGeom, - &dim, - &aNbGaussPoints, - geointerpname, - ipointstructmeshname, - &nsectionmeshcell, - §iongeotype); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetGaussPreInfo - MEDlocalizationInfo(...)"); - return TGaussInfo::TInfo(TGaussInfo::TKey(EGeometrieElement(aGeom),&aName[0]), - TInt(aNbGaussPoints)); - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetGaussInfo(TInt theId, - TGaussInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - TValueHolder aRefCoord(theInfo.myRefCoord); - TValueHolder aGaussCoord(theInfo.myGaussCoord); - TValueHolder aWeight(theInfo.myWeight); - TValueHolder aModeSwitch(theInfo.myModeSwitch); - TValueHolder aGaussName(theInfo.myName); - - TErr aRet; - aRet = MEDlocalizationRd(myFile->Id(), - &aGaussName, - aModeSwitch, - &aRefCoord, - &aGaussCoord, - &aWeight); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetGaussInfo - MEDlocalizationRd(...)"); - } - - - //---------------------------------------------------------------------------- - TInt - TVWrapper - ::GetNbProfiles(TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return -1; - - return MEDnProfile(myFile->Id()); - } - - TProfileInfo::TInfo - TVWrapper - ::GetProfilePreInfo(TInt theId, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return TProfileInfo::TInfo(); - - med_int aSize = -1; - TVector aName(GetNOMLength()+1); - - TErr aRet; - aRet = MEDprofileInfo(myFile->Id(), - theId, - &aName[0], - &aSize); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetProfilePreInfo - MEDprofileInfo(...)"); - - return TProfileInfo::TInfo(&aName[0],aSize); - } - - void - TVWrapper - ::GetProfileInfo(TInt theId, - TProfileInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - TProfileInfo& anInfo = const_cast(theInfo); - TValueHolder anElemNum(anInfo.myElemNum); - TValueHolder aProfileName(anInfo.myName); - - TErr aRet; - aRet = MEDprofileRd(myFile->Id(), - &aProfileName, - &anElemNum); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetProfileInfo - MEDprofileRd(...)"); - } - - void - TVWrapper - ::SetProfileInfo(const TProfileInfo& theInfo, - EModeAcces theMode, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,theMode,theErr); - - if(theErr && *theErr < 0) - return; - - TProfileInfo& anInfo = const_cast(theInfo); - TValueHolder anElemNum(anInfo.myElemNum); - TValueHolder aProfileName(anInfo.myName); - - TErr aRet; - aRet = MEDprofileWr(myFile->Id(), // descripteur du fichier. - &aProfileName, // tableau de valeurs du profil. - theInfo.GetSize(), // taille du profil. - &anElemNum); // nom profil. - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"SetProfileInfo - MEDprofileWr(...)"); - } - - void - TVWrapper - ::SetProfileInfo(const TProfileInfo& theInfo, - TErr* theErr) - { - TErr aRet; - SetProfileInfo(theInfo,eLECTURE_ECRITURE,&aRet); - - if(aRet < 0) - SetProfileInfo(theInfo,eLECTURE_AJOUT,&aRet); - - if(aRet < 0) - SetProfileInfo(theInfo,eCREATION,&aRet); - - if(theErr) - *theErr = aRet; - } - - //----------------------------------------------------------------- - TInt - TVWrapper - ::GetNbTimeStamps(const MED::TFieldInfo& theInfo, - const MED::TEntityInfo& theEntityInfo, - EEntiteMaillage& theEntity, - TGeom2Size& theGeom2Size, - TErr* theErr) - { - theEntity = EEntiteMaillage(-1); - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr){ - if(theEntityInfo.empty()) - *theErr = -1; - if(*theErr < 0) - return -1; - }else if(theEntityInfo.empty()) - EXCEPTION(std::runtime_error,"GetNbTimeStamps - There is no any Entity on the Mesh"); - - bool anIsPerformAdditionalCheck = GetNbMeshes() > 1; - - theGeom2Size.clear(); - TInt aNbTimeStamps = 0; - TIdt anId = myFile->Id(); - - MED::TFieldInfo& anInfo = const_cast(theInfo); - TValueHolder aFieldName(anInfo.myName); - MED::TMeshInfo& aMeshInfo = anInfo.myMeshInfo; - - // workaround for IPAL13676 - MED::TEntityInfo localEntityInfo = theEntityInfo; - TEntityInfo::iterator anLocalIter = localEntityInfo.find(eMAILLE); - if(anLocalIter != localEntityInfo.end()){ - localEntityInfo[eNOEUD_ELEMENT] = anLocalIter->second; - } - - TEntityInfo::const_iterator anIter = localEntityInfo.begin(); - for(; anIter != localEntityInfo.end(); anIter++){ - med_entity_type anEntity = med_entity_type(anIter->first); - const TGeom2Size& aGeom2Size = anIter->second; - TGeom2Size::const_iterator anGeomIter = aGeom2Size.begin(); - for(; anGeomIter != aGeom2Size.end(); anGeomIter++){ - med_geometry_type aGeom = med_geometry_type(anGeomIter->first); - char aMeshName[MED_NAME_SIZE+1]; - med_bool islocal; - med_field_type ft; - char dtunit[MED_SNAME_SIZE+1]; - med_int myNbComp = MEDfieldnComponentByName(anId,&aFieldName); - char *cname=new char[myNbComp*MED_SNAME_SIZE+1]; - char *unitname=new char[myNbComp*MED_SNAME_SIZE+1]; - TInt aNbStamps; - MEDfieldInfoByName(anId, - &aFieldName, - aMeshName, - &islocal, - &ft, - cname, - unitname, - dtunit, - &aNbStamps); - delete [] cname; - delete [] unitname; - med_int nval = 0; - med_int aNumDt; - med_int aNumOrd; - med_float aDt; - if (aNbStamps > 0) - { - MEDfieldComputingStepInfo(anId, - &aFieldName, - 1, - &aNumDt, - &aNumOrd, - &aDt); - char profilename[MED_NAME_SIZE+1]; - char locname[MED_NAME_SIZE+1]; - med_int profilsize; - med_int aNbGauss; - - // protection from crash (division by zero) - // inside MEDfieldnValueWithProfile function - // caused by the workaround for IPAL13676 (see above) - if( anEntity == MED_NODE_ELEMENT && aGeom % 100 == 0 ) - continue; - - nval = MEDfieldnValueWithProfile(anId, - &aFieldName, - aNumDt, - aNumOrd, - anEntity, - med_geometry_type(aGeom), - 1, - MED_COMPACT_STMODE, - profilename, - &profilsize, - locname, - &aNbGauss); - } - bool anIsSatisfied =(nval > 0); - if(anIsSatisfied){ - INITMSG(MYDEBUG, - "GetNbTimeStamps aNbTimeStamps = "<second; - theEntity = EEntiteMaillage(anEntity); - aNbTimeStamps = aNbStamps; - } - } - if(!theGeom2Size.empty()) - break; - } - return aNbTimeStamps; - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetTimeStampInfo(TInt theTimeStampId, - MED::TTimeStampInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - const TGeom2Size& aGeom2Size = theInfo.myGeom2Size; - - if(theErr){ - if(aGeom2Size.empty()) - *theErr = -1; - if(*theErr < 0) - return; - }else if(aGeom2Size.empty()) - EXCEPTION(std::runtime_error,"GetTimeStampInfo - There is no any cell"); - - MED::TFieldInfo& aFieldInfo = *theInfo.myFieldInfo; - MED::TMeshInfo& aMeshInfo = *aFieldInfo.myMeshInfo; - - TValueHolder aFieldName(aFieldInfo.myName); - TValueHolder anEntity(theInfo.myEntity); - TValueHolder aNumDt(theInfo.myNumDt); - TValueHolder aNumOrd(theInfo.myNumOrd); - TValueHolder anUnitDt(theInfo.myUnitDt); - TValueHolder aDt(theInfo.myDt); - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder anIsLocal(aFieldInfo.myIsLocal); - TValueHolder aNbRef(aFieldInfo.myNbRef); - - TGeom2NbGauss& aGeom2NbGauss = theInfo.myGeom2NbGauss; - - // just to get a time stamp unit (anUnitDt) - med_field_type aFieldType; - med_int aNbComp = MEDfieldnComponentByName(myFile->Id(), &aFieldName); - char *aCompName = new char[aNbComp*MED_SNAME_SIZE+1]; - char *aCompUnit = new char[aNbComp*MED_SNAME_SIZE+1]; - TInt aNbStamps; - MEDfieldInfoByName(myFile->Id(), - &aFieldName, - &aMeshName, - &anIsLocal, - &aFieldType, - aCompName, - aCompUnit, - &anUnitDt, - &aNbStamps); - delete [] aCompName; - delete [] aCompUnit; - - TGeom2Size::const_iterator anIter = aGeom2Size.begin(); - for(; anIter != aGeom2Size.end(); anIter++){ - const EGeometrieElement& aGeom = anIter->first; - med_int aNbGauss = -1; - - TErr aRet; - aRet = MEDfieldComputingStepInfo(myFile->Id(), - &aFieldName, - theTimeStampId, - &aNumDt, - &aNumOrd, - &aDt); - char profilename[MED_NAME_SIZE+1]; - med_int profilsize; - char locname[MED_NAME_SIZE+1]; - MEDfieldnValueWithProfile(myFile->Id(), - &aFieldName, - aNumDt, - aNumOrd, - anEntity, - med_geometry_type(aGeom), - 1, - MED_COMPACT_STMODE, - profilename, - &profilsize, - locname, - &aNbGauss); - - static TInt MAX_NB_GAUSS_POINTS = 32; - if(aNbGauss <= 0 || aNbGauss > MAX_NB_GAUSS_POINTS) - aNbGauss = 1; - - aGeom2NbGauss[aGeom] = aNbGauss; - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetTimeStampInfo - MEDfieldnValueWithProfile(...)"); - } - } - - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - TIdt anId = myFile->Id(); - - TValueHolder aModeSwitch(theTimeStampValue->myModeSwitch); - MED::TGeom2Profile& aGeom2Profile = theTimeStampValue->myGeom2Profile; - - MED::PTimeStampInfo aTimeStampInfo = theTimeStampValue->myTimeStampInfo; - TValueHolder anEntity(aTimeStampInfo->myEntity); - TValueHolder aNumDt(aTimeStampInfo->myNumDt); - TValueHolder aNumOrd(aTimeStampInfo->myNumOrd); - - MED::PFieldInfo aFieldInfo = aTimeStampInfo->myFieldInfo; - TValueHolder aFieldName(aFieldInfo->myName); - TValueHolder anIsLocal(aFieldInfo->myIsLocal); - - MED::PMeshInfo aMeshInfo = aFieldInfo->myMeshInfo; - TValueHolder aMeshName(aMeshInfo->myName); - - TGeom2Gauss& aGeom2Gauss = aTimeStampInfo->myGeom2Gauss; - TVector aGaussName(GetNOMLength()+1); - - med_storage_mode aProfileMode = med_storage_mode(boost::get<0>(theMKey2Profile)); - MED::TKey2Profile aKey2Profile = boost::get<1>(theMKey2Profile); - TVector aProfileName(GetNOMLength()+1); - - TGeom2Size& aGeom2Size = aTimeStampInfo->myGeom2Size; - TGeom2Size::iterator anIter = aGeom2Size.begin(); - for(; anIter != aGeom2Size.end(); anIter++){ - EGeometrieElement aGeom = anIter->first; - TInt aNbElem = anIter->second; - med_int profilesize,aNbGauss; - - TInt aNbVal = MEDfieldnValueWithProfile(anId, - &aFieldName, - aNumDt, - aNumOrd, - anEntity, - med_geometry_type(aGeom), - 1, - aProfileMode, - &aProfileName[0], - &profilesize, - &aGaussName[0], - &aNbGauss); - - if(aNbVal <= 0){ - if(theErr){ - *theErr = -1; - return; - } - EXCEPTION(std::runtime_error,"GetTimeStampValue - MEDfieldnValueWithProfile(...) - aNbVal == "<myNbComp; - TInt aNbValue = aNbVal;// / aNbGauss; rules in MED changed - theTimeStampValue->AllocateValue(aGeom, - aNbValue, - aNbGauss, - aNbComp); - TInt aValueSize = theTimeStampValue->GetValueSize(aGeom); - - INITMSG(MYDEBUG, - "TVWrapper::GetTimeStampValue - aGeom = "<second; - aGeom2Gauss[aGeom] = aGaussInfo; - } - } - - MED::PProfileInfo aProfileInfo; - if(strcmp(&aProfileName[0],MED_NO_PROFILE) != 0){ - MED::TKey2Profile::const_iterator anIter = aKey2Profile.find(&aProfileName[0]); - if(anIter != aKey2Profile.end()){ - aProfileInfo = anIter->second; - aGeom2Profile[aGeom] = aProfileInfo; - } - } - - if(aGaussInfo && aNbGauss != aGaussInfo->GetNbGauss()){ - if(theErr){ - *theErr = MED_FALSE; - return; - } - EXCEPTION(std::runtime_error,"GetTimeStampValue - aNbGauss != aGaussInfo->GetNbGauss()"); - } - - if(aProfileInfo && aProfileInfo->IsPresent()){ - TInt aNbSubElem = aProfileInfo->GetSize(); - TInt aProfileSize = aNbSubElem*aNbComp*aNbGauss; - if(aProfileSize != aValueSize){ - if(theErr){ - *theErr = -1; - return; - } - EXCEPTION(std::runtime_error, - "GetTimeStampValue - aProfileSize("<Id(); - - TValueHolder aModeSwitch(theTimeStampValue->myModeSwitch); - MED::TGeom2Profile& aGeom2Profile = theTimeStampValue->myGeom2Profile; - - MED::PTimeStampInfo aTimeStampInfo = theTimeStampValue->myTimeStampInfo; - TValueHolder anEntity(aTimeStampInfo->myEntity); - TValueHolder aNumDt(aTimeStampInfo->myNumDt); - TValueHolder aNumOrd(aTimeStampInfo->myNumOrd); - TValueHolder anUnitDt(aTimeStampInfo->myUnitDt); - TValueHolder aDt(aTimeStampInfo->myDt); - MED::TGeom2Gauss& aGeom2Gauss = aTimeStampInfo->myGeom2Gauss; - - MED::PFieldInfo aFieldInfo = aTimeStampInfo->myFieldInfo; - TValueHolder aFieldName(aFieldInfo->myName); - - MED::PMeshInfo aMeshInfo = aFieldInfo->myMeshInfo; - TValueHolder aMeshName(aMeshInfo->myName); - - const TGeomSet& aGeomSet = theTimeStampValue->myGeomSet; - TGeomSet::const_iterator anIter = aGeomSet.begin(); - for(; anIter != aGeomSet.end(); anIter++){ - EGeometrieElement aGeom = *anIter; - - TVector aGaussName(GetNOMLength()+1); - MED::TGeom2Gauss::const_iterator aGaussIter = aGeom2Gauss.find(aGeom); - if(aGaussIter != aGeom2Gauss.end()){ - MED::PGaussInfo aGaussInfo = aGaussIter->second; - strcpy(&aGaussName[0],&aGaussInfo->myName[0]); - } - - TVector aProfileName(GetNOMLength()+1); - med_storage_mode aProfileMode = med_storage_mode(eNO_PFLMOD); - MED::TGeom2Profile::const_iterator aProfileIter = aGeom2Profile.find(aGeom); - if(aProfileIter != aGeom2Profile.end()){ - MED::PProfileInfo aProfileInfo = aProfileIter->second; - aProfileMode = med_storage_mode(aProfileInfo->myMode); - strcpy(&aProfileName[0],&aProfileInfo->myName[0]); - } - - med_int aNbVal = theTimeStampValue->GetNbVal(aGeom); - - aRet = MEDfieldValueWithProfileWr(anId, - &aFieldName, - aNumDt, - aNumOrd, - aDt, - anEntity, - med_geometry_type(aGeom), - aProfileMode, - &aProfileName[0], - &aGaussName[0], - aModeSwitch, - MED_ALL_CONSTITUENT, - aNbVal, - theTimeStampValue->GetValuePtr(aGeom)); - if(aRet < 0){ - if(theErr){ - *theErr = MED_FALSE; - break; - } - EXCEPTION(std::runtime_error,"SetTimeStampValue - MEDfieldValueWithProfileWr(...)"); - } - - } - - INITMSG(MYDEBUG,"TVWrapper::SetTimeStampValue - MED_MODE_ACCES = "< aCoord(anInfo.myCoord); - TValueHolder aModeSwitch(anInfo.myModeSwitch); - TValueHolder aCoordNames(anInfo.myCoordNames); - TValueHolder aCoordUnits(anInfo.myCoordUnits); - med_int aNbNoeuds = med_int(anInfo.myCoord.size() / aMeshInfo.myDim); - //med_axis_type aRepere = MED_CARTESIAN; - - aRet = MEDmeshNodeCoordinateWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_UNDEF_DT, - aModeSwitch, - aNbNoeuds, - &aCoord); - - if(aRet < 0) - EXCEPTION(std::runtime_error,"SetGrilleInfo - MEDmeshNodeCoordinateWr(...)"); - - TValueHolder aGrilleStructure(anInfo.myGrilleStructure); - aRet = MEDmeshGridStructWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_UNDEF_DT, - &aGrilleStructure); - if(aRet < 0) - EXCEPTION(std::runtime_error,"SetGrilleInfo - MEDmeshGridStructWr(...)"); - - } else { - for(med_int aAxis = 0; aAxis < aMeshInfo.myDim; aAxis++){ - aRet = MEDmeshGridIndexCoordinateWr(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_UNDEF_DT, - aAxis+1, - anInfo.GetIndexes(aAxis).size(), - &anInfo.GetIndexes(aAxis)[0]); - - if(aRet < 0) - EXCEPTION(std::runtime_error,"SetGrilleInfo - MEDmeshGridIndexCoordinateWr(...)"); - } - - } - - return; - } - - //---------------------------------------------------------------------------- - void - TVWrapper - ::GetGrilleInfo(TGrilleInfo& theInfo, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; - TValueHolder aMeshName(aMeshInfo.myName); - EMaillage aMaillageType = aMeshInfo.myType; - - GetGrilleType(aMeshInfo, theInfo.myGrilleType, theErr); - EGrilleType aGrilleType = theInfo.myGrilleType; - - TErr aRet = 0; - if(aMaillageType == eSTRUCTURE && aGrilleType == eGRILLE_STANDARD) { - GetGrilleStruct(aMeshInfo, theInfo.myGrilleStructure, theErr); - - TValueHolder aCoord(theInfo.myCoord); - TValueHolder aModeSwitch(theInfo.myModeSwitch); - TValueHolder aCoordNames(theInfo.myCoordNames); - TValueHolder aCoordUnits(theInfo.myCoordUnits); - //med_axis_type aRepere; - - aRet = MEDmeshNodeCoordinateRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - aModeSwitch, - &aCoord); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshNodeCoordinateRd(...)"); - - //TInt aNbNodes = theInfo.GetNbNodes();//GetNbFamilies(aMeshInfo); - TValueHolder aFamNumNode(theInfo.myFamNumNode); - - aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - MED_NODE, - MED_NO_GEOTYPE, - &aFamNumNode); - - if(aRet < 0) - { -// if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files - { - int mySize = (int)theInfo.myFamNumNode.size(); - theInfo.myFamNumNode.clear(); - theInfo.myFamNumNode.resize(mySize,0); - aRet = 0; - } -// else -// EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...)"); - } - if(theErr) - *theErr = aRet; - - //============================ - } - - if(aMaillageType == eSTRUCTURE && aGrilleType != eGRILLE_STANDARD){ - ETable aTable = eCOOR_IND1; - for(med_int anAxis = 1; anAxis <= aMeshInfo.myDim; anAxis++){ - switch(anAxis){ - case 1 : - aTable = eCOOR_IND1; - break; - case 2 : - aTable = eCOOR_IND2; - break; - case 3 : - aTable = eCOOR_IND3; - break; - default : - aRet = -1; - } - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetGrilleInfo - anAxis number out of range(...)"); - - TInt aNbIndexes = GetNbNodes(aMeshInfo,aTable); - if(aNbIndexes < 0) - EXCEPTION(std::runtime_error,"GetGrilleInfo - Erreur a la lecture de la taille de l'indice"); - - TValueHolder anIndexes(theInfo.GetIndexes(anAxis-1)); - //TValueHolder table(aTable); - //char aCompNames[MED_SNAME_SIZE+1]; - //char anUnitNames[MED_SNAME_SIZE+1]; - aRet=MEDmeshGridIndexCoordinateRd(myFile->Id(),&aMeshName, - MED_NO_DT,MED_NO_IT, - anAxis, - &anIndexes); - - //theInfo.SetCoordName(anAxis-1, aCompNames); - //theInfo.SetCoordUnit(anAxis-1, anUnitNames); - theInfo.SetGrilleStructure(anAxis-1, aNbIndexes); - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDindicesCoordLire(...)"); - } - } - - EGeometrieElement aGeom = theInfo.GetGeom(); - EEntiteMaillage aEntity = theInfo.GetEntity(); - TInt aNbCells = theInfo.GetNbCells(); - - theInfo.myFamNum.resize(aNbCells); - TValueHolder aFamNum(theInfo.myFamNum); - - aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), - &aMeshName,MED_NO_DT,MED_NO_IT,med_entity_type(aEntity), - med_geometry_type(aGeom),&aFamNum); - - if ( aMeshInfo.myDim == 3 ) - { - aGeom = theInfo.GetSubGeom(); - aEntity = theInfo.GetSubEntity(); - aNbCells = theInfo.GetNbSubCells(); - - theInfo.myFamSubNum.resize(aNbCells,0); - TValueHolder aFamNum(theInfo.myFamSubNum); - - aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(), - &aMeshName,MED_NO_DT,MED_NO_IT, - med_entity_type(aEntity), - med_geometry_type(aGeom),&aFamNum); - } - if(aRet < 0) - { -// if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files - { - int mySize = (int)theInfo.myFamNumNode.size(); - theInfo.myFamNumNode.clear(); - theInfo.myFamNumNode.resize(mySize,0); - aRet = 0; - } -// else -// EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...)"); - } - if(theErr) - *theErr = aRet; - } - - void - TVWrapper - ::GetGrilleType(const MED::TMeshInfo& theMeshInfo, - EGrilleType& theGridType, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - EXCEPTION(std::runtime_error," GetGrilleType - aFileWrapper (...)"); - - MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); - - if(aMeshInfo.myType == eSTRUCTURE){ - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aGridType(theGridType); - TErr aRet = MEDmeshGridTypeRd(myFile->Id(), - &aMeshName, - &aGridType); - - if(aRet < 0) - EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshGridTypeRd(...)"); - } - } - - void - TVWrapper - ::GetGrilleStruct(const MED::TMeshInfo& theMeshInfo, - TIntVector& theStruct, - TErr* theErr) - { - TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); - - if(theErr && *theErr < 0) - return; - - TErr aRet; - MED::TMeshInfo& aMeshInfo = const_cast(theMeshInfo); - - TValueHolder aMeshName(aMeshInfo.myName); - TValueHolder aGridStructure(theStruct); - - aRet = MEDmeshGridStructRd(myFile->Id(), - &aMeshName, - MED_NO_DT, - MED_NO_IT, - &aGridStructure); - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshGridStructRd(...)"); - } - - } -} diff --git a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx b/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx deleted file mode 100644 index a06e1c15c..000000000 --- a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx +++ /dev/null @@ -1,489 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#ifndef MED_V2_2_Wrapper_HeaderFile -#define MED_V2_2_Wrapper_HeaderFile - -#ifdef WIN32 - #if defined MEDWRAPPER_V2_2_EXPORTS || defined MEDWrapper_V2_2_EXPORTS - #if defined WIN32 - #define MED_V22_WRAPPER_EXPORT __declspec( dllexport ) - #else - #define MED_V22_WRAPPER_EXPORT - #endif - #else - #if defined WIN32 - #define MED_V22_WRAPPER_EXPORT __declspec( dllimport ) - #else - #define MED_V22_WRAPPER_EXPORT - #endif - #endif -#else - #define MED_V22_WRAPPER_EXPORT -#endif - -#include "MED_Structures.hxx" -#include "MED_TWrapper.hxx" - -namespace MED -{ - template<> - TInt MED_V22_WRAPPER_EXPORT - GetDESCLength(); - - template<> - TInt MED_V22_WRAPPER_EXPORT - GetIDENTLength(); - - template<> - TInt MED_V22_WRAPPER_EXPORT - GetNOMLength(); - - template<> - TInt MED_V22_WRAPPER_EXPORT - GetLNOMLength(); - - template<> - TInt MED_V22_WRAPPER_EXPORT - GetPNOMLength(); - - template<> - void MED_V22_WRAPPER_EXPORT - GetVersionRelease(TInt& majeur, TInt& mineur, TInt& release); - - template<> - TInt MED_V22_WRAPPER_EXPORT - GetNbConn(EGeometrieElement typmai, - EEntiteMaillage typent, - TInt mdim); - - namespace V2_2 - { - //---------------------------------------------------------------------------- - class TFile; - typedef boost::shared_ptr PFile; - - typedef enum {eLECTURE, eLECTURE_ECRITURE, eLECTURE_AJOUT, eCREATION} EModeAcces; - - //---------------------------------------------------------------------------- - class MED_V22_WRAPPER_EXPORT TVWrapper: public MED::TTWrapper - { - TVWrapper(); - TVWrapper(const TVWrapper&); - TVWrapper& operator=(const TVWrapper&); - - public: - TVWrapper(const std::string& theFileName); - - //---------------------------------------------------------------------------- - virtual - TInt - GetNbMeshes(TErr* theErr = NULL); - - virtual - void - GetMeshInfo(TInt theMeshId, MED::TMeshInfo&, - TErr* theErr = NULL); - - virtual - void - SetMeshInfo(const MED::TMeshInfo& theInfo, - TErr* theErr = NULL); - - void SetMeshInfo(const MED::TMeshInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - - //---------------------------------------------------------------------------- - virtual - TInt - GetNbFamilies(const MED::TMeshInfo& theMeshInfo, - TErr* theErr = NULL); - - virtual - TInt - GetNbFamAttr(TInt theFamId, - const MED::TMeshInfo& theInfo, - TErr* theErr = NULL); - - virtual - TInt - GetNbFamGroup(TInt theFamId, - const MED::TMeshInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - GetFamilyInfo(TInt theFamId, - MED::TFamilyInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - SetFamilyInfo(const MED::TFamilyInfo& theInfo, - TErr* theErr = NULL); - - void - SetFamilyInfo(const MED::TFamilyInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - - //---------------------------------------------------------------------------- - virtual - void - GetNames(TElemInfo& theInfo, - TInt nb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - - virtual - void - GetNumeration(TElemInfo& theInfo, - TInt nb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - - virtual - void - GetFamilies(TElemInfo& theInfo, - TInt nb, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - - virtual - void - SetNames(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - - void - SetNames(const TElemInfo& theInfo, - EModeAcces theMode, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - - virtual - void - SetNumeration(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - void - SetNumeration(const TElemInfo& theInfo, - EModeAcces theMode, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - - virtual - void - SetFamilies(const TElemInfo& theInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - void - SetFamilies(const TElemInfo& theInfo, - EModeAcces theMode, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - virtual - TInt - GetNbNodes(const MED::TMeshInfo& theMeshInfo, - TErr* theErr = NULL) - { - return GetNbNodes(theMeshInfo,eCOOR,theErr); - } - - TInt - GetNbNodes(const MED::TMeshInfo& theMeshInfo, - ETable theTable, - TErr* theErr = NULL); - - virtual - void - GetNodeInfo(MED::TNodeInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - SetNodeInfo(const MED::TNodeInfo& theInfo, - TErr* theErr = NULL); - - void - SetNodeInfo(const MED::TNodeInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - virtual - void - GetPolygoneInfo(TPolygoneInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - SetPolygoneInfo(const TPolygoneInfo& theInfo, - TErr* theErr = NULL); - - void - SetPolygoneInfo(const MED::TPolygoneInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - virtual - TInt - GetNbPolygones(const TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL); - - virtual - TInt - GetPolygoneConnSize(const TMeshInfo& theMeshInfo, - EEntiteMaillage theEntity, - EGeometrieElement theGeom, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - virtual - void - GetPolyedreInfo(TPolyedreInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - SetPolyedreInfo(const TPolyedreInfo& theInfo, - TErr* theErr = NULL); - - void - SetPolyedreInfo(const MED::TPolyedreInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - virtual - TInt - GetNbPolyedres(const TMeshInfo& theMeshInfo, - EEntiteMaillage, - EGeometrieElement, - EConnectivite, - TErr* theErr = NULL); - - virtual - void - GetPolyedreConnSize(const TMeshInfo& theMeshInfo, - TInt& theNbFaces, - TInt& theConnSize, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - virtual - TEntityInfo - GetEntityInfo(const MED::TMeshInfo& theMeshInfo, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL); - - virtual - TInt - GetNbCells(const MED::TMeshInfo& theMeshInfo, - EEntiteMaillage, - EGeometrieElement, - EConnectivite theConnMode = eNOD, - TErr* theErr = NULL); - - virtual - void - GetCellInfo(MED::TCellInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - SetCellInfo(const MED::TCellInfo& theInfo, - TErr* theErr = NULL); - - void - SetCellInfo(const MED::TCellInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - //! Read geom type of MED_BALL structural element - EGeometrieElement GetBallGeom(const TMeshInfo& theMeshInfo); - - //! Read number of balls in the Mesh - virtual TInt GetNbBalls(const TMeshInfo& theMeshInfo); - - //! Read a MEDWrapped representation of MED_BALL from the MED file - virtual void GetBallInfo(TBallInfo& theInfo, TErr* theErr = NULL); - - //! Write a MEDWrapped representation of MED_BALL to the MED file - virtual void SetBallInfo(const TBallInfo& theInfo, TErr* theErr); - - //! Write a MEDWrapped representation of MED_BALL to the MED file - void SetBallInfo(const TBallInfo& theInfo, EModeAcces theMode, TErr* theErr); - - //---------------------------------------------------------------------------- - virtual - TInt - GetNbFields(TErr* theErr = NULL); - - virtual - TInt - GetNbComp(TInt theFieldId, - TErr* theErr = NULL); - - virtual - void - GetFieldInfo(TInt theFieldId, - MED::TFieldInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - SetFieldInfo(const MED::TFieldInfo& theInfo, - TErr* theErr = NULL); - - void - SetFieldInfo(const MED::TFieldInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - virtual - TInt - GetNbGauss(TErr* theErr = NULL); - - virtual - TGaussInfo::TInfo - GetGaussPreInfo(TInt theId, - TErr* theErr = NULL); - - virtual - void - GetGaussInfo(TInt theId, - TGaussInfo& theInfo, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - virtual - TInt - GetNbProfiles(TErr* theErr = NULL); - - virtual - TProfileInfo::TInfo - GetProfilePreInfo(TInt theId, - TErr* theErr = NULL); - - virtual - void - GetProfileInfo(TInt theId, - TProfileInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - SetProfileInfo(const TProfileInfo& theInfo, - TErr* theErr = NULL); - - void - SetProfileInfo(const TProfileInfo& theInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - //---------------------------------------------------------------------------- - virtual - TInt - GetNbTimeStamps(const MED::TFieldInfo& theInfo, - const MED::TEntityInfo& theEntityInfo, - EEntiteMaillage& theEntity, - TGeom2Size& theGeom2Size, - TErr* theErr = NULL); - - virtual - void - GetTimeStampInfo(TInt theTimeStampId, - MED::TTimeStampInfo& theInfo, - TErr* theErr = NULL); - - virtual - void - GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, - const TMKey2Profile& theMKey2Profile, - const TKey2Gauss& theKey2Gauss, - TErr* theErr = NULL); - - virtual - void - SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, - TErr* theErr = NULL); - - void - SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue, - EModeAcces theMode, - TErr* theErr = NULL); - - - //---------------------------------------------------------------------------- - virtual - void - GetGrilleInfo(TGrilleInfo& theGrilleInfo, - TErr* theErr = NULL); - - virtual - void - SetGrilleInfo(const MED::TGrilleInfo& theGrilleInfo, - TErr* theErr = NULL); - - void - SetGrilleInfo(const MED::TGrilleInfo& theGrilleInfo, - EModeAcces theMode, - TErr* theErr = NULL); - - virtual - void - GetGrilleType(const MED::TMeshInfo& theMeshInfo, - EGrilleType& type, - TErr* theErr = NULL); - - void - GetGrilleStruct(const MED::TMeshInfo& theMeshInfo, - TIntVector& theStruct, - TErr* theErr = NULL); - - protected: - PFile myFile; - }; - } -} - -#endif diff --git a/src/MEDWrapper/mprint_version.cxx b/src/MEDWrapper/mprint_version.cxx new file mode 100644 index 000000000..7ade43cdc --- /dev/null +++ b/src/MEDWrapper/mprint_version.cxx @@ -0,0 +1,48 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include +#include + +int main (int argc, char **argv) +{ + if ( argc < 2 ) + return -1; + + med_idt fid = MEDfileOpen(argv[1], MED_ACC_RDONLY); + if (fid < 0) + return 1; + + med_int major, minor, release; + med_err aRet = MEDfileNumVersionRd(fid, &major, &minor, &release); + MEDfileClose(fid); + if (aRet < 0) { + // VSR: simulate med 2.3.6 behavior, med file version is assumed to be 2.1 or older + major = 2; + minor = release = -1; + } + + printf("%d.%d.%d\n", major, minor, release); + return 0; +} diff --git a/src/SMESH/CMakeLists.txt b/src/SMESH/CMakeLists.txt index 7858c1c4a..e96f78f1b 100644 --- a/src/SMESH/CMakeLists.txt +++ b/src/SMESH/CMakeLists.txt @@ -27,7 +27,7 @@ INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIRS} ${HDF5_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/src/Controls - ${PROJECT_SOURCE_DIR}/src/MEDWrapper/Base + ${PROJECT_SOURCE_DIR}/src/MEDWrapper ${PROJECT_SOURCE_DIR}/src/Driver ${PROJECT_SOURCE_DIR}/src/DriverDAT ${PROJECT_SOURCE_DIR}/src/DriverMED diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index af3a96529..71f07dcf2 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1376,7 +1376,6 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() * \param [in] theAutoGroups - boolean parameter for creating/not creating * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; * the typical use is auto_groups=false. - * \param [in] theVersion - defines the version of format of MED file, that will be created * \param [in] meshPart - mesh data to export * \param [in] theAutoDimension - if \c true, a space dimension of a MED mesh can be either * - 1D if all mesh nodes lie on OX coordinate axis, or @@ -1392,7 +1391,6 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() void SMESH_Mesh::ExportMED(const char * file, const char* theMeshName, bool theAutoGroups, - int theVersion, const SMESHDS_Mesh* meshPart, bool theAutoDimension, bool theAddODOnVertices, @@ -1402,7 +1400,7 @@ void SMESH_Mesh::ExportMED(const char * file, SMESH_TRY; DriverMED_W_SMESHDS_Mesh myWriter; - myWriter.SetFile ( file, MED::EVersion(theVersion) ); + myWriter.SetFile ( file ); myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); myWriter.SetAutoDimension( theAutoDimension ); myWriter.AddODOnVertices ( theAddODOnVertices ); @@ -1478,7 +1476,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; cmd += "\""; system(cmd.c_str()); - ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, /*theVersion=*/1, + ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, /*meshPart=*/NULL, /*theAutoDimension=*/false, /*theAddODOnVertices=*/false, /*theAllElemsToGroup=*/true ); // theAllElemsToGroup is for PAL0023413 #ifdef WIN32 diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 158788613..ee881f1fc 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -249,7 +249,6 @@ class SMESH_EXPORT SMESH_Mesh void ExportMED(const char * theFile, const char* theMeshName = NULL, bool theAutoGroups = true, - int theVersion = 0, const SMESHDS_Mesh* theMeshPart = 0, bool theAutoDimension = false, bool theAddODOnVertices = false, diff --git a/src/SMESHClient/CMakeLists.txt b/src/SMESHClient/CMakeLists.txt index 4ac6d4322..6dcea0662 100644 --- a/src/SMESHClient/CMakeLists.txt +++ b/src/SMESHClient/CMakeLists.txt @@ -71,8 +71,6 @@ SET(_link_LIBRARIES SMESHDS SMESHControls MEDWrapper - MEDWrapperBase - MEDWrapper_V2_2 ) # --- headers --- diff --git a/src/SMESHGUI/CMakeLists.txt b/src/SMESHGUI/CMakeLists.txt index b3acd18ac..a06cac157 100644 --- a/src/SMESHGUI/CMakeLists.txt +++ b/src/SMESHGUI/CMakeLists.txt @@ -42,7 +42,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/SMESHUtils ${PROJECT_SOURCE_DIR}/src/Controls ${PROJECT_SOURCE_DIR}/src/SMESHClient - ${PROJECT_SOURCE_DIR}/src/MEDWrapper/Base + ${PROJECT_SOURCE_DIR}/src/MEDWrapper ${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/idl ) diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 3f2b88771..e3b49472b 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -238,8 +238,8 @@ namespace } else if ( theCommandID == SMESHOp::OpImportSAUV || theCommandID == SMESHOp::OpPopupImportSAUV ) { - filter.append( QObject::tr( "SAUV files (*.sauv*)" ) ); - filter.append( QObject::tr( "All files (*)" ) ); + filter.append( QObject::tr( "SAUV_FILES_FILTER" ) + " (*.sauv *.sauve)" ); + filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" ); } else if ( theCommandID == SMESHOp::OpImportGMF || theCommandID == SMESHOp::OpPopupImportGMF ) { @@ -650,8 +650,7 @@ namespace // Get parameters of export operation - QString aFilename; - SMESH::MED_VERSION aFormat = SMESH::MED_V2_2; + QString aFilename; // Init the parameters with the default values bool aIsASCII_STL = true; bool toCreateGroups = false; @@ -728,27 +727,14 @@ namespace } else if ( isMED || isSAUV ) // Export to MED or SAUV { - QMap aFilterMap; - //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2)); + QStringList filters; if ( isMED ) { - QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2)); - //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 ); - aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 ); + filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)"; } else { // isSAUV - aFilterMap.insert("All files (*)", SMESH::MED_V2_1 ); - aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 ); - aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 ); + filters << QObject::tr( "SAUV_FILES_FILTER" ) + " (*.sauv *.sauve)"; } - QStringList filters; - QString aDefaultFilter; - QMap::const_iterator it = aFilterMap.begin(); - for ( ; it != aFilterMap.end(); ++it ) { - filters.push_back( it.key() ); - if (it.value() == SMESH::MED_V2_2) - aDefaultFilter = it.key(); - } QStringList checkBoxes; checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM"); @@ -761,7 +747,6 @@ namespace new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList ); fd->setWindowTitle( aTitle ); fd->setNameFilters( filters ); - fd->selectNameFilter( aDefaultFilter ); fd->SetChecked( toCreateGroups, 0 ); fd->SetChecked( toFindOutDim, 1 ); if ( !anInitialPath.isEmpty() ) @@ -789,34 +774,13 @@ namespace aFilename = QString::null; break; } - aFormat = aFilterMap[fd->selectedNameFilter()]; toOverwrite = fv->isOverwrite(); is_ok = true; if ( !aFilename.isEmpty() ) { - // med-2.1 does not support poly elements - if ( aFormat==SMESH::MED_V2_1 ) - for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) { - SMESH::SMESH_IDSource_var aMeshItem = (*aMeshIter).first; - SMESH::long_array_var nbElems = aMeshItem->GetMeshInfo(); - if ( nbElems[ SMESH::Entity_Polygon ] + nbElems[ SMESH::Entity_Quad_Polygon ] + - nbElems[ SMESH::Entity_Polyhedra ] + nbElems[ SMESH::Entity_Quad_Polyhedra ]) - { - int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_EXPORT_MED_V2_1").arg((*aMeshIter).second), - QObject::tr("SMESH_BUT_YES"), - QObject::tr("SMESH_BUT_NO"), 0, 1); - if (aRet != 0) { - is_ok = false; - break; - } - } - } if( !toOverwrite ) { // can't append to an existing using other format - SMESH::MED_VERSION aVersion = SMESH::MED_V2_1; - bool isVersionOk = SMESHGUI::GetSMESHGen()->GetMEDVersion( aFilename.toUtf8().constData(), aVersion ); - if( !isVersionOk || aVersion != aFormat ) { + bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckCompatibility( aFilename.toUtf8().constData() ); + if ( !isVersionOk ) { int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), QObject::tr("SMESH_EXPORT_MED_VERSION_COLLISION").arg(aFilename), @@ -901,11 +865,11 @@ namespace const QString& geoAssFields = aFieldList[ aMeshIndex ].second; const bool hasFields = ( fields.length() || !geoAssFields.isEmpty() ); if ( !hasFields && aMeshOrGroup->_is_equivalent( aMeshItem )) - aMeshItem->ExportToMEDX( aFilename.toUtf8().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim ); + aMeshItem->ExportMED( aFilename.toUtf8().data(), toCreateGroups, + toOverwrite && aMeshIndex == 0, toFindOutDim ); else aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim, + toOverwrite && aMeshIndex == 0, toFindOutDim, fields, geoAssFields.toLatin1().data() ); } } diff --git a/src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx b/src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx index 4cb1bb4b1..b7f1b0dde 100644 --- a/src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx @@ -23,8 +23,6 @@ // #include "SMESHGUI_FileInfoDlg.h" -#include "MED_Common.hxx" - #include #include #include diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index a5e80c659..c7ec562eb 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -11,6 +11,10 @@ MED_FILES_FILTER MED files + + SAUV_FILES_FILTER + SAUV files + IDEAS_FILES_FILTER IDEAS files @@ -23,10 +27,6 @@ TEXT_FILES_FILTER TXT files - - MED_VX_FILES_FILTER - MED %1 files - STL_FILES_FILTER STL files @@ -1764,13 +1764,6 @@ Do you want to continue? SMESH_EXPORT_ONLY_GPOUP You are going to export the group without its mesh. Do you want to continue? - - - SMESH_EXPORT_MED_V2_1 - During export mesh with name - "%1" to MED 2.1 -polygons and polyhedrons elements will be missed -For correct export use MED 2.2 -Are you sure want to export to MED 2.1? SMESH_EXPORT_MED_VERSION_COLLISION diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts index 032411ca7..5e4f1b97b 100755 --- a/src/SMESHGUI/SMESH_msg_fr.ts +++ b/src/SMESHGUI/SMESH_msg_fr.ts @@ -11,6 +11,10 @@ MED_FILES_FILTER Fichiers MED + + SAUV_FILES_FILTER + Fichiers SAUV + IDEAS_FILES_FILTER Fichiers IDEAS @@ -23,10 +27,6 @@ TEXT_FILES_FILTER Fichiers TXT - - MED_VX_FILES_FILTER - Fichiers MED %1 - STL_FILES_FILTER Fichiers STL @@ -1748,13 +1748,6 @@ Voulez-vous continuer ? SMESH_EXPORT_ONLY_GPOUP Vous allez export le groupe sans son maillage. Voulez-vous continuer ? - - - SMESH_EXPORT_MED_V2_1 - Les éléments polygonaux et polyèdriques seront omis -dans le cas d'exportation du maillage "%1" à MED 2.1 -Utilisez MED 2.2 pour l'exportation correcte. -Voulez-vous effectuer l'exportation à MED 2.1 ? SMESH_EXPORT_MED_VERSION_COLLISION diff --git a/src/SMESHGUI/SMESH_msg_ja.ts b/src/SMESHGUI/SMESH_msg_ja.ts index d18673c16..c877ebeb7 100644 --- a/src/SMESHGUI/SMESH_msg_ja.ts +++ b/src/SMESHGUI/SMESH_msg_ja.ts @@ -11,6 +11,10 @@ MED_FILES_FILTER MEDファイル + + SAUV_FILES_FILTER + SAUVファイル + IDEAS_FILES_FILTER IDEAS ファイル @@ -23,10 +27,6 @@ TEXT_FILES_FILTER TXT ファイル - - MED_VX_FILES_FILTER - ファイル MED %1 - STL_FILES_FILTER STL ファイル @@ -1731,10 +1731,6 @@ SMESH_EXPORT_ONLY_GPOUP そのメッシュなしでグループのエクスポートをしようとしています。続行しますか? - - SMESH_EXPORT_MED_V2_1 - 多角形、多面体要素は正しいエクスポート用 MED 2.1 MED 2.2 にメッシュ '%' のエクスポートの場合省略されます。MED 2.1 をエクスポートしますか。 - SMESH_EXPORT_MED_VERSION_COLLISION ファイル「%1」MED バージョンは知られていないか、選択したバージョンと一致しません。ファイルを上書きしますか。 diff --git a/src/SMESH_I/CMakeLists.txt b/src/SMESH_I/CMakeLists.txt index 63c599a88..2bb789ab3 100644 --- a/src/SMESH_I/CMakeLists.txt +++ b/src/SMESH_I/CMakeLists.txt @@ -31,8 +31,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/Controls ${PROJECT_SOURCE_DIR}/src/SMDS ${PROJECT_SOURCE_DIR}/src/SMESHDS - ${PROJECT_SOURCE_DIR}/src/MEDWrapper/Base - ${PROJECT_SOURCE_DIR}/src/MEDWrapper/Factory + ${PROJECT_SOURCE_DIR}/src/MEDWrapper ${PROJECT_SOURCE_DIR}/src/Driver ${PROJECT_SOURCE_DIR}/src/DriverMED ${PROJECT_SOURCE_DIR}/src/DriverCGNS @@ -116,7 +115,7 @@ SET(SMESHEngine_HEADERS SET(SMESHEngine_SOURCES SMESH_Gen_i.cxx SMESH_Gen_i_1.cxx - SMESH_DumpPython.cxx + SMESH_PythonDump.cxx SMESH_Mesh_i.cxx SMESH_subMesh_i.cxx SMESH_MeshEditor_i.cxx diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 96287f872..8cd274b8d 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -440,6 +440,18 @@ namespace { } } } + + bool _FilterArg( const _AString& theArg ) + { + static std::list<_AString> filteredArgs; + static bool initialized = false; + if ( !initialized ) { + initialized = true; + filteredArgs.push_back( "SMESH.MED_V2_1" ); + filteredArgs.push_back( "SMESH.MED_V2_2" ); + } + return std::find( filteredArgs.begin(), filteredArgs.end(), theArg ) != filteredArgs.end(); + } } //================================================================================ @@ -1971,16 +1983,26 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) // ---------------------------------------------------------------------- else if ( theCommand->MethodStartsFrom( "Export" )) { - if ( method == "ExportToMED" || // ExportToMED() --> ExportMED() - method == "ExportToMEDX" ) // ExportToMEDX() --> ExportMED() + if ( method == "ExportToMED" || // ExportToMED() --> ExportMED() + method == "ExportToMEDX" || // ExportToMEDX() --> ExportMED() + method == "ExportMED" ) { theCommand->SetMethod( "ExportMED" ); - if ( theCommand->GetNbArgs() == 5 ) + // filter out deprecated version parameter + vector< _AString > args; + for ( int i = 1; i <= theCommand->GetNbArgs(); i++ ) { + if ( !_FilterArg( theCommand->GetArg( i ) ) ) + args.push_back( theCommand->GetArg( i ) ); + } + theCommand->RemoveArgs(); + for ( uint i = 0; i < args.size(); i++ ) + theCommand->SetArg( i+1, args[i] ); + if ( theCommand->GetNbArgs() == 4 ) { // ExportToMEDX(...,autoDimension) -> ExportToMEDX(...,meshPart=None,autoDimension) - _AString autoDimension = theCommand->GetArg( 5 ); - theCommand->SetArg( 5, "None" ); - theCommand->SetArg( 6, autoDimension ); + _AString autoDimension = theCommand->GetArg( 4 ); + theCommand->SetArg( 4, "None" ); + theCommand->SetArg( 5, autoDimension ); } } else if ( method == "ExportCGNS" ) @@ -2006,6 +2028,15 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) TCollection_AsciiString newMethod = method; newMethod.Remove( /*where=*/7, /*howmany=*/6 ); theCommand->SetMethod( newMethod ); + // filter out deprecated version parameter + vector< _AString > args; + for ( int i = 1; i <= theCommand->GetNbArgs(); i++ ) { + if ( !_FilterArg( theCommand->GetArg( i ) ) ) + args.push_back( theCommand->GetArg( i ) ); + } + theCommand->RemoveArgs(); + for ( uint i = 0; i < args.size(); i++ ) + theCommand->SetArg( i+1, args[i] ); // make the 1st arg be the last one (or last but three for ExportMED()) _pyID partID = theCommand->GetArg( 1 ); int nbArgs = theCommand->GetNbArgs() - 3 * (newMethod == "ExportMED"); diff --git a/src/SMESH_I/SMESH_DumpPython.cxx b/src/SMESH_I/SMESH_DumpPython.cxx deleted file mode 100644 index 92506466c..000000000 --- a/src/SMESH_I/SMESH_DumpPython.cxx +++ /dev/null @@ -1,1394 +0,0 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File : SMESH_DumpPython.cxx -// Created : Thu Mar 24 17:17:59 2005 -// Author : Julia DOROVSKIKH -// Module : SMESH - -#include "SMESH_PythonDump.hxx" - -#include "SMESH_2smeshpy.hxx" -#include "SMESH_Comment.hxx" -#include "SMESH_Filter_i.hxx" -#include "SMESH_Gen_i.hxx" -#include "SMESH_MeshEditor_i.hxx" - -#include - -#include -#include -#include -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -#include "SMESH_TryCatch.hxx" - -namespace SMESH -{ - - size_t TPythonDump::myCounter = 0; - const char theNotPublishedObjectName[] = "__NOT__Published__Object__"; - - TVar::TVar(CORBA::Double value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(CORBA::Long value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(CORBA::Short value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(const SMESH::double_array& value):myVals(value.length()), myIsList(true) - { - for ( size_t i = 0; i < value.length(); i++) - myVals[i] = SMESH_Comment(value[i]); - } - - TPythonDump:: - TPythonDump():myVarsCounter(0) - { - ++myCounter; - } - TPythonDump:: - ~TPythonDump() - { - if(--myCounter == 0){ - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - std::string aString = myStream.str(); - TCollection_AsciiString aCollection(Standard_CString(aString.c_str())); - if(!aCollection.IsEmpty()) - { - const std::string & objEntry = SMESH_Gen_i::GetSMESHGen()->GetLastObjEntry(); - if ( !objEntry.empty() ) - aCollection += (TVar::ObjPrefix() + objEntry ).c_str(); - aSMESHGen->AddToPythonScript(aCollection); - if(MYDEBUG) MESSAGE(aString); - // prevent misuse of already treated variables - aSMESHGen->UpdateParameters(CORBA::Object_var().in(),""); - } - } - } - - TPythonDump& //!< store a variable value. Write either a value or '$varID$' - TPythonDump:: - operator<<(const TVar& theVarValue) - { - const std::vector< int >& varIDs = SMESH_Gen_i::GetSMESHGen()->GetLastParamIndices(); - if ( theVarValue.myIsList ) - { - myStream << "[ "; - for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i ) - { - if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) - myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); - else - myStream << theVarValue.myVals[i-1]; - if ( i < theVarValue.myVals.size() ) - myStream << ", "; - ++myVarsCounter; - } - myStream << " ]"; - } - else - { - if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) - myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); - else - myStream << theVarValue.myVals[0]; - ++myVarsCounter; - } - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(long int theArg){ - myStream< - void DumpArray(const TArray& theArray, TPythonDump & theStream) - { - if ( theArray.length() == 0 ) - { - theStream << "[]"; - } - else - { - theStream << "[ "; - for (CORBA::ULong i = 1; i <= theArray.length(); i++) { - theStream << theArray[i-1]; - if ( i < theArray.length() ) - theStream << ", "; - } - theStream << " ]"; - } - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::long_array& theArg) - { - DumpArray( theArg, *this ); - return *this; - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::double_array& theArg) - { - DumpArray( theArg, *this ); - return *this; - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::nodes_array& theArg) - { - DumpArray( theArg, *this ); - return *this; - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::string_array& theArray) - { - myStream << "[ "; - for ( CORBA::ULong i = 1; i <= theArray.length(); i++ ) { - myStream << "'" << theArray[i-1] << "'"; - if ( i < theArray.length() ) - myStream << ", "; - } - myStream << " ]"; - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(SALOMEDS::SObject_ptr aSObject) - { - if ( !aSObject->_is_nil() ) { - CORBA::String_var entry = aSObject->GetID(); - myStream << entry.in(); - } - else { - myStream << theNotPublishedObjectName; - } - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(CORBA::Object_ptr theArg) - { - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); - if(!aSObject->_is_nil()) { - CORBA::String_var id = aSObject->GetID(); - myStream << id; - } else if ( !CORBA::is_nil(theArg)) { - if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object - myStream << "smeshObj_" << size_t(theArg); - else - myStream << theNotPublishedObjectName; - } - else - myStream << "None"; - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(SMESH::SMESH_Hypothesis_ptr theArg) - { - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); - if(aSObject->_is_nil() && !CORBA::is_nil(theArg)) - myStream << "hyp_" << theArg->GetId(); - else - *this << aSObject; - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(SMESH::SMESH_IDSource_ptr theArg) - { - if ( CORBA::is_nil( theArg ) ) - return *this << "None"; - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); - if(!aSObject->_is_nil()) - { - return *this << aSObject; - } - if ( SMESH::Filter_i* filter = SMESH::DownCast( theArg )) - { - return *this << filter; - } - if ( SMESH_MeshEditor_i::IsTemporaryIDSource( theArg )) - { - SMESH::SMESH_Mesh_var mesh = theArg->GetMesh(); - SMESH::long_array_var anElementsId = theArg->GetIDs(); - SMESH::array_of_ElementType_var types = theArg->GetTypes(); - SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL; - SALOMEDS::SObject_wrap meshSO = SMESH_Gen_i::ObjectToSObject(mesh); - if ( meshSO->_is_nil() ) // don't waste memory for dumping not published objects - return *this << mesh << ".GetIDSource([], " << type << ")"; - else - return *this << mesh << ".GetIDSource(" << anElementsId << ", " << type << ")"; - } - return *this << theNotPublishedObjectName; - } - - TPythonDump& - TPythonDump:: - operator<<(SMESH::FilterLibrary_i* theArg) - { - myStream<<"aFilterLibrary"<GetFunctorType(); - switch(aFunctorType) { - case FT_AspectRatio: myStream<< "aAspectRatio"; break; - case FT_AspectRatio3D: myStream<< "aAspectRatio3D"; break; - case FT_Warping: myStream<< "aWarping"; break; - case FT_MinimumAngle: myStream<< "aMinimumAngle"; break; - case FT_Taper: myStream<< "aTaper"; break; - case FT_Skew: myStream<< "aSkew"; break; - case FT_Area: myStream<< "aArea"; break; - case FT_Volume3D: myStream<< "aVolume3D"; break; - case FT_MaxElementLength2D: myStream<< "aMaxElementLength2D"; break; - case FT_MaxElementLength3D: myStream<< "aMaxElementLength3D"; break; - case FT_FreeBorders: myStream<< "aFreeBorders"; break; - case FT_FreeEdges: myStream<< "aFreeEdges"; break; - case FT_FreeNodes: myStream<< "aFreeNodes"; break; - case FT_FreeFaces: myStream<< "aFreeFaces"; break; - case FT_EqualNodes: myStream<< "aEqualNodes"; break; - case FT_EqualEdges: myStream<< "aEqualEdges"; break; - case FT_EqualFaces: myStream<< "aEqualFaces"; break; - case FT_EqualVolumes: myStream<< "aEqualVolumes"; break; - case FT_MultiConnection: myStream<< "aMultiConnection"; break; - case FT_MultiConnection2D: myStream<< "aMultiConnection2D"; break; - case FT_Length: myStream<< "aLength"; break; - case FT_Length2D: myStream<< "aLength2D"; break; - case FT_NodeConnectivityNumber:myStream<< "aNodeConnectivityNumber";break; - case FT_BelongToMeshGroup: myStream<< "aBelongToMeshGroup"; break; - case FT_BelongToGeom: myStream<< "aBelongToGeom"; break; - case FT_BelongToPlane: myStream<< "aBelongToPlane"; break; - case FT_BelongToCylinder: myStream<< "aBelongToCylinder"; break; - case FT_BelongToGenSurface: myStream<< "aBelongToGenSurface"; break; - case FT_LyingOnGeom: myStream<< "aLyingOnGeom"; break; - case FT_RangeOfIds: myStream<< "aRangeOfIds"; break; - case FT_BadOrientedVolume: myStream<< "aBadOrientedVolume"; break; - case FT_BareBorderVolume: myStream<< "aBareBorderVolume"; break; - case FT_BareBorderFace: myStream<< "aBareBorderFace"; break; - case FT_OverConstrainedVolume: myStream<< "aOverConstrainedVolume"; break; - case FT_OverConstrainedFace: myStream<< "aOverConstrainedFace"; break; - case FT_LinearOrQuadratic: myStream<< "aLinearOrQuadratic"; break; - case FT_GroupColor: myStream<< "aGroupColor"; break; - case FT_ElemGeomType: myStream<< "aElemGeomType"; break; - case FT_EntityType: myStream<< "aEntityType"; break; - case FT_CoplanarFaces: myStream<< "aCoplanarFaces"; break; - case FT_BallDiameter: myStream<< "aBallDiameter"; break; - case FT_ConnectedElements: myStream<< "aConnectedElements"; break; - case FT_LessThan: myStream<< "aLessThan"; break; - case FT_MoreThan: myStream<< "aMoreThan"; break; - case FT_EqualTo: myStream<< "aEqualTo"; break; - case FT_LogicalNOT: myStream<< "aLogicalNOT"; break; - case FT_LogicalAND: myStream<< "aLogicalAND"; break; - case FT_LogicalOR: myStream<< "aLogicalOR"; break; - case FT_Undefined: myStream<< "anUndefined"; break; - //default: -- commented to have a compilation warning - } - myStream<GetMeshId() : -1 ); return *this; - } - - TPythonDump& TPythonDump::operator<<(const TCollection_AsciiString & theStr) - { - myStream << theStr; return *this; - } - - - TPythonDump& TPythonDump::operator<<(SMESH::MED_VERSION theVersion) - { - switch (theVersion) { - case SMESH::MED_V2_1: myStream << "SMESH.MED_V2_1"; break; - case SMESH::MED_V2_2: myStream << "SMESH.MED_V2_2"; break; - default: myStream << theVersion; - } - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::AxisStruct & theAxis) - { - *this << "SMESH.AxisStruct( " - << TVar( theAxis.x ) << ", " - << TVar( theAxis.y ) << ", " - << TVar( theAxis.z ) << ", " - << TVar( theAxis.vx ) << ", " - << TVar( theAxis.vy ) << ", " - << TVar( theAxis.vz ) << " )"; - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::DirStruct & theDir) - { - const SMESH::PointStruct & P = theDir.PS; - *this << "SMESH.DirStruct( SMESH.PointStruct ( " - << TVar( P.x ) << ", " - << TVar( P.y ) << ", " - << TVar( P.z ) << " ))"; - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::PointStruct & P) - { - *this << "SMESH.PointStruct ( " - << TVar( P.x ) << ", " - << TVar( P.y ) << ", " - << TVar( P.z ) << " )"; - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups * theList) - { - DumpArray( *theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGO& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGBO& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const SMESH::ListOfIDSources& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const SMESH::CoincidentFreeBorders& theCFB) - { - // dump CoincidentFreeBorders as a list of lists, each enclosed list - // contains node IDs of a group of coincident free borders where - // each consequent triple of IDs describe a free border: (n1, n2, nLast) - // For example [[1, 2, 10, 20, 21, 40], [11, 12, 15, 55, 54, 41]] describes - // two groups of coincident free borders, each group including two borders - - myStream << "["; - for ( CORBA::ULong i = 0; i < theCFB.coincidentGroups.length(); ++i ) - { - const SMESH::FreeBordersGroup& aGRP = theCFB.coincidentGroups[ i ]; - if ( i ) myStream << ","; - myStream << "["; - for ( CORBA::ULong iP = 0; iP < aGRP.length(); ++iP ) - { - const SMESH::FreeBorderPart& aPART = aGRP[ iP ]; - if ( 0 <= aPART.border && aPART.border < (CORBA::Long)theCFB.borders.length() ) - { - if ( iP ) myStream << ", "; - const SMESH::FreeBorder& aBRD = theCFB.borders[ aPART.border ]; - myStream << aBRD.nodeIDs[ aPART.node1 ] << ","; - myStream << aBRD.nodeIDs[ aPART.node2 ] << ","; - myStream << aBRD.nodeIDs[ aPART.nodeLast ]; - } - } - myStream << "]"; - } - myStream << "]"; - - return *this; - } - - const char* TPythonDump::NotPublishedObjectName() - { - return theNotPublishedObjectName; - } - - TCollection_AsciiString myLongStringStart( "TPythonDump::LongStringStart" ); - TCollection_AsciiString myLongStringEnd ( "TPythonDump::LongStringEnd" ); - - //================================================================================ - /*! - * \brief Return marker of long string literal beginning - * \param type - a name of functionality producing the string literal - * \retval TCollection_AsciiString - the marker string to be written into - * a raw python script - */ - //================================================================================ - - TCollection_AsciiString TPythonDump::LongStringStart(const char* type) - { - return - myLongStringStart + - (Standard_Integer) strlen(type) + - " " + - (char*) type; - } - - //================================================================================ - /*! - * \brief Return marker of long string literal end - * \retval TCollection_AsciiString - the marker string to be written into - * a raw python script - */ - //================================================================================ - - TCollection_AsciiString TPythonDump::LongStringEnd() - { - return myLongStringEnd; - } - - //================================================================================ - /*! - * \brief Cut out a long string literal from a string - * \param theText - text possibly containing string literals - * \param theFrom - position in the text to search from - * \param theLongString - the retrieved literal - * \param theStringType - a name of functionality produced the literal - * \retval bool - true if a string literal found - * - * The literal is removed from theText; theFrom points position right after - * the removed literal - */ - //================================================================================ - - bool TPythonDump::CutoutLongString( TCollection_AsciiString & theText, - int & theFrom, - TCollection_AsciiString & theLongString, - TCollection_AsciiString & theStringType) - { - if ( theFrom < 1 || theFrom > theText.Length() ) - return false; - - // ...script \ beg marker \ \ type \ literal \ end marker \ script... - // "theText myLongStringStart7 Pattern!!! SALOME Mesh Pattern file myLongStringEndtextEnd" - // 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 - // 0 1 2 3 4 5 6 7 8 - - theFrom = theText.Location( myLongStringStart, theFrom, theText.Length() ); // = 09 - if ( !theFrom ) - return false; - - // find where literal begins - int literalBeg = theFrom + myLongStringStart.Length(); // = 26 - char* typeLenStr = (char*) theText.ToCString() + literalBeg - 1; // = "7 Pattern!!! SALO...." - int typeLen = atoi ( typeLenStr ); // = 7 - while ( *typeLenStr != ' ' ) { // look for ' ' after typeLen - literalBeg++; // 26 -> 27 - typeLenStr++; - } - literalBeg += typeLen + 1; // = 35 - if ( literalBeg > theText.Length() ) - return false; - - // where literal ends (i.e. end marker begins) - int literalEnd = theText.Location( myLongStringEnd, literalBeg, theText.Length() ); // = 64 - if ( !literalEnd ) - literalEnd = theText.Length(); - - // literal - theLongString = theText.SubString( literalBeg, literalEnd - 1); // "!!! SALOME Mesh Pattern file " - // type - theStringType = theText.SubString( literalBeg - typeLen, literalBeg - 1 ); // "Pattern" - // cut off literal - literalEnd += myLongStringEnd.Length(); // = 79 - TCollection_AsciiString textEnd = theText.SubString( literalEnd, theText.Length() ); // "textE..." - theText = theText.SubString( 1, theFrom - 1 ) + textEnd; - - return true; - } - - void printException( const char* text ) - { -#ifdef _DEBUG_ - cout << "Exception in SMESH_Gen_i::DumpPython(): " << text << endl; -#endif - } -} - -//======================================================================= -//function : RemoveTabulation -//purpose : -//======================================================================= -void RemoveTabulation( TCollection_AsciiString& theScript ) -{ - std::string aString( theScript.ToCString() ); - std::string::size_type aPos = 0; - while( aPos < aString.length() ) - { - aPos = aString.find( "\n\t", aPos ); - if( aPos == std::string::npos ) - break; - aString.replace( aPos, 2, "\n" ); - aPos++; - } - theScript = aString.c_str(); -} - -//======================================================================= -//function : DumpPython -//purpose : -//======================================================================= -Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Boolean isPublished, - CORBA::Boolean isMultiFile, - CORBA::Boolean& isValidScript) -{ - SALOMEDS::Study_var aStudy = getStudyServant(); - if (CORBA::is_nil(aStudy)) - return new Engines::TMPFile(0); - - CORBA::String_var compDataType = ComponentDataType(); - SALOMEDS::SObject_wrap aSO = aStudy->FindComponent( compDataType.in() ); - if (CORBA::is_nil(aSO)) - return new Engines::TMPFile(0); - - // Map study entries to object names - Resource_DataMapOfAsciiStringAsciiString aMap; - Resource_DataMapOfAsciiStringAsciiString aMapNames; - - SALOMEDS::ChildIterator_wrap Itr = aStudy->NewChildIterator(aSO); - for (Itr->InitEx(true); Itr->More(); Itr->Next()) { - SALOMEDS::SObject_wrap aValue = Itr->Value(); - CORBA::String_var anID = aValue->GetID(); - CORBA::String_var aName = aValue->GetName(); - TCollection_AsciiString aGUIName ( (char*) aName.in() ); - TCollection_AsciiString anEntry ( (char*) anID.in() ); - if (aGUIName.Length() > 0) { - aMapNames.Bind( anEntry, aGUIName ); - aMap.Bind( anEntry, aGUIName ); - } - } - - // Get trace of restored study - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - SALOMEDS::GenericAttribute_wrap anAttr = - aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); - - SALOMEDS::AttributePythonObject_var pyAttr = - SALOMEDS::AttributePythonObject::_narrow(anAttr); - CORBA::String_var oldValue = pyAttr->GetObject(); - TCollection_AsciiString aSavedTrace (oldValue.in()); - - // Add trace of API methods calls and replace study entries by names - TCollection_AsciiString aScript; - aScript += DumpPython_impl(aMap, aMapNames, isPublished, isMultiFile, - myIsHistoricalPythonDump, isValidScript, aSavedTrace); - - int aLen = aScript.Length(); - unsigned char* aBuffer = new unsigned char[aLen+1]; - strcpy((char*)aBuffer, aScript.ToCString()); - - CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer; - Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); - - bool hasNotPublishedObjects = aScript.Location( SMESH::theNotPublishedObjectName, 1, aLen); - isValidScript = isValidScript && !hasNotPublishedObjects; - - return aStreamFile._retn(); -} - -//============================================================================= -/*! - * AddToPythonScript - */ -//============================================================================= -void SMESH_Gen_i::AddToPythonScript (const TCollection_AsciiString& theString) -{ - if (myPythonScript.IsNull()) { - myPythonScript = new TColStd_HSequenceOfAsciiString; - } - myPythonScript->Append(theString); -} - -//============================================================================= -/*! - * RemoveLastFromPythonScript - */ -//============================================================================= -void SMESH_Gen_i::RemoveLastFromPythonScript() -{ - if (!myPythonScript.IsNull()) { - int aLen = myPythonScript->Length(); - myPythonScript->Remove(aLen); - } -} - -//======================================================================= -//function : SavePython -//purpose : -//======================================================================= -void SMESH_Gen_i::SavePython() -{ - // Dump trace of API methods calls - TCollection_AsciiString aScript = GetNewPythonLines(); - - // Check contents of PythonObject attribute - CORBA::String_var compDataType = ComponentDataType(); - SALOMEDS::SObject_wrap aSO = getStudyServant()->FindComponent( compDataType.in() ); - SALOMEDS::StudyBuilder_var aStudyBuilder = getStudyServant()->NewBuilder(); - SALOMEDS::GenericAttribute_wrap anAttr = - aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); - - SALOMEDS::AttributePythonObject_var pyAttr = - SALOMEDS::AttributePythonObject::_narrow(anAttr); - CORBA::String_var oldValue = pyAttr->GetObject(); - TCollection_AsciiString oldScript (oldValue.in()); - - if (oldScript.Length() > 0) { - oldScript += "\n"; - oldScript += aScript; - } else { - oldScript = aScript; - } - - // Store in PythonObject attribute - pyAttr->SetObject(oldScript.ToCString(), 1); - - // Clean trace of API methods calls - CleanPythonTrace(); -} - - -// impl - - -//============================================================================= -/*! - * FindEntries: Returns a sequence of start/end positions of entries in the string - */ -//============================================================================= -Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theString) -{ - Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; - Standard_Integer aLen = theString.Length(); - Standard_Boolean isFound = Standard_False; - - char* arr = (char*) theString.ToCString(); - Standard_Integer i = 0, j; - - while(i < aLen) { - int c = (int)arr[i]; - j = i+1; - if ( isdigit( c )) { //Is digit? - - isFound = Standard_False; - while((j < aLen) && ( isdigit(c) || c == ':' )) { //Check if it is an entry - c = (int)arr[j++]; - if(c == ':') isFound = Standard_True; - } - - if (isFound) { - int prev = (i < 1) ? 0 : (int)arr[i - 1]; - // to distinguish from a sketcher command: - // last char should be a digit, not ":", - // previous char should not be '"'. - if (arr[j-2] != ':' && prev != '"') { - aSeq->Append(i+1); // +1 because AsciiString starts from 1 - aSeq->Append(j-1); - } - } - } - - i = j; - } - - return aSeq; -} - -namespace { - - //================================================================================ - /*! - * \brief Make a string be a valid python name - * \param aName - a string to fix - * \retval bool - true if aName was not modified - */ - //================================================================================ - - bool fixPythonName(TCollection_AsciiString & aName) - { - bool isValidName = true; - int nbUnderscore = 0; - int p; - // replace not allowed chars by underscore - const char* name = aName.ToCString(); - for ( p = 0; name[p]; ++p ) { - if ( !isalnum( name[p] ) && name[p] != '_' ) - { - if ( p == 0 || p+1 == aName.Length() || name[p-1] == '_') - { - aName.Remove( p+1, 1 ); // remove __ and _ from the start and the end - --p; - name = aName.ToCString(); - } - else - { - aName.SetValue( p+1, '_'); - nbUnderscore++; - } - isValidName = false; - } - } - // aName must not start with a digit - if ( aName.IsIntegerValue() ) { - aName.Insert( 1, 'a' ); - isValidName = false; - } - // shorten names like CartesianParameters3D_400_400_400_1000000_1 - const int nbAllowedUnderscore = 3; /* changed from 2 to 3 by an user request - posted to SALOME Forum */ - if ( aName.Length() > 20 && nbUnderscore > nbAllowedUnderscore ) - { - p = aName.Location( "_", 20, aName.Length()); - if ( p > 1 ) - aName.Trunc( p-1 ); - } - return isValidName; - } - - //================================================================================ - /*! - * \brief Return Python module names of available plug-ins. - */ - //================================================================================ - - std::vector getPluginNames() - { - std::vector pluginNames; - std::vector< std::string > xmlPaths = SMESH_Gen::GetPluginXMLPaths(); - LDOMParser xmlParser; - for ( size_t i = 0; i < xmlPaths.size(); ++i ) - { - bool error = xmlParser.parse( xmlPaths[i].c_str() ); - if ( error ) - { - TCollection_AsciiString data; - INFOS( xmlParser.GetError(data) ); - continue; - } - // - LDOM_Document xmlDoc = xmlParser.getDocument(); - LDOM_NodeList nodeList = xmlDoc.getElementsByTagName( "meshers-group" ); - for ( int i = 0; i < nodeList.getLength(); ++i ) - { - LDOM_Node node = nodeList.item( i ); - LDOM_Element& elem = (LDOM_Element&) node; - LDOMString idlModule = elem.getAttribute( "idl-module" ); - if ( strlen( idlModule.GetString() ) > 0 ) - pluginNames.push_back( idlModule.GetString() ); - } - } - return pluginNames; - } -} - -//================================================================================ -/*! - * \brief Createa a Dump Python script - * \param [in,out] theObjectNames - map of an entry to a study and python name - * \param [in] theNames - - map of an entry to a study name - * \param [in] isPublished - \c true if dump of object publication in study is needed - * \param [in] isMultiFile - \c true if dump of each module goes to a separate file - * \param [in] isHistoricalDump - \c true if removed object should be dumped - * \param [out] aValidScript - returns \c true if the returned script seems valid - * \param [in,out] theSavedTrace - the dump stored in the study. It's cleared to - * decrease memory usage. - * \return TCollection_AsciiString - the result dump script. - */ -//================================================================================ - -TCollection_AsciiString SMESH_Gen_i::DumpPython_impl - (Resource_DataMapOfAsciiStringAsciiString& theObjectNames, - Resource_DataMapOfAsciiStringAsciiString& theNames, - bool isPublished, - bool isMultiFile, - bool isHistoricalDump, - bool& aValidScript, - TCollection_AsciiString& theSavedTrace) -{ - SMESH_TRY; - - const TCollection_AsciiString aSmeshpy ( SMESH_2smeshpy::SmeshpyName() ); - const TCollection_AsciiString aSMESHGen( SMESH_2smeshpy::GenName() ); - const TCollection_AsciiString anOldGen ( SMESH::TPythonDump::SMESHGenName() ); - const TCollection_AsciiString helper; // to comfortably append C strings to TCollection_AsciiString - const TCollection_AsciiString tab( isMultiFile ? "\t" : "" ), nt = helper + "\n" + tab; - - std::list< TCollection_AsciiString > lines; // lines of a script - std::list< TCollection_AsciiString >::iterator linesIt; - - if ( isPublished ) - lines.push_back( aSMESHGen + " = smeshBuilder.New()" ); - else - lines.push_back( aSMESHGen + " = smeshBuilder.New(False)" ); - lines.push_back( helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()" ); - lines.push_back( helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()" ); - - // Treat dump trace of restored study - if (theSavedTrace.Length() > 0) - { - linesIt = --lines.end(); - // Split theSavedTrace into lines - int from = 1, end = theSavedTrace.Length(), to; - while ( from < end && ( to = theSavedTrace.Location( "\n", from, end ))) - { - if ( theSavedTrace.ToCString()[from-1] == '\t' ) - ++from; - if ( to != from ) - lines.push_back( theSavedTrace.SubString( from, to - 1 )); - from = to + 1; - } - // For the conversion of IDL API calls -> smeshBuilder.py API, "smesh" standing for SMESH_Gen - // was replaces with "smeshgen" (==TPythonDump::SMESHGenName()). - // Change "smesh" -> "smeshgen" in the trace saved before passage to smeshBuilder.py API - bool isNewVersion = - theSavedTrace.Location( anOldGen + ".", 1, theSavedTrace.Length() ); - theSavedTrace.Clear(); - if ( !isNewVersion ) - { - const TCollection_AsciiString aSmeshCall ( "smesh." ), gen( "gen" ); - int beg, end, from; - for ( ++linesIt; linesIt != lines.end(); ++linesIt ) - { - TCollection_AsciiString& aSavedLine = *linesIt; - end = aSavedLine.Length(), from = 1; - while ( from < end && ( beg = aSavedLine.Location( aSmeshCall, from, end ))) - { - char charBefore = ( beg == 1 ) ? ' ' : aSavedLine.Value( beg - 1 ); - if ( isspace( charBefore ) || charBefore == '=' ) { // "smesh." is not a part of a long word - aSavedLine.Insert( beg + aSmeshCall.Length() - 1, gen );// "smesh" -> "smeshgen" - end += gen.Length(); - } - from = beg + aSmeshCall.Length(); - } - } - } - } - - // Add new dump trace of API methods calls to script lines - if (!myPythonScript.IsNull()) - { - Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScript; - Standard_Integer istr, aLen = aPythonScript->Length(); - for (istr = 1; istr <= aLen; istr++) - lines.push_back( aPythonScript->Value( istr )); - } - - // Convert IDL API calls into smeshBuilder.py API. - // Some objects are wrapped with python classes and - // Resource_DataMapOfAsciiStringAsciiString holds methods returning wrapped objects - Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod; - std::set< TCollection_AsciiString > aRemovedObjIDs; - if ( !getenv("NO_2smeshpy_conversion")) - SMESH_2smeshpy::ConvertScript( lines, anEntry2AccessorMethod, - theObjectNames, aRemovedObjIDs, - isHistoricalDump ); - - bool importGeom = false; - GEOM::GEOM_Gen_ptr geom = GetGeomEngine(); - { - // Add names of GEOM objects to theObjectNames to exclude same names of SMESH objects - GEOM::string_array_var aGeomNames = geom->GetAllDumpNames(); - int ign = 0, nbgn = aGeomNames->length(); - for (; ign < nbgn; ign++) { - TCollection_AsciiString aName = aGeomNames[ign].in(); - theObjectNames.Bind(aName, "1"); - } - } - - TCollection_AsciiString anUpdatedScript; - - Resource_DataMapOfAsciiStringAsciiString mapRemoved; - Resource_DataMapOfAsciiStringAsciiString mapEntries; // names and entries present in anUpdatedScript - Standard_Integer objectCounter = 0; - TCollection_AsciiString anEntry, aName, aGUIName, aBaseName("smeshObj_"); - - // Treat every script line and add it to anUpdatedScript - for ( linesIt = lines.begin(); linesIt != lines.end(); ++linesIt ) - { - TCollection_AsciiString& aLine = *linesIt; - anUpdatedScript += tab; - { - //Replace characters used instead of quote marks to quote notebook variables - int pos = 1; - while (( pos = aLine.Location( 1, SMESH::TVar::Quote(), pos, aLine.Length() ))) - aLine.SetValue( pos, '"' ); - } - // Find entries to be replaced by names - Handle(TColStd_HSequenceOfInteger) aSeq = FindEntries(aLine); - const Standard_Integer aSeqLen = aSeq->Length(); - Standard_Integer aStart = 1; - for (Standard_Integer i = 1; i <= aSeqLen; i += 2) - { - if ( aStart < aSeq->Value(i) ) - anUpdatedScript += aLine.SubString( aStart, aSeq->Value(i) - 1 ); // line part before i-th entry - anEntry = aLine.SubString( aSeq->Value(i), aSeq->Value(i + 1) ); - // is a GEOM object? - CORBA::String_var geomName = geom->GetDumpName( anEntry.ToCString() ); - if ( !geomName.in() || !geomName.in()[0] ) { - // is a SMESH object - if ( theObjectNames.IsBound( anEntry )) { - // The Object is in Study - aName = theObjectNames.Find( anEntry ); - // check validity of aName - bool isValidName = fixPythonName( aName ); - if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) { - // diff objects have same name - make a new name by appending a digit - TCollection_AsciiString aName2; - Standard_Integer i = 0; - do { - aName2 = aName + "_" + ++i; - } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2)); - aName = aName2; - isValidName = false; - } - if ( !isValidName ) - theObjectNames(anEntry) = aName; - - if ( aLine.Value(1) != '#' ) - mapEntries.Bind(anEntry, aName); - } - else - { - // Removed Object - do { - aName = aBaseName + (++objectCounter); - } while (theObjectNames.IsBound(aName)); - - if ( !aRemovedObjIDs.count( anEntry ) && aLine.Value(1) != '#') - mapRemoved.Bind(anEntry, aName); - - theObjectNames.Bind(anEntry, aName); - } - theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects - } - else - { - aName = geomName.in(); - importGeom = true; - } - anUpdatedScript += aName; - aStart = aSeq->Value(i + 1) + 1; - - } // loop on entries within aLine - - if ( aSeqLen == 0 ) - anUpdatedScript += aLine; - else if ( aSeq->Value( aSeqLen ) < aLine.Length() ) - anUpdatedScript += aLine.SubString( aSeq->Value(aSeqLen) + 1, aLine.Length() ); - - anUpdatedScript += '\n'; - } - - // Make an initial part of aSript - - TCollection_AsciiString initPart = "import "; - if ( isMultiFile ) - initPart += "salome, "; - initPart += " SMESH, SALOMEDS\n"; - initPart += "from salome.smesh import smeshBuilder\n"; - if ( importGeom && isMultiFile ) - { - initPart += ("\n## import GEOM dump file ## \n" - "import string, os, sys, re, inspect\n" - "thisFile = inspect.getfile( inspect.currentframe() )\n" - "thisModule = os.path.splitext( os.path.basename( thisFile ))[0]\n" - "sys.path.insert( 0, os.path.dirname( thisFile ))\n" - "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",thisModule)+\" import *\")\n\n"); - } - // import python files corresponding to plugins if they are used in anUpdatedScript - { - TCollection_AsciiString importStr; - std::vector pluginNames = getPluginNames(); - for ( size_t i = 0; i < pluginNames.size(); ++i ) - { - // Convert access to plugin members: - // e.g. StdMeshers.QUAD_REDUCED -> StdMeshersBuilder.QUAD_REDUCED - TCollection_AsciiString pluginAccess = (pluginNames[i] + ".").c_str() ; - int iFrom = 1, iPos; - while (( iPos = anUpdatedScript.Location( pluginAccess, iFrom, anUpdatedScript.Length() ))) - { - anUpdatedScript.Insert( iPos + pluginNames[i].size(), "Builder" ); - iFrom = iPos + pluginNames[i].size() + 8; - } - // if any plugin member is used, import the plugin - if ( iFrom > 1 ) - importStr += ( helper + "\n" "from salome." + pluginNames[i].c_str() + - " import " + pluginNames[i].c_str() +"Builder" ); - } - if ( !importStr.IsEmpty() ) - initPart += importStr + "\n"; - } - - if ( isMultiFile ) - initPart += "def RebuildData():"; - initPart += "\n"; - - anUpdatedScript.Prepend( initPart ); - - // Make a final part of aScript - - // Dump object removal - TCollection_AsciiString removeObjPart; - if ( !mapRemoved.IsEmpty() ) { - removeObjPart += nt + "## some objects were removed"; - removeObjPart += nt + "aStudyBuilder = salome.myStudy.NewBuilder()"; - Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapRemovedIt; - for ( mapRemovedIt.Initialize( mapRemoved ); mapRemovedIt.More(); mapRemovedIt.Next() ) { - aName = mapRemovedIt.Value(); // python name - anEntry = mapRemovedIt.Key(); - removeObjPart += nt + "SO = salome.myStudy.FindObjectIOR(salome.myStudy.ConvertObjectToIOR("; - removeObjPart += aName; - // for object wrapped by class of smeshBuilder.py - if ( anEntry2AccessorMethod.IsBound( anEntry ) ) - removeObjPart += helper + "." + anEntry2AccessorMethod( anEntry ); - removeObjPart += helper + "))" + nt + "if SO: aStudyBuilder.RemoveObjectWithChildren(SO)"; - } - } - - // Set object names - TCollection_AsciiString setNamePart; - Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapEntriesIt; - for ( mapEntriesIt.Initialize( mapEntries ); mapEntriesIt.More(); mapEntriesIt.Next() ) - { - anEntry = mapEntriesIt.Key(); - aName = mapEntriesIt.Value(); // python name - if ( theNames.IsBound( anEntry )) - { - aGUIName = theNames.Find(anEntry); - aGUIName.RemoveAll('\''); // remove a quote from a name (issue 22360) - setNamePart += nt + aSMESHGen + ".SetName(" + aName; - if ( anEntry2AccessorMethod.IsBound( anEntry ) ) - setNamePart += helper + "." + anEntry2AccessorMethod( anEntry ); - setNamePart += helper + ", '" + aGUIName + "')"; - } - } - if ( !setNamePart.IsEmpty() ) - { - setNamePart.Insert( 1, nt + "## Set names of Mesh objects" ); - } - - // Store visual properties of displayed objects - - TCollection_AsciiString visualPropertiesPart; - if (isPublished) - { - //Output the script that sets up the visual parameters. - CORBA::String_var compDataType = ComponentDataType(); - CORBA::String_var script = getStudyServant()->GetDefaultScript( compDataType.in(), tab.ToCString() ); - if ( script.in() && script.in()[0] ) { - visualPropertiesPart += nt + "### Store presentation parameters of displayed objects\n"; - visualPropertiesPart += script.in(); - } - } - - anUpdatedScript += removeObjPart + '\n' + setNamePart + '\n' + visualPropertiesPart; - - if ( isMultiFile ) - { - anUpdatedScript += - "\n\tpass" - "\n" - "\nif __name__ == '__main__':" - "\n\tSMESH_RebuildData = RebuildData" - "\n\texec('import '+re.sub('SMESH$','GEOM',thisModule)+' as GEOM_dump')" - "\n\tGEOM_dump.RebuildData()" - "\n\texec('from '+re.sub('SMESH$','GEOM',thisModule)+' import * ')" - "\n\tSMESH_RebuildData()"; - } - anUpdatedScript += "\n"; - - // no need now as we use 'tab' and 'nt' variables depending on isMultiFile - // if( !isMultiFile ) // remove unnecessary tabulation - // RemoveTabulation( anUpdatedScript ); - - // ----------------------------------------------------------------- - // put string literals describing patterns into separate functions - // ----------------------------------------------------------------- - - TCollection_AsciiString aLongString, aFunctionType; - int where = 1; - std::set< std::string > functionNameSet; - while ( SMESH::TPythonDump::CutoutLongString( anUpdatedScript, where, aLongString, aFunctionType )) - { - // make a python string literal - aLongString.Prepend(":\n\treturn '''\n"); - aLongString += "\n\t'''\n\tpass\n"; - - TCollection_AsciiString functionName; - - // check if the function returning this literal is already defined - int posAlready = anUpdatedScript.Location( aLongString, where, anUpdatedScript.Length() ); - if ( posAlready ) // already defined - { - // find the function name - int functBeg = posAlready; - char* script = (char*) anUpdatedScript.ToCString() + posAlready - 1; // look at ":" after "def fuction()" - while ( *script != ' ' ) { - script--; - functBeg--; - } - functBeg++; // do not take ' ' - posAlready--; // do not take ':' - functionName = anUpdatedScript.SubString( functBeg, posAlready ); - } - else // not defined yet - { - // find a unique function name - fixPythonName( aFunctionType ); - Standard_Integer nb = 0; - do functionName = aFunctionType + "_" + ( nb++ ) + "()"; - while ( !functionNameSet.insert( functionName.ToCString() ).second ); - - // define function - TCollection_AsciiString funDef = helper + "def " + functionName + aLongString; - if ( isMultiFile ) - { - anUpdatedScript += helper + "\n\n" + funDef; - } - else - { - funDef += "\n\n"; - anUpdatedScript.Insert( 1, funDef); - where += funDef.Length(); - } - } - anUpdatedScript.InsertBefore( where, functionName ); // call function - } - - aValidScript = true; - - return anUpdatedScript; - - SMESH_CATCH( SMESH::printException ); - - aValidScript = false; - return ""; -} - -//============================================================================= -/*! - * GetNewPythonLines - */ -//============================================================================= -TCollection_AsciiString SMESH_Gen_i::GetNewPythonLines() -{ - TCollection_AsciiString aScript; - - // Dump trace of API methods calls - if (!myPythonScript.IsNull()) { - Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScript; - Standard_Integer istr, aLen = aPythonScript->Length(); - for (istr = 1; istr <= aLen; istr++) { - aScript += "\n"; - aScript += aPythonScript->Value(istr); - } - aScript += "\n"; - } - - return aScript; -} - -//============================================================================= -/*! - * CleanPythonTrace - */ -//============================================================================= -void SMESH_Gen_i::CleanPythonTrace() -{ - TCollection_AsciiString aScript; - - // Clean trace of API methods calls - if (!myPythonScript.IsNull()) { - myPythonScript->Clear(); - } -} diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index a31b802b2..10f2755fb 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -131,6 +131,7 @@ #include #include +#include #include #include @@ -2943,6 +2944,22 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CopyMesh(SMESH::SMESH_IDSource_ptr meshPart, return newMesh._retn(); } +//================================================================================ +/*! + * \brief Get version of MED format being used. + */ +//================================================================================ + +char* SMESH_Gen_i::GetMEDFileVersion() +{ + MED::TInt majeur, mineur, release; + majeur = mineur = release = 0; + MED::GetVersionRelease(majeur, mineur, release); + std::ostringstream version; + version << majeur << "." << mineur << "." << release; + return CORBA::string_dup( version.str().c_str() ); +} + //================================================================================ /*! * SMESH_Gen_i::GetMEDVersion @@ -2950,17 +2967,22 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CopyMesh(SMESH::SMESH_IDSource_ptr meshPart, * Get MED version of the file by its name */ //================================================================================ -CORBA::Boolean SMESH_Gen_i::GetMEDVersion(const char* theFileName, - SMESH::MED_VERSION& theVersion) +char* SMESH_Gen_i::GetMEDVersion(const char* theFileName) { - theVersion = SMESH::MED_V2_1; - MED::EVersion aVersion = MED::GetVersionId( theFileName ); - switch( aVersion ) { - case MED::eV2_1 : theVersion = SMESH::MED_V2_1; return true; - case MED::eV2_2 : theVersion = SMESH::MED_V2_2; return true; - case MED::eVUnknown : return false; - } - return false; + std::string version = MED::GetMEDVersion( theFileName ); + return CORBA::string_dup( version.c_str() ); +} + +//================================================================================ +/*! + * SMESH_Gen_i::CheckCompatibility + * + * Check compatibility of file with MED format being used. + */ +//================================================================================ +CORBA::Boolean SMESH_Gen_i::CheckCompatibility(const char* theFileName) +{ + return MED::CheckCompatibility( theFileName ); } //================================================================================ @@ -2973,7 +2995,7 @@ CORBA::Boolean SMESH_Gen_i::GetMEDVersion(const char* theFileName, SMESH::string_array* SMESH_Gen_i::GetMeshNames(const char* theFileName) { SMESH::string_array_var aResult = new SMESH::string_array(); - MED::PWrapper aMed = MED::CrWrapper( theFileName ); + MED::PWrapper aMed = MED::CrWrapperR( theFileName ); MED::TErr anErr; MED::TInt aNbMeshes = aMed->GetNbMeshes( &anErr ); if( anErr >= 0 ) { diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 53921ba64..b67e4f1dd 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -383,9 +383,14 @@ public: CORBA::Double mergeTolerance) throw ( SALOME::SALOME_Exception ); + // Get version of MED format being used. + char* GetMEDFileVersion(); + // Get MED version of the file by its name - CORBA::Boolean GetMEDVersion(const char* theFileName, - SMESH::MED_VERSION& theVersion); + char* GetMEDVersion(const char* theFileName); + + // Check compatibility of file with MED format being used. + CORBA::Boolean CheckCompatibility(const char* theFileName); // Get names of meshes defined in file with the specified name SMESH::string_array* GetMeshNames(const char* theFileName); diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index d030cbc93..c9c4013ad 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -402,8 +402,8 @@ SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName ) CreateGroupServants(); int major, minor, release; - if( !MED::getMEDVersion( theFileName, major, minor, release ) ) - major = minor = release = -1; + major = minor = release = 0; + MED::GetMEDVersion(theFileName, major, minor, release); _medFileInfo = new SMESH::MedFileInfo(); _medFileInfo->fileName = theFileName; _medFileInfo->fileSize = 0; @@ -443,19 +443,6 @@ SMESH::DriverMED_ReadStatus SMESH_Mesh_i::ImportCGNSFile( const char* theFileNa return ConvertDriverMEDReadStatus(status); } -//================================================================================ -/*! - * \brief Return string representation of a MED file version comprising nbDigits - */ -//================================================================================ - -char* SMESH_Mesh_i::GetVersionString(SMESH::MED_VERSION version, CORBA::Short nbDigits) -{ - string ver = DriverMED_W_SMESHDS_Mesh::GetVersionString(MED::EVersion(version), - nbDigits); - return CORBA::string_dup( ver.c_str() ); -} - //============================================================================= /*! * ImportUNVFile @@ -2973,15 +2960,14 @@ string SMESH_Mesh_i::prepareMeshNameAndGroups(const char* file, //================================================================================ /*! - * \brief Export to med file + * \brief Export to MED file */ //================================================================================ -void SMESH_Mesh_i::ExportToMEDX (const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION theVersion, - CORBA::Boolean overwrite, - CORBA::Boolean autoDimension) +void SMESH_Mesh_i::ExportMED(const char* file, + CORBA::Boolean auto_groups, + CORBA::Boolean overwrite, + CORBA::Boolean autoDimension) throw(SALOME::SALOME_Exception) { SMESH_TRY; @@ -2989,43 +2975,16 @@ void SMESH_Mesh_i::ExportToMEDX (const char* file, _preMeshInfo->FullLoadFromFile(); string aMeshName = prepareMeshNameAndGroups(file, overwrite); - _impl->ExportMED( file, aMeshName.c_str(), auto_groups, theVersion, 0, autoDimension ); + _impl->ExportMED( file, aMeshName.c_str(), auto_groups, 0, autoDimension ); - TPythonDump() << SMESH::SMESH_Mesh_var(_this()) << ".ExportToMEDX( r'" + TPythonDump() << SMESH::SMESH_Mesh_var(_this()) << ".ExportMED( r'" << file << "', " << auto_groups << ", " - << theVersion << ", " << overwrite << ", " + << overwrite << ", " << autoDimension << " )"; SMESH_CATCH( SMESH::throwCorbaException ); } -//================================================================================ -/*! - * \brief Export a mesh to a med file - */ -//================================================================================ - -void SMESH_Mesh_i::ExportToMED (const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION theVersion) - throw(SALOME::SALOME_Exception) -{ - ExportToMEDX(file,auto_groups,theVersion,true); -} - -//================================================================================ -/*! - * \brief Export a mesh to a med file - */ -//================================================================================ - -void SMESH_Mesh_i::ExportMED (const char* file, - CORBA::Boolean auto_groups) - throw(SALOME::SALOME_Exception) -{ - ExportToMEDX(file,auto_groups,SMESH::MED_V2_2,true); -} - //================================================================================ /*! * \brief Export a mesh to a SAUV file @@ -3131,7 +3090,6 @@ void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii) void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, const char* file, CORBA::Boolean auto_groups, - SMESH::MED_VERSION version, CORBA::Boolean overwrite, CORBA::Boolean autoDimension, const GEOM::ListOfFields& fields, @@ -3185,7 +3143,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, { aMeshName = prepareMeshNameAndGroups(file, overwrite); _impl->ExportMED( file, aMeshName.c_str(), auto_groups, - version, 0, autoDimension, /*addODOnVertices=*/have0dField); + 0, autoDimension, /*addODOnVertices=*/have0dField); meshDS = _impl->GetMeshDS(); } else @@ -3203,7 +3161,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, SMESH_MeshPartDS* partDS = new SMESH_MeshPartDS( meshPart ); _impl->ExportMED( file, aMeshName.c_str(), auto_groups, - version, partDS, autoDimension, /*addODOnVertices=*/have0dField); + partDS, autoDimension, /*addODOnVertices=*/have0dField); meshDS = tmpDSDeleter._obj = partDS; } @@ -3229,7 +3187,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, } TPythonDump() << _this() << ".ExportPartToMED( " << meshPart << ", r'" << file << "', " - << auto_groups << ", " << version << ", " << overwrite << ", " + << auto_groups << ", " << overwrite << ", " << autoDimension << ", " << goList << ", '" << ( geomAssocFields ? geomAssocFields : "" ) << "'" << " )"; diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index f4c2cf71b..4e809d7a3 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -225,21 +225,11 @@ public: * Consider maximum group name length stored in MED file. */ CORBA::Boolean HasDuplicatedGroupNamesMED(); - /*! - * Return string representation of a MED file version comprising nbDigits - */ - char* GetVersionString(SMESH::MED_VERSION version, CORBA::Short nbDigits); - void ExportToMEDX( const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION version, - CORBA::Boolean overwrite, - CORBA::Boolean autoDimension=true) throw (SALOME::SALOME_Exception); - void ExportToMED ( const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION version ) throw (SALOME::SALOME_Exception); - void ExportMED ( const char* file, - CORBA::Boolean auto_groups ) throw (SALOME::SALOME_Exception); + void ExportMED( const char* file, + CORBA::Boolean auto_groups, + CORBA::Boolean overwrite, + CORBA::Boolean autoDimension = true) throw (SALOME::SALOME_Exception); void ExportSAUV( const char* file, CORBA::Boolean auto_groups ) throw (SALOME::SALOME_Exception); @@ -256,7 +246,6 @@ public: void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, const char* file, CORBA::Boolean auto_groups, - SMESH::MED_VERSION version, CORBA::Boolean overwrite, CORBA::Boolean autoDim, const GEOM::ListOfFields& fields, @@ -316,7 +305,7 @@ public: CORBA::Long NbPolygons() throw (SALOME::SALOME_Exception); - CORBA::Long NbPolygonsOfOrder(SMESH::ElementOrder order=SMESH::ORDER_ANY) + CORBA::Long NbPolygonsOfOrder(SMESH::ElementOrder order = SMESH::ORDER_ANY) throw (SALOME::SALOME_Exception); CORBA::Long NbVolumes() diff --git a/src/SMESH_I/SMESH_PreMeshInfo.cxx b/src/SMESH_I/SMESH_PreMeshInfo.cxx index e11046e1b..62930b818 100644 --- a/src/SMESH_I/SMESH_PreMeshInfo.cxx +++ b/src/SMESH_I/SMESH_PreMeshInfo.cxx @@ -460,10 +460,7 @@ bool SMESH_PreMeshInfo::readMeshInfo() { _isInfoOk = true; - MED::PWrapper aMed = MED::CrWrapper(_medFileName,true); - // if ( aMed->GetVersion() != MED::eV2_2 ) - // return false; - + MED::PWrapper aMed = MED::CrWrapperR(_medFileName); MED::PMeshInfo medMeshInfo = aMed->CrMeshInfo(3,3,SMESH_Comment( _meshID )); // read nb nodes @@ -516,7 +513,7 @@ void SMESH_PreMeshInfo::readGroupInfo() map< int, vector< SMESH_PreMeshInfo* > > famId2grInfo; - MED::PWrapper aMed = MED::CrWrapper(_medFileName,false); + MED::PWrapper aMed = MED::CrWrapperR(_medFileName); MED::PMeshInfo medMeshInfo = aMed->CrMeshInfo(3,3,SMESH_Comment( _meshID )); // read families to fill in famId2grInfo diff --git a/src/SMESH_I/SMESH_PythonDump.cxx b/src/SMESH_I/SMESH_PythonDump.cxx new file mode 100644 index 000000000..d92f15da7 --- /dev/null +++ b/src/SMESH_I/SMESH_PythonDump.cxx @@ -0,0 +1,1382 @@ +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESH_DumpPython.cxx +// Created : Thu Mar 24 17:17:59 2005 +// Author : Julia DOROVSKIKH +// Module : SMESH + +#include "SMESH_PythonDump.hxx" + +#include "SMESH_2smeshpy.hxx" +#include "SMESH_Comment.hxx" +#include "SMESH_Filter_i.hxx" +#include "SMESH_Gen_i.hxx" +#include "SMESH_MeshEditor_i.hxx" + +#include + +#include +#include +#include +#include + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + +#include "SMESH_TryCatch.hxx" + +namespace SMESH +{ + + size_t TPythonDump::myCounter = 0; + const char theNotPublishedObjectName[] = "__NOT__Published__Object__"; + + TVar::TVar(CORBA::Double value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::Long value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::Short value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(const SMESH::double_array& value):myVals(value.length()), myIsList(true) + { + for ( size_t i = 0; i < value.length(); i++) + myVals[i] = SMESH_Comment(value[i]); + } + + TPythonDump:: + TPythonDump():myVarsCounter(0) + { + ++myCounter; + } + TPythonDump:: + ~TPythonDump() + { + if(--myCounter == 0){ + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + std::string aString = myStream.str(); + TCollection_AsciiString aCollection(Standard_CString(aString.c_str())); + if(!aCollection.IsEmpty()) + { + const std::string & objEntry = SMESH_Gen_i::GetSMESHGen()->GetLastObjEntry(); + if ( !objEntry.empty() ) + aCollection += (TVar::ObjPrefix() + objEntry ).c_str(); + aSMESHGen->AddToPythonScript(aCollection); + if(MYDEBUG) MESSAGE(aString); + // prevent misuse of already treated variables + aSMESHGen->UpdateParameters(CORBA::Object_var().in(),""); + } + } + } + + TPythonDump& //!< store a variable value. Write either a value or '$varID$' + TPythonDump:: + operator<<(const TVar& theVarValue) + { + const std::vector< int >& varIDs = SMESH_Gen_i::GetSMESHGen()->GetLastParamIndices(); + if ( theVarValue.myIsList ) + { + myStream << "[ "; + for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i ) + { + if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) + myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); + else + myStream << theVarValue.myVals[i-1]; + if ( i < theVarValue.myVals.size() ) + myStream << ", "; + ++myVarsCounter; + } + myStream << " ]"; + } + else + { + if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) + myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); + else + myStream << theVarValue.myVals[0]; + ++myVarsCounter; + } + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(long int theArg){ + myStream< + void DumpArray(const TArray& theArray, TPythonDump & theStream) + { + if ( theArray.length() == 0 ) + { + theStream << "[]"; + } + else + { + theStream << "[ "; + for (CORBA::ULong i = 1; i <= theArray.length(); i++) { + theStream << theArray[i-1]; + if ( i < theArray.length() ) + theStream << ", "; + } + theStream << " ]"; + } + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::long_array& theArg) + { + DumpArray( theArg, *this ); + return *this; + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::double_array& theArg) + { + DumpArray( theArg, *this ); + return *this; + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::nodes_array& theArg) + { + DumpArray( theArg, *this ); + return *this; + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::string_array& theArray) + { + myStream << "[ "; + for ( CORBA::ULong i = 1; i <= theArray.length(); i++ ) { + myStream << "'" << theArray[i-1] << "'"; + if ( i < theArray.length() ) + myStream << ", "; + } + myStream << " ]"; + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(SALOMEDS::SObject_ptr aSObject) + { + if ( !aSObject->_is_nil() ) { + CORBA::String_var entry = aSObject->GetID(); + myStream << entry.in(); + } + else { + myStream << theNotPublishedObjectName; + } + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(CORBA::Object_ptr theArg) + { + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); + if(!aSObject->_is_nil()) { + CORBA::String_var id = aSObject->GetID(); + myStream << id; + } else if ( !CORBA::is_nil(theArg)) { + if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object + myStream << "smeshObj_" << size_t(theArg); + else + myStream << theNotPublishedObjectName; + } + else + myStream << "None"; + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(SMESH::SMESH_Hypothesis_ptr theArg) + { + SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); + if(aSObject->_is_nil() && !CORBA::is_nil(theArg)) + myStream << "hyp_" << theArg->GetId(); + else + *this << aSObject; + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(SMESH::SMESH_IDSource_ptr theArg) + { + if ( CORBA::is_nil( theArg ) ) + return *this << "None"; + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(theArg); + if(!aSObject->_is_nil()) + { + return *this << aSObject; + } + if ( SMESH::Filter_i* filter = SMESH::DownCast( theArg )) + { + return *this << filter; + } + if ( SMESH_MeshEditor_i::IsTemporaryIDSource( theArg )) + { + SMESH::SMESH_Mesh_var mesh = theArg->GetMesh(); + SMESH::long_array_var anElementsId = theArg->GetIDs(); + SMESH::array_of_ElementType_var types = theArg->GetTypes(); + SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL; + SALOMEDS::SObject_wrap meshSO = SMESH_Gen_i::ObjectToSObject(mesh); + if ( meshSO->_is_nil() ) // don't waste memory for dumping not published objects + return *this << mesh << ".GetIDSource([], " << type << ")"; + else + return *this << mesh << ".GetIDSource(" << anElementsId << ", " << type << ")"; + } + return *this << theNotPublishedObjectName; + } + + TPythonDump& + TPythonDump:: + operator<<(SMESH::FilterLibrary_i* theArg) + { + myStream<<"aFilterLibrary"<GetFunctorType(); + switch(aFunctorType) { + case FT_AspectRatio: myStream<< "aAspectRatio"; break; + case FT_AspectRatio3D: myStream<< "aAspectRatio3D"; break; + case FT_Warping: myStream<< "aWarping"; break; + case FT_MinimumAngle: myStream<< "aMinimumAngle"; break; + case FT_Taper: myStream<< "aTaper"; break; + case FT_Skew: myStream<< "aSkew"; break; + case FT_Area: myStream<< "aArea"; break; + case FT_Volume3D: myStream<< "aVolume3D"; break; + case FT_MaxElementLength2D: myStream<< "aMaxElementLength2D"; break; + case FT_MaxElementLength3D: myStream<< "aMaxElementLength3D"; break; + case FT_FreeBorders: myStream<< "aFreeBorders"; break; + case FT_FreeEdges: myStream<< "aFreeEdges"; break; + case FT_FreeNodes: myStream<< "aFreeNodes"; break; + case FT_FreeFaces: myStream<< "aFreeFaces"; break; + case FT_EqualNodes: myStream<< "aEqualNodes"; break; + case FT_EqualEdges: myStream<< "aEqualEdges"; break; + case FT_EqualFaces: myStream<< "aEqualFaces"; break; + case FT_EqualVolumes: myStream<< "aEqualVolumes"; break; + case FT_MultiConnection: myStream<< "aMultiConnection"; break; + case FT_MultiConnection2D: myStream<< "aMultiConnection2D"; break; + case FT_Length: myStream<< "aLength"; break; + case FT_Length2D: myStream<< "aLength2D"; break; + case FT_NodeConnectivityNumber:myStream<< "aNodeConnectivityNumber";break; + case FT_BelongToMeshGroup: myStream<< "aBelongToMeshGroup"; break; + case FT_BelongToGeom: myStream<< "aBelongToGeom"; break; + case FT_BelongToPlane: myStream<< "aBelongToPlane"; break; + case FT_BelongToCylinder: myStream<< "aBelongToCylinder"; break; + case FT_BelongToGenSurface: myStream<< "aBelongToGenSurface"; break; + case FT_LyingOnGeom: myStream<< "aLyingOnGeom"; break; + case FT_RangeOfIds: myStream<< "aRangeOfIds"; break; + case FT_BadOrientedVolume: myStream<< "aBadOrientedVolume"; break; + case FT_BareBorderVolume: myStream<< "aBareBorderVolume"; break; + case FT_BareBorderFace: myStream<< "aBareBorderFace"; break; + case FT_OverConstrainedVolume: myStream<< "aOverConstrainedVolume"; break; + case FT_OverConstrainedFace: myStream<< "aOverConstrainedFace"; break; + case FT_LinearOrQuadratic: myStream<< "aLinearOrQuadratic"; break; + case FT_GroupColor: myStream<< "aGroupColor"; break; + case FT_ElemGeomType: myStream<< "aElemGeomType"; break; + case FT_EntityType: myStream<< "aEntityType"; break; + case FT_CoplanarFaces: myStream<< "aCoplanarFaces"; break; + case FT_BallDiameter: myStream<< "aBallDiameter"; break; + case FT_ConnectedElements: myStream<< "aConnectedElements"; break; + case FT_LessThan: myStream<< "aLessThan"; break; + case FT_MoreThan: myStream<< "aMoreThan"; break; + case FT_EqualTo: myStream<< "aEqualTo"; break; + case FT_LogicalNOT: myStream<< "aLogicalNOT"; break; + case FT_LogicalAND: myStream<< "aLogicalAND"; break; + case FT_LogicalOR: myStream<< "aLogicalOR"; break; + case FT_Undefined: myStream<< "anUndefined"; break; + //default: -- commented to have a compilation warning + } + myStream<GetMeshId() : -1 ); return *this; + } + + TPythonDump& TPythonDump::operator<<(const TCollection_AsciiString & theStr) + { + myStream << theStr; return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::AxisStruct & theAxis) + { + *this << "SMESH.AxisStruct( " + << TVar( theAxis.x ) << ", " + << TVar( theAxis.y ) << ", " + << TVar( theAxis.z ) << ", " + << TVar( theAxis.vx ) << ", " + << TVar( theAxis.vy ) << ", " + << TVar( theAxis.vz ) << " )"; + return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::DirStruct & theDir) + { + const SMESH::PointStruct & P = theDir.PS; + *this << "SMESH.DirStruct( SMESH.PointStruct ( " + << TVar( P.x ) << ", " + << TVar( P.y ) << ", " + << TVar( P.z ) << " ))"; + return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::PointStruct & P) + { + *this << "SMESH.PointStruct ( " + << TVar( P.x ) << ", " + << TVar( P.y ) << ", " + << TVar( P.z ) << " )"; + return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups * theList) + { + DumpArray( *theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGO& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGBO& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const SMESH::ListOfIDSources& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const SMESH::CoincidentFreeBorders& theCFB) + { + // dump CoincidentFreeBorders as a list of lists, each enclosed list + // contains node IDs of a group of coincident free borders where + // each consequent triple of IDs describe a free border: (n1, n2, nLast) + // For example [[1, 2, 10, 20, 21, 40], [11, 12, 15, 55, 54, 41]] describes + // two groups of coincident free borders, each group including two borders + + myStream << "["; + for ( CORBA::ULong i = 0; i < theCFB.coincidentGroups.length(); ++i ) + { + const SMESH::FreeBordersGroup& aGRP = theCFB.coincidentGroups[ i ]; + if ( i ) myStream << ","; + myStream << "["; + for ( CORBA::ULong iP = 0; iP < aGRP.length(); ++iP ) + { + const SMESH::FreeBorderPart& aPART = aGRP[ iP ]; + if ( 0 <= aPART.border && aPART.border < (CORBA::Long)theCFB.borders.length() ) + { + if ( iP ) myStream << ", "; + const SMESH::FreeBorder& aBRD = theCFB.borders[ aPART.border ]; + myStream << aBRD.nodeIDs[ aPART.node1 ] << ","; + myStream << aBRD.nodeIDs[ aPART.node2 ] << ","; + myStream << aBRD.nodeIDs[ aPART.nodeLast ]; + } + } + myStream << "]"; + } + myStream << "]"; + + return *this; + } + + const char* TPythonDump::NotPublishedObjectName() + { + return theNotPublishedObjectName; + } + + TCollection_AsciiString myLongStringStart( "TPythonDump::LongStringStart" ); + TCollection_AsciiString myLongStringEnd ( "TPythonDump::LongStringEnd" ); + + //================================================================================ + /*! + * \brief Return marker of long string literal beginning + * \param type - a name of functionality producing the string literal + * \retval TCollection_AsciiString - the marker string to be written into + * a raw python script + */ + //================================================================================ + + TCollection_AsciiString TPythonDump::LongStringStart(const char* type) + { + return + myLongStringStart + + (Standard_Integer) strlen(type) + + " " + + (char*) type; + } + + //================================================================================ + /*! + * \brief Return marker of long string literal end + * \retval TCollection_AsciiString - the marker string to be written into + * a raw python script + */ + //================================================================================ + + TCollection_AsciiString TPythonDump::LongStringEnd() + { + return myLongStringEnd; + } + + //================================================================================ + /*! + * \brief Cut out a long string literal from a string + * \param theText - text possibly containing string literals + * \param theFrom - position in the text to search from + * \param theLongString - the retrieved literal + * \param theStringType - a name of functionality produced the literal + * \retval bool - true if a string literal found + * + * The literal is removed from theText; theFrom points position right after + * the removed literal + */ + //================================================================================ + + bool TPythonDump::CutoutLongString( TCollection_AsciiString & theText, + int & theFrom, + TCollection_AsciiString & theLongString, + TCollection_AsciiString & theStringType) + { + if ( theFrom < 1 || theFrom > theText.Length() ) + return false; + + // ...script \ beg marker \ \ type \ literal \ end marker \ script... + // "theText myLongStringStart7 Pattern!!! SALOME Mesh Pattern file myLongStringEndtextEnd" + // 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 + // 0 1 2 3 4 5 6 7 8 + + theFrom = theText.Location( myLongStringStart, theFrom, theText.Length() ); // = 09 + if ( !theFrom ) + return false; + + // find where literal begins + int literalBeg = theFrom + myLongStringStart.Length(); // = 26 + char* typeLenStr = (char*) theText.ToCString() + literalBeg - 1; // = "7 Pattern!!! SALO...." + int typeLen = atoi ( typeLenStr ); // = 7 + while ( *typeLenStr != ' ' ) { // look for ' ' after typeLen + literalBeg++; // 26 -> 27 + typeLenStr++; + } + literalBeg += typeLen + 1; // = 35 + if ( literalBeg > theText.Length() ) + return false; + + // where literal ends (i.e. end marker begins) + int literalEnd = theText.Location( myLongStringEnd, literalBeg, theText.Length() ); // = 64 + if ( !literalEnd ) + literalEnd = theText.Length(); + + // literal + theLongString = theText.SubString( literalBeg, literalEnd - 1); // "!!! SALOME Mesh Pattern file " + // type + theStringType = theText.SubString( literalBeg - typeLen, literalBeg - 1 ); // "Pattern" + // cut off literal + literalEnd += myLongStringEnd.Length(); // = 79 + TCollection_AsciiString textEnd = theText.SubString( literalEnd, theText.Length() ); // "textE..." + theText = theText.SubString( 1, theFrom - 1 ) + textEnd; + + return true; + } + + void printException( const char* text ) + { +#ifdef _DEBUG_ + cout << "Exception in SMESH_Gen_i::DumpPython(): " << text << endl; +#endif + } +} + +//======================================================================= +//function : RemoveTabulation +//purpose : +//======================================================================= +void RemoveTabulation( TCollection_AsciiString& theScript ) +{ + std::string aString( theScript.ToCString() ); + std::string::size_type aPos = 0; + while( aPos < aString.length() ) + { + aPos = aString.find( "\n\t", aPos ); + if( aPos == std::string::npos ) + break; + aString.replace( aPos, 2, "\n" ); + aPos++; + } + theScript = aString.c_str(); +} + +//======================================================================= +//function : DumpPython +//purpose : +//======================================================================= +Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Boolean isPublished, + CORBA::Boolean isMultiFile, + CORBA::Boolean& isValidScript) +{ + SALOMEDS::Study_var aStudy = getStudyServant(); + if (CORBA::is_nil(aStudy)) + return new Engines::TMPFile(0); + + CORBA::String_var compDataType = ComponentDataType(); + SALOMEDS::SObject_wrap aSO = aStudy->FindComponent( compDataType.in() ); + if (CORBA::is_nil(aSO)) + return new Engines::TMPFile(0); + + // Map study entries to object names + Resource_DataMapOfAsciiStringAsciiString aMap; + Resource_DataMapOfAsciiStringAsciiString aMapNames; + + SALOMEDS::ChildIterator_wrap Itr = aStudy->NewChildIterator(aSO); + for (Itr->InitEx(true); Itr->More(); Itr->Next()) { + SALOMEDS::SObject_wrap aValue = Itr->Value(); + CORBA::String_var anID = aValue->GetID(); + CORBA::String_var aName = aValue->GetName(); + TCollection_AsciiString aGUIName ( (char*) aName.in() ); + TCollection_AsciiString anEntry ( (char*) anID.in() ); + if (aGUIName.Length() > 0) { + aMapNames.Bind( anEntry, aGUIName ); + aMap.Bind( anEntry, aGUIName ); + } + } + + // Get trace of restored study + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::GenericAttribute_wrap anAttr = + aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); + + SALOMEDS::AttributePythonObject_var pyAttr = + SALOMEDS::AttributePythonObject::_narrow(anAttr); + CORBA::String_var oldValue = pyAttr->GetObject(); + TCollection_AsciiString aSavedTrace (oldValue.in()); + + // Add trace of API methods calls and replace study entries by names + TCollection_AsciiString aScript; + aScript += DumpPython_impl(aMap, aMapNames, isPublished, isMultiFile, + myIsHistoricalPythonDump, isValidScript, aSavedTrace); + + int aLen = aScript.Length(); + unsigned char* aBuffer = new unsigned char[aLen+1]; + strcpy((char*)aBuffer, aScript.ToCString()); + + CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer; + Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); + + bool hasNotPublishedObjects = aScript.Location( SMESH::theNotPublishedObjectName, 1, aLen); + isValidScript = isValidScript && !hasNotPublishedObjects; + + return aStreamFile._retn(); +} + +//============================================================================= +/*! + * AddToPythonScript + */ +//============================================================================= +void SMESH_Gen_i::AddToPythonScript (const TCollection_AsciiString& theString) +{ + if (myPythonScript.IsNull()) { + myPythonScript = new TColStd_HSequenceOfAsciiString; + } + myPythonScript->Append(theString); +} + +//============================================================================= +/*! + * RemoveLastFromPythonScript + */ +//============================================================================= +void SMESH_Gen_i::RemoveLastFromPythonScript() +{ + if (!myPythonScript.IsNull()) { + int aLen = myPythonScript->Length(); + myPythonScript->Remove(aLen); + } +} + +//======================================================================= +//function : SavePython +//purpose : +//======================================================================= +void SMESH_Gen_i::SavePython() +{ + // Dump trace of API methods calls + TCollection_AsciiString aScript = GetNewPythonLines(); + + // Check contents of PythonObject attribute + CORBA::String_var compDataType = ComponentDataType(); + SALOMEDS::SObject_wrap aSO = getStudyServant()->FindComponent( compDataType.in() ); + SALOMEDS::StudyBuilder_var aStudyBuilder = getStudyServant()->NewBuilder(); + SALOMEDS::GenericAttribute_wrap anAttr = + aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); + + SALOMEDS::AttributePythonObject_var pyAttr = + SALOMEDS::AttributePythonObject::_narrow(anAttr); + CORBA::String_var oldValue = pyAttr->GetObject(); + TCollection_AsciiString oldScript (oldValue.in()); + + if (oldScript.Length() > 0) { + oldScript += "\n"; + oldScript += aScript; + } else { + oldScript = aScript; + } + + // Store in PythonObject attribute + pyAttr->SetObject(oldScript.ToCString(), 1); + + // Clean trace of API methods calls + CleanPythonTrace(); +} + + +// impl + + +//============================================================================= +/*! + * FindEntries: Returns a sequence of start/end positions of entries in the string + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theString) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + Standard_Integer aLen = theString.Length(); + Standard_Boolean isFound = Standard_False; + + char* arr = (char*) theString.ToCString(); + Standard_Integer i = 0, j; + + while(i < aLen) { + int c = (int)arr[i]; + j = i+1; + if ( isdigit( c )) { //Is digit? + + isFound = Standard_False; + while((j < aLen) && ( isdigit(c) || c == ':' )) { //Check if it is an entry + c = (int)arr[j++]; + if(c == ':') isFound = Standard_True; + } + + if (isFound) { + int prev = (i < 1) ? 0 : (int)arr[i - 1]; + // to distinguish from a sketcher command: + // last char should be a digit, not ":", + // previous char should not be '"'. + if (arr[j-2] != ':' && prev != '"') { + aSeq->Append(i+1); // +1 because AsciiString starts from 1 + aSeq->Append(j-1); + } + } + } + + i = j; + } + + return aSeq; +} + +namespace { + + //================================================================================ + /*! + * \brief Make a string be a valid python name + * \param aName - a string to fix + * \retval bool - true if aName was not modified + */ + //================================================================================ + + bool fixPythonName(TCollection_AsciiString & aName) + { + bool isValidName = true; + int nbUnderscore = 0; + int p; + // replace not allowed chars by underscore + const char* name = aName.ToCString(); + for ( p = 0; name[p]; ++p ) { + if ( !isalnum( name[p] ) && name[p] != '_' ) + { + if ( p == 0 || p+1 == aName.Length() || name[p-1] == '_') + { + aName.Remove( p+1, 1 ); // remove __ and _ from the start and the end + --p; + name = aName.ToCString(); + } + else + { + aName.SetValue( p+1, '_'); + nbUnderscore++; + } + isValidName = false; + } + } + // aName must not start with a digit + if ( aName.IsIntegerValue() ) { + aName.Insert( 1, 'a' ); + isValidName = false; + } + // shorten names like CartesianParameters3D_400_400_400_1000000_1 + const int nbAllowedUnderscore = 3; /* changed from 2 to 3 by an user request + posted to SALOME Forum */ + if ( aName.Length() > 20 && nbUnderscore > nbAllowedUnderscore ) + { + p = aName.Location( "_", 20, aName.Length()); + if ( p > 1 ) + aName.Trunc( p-1 ); + } + return isValidName; + } + + //================================================================================ + /*! + * \brief Return Python module names of available plug-ins. + */ + //================================================================================ + + std::vector getPluginNames() + { + std::vector pluginNames; + std::vector< std::string > xmlPaths = SMESH_Gen::GetPluginXMLPaths(); + LDOMParser xmlParser; + for ( size_t i = 0; i < xmlPaths.size(); ++i ) + { + bool error = xmlParser.parse( xmlPaths[i].c_str() ); + if ( error ) + { + TCollection_AsciiString data; + INFOS( xmlParser.GetError(data) ); + continue; + } + // + LDOM_Document xmlDoc = xmlParser.getDocument(); + LDOM_NodeList nodeList = xmlDoc.getElementsByTagName( "meshers-group" ); + for ( int i = 0; i < nodeList.getLength(); ++i ) + { + LDOM_Node node = nodeList.item( i ); + LDOM_Element& elem = (LDOM_Element&) node; + LDOMString idlModule = elem.getAttribute( "idl-module" ); + if ( strlen( idlModule.GetString() ) > 0 ) + pluginNames.push_back( idlModule.GetString() ); + } + } + return pluginNames; + } +} + +//================================================================================ +/*! + * \brief Createa a Dump Python script + * \param [in,out] theObjectNames - map of an entry to a study and python name + * \param [in] theNames - - map of an entry to a study name + * \param [in] isPublished - \c true if dump of object publication in study is needed + * \param [in] isMultiFile - \c true if dump of each module goes to a separate file + * \param [in] isHistoricalDump - \c true if removed object should be dumped + * \param [out] aValidScript - returns \c true if the returned script seems valid + * \param [in,out] theSavedTrace - the dump stored in the study. It's cleared to + * decrease memory usage. + * \return TCollection_AsciiString - the result dump script. + */ +//================================================================================ + +TCollection_AsciiString SMESH_Gen_i::DumpPython_impl + (Resource_DataMapOfAsciiStringAsciiString& theObjectNames, + Resource_DataMapOfAsciiStringAsciiString& theNames, + bool isPublished, + bool isMultiFile, + bool isHistoricalDump, + bool& aValidScript, + TCollection_AsciiString& theSavedTrace) +{ + SMESH_TRY; + + const TCollection_AsciiString aSmeshpy ( SMESH_2smeshpy::SmeshpyName() ); + const TCollection_AsciiString aSMESHGen( SMESH_2smeshpy::GenName() ); + const TCollection_AsciiString anOldGen ( SMESH::TPythonDump::SMESHGenName() ); + const TCollection_AsciiString helper; // to comfortably append C strings to TCollection_AsciiString + const TCollection_AsciiString tab( isMultiFile ? "\t" : "" ), nt = helper + "\n" + tab; + + std::list< TCollection_AsciiString > lines; // lines of a script + std::list< TCollection_AsciiString >::iterator linesIt; + + if ( isPublished ) + lines.push_back( aSMESHGen + " = smeshBuilder.New()" ); + else + lines.push_back( aSMESHGen + " = smeshBuilder.New(False)" ); + lines.push_back( helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()" ); + lines.push_back( helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()" ); + + // Treat dump trace of restored study + if (theSavedTrace.Length() > 0) + { + linesIt = --lines.end(); + // Split theSavedTrace into lines + int from = 1, end = theSavedTrace.Length(), to; + while ( from < end && ( to = theSavedTrace.Location( "\n", from, end ))) + { + if ( theSavedTrace.ToCString()[from-1] == '\t' ) + ++from; + if ( to != from ) + lines.push_back( theSavedTrace.SubString( from, to - 1 )); + from = to + 1; + } + // For the conversion of IDL API calls -> smeshBuilder.py API, "smesh" standing for SMESH_Gen + // was replaces with "smeshgen" (==TPythonDump::SMESHGenName()). + // Change "smesh" -> "smeshgen" in the trace saved before passage to smeshBuilder.py API + bool isNewVersion = + theSavedTrace.Location( anOldGen + ".", 1, theSavedTrace.Length() ); + theSavedTrace.Clear(); + if ( !isNewVersion ) + { + const TCollection_AsciiString aSmeshCall ( "smesh." ), gen( "gen" ); + int beg, end, from; + for ( ++linesIt; linesIt != lines.end(); ++linesIt ) + { + TCollection_AsciiString& aSavedLine = *linesIt; + end = aSavedLine.Length(), from = 1; + while ( from < end && ( beg = aSavedLine.Location( aSmeshCall, from, end ))) + { + char charBefore = ( beg == 1 ) ? ' ' : aSavedLine.Value( beg - 1 ); + if ( isspace( charBefore ) || charBefore == '=' ) { // "smesh." is not a part of a long word + aSavedLine.Insert( beg + aSmeshCall.Length() - 1, gen );// "smesh" -> "smeshgen" + end += gen.Length(); + } + from = beg + aSmeshCall.Length(); + } + } + } + } + + // Add new dump trace of API methods calls to script lines + if (!myPythonScript.IsNull()) + { + Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScript; + Standard_Integer istr, aLen = aPythonScript->Length(); + for (istr = 1; istr <= aLen; istr++) + lines.push_back( aPythonScript->Value( istr )); + } + + // Convert IDL API calls into smeshBuilder.py API. + // Some objects are wrapped with python classes and + // Resource_DataMapOfAsciiStringAsciiString holds methods returning wrapped objects + Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod; + std::set< TCollection_AsciiString > aRemovedObjIDs; + if ( !getenv("NO_2smeshpy_conversion")) + SMESH_2smeshpy::ConvertScript( lines, anEntry2AccessorMethod, + theObjectNames, aRemovedObjIDs, + isHistoricalDump ); + + bool importGeom = false; + GEOM::GEOM_Gen_ptr geom = GetGeomEngine(); + { + // Add names of GEOM objects to theObjectNames to exclude same names of SMESH objects + GEOM::string_array_var aGeomNames = geom->GetAllDumpNames(); + int ign = 0, nbgn = aGeomNames->length(); + for (; ign < nbgn; ign++) { + TCollection_AsciiString aName = aGeomNames[ign].in(); + theObjectNames.Bind(aName, "1"); + } + } + + TCollection_AsciiString anUpdatedScript; + + Resource_DataMapOfAsciiStringAsciiString mapRemoved; + Resource_DataMapOfAsciiStringAsciiString mapEntries; // names and entries present in anUpdatedScript + Standard_Integer objectCounter = 0; + TCollection_AsciiString anEntry, aName, aGUIName, aBaseName("smeshObj_"); + + // Treat every script line and add it to anUpdatedScript + for ( linesIt = lines.begin(); linesIt != lines.end(); ++linesIt ) + { + TCollection_AsciiString& aLine = *linesIt; + anUpdatedScript += tab; + { + //Replace characters used instead of quote marks to quote notebook variables + int pos = 1; + while (( pos = aLine.Location( 1, SMESH::TVar::Quote(), pos, aLine.Length() ))) + aLine.SetValue( pos, '"' ); + } + // Find entries to be replaced by names + Handle(TColStd_HSequenceOfInteger) aSeq = FindEntries(aLine); + const Standard_Integer aSeqLen = aSeq->Length(); + Standard_Integer aStart = 1; + for (Standard_Integer i = 1; i <= aSeqLen; i += 2) + { + if ( aStart < aSeq->Value(i) ) + anUpdatedScript += aLine.SubString( aStart, aSeq->Value(i) - 1 ); // line part before i-th entry + anEntry = aLine.SubString( aSeq->Value(i), aSeq->Value(i + 1) ); + // is a GEOM object? + CORBA::String_var geomName = geom->GetDumpName( anEntry.ToCString() ); + if ( !geomName.in() || !geomName.in()[0] ) { + // is a SMESH object + if ( theObjectNames.IsBound( anEntry )) { + // The Object is in Study + aName = theObjectNames.Find( anEntry ); + // check validity of aName + bool isValidName = fixPythonName( aName ); + if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) { + // diff objects have same name - make a new name by appending a digit + TCollection_AsciiString aName2; + Standard_Integer i = 0; + do { + aName2 = aName + "_" + ++i; + } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2)); + aName = aName2; + isValidName = false; + } + if ( !isValidName ) + theObjectNames(anEntry) = aName; + + if ( aLine.Value(1) != '#' ) + mapEntries.Bind(anEntry, aName); + } + else + { + // Removed Object + do { + aName = aBaseName + (++objectCounter); + } while (theObjectNames.IsBound(aName)); + + if ( !aRemovedObjIDs.count( anEntry ) && aLine.Value(1) != '#') + mapRemoved.Bind(anEntry, aName); + + theObjectNames.Bind(anEntry, aName); + } + theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects + } + else + { + aName = geomName.in(); + importGeom = true; + } + anUpdatedScript += aName; + aStart = aSeq->Value(i + 1) + 1; + + } // loop on entries within aLine + + if ( aSeqLen == 0 ) + anUpdatedScript += aLine; + else if ( aSeq->Value( aSeqLen ) < aLine.Length() ) + anUpdatedScript += aLine.SubString( aSeq->Value(aSeqLen) + 1, aLine.Length() ); + + anUpdatedScript += '\n'; + } + + // Make an initial part of aSript + + TCollection_AsciiString initPart = "import "; + if ( isMultiFile ) + initPart += "salome, "; + initPart += " SMESH, SALOMEDS\n"; + initPart += "from salome.smesh import smeshBuilder\n"; + if ( importGeom && isMultiFile ) + { + initPart += ("\n## import GEOM dump file ## \n" + "import string, os, sys, re, inspect\n" + "thisFile = inspect.getfile( inspect.currentframe() )\n" + "thisModule = os.path.splitext( os.path.basename( thisFile ))[0]\n" + "sys.path.insert( 0, os.path.dirname( thisFile ))\n" + "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",thisModule)+\" import *\")\n\n"); + } + // import python files corresponding to plugins if they are used in anUpdatedScript + { + TCollection_AsciiString importStr; + std::vector pluginNames = getPluginNames(); + for ( size_t i = 0; i < pluginNames.size(); ++i ) + { + // Convert access to plugin members: + // e.g. StdMeshers.QUAD_REDUCED -> StdMeshersBuilder.QUAD_REDUCED + TCollection_AsciiString pluginAccess = (pluginNames[i] + ".").c_str() ; + int iFrom = 1, iPos; + while (( iPos = anUpdatedScript.Location( pluginAccess, iFrom, anUpdatedScript.Length() ))) + { + anUpdatedScript.Insert( iPos + pluginNames[i].size(), "Builder" ); + iFrom = iPos + pluginNames[i].size() + 8; + } + // if any plugin member is used, import the plugin + if ( iFrom > 1 ) + importStr += ( helper + "\n" "from salome." + pluginNames[i].c_str() + + " import " + pluginNames[i].c_str() +"Builder" ); + } + if ( !importStr.IsEmpty() ) + initPart += importStr + "\n"; + } + + if ( isMultiFile ) + initPart += "def RebuildData():"; + initPart += "\n"; + + anUpdatedScript.Prepend( initPart ); + + // Make a final part of aScript + + // Dump object removal + TCollection_AsciiString removeObjPart; + if ( !mapRemoved.IsEmpty() ) { + removeObjPart += nt + "## some objects were removed"; + removeObjPart += nt + "aStudyBuilder = salome.myStudy.NewBuilder()"; + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapRemovedIt; + for ( mapRemovedIt.Initialize( mapRemoved ); mapRemovedIt.More(); mapRemovedIt.Next() ) { + aName = mapRemovedIt.Value(); // python name + anEntry = mapRemovedIt.Key(); + removeObjPart += nt + "SO = salome.myStudy.FindObjectIOR(salome.myStudy.ConvertObjectToIOR("; + removeObjPart += aName; + // for object wrapped by class of smeshBuilder.py + if ( anEntry2AccessorMethod.IsBound( anEntry ) ) + removeObjPart += helper + "." + anEntry2AccessorMethod( anEntry ); + removeObjPart += helper + "))" + nt + "if SO: aStudyBuilder.RemoveObjectWithChildren(SO)"; + } + } + + // Set object names + TCollection_AsciiString setNamePart; + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapEntriesIt; + for ( mapEntriesIt.Initialize( mapEntries ); mapEntriesIt.More(); mapEntriesIt.Next() ) + { + anEntry = mapEntriesIt.Key(); + aName = mapEntriesIt.Value(); // python name + if ( theNames.IsBound( anEntry )) + { + aGUIName = theNames.Find(anEntry); + aGUIName.RemoveAll('\''); // remove a quote from a name (issue 22360) + setNamePart += nt + aSMESHGen + ".SetName(" + aName; + if ( anEntry2AccessorMethod.IsBound( anEntry ) ) + setNamePart += helper + "." + anEntry2AccessorMethod( anEntry ); + setNamePart += helper + ", '" + aGUIName + "')"; + } + } + if ( !setNamePart.IsEmpty() ) + { + setNamePart.Insert( 1, nt + "## Set names of Mesh objects" ); + } + + // Store visual properties of displayed objects + + TCollection_AsciiString visualPropertiesPart; + if (isPublished) + { + //Output the script that sets up the visual parameters. + CORBA::String_var compDataType = ComponentDataType(); + CORBA::String_var script = getStudyServant()->GetDefaultScript( compDataType.in(), tab.ToCString() ); + if ( script.in() && script.in()[0] ) { + visualPropertiesPart += nt + "### Store presentation parameters of displayed objects\n"; + visualPropertiesPart += script.in(); + } + } + + anUpdatedScript += removeObjPart + '\n' + setNamePart + '\n' + visualPropertiesPart; + + if ( isMultiFile ) + { + anUpdatedScript += + "\n\tpass" + "\n" + "\nif __name__ == '__main__':" + "\n\tSMESH_RebuildData = RebuildData" + "\n\texec('import '+re.sub('SMESH$','GEOM',thisModule)+' as GEOM_dump')" + "\n\tGEOM_dump.RebuildData()" + "\n\texec('from '+re.sub('SMESH$','GEOM',thisModule)+' import * ')" + "\n\tSMESH_RebuildData()"; + } + anUpdatedScript += "\n"; + + // no need now as we use 'tab' and 'nt' variables depending on isMultiFile + // if( !isMultiFile ) // remove unnecessary tabulation + // RemoveTabulation( anUpdatedScript ); + + // ----------------------------------------------------------------- + // put string literals describing patterns into separate functions + // ----------------------------------------------------------------- + + TCollection_AsciiString aLongString, aFunctionType; + int where = 1; + std::set< std::string > functionNameSet; + while ( SMESH::TPythonDump::CutoutLongString( anUpdatedScript, where, aLongString, aFunctionType )) + { + // make a python string literal + aLongString.Prepend(":\n\treturn '''\n"); + aLongString += "\n\t'''\n\tpass\n"; + + TCollection_AsciiString functionName; + + // check if the function returning this literal is already defined + int posAlready = anUpdatedScript.Location( aLongString, where, anUpdatedScript.Length() ); + if ( posAlready ) // already defined + { + // find the function name + int functBeg = posAlready; + char* script = (char*) anUpdatedScript.ToCString() + posAlready - 1; // look at ":" after "def fuction()" + while ( *script != ' ' ) { + script--; + functBeg--; + } + functBeg++; // do not take ' ' + posAlready--; // do not take ':' + functionName = anUpdatedScript.SubString( functBeg, posAlready ); + } + else // not defined yet + { + // find a unique function name + fixPythonName( aFunctionType ); + Standard_Integer nb = 0; + do functionName = aFunctionType + "_" + ( nb++ ) + "()"; + while ( !functionNameSet.insert( functionName.ToCString() ).second ); + + // define function + TCollection_AsciiString funDef = helper + "def " + functionName + aLongString; + if ( isMultiFile ) + { + anUpdatedScript += helper + "\n\n" + funDef; + } + else + { + funDef += "\n\n"; + anUpdatedScript.Insert( 1, funDef); + where += funDef.Length(); + } + } + anUpdatedScript.InsertBefore( where, functionName ); // call function + } + + aValidScript = true; + + return anUpdatedScript; + + SMESH_CATCH( SMESH::printException ); + + aValidScript = false; + return ""; +} + +//============================================================================= +/*! + * GetNewPythonLines + */ +//============================================================================= +TCollection_AsciiString SMESH_Gen_i::GetNewPythonLines() +{ + TCollection_AsciiString aScript; + + // Dump trace of API methods calls + if (!myPythonScript.IsNull()) { + Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScript; + Standard_Integer istr, aLen = aPythonScript->Length(); + for (istr = 1; istr <= aLen; istr++) { + aScript += "\n"; + aScript += aPythonScript->Value(istr); + } + aScript += "\n"; + } + + return aScript; +} + +//============================================================================= +/*! + * CleanPythonTrace + */ +//============================================================================= +void SMESH_Gen_i::CleanPythonTrace() +{ + TCollection_AsciiString aScript; + + // Clean trace of API methods calls + if (!myPythonScript.IsNull()) { + myPythonScript->Clear(); + } +} diff --git a/src/SMESH_I/SMESH_PythonDump.hxx b/src/SMESH_I/SMESH_PythonDump.hxx index f4ea88344..4c488220b 100644 --- a/src/SMESH_I/SMESH_PythonDump.hxx +++ b/src/SMESH_I/SMESH_PythonDump.hxx @@ -200,9 +200,6 @@ namespace SMESH TPythonDump& operator<<(SMESH_MeshEditor_i* theArg); - TPythonDump& - operator<<(SMESH::MED_VERSION theArg); - TPythonDump& operator<<(const SMESH::AxisStruct & theAxis); diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index bace171b6..1817d97ac 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -84,6 +84,10 @@ import salome from salome.geom import geomBuilder import SMESH # This is necessary for back compatibility +import omniORB # back compatibility +SMESH.MED_V2_1 = omniORB.EnumItem("MED_V2_1", 0) # back compatibility +SMESH.MED_V2_2 = omniORB.EnumItem("MED_V2_2", 1) # back compatibility + from SMESH import * from salome.smesh.smesh_algorithm import Mesh_Algorithm @@ -1839,13 +1843,10 @@ class Mesh(metaclass=MeshMeta): ## Export the mesh in a file in MED format ## allowing to overwrite the file if it exists or add the exported data to its contents - # @param f is the file name + # @param fileName is the file name # @param auto_groups boolean parameter for creating/not creating # the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; # the typical use is auto_groups=False. - # @param version MED format version (MED_V2_1 or MED_V2_2, - # the latter meaning any current version). The parameter is - # obsolete since MED_V2_1 is no longer supported. # @param overwrite boolean parameter for overwriting/not overwriting the file # @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh # @param autoDimension if @c True (default), a space dimension of a MED mesh can be either @@ -1861,17 +1862,33 @@ class Mesh(metaclass=MeshMeta): # - 'f' stands for "_faces _" field; # - 's' stands for "_solids _" field. # @ingroup l2_impexp - def ExportMED(self, f, auto_groups=0, version=MED_V2_2, - overwrite=1, meshPart=None, autoDimension=True, fields=[], geomAssocFields=''): + def ExportMED(self, *args, **kwargs): + # process positional arguments + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + fileName = args[0] + auto_groups = args[1] if len(args) > 1 else False + overwrite = args[2] if len(args) > 2 else True + meshPart = args[3] if len(args) > 3 else None + autoDimension = args[4] if len(args) > 4 else True + fields = args[5] if len(args) > 5 else [] + geomAssocFields = args[6] if len(args) > 6 else '' + # process keywords arguments + auto_groups = kwargs.get("auto_groups", auto_groups) + overwrite = kwargs.get("overwrite", overwrite) + meshPart = kwargs.get("meshPart", meshPart) + autoDimension = kwargs.get("autoDimension", autoDimension) + fields = kwargs.get("fields", fields) + geomAssocFields = kwargs.get("geomAssocFields", geomAssocFields) + # invoke engine's function if meshPart or fields or geomAssocFields: unRegister = genObjUnRegister() if isinstance( meshPart, list ): meshPart = self.GetIDSource( meshPart, SMESH.ALL ) unRegister.set( meshPart ) - self.mesh.ExportPartToMED( meshPart, f, auto_groups, version, overwrite, autoDimension, + self.mesh.ExportPartToMED( meshPart, fileName, auto_groups, overwrite, autoDimension, fields, geomAssocFields) else: - self.mesh.ExportToMEDX(f, auto_groups, version, overwrite, autoDimension) + self.mesh.ExportMED(fileName, auto_groups, overwrite, autoDimension) ## Export the mesh in a file in SAUV format # @param f is the file name @@ -1961,10 +1978,36 @@ class Mesh(metaclass=MeshMeta): ## Deprecated, used only for compatibility! Please, use ExportMED() method instead. # Export the mesh in a file in MED format # allowing to overwrite the file if it exists or add the exported data to its contents - # @param f the file name - # @param version MED format version (MED_V2_1 or MED_V2_2, - # the latter meaning any current version). The parameter is - # obsolete since MED_V2_1 is no longer supported. + # @param fileName the file name + # @param opt boolean parameter for creating/not creating + # the groups Group_On_All_Nodes, Group_On_All_Faces, ... + # @param overwrite boolean parameter for overwriting/not overwriting the file + # @param autoDimension if @c True (default), a space dimension of a MED mesh can be either + # - 1D if all mesh nodes lie on OX coordinate axis, or + # - 2D if all mesh nodes lie on XOY coordinate plane, or + # - 3D in the rest cases.
+ # If @a autoDimension is @c False, the space dimension is always 3. + # @ingroup l2_impexp + def ExportToMED(self, *args, **kwargs): + print("WARNING: ExportToMED() is deprecated, use ExportMED() instead") + # process positional arguments + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + fileName = args[0] + auto_groups = args[1] if len(args) > 1 else False + overwrite = args[2] if len(args) > 2 else True + autoDimension = args[3] if len(args) > 3 else True + # process keywords arguments + auto_groups = kwargs.get("opt", auto_groups) # old keyword name + auto_groups = kwargs.get("auto_groups", auto_groups) # new keyword name + overwrite = kwargs.get("overwrite", overwrite) + autoDimension = kwargs.get("autoDimension", autoDimension) + # invoke engine's function + self.mesh.ExportMED(fileName, auto_groups, overwrite, autoDimension) + + ## Deprecated, used only for compatibility! Please, use ExportMED() method instead. + # Export the mesh in a file in MED format + # allowing to overwrite the file if it exists or add the exported data to its contents + # @param fileName the file name # @param opt boolean parameter for creating/not creating # the groups Group_On_All_Nodes, Group_On_All_Faces, ... # @param overwrite boolean parameter for overwriting/not overwriting the file @@ -1974,8 +2017,20 @@ class Mesh(metaclass=MeshMeta): # - 3D in the rest cases.
# If @a autoDimension is @c False, the space dimension is always 3. # @ingroup l2_impexp - def ExportToMED(self, f, version=MED_V2_2, opt=0, overwrite=1, autoDimension=True): - self.mesh.ExportToMEDX(f, opt, version, overwrite, autoDimension) + def ExportToMEDX(self, *args, **kwargs): + print("WARNING: ExportToMEDX() is deprecated, use ExportMED() instead") + # process positional arguments + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + fileName = args[0] + auto_groups = args[1] if len(args) > 1 else False + overwrite = args[2] if len(args) > 2 else True + autoDimension = args[3] if len(args) > 3 else True + # process keywords arguments + auto_groups = kwargs.get("auto_groups", auto_groups) + overwrite = kwargs.get("overwrite", overwrite) + autoDimension = kwargs.get("autoDimension", autoDimension) + # invoke engine's function + self.mesh.ExportMED(fileName, auto_groups, overwrite, autoDimension) # Operations with groups: # ---------------------- @@ -5121,7 +5176,25 @@ class meshProxy(SMESH._objref_SMESH_Mesh): def CreateDimGroup(self,*args): # 2 args added: nbCommonNodes, underlyingOnly if len( args ) == 3: args += SMESH.ALL_NODES, True - return SMESH._objref_SMESH_Mesh.CreateDimGroup( self, *args ) + return SMESH._objref_SMESH_Mesh.CreateDimGroup(self, *args) + def ExportToMEDX(self, *args): # function removed + print("WARNING: ExportToMEDX() is deprecated, use ExportMED() instead") + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + SMESH._objref_SMESH_Mesh.ExportMED(self, *args) + def ExportToMED(self, *args): # function removed + print("WARNING: ExportToMED() is deprecated, use ExportMED() instead") + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + while len(args) < 4: # !!!! nb of parameters for ExportToMED IDL's method + args.append(True) + SMESH._objref_SMESH_Mesh.ExportMED(self, *args) + def ExportPartToMED(self, *args): # 'version' parameter removed + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + SMESH._objref_SMESH_Mesh.ExportPartToMED(self, *args) + def ExportMED(self, *args): # signature of method changed + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + while len(args) < 4: # !!!! nb of parameters for ExportToMED IDL's method + args.append(True) + SMESH._objref_SMESH_Mesh.ExportMED(self, *args) pass omniORB.registerObjref(SMESH._objref_SMESH_Mesh._NP_RepositoryId, meshProxy) diff --git a/src/Tools/ZCracksPlug/casTests/genereCube.py b/src/Tools/ZCracksPlug/casTests/genereCube.py index 635f20d95..b26bc63ac 100644 --- a/src/Tools/ZCracksPlug/casTests/genereCube.py +++ b/src/Tools/ZCracksPlug/casTests/genereCube.py @@ -109,7 +109,7 @@ def cube3D(L, N, outFile): aFilter_1.SetMesh(Maillage_1.GetMesh()) FACE_temp = Maillage_1.GroupOnFilter( SMESH.FACE, noms[cont], aFilter_1 ) - Maillage_1.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage_1.ExportMED(outFile) #if salome.sg.hasDesktop(): #salome.sg.updateObjBrowser(True) @@ -191,7 +191,7 @@ def cube2D(L, N, outFile): aFilter_1.SetMesh(Maillage_1.GetMesh()) EDGE_temp = Maillage_1.GroupOnFilter( SMESH.EDGE, noms[cont], aFilter_1 ) - Maillage_1.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage_1.ExportMED(outFile) #if salome.sg.hasDesktop(): #salome.sg.updateObjBrowser(True) diff --git a/src/Tools/ZCracksPlug/ellipse.py b/src/Tools/ZCracksPlug/ellipse.py index 112c76bcf..9f599892a 100644 --- a/src/Tools/ZCracksPlug/ellipse.py +++ b/src/Tools/ZCracksPlug/ellipse.py @@ -189,10 +189,10 @@ def generate(data_demi_grand_axe, data_centre, data_normale, Maillage=uF.meshCrack(FACE_FISSURE, minSize, maxSize, chordal, dim) try: - Maillage.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage.ExportMED(outFile) smesh.SetName(Maillage.GetMesh(), 'MAILLAGE_FISSURE') except: - print('ExportToMEDX() failed. Invalid file name?') + print('ExportMED() failed. Invalid file name?') ## Set names of Mesh objects diff --git a/src/Tools/ZCracksPlug/genereCrack.py b/src/Tools/ZCracksPlug/genereCrack.py index 0f434a30e..1628cd465 100644 --- a/src/Tools/ZCracksPlug/genereCrack.py +++ b/src/Tools/ZCracksPlug/genereCrack.py @@ -228,7 +228,7 @@ def generateCustom(crack, outFile): else: Group_1 = Maillage_1.CreateEmptyGroup( SMESH.NODE, 'crack' ) nbAdd = Group_1.AddFrom( Maillage_1.GetMesh() ) - Maillage_1.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage_1.ExportMED(outFile) return(True) diff --git a/src/Tools/ZCracksPlug/rectangle.py b/src/Tools/ZCracksPlug/rectangle.py index 142cac57f..f885150eb 100644 --- a/src/Tools/ZCracksPlug/rectangle.py +++ b/src/Tools/ZCracksPlug/rectangle.py @@ -216,10 +216,10 @@ def generate(data_longueur,data_largeur,data_centre, Maillage=uF.meshCrack(FACE_FISSURE, minSize, maxSize, chordal, dim) try: - Maillage.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage.ExportMED(outFile) smesh.SetName(Maillage.GetMesh(), 'MAILLAGE_FISSURE') except: - print('ExportToMEDX() failed. Invalid file name?') + print('ExportMED() failed. Invalid file name?') if salome.sg.hasDesktop(): diff --git a/src/Tools/ZCracksPlug/sphere.py b/src/Tools/ZCracksPlug/sphere.py index 94e2d6a52..04e75bb74 100644 --- a/src/Tools/ZCracksPlug/sphere.py +++ b/src/Tools/ZCracksPlug/sphere.py @@ -57,10 +57,10 @@ def generate(data_rayon,data_centre,outFile): Maillage=uF.meshCrack(FACE_FISSURE, minSize, maxSize, chordal, dim=3) try: - Maillage.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage.ExportMED(outFile) smesh.SetName(Maillage.GetMesh(), 'MAILLAGE_FISSURE') except: - print('ExportToMEDX() failed. Invalid file name?') + print('ExportMED() failed. Invalid file name?') ## Set names of Mesh objects diff --git a/src/Tools/ZCracksPlug/utilityFunctions.py b/src/Tools/ZCracksPlug/utilityFunctions.py index 997f02f7c..0acde8671 100644 --- a/src/Tools/ZCracksPlug/utilityFunctions.py +++ b/src/Tools/ZCracksPlug/utilityFunctions.py @@ -233,7 +233,7 @@ def extendElsets(meshFile, outFile=None): if len(front)==0: crackOnly=False if crackOnly: - mesh.ExportMED(outFile, 0, SMESH.MED_V2_2, 1, None ,1) + mesh.ExportMED(outFile) return('crack') # Propagates color using elem connectivity @@ -304,7 +304,7 @@ def extendElsets(meshFile, outFile=None): mesh.MakeGroupByIds('Extended_side%d' %n ,SMESH.EDGE,grElemList[2][n]) if outFile==None: outFile=meshFile - mesh.ExportMED(outFile, 0, SMESH.MED_V2_2, 1, None ,1) + mesh.ExportMED(outFile) return(True) diff --git a/src/Tools/blocFissure/exemple2.py b/src/Tools/blocFissure/exemple2.py index be2ba7cbd..ef0def57a 100644 --- a/src/Tools/blocFissure/exemple2.py +++ b/src/Tools/blocFissure/exemple2.py @@ -56,7 +56,7 @@ Quadrangle_2D = boite.Quadrangle(algo=smeshBuilder.QUADRANGLE) Hexa_3D = boite.Hexahedron(algo=smeshBuilder.Hexa) isDone = boite.Compute() smesh.SetName(boite, 'boite') -boite.ExportMED( r'boite.med', 0, SMESH.MED_V2_2, 1 ) +boite.ExportMED(r'boite.med') ## set object names smesh.SetName(boite.GetMesh(), 'boite') diff --git a/src/Tools/blocFissure/gmu/construitFissureGenerale.py b/src/Tools/blocFissure/gmu/construitFissureGenerale.py index bf331e092..7895244da 100644 --- a/src/Tools/blocFissure/gmu/construitFissureGenerale.py +++ b/src/Tools/blocFissure/gmu/construitFissureGenerale.py @@ -328,7 +328,7 @@ def construitFissureGenerale(maillagesSains, fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' ) logging.info("export maillage fini") - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py b/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py index 086291e46..a1cd1e710 100644 --- a/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py +++ b/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py @@ -57,7 +57,7 @@ def creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, [origShapes, verticesShapes, dmoyen] = \ creeZoneDefautMaillage(maillagesSains, shapeDefaut, tailleDefaut, nomZones, coordsNoeudsFissure) - maillageSain.ExportMED( fichierMaillageSain, 0, SMESH.MED_V2_2, 1 ) + maillageSain.ExportMED(fichierMaillageSain) logging.debug("fichier maillage sain %s", fichierMaillageSain) [maillageSain, internalBoundary, zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges] = \ peauInterne(fichierMaillageSain, shapeDefaut, nomZones) diff --git a/src/Tools/blocFissure/gmu/insereFissureElliptique.py b/src/Tools/blocFissure/gmu/insereFissureElliptique.py index fe408b7b6..339eca80b 100644 --- a/src/Tools/blocFissure/gmu/insereFissureElliptique.py +++ b/src/Tools/blocFissure/gmu/insereFissureElliptique.py @@ -189,7 +189,7 @@ def insereFissureElliptique(geometriesSaines, maillagesSains, if step == 18: return None - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure : %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/gmu/insereFissureGenerale.py b/src/Tools/blocFissure/gmu/insereFissureGenerale.py index 1cfb3ad2f..1c58e6b9e 100644 --- a/src/Tools/blocFissure/gmu/insereFissureGenerale.py +++ b/src/Tools/blocFissure/gmu/insereFissureGenerale.py @@ -1373,7 +1373,7 @@ def insereFissureGenerale(maillagesSains, fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' ) logging.info("export maillage fini") - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/gmu/insereFissureLongue.py b/src/Tools/blocFissure/gmu/insereFissureLongue.py index acd2fa2c3..0303f9ee3 100644 --- a/src/Tools/blocFissure/gmu/insereFissureLongue.py +++ b/src/Tools/blocFissure/gmu/insereFissureLongue.py @@ -649,7 +649,7 @@ def insereFissureLongue(geometriesSaines, maillagesSains, #isDone = maillageComplet.ReorientObject( grps[0] ) fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' ) - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/materielCasTests/cubeAngle.py b/src/Tools/blocFissure/materielCasTests/cubeAngle.py index 9b4f4481c..eb5352a76 100644 --- a/src/Tools/blocFissure/materielCasTests/cubeAngle.py +++ b/src/Tools/blocFissure/materielCasTests/cubeAngle.py @@ -63,7 +63,7 @@ Quadrangle_2D = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE) Hexa_3D = Mesh_1.Hexahedron(algo=smeshBuilder.Hexa) isDone = Mesh_1.Compute() smesh.SetName(Mesh_1, 'Mesh_1') -Mesh_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/CubeAngle.med"), 0, SMESH.MED_V2_2, 1 ) +Mesh_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/CubeAngle.med")) ## set object names smesh.SetName(Mesh_1.GetMesh(), 'Mesh_1') diff --git a/src/Tools/blocFissure/materielCasTests/cubeFin.py b/src/Tools/blocFissure/materielCasTests/cubeFin.py index 01feafa56..c7c1e0794 100644 --- a/src/Tools/blocFissure/materielCasTests/cubeFin.py +++ b/src/Tools/blocFissure/materielCasTests/cubeFin.py @@ -122,7 +122,7 @@ smesh.SetName(ENCASTR_1, 'ENCASTR') smesh.SetName(cubeFin_1.GetMesh(), 'cubeFin') smesh.SetName(Nb_Segments_1, 'Nb. Segments_1') -cubeFin_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/cubeFin.med"), 0, SMESH.MED_V2_2, 1 ) +cubeFin_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/cubeFin.med")) if salome.sg.hasDesktop(): salome.sg.updateObjBrowser() diff --git a/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py b/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py index 6fc419388..b5fe06e21 100644 --- a/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py +++ b/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py @@ -144,7 +144,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(6,[],[ ]) Nb_Segments_3.SetDistrType( 0 ) isDone = CylindreSain_1.Compute() smesh.SetName(CylindreSain_1, 'CylindreSain') -CylindreSain_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests//CylindreSain.med"), 0, SMESH.MED_V2_2, 1 ) +CylindreSain_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests//CylindreSain.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/disque_perce.py b/src/Tools/blocFissure/materielCasTests/disque_perce.py index 43640c422..316fb0701 100644 --- a/src/Tools/blocFissure/materielCasTests/disque_perce.py +++ b/src/Tools/blocFissure/materielCasTests/disque_perce.py @@ -70,7 +70,7 @@ status = Disque_1.AddHypothesis(Nb_Segments_2,Compound_4) Quadrangle_2D = Disque_1.Quadrangle(algo=smeshBuilder.QUADRANGLE) isDone = Disque_1.Compute() smesh.SetName(Disque_1, 'Disque') -Disque_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/disque.med"), 0, SMESH.MED_V2_2, 1 ) +Disque_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/disque.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py b/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py index 40cb7c8d5..faf41c5e5 100644 --- a/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py +++ b/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py @@ -87,7 +87,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(25) Nb_Segments_3.SetDistrType( 0 ) isDone = EprouvetteCourbe_1.Compute() smesh.SetName(EprouvetteCourbe_1, 'EprouvetteCourbe') -EprouvetteCourbe_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/EprouvetteCourbe.med"), 0, SMESH.MED_V2_2, 1 ) +EprouvetteCourbe_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/EprouvetteCourbe.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py b/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py index 2f6bcff20..3420d7cb4 100644 --- a/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py +++ b/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py @@ -121,7 +121,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(10,[],[ ]) Nb_Segments_3.SetDistrType( 0 ) isDone = eprouvetteDroite_1.Compute() smesh.SetName(eprouvetteDroite_1, 'eprouvetteDroite') -eprouvetteDroite_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/eprouvetteDroite.med"), 0, SMESH.MED_V2_2, 1 ) +eprouvetteDroite_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/eprouvetteDroite.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/fissureGauche.py b/src/Tools/blocFissure/materielCasTests/fissureGauche.py index 18796848d..934b9b402 100644 --- a/src/Tools/blocFissure/materielCasTests/fissureGauche.py +++ b/src/Tools/blocFissure/materielCasTests/fissureGauche.py @@ -116,7 +116,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(5,[],[ ]) Nb_Segments_3.SetDistrType( 0 ) isDone = objetSain_1.Compute() smesh.SetName(objetSain_1, 'objetSain') -objetSain_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/faceGaucheSain.med"), 0, SMESH.MED_V2_2, 1 ) +objetSain_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/faceGaucheSain.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/fissureGauche2.py b/src/Tools/blocFissure/materielCasTests/fissureGauche2.py index c2fcbb0c4..e46b5a8e4 100644 --- a/src/Tools/blocFissure/materielCasTests/fissureGauche2.py +++ b/src/Tools/blocFissure/materielCasTests/fissureGauche2.py @@ -84,7 +84,7 @@ Quadrangle_2D = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE) Hexa_3D = Mesh_1.Hexahedron(algo=smeshBuilder.Hexa) isDone = Mesh_1.Compute() smesh.SetName(Mesh_1, 'Mesh_1') -Mesh_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/boiteSaine.med"), 0, SMESH.MED_V2_2, 1 ) +Mesh_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/boiteSaine.med")) ## set object names smesh.SetName(Mesh_1.GetMesh(), 'Mesh_1') diff --git a/src/Tools/blocFissure/materielCasTests/vis.py b/src/Tools/blocFissure/materielCasTests/vis.py index 67983ac1b..8db9aaca6 100644 --- a/src/Tools/blocFissure/materielCasTests/vis.py +++ b/src/Tools/blocFissure/materielCasTests/vis.py @@ -192,7 +192,7 @@ visHex80 = smesh.CopyMesh( coupe_vis_1, 'visHex80', 1, 0) [ tige_2, section_2, tige_haute_2, rond_2, tete_2, section_tete_2, conge_2, appui_2, p_imp_2, tige_rotated, tige_top, section_rotated, section_top, tige_haute_rotated, tige_haute_top, rond_rotated, rond_top, tete_rotated, tete_top, section_tete_rotated, section_tete_top, conge_rotated, conge_top, appui_rotated, appui_top, p_imp_rotated, p_imp_top ] = visHex80.GetGroups() Sub_mesh_1 = Regular_1D_1.GetSubMesh() Sub_mesh_2 = Regular_1D_2.GetSubMesh() -visHex80.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/visSain.med"), 0, SMESH.MED_V2_2, 1 ) +visHex80.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/visSain.med")) ## Set names of Mesh objects diff --git a/src/Tools/padder/spadderpy/gui/plugindialog.py b/src/Tools/padder/spadderpy/gui/plugindialog.py index 6830954ae..44796efa5 100644 --- a/src/Tools/padder/spadderpy/gui/plugindialog.py +++ b/src/Tools/padder/spadderpy/gui/plugindialog.py @@ -211,7 +211,7 @@ class PluginDialog(QDialog): name. This returns the filename. ''' filename=str("/tmp/padder_inputfile_"+meshName+".med") - meshObject.ExportToMEDX( filename, 0, SMESH.MED_V2_2, 1, 1 ) + meshObject.ExportMED(filename, False, True, True) return filename def clear(self):