-// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 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
#include "MED_Wrapper.hxx"
#include "MED_TStructures.hxx"
#include "MED_Utilities.hxx"
+#include "MED_TFile.hxx"
+#include "MEDFileUtilities.hxx"
#include <med.h>
#include <med_err.h>
#include <med_proto.h>
+#ifdef WIN32
+#include <windows.h>
+#endif
+
#include <boost/version.hpp>
#ifdef _DEBUG_
static int MYDEBUG = 0;
static int MYVALUEDEBUG = 0;
#else
-static int MYDEBUG = 0;
-static int MYVALUEDEBUG = 0;
+// static int MYDEBUG = 0; // unused in release mode
+// static int MYVALUEDEBUG = 0; // unused in release mode
#endif
namespace MED
}
//---------------------------------------------------------------
- class TFile
+ const TIdt& MEDIDTHoder::Id() const
{
- TFile();
- TFile(const TFile&);
-
- public:
- TFile(const std::string& theFileName, TInt theMinor=-1):
- myCount(0),
- myFid(0),
- myFileName(theFileName),
- myMinor(theMinor)
- {
- if ((myMinor < 0) || (myMinor > MED_MINOR_NUM)) myMinor = MED_MINOR_NUM;
- }
+ if (myFid < 0)
+ EXCEPTION(std::runtime_error, "TFile - GetFid() < 0");
+ return myFid;
+ }
- ~TFile()
+ void TMemFile::Open(EModeAcces theMode, TErr* theErr)
+ {
+ if (this->myCount++ == 0)
{
- Close();
+ std::string dftFileName = MEDCoupling::MEDFileWritableStandAlone::GenerateUniqueDftFileNameInMem();
+ med_access_mode modeTmp(MED_ACC_CREAT);
+ if(memfile.app_image_ptr)
+ modeTmp = med_access_mode(theMode);
+ myFid = MEDmemFileOpen(dftFileName.c_str(),&memfile,MED_FALSE,modeTmp);
}
-
- void
- Open(EModeAcces theMode,
- TErr* theErr = NULL)
- {
- if (myCount++ == 0) {
- const char* aFileName = myFileName.c_str();
- myFid = MEDfileVersionOpen(aFileName,med_access_mode(theMode), MED_MAJOR_NUM, myMinor, MED_RELEASE_NUM);
+ if (theErr)
+ *theErr = TErr(myFid);
+ else if (myFid < 0)
+ EXCEPTION(std::runtime_error,"TMemFile - MEDmemFileOpen");
+ }
+
+ TFile::TFile(const std::string& theFileName, TInt theMajor, TInt theMinor):
+ myFileName(theFileName),
+ myMajor(theMajor),
+ myMinor(theMinor)
+ {
+ if ((myMajor < 0) || (myMajor > MED_MAJOR_NUM)) myMajor = MED_MAJOR_NUM;
+ if ((myMinor < 0) || (myMajor == MED_MAJOR_NUM && myMinor > MED_MINOR_NUM)) myMinor = MED_MINOR_NUM;
+ }
+
+ void TFile::Open(EModeAcces theMode, TErr* theErr)
+ {
+ if (myCount++ == 0) {
+ const char* aFileName = myFileName.c_str();
+#ifdef WIN32
+ if (med_access_mode(theMode) == MED_ACC_RDWR) {
+ // Force removing readonly attribute from a file under Windows, because of a bug in the HDF5
+ std::string aReadOlnyRmCmd = "attrib -r \"" + myFileName + "\"> nul 2>&1";
+#ifdef UNICODE
+ const char* to_decode = aReadOlnyRmCmd.c_str();
+ int size_needed = MultiByteToWideChar(CP_UTF8, 0, to_decode, strlen(to_decode), NULL, 0);
+ wchar_t* awReadOlnyRmCmd = new wchar_t[size_needed + 1];
+ MultiByteToWideChar(CP_UTF8, 0, to_decode, strlen(to_decode), awReadOlnyRmCmd, size_needed);
+ awReadOlnyRmCmd[size_needed] = '\0';
+ _wsystem(awReadOlnyRmCmd);
+ delete[] awReadOlnyRmCmd;
+#else
+ system(aReadOlnyRmCmd.c_str());
+#endif
}
- if (theErr)
- *theErr = TErr(myFid);
- else if (myFid < 0)
- EXCEPTION(std::runtime_error,"TFile - MEDfileVersionOpen('"<<myFileName<<"',"<<theMode<<"',"<< MED_MAJOR_NUM<<"',"<< myMinor<<"',"<< MED_RELEASE_NUM<<")");
- }
-
- const TIdt&
- Id() const
- {
- if (myFid < 0)
- EXCEPTION(std::runtime_error, "TFile - GetFid() < 0");
- return myFid;
- }
-
- void
- Close()
- {
- if (--myCount == 0)
- MEDfileClose(myFid);
+#endif
+ myFid = MEDfileVersionOpen(aFileName,med_access_mode(theMode), myMajor, myMinor, MED_RELEASE_NUM);
}
-
- protected:
- TInt myCount;
- TIdt myFid;
- std::string myFileName;
- TInt myMinor;
- };
+ if (theErr)
+ *theErr = TErr(myFid);
+ else if (myFid < 0)
+ EXCEPTION(std::runtime_error,"TFile - MEDfileVersionOpen('"<<myFileName<<"',"<<theMode<<"',"<< myMajor <<"',"<< myMinor<<"',"<< MED_RELEASE_NUM<<")");
+ }
//---------------------------------------------------------------
class TFileWrapper
{
- PFile myFile;
+ PFileInternal myFile;
TInt myMinor;
public:
- TFileWrapper(const PFile& theFile,
- EModeAcces theMode,
- TErr* theErr = NULL,
- TInt theMinor=-1):
+ TFileWrapper(const PFileInternal& theFile,
+ EModeAcces theMode,
+ TErr* theErr = NULL,
+ TInt theMinor=-1):
myFile(theFile),
myMinor(theMinor)
{
//---------------------------------------------------------------
TWrapper
- ::TWrapper(const std::string& theFileName, TInt theMinor):
- myMinor(theMinor),
- myFile(new TFile(theFileName, theMinor))
+ ::TWrapper(const std::string& theFileName, bool write, TFileInternal *tfileInst, TInt theMajor, TInt theMinor):
+ myMajor(theMajor),
+ myMinor(theMinor)
{
+ if(!tfileInst)
+ myFile.reset(new TFile(theFileName, theMajor, theMinor) );
+ else
+ myFile.reset(new TFileDecorator(tfileInst) );
+
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 ( write ) {
+ myFile->Open(eLECTURE_ECRITURE, &aRet);
+ if (aRet < 0) {
+ myFile->Close();
+ myFile->Open(eCREATION, &aRet);
+ }
}
- if (aRet < 0) {
- myFile->Close();
- myFile->Open(eCREATION, &aRet);
+ else {
+ myFile->Open(eLECTURE, &aRet);
}
}
//----------------------------------------------------------------------------
void
TWrapper
- ::GetMeshInfo(TInt theMeshId,
+ ::GetMeshInfo(TInt theMeshId,
MED::TMeshInfo& theInfo,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
void
TWrapper
::SetMeshInfo(const MED::TMeshInfo& theInfo,
- TErr* theErr)
+ TErr* theErr)
{
TErr aRet;
SetMeshInfo(theInfo, eLECTURE_ECRITURE, &aRet);
void
TWrapper
::SetMeshInfo(const MED::TMeshInfo& theInfo,
- EModeAcces theMode,
- TErr* theErr)
+ EModeAcces theMode,
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, theMode, theErr, myMinor);
//----------------------------------------------------------------------------
PMeshInfo
TWrapper
- ::CrMeshInfo(TInt theDim,
- TInt theSpaceDim,
+ ::CrMeshInfo(TInt theDim,
+ TInt theSpaceDim,
const std::string& theValue,
- EMaillage theType,
+ EMaillage theType,
const std::string& theDesc)
{
return PMeshInfo(new TTMeshInfo
//----------------------------------------------------------------------------
PMeshInfo
TWrapper
- ::GetPMeshInfo(TInt theId,
+ ::GetPMeshInfo(TInt theId,
TErr* theErr)
{
PMeshInfo anInfo = CrMeshInfo();
TInt
TWrapper
::GetNbFamilies(const MED::TMeshInfo& theInfo,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
//----------------------------------------------------------------------------
TInt
TWrapper
- ::GetNbFamAttr(TInt theFamId,
+ ::GetNbFamAttr(TInt theFamId,
const MED::TMeshInfo& theInfo,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
//----------------------------------------------------------------------------
TInt
TWrapper
- ::GetNbFamGroup(TInt theFamId,
+ ::GetNbFamGroup(TInt theFamId,
const MED::TMeshInfo& theInfo,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
//----------------------------------------------------------------------------
void
TWrapper
- ::GetFamilyInfo(TInt theFamId,
+ ::GetFamilyInfo(TInt theFamId,
MED::TFamilyInfo& theInfo,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
void
TWrapper
::SetFamilyInfo(const MED::TFamilyInfo& theInfo,
- TErr* theErr)
+ TErr* theErr)
{
TErr aRet;
SetFamilyInfo(theInfo, eLECTURE_ECRITURE, &aRet);
void
TWrapper
::SetFamilyInfo(const MED::TFamilyInfo& theInfo,
- EModeAcces theMode,
- TErr* theErr)
+ EModeAcces theMode,
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, theMode, theErr, myMinor);
//----------------------------------------------------------------------------
PFamilyInfo
TWrapper
- ::CrFamilyInfo(const PMeshInfo& theMeshInfo,
- TInt theNbGroup,
- TInt theNbAttr,
- TInt theId,
+ ::CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbGroup,
+ TInt theNbAttr,
+ TInt theId,
const std::string& theValue)
{
return PFamilyInfo(new TTFamilyInfo
//----------------------------------------------------------------------------
PFamilyInfo
TWrapper
- ::CrFamilyInfo(const PMeshInfo& theMeshInfo,
- const std::string& theValue,
- TInt theId,
- const MED::TStringSet& theGroupNames,
+ ::CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ const std::string& theValue,
+ TInt theId,
+ const MED::TStringSet& theGroupNames,
const MED::TStringVector& theAttrDescs,
- const MED::TIntVector& theAttrIds,
- const MED::TIntVector& theAttrVals)
+ const MED::TIntVector& theAttrIds,
+ const MED::TIntVector& theAttrVals)
{
return PFamilyInfo(new TTFamilyInfo
(theMeshInfo,
//----------------------------------------------------------------------------
PFamilyInfo
TWrapper
- ::CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ ::CrFamilyInfo(const PMeshInfo& theMeshInfo,
const PFamilyInfo& theInfo)
{
return PFamilyInfo(new TTFamilyInfo
PFamilyInfo
TWrapper
::GetPFamilyInfo(const PMeshInfo& theMeshInfo,
- TInt theId,
- TErr* theErr)
+ TInt theId,
+ TErr* theErr)
{
// must be reimplemented in connection with mesh type eSTRUCTURE
// if (theMeshInfo->GetType() != eNON_STRUCTURE)
//----------------------------------------------------------------------------
void
TWrapper
- ::GetNames(TElemInfo& theInfo,
- TInt theNb,
- EEntiteMaillage theEntity,
+ ::GetNames(TElemInfo& theInfo,
+ TInt /*theNb*/,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
//----------------------------------------------------------------------------
void
TWrapper
- ::SetNames(const TElemInfo& theInfo,
- EEntiteMaillage theEntity,
+ ::SetNames(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
SetNames(theInfo, eLECTURE_ECRITURE, theEntity, theGeom, theErr);
}
//----------------------------------------------------------------------------
void
TWrapper
- ::SetNames(const TElemInfo& theInfo,
- EModeAcces theMode,
- EEntiteMaillage theEntity,
+ ::SetNames(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, theMode, theErr, myMinor);
MED_NO_DT,
MED_NO_IT,
anEntity,
- aGeom,
+ aGeom,
(TInt)anInfo.myElemNames->size(),
&anElemNames);
if (theErr)
//----------------------------------------------------------------------------
void
TWrapper
- ::GetNumeration(TElemInfo& theInfo,
- TInt theNb,
- EEntiteMaillage theEntity,
+ ::GetNumeration(TElemInfo& theInfo,
+ TInt /*theNb*/,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
//----------------------------------------------------------------------------
void
TWrapper
- ::SetNumeration(const TElemInfo& theInfo,
- EEntiteMaillage theEntity,
+ ::SetNumeration(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
SetNumeration(theInfo, eLECTURE_ECRITURE, theEntity, theGeom, theErr);
}
//----------------------------------------------------------------------------
void
TWrapper
- ::SetNumeration(const TElemInfo& theInfo,
- EModeAcces theMode,
- EEntiteMaillage theEntity,
+ ::SetNumeration(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, theMode, theErr, myMinor);
//----------------------------------------------------------------------------
void
TWrapper
- ::GetFamilies(TElemInfo& theInfo,
- TInt theNb,
- EEntiteMaillage theEntity,
+ ::GetFamilies(TElemInfo& theInfo,
+ TInt /*theNb*/,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, eLECTURE, theErr, myMinor);
//----------------------------------------------------------------------------
void
TWrapper
- ::SetFamilies(const TElemInfo& theInfo,
- EEntiteMaillage theEntity,
+ ::SetFamilies(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
SetFamilies(theInfo, eLECTURE_ECRITURE, theEntity, theGeom, theErr);
}
//----------------------------------------------------------------------------
void
TWrapper
- ::SetFamilies(const TElemInfo& theInfo,
- EModeAcces theMode,
- EEntiteMaillage theEntity,
+ ::SetFamilies(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TErr* theErr)
+ TErr* theErr)
{
TFileWrapper aFileWrapper(myFile, theMode, theErr, myMinor);
TInt
TWrapper
::GetNbNodes(const MED::TMeshInfo& theMeshInfo,
- TErr* theErr)
+ TErr* theErr)
{
return GetNbNodes(theMeshInfo, eCOOR, theErr);
}
TValueHolder<EConnectivite, med_connectivity_mode> aConnMode (theInfo.myConnMode);
TErr aRet;
+ med_bool dummy;
+ aRet = MEDmeshnEntity(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ MED_NAME,
+ aConnMode,
+ &dummy, &dummy);
+ if ( aRet > 0 )
+ {
+ // names are present in the file, they will be read in spite of theInfo.myIsElemNames
+ theInfo.myIsElemNames = eVRAI;
+ theInfo.myElemNames.reset( new TString( theInfo.myNbElem * GetPNOMLength() + 1 ));
+ anElemNames.myRepresentation = & ((TString&) theInfo.myElemNames )[0];
+ }
+
aRet = MEDmeshElementRd(myFile->Id(),
&aMeshName,
MED_NO_DT,
EXCEPTION(std::runtime_error, "GetCellInfo - MEDmeshElementRd(...)");
if (anIsFamNum == MED_FALSE)
- {
- int mySize = (int) theInfo.myFamNum->size();
- theInfo.myFamNum->clear();
- theInfo.myFamNum->resize(mySize, 0);
- }
+ {
+ int mySize = (int) theInfo.myFamNum->size();
+ theInfo.myFamNum->clear();
+ theInfo.myFamNum->resize(mySize, 0);
+ }
}
//----------------------------------------------------------------------------
PCellInfo
TWrapper
- ::CrCellInfo(const PMeshInfo& theMeshInfo,
- EEntiteMaillage theEntity,
+ ::CrCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
EGeometrieElement theGeom,
- TInt theNbElem,
- EConnectivite theConnMode,
- EBooleen theIsElemNum,
- EBooleen theIsElemNames,
- EModeSwitch theMode)
+ TInt theNbElem,
+ EConnectivite theConnMode,
+ EBooleen theIsElemNum,
+ EBooleen theIsElemNames,
+ EModeSwitch theMode)
{
return PCellInfo(new TTCellInfo
(theMeshInfo,
//----------------------------------------------------------------------------
EGeometrieElement
TWrapper
- ::GetBallGeom(const TMeshInfo& theMeshInfo)
+ ::GetBallGeom(const TMeshInfo& /*theMeshInfo*/)
{
TErr anError;
TFileWrapper aFileWrapper(myFile, eLECTURE, &anError, myMinor);
// write node ids
SetCellInfo(theInfo, theMode, theErr);
- if (theErr && theErr < 0)
+ if (theErr && *theErr < 0)
return;
// write diameter
//----------------------------------------------------------------------------
void
TWrapper
- ::GetGaussInfo(TInt theId,
+ ::GetGaussInfo(TInt /*theId*/,
TGaussInfo& theInfo,
TErr* theErr)
{
//----------------------------------------------------------------------------
void
TWrapper
- ::GetProfileInfo(TInt theId,
+ ::GetProfileInfo(TInt /*theId*/,
TProfileInfo& theInfo,
TErr* theErr)
{
//----------------------------------------------------------------------------
PGrilleInfo
TWrapper
- ::CrGrilleInfo(const PMeshInfo& theMeshInfo)
+ ::CrGrilleInfo(const PMeshInfo& /*theMeshInfo*/)
{
return PGrilleInfo(); // not implemented????
}