mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-11 16:19:16 +05:00
[bos #40653][CEA] New mesh import export formats with meshio.
Added using MESHIO_VERSION env variable to detect meshio version. Exodus format removed from a file filter on Windows.
This commit is contained in:
parent
35c26749e5
commit
e85c9d5b6b
@ -137,7 +137,9 @@ const QStringList& SMESHGUI_Meshio::GetExportFileFilter()
|
|||||||
"AVS-UCD (*.avs)",
|
"AVS-UCD (*.avs)",
|
||||||
"CGNS (*.cgns)",
|
"CGNS (*.cgns)",
|
||||||
"DOLFIN XML (*.xml)",
|
"DOLFIN XML (*.xml)",
|
||||||
|
#if !defined(WIN32)
|
||||||
"Exodus (*.e *.exo)",
|
"Exodus (*.e *.exo)",
|
||||||
|
#endif
|
||||||
"FLAC3D (*.f3grid)",
|
"FLAC3D (*.f3grid)",
|
||||||
"Gmsh 2.2 (*.msh)",
|
"Gmsh 2.2 (*.msh)",
|
||||||
"Gmsh 4.0, and 4.1 (*.msh)",
|
"Gmsh 4.0, and 4.1 (*.msh)",
|
||||||
@ -241,19 +243,7 @@ QString SMESHGUI_Meshio::GetFileName(QString& selectedFilter, const bool isOpen/
|
|||||||
*/
|
*/
|
||||||
bool SMESHGUI_Meshio::IsMeshioInstalled()
|
bool SMESHGUI_Meshio::IsMeshioInstalled()
|
||||||
{
|
{
|
||||||
auto IsAbleToCallMeshio = []() -> bool
|
const bool isInstalled = SMESH_Meshio::IsMeshioInstalled();
|
||||||
{
|
|
||||||
// Try to call meshio to check if it's present
|
|
||||||
const std::string cmd =
|
|
||||||
SMESH_Meshio::IsModernPythonVersion() ? "meshio --version" : "meshio-info --version";
|
|
||||||
|
|
||||||
const int status = system(cmd.c_str());
|
|
||||||
MESSAGE("status: " << status);
|
|
||||||
|
|
||||||
return status == 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const bool isInstalled = IsAbleToCallMeshio();
|
|
||||||
if (!isInstalled)
|
if (!isInstalled)
|
||||||
{
|
{
|
||||||
SUIT_MessageBox::warning(
|
SUIT_MessageBox::warning(
|
||||||
|
@ -71,7 +71,7 @@ SMESH_Meshio::~SMESH_Meshio()
|
|||||||
void SMESH_Meshio::Convert(const QString& sourceFileName, const QString& targetFileName) const
|
void SMESH_Meshio::Convert(const QString& sourceFileName, const QString& targetFileName) const
|
||||||
{
|
{
|
||||||
// Execute meshio convert command
|
// Execute meshio convert command
|
||||||
const QString convert = IsModernPythonVersion() ? "meshio convert " : "meshio-convert ";
|
const QString convert = IsModernMeshioVersion() ? "meshio convert " : "meshio-convert ";
|
||||||
const QString optArgs = GetConvertOptArgs();
|
const QString optArgs = GetConvertOptArgs();
|
||||||
|
|
||||||
const std::string cmd =
|
const std::string cmd =
|
||||||
@ -128,6 +128,133 @@ void SMESH_Meshio::RemoveTempFile()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns meshio version string that has valid integer at least in the first position.
|
||||||
|
*/
|
||||||
|
QString SMESH_Meshio::GetMeshioVersion()
|
||||||
|
{
|
||||||
|
auto IsVersionStringValid = [](const QString& version) -> bool
|
||||||
|
{
|
||||||
|
if (version.isEmpty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have an integer at least at the first position
|
||||||
|
const QStringList curVersionNums = version.split('.');
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
const int firstNum = curVersionNums[0].toInt(&ok);
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
ERROR_MESSAGE("meshio version value is not valid!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
MESSAGE("meshio version first number: " << firstNum);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto GetMeshioVersionFromEnv = []() -> QString
|
||||||
|
{
|
||||||
|
const char *envVar = std::getenv("MESHIO_VERSION");
|
||||||
|
if (envVar && (envVar[0] != '\0'))
|
||||||
|
{
|
||||||
|
MESSAGE("MESHIO_VERSION: " << envVar);
|
||||||
|
return envVar;
|
||||||
|
}
|
||||||
|
|
||||||
|
MESSAGE("MESHIO_VERSION is not set!");
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
|
auto GetMeshioVersionHelper = [&]() -> QString
|
||||||
|
{
|
||||||
|
// Check if we can get a version from environment
|
||||||
|
const QString meshioVersionEnv = GetMeshioVersionFromEnv();
|
||||||
|
if (IsVersionStringValid(meshioVersionEnv))
|
||||||
|
{
|
||||||
|
return meshioVersionEnv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to gess a version by installed Python version
|
||||||
|
const QString meshioVersionByPython = IsModernPythonVersion() ? "5" : "4";
|
||||||
|
MESSAGE("meshio version was defined by Python version: " << meshioVersionByPython.toStdString());
|
||||||
|
|
||||||
|
return meshioVersionByPython;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const QString meshioVersion = GetMeshioVersionHelper();
|
||||||
|
return meshioVersion;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns true if we're going to use meshio version of 5.0 or greater.
|
||||||
|
*/
|
||||||
|
bool SMESH_Meshio::IsModernMeshioVersion()
|
||||||
|
{
|
||||||
|
// It's a version when meshio commands were changed from using
|
||||||
|
// many executables for each operation to one for everything (meshio 5.0).
|
||||||
|
// For example, from
|
||||||
|
// meshio-convert input.msh output.vtk
|
||||||
|
// to
|
||||||
|
// meshio convert input.msh output.vtk
|
||||||
|
|
||||||
|
auto IsModernVersion = [&]() -> bool
|
||||||
|
{
|
||||||
|
const QString curVersion = GetMeshioVersion();
|
||||||
|
|
||||||
|
const int minReqVersion = 5;
|
||||||
|
const QStringList curVersionNums = curVersion.split('.');
|
||||||
|
if (minReqVersion > curVersionNums[0].toInt())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const bool isModern = IsModernVersion();
|
||||||
|
return isModern;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns true if meshio is installed
|
||||||
|
*/
|
||||||
|
bool SMESH_Meshio::IsMeshioInstalled()
|
||||||
|
{
|
||||||
|
auto IsAllowedFromEnvironment = []() -> bool
|
||||||
|
{
|
||||||
|
const QString curVersion = GetMeshioVersion();
|
||||||
|
|
||||||
|
// Check if we explicitly set off using of meshio from environment
|
||||||
|
const QStringList curVersionNums = curVersion.split('.');
|
||||||
|
const int firstNum = curVersionNums[0].toInt();
|
||||||
|
if (firstNum <= 0)
|
||||||
|
{
|
||||||
|
MESSAGE("meshio was set as not installed from an environment");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto IsAbleToCallMeshio = []() -> bool
|
||||||
|
{
|
||||||
|
// Try to call meshio to check if it's present
|
||||||
|
const std::string cmd =
|
||||||
|
SMESH_Meshio::IsModernMeshioVersion() ? "meshio --version" : "meshio-info --version";
|
||||||
|
|
||||||
|
const int status = system(cmd.c_str());
|
||||||
|
MESSAGE("status: " << status);
|
||||||
|
|
||||||
|
return status == 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const bool isInstalled = IsAllowedFromEnvironment() && IsAbleToCallMeshio();
|
||||||
|
return isInstalled;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns true if current Python equal or newer than required version for
|
Returns true if current Python equal or newer than required version for
|
||||||
meshio release from 5.0 and greater.
|
meshio release from 5.0 and greater.
|
||||||
|
@ -42,6 +42,9 @@ public:
|
|||||||
QString CreateTempFileName(const QString& targetFileName);
|
QString CreateTempFileName(const QString& targetFileName);
|
||||||
void Convert(const QString& sourceFileName, const QString& targetFileName) const;
|
void Convert(const QString& sourceFileName, const QString& targetFileName) const;
|
||||||
|
|
||||||
|
static QString GetMeshioVersion();
|
||||||
|
static bool IsModernMeshioVersion();
|
||||||
|
static bool IsMeshioInstalled();
|
||||||
static bool IsModernPythonVersion();
|
static bool IsModernPythonVersion();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -37,6 +37,8 @@ from salome.smesh import smeshBuilder
|
|||||||
|
|
||||||
import SALOME
|
import SALOME
|
||||||
|
|
||||||
|
import platform
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
EXPORT_TITLE = 'Export'
|
EXPORT_TITLE = 'Export'
|
||||||
IMPORT_TITLE = 'Import'
|
IMPORT_TITLE = 'Import'
|
||||||
@ -92,7 +94,7 @@ def file_extensions():
|
|||||||
Commented formats should be checked on next meshio release to see if the problem was fixed.
|
Commented formats should be checked on next meshio release to see if the problem was fixed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return [
|
extensions = [
|
||||||
'.avs',
|
'.avs',
|
||||||
'.bdf',
|
'.bdf',
|
||||||
# '.cgns', # meshio IndexError: index 2 is out of bounds for axis 1 with size 2
|
# '.cgns', # meshio IndexError: index 2 is out of bounds for axis 1 with size 2
|
||||||
@ -131,7 +133,10 @@ def file_extensions():
|
|||||||
'.xmf',
|
'.xmf',
|
||||||
'.xml'
|
'.xml'
|
||||||
]
|
]
|
||||||
|
if platform.system() == 'Windows':
|
||||||
|
extensions = [ext for ext in extensions if not ext in ['.e', '.exo']] # needs to be digged out - presumably an issue about encoding.
|
||||||
|
|
||||||
|
return extensions
|
||||||
|
|
||||||
def exception_handle(file_name, errors, operation_type, ex_text):
|
def exception_handle(file_name, errors, operation_type, ex_text):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user