From: azakir Date: Tue, 5 Jan 2021 10:18:05 +0000 (+0100) Subject: replace files in their respective rep X-Git-Tag: V9_7_0a1~18^2~41 X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=commitdiff_plain;h=1a5fa0f4c0bb69276916a503612b0388613d0193 replace files in their respective rep --- diff --git a/src/ADAPT/CMakeLists.txt b/src/ADAPT/CMakeLists.txt index 728d7203d..fe9b1ef74 100644 --- a/src/ADAPT/CMakeLists.txt +++ b/src/ADAPT/CMakeLists.txt @@ -21,6 +21,7 @@ # additional include directories INCLUDE_DIRECTORIES( ${KERNEL_INCLUDE_DIRS} + ${MEDCOUPLING_INCLUDE_DIRS} ) # additional preprocessor / compiler flags @@ -31,6 +32,7 @@ ADD_DEFINITIONS( # libraries to link to SET(_link_LIBRARIES ${KERNEL_SALOMELocalTrace} + ${MEDCoupling_medloader} ) # --- headers --- @@ -48,6 +50,7 @@ SET(ADAPTImpl_HEADERS HOMARD_YACS.hxx HomardDriver.hxx YACSDriver.hxx + MG_ADAPT.hxx ) # --- sources --- @@ -64,6 +67,7 @@ SET(ADAPTImpl_SOURCES HOMARD_YACS.cxx HomardDriver.cxx YACSDriver.cxx + MG_ADAPT.cxx ) # --- rules --- diff --git a/src/ADAPT/MG_ADAPT.cxx b/src/ADAPT/MG_ADAPT.cxx new file mode 100644 index 000000000..8a74bc78e --- /dev/null +++ b/src/ADAPT/MG_ADAPT.cxx @@ -0,0 +1,1398 @@ +// Copyright (C) 2007-2020 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/ +// file : MG_ADAPT.cxx + +#include "MG_ADAPT.hxx" + +#include "MeshFormatReader.hxx" +#include "MeshFormatWriter.hxx" +#include "MEDFileMesh.hxx" +#include "MCAuto.hxx" +#include "MEDFileData.hxx" +#include "MEDFileField.hxx" +#include "MEDCouplingFieldDouble.hxx" + +#include +#include +#include +#include +#include +#include +#include + +static std::string removeFile(std::string fileName, int& notOk) +{ + std::string errStr; + notOk = std::remove(fileName.c_str()); + if (notOk) errStr = ToComment(" \n error while removing file : ") + << fileName; + else errStr= ToComment("\n file : ")<< fileName << " succesfully deleted! \n "; + + return errStr; +} +namespace +{ +struct GET_DEFAULT // struct used to get default value from GetOptionValue() +{ + bool isDefault; + operator bool* () { + return &isDefault; + } +}; +} + +//---------------------------------------------------------------------------------------- +MgAdapt::MgAdapt() +{ + data = new MgAdaptHypothesisData(); + data->myInMeshName = ""; + data->fromMedFile = defaultFromMedFile(); + data->myFileInDir = defaultWorkingDirectory(); + data->myMeshFileIn = ""; + data->myFileOutDir = defaultWorkingDirectory(); + data->myOutMeshName = ""; + data->myMeshFileOut = ""; + data->myMeshOutMed = defaultMeshOutMed(); + data->myPublish = defaultPublish(); + data->myUseLocalMap = defaultUseLocalMap(); + data->myUseBackgroundMap = defaultUseBackgroundMap(); + data->myFileSizeMapDir = defaultWorkingDirectory(); + data->myMeshFileBackground = ""; + data->myUseConstantValue = defaultUseConstantValue(); + data->myConstantValue = 0.0; + data->myFieldName = ""; + data->myUseNoTimeStep = defaultUseNoTimeStep(); + data->myUseLastTimeStep = defaultUseLastTimeStep(); + data->myUseChosenTimeStep = defaultUseChosenTimeStep(); + data->myTimeStep = -2; + data->myRank = -2; + data->myWorkingDir = defaultWorkingDirectory(); + data->myLogFile = defaultLogFile(); + data->myVerboseLevel = defaultVerboseLevel(); + data->myPrintLogInFile = defaultPrintLogInFile(); + data->myKeepFiles = defaultKeepFiles(); + data->myRemoveLogOnSuccess = defaultRemoveLogOnSuccess(); + + buildModel(); + setAll(); +} +MgAdapt::MgAdapt(MgAdaptHypothesisData* myData) +{ + data = new MgAdaptHypothesisData(); + setData(myData); + buildModel(); +} + +MgAdapt::MgAdapt( const MgAdapt& copy) +{ + + data = new MgAdaptHypothesisData(); + MgAdaptHypothesisData *copyData = copy.getData(); + copyMgAdaptHypothesisData(copyData); + setAll(); + + this->_option2value = copy._option2value; + this->_customOption2value = copy._customOption2value; + this->_defaultOptionValues = copy._defaultOptionValues; + this->_doubleOptions = copy._doubleOptions; + this->_charOptions = copy._charOptions; + this->_boolOptions = copy._boolOptions; + +} + + + +//----------------------------------------------------------------------------------------- +MgAdapt::~MgAdapt() +{ + + delete data; + +} +void MgAdapt::buildModel() +{ + + const char* boolOptionNames[] = { "compute_ridges", // yes + "" // mark of end + }; + // const char* intOptionNames[] = { "max_number_of_errors_printed", // 1 + // "max_number_of_threads", // 4 + // "" // mark of end + // }; + const char* doubleOptionNames[] = { "max_memory", // 0 + "" // mark of end + }; + const char* charOptionNames[] = { "components", // "yes" + "adaptation", // both + "" // mark of end + }; + + int i = 0; + while (boolOptionNames[i][0]) + { + _boolOptions.insert( boolOptionNames[i] ); + _option2value[boolOptionNames[i++]].clear(); + } + // i = 0; + // while (intOptionNames[i][0]) + // _option2value[intOptionNames[i++]].clear(); + + i = 0; + while (doubleOptionNames[i][0]) { + _doubleOptions.insert(doubleOptionNames[i]); + _option2value[doubleOptionNames[i++]].clear(); + } + i = 0; + while (charOptionNames[i][0]) { + _charOptions.insert(charOptionNames[i]); + _option2value[charOptionNames[i++]].clear(); + } + + // default values to be used while MG-Adapt + + _defaultOptionValues["adaptation" ] = "both"; + _defaultOptionValues["components" ] = "outside components"; + _defaultOptionValues["compute_ridges" ] = "yes"; + _defaultOptionValues["max_memory" ] = ToComment(defaultMaximumMemory()); +} + +//============================================================================= +TOptionValues MgAdapt::getOptionValues() const +{ + TOptionValues vals; + TOptionValues::const_iterator op_val = _option2value.begin(); + for ( ; op_val != _option2value.end(); ++op_val ) + vals.insert( make_pair( op_val->first, getOptionValue( op_val->first, GET_DEFAULT() ))); + + return vals; +} + +std::vector MgAdapt::getOptionValuesStrVec() const +{ + std::vector vals; + TOptionValues::const_iterator op_val = _option2value.begin(); + for ( ; op_val != _option2value.end(); ++op_val ) + vals.push_back(op_val->first+":"+getOptionValue( op_val->first, GET_DEFAULT() )); + + return vals; +} + +std::vector MgAdapt::getCustomOptionValuesStrVec() const +{ + std::vector vals; + TOptionValues::const_iterator op_val; + for ( op_val = _customOption2value.begin(); op_val != _customOption2value.end(); ++op_val ) + { + vals.push_back(op_val->first+":"+getOptionValue( op_val->first, GET_DEFAULT() )); + } + return vals; +} +const TOptionValues& MgAdapt::getCustomOptionValues() const +{ + return _customOption2value; +} +void MgAdapt::setData(MgAdaptHypothesisData* myData) +{ + copyMgAdaptHypothesisData(myData); + setAll(); +} +MgAdaptHypothesisData* MgAdapt::getData() const +{ + return data; +} +void MgAdapt::setMedFileIn(std::string fileName) +{ + medFileIn = fileName; +} + +std::string MgAdapt::getMedFileIn() +{ + return medFileIn; +} + +void MgAdapt::setMedFileOut(std::string fileOut) +{ + medFileOut = fileOut; +} + +std::string MgAdapt::getMedFileOut() +{ + return medFileOut; +} +void MgAdapt::setMeshOutMed(bool mybool) +{ + meshOutMed = mybool; +} +bool MgAdapt::getMeshOutMed() +{ + return meshOutMed; +} +void MgAdapt::setPublish(bool mybool) +{ + publish = mybool; +} +bool MgAdapt::getPublish() +{ + return publish; +} +void MgAdapt::setFieldName(std::string myFieldName) +{ + fieldName = myFieldName; +} +std::string MgAdapt::getFieldName() +{ + return fieldName; +} +void MgAdapt::setTimeStep(int time) +{ + timeStep = time; +} +int MgAdapt::getTimeStep() const +{ + return timeStep; +} + +void MgAdapt::setRankTimeStep(int time, int myRank) +{ + timeStep = time; + rank = myRank; +} + +int MgAdapt::getRank() +{ + return rank; +} +void MgAdapt::setUseLocalMap(bool myLocal) +{ + useLocalMap = myLocal; + +} +bool MgAdapt::getUseLocalMap() +{ + return useLocalMap; +} + +void MgAdapt::setUseBackgroundMap(bool bckg) +{ + useBackgroundMap = bckg; + +} +bool MgAdapt::getUseBackgroundMap() +{ + return useBackgroundMap; +} + +void MgAdapt::setUseConstantValue(bool cnst) +{ + useConstantValue = cnst; + +} +bool MgAdapt::getUseConstantValue() +{ + return useConstantValue; +} +void MgAdapt::setLogFile(std::string myLogFile) +{ + logFile = myLogFile; +} +std::string MgAdapt::getLogFile() +{ + return logFile; +} +void MgAdapt::setVerbosityLevel(int verboLevel) +{ + verbosityLevel = verboLevel; +} +int MgAdapt::getVerbosityLevel() +{ + return verbosityLevel; +} +void MgAdapt::setRemoveOnSuccess(bool rmons) +{ + removeOnSuccess = rmons; +} +bool MgAdapt::getRemoveOnSuccess() +{ + return removeOnSuccess; +} +void MgAdapt::setSizeMapFile(std::string mapFile) +{ + sizeMapFile = mapFile; +} +std::string MgAdapt::getSizeMapFile() +{ + return sizeMapFile; +} + +void MgAdapt::setMeshName(std::string name) +{ + meshName = name; +} +std::string MgAdapt::getMeshName() +{ + return meshName; +} +void MgAdapt::setMeshNameOut(std::string name) +{ + meshNameOut = name; +} +std::string MgAdapt::getMeshNameOut() +{ + return meshNameOut; +} +void MgAdapt::setFromMedFile(bool mybool) +{ + fromMedFile = mybool; +} +bool MgAdapt::isFromMedFile() +{ + return fromMedFile; +} +void MgAdapt::setConstantValue(double cnst) +{ + constantValue = cnst; +} +double MgAdapt::getConstantValue() const +{ + return constantValue; +} + +void MgAdapt::setWorkingDir(std::string dir) +{ + workingDir = dir; +} +std::string MgAdapt::getWorkingDir() const +{ + return workingDir; +} +void MgAdapt::setKeepWorkingFiles(bool mybool) +{ + toKeepWorkingFiles = mybool; +} +bool MgAdapt::getKeepWorkingFiles() +{ + return toKeepWorkingFiles; +} +void MgAdapt::setPrintLogInFile(bool print) +{ + printLogInFile = print; +} +bool MgAdapt::getPrintLogInFile() +{ + return printLogInFile; +} + +bool MgAdapt::setAll() +{ + + setFromMedFile(data->fromMedFile); + std::string file; + checkDirPath(data->myFileInDir); + file = data->myFileInDir+data->myMeshFileIn; + setMedFileIn(file); + setMeshName(data->myInMeshName); + setMeshNameOut(data->myOutMeshName); + checkDirPath(data->myFileOutDir); + std::string out = data->myFileOutDir+data->myMeshFileOut; + setMedFileOut(out); + setPublish(data->myPublish); + setMeshOutMed(data->myMeshOutMed); + setUseLocalMap(data->myUseLocalMap); + setUseBackgroundMap(data->myUseBackgroundMap); + setUseConstantValue(data->myUseConstantValue); + + std::string mapfile; + if (useBackgroundMap) + { + + checkDirPath(data->myFileSizeMapDir); + mapfile = data->myFileSizeMapDir+data->myMeshFileBackground; + setFieldName(data->myFieldName); + } + else if (useConstantValue) + { + setConstantValue(data->myConstantValue); + } + else + { + mapfile =""; + setConstantValue(0.0); + setFieldName(data->myFieldName); + + } + + setSizeMapFile(mapfile); + med_int rank; + med_int tmst; + if (data->myUseNoTimeStep) + { + rank = MED_NO_IT; + tmst = MED_NO_DT ; + } + else if (data->myUseLastTimeStep) + { + std::string fieldFile = useBackgroundMap ? sizeMapFile : medFileIn; + getTimeStepInfos(fieldFile, tmst, rank); + } + else + { + rank = data->myRank; + tmst = data->myTimeStep; + } + setRankTimeStep((int)tmst, (int)rank); + + /* Advanced options */ + setWorkingDir(data->myWorkingDir); + checkDirPath(data->myWorkingDir); + setLogFile(data->myWorkingDir+defaultLogFile()); + setVerbosityLevel(data->myVerboseLevel); + setRemoveOnSuccess(data->myRemoveLogOnSuccess); + setPrintLogInFile(data->myPrintLogInFile); + setKeepWorkingFiles(data->myKeepFiles); + + return true; +} + +void MgAdapt::checkDirPath(std::string& dirPath) +{ + const char lastChar = *dirPath.rbegin(); +#ifdef WIN32 + if(lastChar != '\\') dirPath+='\\'; +#else + if(lastChar != '/') dirPath+='/'; +#endif +} +//============================================================================= +void MgAdapt::setOptionValue(const std::string& optionName, + const std::string& optionValue) +throw (std::invalid_argument) +{ + TOptionValues::iterator op_val = _option2value.find(optionName); + if (op_val == _option2value.end()) + { + op_val = _customOption2value.find( optionName ); + _customOption2value[ optionName ] = optionValue; + return; + } + + if (op_val->second != optionValue) + { + + std::string lowerOptionValue = toLowerStr(optionValue); + const char* ptr = lowerOptionValue.c_str(); + // strip white spaces + while (ptr[0] == ' ') + ptr++; + int i = strlen(ptr); + while (i != 0 && ptr[i - 1] == ' ') + i--; + // check value type + bool typeOk = true; + std::string typeName; + if (i == 0) { + // empty string + } else if (_charOptions.count(optionName)) { + // do not check strings + } else if (_doubleOptions.count(optionName)) { + // check if value is double + toDbl(ptr, &typeOk); + typeName = "real"; + } else if (_boolOptions.count(optionName)) { + // check if value is bool + toBool(ptr, &typeOk); + typeName = "bool"; + } else { + // check if value is int + toInt(ptr, &typeOk); + typeName = "integer"; + } + if ( typeOk ) // check some specific values ? + { + } + if ( !typeOk ) + { + std::string msg = "Advanced option '" + optionName + "' = '" + optionValue + "' but must be " + typeName; + throw std::invalid_argument(msg); + } + std::string value( ptr, i ); + if ( _defaultOptionValues[ optionName ] == value ) + value.clear(); + + + op_val->second = value; + + } +} +//============================================================================= +//! Return option value. If isDefault provided, it can be a default value, +// then *isDefault == true. If isDefault is not provided, the value will be +// empty if it equals a default one. +std::string MgAdapt::getOptionValue(const std::string& optionName, bool* isDefault) const +throw (std::invalid_argument) +{ + TOptionValues::const_iterator op_val = _option2value.find(optionName); + if (op_val == _option2value.end()) + { + op_val = _customOption2value.find(optionName); + if (op_val == _customOption2value.end()) + { + std::string msg = "Unknown MG-Adapt option: <" + optionName + ">"; + throw std::invalid_argument(msg); + } + } + std::string val = op_val->second; + if ( isDefault ) *isDefault = ( val.empty() ); + + if ( val.empty() && isDefault ) + { + op_val = _defaultOptionValues.find( optionName ); + if (op_val != _defaultOptionValues.end()) + val = op_val->second; + } + return val; +} +//================================================================================ +/*! + * \brief Converts a string to a real value + */ +//================================================================================ + +double MgAdapt::toDbl(const std::string& str, bool* isOk ) +throw (std::invalid_argument) +{ + if ( str.empty() ) throw std::invalid_argument("Empty value provided"); + + char * endPtr; + double val = strtod(&str[0], &endPtr); + bool ok = (&str[0] != endPtr); + + if ( isOk ) *isOk = ok; + + if ( !ok ) + { + std::string msg = "Not a real value:'" + str + "'"; + throw std::invalid_argument(msg); + } + return val; +} +//================================================================================ +/*! + * \brief Converts a string to a lower + */ +//================================================================================ +std::string MgAdapt::toLowerStr(const std::string& str) +{ + std::string s = str; + for ( size_t i = 0; i <= s.size(); ++i ) + s[i] = tolower( s[i] ); + return s; +} +//================================================================================ +/*! + * \brief Converts a string to a bool + */ +//================================================================================ + +bool MgAdapt::toBool(const std::string& str, bool* isOk ) +throw (std::invalid_argument) +{ + std::string s = str; + if ( isOk ) *isOk = true; + + for ( size_t i = 0; i <= s.size(); ++i ) + s[i] = tolower( s[i] ); + + if ( s == "1" || s == "true" || s == "active" || s == "yes" ) + return true; + + if ( s == "0" || s == "false" || s == "inactive" || s == "no" ) + return false; + + if ( isOk ) + *isOk = false; + else { + std::string msg = "Not a Boolean value:'" + str + "'"; + throw std::invalid_argument(msg); + } + return false; +} +//================================================================================ +/*! + * \brief Converts a string to a integer value + */ +//================================================================================ + +int MgAdapt::toInt(const std::string& str, bool* isOk ) +throw (std::invalid_argument) +{ + if ( str.empty() ) throw std::invalid_argument("Empty value provided"); + + char * endPtr; + int val = (int)strtol( &str[0], &endPtr, 10); + bool ok = (&str[0] != endPtr); + + if ( isOk ) *isOk = ok; + + if ( !ok ) + { + std::string msg = "Not an integer value:'" + str + "'"; + throw std::invalid_argument(msg); + } + return val; +} +//============================================================================= +bool MgAdapt::hasOptionDefined( const std::string& optionName ) const +{ + bool isDefault = false; + try + { + getOptionValue( optionName, &isDefault ); + } + catch ( std::invalid_argument ) + { + return false; + } + return !isDefault; +} +//================================================================================ +/*! + * \brief Return command to run MG-Tetra mesher excluding file prefix (-f) + */ +//================================================================================ + +std::string MgAdapt::getCommandToRun(MgAdapt* hyp) +{ + return hyp ? hyp->getCommandToRun() : ToComment("error with hypothesis!"); +} + + + +int MgAdapt::compute(std::string& errStr) +{ + std::string cmd = getCommandToRun(); + int err = 0; + execCmd( cmd.c_str(), err ); // run + + if ( err ) + { + errStr = ToComment("system(mg-adapt.exe ...) command failed with error: ") + << strerror( errno ); + } + else + { + convertMeshFile(meshFormatOutputMesh, solFormatOutput); + } + //~if (!err) cleanUp(); + return err; +} + +void MgAdapt::execCmd( const char* cmd, int& err) +{ + err = 1; + std::array buffer; + std::streambuf* buf; + outFileStream fileStream; + if (printLogInFile) + { + fileStream.open(logFile); + buf = fileStream.rdbuf(); + } + else + { + buf = std::cout.rdbuf(); + } + std::ostream logStream(buf); + + std::unique_ptr pipe(popen(cmd, "r"), pclose ); + if(!pipe) + { + throw std::runtime_error("popen() failed!"); + } + while(fgets(buffer.data(), buffer.size(), pipe.get()) !=nullptr ) + { + logStream<::iterator it = tmpFilesToBeDeleted.begin(); + for (; it!=tmpFilesToBeDeleted.end(); ++it) + { + errStr=removeFile(*it, notOk); + if (notOk) + { + appendMsgToLogFile(errStr); + } + + } +} + +void MgAdapt::appendMsgToLogFile(std::string& msg) +{ + std::ofstream logStream; + logStream.open(logFile, std::ofstream::out | std::ofstream::app); + logStream<< msg; + logStream.close(); +} +//================================================================================ +/*! + * \brief Return command to run MG-Tetra mesher excluding file prefix (-f) + */ +//================================================================================ + +std::string MgAdapt::getCommandToRun() +{ + /* + || return system command with args and options + || + */ + std::string errStr; + std::string cmd = getExeName(); + std::string meshIn(""), sizeMapIn(""), solFileIn(""); + convertMedFile(meshIn, solFileIn, sizeMapIn); + if (!isFileExist(meshIn) || !isFileExist(solFileIn)) + { + errStr = ToComment(" failed to find .mesh or .sol file from converter ")<< strerror( errno ); + return errStr; + } + tmpFilesToBeDeleted.push_back(meshIn); + tmpFilesToBeDeleted.push_back(solFileIn); + if(useBackgroundMap && !isFileExist(sizeMapIn)) + { + + errStr = ToComment(" failed to find .mesh size map file from converter ")<< strerror( errno ); + return errStr; + + } + + + cmd+= " --in "+ meshIn; + meshFormatOutputMesh = getFileName()+".mesh"; + cmd+= " --out "+ meshFormatOutputMesh; + if (useLocalMap || useConstantValue) cmd+= " --sizemap "+ solFileIn; + else // (useBackgroundMap) + { + cmd+= " --background_mesh "+ sizeMapIn ; + cmd+= " --background_sizemap "+ solFileIn; + tmpFilesToBeDeleted.push_back(sizeMapIn); + } + //~else + //~{ + //~// constant value TODO + //~} + /* sizemap file is not adapted in case of only surface adaptation see MeshGems docs */ + std::string adapOp = "adaptation"; + std::string adpOpVal = getOptionValue(adapOp); + std::string surfaceAdapt = "surface"; + if(surfaceAdapt != adpOpVal ) + { + std::string solFileOut = getFileName()+".sol"; + cmd+= " --write_sizemap "+ solFileOut; + solFormatOutput.push_back(solFileOut); + } + if (verbosityLevel != defaultVerboseLevel()) + { + + cmd+= " --verbose "+ ToComment(verbosityLevel); + } + + std::string option, value; + bool isDefault; + const TOptionValues* options[] = { &_option2value, &_customOption2value }; + for ( int iOp = 0; iOp < 2; ++iOp ) + { + TOptionValues::const_iterator o2v = options[iOp]->begin(); + for ( ; o2v != options[iOp]->end(); ++o2v ) + { + option = o2v->first; + value = getOptionValue( option, &isDefault ); + + if ( isDefault ) + continue; + if ( value.empty() )//value == NoValue() ) + { + if ( _defaultOptionValues.count( option )) + continue; // non-custom option with no value + //value.clear(); + } + if ( strncmp( "no", option.c_str(), 2 ) == 0 ) // options w/o values: --no_* + { + if ( !value.empty() && toBool( value ) == false ) + continue; + value.clear(); + } + if ( option[0] != '-' ) + cmd += " --"; + else + cmd += " "; + cmd += option + " " + value; + } + } + //~} +//~cmd+= " >" +#ifdef WIN32 + cmd += " < NUL"; +#endif + + return cmd; +} + + +bool MgAdapt::isFileExist(std::string& fName) const +{ + + if ( fName.empty() ) + return false; + + boost::system::error_code err; + bool res = boost::filesystem::exists( fName, err ); + + return err ? false : res; +} +//======================================================================= +//function : defaultMaximumMemory +//======================================================================= + +#if defined(WIN32) +#include +#elif !defined(__APPLE__) +#include +#endif + +double MgAdapt::defaultMaximumMemory() +{ +#if defined(WIN32) + // See http://msdn.microsoft.com/en-us/library/aa366589.aspx + MEMORYSTATUSEX statex; + statex.dwLength = sizeof (statex); + long err = GlobalMemoryStatusEx (&statex); + if (err != 0) { + double totMB = (double)statex.ullAvailPhys / 1024. / 1024.; + return (double)( 0.7 * totMB ); + } +#elif !defined(__APPLE__) + struct sysinfo si; + long err = sysinfo( &si ); + if ( err == 0 ) { + long ramMB = si.totalram * si.mem_unit / 1024 / 1024; + return ( 0.7 * ramMB ); + } +#endif + return 1024; +} + + +//======================================================================= +//function : defaultWorkingDirectory +//======================================================================= + +std::string MgAdapt::defaultWorkingDirectory() +{ + TCollection_AsciiString aTmpDir; + + char *Tmp_dir = getenv("SALOME_TMP_DIR"); + if(Tmp_dir != NULL) { + aTmpDir = Tmp_dir; + } + else { +#ifdef WIN32 + aTmpDir = TCollection_AsciiString("C:\\"); +#else + aTmpDir = TCollection_AsciiString("/tmp/"); +#endif + } + return aTmpDir.ToCString(); +} +//================================================================================ +/*! + * \brief Return a unique file name + */ +//================================================================================ + +std::string MgAdapt::getFileName() const +{ + std::string aTmpDir = workingDir; + const char lastChar = *aTmpDir.rbegin(); +#ifdef WIN32 + if(lastChar != '\\') aTmpDir+='\\'; +#else + if(lastChar != '/') aTmpDir+='/'; +#endif + + TCollection_AsciiString aGenericName = (char*)aTmpDir.c_str(); + aGenericName += "MgAdapt_"; + aGenericName += getpid(); + aGenericName += "_"; + aGenericName += Abs((Standard_Integer)(long) aGenericName.ToCString()); + + return aGenericName.ToCString(); +} +//======================================================================= +//function : defaultLogFile +//======================================================================= + +std::string MgAdapt::defaultLogFile() +{ + std::string alogFile("MG_ADAPT.log"); + return alogFile; +} +//======================================================================= +//function : defaultUseConstantValue +//======================================================================= + +bool MgAdapt::defaultUseConstantValue() +{ + return false; +} +//======================================================================= +//function : defaultUseNoTimeStep +//======================================================================= + +bool MgAdapt::defaultUseNoTimeStep() +{ + return true; +} +//======================================================================= +//function : defaultRemoveLogOnSuccess +//======================================================================= + +bool MgAdapt::defaultRemoveLogOnSuccess() +{ + return true; +} +//======================================================================= +//function : defaultPrintLogInFile +//======================================================================= + +bool MgAdapt::defaultPrintLogInFile() +{ + return false; +} +//======================================================================= +//function : defaultUseChosenTimeStep +//======================================================================= + +bool MgAdapt::defaultUseChosenTimeStep() +{ + return false; +} +//======================================================================= +//function : UseLastTimeStep +//======================================================================= + +bool MgAdapt::defaultUseLastTimeStep() +{ + return false; +} +//======================================================================= +//function : defaultUseBackgroundMap +//======================================================================= + +bool MgAdapt::defaultUseBackgroundMap() +{ + return false; +} +//======================================================================= +//function : defaultKeepFiles +//======================================================================= + +bool MgAdapt::defaultKeepFiles() +{ + return false; +} +//======================================================================= +//function : defaultUseLocalMap +//======================================================================= + +bool MgAdapt::defaultUseLocalMap() +{ + return true; +} +//======================================================================= +//function : defaultPublish +//======================================================================= + +bool MgAdapt::defaultPublish() +{ + return false; +} +//======================================================================= +//function : defaultMeshOutMed +//======================================================================= + +bool MgAdapt::defaultMeshOutMed() +{ + return true; +} +//======================================================================= +//function : defaultFromMedFile +//======================================================================= + +bool MgAdapt::defaultFromMedFile() +{ + return true; +} +//======================================================================= +//function : defaultVerboseLevel +//======================================================================= + +int MgAdapt::defaultVerboseLevel() +{ + return 3; +} +std::string MgAdapt::getExeName() +{ + return "mg-adapt.exe"; +} +void MgAdapt::copyMgAdaptHypothesisData( MgAdaptHypothesisData* from) +{ + + data->myFileInDir = from->myFileInDir; + data->myMeshFileIn = from->myMeshFileIn; + data->myMeshFileBackground = from->myMeshFileBackground; + data->myOutMeshName = from->myOutMeshName; + data->myMeshFileOut = from->myMeshFileOut; + data->myFileOutDir = from->myFileOutDir; + data->myFileSizeMapDir = from->myFileSizeMapDir; + data->myFieldName = from->myFieldName; + data->fromMedFile = from->fromMedFile; + data->myPublish = from->myPublish; + data->myMeshOutMed = from->myMeshOutMed; + data->myUseLocalMap = from->myUseLocalMap; + data->myUseBackgroundMap = from->myUseBackgroundMap; + data->myUseConstantValue = from->myUseConstantValue; + data->myConstantValue = from->myConstantValue; + data->myTimeStep = from->myTimeStep; + data->myRank = from->myRank; + data->myUseNoTimeStep = from->myUseNoTimeStep; + data->myUseLastTimeStep = from->myUseLastTimeStep; + data->myUseChosenTimeStep = from->myUseChosenTimeStep; + data->myWorkingDir = from->myWorkingDir; + data->myLogFile = from->myLogFile; + data->myPrintLogInFile = from->myPrintLogInFile; + data->myKeepFiles = from->myKeepFiles; + data->myRemoveLogOnSuccess = from->myRemoveLogOnSuccess; + data->myVerboseLevel = from->myVerboseLevel; + +} + + +void MgAdapt::convertMedFile(std::string& meshFormatMeshFileName, std::string& solFormatFieldFileName, std::string& meshFormatsizeMapFile) +{ + + std::vector fieldFileNames; + MEDCoupling::MeshFormatWriter writer; + MEDCoupling::MCAuto mfd = MEDCoupling::MEDFileData::New(medFileIn); + MEDCoupling::MEDFileMeshes* meshes = mfd->getMeshes(); + MEDCoupling::MEDFileMesh* fileMesh = meshes->getMeshAtPos(0); // ok only one mesh in file! + storeGroupsAndFams(fileMesh); + + MEDCoupling::MCAuto fields = MEDCoupling::MEDFileFields::New(); + solFormatFieldFileName = getFileName(); + solFormatFieldFileName+=".sol"; + fieldFileNames.push_back(solFormatFieldFileName); + + if (useBackgroundMap) + { + + meshFormatsizeMapFile = getFileName(); + meshFormatsizeMapFile += ".mesh"; + buildBackGroundMeshAndSolFiles(fieldFileNames, meshFormatsizeMapFile); + + } + else if(useLocalMap) + { + + MEDCoupling::MCAuto fts = dynamic_cast( mfd->getFields()->getFieldWithName(fieldName) ); + MEDCoupling::MCAuto f = fts->getTimeStep(timeStep, rank); + MEDCoupling::MCAuto tmFts = MEDCoupling::MEDFileFieldMultiTS::New(); + tmFts->pushBackTimeStep(f); + + fields->pushField(tmFts); + + writer.setFieldFileNames( fieldFileNames); + } + + else + { + MEDCoupling::MCAuto mesh = fileMesh->getMeshAtLevel(1); // nodes mesh + MEDCoupling::MCAuto umesh = mesh->buildUnstructured(); // nodes mesh + int dim = umesh->getSpaceDimension(); + int version = sizeof(double) < 8 ? 1 : 2; + mcIdType nbNodes = umesh->getNumberOfNodes(); + buildConstantSizeMapSolFile(solFormatFieldFileName, dim, version, nbNodes); + + } + + mfd->setFields( fields ); + meshFormatMeshFileName = getFileName(); + meshFormatMeshFileName+=".mesh"; + writer.setMeshFileName(meshFormatMeshFileName); + writer.setMEDFileDS( mfd); + writer.write(); + +} + +void MgAdapt::convertMeshFile(std::string& meshFormatIn, std::vector< std::string>& solFieldFileNames) const +{ + MEDCoupling::MeshFormatReader reader(meshFormatIn, solFieldFileNames); + + MEDCoupling::MCAuto mfd = reader.loadInMedFileDS(); + // write MED + MEDCoupling::MEDFileMeshes* meshes = mfd->getMeshes(); + MEDCoupling::MEDFileMesh* fileMesh = meshes->getMeshAtPos(0); // ok only one mesh in file! + fileMesh->setName(meshNameOut); + restoreGroupsAndFams(fileMesh); + mfd->write(medFileOut, 2); +} + + +void MgAdapt::storeGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh) +{ + storefams(fileMesh); + storeGroups(fileMesh); +} + +void MgAdapt::restoreGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh) const +{ + restorefams(fileMesh); + restoreGroups(fileMesh); +} +void MgAdapt::storeGroups(MEDCoupling::MEDFileMesh* fileMesh) +{ + std::map > grpFams = fileMesh->getGroupInfo(); + std::map >::iterator g2ff = grpFams.begin(); + + for ( ; g2ff != grpFams.end(); ++g2ff ) + { + std::string groupName = g2ff->first; + std::vector famNames = g2ff->second; + + if ( famNames.empty() ) continue; + std::size_t k = 0; + std::vector< mcIdType> famListId; + for ( size_t i = 0; i < famNames.size(); ++i ) + { + famListId.push_back( fileMesh->getFamilyId( famNames[i].c_str() ) ); + } + group grp(groupName, famListId, famNames); + groupVec.push_back(grp); + } +} + +void MgAdapt::storefams(MEDCoupling::MEDFileMesh* fileMesh) +{ + std::map grpFams = fileMesh->getFamilyInfo(); + std::map::iterator f = grpFams.begin(); + + for ( ; f != grpFams.end(); ++f ) + { + if(!f->second) continue; // FAMILLE_ZERO + family fs(f->first, f->second); + famVec.push_back(fs); + } + +} + +void MgAdapt::restorefams(MEDCoupling::MEDFileMesh* fileMesh) const +{ + std::vector::const_iterator fIt = famVec.begin(); + + for (; fIt!=famVec.end(); ++fIt) + { + try // safety : FAMILY could be lost P2-->P1 + { + std::string givenFamNameFromMeshGemConverter = fileMesh->getFamilyNameGivenId( std::abs(fIt->_famId) ); + fileMesh->changeFamilyId(std::abs(fIt->_famId), fIt->_famId); + fileMesh->changeFamilyName(givenFamNameFromMeshGemConverter, fIt->_famName); + } + catch (const std::exception& e) + { + std::cerr< > info; + std::vector ::const_iterator grpFams = groupVec.begin(); + + for (; grpFams!=groupVec.end(); ++grpFams) + { + info.insert(std::pair > (grpFams->_name, grpFams->_famNames) ); + } + + fileMesh->setGroupInfo(info); +} + +void MgAdapt::buildConstantSizeMapSolFile(const std::string& solFormatFieldFileName, const int dim, const int version, const mcIdType nbNodes) const +{ + MeshFormat::Localizer loc; + MeshFormat::MeshFormatParser writer; + int fileId = writer.GmfOpenMesh( solFormatFieldFileName.c_str(), GmfWrite, version, dim); + int typTab[] = {GmfSca}; + writer.GmfSetKwd(fileId, MeshFormat::GmfSolAtVertices, (int)nbNodes, 1, typTab); + for (mcIdType i = 0; i& fieldFileNames, const std::string& meshFormatsizeMapFile) const +{ + MEDCoupling::MCAuto tmpMfd = MEDCoupling::MEDFileData::New(sizeMapFile); + MEDCoupling::MEDFileFields* tmpFields = tmpMfd->getFields(); + MEDCoupling::MEDFileAnyTypeFieldMultiTS* fts = tmpFields->getFieldWithName(fieldName); + MEDCoupling::MCAuto fts1 = dynamic_cast(fts); + MEDCoupling::MCAuto f = fts1->getTimeStep(timeStep, rank); + MEDCoupling::MCAuto tmFts = MEDCoupling::MEDFileFieldMultiTS::New(); + tmFts->pushBackTimeStep(f); + + MEDCoupling::MCAuto tmp_fields = MEDCoupling::MEDFileFields::New(); + tmp_fields->pushField(tmFts); + + + tmpMfd->setFields( tmp_fields ); + MEDCoupling::MeshFormatWriter tmpWriter; + tmpWriter.setMeshFileName(meshFormatsizeMapFile); + tmpWriter.setFieldFileNames( fieldFileNames); + tmpWriter.setMEDFileDS(tmpMfd); + tmpWriter.write(); +} +// ======================================================================= +med_idt MgAdapt::openMedFile(const std::string aFile) +// ======================================================================= +// renvoie le medId associe au fichier Med apres ouverture +{ + med_idt medIdt = MEDfileOpen(aFile.c_str(),MED_ACC_RDONLY); + if (medIdt <0) + { + //~addMessage( ToComment(" error: Can't open ") << aFile, /*fatal=*/true ); + ; + } + return medIdt; +} + +MgAdapt::Status MgAdapt::addMessage(const std::string& msg, + const bool isFatal/*=false*/) +{ + if ( isFatal ) + _myErrorMessages.clear(); // warnings are useless if a fatal error encounters + + _myErrorMessages.push_back( msg ); + + //~MESSAGE(msg); +#ifdef _DEBUG_ + std::cout << msg << std::endl; +#endif + return ( _myStatus = isFatal ? MgAdapt::DRS_FAIL : MgAdapt::DRS_WARN_SKIP_ELEM ); +} + + + + +// ======================================================================= +void MgAdapt::getTimeStepInfos(std::string aFile, med_int& numdt, med_int& numit) +// ======================================================================= +{ +// Il faut voir si plusieurs maillages + + + herr_t erreur = 0 ; + med_idt medIdt ; + + + // Ouverture du fichier + //~SCRUTE(aFile.toStdString()); + medIdt = openMedFile(aFile); + if ( medIdt < 0 ) return ; + // Lecture du nombre de champs + med_int ncha = MEDnField(medIdt) ; + if (ncha < 1 ) + { + //~addMessage( ToComment(" error: there is no field in ") << aFile, /*fatal=*/true ); + return; + } + // Lecture des caracteristiques du champs + + // Lecture du type du champ, des noms des composantes et du nom de l'unite + char nomcha [MED_NAME_SIZE+1]; + strcpy(nomcha, fieldName.c_str()); +// Lecture du nombre de composantes + med_int ncomp = MEDfieldnComponentByName(medIdt, nomcha); + char meshname[MED_NAME_SIZE+1]; + char * comp = (char*) malloc(ncomp*MED_SNAME_SIZE+1); + char * unit = (char*) malloc(ncomp*MED_SNAME_SIZE+1); + char dtunit[MED_SNAME_SIZE+1]; + med_bool local; + med_field_type typcha; + med_int nbofcstp; + erreur = MEDfieldInfoByName (medIdt, nomcha, meshname,&local,&typcha,comp,unit,dtunit, &nbofcstp); + free(comp); + free(unit); + if ( erreur < 0 ) + { + //~addMessage( ToComment(" error: error while reading field ") << nomcha << " in file " << aFile , /*fatal=*/true ); + return; + } + + med_float dt; + med_int tmp_numdt, tmp_numit; + + //~med_int step = data->myUseLastTimeStep ? nbofcstp : data->myTimeStep+1; + //~myPrint("step ", step); + erreur = MEDfieldComputingStepInfo ( medIdt, nomcha, 1, &numdt, &numit, &dt ); + for(med_int step = 1; step <= nbofcstp; step++ ) + { + erreur = MEDfieldComputingStepInfo ( medIdt, nomcha, step, &tmp_numdt, &tmp_numit, &dt ); + if(tmp_numdt > numdt) + { + numdt = tmp_numdt; + numit = tmp_numit; + } + } + if ( erreur < 0 ) + { + + //~addMessage( ToComment(" error: error while reading field ") << nomcha << "step (numdt, numit) = " <<"("<< numdt<< ", " \ + numit<< ")" <<" in file " << aFile , /*fatal=*/true ); + return; + } + + + + // Fermeture du fichier + if ( medIdt > 0 ) MEDfileClose(medIdt); + + +} + + + diff --git a/src/ADAPT/MG_ADAPT.hxx b/src/ADAPT/MG_ADAPT.hxx new file mode 100644 index 000000000..d597cf5f2 --- /dev/null +++ b/src/ADAPT/MG_ADAPT.hxx @@ -0,0 +1,337 @@ +// Copyright (C) 2011-2020 CEA/DEN, EDF R&D +// +// 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/ +// +// File : MG_ADAPT.hxx +// +#ifndef MG_ADAPT_HXX +#define MG_ADAPT_HXX +#include +# include +#include +#include +#include +#include + +#include "MCAuto.hxx" +#include "MCType.hxx" +#include "MEDFileMesh.hxx" + +#include +// SMESH includes + +//~#include + + +class MgAdapt; + +typedef std::map< std::string, std::string > TOptionValues; +typedef std::set< std::string > TOptionNames; + +struct MgAdaptHypothesisData +{ + std::string myFileInDir, myMeshFileIn, myInMeshName, myMeshFileBackground, myOutMeshName, + myMeshFileOut, myFileOutDir, myFileSizeMapDir, myFieldName; + bool fromMedFile; + bool myPublish, myMeshOutMed; + bool myUseLocalMap, myUseBackgroundMap, myUseConstantValue; + double myConstantValue; + int myRank, myTimeStep; + bool myUseNoTimeStep, myUseLastTimeStep, myUseChosenTimeStep; + std::string myWorkingDir, myLogFile; + bool myPrintLogInFile, myKeepFiles, myRemoveLogOnSuccess; + int myVerboseLevel; + +}; + +class outFileStream : public std::ofstream{ +public: + ~outFileStream(){close();} //to close file at dtor +}; + +/*! + * \brief Class to generate string from any type + */ +class ToComment : public std::string +{ + std::ostringstream _s ; + +public : + + ToComment():std::string("") {} + + ToComment(const ToComment& c):std::string() { + _s << c.c_str() ; + this->std::string::operator=( _s.str() ); + } + + ToComment & operator=(const ToComment& c) { + _s << c.c_str() ; + this->std::string::operator=( _s.str() ); + return *this; + } + + template + ToComment( const T &anything ) { + _s << anything ; + this->std::string::operator=( _s.str() ); + } + + template + ToComment & operator<<( const T &anything ) { + _s << anything ; + this->std::string::operator=( _s.str() ); + return *this ; + } + + operator char*() const { + return (char*)c_str(); + } + + std::ostream& Stream() { + return _s; + } +}; + + +class MgAdapt +{ + +public: + + MgAdapt(); + MgAdapt(MgAdaptHypothesisData*); + MgAdapt(const MgAdapt&); + ~MgAdapt(); + void buildModel(); + void setData( MgAdaptHypothesisData*); + + void setMedFileIn(std::string fileName); + std::string getMedFileIn(); + + void setMedFileOut(std::string fileOut); + std::string getMedFileOut(); + + void setMeshName(std::string name); + std::string getMeshName(); + + void setMeshNameOut(std::string name); + std::string getMeshNameOut(); + + void setMeshOutMed(bool mybool); + bool getMeshOutMed(); + + void setPublish(bool mybool); + bool getPublish(); + + void setFieldName(std::string myFieldName); + std::string getFieldName(); + + void setTimeStep(int time); + int getTimeStep() const; + + void setRankTimeStep(int time, int myRank); + int getRank(); + + void setLogFile(std::string); + std::string getLogFile(); + + void setVerbosityLevel(int verbosity); + int getVerbosityLevel(); + + void setRemoveOnSuccess(bool mybool); + bool getRemoveOnSuccess(); + + MgAdaptHypothesisData* getData() const; + + void setUseLocalMap(bool mybool); + bool getUseLocalMap(); + + void setUseBackgroundMap(bool mybool); + bool getUseBackgroundMap(); + + void setUseConstantValue(bool mybool); + bool getUseConstantValue(); + + void setConstantValue(double cnst); + double getConstantValue() const; + + void setSizeMapFile(std::string mapFile); + std::string getSizeMapFile(); + + void setFromMedFile(bool mybool); + bool isFromMedFile(); + + void setKeepWorkingFiles(bool mybool); + bool getKeepWorkingFiles(); + + void setPrintLogInFile(bool mybool); + bool getPrintLogInFile(); + + void setWorkingDir(std::string dir); + std::string getWorkingDir() const; + + + bool setAll(); + static std::string getCommandToRun(MgAdapt* ); + std::string getCommandToRun() ; + int compute(std::string& errStr); + std::string getFileName() const; + static std::string getExeName(); + void copyMgAdaptHypothesisData( MgAdaptHypothesisData* from) ; + + void checkDirPath(std::string& dirPath); + + + + bool hasOptionDefined( const std::string& optionName ) const; + void setOptionValue(const std::string& optionName, + const std::string& optionValue) throw (std::invalid_argument); + std::string getOptionValue(const std::string& optionName, + bool* isDefault=0) const throw (std::invalid_argument); + std::vector getCustomOptionValuesStrVec() const; + std::vector getOptionValuesStrVec() const; + + + TOptionValues getOptionValues() const; + const TOptionValues& getCustomOptionValues() const ; + static double toDbl(const std::string&, bool* isOk = 0) throw (std::invalid_argument); + static bool toBool(const std::string&, bool* isOk = 0) throw (std::invalid_argument); + static int toInt(const std::string&, bool* isOk = 0 ) throw (std::invalid_argument); + static std::string toLowerStr(const std::string& str); + + + /* default values */ + static std::string defaultWorkingDirectory(); + static std::string defaultLogFile(); + static bool defaultKeepFiles(); + static bool defaultRemoveLogOnSuccess(); + static int defaultVerboseLevel(); + static bool defaultPrintLogInFile(); + static bool defaultFromMedFile(); + static bool defaultMeshOutMed(); + static bool defaultPublish(); + static bool defaultUseLocalMap(); + static bool defaultUseBackgroundMap(); + static bool defaultUseConstantValue(); + static bool defaultUseNoTimeStep(); + static bool defaultUseLastTimeStep(); + static bool defaultUseChosenTimeStep(); + static double defaultMaximumMemory(); + + + + + enum Status { + DRS_OK, + DRS_EMPTY, // a file contains no mesh with the given name + DRS_WARN_RENUMBER, // a file has overlapped ranges of element numbers, + // so the numbers from the file are ignored + DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data + DRS_WARN_DESCENDING, // some elements were skipped due to descending connectivity + DRS_FAIL, // general failure (exception etc.) + DRS_NO_TIME_STEP // general failure (exception etc.) + }; + + struct group { + + std::string _name; + std::vector _famListId; + std::vector _famNames; + group(std::string name, std::vector famListId, std::vector famNames):_name(name) + { + std::vector::iterator it = famListId.begin(); + for (; it!=famListId.end(); ++it) + _famListId.push_back(*it); + + std::vector::iterator itt = famNames.begin(); + for (; itt!=famNames.end(); ++itt) + _famNames.push_back(*itt); + } + }; + + struct family { + std::string _famName; + mcIdType _famId; + family(std::string famName, MEDCoupling::mcIdType famId):_famName(famName), _famId(famId) {} + }; + + +private : + bool fromMedFile; + + std::string medFileIn; + std::string medFileOut; + std::string meshName; + std::string meshNameOut; + bool publish, meshOutMed; + bool useLocalMap, useBackgroundMap, useConstantValue; + std::string sizeMapFile; + std::string fieldName; + double constantValue; + int rank, timeStep; + + /* advanced options */ + + + std::string logFile; + std::string workingDir; + int verbosityLevel; + bool removeOnSuccess; + bool toKeepWorkingFiles; + bool printLogInFile; + + /* Model DATA */ + MgAdaptHypothesisData* data; + + /* */ + + TOptionValues _option2value, _customOption2value; // user defined values + TOptionValues _defaultOptionValues; // default values + TOptionNames _doubleOptions, _charOptions, _boolOptions; // to find a type of option + + std::vector _myErrorMessages; + Status _myStatus; + std::string meshFormatOutputMesh; + std::vector< std::string> solFormatOutput; + std::vector groupVec; + std::vector famVec; + std::vector< std::string> tmpFilesToBeDeleted; + + /* convert MED-->.mesh format */ + void convertMedFile(std::string& meshIn,std::string& solFileIn, std::string& sizeMapIn) ; + void storeGroups(MEDCoupling::MEDFileMesh* fileMesh); + void restoreGroups(MEDCoupling::MEDFileMesh* fileMesh) const; + void storefams(MEDCoupling::MEDFileMesh* fileMesh); + void restorefams(MEDCoupling::MEDFileMesh* fileMesh) const; + void storeGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh); + void restoreGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh) const; + void convertMeshFile(std::string& meshFormatIn, std::vector< std::string>& solFieldFileNames) const ; + void buildConstantSizeMapSolFile(const std::string& solFormatFieldFileName, const int dim, const int version, const mcIdType nbNodes) const; + void buildBackGroundMeshAndSolFiles(const std::vector& fieldFileNames, const std::string& meshFormatsizeMapFile) const; + void getTimeStepInfos(std::string aFile, med_int& numdt, med_int& numit); + Status addMessage(const std::string& msg, const bool isFatal = false); + med_idt openMedFile(const std::string aFile) ; + bool isFileExist(std::string& fName) const; + void execCmd( const char* cmd, int& err); + void cleanUp(); + void appendMsgToLogFile(std::string& msg); +}; + + + +#endif // MG_ADAPT_HXX diff --git a/src/ADAPTGUI/CMakeLists.txt b/src/ADAPTGUI/CMakeLists.txt index 7008df0b0..8ab085563 100644 --- a/src/ADAPTGUI/CMakeLists.txt +++ b/src/ADAPTGUI/CMakeLists.txt @@ -39,6 +39,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_BINARY_DIR}/adm_local/unix ${PROJECT_SOURCE_DIR}/src/ADAPT ${PROJECT_SOURCE_DIR}/src/ADAPT_I + ${MEDCOUPLING_INCLUDE_DIRS} ) # additional preprocessor / compiler flags @@ -56,6 +57,7 @@ SET(_link_LIBRARIES ${GUI_SalomeApp} ${SMESH_SalomeIDLSMESH} ADAPTEngine + ${MEDCoupling_medloader} ) # --- resources --- @@ -112,6 +114,7 @@ SET(_moc_HEADERS MonCreateYACS.h MonEditYACS.h MonEditFile.h + MG_ADAPTGUI.hxx ) # header files / uic wrappings @@ -160,6 +163,7 @@ SET(_other_SOURCES MonEditYACS.cxx MonEditFile.cxx HomardQtCommun.cxx + MG_ADAPTGUI.cxx ) # sources / to compile diff --git a/src/ADAPTGUI/MG_ADAPTGUI.cxx b/src/ADAPTGUI/MG_ADAPTGUI.cxx new file mode 100644 index 000000000..af8c47e24 --- /dev/null +++ b/src/ADAPTGUI/MG_ADAPTGUI.cxx @@ -0,0 +1,1451 @@ +// Copyright (C) 2007-2020 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 : MG_ADAPTGUI.cxx + +#include "MG_ADAPTGUI.hxx" + +#include "SUIT_Desktop.h" +#include "SUIT_Application.h" +#include "SUIT_Session.h" + +#include "SalomeApp_Application.h" +#include "SalomeApp_Module.h" +#include "SalomeApp_Study.h" +//~#include "SMESH_Actor.h" +#include +//~#include +//~#include +//~#include +//~#include +//~#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +// SALOME KERNEL includes +#include +#include +#include +#include +#include "SalomeApp_Tools.h" +#include +#include +#include + +#include + + +const int SPACING = 6; // layout spacing +const int MARGIN = 9; // layout margin + +//================================================================================= +// function : SMESHGUI_MgAdaptDlg() +// purpose : +//================================================================================= +SMESHGUI_MgAdaptDlg::SMESHGUI_MgAdaptDlg( SalomeApp_Module* theModule, MgAdapt* myModel, QWidget* parent, bool isCreation ) + : mySMESHGUI( theModule ), QDialog(parent) +{ + model = new MgAdapt(*myModel); + myData = model->getData(); + buildDlg(); + if (!isCreation) readParamsFromHypo(); +} + +void SMESHGUI_MgAdaptDlg::buildDlg() +{ + setModal( false ); + setAttribute( Qt::WA_DeleteOnClose, true ); + setWindowTitle( tr( "ADAPT_PREF_MG_ADAPT" ) ); + setSizeGripEnabled( true ); + + + myTabWidget = new QTabWidget( this ); + + // Arguments + + myArgs = new SMESHGUI_MgAdaptArguments( myTabWidget ); + std::vector str = model->getOptionValuesStrVec(); + std::vector str2 = model->getCustomOptionValuesStrVec(); + str.insert( str.end(), str2.begin(), str2.end() ); + + myAdvOpt = new MgAdaptAdvWidget(myTabWidget, &str); + int argsTab = myTabWidget->addTab( myArgs, tr( "Args" ) ); + int advTab = myTabWidget->addTab( myAdvOpt, tr( "ADVOP" ) ); + + myAdvOpt->workingDirectoryLabel ->setText (tr( "WORKING_DIR" )); + myAdvOpt->workingDirectoryPushButton ->setText (tr( "SELECT_DIR" )); + myAdvOpt->keepWorkingFilesCheck ->setText (tr( "KEEP_WORKING_FILES" )); + myAdvOpt->verboseLevelLabel ->setText (tr( "VERBOSE_LEVEL" )); + myAdvOpt->removeLogOnSuccessCheck ->setText (tr( "REMOVE_LOG_ON_SUCCESS" )); + myAdvOpt->logInFileCheck ->setText (tr( "LOG_IN_FILE" )); + myAdvOpt->logGroupBox ->setTitle(tr( "LOG_GROUP_TITLE" )); + + // buttons + QPushButton* okBtn = new QPushButton( tr( "SMESH_BUT_OK" ), this ); + okBtn->setAutoDefault( true ); + okBtn->setDefault( true ); + okBtn->setFocus(); + QPushButton* buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), this); + buttonApply->setAutoDefault(true); + QPushButton* buttonApplyAndClose = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), this); + buttonApplyAndClose->setAutoDefault(true); + QPushButton* cancelBtn = new QPushButton( tr( "SMESH_BUT_CANCEL" ), this ); + cancelBtn->setAutoDefault( true ); + QPushButton* helpBtn = new QPushButton( tr( "SMESH_BUT_HELP" ), this ); + helpBtn->setAutoDefault( true ); + + QHBoxLayout* btnLayout = new QHBoxLayout; + btnLayout->setSpacing( SPACING ); + btnLayout->setMargin( 0 ); + btnLayout->addWidget( buttonApplyAndClose ); + btnLayout->addStretch( 10 ); + btnLayout->addWidget( buttonApply ); + btnLayout->addStretch( 10 ); + btnLayout->addWidget( okBtn ); + btnLayout->addStretch( 10 ); + btnLayout->addWidget( cancelBtn ); + btnLayout->addStretch( 10 ); + btnLayout->addWidget( helpBtn ); + okBtn->hide(); // tab 1 + + QVBoxLayout* l = new QVBoxLayout ( this ); + l->setMargin( MARGIN ); + l->setSpacing( SPACING ); + l->addWidget( myTabWidget ); + l->addStretch(); + l->addLayout( btnLayout ); + + + connect( okBtn, SIGNAL( clicked() ), this, SLOT( clickOnOk() ) ); + connect( helpBtn, SIGNAL( clicked() ), this, SLOT( clickOnHelp() ) ); + connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); + connect(buttonApply, SIGNAL(clicked()), this,SLOT(clickOnApply())); + connect(buttonApplyAndClose, SIGNAL(clicked()), this,SLOT(clickOnOk())); + connect(myArgs, SIGNAL(meshDimSignal(ADAPTATION_MODE)), myAdvOpt, SLOT( onMeshDimChanged(ADAPTATION_MODE)) ); +} + + +//================================================================================= +// function : ~SMESHGUI_MgAdaptDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +SMESHGUI_MgAdaptDlg::~SMESHGUI_MgAdaptDlg() +{ + delete model; +} + +void SMESHGUI_MgAdaptDlg::setModel(MgAdapt* mg) +{ + model = mg; +} +MgAdapt* SMESHGUI_MgAdaptDlg::getModel() const +{ + return model; +} +/*! + \brief Perform clean-up actions on the dialog box closing. +*/ +bool SMESHGUI_MgAdaptDlg::clickOnApply() +{ + readParamsFromWidgets(); + return true; +} +void SMESHGUI_MgAdaptDlg::clickOnOk() +{ + clickOnApply(); + reject(); +} +void SMESHGUI_MgAdaptDlg::reject() +{ + QDialog::reject(); +} +bool SMESHGUI_MgAdaptDlg::readParamsFromHypo( ) const +{ + bool ret = true; + myArgs->aMedfile->setChecked(myData->fromMedFile) ; + if (myData->fromMedFile) + { + + *(myArgs->myFileInDir) = QString(myData->myFileInDir.c_str()) ; + myArgs->selectMedFileLineEdit->setText(myData->myMeshFileIn.c_str()) ; + // myData->myInMeshName = // TODO + + } + else + { + myArgs->aBrowserObject->setText(myData->myInMeshName.c_str()); + //~ myArgs->myFileInDir =""; // TODO + //~ myArgs->selectMedFileLineEdit->setText(); // TODO + } + myArgs->meshNameLineEdit->setText(myData->myOutMeshName.c_str()); + myArgs->medFileCheckBox->setChecked(myData->myMeshOutMed); + + if(myData->myMeshOutMed) + { + *(myArgs->myFileOutDir) = QString(myData->myFileOutDir.c_str()); + myArgs->selectOutMedFileLineEdit->setText(myData->myMeshFileOut.c_str()); + + } + else + { + *(myArgs->myFileOutDir) = QString(""); //TODO + } + + myArgs->publishOut->setChecked(myData->myPublish); + + myArgs->localButton->setChecked(myData->myUseLocalMap); + myArgs->backgroundButton->setChecked(myData->myUseBackgroundMap); + myArgs->constantButton->setChecked(myData->myUseConstantValue); + + if (myData->myUseConstantValue) + { + myArgs->dvalue->setValue(myData->myConstantValue); + } + else + { + myArgs->dvalue->setValue(0.0); + } + + if (myData->myUseBackgroundMap) + { + + *(myArgs->myFileSizeMapDir) = QString(myData->myFileSizeMapDir.c_str()) ; + myArgs->selectMedFileBackgroundLineEdit->setText(myData->myMeshFileBackground.c_str()); + } + else + { + *(myArgs->myFileSizeMapDir) = QString("") ; //TODO + myArgs->selectMedFileBackgroundLineEdit->setText(""); //TODO + } + + myArgs->fieldNameCmb->setCurrentText(myData->myFieldName.c_str()); + myArgs->noTimeStep->setChecked(myData->myUseNoTimeStep); + myArgs->lastTimeStep->setChecked( myData->myUseLastTimeStep); + myArgs->chosenTimeStep->setChecked(myData->myUseChosenTimeStep); + if (myData->myUseChosenTimeStep) + { + myArgs->rankSpinBox->setValue(myData->myRank); + myArgs->timeStep->setValue(myData->myTimeStep); + } + + myAdvOpt->workingDirectoryLineEdit->setText(myData->myWorkingDir.c_str()); + myAdvOpt->logInFileCheck->setChecked(myData->myPrintLogInFile); + + myAdvOpt->verboseLevelSpin->setValue(myData->myVerboseLevel); + myAdvOpt->removeLogOnSuccessCheck->setChecked(myData->myRemoveLogOnSuccess); + myAdvOpt->keepWorkingFilesCheck->setChecked(myData->myKeepFiles); + + return ret; + +} + + +bool SMESHGUI_MgAdaptDlg::readParamsFromWidgets() +{ + bool ret = true; + MgAdaptHypothesisData* aData = new MgAdaptHypothesisData(); + aData->fromMedFile = myArgs->aMedfile->isChecked(); + if (aData->fromMedFile) + { + + aData->myFileInDir = myArgs->myFileInDir->toStdString(); + aData->myMeshFileIn = myArgs->selectMedFileLineEdit->text().toStdString(); + // aData->myInMeshName = // TODO + } + else // TODO browser + { + aData->myInMeshName = myArgs->aBrowserObject->text().toStdString(); + aData->myFileInDir = myAdvOpt->workingDirectoryLineEdit->text().toStdString(); + + TCollection_AsciiString aGenericName = (char*)aData->myFileInDir.c_str(); + TCollection_AsciiString aGenericName2 = "MgAdapt_"; + aGenericName2 += getpid(); + aGenericName2 += "_"; + aGenericName2 += Abs((Standard_Integer)(long) aGenericName.ToCString()); + aGenericName2 += ".med"; + aGenericName+=aGenericName2; + emit myArgs->toExportMED(aGenericName.ToCString()); + aData->myMeshFileIn = aGenericName2.ToCString(); + } + aData->myOutMeshName = myArgs->meshNameLineEdit->text().toStdString(); + aData->myMeshOutMed = myArgs->medFileCheckBox->isChecked(); + if(aData->myMeshOutMed) + { + aData->myFileOutDir = myArgs->myFileOutDir->toStdString(); + aData->myMeshFileOut = myArgs->selectOutMedFileLineEdit->text().toStdString(); + + } + else + { + aData->myMeshFileOut = ""; + } + + aData->myPublish = myArgs->publishOut->isChecked(); + + + aData->myUseLocalMap = myArgs->localButton->isChecked(); + aData->myUseBackgroundMap = myArgs->backgroundButton->isChecked(); + aData->myUseConstantValue = myArgs->constantButton->isChecked(); + if (aData->myUseConstantValue) + { + aData->myConstantValue = myArgs->dvalue->value(); + } + else + { + aData->myConstantValue = 0.0; + } + if (aData->myUseBackgroundMap) + { + aData->myFileSizeMapDir = myArgs->myFileSizeMapDir->toStdString(); + aData->myMeshFileBackground = myArgs->selectMedFileBackgroundLineEdit->text().toStdString(); + } + else + { + aData->myMeshFileBackground = ""; + } + + aData->myFieldName = myArgs->fieldNameCmb->currentText().toStdString(); + aData->myUseNoTimeStep = myArgs->noTimeStep->isChecked(); + aData->myUseLastTimeStep = myArgs->lastTimeStep->isChecked(); + aData->myUseChosenTimeStep = myArgs->chosenTimeStep->isChecked(); + if (aData->myUseChosenTimeStep) + { + aData->myRank = myArgs->rankSpinBox->value(); + aData->myTimeStep = myArgs->timeStep->value(); + + } + + + aData->myWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().toStdString(); + aData->myPrintLogInFile = myAdvOpt->logInFileCheck->isChecked(); + aData->myVerboseLevel = myAdvOpt->verboseLevelSpin->value(); + aData->myRemoveLogOnSuccess = myAdvOpt->removeLogOnSuccessCheck->isChecked(); + aData->myKeepFiles = myAdvOpt->keepWorkingFilesCheck->isChecked(); + model->setData(aData); + QString msg; + checkParams(msg); + delete aData; + return ret; +} +bool SMESHGUI_MgAdaptDlg::storeParamsToHypo( const MgAdaptHypothesisData& ) const +{ + +} +/*! + \brief Show help page +*/ +void SMESHGUI_MgAdaptDlg::clickOnHelp() +{ + // QString aHelpFile; + // if ( myTabWidget->currentIndex() == MinDistance ) { + // aHelpFile = "measurements.html#min-distance-anchor"; + // } else if ( myTabWidget->currentIndex() == BoundingBox ) { + // aHelpFile = "measurements.html#bounding-box-anchor"; + // } else if ( myTabWidget->currentWidget() == myAngle ) { + // aHelpFile = "measurements.html#angle-anchor"; + // } else { + // aHelpFile = "measurements.html#basic-properties-anchor"; + // } + + // SMESH::ShowHelpFile( aHelpFile ); +} +bool SMESHGUI_MgAdaptDlg::checkParams(QString& msg) +{ + if ( !QFileInfo( myAdvOpt->workingDirectoryLineEdit->text().trimmed() ).isWritable() ) { + SUIT_MessageBox::warning( this, + tr( "SMESH_WRN_WARNING" ), + tr( "GHS3D_PERMISSION_DENIED" ) ); + return false; + } + + + myAdvOpt->myOptionTable->setFocus(); + QApplication::instance()->processEvents(); + + QString name, value; + bool isDefault, ok = true; + int iRow = 0, nbRows = myAdvOpt->myOptionTable->topLevelItemCount(); + for ( ; iRow < nbRows; ++iRow ) + { + QTreeWidgetItem* row = myAdvOpt->myOptionTable->topLevelItem( iRow ); + myAdvOpt->GetOptionAndValue( row, name, value, isDefault ); + + if ( name.simplified().isEmpty() ) + continue; // invalid custom option + + if ( isDefault ) // not selected option + value.clear(); + + try { + model->setOptionValue( name.toLatin1().constData(), value.toLatin1().constData() ); + } + catch ( const SALOME::SALOME_Exception& ex ) + { + msg = ex.details.text.in(); + ok = false; + break; + } + } + + + return ok; +} + +//================================================================================= +// function : SMESHGUI_MgAdaptArguments() +// purpose : +//================================================================================= +SMESHGUI_MgAdaptArguments::SMESHGUI_MgAdaptArguments( QWidget* parent ) + :QWidget(parent) +{ + + + myFileInDir = new QString(""); + myFileOutDir = new QString(""); + myFileSizeMapDir = new QString(""); + if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) + { + *myFileInDir = QDir::currentPath(); + *myFileOutDir = QDir::currentPath(); + *myFileSizeMapDir = QDir::currentPath(); + } + else + { + *myFileInDir = SUIT_FileDlg::getLastVisitedPath(); + *myFileOutDir = SUIT_FileDlg::getLastVisitedPath(); + *myFileSizeMapDir = SUIT_FileDlg::getLastVisitedPath(); + } + + meshDim = 0; + // Mesh in + aMeshIn = new QGroupBox( tr( "MeshIn" ), this ); + aMedfile = new QRadioButton( tr( "MEDFile" ), aMeshIn ); + aBrowser = new QRadioButton( tr( "Browser" ), aMeshIn ); + aBrowserObject = new QLineEdit( aMeshIn ); + selectMedFilebutton = new QPushButton("", aMeshIn); + selectMedFileLineEdit = new QLineEdit( aMeshIn ); + + meshIn = new QGridLayout( aMeshIn ); + + meshIn->setMargin( MARGIN ); + meshIn->setSpacing( SPACING ); + meshIn->addWidget( aMedfile, 0, 0, 1,1 ); + meshIn->addWidget( aBrowser, 0, 1,1,1); + meshIn->addWidget( aBrowserObject, 0, 2, 1, 1 ); + meshIn->addWidget( selectMedFilebutton, 1, 0,1, 1); + meshIn->addWidget( selectMedFileLineEdit, 1, 1, 1, 1 ); + hspacer = new QSpacerItem(188, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + meshInGroup = new QButtonGroup( this ); + meshInGroup->addButton( aMedfile, 0 ); + meshInGroup->addButton( aBrowser, 1 ); + + //Mesh out + + aMeshOut = new QGroupBox( tr( "MeshOut" ), this ); + meshName = new QLabel(tr("MeshName"), aMeshOut); + secondHspacer = new QSpacerItem(100, 30); + meshNameLineEdit = new QLineEdit(aMeshOut) ; + medFileCheckBox = new QCheckBox(tr("MEDFile"), aMeshOut); + selectOutMedFilebutton = new QPushButton("", aMeshOut); + thirdHspacer = new QSpacerItem(188, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + selectOutMedFileLineEdit = new QLineEdit(aMeshOut) ; + publishOut = new QCheckBox(tr("Publish_MG_ADAPT"), aMeshOut); + + meshOut = new QGridLayout( aMeshOut ); + + meshOut->setMargin( MARGIN ); + meshOut->setSpacing( SPACING ); + meshOut->addWidget( meshName, 0, 0, 1,1 ); + meshOut->addItem( secondHspacer, 0, 1, 1, 1 ); + meshOut->addWidget( meshNameLineEdit, 0, 2,1,1); + meshOut->addWidget( medFileCheckBox, 1, 0,1,1 ); + meshOut->addWidget( selectOutMedFilebutton, 1, 1,1,1 ); + meshOut->addWidget( selectOutMedFileLineEdit, 1, 2,1,1); + meshOut->addWidget( publishOut, 2, 0,1,1 ); + + //size map definition + + sizeMapDefinition = new QGroupBox(tr("SIZE_MAP_DEF"), this); + localButton = new QRadioButton(tr("LOCAL_MG_ADAPT"), sizeMapDefinition); + backgroundButton = new QRadioButton(tr("BACKGRND_MG_ADAPT"), sizeMapDefinition); + constantButton = new QRadioButton(tr("CNST_MG_ADAPT"), sizeMapDefinition); + medFileBackground = new QLabel(tr("MED_FILE_BCKG"), sizeMapDefinition); + selectMedFileBackgroundbutton = new QPushButton(tr(""), sizeMapDefinition); + selectMedFileBackgroundLineEdit = new QLineEdit(sizeMapDefinition); + valueLabel = new QLabel(tr("VALUE_MG_ADAPT"), sizeMapDefinition); + dvalue = new QDoubleSpinBox(sizeMapDefinition); + sizeMapDefGroup = new QButtonGroup( this ); + sizeMapDefGroup->addButton( localButton, 0 ); + sizeMapDefGroup->addButton( backgroundButton, 1 ); + sizeMapDefGroup->addButton( constantButton, 2 ); + + sizeMapDefGroupLayout = new QGridLayout(sizeMapDefinition); + sizeMapDefGroupLayout->addWidget(localButton, 0,0); + sizeMapDefGroupLayout->addWidget(backgroundButton, 0,1); + sizeMapDefGroupLayout->addWidget(constantButton, 0,2); + sizeMapDefGroupLayout->addWidget(medFileBackground, 1,0); + sizeMapDefGroupLayout->addWidget(selectMedFileBackgroundbutton, 1,1); + sizeMapDefGroupLayout->addWidget(selectMedFileBackgroundLineEdit, 1,2); + sizeMapDefGroupLayout->addWidget(valueLabel, 2,0); + sizeMapDefGroupLayout->addWidget(dvalue, 2,1); + + // size Map field + sizeMapField = new QGroupBox(tr("SIZE_MAP_FIELD"), this); + fieldName = new QLabel(tr("MG_ADAPT_FIELD_NAME"), sizeMapField); + fieldNameCmb = new QComboBox(sizeMapField); + noTimeStep = new QRadioButton(tr("MG_ADAPT_NO_T_ST"), sizeMapField); + lastTimeStep = new QRadioButton(tr("MG_ADAPT_L_ST"), sizeMapField); + chosenTimeStep = new QRadioButton(tr("MG_ADAPT_CH_ST"), sizeMapField); + timeStepLabel = new QLabel(tr("MG_ADAPT_TSTP"), sizeMapField); + timeStep = new QSpinBox(sizeMapField); + //~timeStep->setMinimum(-1); + rankLabel = new QLabel(tr("MG_ADAPT_RANK"), sizeMapField); + rankSpinBox = new QSpinBox(sizeMapField); + rankSpinBox->setMinimum(-1); + + timeStepGroup = new QButtonGroup(this); + timeStepGroup->addButton(noTimeStep, 0); + timeStepGroup->addButton(lastTimeStep, 1); + timeStepGroup->addButton(chosenTimeStep, 2); + + sizeMapFieldGroupLayout = new QGridLayout(sizeMapField); + + sizeMapFieldGroupLayout->addWidget(fieldName, 0,0); + sizeMapFieldGroupLayout->addWidget(fieldNameCmb, 0,1); + sizeMapFieldGroupLayout->addWidget(noTimeStep, 1,0); + sizeMapFieldGroupLayout->addWidget(lastTimeStep, 1,1); + sizeMapFieldGroupLayout->addWidget(chosenTimeStep, 1,2); + sizeMapFieldGroupLayout->addWidget(timeStepLabel, 2,0); + sizeMapFieldGroupLayout->addWidget(timeStep, 2,1); + sizeMapFieldGroupLayout->addWidget(rankLabel, 2,2); + sizeMapFieldGroupLayout->addWidget(rankSpinBox, 2,3); + + + QGridLayout* argumentsLayout = new QGridLayout( this ); + argumentsLayout->setMargin( MARGIN ); + argumentsLayout->setSpacing( SPACING ); + + argumentsLayout->addWidget( aMeshIn, 0, 0, 1, 3 ); + argumentsLayout->addWidget( aMeshOut, 1, 0, 1, 3 ); + argumentsLayout->addWidget( sizeMapDefinition, 2, 0, 1, 3 ); + argumentsLayout->addWidget( sizeMapField, 3, 0, 1, 3 ); + argumentsLayout->setColumnStretch( 1, 5 ); + argumentsLayout->setRowStretch( 4, 5 ); + + // Initial state + setMode( Mesh, Local); + medFileCheckBox->setChecked(true); + + // Connections + connect( meshInGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( modeChanged( int ) ) ); + connect( sizeMapDefGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( sizeMapDefChanged( int ) ) ); + connect( selectMedFilebutton, SIGNAL( pressed( ) ), this, SLOT( onSelectMedFilebuttonClicked( ) ) ); + connect(medFileCheckBox, SIGNAL (stateChanged(int)), this, SLOT(onMedFileCheckBox(int) ) ); + connect(publishOut, SIGNAL (stateChanged(int)), this, SLOT(onPublishOut(int) ) ); + connect(selectOutMedFilebutton, SIGNAL( pressed()), this, SLOT(onSelectOutMedFilebutton())); + connect(selectMedFileBackgroundbutton, SIGNAL(pressed()), this, SLOT(onSelectMedFileBackgroundbutton()) ); + connect( timeStepGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( timeStepGroupChanged( int ) ) ); + emit updateSelection(); +} + +//================================================================================= +// function : ~SMESHGUI_MgAdaptArguments() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +SMESHGUI_MgAdaptArguments::~SMESHGUI_MgAdaptArguments() +{ +} + +void SMESHGUI_MgAdaptArguments::onNoTimeStep(bool disableOther) +{ + noTimeStep->setChecked(true); + + rankLabel->setVisible(0); + rankSpinBox->setVisible(0); + rankSpinBox->setValue(-2); + + timeStepLabel->setVisible(0); + timeStep->setVisible(0); + timeStep->setValue(-2); + + lastTimeStep->setDisabled(disableOther); + chosenTimeStep->setDisabled(disableOther); + + +} +void SMESHGUI_MgAdaptArguments::onLastTimeStep(bool disableOther) +{ + lastTimeStep->setChecked(true); + + rankLabel->setVisible(0); + rankSpinBox->setVisible(0); + rankSpinBox->setValue(-1); + + timeStepLabel->setVisible(0); + timeStep->setVisible(0); + timeStep->setValue(-1); + noTimeStep->setDisabled(disableOther); +} + +void SMESHGUI_MgAdaptArguments::onChosenTimeStep(bool disableOther, int max) +{ + chosenTimeStep->setChecked(true); + + rankLabel->setVisible(1); + rankSpinBox->setVisible(1); + rankSpinBox->setValue(0); + + timeStepLabel->setVisible(1); + timeStep->setVisible(1); + timeStep->setValue(0); + if (max) timeStep->setMaximum(max); + +} + +void SMESHGUI_MgAdaptArguments::onSelectOutMedFilebutton() +{ + + QString filtre = QString("Med") ; + filtre += QString(" files (*.") + QString("med") + QString(");;"); + QString fileName = QFileDialog::getSaveFileName(this, tr("SAVE_MED"), + QString(""), filtre); + QFileInfo myFileInfo(fileName); + selectOutMedFileLineEdit->setText(myFileInfo.fileName()); + *myFileOutDir = myFileInfo.path(); + +} +void SMESHGUI_MgAdaptArguments::onSelectMedFileBackgroundbutton() +{ + QString fileName0 = selectMedFileBackgroundbutton->text().trimmed(); + + QString fileName = getMedFileName(false); + if (fileName != QString::null) + { + myFieldList = GetListeChamps(fileName); + if (myFieldList.empty()) + { + fileName = fileName0; + fieldNameCmb->clear(); + } + else + { + // fill field name Combobox + fieldNameCmb->clear(); + std::map::const_iterator it; + for ( it=myFieldList.begin() ; it != myFieldList.end(); it++) + { + fieldNameCmb->insertItem(0,QString(it->first)); + int typeStepInField = it->second > 2 ? 2 : it->second ; + timeStepGroupChanged(typeStepInField, true); + } + + } + + } + else + { + fileName = fileName0; + fieldNameCmb->clear(); + } + + QFileInfo myFileInfo(fileName); + *myFileSizeMapDir = myFileInfo.path(); + selectMedFileBackgroundLineEdit->setText(myFileInfo.fileName()); + +} +void SMESHGUI_MgAdaptArguments::onMedFileCheckBox(int state) +{ + if (state == Qt::Checked) + { + selectOutMedFilebutton->show(); + selectOutMedFileLineEdit->show(); + selectOutMedFilebutton->setEnabled(true); + selectOutMedFileLineEdit->setEnabled(true); + } + else + { + selectOutMedFilebutton->setEnabled(false); + selectOutMedFileLineEdit->setEnabled(false); + publishOut->setChecked(true); + } +} +void SMESHGUI_MgAdaptArguments::onPublishOut(int state) +{ + if (state == Qt::Unchecked) + { + medFileCheckBox->setChecked(true); + } +} + +void SMESHGUI_MgAdaptArguments::onSelectMedFilebuttonClicked() +{ + // bool keep = false; + QString fileName0 = selectMedFileLineEdit->text().trimmed(); + + QString fileName = getMedFileName(false); + if(fileName != QString::null) + { + QString aMeshName = lireNomMaillage(fileName.trimmed(), meshDim); + if (aMeshName == QString::null ) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_2") ); + fileName = fileName0; + } + else + { + meshNameLineEdit->setText(aMeshName); + ADAPTATION_MODE aMode = meshDim == 3 ? ADAPTATION_MODE::BOTH : ADAPTATION_MODE::SURFACE; // and when dimesh 3 without 2D mesh? + emit meshDimSignal(aMode); + } + + } + else + { + return; + } + + + QFileInfo myFileInfo(fileName); + *myFileInDir = myFileInfo.path(); + *myFileOutDir = myFileInfo.path(); + selectMedFileLineEdit->setText(myFileInfo.fileName()); + QString outF = fileName == QString::null ? myFileInfo.fileName() : + QString( remove_extension(myFileInfo.fileName().toStdString() ).c_str() )+ QString(".adapt.med"); + selectOutMedFileLineEdit->setText(outF); + onLocalSelected(myFileInfo.filePath()); + +} + +void SMESHGUI_MgAdaptArguments::onLocalSelected(QString filePath) +{ + myFieldList = GetListeChamps(filePath, false); + if (myFieldList.empty()) + { + if (localButton->isChecked()) + { + fieldNameCmb->clear(); + } + + } + else + { + // fill field name Combobox + fieldNameCmb->clear(); + std::map::const_iterator it; + for ( it = myFieldList.begin() ; it != myFieldList.end(); it++) + { + fieldNameCmb->insertItem(0,QString(it->first)); + int typeStepInField = it->second > 2 ? 2 : it->second ; + timeStepGroupChanged(typeStepInField, true); + } + + } +} +// ======================================================================= +// Gestion les boutons qui permettent de +// 1) retourne le nom d'un fichier par une fenetre de dialogue si aucun +// objet est selectionne dans l arbre d etude +// 2) retourne le nom du fichier asocie a l objet +// selectionne dans l arbre d etude +// ======================================================================= +QString SMESHGUI_MgAdaptArguments::getMedFileName(bool avertir) +{ + + QString aFile = QString::null; + QString filtre = QString("Med") ; + filtre += QString(" files (*.") + QString("med") + QString(");;"); + aFile = SUIT_FileDlg::getOpenFileName(0, QObject::tr("MG_ADAPT_SELECT_FILE_0"), QString(""), filtre ); + + return aFile; + +} +void SMESHGUI_MgAdaptArguments::setMode(const Mode theMode, const SIZEMAP theSizeMap ) +{ + QRadioButton* aButton = qobject_cast( meshInGroup->button( theMode ) ); + QRadioButton* bButton = qobject_cast( sizeMapDefGroup->button( theSizeMap ) ); + if ( aButton ) { + aButton->setChecked( true ); + modeChanged( theMode ); + } + if ( bButton ) { + bButton->setChecked( true ); + sizeMapDefChanged( theSizeMap ); + } +} + +void SMESHGUI_MgAdaptArguments::modeChanged( int theMode ) +{ + clear(); + if(theMode == Mesh) + { + aBrowserObject->hide(); + selectMedFileLineEdit->show(); + selectMedFilebutton->show(); + localButton->setEnabled(true); + } + else + { + selectMedFileLineEdit->hide(); + selectMedFilebutton->hide(); + localButton->setEnabled(false); + aBrowserObject->show(); + sizeMapDefChanged(Background); + emit updateSelection(); + } + + + +} + +void SMESHGUI_MgAdaptArguments::sizeMapDefChanged( int theSizeMap ) +{ + fieldNameCmb->clear(); + if(theSizeMap == Local) + { + localButton->setEnabled(true); + localButton->setChecked(true); + medFileBackground->hide(); + selectMedFileBackgroundbutton->hide(); + selectMedFileBackgroundLineEdit->hide(); + selectMedFileBackgroundLineEdit->clear(); + valueLabel->hide(); + dvalue->hide(); + + sizeMapField->setEnabled(true); + if (!selectMedFileLineEdit->text().isEmpty()) + { + QFileInfo myFileInfo(QDir(*myFileInDir), selectMedFileLineEdit->text()); + onLocalSelected(myFileInfo.filePath()); + } + } + else if (theSizeMap == Background) + { + medFileBackground->show(); + backgroundButton->setChecked(true); + selectMedFileBackgroundbutton->show(); + selectMedFileBackgroundLineEdit->show(); + valueLabel->hide(); + dvalue->hide(); + sizeMapField->setEnabled(true); + + } + else + { + medFileBackground->hide(); + constantButton->setChecked(true); + selectMedFileBackgroundbutton->hide(); + selectMedFileBackgroundLineEdit->clear(); + selectMedFileBackgroundLineEdit->hide(); + valueLabel->show(); + dvalue->show(); + sizeMapField->setEnabled(false); + + } + + +} +void SMESHGUI_MgAdaptArguments::timeStepGroupChanged(int timeStepType, bool disableOther, int max) +{ + switch (timeStepType) + { + case 0 : + onNoTimeStep(disableOther); + break; + case 1 : + onLastTimeStep(disableOther); + break; + case 2 : + onChosenTimeStep(disableOther, max); + default: + break; + } +} + +void SMESHGUI_MgAdaptArguments::clear() +{ + selectMedFileLineEdit->clear(); + aBrowserObject->clear(); + + meshNameLineEdit->clear(); + selectOutMedFileLineEdit->clear(); +} +med_int SMESHGUI_MgAdaptArguments::getMeshDim() const +{ + return meshDim; +} +QWidget* ItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &o, const QModelIndex &index) const +{ + bool editable = index.data( EDITABLE_ROLE ).toInt(); + return editable ? QItemDelegate::createEditor( parent, o, index ) : 0; +} + +////////////////////////////////////////// +// MgAdaptAdvWidget +////////////////////////////////////////// + +MgAdaptAdvWidget::MgAdaptAdvWidget( QWidget* parent, std::vector * options, Qt::WindowFlags f ) + : QWidget( parent, f ), myOptions(options) +{ + setupWidget(); + myOptionTable->header()->setSectionResizeMode( QHeaderView::ResizeToContents ); + myOptionTable->setItemDelegate( new ItemDelegate( myOptionTable ) ); + + for ( int i = 0, nb = myOptions->size(); i < nb; ++i ) + { + AddOption( (*myOptions)[i].c_str() ); + } + + connect( myOptionTable, SIGNAL( itemChanged(QTreeWidgetItem *, int)), SLOT( itemChanged(QTreeWidgetItem *, int ))); + connect( addBtn, SIGNAL( clicked() ), this, SLOT( onAddOption() ) ); + connect(workingDirectoryPushButton, SIGNAL(pressed()), this, SLOT(_onWorkingDirectoryPushButton())); +} + +MgAdaptAdvWidget::~MgAdaptAdvWidget() +{ +} + +void MgAdaptAdvWidget::AddOption( const char* option, bool isCustom ) +{ + + + QString name, value; + bool isDefault = false; + if ( option ) + { + QStringList name_value_type = QString(option).split( ":", QString::KeepEmptyParts ); + if ( name_value_type.size() > 0 ) + name = name_value_type[0]; + if ( name_value_type.size() > 1 ) + value = name_value_type[1]; + if ( name_value_type.size() > 2 ) + isDefault = !name_value_type[2].toInt(); + + } + QTreeWidget* table = myOptionTable; + //table->setExpanded( true ); + + QTreeWidgetItem* row; + if (optionTreeWidgetItem.size()) + { + std::map::iterator it = optionTreeWidgetItem.find(name); + if(it != optionTreeWidgetItem.end()) return; // option exist + else + { + row = getNewQTreeWidgetItem(table, option, name, isCustom); + } + } + else + { + row = getNewQTreeWidgetItem(table, option, name, isCustom); + } + row->setText( 0, tr( name.toLatin1().constData() )); + row->setText( 1, tr( value.toLatin1().constData() )); + row->setCheckState( 0, isDefault ? Qt::Unchecked : Qt::Checked); + row->setData( NAME_COL, PARAM_NAME, name ); + + if ( isCustom ) + { + myOptionTable->scrollToItem( row ); + myOptionTable->setCurrentItem( row ); + myOptionTable->editItem( row, NAME_COL ); + } +} + +QTreeWidgetItem* MgAdaptAdvWidget::getNewQTreeWidgetItem(QTreeWidget* table, const char* option, QString& name, bool isCustom) +{ + QTreeWidgetItem* row = new QTreeWidgetItem( table ); + row->setData( NAME_COL, EDITABLE_ROLE, int( isCustom && !option )); + row->setFlags( row->flags() | Qt::ItemIsEditable ); + optionTreeWidgetItem.insert(std::pair (name, row)); + + return row; +} + +void MgAdaptAdvWidget::onAddOption() +{ + AddOption( NULL, true ); +} +void MgAdaptAdvWidget::GetOptionAndValue( QTreeWidgetItem * tblRow, + QString& option, + QString& value, + bool& isDefault) +{ + option = tblRow->data( NAME_COL, PARAM_NAME ).toString(); + value = tblRow->text( VALUE_COL ); + isDefault = ! tblRow->checkState( NAME_COL ); + +} + + +void MgAdaptAdvWidget::itemChanged(QTreeWidgetItem* tblRow, int column) +{ + if ( tblRow ) + { + myOptionTable->blockSignals( true ); + + tblRow->setData( VALUE_COL, EDITABLE_ROLE, int( tblRow->checkState( NAME_COL ))); + + int c = tblRow->checkState( NAME_COL ) ? 0 : 150; + tblRow->setForeground( VALUE_COL, QBrush( QColor( c, c, c ))); + + if ( column == NAME_COL && tblRow->data( NAME_COL, EDITABLE_ROLE ).toInt() ) // custom table + { + tblRow->setData( NAME_COL, PARAM_NAME, tblRow->text( NAME_COL )); + } + + myOptionTable->blockSignals( false ); + } +} +void MgAdaptAdvWidget::setupWidget() +{ + if (this->objectName().isEmpty()) + this->setObjectName(QString(tr("MG-ADAPT-ADV"))); + this->resize(337, 369); + gridLayout_4 = new QGridLayout(this); + gridLayout_4->setObjectName(QString("gridLayout_4")); + myOptionTable = new MgAdaptAdvWidgetTreeWidget(this); + QFont font; + font.setBold(false); + font.setWeight(50); + QTreeWidgetItem *__qtreewidgetitem = new QTreeWidgetItem(); + __qtreewidgetitem->setFont(1, font); + __qtreewidgetitem->setFont(0, font); + __qtreewidgetitem->setText(1, tr("OPTION_VALUE_COLUMN")); + __qtreewidgetitem->setText(0, tr("OPTION_NAME_COLUMN")); + myOptionTable->setHeaderItem(__qtreewidgetitem); + myOptionTable->setObjectName(QString("myOptionTable")); + myOptionTable->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed); + myOptionTable->setTabKeyNavigation(true); + + gridLayout_4->addWidget(myOptionTable, 0, 0, 1, 2); + + addBtn = new QPushButton(this); + addBtn->setObjectName(QString("addBtn")); + + gridLayout_4->addWidget(addBtn, 1, 0, 1, 1); + + horizontalSpacer = new QSpacerItem(188, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + gridLayout_4->addItem(horizontalSpacer, 1, 1, 1, 1); + + logGroupBox = new QGroupBox(this); + logGroupBox->setObjectName(QString("logGroupBox")); + gridLayout_2 = new QGridLayout(logGroupBox); + gridLayout_2->setObjectName(QString("gridLayout_2")); + gridLayout = new QGridLayout(); + gridLayout->setObjectName(QString("gridLayout")); + workingDirectoryLabel = new QLabel(logGroupBox); + workingDirectoryLabel->setObjectName(QString("workingDirectoryLabel")); + + gridLayout->addWidget(workingDirectoryLabel, 0, 0, 1, 1); + + workingDirectoryLineEdit = new QLineEdit(logGroupBox); + workingDirectoryLineEdit->setObjectName(QString("workingDirectoryLineEdit")); + + gridLayout->addWidget(workingDirectoryLineEdit, 0, 1, 1, 1); + + workingDirectoryPushButton = new QPushButton(logGroupBox); + workingDirectoryPushButton->setObjectName(QString("workingDirectoryPushButton")); + + gridLayout->addWidget(workingDirectoryPushButton, 0, 2, 1, 1); + + verboseLevelLabel = new QLabel(logGroupBox); + verboseLevelLabel->setObjectName(QString("verboseLevelLabel")); + + gridLayout->addWidget(verboseLevelLabel, 1, 0, 1, 1); + + verboseLevelSpin = new QSpinBox(logGroupBox); + verboseLevelSpin->setObjectName(QString("verboseLevelSpin")); + + gridLayout->addWidget(verboseLevelSpin, 1, 1, 1, 1); + + + gridLayout_2->addLayout(gridLayout, 0, 0, 1, 1); + + horizontalLayout = new QHBoxLayout(); + horizontalLayout->setObjectName(QString("horizontalLayout")); + logInFileCheck = new QCheckBox(logGroupBox); + logInFileCheck->setObjectName(QString("logInFileCheck")); + logInFileCheck->setChecked(true); + + horizontalLayout->addWidget(logInFileCheck); + + removeLogOnSuccessCheck = new QCheckBox(logGroupBox); + removeLogOnSuccessCheck->setObjectName(QString("removeLogOnSuccessCheck")); + removeLogOnSuccessCheck->setChecked(true); + + horizontalLayout->addWidget(removeLogOnSuccessCheck); + + + gridLayout_2->addLayout(horizontalLayout, 1, 0, 1, 1); + + keepWorkingFilesCheck = new QCheckBox(logGroupBox); + keepWorkingFilesCheck->setObjectName(QString("keepWorkingFilesCheck")); + keepWorkingFilesCheck->setAutoExclusive(false); + + gridLayout_2->addWidget(keepWorkingFilesCheck, 2, 0, 1, 1); + + + gridLayout_4->addWidget(logGroupBox, 3, 0, 1, 2); + + + // retranslateUi(this); + + // QMetaObject::connectSlotsByName(this); + +} +void MgAdaptAdvWidget::_onWorkingDirectoryPushButton() +{ + QString aDirName=QFileDialog::getExistingDirectory (); + if (!(aDirName.isEmpty()))workingDirectoryLineEdit->setText(aDirName); +} +void MgAdaptAdvWidget::onMeshDimChanged(ADAPTATION_MODE aMode) +{ + /* default adaptation mode + * assume that if meshDim == 2 -->adaptation surface + * if meshDim == 3 and if there is not 2D mesh -->VOLUME + * else BOTH + */ + + QString adaptation("adaptation"), value; + switch(aMode) + { + case ADAPTATION_MODE::SURFACE: + { + value ="surface"; + setOptionValue(adaptation, value); + break; + } + case ADAPTATION_MODE::BOTH : + { + value = "both"; + setOptionValue(adaptation, value); + break; + } + case ADAPTATION_MODE::VOLUME : + { + value = "volume"; + setOptionValue(adaptation, value); + break; + } + } +} +void MgAdaptAdvWidget::setOptionValue(QString& option, QString& value) +{ + + std::map::iterator it = optionTreeWidgetItem.find(option); + if (it != optionTreeWidgetItem.end()) + { + it->second->setText( 0, tr( option.toLatin1().constData() )); + it->second->setText( 1, tr( value.toLatin1().constData() )); + it->second->setCheckState( 0, Qt::Checked ); + it->second->setData( NAME_COL, PARAM_NAME, option ); + myOptionTable->editItem( it->second, NAME_COL ); + } +} +namespace +{ +bool isEditable( const QModelIndex& index ) +{ + return index.isValid() && + index.flags() & Qt::ItemIsEditable && + index.flags() & Qt::ItemIsEnabled && + ( !index.data( Qt::UserRole + 1 ).isValid() || index.data( Qt::UserRole + 1 ).toInt() != 0 ); +} +} + +MgAdaptAdvWidgetTreeWidget::MgAdaptAdvWidgetTreeWidget( QWidget* parent ) + : QTreeWidget( parent ) +{ +} + +QModelIndex MgAdaptAdvWidgetTreeWidget::moveCursor( CursorAction action, Qt::KeyboardModifiers modifiers ) +{ + QModelIndex current = currentIndex(); + int column = current.column(); + if ( action == MoveNext ) { + if ( column < columnCount()-1 ) { + QModelIndex next = current.sibling( current.row(), column+1 ); + if ( isEditable( next ) ) + return next; + } + else { + QModelIndex next = current.sibling( current.row()+1, 0 ); + if ( isEditable( next ) ) + return next; + } + } + else if ( action == MovePrevious ) { + if ( column == 0 ) { + QModelIndex next = current.sibling( current.row()-1, columnCount()-1 ); + if ( isEditable( next ) ) + return next; + } + else { + QModelIndex next = current.sibling( current.row(), column-1 ); + if ( isEditable( next ) ) + return next; + } + } + return QTreeWidget::moveCursor( action, modifiers ); +} + +void MgAdaptAdvWidgetTreeWidget::keyPressEvent( QKeyEvent* e ) +{ + switch ( e->key() ) { + case Qt::Key_F2: + { + QModelIndex index = currentIndex(); + if ( !isEditable( index ) ) { + for ( int i = 0; i < columnCount(); i++ ) { + QModelIndex sibling = index.sibling( index.row(), i ); + if ( isEditable( sibling ) ) { + if ( !edit( sibling, EditKeyPressed, e ) ) + e->ignore(); + } + } + } + } + break; + default: + break; + } + QTreeWidget::keyPressEvent( e ); +} + + +// ======================================================================= +// renvoie le medId associe au fichier Med apres ouverture +// ======================================================================= +med_idt OuvrirFichier(QString aFile) +{ + med_idt medIdt = MEDfileOpen(aFile.toStdString().c_str(),MED_ACC_RDONLY); + if (medIdt <0) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_1") ); + } + return medIdt; +} + +// ====================================================== +// ======================================================== +QString lireNomMaillage(QString aFile, med_int& meshdim) +{ + QString nomMaillage = QString::null ; + int erreur = 0 ; + med_idt medIdt ; + + // Ouverture du fichier + medIdt = OuvrirFichier(aFile); + if ( medIdt < 0 ) + { + erreur = 1 ; + return nomMaillage; + } + med_int numberOfMeshes = MEDnMesh(medIdt) ; + if (numberOfMeshes == 0 ) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_2") ); + erreur = 2 ; + return nomMaillage; + } + if (numberOfMeshes > 1 ) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_3") ); + erreur = 3 ; + return nomMaillage; + } + + nomMaillage = lireNomMaillage2(medIdt,1, meshdim); + // Fermeture du fichier + if ( medIdt > 0 ) MEDfileClose(medIdt); + + return nomMaillage; +} + +// ======================================================================= +// ======================================================================= +QString lireNomMaillage2(med_idt medIdt,int meshId, med_int& meshdim ) +{ + QString NomMaillage=QString::null; + char meshname[MED_NAME_SIZE+1]; + med_int spacedim; + med_mesh_type meshtype; + char descriptionription[MED_COMMENT_SIZE+1]; + char dtunit[MED_SNAME_SIZE+1]; + med_sorting_type sortingtype; + med_int nstep; + med_axis_type axistype; + int naxis = MEDmeshnAxis(medIdt,1); + char *axisname=new char[naxis*MED_SNAME_SIZE+1]; + char *axisunit=new char[naxis*MED_SNAME_SIZE+1]; + med_err aRet = MEDmeshInfo(medIdt, + meshId, + meshname, + &spacedim, + &meshdim, + &meshtype, + descriptionription, + dtunit, + &sortingtype, + &nstep, + &axistype, + axisname, + axisunit); + + if ( aRet < 0 ) { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), \ + QObject::tr("MG_ADAPT_MED_FILE_4") ); + } + else { + NomMaillage=QString(meshname); + } + + delete[] axisname ; + delete[] axisunit ; + + return NomMaillage; +} + + + +// ======================================================================= +std::map GetListeChamps(QString aFile, bool errorMessage) +// ======================================================================= +{ +// Il faut voir si plusieurs maillages + + MESSAGE("GetListeChamps"); + std::map ListeChamp ; + + med_err erreur = 0 ; + med_idt medIdt ; + + while ( erreur == 0 ) + { + // Ouverture du fichier + SCRUTE(aFile.toStdString()); + medIdt = OuvrirFichier(aFile); + if ( medIdt < 0 ) + { + erreur = 1 ; + break ; + } + // Lecture du nombre de champs + med_int ncha = MEDnField(medIdt) ; + if (ncha < 1 ) + { + if(errorMessage) + { + QMessageBox::critical( 0, QObject::tr("_ERROR"), + QObject::tr("HOM_MED_FILE_5") ); + } + erreur = 2 ; + break ; + } + // Lecture des caracteristiques des champs + for (int i=0; i< ncha; i++) + { +// Lecture du nombre de composantes + med_int ncomp = MEDfieldnComponent(medIdt,i+1); +// Lecture du type du champ, des noms des composantes et du nom de l'unite + char nomcha [MED_NAME_SIZE+1]; + char meshname[MED_NAME_SIZE+1]; + char * comp = (char*) malloc(ncomp*MED_SNAME_SIZE+1); + char * unit = (char*) malloc(ncomp*MED_SNAME_SIZE+1); + char dtunit[MED_SNAME_SIZE+1]; + med_bool local; + med_field_type typcha; + med_int nbofcstp; + erreur = MEDfieldInfo(medIdt,i+1,nomcha,meshname,&local,&typcha,comp,unit,dtunit,&nbofcstp) ; + free(comp); + free(unit); + if ( erreur < 0 ) + { + if(errorMessage) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_6") ); + } + break ; + } + + ListeChamp.insert(std::pair (QString(nomcha), nbofcstp)); + + } + break ; + } + // Fermeture du fichier + if ( medIdt > 0 ) MEDfileClose(medIdt); + + return ListeChamp; +} + +std::string remove_extension(const std::string& filename) { + size_t lastdot = filename.find_last_of("."); + if (lastdot == std::string::npos) return filename; + return filename.substr(0, lastdot); +} + + diff --git a/src/ADAPTGUI/MG_ADAPTGUI.hxx b/src/ADAPTGUI/MG_ADAPTGUI.hxx new file mode 100644 index 000000000..5e2a90435 --- /dev/null +++ b/src/ADAPTGUI/MG_ADAPTGUI.hxx @@ -0,0 +1,329 @@ +// Copyright (C) 2011-2020 CEA/DEN, EDF R&D +// +// 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 +// + +// SMESH SMESHGUI : GUI for the adaptation in the SMESH component +// File : MG_ADAPTGUI.hxx +// +#ifndef MG_ADAPTGUI_HXX +#define MG_ADAPTGUI_HXX + +#include +// SMESH includes + +// Qt includes +#include +#include +#include + +#include "LightApp_DataOwner.h" +#include "SalomeApp_Application.h" +#include +#include +#include "SalomeApp_Module.h" +#include "SalomeApp_Study.h" +#include +#include + + +// model + + +#include "MG_ADAPT.hxx" + +class SUIT_ViewWindow; +class SUIT_Desktop; +class SUIT_Study; +class SUIT_ResourceMgr; + +class CAM_Module; + +class SALOMEDSClient_Study; +class SALOMEDSClient_SObject; + +class SalomeApp_Study; +class SalomeApp_Module; +class LightApp_SelectionMgr; + + +class QButtonGroup; +class QLineEdit; +class QGroupBox; +class QRadioButton; +class QLabel; +class QCheckBox; +class QGridLayout; +class QTabWidget; +class QDoubleSpinBox; +class QSpinBox; +class QTreeWidget; +class QTreeWidgetItem; +class QSpacerItem; +class QHBoxLayout; +class QItemDelegate; +class QComboBox; + +// IDL includes +#include + +class SVTK_ViewWindow; +class SVTK_Selector; +class SMESHGUI_MgAdaptDlg; +class SMESHGUI_MgAdaptArguments; +class SMESHGUI_SpinBox; +class MgAdaptAdvWidgetTreeWidget; +class MgAdaptAdvWidget; +class MgAdapt; +class QHeaderView; +class QFileDialog; + + +std::map GetListeChamps(QString aFile, bool errorMessage = true); +QString lireNomMaillage(QString aFile, med_int& meshDim); +QString lireNomMaillage2(med_idt medIdt,int meshId, med_int& meshDim); +med_idt OuvrirFichier(QString aFile); +std::string remove_extension(const std::string& filename); + + +enum ADAPTATION_MODE{ + SURFACE, // surface adaption when meshDim == 2 + VOLUME, // + BOTH +}; +//================================================================================= +// class : SMESHGUI_MgAdaptDlg +// purpose : +//================================================================================= +class SMESHGUI_MgAdaptDlg : public QDialog +{ + Q_OBJECT; +public: + //! Property type + enum Mode { Arguments, AdvancedOptions}; + SMESHGUI_MgAdaptDlg( SalomeApp_Module*, MgAdapt*, QWidget* parent= 0,bool isCreation = true ); + ~SMESHGUI_MgAdaptDlg(); + + void buildDlg(); + void reject(); + bool checkParams(QString& msg) ; + void setModel(MgAdapt*); + MgAdapt* getModel() const; + +public slots: + +protected slots: + + virtual bool clickOnApply(); +private slots: + virtual void clickOnHelp(); + virtual void clickOnOk(); +protected : + + SMESHGUI_MgAdaptArguments* myArgs; + MgAdaptAdvWidget* myAdvOpt; + bool readParamsFromHypo( ) const ; + bool readParamsFromWidgets( ) ; + bool storeParamsToHypo( const MgAdaptHypothesisData& ) const; + +private: + + + SalomeApp_Module* mySMESHGUI; /* Current SMESHGUI object */ + QTabWidget* myTabWidget; + + + MgAdaptHypothesisData* myData; + MgAdapt* model; + +}; + +class SMESHGUI_MgAdaptArguments : public QWidget +{ + Q_OBJECT; +public: + //! Property type + enum Mode { Mesh, Browser}; + enum SIZEMAP { Local, Background, Constant}; + SMESHGUI_MgAdaptArguments( QWidget* parent); + ~SMESHGUI_MgAdaptArguments(); + void setMode( const Mode, const SIZEMAP ); + med_int getMeshDim() const; + + QString* myFileInDir; + QString* myFileOutDir; + QString* myFileSizeMapDir; + QGroupBox* aMeshIn ; + QRadioButton* aMedfile; + QRadioButton* aBrowser ; + QLineEdit* aBrowserObject; + QPushButton* selectMedFilebutton ; + QSpacerItem* hspacer; + QLineEdit* selectMedFileLineEdit ; + QButtonGroup* meshInGroup ; + QGridLayout* meshIn ; + + QGroupBox* aMeshOut ; + QLabel* meshName; + QLineEdit* meshNameLineEdit; + QSpacerItem* secondHspacer; + QCheckBox* medFileCheckBox; + QPushButton* selectOutMedFilebutton; + QLineEdit* selectOutMedFileLineEdit; + QSpacerItem* thirdHspacer; + QCheckBox* publishOut; + QGridLayout* meshOut ; + + QGroupBox* sizeMapDefinition ; + QRadioButton* localButton; + QRadioButton* backgroundButton ; + QRadioButton* constantButton ; + QLabel* medFileBackground; + QPushButton* selectMedFileBackgroundbutton; + QLineEdit* selectMedFileBackgroundLineEdit; + QLabel* valueLabel; + QDoubleSpinBox* dvalue; + QButtonGroup* sizeMapDefGroup ; + QGridLayout* sizeMapDefGroupLayout; + + + QGroupBox* sizeMapField; + QLabel* fieldName; + QComboBox* fieldNameCmb; + QRadioButton* noTimeStep; + QRadioButton* lastTimeStep ; + QRadioButton* chosenTimeStep; + QLabel* timeStepLabel; + QSpinBox* timeStep; + QLabel* rankLabel; + QSpinBox* rankSpinBox; + QButtonGroup* timeStepGroup; + QGridLayout* sizeMapFieldGroupLayout; + +signals: + void updateSelection(); + void toExportMED(const char *); + void meshDimSignal(ADAPTATION_MODE aMode); +public slots: + +protected slots: + +private slots: + void modeChanged( int); + void sizeMapDefChanged(int); + void timeStepGroupChanged(int timeStepType, bool disableOther = false, int max = 0); + void onSelectMedFilebuttonClicked(); + void clear(); + void onMedFileCheckBox(int); + void onPublishOut(int); + void onSelectOutMedFilebutton(); + void onSelectMedFileBackgroundbutton(); + void onLocalSelected(QString); + void onNoTimeStep(bool disableOther = false); + void onLastTimeStep(bool disableOther = false); + void onChosenTimeStep(bool disableOther = false, int max = 0); + +private: + + QString getMedFileName(bool avertir); + LightApp_SelectionMgr* selMgr ; + med_int meshDim; + std::map myFieldList; + + +}; +enum { + OPTION_ID_COLUMN = 0, + OPTION_TYPE_COLUMN, + OPTION_NAME_COLUMN = 0, + OPTION_VALUE_COLUMN, + NB_COLUMNS, +}; + +////////////////////////////////////////// +// MgAdaptAdvWidget +////////////////////////////////////////// +class MgAdaptAdvWidget : public QWidget +{ + Q_OBJECT + +public: + MgAdaptAdvWidget( QWidget* = 0, std::vector * = nullptr, Qt::WindowFlags = 0 ); + ~MgAdaptAdvWidget(); + std::vector < std::string > * myOptions; + QGridLayout *gridLayout_4; + MgAdaptAdvWidgetTreeWidget *myOptionTable; + QPushButton *addBtn; + QSpacerItem *horizontalSpacer; + QGroupBox *logGroupBox; + QGridLayout *gridLayout_2; + QGridLayout *gridLayout; + QLabel *workingDirectoryLabel; + QLineEdit *workingDirectoryLineEdit; + QPushButton *workingDirectoryPushButton; + QLabel *verboseLevelLabel; + QSpinBox *verboseLevelSpin; + QHBoxLayout *horizontalLayout; + QCheckBox *logInFileCheck; + QCheckBox *removeLogOnSuccessCheck; + QCheckBox *keepWorkingFilesCheck; + + void AddOption( const char* name_value_type, bool isCustom = false ); + void GetOptionAndValue( QTreeWidgetItem * tblRow, QString& option, QString& value, bool& dflt ); + void setupWidget(); +public slots: + + void onAddOption(); + void itemChanged(QTreeWidgetItem * tblRow, int column); + void onMeshDimChanged(ADAPTATION_MODE aMode); +private slots: + void _onWorkingDirectoryPushButton(); +private: + void setOptionValue(QString& option, QString& value); + std::map optionTreeWidgetItem; + + QTreeWidgetItem* getNewQTreeWidgetItem(QTreeWidget* table, const char* option, QString& name, bool isCustom); + +}; + +enum { EDITABLE_ROLE = Qt::UserRole + 1, PARAM_NAME, + NAME_COL = 0, VALUE_COL + }; + + + +class ItemDelegate: public QItemDelegate +{ +public: + + ItemDelegate(QObject* parent=0): QItemDelegate(parent) {} + QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &o, const QModelIndex &index) const; +}; + +class MgAdaptAdvWidgetTreeWidget : public QTreeWidget +{ + Q_OBJECT +public: + MgAdaptAdvWidgetTreeWidget( QWidget* ); + +protected: + QModelIndex moveCursor( CursorAction, Qt::KeyboardModifiers ); + void keyPressEvent( QKeyEvent* ); +}; + + +#endif // MG_ADAPTGUI_HXX diff --git a/src/SMESHGUI/CMakeLists.txt b/src/SMESHGUI/CMakeLists.txt index df5580f27..59f09da98 100644 --- a/src/SMESHGUI/CMakeLists.txt +++ b/src/SMESHGUI/CMakeLists.txt @@ -42,10 +42,12 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/Controls ${PROJECT_SOURCE_DIR}/src/SMESHClient ${PROJECT_SOURCE_DIR}/src/MEDWrapper + ${PROJECT_SOURCE_DIR}/src/ADAPT ${PROJECT_SOURCE_DIR}/src/ADAPTGUI ${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/idl ${PROJECT_BINARY_DIR}/src/ADAPTGUI + ${PROJECT_BINARY_DIR}/src/ADAPT ${MEDCOUPLING_INCLUDE_DIRS} ) @@ -154,7 +156,7 @@ SET(_moc_HEADERS SMESHGUI_PreVisualObj.h SMESHGUI_AdaptDlg.h SMESHGUI_MG_ADAPTDRIVER.h - MG_ADAPTGUI.hxx # to replace in ../ADAPTGUI/ + #~MG_ADAPTGUI.hxx # to replace in ../ADAPTGUI/ ) # header files / no moc processing @@ -177,7 +179,7 @@ SET(_other_HEADERS SMESHGUI_FileValidator.h SMESHGUI_SelectionProxy.h SMESH_SMESHGUI.hxx - MG_ADAPT.hxx # to replace in ../ADAPT/ + #~MG_ADAPT.hxx # to replace in ../ADAPT/ ) # header files / to install @@ -273,8 +275,8 @@ SET(_other_SOURCES SMESHGUI_IdPreview.cxx SMESHGUI_AdaptDlg.cxx SMESHGUI_MG_ADAPTDRIVER.cxx - MG_ADAPTGUI.cxx # to replace in ../ADAPTGUI/ - MG_ADAPT.cxx # to replace in ../ADAPT/ + #~MG_ADAPTGUI.cxx # to replace in ../ADAPTGUI/ + #MG_ADAPT.cxx ) # sources / to compile diff --git a/src/SMESHGUI/MG_ADAPT.cxx b/src/SMESHGUI/MG_ADAPT.cxx deleted file mode 100644 index 8a74bc78e..000000000 --- a/src/SMESHGUI/MG_ADAPT.cxx +++ /dev/null @@ -1,1398 +0,0 @@ -// Copyright (C) 2007-2020 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/ -// file : MG_ADAPT.cxx - -#include "MG_ADAPT.hxx" - -#include "MeshFormatReader.hxx" -#include "MeshFormatWriter.hxx" -#include "MEDFileMesh.hxx" -#include "MCAuto.hxx" -#include "MEDFileData.hxx" -#include "MEDFileField.hxx" -#include "MEDCouplingFieldDouble.hxx" - -#include -#include -#include -#include -#include -#include -#include - -static std::string removeFile(std::string fileName, int& notOk) -{ - std::string errStr; - notOk = std::remove(fileName.c_str()); - if (notOk) errStr = ToComment(" \n error while removing file : ") - << fileName; - else errStr= ToComment("\n file : ")<< fileName << " succesfully deleted! \n "; - - return errStr; -} -namespace -{ -struct GET_DEFAULT // struct used to get default value from GetOptionValue() -{ - bool isDefault; - operator bool* () { - return &isDefault; - } -}; -} - -//---------------------------------------------------------------------------------------- -MgAdapt::MgAdapt() -{ - data = new MgAdaptHypothesisData(); - data->myInMeshName = ""; - data->fromMedFile = defaultFromMedFile(); - data->myFileInDir = defaultWorkingDirectory(); - data->myMeshFileIn = ""; - data->myFileOutDir = defaultWorkingDirectory(); - data->myOutMeshName = ""; - data->myMeshFileOut = ""; - data->myMeshOutMed = defaultMeshOutMed(); - data->myPublish = defaultPublish(); - data->myUseLocalMap = defaultUseLocalMap(); - data->myUseBackgroundMap = defaultUseBackgroundMap(); - data->myFileSizeMapDir = defaultWorkingDirectory(); - data->myMeshFileBackground = ""; - data->myUseConstantValue = defaultUseConstantValue(); - data->myConstantValue = 0.0; - data->myFieldName = ""; - data->myUseNoTimeStep = defaultUseNoTimeStep(); - data->myUseLastTimeStep = defaultUseLastTimeStep(); - data->myUseChosenTimeStep = defaultUseChosenTimeStep(); - data->myTimeStep = -2; - data->myRank = -2; - data->myWorkingDir = defaultWorkingDirectory(); - data->myLogFile = defaultLogFile(); - data->myVerboseLevel = defaultVerboseLevel(); - data->myPrintLogInFile = defaultPrintLogInFile(); - data->myKeepFiles = defaultKeepFiles(); - data->myRemoveLogOnSuccess = defaultRemoveLogOnSuccess(); - - buildModel(); - setAll(); -} -MgAdapt::MgAdapt(MgAdaptHypothesisData* myData) -{ - data = new MgAdaptHypothesisData(); - setData(myData); - buildModel(); -} - -MgAdapt::MgAdapt( const MgAdapt& copy) -{ - - data = new MgAdaptHypothesisData(); - MgAdaptHypothesisData *copyData = copy.getData(); - copyMgAdaptHypothesisData(copyData); - setAll(); - - this->_option2value = copy._option2value; - this->_customOption2value = copy._customOption2value; - this->_defaultOptionValues = copy._defaultOptionValues; - this->_doubleOptions = copy._doubleOptions; - this->_charOptions = copy._charOptions; - this->_boolOptions = copy._boolOptions; - -} - - - -//----------------------------------------------------------------------------------------- -MgAdapt::~MgAdapt() -{ - - delete data; - -} -void MgAdapt::buildModel() -{ - - const char* boolOptionNames[] = { "compute_ridges", // yes - "" // mark of end - }; - // const char* intOptionNames[] = { "max_number_of_errors_printed", // 1 - // "max_number_of_threads", // 4 - // "" // mark of end - // }; - const char* doubleOptionNames[] = { "max_memory", // 0 - "" // mark of end - }; - const char* charOptionNames[] = { "components", // "yes" - "adaptation", // both - "" // mark of end - }; - - int i = 0; - while (boolOptionNames[i][0]) - { - _boolOptions.insert( boolOptionNames[i] ); - _option2value[boolOptionNames[i++]].clear(); - } - // i = 0; - // while (intOptionNames[i][0]) - // _option2value[intOptionNames[i++]].clear(); - - i = 0; - while (doubleOptionNames[i][0]) { - _doubleOptions.insert(doubleOptionNames[i]); - _option2value[doubleOptionNames[i++]].clear(); - } - i = 0; - while (charOptionNames[i][0]) { - _charOptions.insert(charOptionNames[i]); - _option2value[charOptionNames[i++]].clear(); - } - - // default values to be used while MG-Adapt - - _defaultOptionValues["adaptation" ] = "both"; - _defaultOptionValues["components" ] = "outside components"; - _defaultOptionValues["compute_ridges" ] = "yes"; - _defaultOptionValues["max_memory" ] = ToComment(defaultMaximumMemory()); -} - -//============================================================================= -TOptionValues MgAdapt::getOptionValues() const -{ - TOptionValues vals; - TOptionValues::const_iterator op_val = _option2value.begin(); - for ( ; op_val != _option2value.end(); ++op_val ) - vals.insert( make_pair( op_val->first, getOptionValue( op_val->first, GET_DEFAULT() ))); - - return vals; -} - -std::vector MgAdapt::getOptionValuesStrVec() const -{ - std::vector vals; - TOptionValues::const_iterator op_val = _option2value.begin(); - for ( ; op_val != _option2value.end(); ++op_val ) - vals.push_back(op_val->first+":"+getOptionValue( op_val->first, GET_DEFAULT() )); - - return vals; -} - -std::vector MgAdapt::getCustomOptionValuesStrVec() const -{ - std::vector vals; - TOptionValues::const_iterator op_val; - for ( op_val = _customOption2value.begin(); op_val != _customOption2value.end(); ++op_val ) - { - vals.push_back(op_val->first+":"+getOptionValue( op_val->first, GET_DEFAULT() )); - } - return vals; -} -const TOptionValues& MgAdapt::getCustomOptionValues() const -{ - return _customOption2value; -} -void MgAdapt::setData(MgAdaptHypothesisData* myData) -{ - copyMgAdaptHypothesisData(myData); - setAll(); -} -MgAdaptHypothesisData* MgAdapt::getData() const -{ - return data; -} -void MgAdapt::setMedFileIn(std::string fileName) -{ - medFileIn = fileName; -} - -std::string MgAdapt::getMedFileIn() -{ - return medFileIn; -} - -void MgAdapt::setMedFileOut(std::string fileOut) -{ - medFileOut = fileOut; -} - -std::string MgAdapt::getMedFileOut() -{ - return medFileOut; -} -void MgAdapt::setMeshOutMed(bool mybool) -{ - meshOutMed = mybool; -} -bool MgAdapt::getMeshOutMed() -{ - return meshOutMed; -} -void MgAdapt::setPublish(bool mybool) -{ - publish = mybool; -} -bool MgAdapt::getPublish() -{ - return publish; -} -void MgAdapt::setFieldName(std::string myFieldName) -{ - fieldName = myFieldName; -} -std::string MgAdapt::getFieldName() -{ - return fieldName; -} -void MgAdapt::setTimeStep(int time) -{ - timeStep = time; -} -int MgAdapt::getTimeStep() const -{ - return timeStep; -} - -void MgAdapt::setRankTimeStep(int time, int myRank) -{ - timeStep = time; - rank = myRank; -} - -int MgAdapt::getRank() -{ - return rank; -} -void MgAdapt::setUseLocalMap(bool myLocal) -{ - useLocalMap = myLocal; - -} -bool MgAdapt::getUseLocalMap() -{ - return useLocalMap; -} - -void MgAdapt::setUseBackgroundMap(bool bckg) -{ - useBackgroundMap = bckg; - -} -bool MgAdapt::getUseBackgroundMap() -{ - return useBackgroundMap; -} - -void MgAdapt::setUseConstantValue(bool cnst) -{ - useConstantValue = cnst; - -} -bool MgAdapt::getUseConstantValue() -{ - return useConstantValue; -} -void MgAdapt::setLogFile(std::string myLogFile) -{ - logFile = myLogFile; -} -std::string MgAdapt::getLogFile() -{ - return logFile; -} -void MgAdapt::setVerbosityLevel(int verboLevel) -{ - verbosityLevel = verboLevel; -} -int MgAdapt::getVerbosityLevel() -{ - return verbosityLevel; -} -void MgAdapt::setRemoveOnSuccess(bool rmons) -{ - removeOnSuccess = rmons; -} -bool MgAdapt::getRemoveOnSuccess() -{ - return removeOnSuccess; -} -void MgAdapt::setSizeMapFile(std::string mapFile) -{ - sizeMapFile = mapFile; -} -std::string MgAdapt::getSizeMapFile() -{ - return sizeMapFile; -} - -void MgAdapt::setMeshName(std::string name) -{ - meshName = name; -} -std::string MgAdapt::getMeshName() -{ - return meshName; -} -void MgAdapt::setMeshNameOut(std::string name) -{ - meshNameOut = name; -} -std::string MgAdapt::getMeshNameOut() -{ - return meshNameOut; -} -void MgAdapt::setFromMedFile(bool mybool) -{ - fromMedFile = mybool; -} -bool MgAdapt::isFromMedFile() -{ - return fromMedFile; -} -void MgAdapt::setConstantValue(double cnst) -{ - constantValue = cnst; -} -double MgAdapt::getConstantValue() const -{ - return constantValue; -} - -void MgAdapt::setWorkingDir(std::string dir) -{ - workingDir = dir; -} -std::string MgAdapt::getWorkingDir() const -{ - return workingDir; -} -void MgAdapt::setKeepWorkingFiles(bool mybool) -{ - toKeepWorkingFiles = mybool; -} -bool MgAdapt::getKeepWorkingFiles() -{ - return toKeepWorkingFiles; -} -void MgAdapt::setPrintLogInFile(bool print) -{ - printLogInFile = print; -} -bool MgAdapt::getPrintLogInFile() -{ - return printLogInFile; -} - -bool MgAdapt::setAll() -{ - - setFromMedFile(data->fromMedFile); - std::string file; - checkDirPath(data->myFileInDir); - file = data->myFileInDir+data->myMeshFileIn; - setMedFileIn(file); - setMeshName(data->myInMeshName); - setMeshNameOut(data->myOutMeshName); - checkDirPath(data->myFileOutDir); - std::string out = data->myFileOutDir+data->myMeshFileOut; - setMedFileOut(out); - setPublish(data->myPublish); - setMeshOutMed(data->myMeshOutMed); - setUseLocalMap(data->myUseLocalMap); - setUseBackgroundMap(data->myUseBackgroundMap); - setUseConstantValue(data->myUseConstantValue); - - std::string mapfile; - if (useBackgroundMap) - { - - checkDirPath(data->myFileSizeMapDir); - mapfile = data->myFileSizeMapDir+data->myMeshFileBackground; - setFieldName(data->myFieldName); - } - else if (useConstantValue) - { - setConstantValue(data->myConstantValue); - } - else - { - mapfile =""; - setConstantValue(0.0); - setFieldName(data->myFieldName); - - } - - setSizeMapFile(mapfile); - med_int rank; - med_int tmst; - if (data->myUseNoTimeStep) - { - rank = MED_NO_IT; - tmst = MED_NO_DT ; - } - else if (data->myUseLastTimeStep) - { - std::string fieldFile = useBackgroundMap ? sizeMapFile : medFileIn; - getTimeStepInfos(fieldFile, tmst, rank); - } - else - { - rank = data->myRank; - tmst = data->myTimeStep; - } - setRankTimeStep((int)tmst, (int)rank); - - /* Advanced options */ - setWorkingDir(data->myWorkingDir); - checkDirPath(data->myWorkingDir); - setLogFile(data->myWorkingDir+defaultLogFile()); - setVerbosityLevel(data->myVerboseLevel); - setRemoveOnSuccess(data->myRemoveLogOnSuccess); - setPrintLogInFile(data->myPrintLogInFile); - setKeepWorkingFiles(data->myKeepFiles); - - return true; -} - -void MgAdapt::checkDirPath(std::string& dirPath) -{ - const char lastChar = *dirPath.rbegin(); -#ifdef WIN32 - if(lastChar != '\\') dirPath+='\\'; -#else - if(lastChar != '/') dirPath+='/'; -#endif -} -//============================================================================= -void MgAdapt::setOptionValue(const std::string& optionName, - const std::string& optionValue) -throw (std::invalid_argument) -{ - TOptionValues::iterator op_val = _option2value.find(optionName); - if (op_val == _option2value.end()) - { - op_val = _customOption2value.find( optionName ); - _customOption2value[ optionName ] = optionValue; - return; - } - - if (op_val->second != optionValue) - { - - std::string lowerOptionValue = toLowerStr(optionValue); - const char* ptr = lowerOptionValue.c_str(); - // strip white spaces - while (ptr[0] == ' ') - ptr++; - int i = strlen(ptr); - while (i != 0 && ptr[i - 1] == ' ') - i--; - // check value type - bool typeOk = true; - std::string typeName; - if (i == 0) { - // empty string - } else if (_charOptions.count(optionName)) { - // do not check strings - } else if (_doubleOptions.count(optionName)) { - // check if value is double - toDbl(ptr, &typeOk); - typeName = "real"; - } else if (_boolOptions.count(optionName)) { - // check if value is bool - toBool(ptr, &typeOk); - typeName = "bool"; - } else { - // check if value is int - toInt(ptr, &typeOk); - typeName = "integer"; - } - if ( typeOk ) // check some specific values ? - { - } - if ( !typeOk ) - { - std::string msg = "Advanced option '" + optionName + "' = '" + optionValue + "' but must be " + typeName; - throw std::invalid_argument(msg); - } - std::string value( ptr, i ); - if ( _defaultOptionValues[ optionName ] == value ) - value.clear(); - - - op_val->second = value; - - } -} -//============================================================================= -//! Return option value. If isDefault provided, it can be a default value, -// then *isDefault == true. If isDefault is not provided, the value will be -// empty if it equals a default one. -std::string MgAdapt::getOptionValue(const std::string& optionName, bool* isDefault) const -throw (std::invalid_argument) -{ - TOptionValues::const_iterator op_val = _option2value.find(optionName); - if (op_val == _option2value.end()) - { - op_val = _customOption2value.find(optionName); - if (op_val == _customOption2value.end()) - { - std::string msg = "Unknown MG-Adapt option: <" + optionName + ">"; - throw std::invalid_argument(msg); - } - } - std::string val = op_val->second; - if ( isDefault ) *isDefault = ( val.empty() ); - - if ( val.empty() && isDefault ) - { - op_val = _defaultOptionValues.find( optionName ); - if (op_val != _defaultOptionValues.end()) - val = op_val->second; - } - return val; -} -//================================================================================ -/*! - * \brief Converts a string to a real value - */ -//================================================================================ - -double MgAdapt::toDbl(const std::string& str, bool* isOk ) -throw (std::invalid_argument) -{ - if ( str.empty() ) throw std::invalid_argument("Empty value provided"); - - char * endPtr; - double val = strtod(&str[0], &endPtr); - bool ok = (&str[0] != endPtr); - - if ( isOk ) *isOk = ok; - - if ( !ok ) - { - std::string msg = "Not a real value:'" + str + "'"; - throw std::invalid_argument(msg); - } - return val; -} -//================================================================================ -/*! - * \brief Converts a string to a lower - */ -//================================================================================ -std::string MgAdapt::toLowerStr(const std::string& str) -{ - std::string s = str; - for ( size_t i = 0; i <= s.size(); ++i ) - s[i] = tolower( s[i] ); - return s; -} -//================================================================================ -/*! - * \brief Converts a string to a bool - */ -//================================================================================ - -bool MgAdapt::toBool(const std::string& str, bool* isOk ) -throw (std::invalid_argument) -{ - std::string s = str; - if ( isOk ) *isOk = true; - - for ( size_t i = 0; i <= s.size(); ++i ) - s[i] = tolower( s[i] ); - - if ( s == "1" || s == "true" || s == "active" || s == "yes" ) - return true; - - if ( s == "0" || s == "false" || s == "inactive" || s == "no" ) - return false; - - if ( isOk ) - *isOk = false; - else { - std::string msg = "Not a Boolean value:'" + str + "'"; - throw std::invalid_argument(msg); - } - return false; -} -//================================================================================ -/*! - * \brief Converts a string to a integer value - */ -//================================================================================ - -int MgAdapt::toInt(const std::string& str, bool* isOk ) -throw (std::invalid_argument) -{ - if ( str.empty() ) throw std::invalid_argument("Empty value provided"); - - char * endPtr; - int val = (int)strtol( &str[0], &endPtr, 10); - bool ok = (&str[0] != endPtr); - - if ( isOk ) *isOk = ok; - - if ( !ok ) - { - std::string msg = "Not an integer value:'" + str + "'"; - throw std::invalid_argument(msg); - } - return val; -} -//============================================================================= -bool MgAdapt::hasOptionDefined( const std::string& optionName ) const -{ - bool isDefault = false; - try - { - getOptionValue( optionName, &isDefault ); - } - catch ( std::invalid_argument ) - { - return false; - } - return !isDefault; -} -//================================================================================ -/*! - * \brief Return command to run MG-Tetra mesher excluding file prefix (-f) - */ -//================================================================================ - -std::string MgAdapt::getCommandToRun(MgAdapt* hyp) -{ - return hyp ? hyp->getCommandToRun() : ToComment("error with hypothesis!"); -} - - - -int MgAdapt::compute(std::string& errStr) -{ - std::string cmd = getCommandToRun(); - int err = 0; - execCmd( cmd.c_str(), err ); // run - - if ( err ) - { - errStr = ToComment("system(mg-adapt.exe ...) command failed with error: ") - << strerror( errno ); - } - else - { - convertMeshFile(meshFormatOutputMesh, solFormatOutput); - } - //~if (!err) cleanUp(); - return err; -} - -void MgAdapt::execCmd( const char* cmd, int& err) -{ - err = 1; - std::array buffer; - std::streambuf* buf; - outFileStream fileStream; - if (printLogInFile) - { - fileStream.open(logFile); - buf = fileStream.rdbuf(); - } - else - { - buf = std::cout.rdbuf(); - } - std::ostream logStream(buf); - - std::unique_ptr pipe(popen(cmd, "r"), pclose ); - if(!pipe) - { - throw std::runtime_error("popen() failed!"); - } - while(fgets(buffer.data(), buffer.size(), pipe.get()) !=nullptr ) - { - logStream<::iterator it = tmpFilesToBeDeleted.begin(); - for (; it!=tmpFilesToBeDeleted.end(); ++it) - { - errStr=removeFile(*it, notOk); - if (notOk) - { - appendMsgToLogFile(errStr); - } - - } -} - -void MgAdapt::appendMsgToLogFile(std::string& msg) -{ - std::ofstream logStream; - logStream.open(logFile, std::ofstream::out | std::ofstream::app); - logStream<< msg; - logStream.close(); -} -//================================================================================ -/*! - * \brief Return command to run MG-Tetra mesher excluding file prefix (-f) - */ -//================================================================================ - -std::string MgAdapt::getCommandToRun() -{ - /* - || return system command with args and options - || - */ - std::string errStr; - std::string cmd = getExeName(); - std::string meshIn(""), sizeMapIn(""), solFileIn(""); - convertMedFile(meshIn, solFileIn, sizeMapIn); - if (!isFileExist(meshIn) || !isFileExist(solFileIn)) - { - errStr = ToComment(" failed to find .mesh or .sol file from converter ")<< strerror( errno ); - return errStr; - } - tmpFilesToBeDeleted.push_back(meshIn); - tmpFilesToBeDeleted.push_back(solFileIn); - if(useBackgroundMap && !isFileExist(sizeMapIn)) - { - - errStr = ToComment(" failed to find .mesh size map file from converter ")<< strerror( errno ); - return errStr; - - } - - - cmd+= " --in "+ meshIn; - meshFormatOutputMesh = getFileName()+".mesh"; - cmd+= " --out "+ meshFormatOutputMesh; - if (useLocalMap || useConstantValue) cmd+= " --sizemap "+ solFileIn; - else // (useBackgroundMap) - { - cmd+= " --background_mesh "+ sizeMapIn ; - cmd+= " --background_sizemap "+ solFileIn; - tmpFilesToBeDeleted.push_back(sizeMapIn); - } - //~else - //~{ - //~// constant value TODO - //~} - /* sizemap file is not adapted in case of only surface adaptation see MeshGems docs */ - std::string adapOp = "adaptation"; - std::string adpOpVal = getOptionValue(adapOp); - std::string surfaceAdapt = "surface"; - if(surfaceAdapt != adpOpVal ) - { - std::string solFileOut = getFileName()+".sol"; - cmd+= " --write_sizemap "+ solFileOut; - solFormatOutput.push_back(solFileOut); - } - if (verbosityLevel != defaultVerboseLevel()) - { - - cmd+= " --verbose "+ ToComment(verbosityLevel); - } - - std::string option, value; - bool isDefault; - const TOptionValues* options[] = { &_option2value, &_customOption2value }; - for ( int iOp = 0; iOp < 2; ++iOp ) - { - TOptionValues::const_iterator o2v = options[iOp]->begin(); - for ( ; o2v != options[iOp]->end(); ++o2v ) - { - option = o2v->first; - value = getOptionValue( option, &isDefault ); - - if ( isDefault ) - continue; - if ( value.empty() )//value == NoValue() ) - { - if ( _defaultOptionValues.count( option )) - continue; // non-custom option with no value - //value.clear(); - } - if ( strncmp( "no", option.c_str(), 2 ) == 0 ) // options w/o values: --no_* - { - if ( !value.empty() && toBool( value ) == false ) - continue; - value.clear(); - } - if ( option[0] != '-' ) - cmd += " --"; - else - cmd += " "; - cmd += option + " " + value; - } - } - //~} -//~cmd+= " >" -#ifdef WIN32 - cmd += " < NUL"; -#endif - - return cmd; -} - - -bool MgAdapt::isFileExist(std::string& fName) const -{ - - if ( fName.empty() ) - return false; - - boost::system::error_code err; - bool res = boost::filesystem::exists( fName, err ); - - return err ? false : res; -} -//======================================================================= -//function : defaultMaximumMemory -//======================================================================= - -#if defined(WIN32) -#include -#elif !defined(__APPLE__) -#include -#endif - -double MgAdapt::defaultMaximumMemory() -{ -#if defined(WIN32) - // See http://msdn.microsoft.com/en-us/library/aa366589.aspx - MEMORYSTATUSEX statex; - statex.dwLength = sizeof (statex); - long err = GlobalMemoryStatusEx (&statex); - if (err != 0) { - double totMB = (double)statex.ullAvailPhys / 1024. / 1024.; - return (double)( 0.7 * totMB ); - } -#elif !defined(__APPLE__) - struct sysinfo si; - long err = sysinfo( &si ); - if ( err == 0 ) { - long ramMB = si.totalram * si.mem_unit / 1024 / 1024; - return ( 0.7 * ramMB ); - } -#endif - return 1024; -} - - -//======================================================================= -//function : defaultWorkingDirectory -//======================================================================= - -std::string MgAdapt::defaultWorkingDirectory() -{ - TCollection_AsciiString aTmpDir; - - char *Tmp_dir = getenv("SALOME_TMP_DIR"); - if(Tmp_dir != NULL) { - aTmpDir = Tmp_dir; - } - else { -#ifdef WIN32 - aTmpDir = TCollection_AsciiString("C:\\"); -#else - aTmpDir = TCollection_AsciiString("/tmp/"); -#endif - } - return aTmpDir.ToCString(); -} -//================================================================================ -/*! - * \brief Return a unique file name - */ -//================================================================================ - -std::string MgAdapt::getFileName() const -{ - std::string aTmpDir = workingDir; - const char lastChar = *aTmpDir.rbegin(); -#ifdef WIN32 - if(lastChar != '\\') aTmpDir+='\\'; -#else - if(lastChar != '/') aTmpDir+='/'; -#endif - - TCollection_AsciiString aGenericName = (char*)aTmpDir.c_str(); - aGenericName += "MgAdapt_"; - aGenericName += getpid(); - aGenericName += "_"; - aGenericName += Abs((Standard_Integer)(long) aGenericName.ToCString()); - - return aGenericName.ToCString(); -} -//======================================================================= -//function : defaultLogFile -//======================================================================= - -std::string MgAdapt::defaultLogFile() -{ - std::string alogFile("MG_ADAPT.log"); - return alogFile; -} -//======================================================================= -//function : defaultUseConstantValue -//======================================================================= - -bool MgAdapt::defaultUseConstantValue() -{ - return false; -} -//======================================================================= -//function : defaultUseNoTimeStep -//======================================================================= - -bool MgAdapt::defaultUseNoTimeStep() -{ - return true; -} -//======================================================================= -//function : defaultRemoveLogOnSuccess -//======================================================================= - -bool MgAdapt::defaultRemoveLogOnSuccess() -{ - return true; -} -//======================================================================= -//function : defaultPrintLogInFile -//======================================================================= - -bool MgAdapt::defaultPrintLogInFile() -{ - return false; -} -//======================================================================= -//function : defaultUseChosenTimeStep -//======================================================================= - -bool MgAdapt::defaultUseChosenTimeStep() -{ - return false; -} -//======================================================================= -//function : UseLastTimeStep -//======================================================================= - -bool MgAdapt::defaultUseLastTimeStep() -{ - return false; -} -//======================================================================= -//function : defaultUseBackgroundMap -//======================================================================= - -bool MgAdapt::defaultUseBackgroundMap() -{ - return false; -} -//======================================================================= -//function : defaultKeepFiles -//======================================================================= - -bool MgAdapt::defaultKeepFiles() -{ - return false; -} -//======================================================================= -//function : defaultUseLocalMap -//======================================================================= - -bool MgAdapt::defaultUseLocalMap() -{ - return true; -} -//======================================================================= -//function : defaultPublish -//======================================================================= - -bool MgAdapt::defaultPublish() -{ - return false; -} -//======================================================================= -//function : defaultMeshOutMed -//======================================================================= - -bool MgAdapt::defaultMeshOutMed() -{ - return true; -} -//======================================================================= -//function : defaultFromMedFile -//======================================================================= - -bool MgAdapt::defaultFromMedFile() -{ - return true; -} -//======================================================================= -//function : defaultVerboseLevel -//======================================================================= - -int MgAdapt::defaultVerboseLevel() -{ - return 3; -} -std::string MgAdapt::getExeName() -{ - return "mg-adapt.exe"; -} -void MgAdapt::copyMgAdaptHypothesisData( MgAdaptHypothesisData* from) -{ - - data->myFileInDir = from->myFileInDir; - data->myMeshFileIn = from->myMeshFileIn; - data->myMeshFileBackground = from->myMeshFileBackground; - data->myOutMeshName = from->myOutMeshName; - data->myMeshFileOut = from->myMeshFileOut; - data->myFileOutDir = from->myFileOutDir; - data->myFileSizeMapDir = from->myFileSizeMapDir; - data->myFieldName = from->myFieldName; - data->fromMedFile = from->fromMedFile; - data->myPublish = from->myPublish; - data->myMeshOutMed = from->myMeshOutMed; - data->myUseLocalMap = from->myUseLocalMap; - data->myUseBackgroundMap = from->myUseBackgroundMap; - data->myUseConstantValue = from->myUseConstantValue; - data->myConstantValue = from->myConstantValue; - data->myTimeStep = from->myTimeStep; - data->myRank = from->myRank; - data->myUseNoTimeStep = from->myUseNoTimeStep; - data->myUseLastTimeStep = from->myUseLastTimeStep; - data->myUseChosenTimeStep = from->myUseChosenTimeStep; - data->myWorkingDir = from->myWorkingDir; - data->myLogFile = from->myLogFile; - data->myPrintLogInFile = from->myPrintLogInFile; - data->myKeepFiles = from->myKeepFiles; - data->myRemoveLogOnSuccess = from->myRemoveLogOnSuccess; - data->myVerboseLevel = from->myVerboseLevel; - -} - - -void MgAdapt::convertMedFile(std::string& meshFormatMeshFileName, std::string& solFormatFieldFileName, std::string& meshFormatsizeMapFile) -{ - - std::vector fieldFileNames; - MEDCoupling::MeshFormatWriter writer; - MEDCoupling::MCAuto mfd = MEDCoupling::MEDFileData::New(medFileIn); - MEDCoupling::MEDFileMeshes* meshes = mfd->getMeshes(); - MEDCoupling::MEDFileMesh* fileMesh = meshes->getMeshAtPos(0); // ok only one mesh in file! - storeGroupsAndFams(fileMesh); - - MEDCoupling::MCAuto fields = MEDCoupling::MEDFileFields::New(); - solFormatFieldFileName = getFileName(); - solFormatFieldFileName+=".sol"; - fieldFileNames.push_back(solFormatFieldFileName); - - if (useBackgroundMap) - { - - meshFormatsizeMapFile = getFileName(); - meshFormatsizeMapFile += ".mesh"; - buildBackGroundMeshAndSolFiles(fieldFileNames, meshFormatsizeMapFile); - - } - else if(useLocalMap) - { - - MEDCoupling::MCAuto fts = dynamic_cast( mfd->getFields()->getFieldWithName(fieldName) ); - MEDCoupling::MCAuto f = fts->getTimeStep(timeStep, rank); - MEDCoupling::MCAuto tmFts = MEDCoupling::MEDFileFieldMultiTS::New(); - tmFts->pushBackTimeStep(f); - - fields->pushField(tmFts); - - writer.setFieldFileNames( fieldFileNames); - } - - else - { - MEDCoupling::MCAuto mesh = fileMesh->getMeshAtLevel(1); // nodes mesh - MEDCoupling::MCAuto umesh = mesh->buildUnstructured(); // nodes mesh - int dim = umesh->getSpaceDimension(); - int version = sizeof(double) < 8 ? 1 : 2; - mcIdType nbNodes = umesh->getNumberOfNodes(); - buildConstantSizeMapSolFile(solFormatFieldFileName, dim, version, nbNodes); - - } - - mfd->setFields( fields ); - meshFormatMeshFileName = getFileName(); - meshFormatMeshFileName+=".mesh"; - writer.setMeshFileName(meshFormatMeshFileName); - writer.setMEDFileDS( mfd); - writer.write(); - -} - -void MgAdapt::convertMeshFile(std::string& meshFormatIn, std::vector< std::string>& solFieldFileNames) const -{ - MEDCoupling::MeshFormatReader reader(meshFormatIn, solFieldFileNames); - - MEDCoupling::MCAuto mfd = reader.loadInMedFileDS(); - // write MED - MEDCoupling::MEDFileMeshes* meshes = mfd->getMeshes(); - MEDCoupling::MEDFileMesh* fileMesh = meshes->getMeshAtPos(0); // ok only one mesh in file! - fileMesh->setName(meshNameOut); - restoreGroupsAndFams(fileMesh); - mfd->write(medFileOut, 2); -} - - -void MgAdapt::storeGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh) -{ - storefams(fileMesh); - storeGroups(fileMesh); -} - -void MgAdapt::restoreGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh) const -{ - restorefams(fileMesh); - restoreGroups(fileMesh); -} -void MgAdapt::storeGroups(MEDCoupling::MEDFileMesh* fileMesh) -{ - std::map > grpFams = fileMesh->getGroupInfo(); - std::map >::iterator g2ff = grpFams.begin(); - - for ( ; g2ff != grpFams.end(); ++g2ff ) - { - std::string groupName = g2ff->first; - std::vector famNames = g2ff->second; - - if ( famNames.empty() ) continue; - std::size_t k = 0; - std::vector< mcIdType> famListId; - for ( size_t i = 0; i < famNames.size(); ++i ) - { - famListId.push_back( fileMesh->getFamilyId( famNames[i].c_str() ) ); - } - group grp(groupName, famListId, famNames); - groupVec.push_back(grp); - } -} - -void MgAdapt::storefams(MEDCoupling::MEDFileMesh* fileMesh) -{ - std::map grpFams = fileMesh->getFamilyInfo(); - std::map::iterator f = grpFams.begin(); - - for ( ; f != grpFams.end(); ++f ) - { - if(!f->second) continue; // FAMILLE_ZERO - family fs(f->first, f->second); - famVec.push_back(fs); - } - -} - -void MgAdapt::restorefams(MEDCoupling::MEDFileMesh* fileMesh) const -{ - std::vector::const_iterator fIt = famVec.begin(); - - for (; fIt!=famVec.end(); ++fIt) - { - try // safety : FAMILY could be lost P2-->P1 - { - std::string givenFamNameFromMeshGemConverter = fileMesh->getFamilyNameGivenId( std::abs(fIt->_famId) ); - fileMesh->changeFamilyId(std::abs(fIt->_famId), fIt->_famId); - fileMesh->changeFamilyName(givenFamNameFromMeshGemConverter, fIt->_famName); - } - catch (const std::exception& e) - { - std::cerr< > info; - std::vector ::const_iterator grpFams = groupVec.begin(); - - for (; grpFams!=groupVec.end(); ++grpFams) - { - info.insert(std::pair > (grpFams->_name, grpFams->_famNames) ); - } - - fileMesh->setGroupInfo(info); -} - -void MgAdapt::buildConstantSizeMapSolFile(const std::string& solFormatFieldFileName, const int dim, const int version, const mcIdType nbNodes) const -{ - MeshFormat::Localizer loc; - MeshFormat::MeshFormatParser writer; - int fileId = writer.GmfOpenMesh( solFormatFieldFileName.c_str(), GmfWrite, version, dim); - int typTab[] = {GmfSca}; - writer.GmfSetKwd(fileId, MeshFormat::GmfSolAtVertices, (int)nbNodes, 1, typTab); - for (mcIdType i = 0; i& fieldFileNames, const std::string& meshFormatsizeMapFile) const -{ - MEDCoupling::MCAuto tmpMfd = MEDCoupling::MEDFileData::New(sizeMapFile); - MEDCoupling::MEDFileFields* tmpFields = tmpMfd->getFields(); - MEDCoupling::MEDFileAnyTypeFieldMultiTS* fts = tmpFields->getFieldWithName(fieldName); - MEDCoupling::MCAuto fts1 = dynamic_cast(fts); - MEDCoupling::MCAuto f = fts1->getTimeStep(timeStep, rank); - MEDCoupling::MCAuto tmFts = MEDCoupling::MEDFileFieldMultiTS::New(); - tmFts->pushBackTimeStep(f); - - MEDCoupling::MCAuto tmp_fields = MEDCoupling::MEDFileFields::New(); - tmp_fields->pushField(tmFts); - - - tmpMfd->setFields( tmp_fields ); - MEDCoupling::MeshFormatWriter tmpWriter; - tmpWriter.setMeshFileName(meshFormatsizeMapFile); - tmpWriter.setFieldFileNames( fieldFileNames); - tmpWriter.setMEDFileDS(tmpMfd); - tmpWriter.write(); -} -// ======================================================================= -med_idt MgAdapt::openMedFile(const std::string aFile) -// ======================================================================= -// renvoie le medId associe au fichier Med apres ouverture -{ - med_idt medIdt = MEDfileOpen(aFile.c_str(),MED_ACC_RDONLY); - if (medIdt <0) - { - //~addMessage( ToComment(" error: Can't open ") << aFile, /*fatal=*/true ); - ; - } - return medIdt; -} - -MgAdapt::Status MgAdapt::addMessage(const std::string& msg, - const bool isFatal/*=false*/) -{ - if ( isFatal ) - _myErrorMessages.clear(); // warnings are useless if a fatal error encounters - - _myErrorMessages.push_back( msg ); - - //~MESSAGE(msg); -#ifdef _DEBUG_ - std::cout << msg << std::endl; -#endif - return ( _myStatus = isFatal ? MgAdapt::DRS_FAIL : MgAdapt::DRS_WARN_SKIP_ELEM ); -} - - - - -// ======================================================================= -void MgAdapt::getTimeStepInfos(std::string aFile, med_int& numdt, med_int& numit) -// ======================================================================= -{ -// Il faut voir si plusieurs maillages - - - herr_t erreur = 0 ; - med_idt medIdt ; - - - // Ouverture du fichier - //~SCRUTE(aFile.toStdString()); - medIdt = openMedFile(aFile); - if ( medIdt < 0 ) return ; - // Lecture du nombre de champs - med_int ncha = MEDnField(medIdt) ; - if (ncha < 1 ) - { - //~addMessage( ToComment(" error: there is no field in ") << aFile, /*fatal=*/true ); - return; - } - // Lecture des caracteristiques du champs - - // Lecture du type du champ, des noms des composantes et du nom de l'unite - char nomcha [MED_NAME_SIZE+1]; - strcpy(nomcha, fieldName.c_str()); -// Lecture du nombre de composantes - med_int ncomp = MEDfieldnComponentByName(medIdt, nomcha); - char meshname[MED_NAME_SIZE+1]; - char * comp = (char*) malloc(ncomp*MED_SNAME_SIZE+1); - char * unit = (char*) malloc(ncomp*MED_SNAME_SIZE+1); - char dtunit[MED_SNAME_SIZE+1]; - med_bool local; - med_field_type typcha; - med_int nbofcstp; - erreur = MEDfieldInfoByName (medIdt, nomcha, meshname,&local,&typcha,comp,unit,dtunit, &nbofcstp); - free(comp); - free(unit); - if ( erreur < 0 ) - { - //~addMessage( ToComment(" error: error while reading field ") << nomcha << " in file " << aFile , /*fatal=*/true ); - return; - } - - med_float dt; - med_int tmp_numdt, tmp_numit; - - //~med_int step = data->myUseLastTimeStep ? nbofcstp : data->myTimeStep+1; - //~myPrint("step ", step); - erreur = MEDfieldComputingStepInfo ( medIdt, nomcha, 1, &numdt, &numit, &dt ); - for(med_int step = 1; step <= nbofcstp; step++ ) - { - erreur = MEDfieldComputingStepInfo ( medIdt, nomcha, step, &tmp_numdt, &tmp_numit, &dt ); - if(tmp_numdt > numdt) - { - numdt = tmp_numdt; - numit = tmp_numit; - } - } - if ( erreur < 0 ) - { - - //~addMessage( ToComment(" error: error while reading field ") << nomcha << "step (numdt, numit) = " <<"("<< numdt<< ", " \ - numit<< ")" <<" in file " << aFile , /*fatal=*/true ); - return; - } - - - - // Fermeture du fichier - if ( medIdt > 0 ) MEDfileClose(medIdt); - - -} - - - diff --git a/src/SMESHGUI/MG_ADAPT.hxx b/src/SMESHGUI/MG_ADAPT.hxx deleted file mode 100644 index e25101dfb..000000000 --- a/src/SMESHGUI/MG_ADAPT.hxx +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright (C) 2011-2020 CEA/DEN, EDF R&D -// -// 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/ -// -// File : MG_ADAPT.hxx -// -#ifndef MG_ADAPT_HXX -#define MG_ADAPT_HXX -#include -# include -#include -#include -#include -#include - -#include "MCAuto.hxx" -#include "MCType.hxx" -#include "MEDFileMesh.hxx" - -#include -// SMESH includes - -//~#include - - -class MgAdapt; - -typedef std::map< std::string, std::string > TOptionValues; -typedef std::set< std::string > TOptionNames; - -struct MgAdaptHypothesisData -{ - std::string myFileInDir, myMeshFileIn, myInMeshName, myMeshFileBackground, myOutMeshName, - myMeshFileOut, myFileOutDir, myFileSizeMapDir, myFieldName; - bool fromMedFile; - bool myPublish, myMeshOutMed; - bool myUseLocalMap, myUseBackgroundMap, myUseConstantValue; - double myConstantValue; - int myRank, myTimeStep; - bool myUseNoTimeStep, myUseLastTimeStep, myUseChosenTimeStep; - std::string myWorkingDir, myLogFile; - bool myPrintLogInFile, myKeepFiles, myRemoveLogOnSuccess; - int myVerboseLevel; - -}; - -class outFileStream : public std::ofstream{ -public: - ~outFileStream(){close();} //to close file at dtor -}; - -/*! - * \brief Class to generate string from any type - */ -class ToComment : public std::string -{ - std::ostringstream _s ; - -public : - - ToComment():std::string("") {} - - ToComment(const ToComment& c):std::string() { - _s << c.c_str() ; - this->std::string::operator=( _s.str() ); - } - - ToComment & operator=(const ToComment& c) { - _s << c.c_str() ; - this->std::string::operator=( _s.str() ); - return *this; - } - - template - ToComment( const T &anything ) { - _s << anything ; - this->std::string::operator=( _s.str() ); - } - - template - ToComment & operator<<( const T &anything ) { - _s << anything ; - this->std::string::operator=( _s.str() ); - return *this ; - } - - operator char*() const { - return (char*)c_str(); - } - - std::ostream& Stream() { - return _s; - } -}; - - -class MgAdapt -{ - -public: - - MgAdapt(); - MgAdapt(MgAdaptHypothesisData*); - MgAdapt(const MgAdapt&); - ~MgAdapt(); - void buildModel(); - void setData( MgAdaptHypothesisData*); - - void setMedFileIn(std::string fileName); - std::string getMedFileIn(); - - void setMedFileOut(std::string fileOut); - std::string getMedFileOut(); - - void setMeshName(std::string name); - std::string getMeshName(); - - void setMeshNameOut(std::string name); - std::string getMeshNameOut(); - - void setMeshOutMed(bool mybool); - bool getMeshOutMed(); - - void setPublish(bool mybool); - bool getPublish(); - - void setFieldName(std::string myFieldName); - std::string getFieldName(); - - void setTimeStep(int time); - int getTimeStep() const; - - void setRankTimeStep(int time, int myRank); - int getRank(); - - void setLogFile(std::string); - std::string getLogFile(); - - void setVerbosityLevel(int verbosity); - int getVerbosityLevel(); - - void setRemoveOnSuccess(bool mybool); - bool getRemoveOnSuccess(); - - MgAdaptHypothesisData* getData() const; - - void setUseLocalMap(bool mybool); - bool getUseLocalMap(); - - void setUseBackgroundMap(bool); - bool getUseBackgroundMap(); - - void setUseConstantValue(bool); - bool getUseConstantValue(); - - void setConstantValue(double); - double getConstantValue() const; - - void setSizeMapFile(std::string); - std::string getSizeMapFile(); - - void setFromMedFile(bool); - bool isFromMedFile(); - - void setKeepWorkingFiles(bool); - bool getKeepWorkingFiles(); - - void setPrintLogInFile(bool); - bool getPrintLogInFile(); - - void setWorkingDir(std::string); - std::string getWorkingDir() const; - - - bool setAll(); - static std::string getCommandToRun(MgAdapt* ); - std::string getCommandToRun() ; - int compute(std::string& errStr); - std::string getFileName() const; - static std::string getExeName(); - void copyMgAdaptHypothesisData( MgAdaptHypothesisData* ) ; - - void checkDirPath(std::string& ); - - - - bool hasOptionDefined( const std::string& optionName ) const; - void setOptionValue(const std::string& optionName, - const std::string& optionValue) throw (std::invalid_argument); - std::string getOptionValue(const std::string& optionName, - bool* isDefault=0) const throw (std::invalid_argument); - std::vector getCustomOptionValuesStrVec() const; - std::vector getOptionValuesStrVec() const; - - - TOptionValues getOptionValues() const; - const TOptionValues& getCustomOptionValues() const ; - static double toDbl(const std::string&, bool* isOk = 0) throw (std::invalid_argument); - static bool toBool(const std::string&, bool* isOk = 0) throw (std::invalid_argument); - static int toInt(const std::string&, bool* isOk = 0 ) throw (std::invalid_argument); - static std::string toLowerStr(const std::string& str); - - - /* default values */ - static std::string defaultWorkingDirectory(); - static std::string defaultLogFile(); - static bool defaultKeepFiles(); - static bool defaultRemoveLogOnSuccess(); - static int defaultVerboseLevel(); - static bool defaultPrintLogInFile(); - static bool defaultFromMedFile(); - static bool defaultMeshOutMed(); - static bool defaultPublish(); - static bool defaultUseLocalMap(); - static bool defaultUseBackgroundMap(); - static bool defaultUseConstantValue(); - static bool defaultUseNoTimeStep(); - static bool defaultUseLastTimeStep(); - static bool defaultUseChosenTimeStep(); - static double defaultMaximumMemory(); - - - - - enum Status { - DRS_OK, - DRS_EMPTY, // a file contains no mesh with the given name - DRS_WARN_RENUMBER, // a file has overlapped ranges of element numbers, - // so the numbers from the file are ignored - DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data - DRS_WARN_DESCENDING, // some elements were skipped due to descending connectivity - DRS_FAIL, // general failure (exception etc.) - DRS_NO_TIME_STEP // general failure (exception etc.) - }; - - struct group { - - std::string _name; - std::vector _famListId; - std::vector _famNames; - group(std::string name, std::vector famListId, std::vector famNames):_name(name) - { - std::vector::iterator it = famListId.begin(); - for (; it!=famListId.end(); ++it) - _famListId.push_back(*it); - - std::vector::iterator itt = famNames.begin(); - for (; itt!=famNames.end(); ++itt) - _famNames.push_back(*itt); - } - }; - - struct family { - std::string _famName; - mcIdType _famId; - family(std::string famName, MEDCoupling::mcIdType famId):_famName(famName), _famId(famId) {} - }; - - -private : - bool fromMedFile; - - std::string medFileIn; - std::string medFileOut; - std::string meshName; - std::string meshNameOut; - bool publish, meshOutMed; - bool useLocalMap, useBackgroundMap, useConstantValue; - std::string sizeMapFile; - std::string fieldName; - double constantValue; - int rank, timeStep; - - /* advanced options */ - - - std::string logFile; - std::string workingDir; - int verbosityLevel; - bool removeOnSuccess; - bool toKeepWorkingFiles; - bool printLogInFile; - - /* Model DATA */ - MgAdaptHypothesisData* data; - - /* */ - - TOptionValues _option2value, _customOption2value; // user defined values - TOptionValues _defaultOptionValues; // default values - TOptionNames _doubleOptions, _charOptions, _boolOptions; // to find a type of option - - std::vector _myErrorMessages; - Status _myStatus; - std::string meshFormatOutputMesh; - std::vector< std::string> solFormatOutput; - std::vector groupVec; - std::vector famVec; - std::vector< std::string> tmpFilesToBeDeleted; - - /* convert MED-->.mesh format */ - void convertMedFile(std::string& meshIn,std::string& solFileIn, std::string& sizeMapIn) ; - void storeGroups(MEDCoupling::MEDFileMesh* fileMesh); - void restoreGroups(MEDCoupling::MEDFileMesh* fileMesh) const; - void storefams(MEDCoupling::MEDFileMesh* fileMesh); - void restorefams(MEDCoupling::MEDFileMesh* fileMesh) const; - void storeGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh); - void restoreGroupsAndFams(MEDCoupling::MEDFileMesh* fileMesh) const; - void convertMeshFile(std::string& meshFormatIn, std::vector< std::string>& solFieldFileNames) const ; - void buildConstantSizeMapSolFile(const std::string& solFormatFieldFileName, const int dim, const int version, const mcIdType nbNodes) const; - void buildBackGroundMeshAndSolFiles(const std::vector& fieldFileNames, const std::string& meshFormatsizeMapFile) const; - void getTimeStepInfos(std::string aFile, med_int& numdt, med_int& numit); - Status addMessage(const std::string& msg, const bool isFatal = false); - med_idt openMedFile(const std::string aFile) ; - bool isFileExist(std::string& fName) const; - void execCmd( const char* cmd, int& err); - void cleanUp(); - void appendMsgToLogFile(std::string& msg); -}; - - - -#endif // MG_ADAPT_HXX diff --git a/src/SMESHGUI/MG_ADAPTGUI.cxx b/src/SMESHGUI/MG_ADAPTGUI.cxx deleted file mode 100644 index 598e0cf3f..000000000 --- a/src/SMESHGUI/MG_ADAPTGUI.cxx +++ /dev/null @@ -1,1451 +0,0 @@ -// Copyright (C) 2007-2020 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 : MG_ADAPTGUI.cxx - -#include "MG_ADAPTGUI.hxx" - -#include "SUIT_Desktop.h" -#include "SUIT_Application.h" -#include "SUIT_Session.h" - -#include "SalomeApp_Application.h" -#include "SalomeApp_Module.h" -#include "SalomeApp_Study.h" -#include "SMESH_Actor.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -// SALOME KERNEL includes -#include -#include -#include -#include -#include "SalomeApp_Tools.h" -#include -#include -#include - -#include - - -const int SPACING = 6; // layout spacing -const int MARGIN = 9; // layout margin - -//================================================================================= -// function : SMESHGUI_MgAdaptDlg() -// purpose : -//================================================================================= -SMESHGUI_MgAdaptDlg::SMESHGUI_MgAdaptDlg( SalomeApp_Module* theModule, MgAdapt* myModel, QWidget* parent, bool isCreation ) - : mySMESHGUI( theModule ), QDialog(parent) -{ - model = new MgAdapt(*myModel); - myData = model->getData(); - buildDlg(); - if (!isCreation) readParamsFromHypo(); -} - -void SMESHGUI_MgAdaptDlg::buildDlg() -{ - setModal( false ); - setAttribute( Qt::WA_DeleteOnClose, true ); - setWindowTitle( tr( "ADAPT_PREF_MG_ADAPT" ) ); - setSizeGripEnabled( true ); - - - myTabWidget = new QTabWidget( this ); - - // Arguments - - myArgs = new SMESHGUI_MgAdaptArguments( myTabWidget ); - std::vector str = model->getOptionValuesStrVec(); - std::vector str2 = model->getCustomOptionValuesStrVec(); - str.insert( str.end(), str2.begin(), str2.end() ); - - myAdvOpt = new MgAdaptAdvWidget(myTabWidget, &str); - int argsTab = myTabWidget->addTab( myArgs, tr( "Args" ) ); - int advTab = myTabWidget->addTab( myAdvOpt, tr( "ADVOP" ) ); - - myAdvOpt->workingDirectoryLabel ->setText (tr( "WORKING_DIR" )); - myAdvOpt->workingDirectoryPushButton ->setText (tr( "SELECT_DIR" )); - myAdvOpt->keepWorkingFilesCheck ->setText (tr( "KEEP_WORKING_FILES" )); - myAdvOpt->verboseLevelLabel ->setText (tr( "VERBOSE_LEVEL" )); - myAdvOpt->removeLogOnSuccessCheck ->setText (tr( "REMOVE_LOG_ON_SUCCESS" )); - myAdvOpt->logInFileCheck ->setText (tr( "LOG_IN_FILE" )); - myAdvOpt->logGroupBox ->setTitle(tr( "LOG_GROUP_TITLE" )); - - // buttons - QPushButton* okBtn = new QPushButton( tr( "SMESH_BUT_OK" ), this ); - okBtn->setAutoDefault( true ); - okBtn->setDefault( true ); - okBtn->setFocus(); - QPushButton* buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), this); - buttonApply->setAutoDefault(true); - QPushButton* buttonApplyAndClose = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), this); - buttonApplyAndClose->setAutoDefault(true); - QPushButton* cancelBtn = new QPushButton( tr( "SMESH_BUT_CANCEL" ), this ); - cancelBtn->setAutoDefault( true ); - QPushButton* helpBtn = new QPushButton( tr( "SMESH_BUT_HELP" ), this ); - helpBtn->setAutoDefault( true ); - - QHBoxLayout* btnLayout = new QHBoxLayout; - btnLayout->setSpacing( SPACING ); - btnLayout->setMargin( 0 ); - btnLayout->addWidget( buttonApplyAndClose ); - btnLayout->addStretch( 10 ); - btnLayout->addWidget( buttonApply ); - btnLayout->addStretch( 10 ); - btnLayout->addWidget( okBtn ); - btnLayout->addStretch( 10 ); - btnLayout->addWidget( cancelBtn ); - btnLayout->addStretch( 10 ); - btnLayout->addWidget( helpBtn ); - okBtn->hide(); // tab 1 - - QVBoxLayout* l = new QVBoxLayout ( this ); - l->setMargin( MARGIN ); - l->setSpacing( SPACING ); - l->addWidget( myTabWidget ); - l->addStretch(); - l->addLayout( btnLayout ); - - - connect( okBtn, SIGNAL( clicked() ), this, SLOT( clickOnOk() ) ); - connect( helpBtn, SIGNAL( clicked() ), this, SLOT( clickOnHelp() ) ); - connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); - connect(buttonApply, SIGNAL(clicked()), this,SLOT(clickOnApply())); - connect(buttonApplyAndClose, SIGNAL(clicked()), this,SLOT(clickOnOk())); - connect(myArgs, SIGNAL(meshDimSignal(ADAPTATION_MODE)), myAdvOpt, SLOT( onMeshDimChanged(ADAPTATION_MODE)) ); -} - - -//================================================================================= -// function : ~SMESHGUI_MgAdaptDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_MgAdaptDlg::~SMESHGUI_MgAdaptDlg() -{ - delete model; -} - -void SMESHGUI_MgAdaptDlg::setModel(MgAdapt* mg) -{ - model = mg; -} -MgAdapt* SMESHGUI_MgAdaptDlg::getModel() const -{ - return model; -} -/*! - \brief Perform clean-up actions on the dialog box closing. -*/ -bool SMESHGUI_MgAdaptDlg::clickOnApply() -{ - readParamsFromWidgets(); - return true; -} -void SMESHGUI_MgAdaptDlg::clickOnOk() -{ - clickOnApply(); - reject(); -} -void SMESHGUI_MgAdaptDlg::reject() -{ - QDialog::reject(); -} -bool SMESHGUI_MgAdaptDlg::readParamsFromHypo( ) const -{ - bool ret = true; - myArgs->aMedfile->setChecked(myData->fromMedFile) ; - if (myData->fromMedFile) - { - - *(myArgs->myFileInDir) = QString(myData->myFileInDir.c_str()) ; - myArgs->selectMedFileLineEdit->setText(myData->myMeshFileIn.c_str()) ; - // myData->myInMeshName = // TODO - - } - else - { - myArgs->aBrowserObject->setText(myData->myInMeshName.c_str()); - //~ myArgs->myFileInDir =""; // TODO - //~ myArgs->selectMedFileLineEdit->setText(); // TODO - } - myArgs->meshNameLineEdit->setText(myData->myOutMeshName.c_str()); - myArgs->medFileCheckBox->setChecked(myData->myMeshOutMed); - - if(myData->myMeshOutMed) - { - *(myArgs->myFileOutDir) = QString(myData->myFileOutDir.c_str()); - myArgs->selectOutMedFileLineEdit->setText(myData->myMeshFileOut.c_str()); - - } - else - { - *(myArgs->myFileOutDir) = QString(""); //TODO - } - - myArgs->publishOut->setChecked(myData->myPublish); - - myArgs->localButton->setChecked(myData->myUseLocalMap); - myArgs->backgroundButton->setChecked(myData->myUseBackgroundMap); - myArgs->constantButton->setChecked(myData->myUseConstantValue); - - if (myData->myUseConstantValue) - { - myArgs->dvalue->setValue(myData->myConstantValue); - } - else - { - myArgs->dvalue->setValue(0.0); - } - - if (myData->myUseBackgroundMap) - { - - *(myArgs->myFileSizeMapDir) = QString(myData->myFileSizeMapDir.c_str()) ; - myArgs->selectMedFileBackgroundLineEdit->setText(myData->myMeshFileBackground.c_str()); - } - else - { - *(myArgs->myFileSizeMapDir) = QString("") ; //TODO - myArgs->selectMedFileBackgroundLineEdit->setText(""); //TODO - } - - myArgs->fieldNameCmb->setCurrentText(myData->myFieldName.c_str()); - myArgs->noTimeStep->setChecked(myData->myUseNoTimeStep); - myArgs->lastTimeStep->setChecked( myData->myUseLastTimeStep); - myArgs->chosenTimeStep->setChecked(myData->myUseChosenTimeStep); - if (myData->myUseChosenTimeStep) - { - myArgs->rankSpinBox->setValue(myData->myRank); - myArgs->timeStep->setValue(myData->myTimeStep); - } - - myAdvOpt->workingDirectoryLineEdit->setText(myData->myWorkingDir.c_str()); - myAdvOpt->logInFileCheck->setChecked(myData->myPrintLogInFile); - - myAdvOpt->verboseLevelSpin->setValue(myData->myVerboseLevel); - myAdvOpt->removeLogOnSuccessCheck->setChecked(myData->myRemoveLogOnSuccess); - myAdvOpt->keepWorkingFilesCheck->setChecked(myData->myKeepFiles); - - return ret; - -} - - -bool SMESHGUI_MgAdaptDlg::readParamsFromWidgets() -{ - bool ret = true; - MgAdaptHypothesisData* aData = new MgAdaptHypothesisData(); - aData->fromMedFile = myArgs->aMedfile->isChecked(); - if (aData->fromMedFile) - { - - aData->myFileInDir = myArgs->myFileInDir->toStdString(); - aData->myMeshFileIn = myArgs->selectMedFileLineEdit->text().toStdString(); - // aData->myInMeshName = // TODO - } - else // TODO browser - { - aData->myInMeshName = myArgs->aBrowserObject->text().toStdString(); - aData->myFileInDir = myAdvOpt->workingDirectoryLineEdit->text().toStdString(); - - TCollection_AsciiString aGenericName = (char*)aData->myFileInDir.c_str(); - TCollection_AsciiString aGenericName2 = "MgAdapt_"; - aGenericName2 += getpid(); - aGenericName2 += "_"; - aGenericName2 += Abs((Standard_Integer)(long) aGenericName.ToCString()); - aGenericName2 += ".med"; - aGenericName+=aGenericName2; - emit myArgs->toExportMED(aGenericName.ToCString()); - aData->myMeshFileIn = aGenericName2.ToCString(); - } - aData->myOutMeshName = myArgs->meshNameLineEdit->text().toStdString(); - aData->myMeshOutMed = myArgs->medFileCheckBox->isChecked(); - if(aData->myMeshOutMed) - { - aData->myFileOutDir = myArgs->myFileOutDir->toStdString(); - aData->myMeshFileOut = myArgs->selectOutMedFileLineEdit->text().toStdString(); - - } - else - { - aData->myMeshFileOut = ""; - } - - aData->myPublish = myArgs->publishOut->isChecked(); - - - aData->myUseLocalMap = myArgs->localButton->isChecked(); - aData->myUseBackgroundMap = myArgs->backgroundButton->isChecked(); - aData->myUseConstantValue = myArgs->constantButton->isChecked(); - if (aData->myUseConstantValue) - { - aData->myConstantValue = myArgs->dvalue->value(); - } - else - { - aData->myConstantValue = 0.0; - } - if (aData->myUseBackgroundMap) - { - aData->myFileSizeMapDir = myArgs->myFileSizeMapDir->toStdString(); - aData->myMeshFileBackground = myArgs->selectMedFileBackgroundLineEdit->text().toStdString(); - } - else - { - aData->myMeshFileBackground = ""; - } - - aData->myFieldName = myArgs->fieldNameCmb->currentText().toStdString(); - aData->myUseNoTimeStep = myArgs->noTimeStep->isChecked(); - aData->myUseLastTimeStep = myArgs->lastTimeStep->isChecked(); - aData->myUseChosenTimeStep = myArgs->chosenTimeStep->isChecked(); - if (aData->myUseChosenTimeStep) - { - aData->myRank = myArgs->rankSpinBox->value(); - aData->myTimeStep = myArgs->timeStep->value(); - - } - - - aData->myWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().toStdString(); - aData->myPrintLogInFile = myAdvOpt->logInFileCheck->isChecked(); - aData->myVerboseLevel = myAdvOpt->verboseLevelSpin->value(); - aData->myRemoveLogOnSuccess = myAdvOpt->removeLogOnSuccessCheck->isChecked(); - aData->myKeepFiles = myAdvOpt->keepWorkingFilesCheck->isChecked(); - model->setData(aData); - QString msg; - checkParams(msg); - delete aData; - return ret; -} -bool SMESHGUI_MgAdaptDlg::storeParamsToHypo( const MgAdaptHypothesisData& ) const -{ - -} -/*! - \brief Show help page -*/ -void SMESHGUI_MgAdaptDlg::clickOnHelp() -{ - // QString aHelpFile; - // if ( myTabWidget->currentIndex() == MinDistance ) { - // aHelpFile = "measurements.html#min-distance-anchor"; - // } else if ( myTabWidget->currentIndex() == BoundingBox ) { - // aHelpFile = "measurements.html#bounding-box-anchor"; - // } else if ( myTabWidget->currentWidget() == myAngle ) { - // aHelpFile = "measurements.html#angle-anchor"; - // } else { - // aHelpFile = "measurements.html#basic-properties-anchor"; - // } - - // SMESH::ShowHelpFile( aHelpFile ); -} -bool SMESHGUI_MgAdaptDlg::checkParams(QString& msg) -{ - if ( !QFileInfo( myAdvOpt->workingDirectoryLineEdit->text().trimmed() ).isWritable() ) { - SUIT_MessageBox::warning( this, - tr( "SMESH_WRN_WARNING" ), - tr( "GHS3D_PERMISSION_DENIED" ) ); - return false; - } - - - myAdvOpt->myOptionTable->setFocus(); - QApplication::instance()->processEvents(); - - QString name, value; - bool isDefault, ok = true; - int iRow = 0, nbRows = myAdvOpt->myOptionTable->topLevelItemCount(); - for ( ; iRow < nbRows; ++iRow ) - { - QTreeWidgetItem* row = myAdvOpt->myOptionTable->topLevelItem( iRow ); - myAdvOpt->GetOptionAndValue( row, name, value, isDefault ); - - if ( name.simplified().isEmpty() ) - continue; // invalid custom option - - if ( isDefault ) // not selected option - value.clear(); - - try { - model->setOptionValue( name.toLatin1().constData(), value.toLatin1().constData() ); - } - catch ( const SALOME::SALOME_Exception& ex ) - { - msg = ex.details.text.in(); - ok = false; - break; - } - } - - - return ok; -} - -//================================================================================= -// function : SMESHGUI_MgAdaptArguments() -// purpose : -//================================================================================= -SMESHGUI_MgAdaptArguments::SMESHGUI_MgAdaptArguments( QWidget* parent ) - :QWidget(parent) -{ - - - myFileInDir = new QString(""); - myFileOutDir = new QString(""); - myFileSizeMapDir = new QString(""); - if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) - { - *myFileInDir = QDir::currentPath(); - *myFileOutDir = QDir::currentPath(); - *myFileSizeMapDir = QDir::currentPath(); - } - else - { - *myFileInDir = SUIT_FileDlg::getLastVisitedPath(); - *myFileOutDir = SUIT_FileDlg::getLastVisitedPath(); - *myFileSizeMapDir = SUIT_FileDlg::getLastVisitedPath(); - } - - meshDim = 0; - // Mesh in - aMeshIn = new QGroupBox( tr( "MeshIn" ), this ); - aMedfile = new QRadioButton( tr( "MEDFile" ), aMeshIn ); - aBrowser = new QRadioButton( tr( "Browser" ), aMeshIn ); - aBrowserObject = new QLineEdit( aMeshIn ); - selectMedFilebutton = new QPushButton("", aMeshIn); - selectMedFileLineEdit = new QLineEdit( aMeshIn ); - - meshIn = new QGridLayout( aMeshIn ); - - meshIn->setMargin( MARGIN ); - meshIn->setSpacing( SPACING ); - meshIn->addWidget( aMedfile, 0, 0, 1,1 ); - meshIn->addWidget( aBrowser, 0, 1,1,1); - meshIn->addWidget( aBrowserObject, 0, 2, 1, 1 ); - meshIn->addWidget( selectMedFilebutton, 1, 0,1, 1); - meshIn->addWidget( selectMedFileLineEdit, 1, 1, 1, 1 ); - hspacer = new QSpacerItem(188, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - - meshInGroup = new QButtonGroup( this ); - meshInGroup->addButton( aMedfile, 0 ); - meshInGroup->addButton( aBrowser, 1 ); - - //Mesh out - - aMeshOut = new QGroupBox( tr( "MeshOut" ), this ); - meshName = new QLabel(tr("MeshName"), aMeshOut); - secondHspacer = new QSpacerItem(100, 30); - meshNameLineEdit = new QLineEdit(aMeshOut) ; - medFileCheckBox = new QCheckBox(tr("MEDFile"), aMeshOut); - selectOutMedFilebutton = new QPushButton("", aMeshOut); - thirdHspacer = new QSpacerItem(188, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - selectOutMedFileLineEdit = new QLineEdit(aMeshOut) ; - publishOut = new QCheckBox(tr("Publish_MG_ADAPT"), aMeshOut); - - meshOut = new QGridLayout( aMeshOut ); - - meshOut->setMargin( MARGIN ); - meshOut->setSpacing( SPACING ); - meshOut->addWidget( meshName, 0, 0, 1,1 ); - meshOut->addItem( secondHspacer, 0, 1, 1, 1 ); - meshOut->addWidget( meshNameLineEdit, 0, 2,1,1); - meshOut->addWidget( medFileCheckBox, 1, 0,1,1 ); - meshOut->addWidget( selectOutMedFilebutton, 1, 1,1,1 ); - meshOut->addWidget( selectOutMedFileLineEdit, 1, 2,1,1); - meshOut->addWidget( publishOut, 2, 0,1,1 ); - - //size map definition - - sizeMapDefinition = new QGroupBox(tr("SIZE_MAP_DEF"), this); - localButton = new QRadioButton(tr("LOCAL_MG_ADAPT"), sizeMapDefinition); - backgroundButton = new QRadioButton(tr("BACKGRND_MG_ADAPT"), sizeMapDefinition); - constantButton = new QRadioButton(tr("CNST_MG_ADAPT"), sizeMapDefinition); - medFileBackground = new QLabel(tr("MED_FILE_BCKG"), sizeMapDefinition); - selectMedFileBackgroundbutton = new QPushButton(tr(""), sizeMapDefinition); - selectMedFileBackgroundLineEdit = new QLineEdit(sizeMapDefinition); - valueLabel = new QLabel(tr("VALUE_MG_ADAPT"), sizeMapDefinition); - dvalue = new QDoubleSpinBox(sizeMapDefinition); - sizeMapDefGroup = new QButtonGroup( this ); - sizeMapDefGroup->addButton( localButton, 0 ); - sizeMapDefGroup->addButton( backgroundButton, 1 ); - sizeMapDefGroup->addButton( constantButton, 2 ); - - sizeMapDefGroupLayout = new QGridLayout(sizeMapDefinition); - sizeMapDefGroupLayout->addWidget(localButton, 0,0); - sizeMapDefGroupLayout->addWidget(backgroundButton, 0,1); - sizeMapDefGroupLayout->addWidget(constantButton, 0,2); - sizeMapDefGroupLayout->addWidget(medFileBackground, 1,0); - sizeMapDefGroupLayout->addWidget(selectMedFileBackgroundbutton, 1,1); - sizeMapDefGroupLayout->addWidget(selectMedFileBackgroundLineEdit, 1,2); - sizeMapDefGroupLayout->addWidget(valueLabel, 2,0); - sizeMapDefGroupLayout->addWidget(dvalue, 2,1); - - // size Map field - sizeMapField = new QGroupBox(tr("SIZE_MAP_FIELD"), this); - fieldName = new QLabel(tr("MG_ADAPT_FIELD_NAME"), sizeMapField); - fieldNameCmb = new QComboBox(sizeMapField); - noTimeStep = new QRadioButton(tr("MG_ADAPT_NO_T_ST"), sizeMapField); - lastTimeStep = new QRadioButton(tr("MG_ADAPT_L_ST"), sizeMapField); - chosenTimeStep = new QRadioButton(tr("MG_ADAPT_CH_ST"), sizeMapField); - timeStepLabel = new QLabel(tr("MG_ADAPT_TSTP"), sizeMapField); - timeStep = new QSpinBox(sizeMapField); - //~timeStep->setMinimum(-1); - rankLabel = new QLabel(tr("MG_ADAPT_RANK"), sizeMapField); - rankSpinBox = new QSpinBox(sizeMapField); - rankSpinBox->setMinimum(-1); - - timeStepGroup = new QButtonGroup(this); - timeStepGroup->addButton(noTimeStep, 0); - timeStepGroup->addButton(lastTimeStep, 1); - timeStepGroup->addButton(chosenTimeStep, 2); - - sizeMapFieldGroupLayout = new QGridLayout(sizeMapField); - - sizeMapFieldGroupLayout->addWidget(fieldName, 0,0); - sizeMapFieldGroupLayout->addWidget(fieldNameCmb, 0,1); - sizeMapFieldGroupLayout->addWidget(noTimeStep, 1,0); - sizeMapFieldGroupLayout->addWidget(lastTimeStep, 1,1); - sizeMapFieldGroupLayout->addWidget(chosenTimeStep, 1,2); - sizeMapFieldGroupLayout->addWidget(timeStepLabel, 2,0); - sizeMapFieldGroupLayout->addWidget(timeStep, 2,1); - sizeMapFieldGroupLayout->addWidget(rankLabel, 2,2); - sizeMapFieldGroupLayout->addWidget(rankSpinBox, 2,3); - - - QGridLayout* argumentsLayout = new QGridLayout( this ); - argumentsLayout->setMargin( MARGIN ); - argumentsLayout->setSpacing( SPACING ); - - argumentsLayout->addWidget( aMeshIn, 0, 0, 1, 3 ); - argumentsLayout->addWidget( aMeshOut, 1, 0, 1, 3 ); - argumentsLayout->addWidget( sizeMapDefinition, 2, 0, 1, 3 ); - argumentsLayout->addWidget( sizeMapField, 3, 0, 1, 3 ); - argumentsLayout->setColumnStretch( 1, 5 ); - argumentsLayout->setRowStretch( 4, 5 ); - - // Initial state - setMode( Mesh, Local); - medFileCheckBox->setChecked(true); - - // Connections - connect( meshInGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( modeChanged( int ) ) ); - connect( sizeMapDefGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( sizeMapDefChanged( int ) ) ); - connect( selectMedFilebutton, SIGNAL( pressed( ) ), this, SLOT( onSelectMedFilebuttonClicked( ) ) ); - connect(medFileCheckBox, SIGNAL (stateChanged(int)), this, SLOT(onMedFileCheckBox(int) ) ); - connect(publishOut, SIGNAL (stateChanged(int)), this, SLOT(onPublishOut(int) ) ); - connect(selectOutMedFilebutton, SIGNAL( pressed()), this, SLOT(onSelectOutMedFilebutton())); - connect(selectMedFileBackgroundbutton, SIGNAL(pressed()), this, SLOT(onSelectMedFileBackgroundbutton()) ); - connect( timeStepGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( timeStepGroupChanged( int ) ) ); - emit updateSelection(); -} - -//================================================================================= -// function : ~SMESHGUI_MgAdaptArguments() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_MgAdaptArguments::~SMESHGUI_MgAdaptArguments() -{ -} - -void SMESHGUI_MgAdaptArguments::onNoTimeStep(bool disableOther) -{ - noTimeStep->setChecked(true); - - rankLabel->setVisible(0); - rankSpinBox->setVisible(0); - rankSpinBox->setValue(-2); - - timeStepLabel->setVisible(0); - timeStep->setVisible(0); - timeStep->setValue(-2); - - lastTimeStep->setDisabled(disableOther); - chosenTimeStep->setDisabled(disableOther); - - -} -void SMESHGUI_MgAdaptArguments::onLastTimeStep(bool disableOther) -{ - lastTimeStep->setChecked(true); - - rankLabel->setVisible(0); - rankSpinBox->setVisible(0); - rankSpinBox->setValue(-1); - - timeStepLabel->setVisible(0); - timeStep->setVisible(0); - timeStep->setValue(-1); - noTimeStep->setDisabled(disableOther); -} - -void SMESHGUI_MgAdaptArguments::onChosenTimeStep(bool disableOther, int max) -{ - chosenTimeStep->setChecked(true); - - rankLabel->setVisible(1); - rankSpinBox->setVisible(1); - rankSpinBox->setValue(0); - - timeStepLabel->setVisible(1); - timeStep->setVisible(1); - timeStep->setValue(0); - if (max) timeStep->setMaximum(max); - -} - -void SMESHGUI_MgAdaptArguments::onSelectOutMedFilebutton() -{ - - QString filtre = QString("Med") ; - filtre += QString(" files (*.") + QString("med") + QString(");;"); - QString fileName = QFileDialog::getSaveFileName(this, tr("SAVE_MED"), - QString(""), filtre); - QFileInfo myFileInfo(fileName); - selectOutMedFileLineEdit->setText(myFileInfo.fileName()); - *myFileOutDir = myFileInfo.path(); - -} -void SMESHGUI_MgAdaptArguments::onSelectMedFileBackgroundbutton() -{ - QString fileName0 = selectMedFileBackgroundbutton->text().trimmed(); - - QString fileName = getMedFileName(false); - if (fileName != QString::null) - { - myFieldList = GetListeChamps(fileName); - if (myFieldList.empty()) - { - fileName = fileName0; - fieldNameCmb->clear(); - } - else - { - // fill field name Combobox - fieldNameCmb->clear(); - std::map::const_iterator it; - for ( it=myFieldList.begin() ; it != myFieldList.end(); it++) - { - fieldNameCmb->insertItem(0,QString(it->first)); - int typeStepInField = it->second > 2 ? 2 : it->second ; - timeStepGroupChanged(typeStepInField, true); - } - - } - - } - else - { - fileName = fileName0; - fieldNameCmb->clear(); - } - - QFileInfo myFileInfo(fileName); - *myFileSizeMapDir = myFileInfo.path(); - selectMedFileBackgroundLineEdit->setText(myFileInfo.fileName()); - -} -void SMESHGUI_MgAdaptArguments::onMedFileCheckBox(int state) -{ - if (state == Qt::Checked) - { - selectOutMedFilebutton->show(); - selectOutMedFileLineEdit->show(); - selectOutMedFilebutton->setEnabled(true); - selectOutMedFileLineEdit->setEnabled(true); - } - else - { - selectOutMedFilebutton->setEnabled(false); - selectOutMedFileLineEdit->setEnabled(false); - publishOut->setChecked(true); - } -} -void SMESHGUI_MgAdaptArguments::onPublishOut(int state) -{ - if (state == Qt::Unchecked) - { - medFileCheckBox->setChecked(true); - } -} - -void SMESHGUI_MgAdaptArguments::onSelectMedFilebuttonClicked() -{ - // bool keep = false; - QString fileName0 = selectMedFileLineEdit->text().trimmed(); - - QString fileName = getMedFileName(false); - if(fileName != QString::null) - { - QString aMeshName = lireNomMaillage(fileName.trimmed(), meshDim); - if (aMeshName == QString::null ) - { - QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), - QObject::tr("MG_ADAPT_MED_FILE_2") ); - fileName = fileName0; - } - else - { - meshNameLineEdit->setText(aMeshName); - ADAPTATION_MODE aMode = meshDim == 3 ? ADAPTATION_MODE::BOTH : ADAPTATION_MODE::SURFACE; // and when dimesh 3 without 2D mesh? - emit meshDimSignal(aMode); - } - - } - else - { - return; - } - - - QFileInfo myFileInfo(fileName); - *myFileInDir = myFileInfo.path(); - *myFileOutDir = myFileInfo.path(); - selectMedFileLineEdit->setText(myFileInfo.fileName()); - QString outF = fileName == QString::null ? myFileInfo.fileName() : - QString( remove_extension(myFileInfo.fileName().toStdString() ).c_str() )+ QString(".adapt.med"); - selectOutMedFileLineEdit->setText(outF); - onLocalSelected(myFileInfo.filePath()); - -} - -void SMESHGUI_MgAdaptArguments::onLocalSelected(QString filePath) -{ - myFieldList = GetListeChamps(filePath, false); - if (myFieldList.empty()) - { - if (localButton->isChecked()) - { - fieldNameCmb->clear(); - } - - } - else - { - // fill field name Combobox - fieldNameCmb->clear(); - std::map::const_iterator it; - for ( it = myFieldList.begin() ; it != myFieldList.end(); it++) - { - fieldNameCmb->insertItem(0,QString(it->first)); - int typeStepInField = it->second > 2 ? 2 : it->second ; - timeStepGroupChanged(typeStepInField, true); - } - - } -} -// ======================================================================= -// Gestion les boutons qui permettent de -// 1) retourne le nom d'un fichier par une fenetre de dialogue si aucun -// objet est selectionne dans l arbre d etude -// 2) retourne le nom du fichier asocie a l objet -// selectionne dans l arbre d etude -// ======================================================================= -QString SMESHGUI_MgAdaptArguments::getMedFileName(bool avertir) -{ - - QString aFile = QString::null; - QString filtre = QString("Med") ; - filtre += QString(" files (*.") + QString("med") + QString(");;"); - aFile = SUIT_FileDlg::getOpenFileName(0, QObject::tr("MG_ADAPT_SELECT_FILE_0"), QString(""), filtre ); - - return aFile; - -} -void SMESHGUI_MgAdaptArguments::setMode(const Mode theMode, const SIZEMAP theSizeMap ) -{ - QRadioButton* aButton = qobject_cast( meshInGroup->button( theMode ) ); - QRadioButton* bButton = qobject_cast( sizeMapDefGroup->button( theSizeMap ) ); - if ( aButton ) { - aButton->setChecked( true ); - modeChanged( theMode ); - } - if ( bButton ) { - bButton->setChecked( true ); - sizeMapDefChanged( theSizeMap ); - } -} - -void SMESHGUI_MgAdaptArguments::modeChanged( int theMode ) -{ - clear(); - if(theMode == Mesh) - { - aBrowserObject->hide(); - selectMedFileLineEdit->show(); - selectMedFilebutton->show(); - localButton->setEnabled(true); - } - else - { - selectMedFileLineEdit->hide(); - selectMedFilebutton->hide(); - localButton->setEnabled(false); - aBrowserObject->show(); - sizeMapDefChanged(Background); - emit updateSelection(); - } - - - -} - -void SMESHGUI_MgAdaptArguments::sizeMapDefChanged( int theSizeMap ) -{ - fieldNameCmb->clear(); - if(theSizeMap == Local) - { - localButton->setEnabled(true); - localButton->setChecked(true); - medFileBackground->hide(); - selectMedFileBackgroundbutton->hide(); - selectMedFileBackgroundLineEdit->hide(); - selectMedFileBackgroundLineEdit->clear(); - valueLabel->hide(); - dvalue->hide(); - - sizeMapField->setEnabled(true); - if (!selectMedFileLineEdit->text().isEmpty()) - { - QFileInfo myFileInfo(QDir(*myFileInDir), selectMedFileLineEdit->text()); - onLocalSelected(myFileInfo.filePath()); - } - } - else if (theSizeMap == Background) - { - medFileBackground->show(); - backgroundButton->setChecked(true); - selectMedFileBackgroundbutton->show(); - selectMedFileBackgroundLineEdit->show(); - valueLabel->hide(); - dvalue->hide(); - sizeMapField->setEnabled(true); - - } - else - { - medFileBackground->hide(); - constantButton->setChecked(true); - selectMedFileBackgroundbutton->hide(); - selectMedFileBackgroundLineEdit->clear(); - selectMedFileBackgroundLineEdit->hide(); - valueLabel->show(); - dvalue->show(); - sizeMapField->setEnabled(false); - - } - - -} -void SMESHGUI_MgAdaptArguments::timeStepGroupChanged(int timeStepType, bool disableOther, int max) -{ - switch (timeStepType) - { - case 0 : - onNoTimeStep(disableOther); - break; - case 1 : - onLastTimeStep(disableOther); - break; - case 2 : - onChosenTimeStep(disableOther, max); - default: - break; - } -} - -void SMESHGUI_MgAdaptArguments::clear() -{ - selectMedFileLineEdit->clear(); - aBrowserObject->clear(); - - meshNameLineEdit->clear(); - selectOutMedFileLineEdit->clear(); -} -med_int SMESHGUI_MgAdaptArguments::getMeshDim() const -{ - return meshDim; -} -QWidget* ItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &o, const QModelIndex &index) const -{ - bool editable = index.data( EDITABLE_ROLE ).toInt(); - return editable ? QItemDelegate::createEditor( parent, o, index ) : 0; -} - -////////////////////////////////////////// -// MgAdaptAdvWidget -////////////////////////////////////////// - -MgAdaptAdvWidget::MgAdaptAdvWidget( QWidget* parent, std::vector * options, Qt::WindowFlags f ) - : QWidget( parent, f ), myOptions(options) -{ - setupWidget(); - myOptionTable->header()->setSectionResizeMode( QHeaderView::ResizeToContents ); - myOptionTable->setItemDelegate( new ItemDelegate( myOptionTable ) ); - - for ( int i = 0, nb = myOptions->size(); i < nb; ++i ) - { - AddOption( (*myOptions)[i].c_str() ); - } - - connect( myOptionTable, SIGNAL( itemChanged(QTreeWidgetItem *, int)), SLOT( itemChanged(QTreeWidgetItem *, int ))); - connect( addBtn, SIGNAL( clicked() ), this, SLOT( onAddOption() ) ); - connect(workingDirectoryPushButton, SIGNAL(pressed()), this, SLOT(_onWorkingDirectoryPushButton())); -} - -MgAdaptAdvWidget::~MgAdaptAdvWidget() -{ -} - -void MgAdaptAdvWidget::AddOption( const char* option, bool isCustom ) -{ - - - QString name, value; - bool isDefault = false; - if ( option ) - { - QStringList name_value_type = QString(option).split( ":", QString::KeepEmptyParts ); - if ( name_value_type.size() > 0 ) - name = name_value_type[0]; - if ( name_value_type.size() > 1 ) - value = name_value_type[1]; - if ( name_value_type.size() > 2 ) - isDefault = !name_value_type[2].toInt(); - - } - QTreeWidget* table = myOptionTable; - //table->setExpanded( true ); - - QTreeWidgetItem* row; - if (optionTreeWidgetItem.size()) - { - std::map::iterator it = optionTreeWidgetItem.find(name); - if(it != optionTreeWidgetItem.end()) return; // option exist - else - { - row = getNewQTreeWidgetItem(table, option, name, isCustom); - } - } - else - { - row = getNewQTreeWidgetItem(table, option, name, isCustom); - } - row->setText( 0, tr( name.toLatin1().constData() )); - row->setText( 1, tr( value.toLatin1().constData() )); - row->setCheckState( 0, isDefault ? Qt::Unchecked : Qt::Checked); - row->setData( NAME_COL, PARAM_NAME, name ); - - if ( isCustom ) - { - myOptionTable->scrollToItem( row ); - myOptionTable->setCurrentItem( row ); - myOptionTable->editItem( row, NAME_COL ); - } -} - -QTreeWidgetItem* MgAdaptAdvWidget::getNewQTreeWidgetItem(QTreeWidget* table, const char* option, QString& name, bool isCustom) -{ - QTreeWidgetItem* row = new QTreeWidgetItem( table ); - row->setData( NAME_COL, EDITABLE_ROLE, int( isCustom && !option )); - row->setFlags( row->flags() | Qt::ItemIsEditable ); - optionTreeWidgetItem.insert(std::pair (name, row)); - - return row; -} - -void MgAdaptAdvWidget::onAddOption() -{ - AddOption( NULL, true ); -} -void MgAdaptAdvWidget::GetOptionAndValue( QTreeWidgetItem * tblRow, - QString& option, - QString& value, - bool& isDefault) -{ - option = tblRow->data( NAME_COL, PARAM_NAME ).toString(); - value = tblRow->text( VALUE_COL ); - isDefault = ! tblRow->checkState( NAME_COL ); - -} - - -void MgAdaptAdvWidget::itemChanged(QTreeWidgetItem* tblRow, int column) -{ - if ( tblRow ) - { - myOptionTable->blockSignals( true ); - - tblRow->setData( VALUE_COL, EDITABLE_ROLE, int( tblRow->checkState( NAME_COL ))); - - int c = tblRow->checkState( NAME_COL ) ? 0 : 150; - tblRow->setForeground( VALUE_COL, QBrush( QColor( c, c, c ))); - - if ( column == NAME_COL && tblRow->data( NAME_COL, EDITABLE_ROLE ).toInt() ) // custom table - { - tblRow->setData( NAME_COL, PARAM_NAME, tblRow->text( NAME_COL )); - } - - myOptionTable->blockSignals( false ); - } -} -void MgAdaptAdvWidget::setupWidget() -{ - if (this->objectName().isEmpty()) - this->setObjectName(QString(tr("MG-ADAPT-ADV"))); - this->resize(337, 369); - gridLayout_4 = new QGridLayout(this); - gridLayout_4->setObjectName(QString("gridLayout_4")); - myOptionTable = new MgAdaptAdvWidgetTreeWidget(this); - QFont font; - font.setBold(false); - font.setWeight(50); - QTreeWidgetItem *__qtreewidgetitem = new QTreeWidgetItem(); - __qtreewidgetitem->setFont(1, font); - __qtreewidgetitem->setFont(0, font); - __qtreewidgetitem->setText(1, tr("OPTION_VALUE_COLUMN")); - __qtreewidgetitem->setText(0, tr("OPTION_NAME_COLUMN")); - myOptionTable->setHeaderItem(__qtreewidgetitem); - myOptionTable->setObjectName(QString("myOptionTable")); - myOptionTable->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed); - myOptionTable->setTabKeyNavigation(true); - - gridLayout_4->addWidget(myOptionTable, 0, 0, 1, 2); - - addBtn = new QPushButton(this); - addBtn->setObjectName(QString("addBtn")); - - gridLayout_4->addWidget(addBtn, 1, 0, 1, 1); - - horizontalSpacer = new QSpacerItem(188, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - - gridLayout_4->addItem(horizontalSpacer, 1, 1, 1, 1); - - logGroupBox = new QGroupBox(this); - logGroupBox->setObjectName(QString("logGroupBox")); - gridLayout_2 = new QGridLayout(logGroupBox); - gridLayout_2->setObjectName(QString("gridLayout_2")); - gridLayout = new QGridLayout(); - gridLayout->setObjectName(QString("gridLayout")); - workingDirectoryLabel = new QLabel(logGroupBox); - workingDirectoryLabel->setObjectName(QString("workingDirectoryLabel")); - - gridLayout->addWidget(workingDirectoryLabel, 0, 0, 1, 1); - - workingDirectoryLineEdit = new QLineEdit(logGroupBox); - workingDirectoryLineEdit->setObjectName(QString("workingDirectoryLineEdit")); - - gridLayout->addWidget(workingDirectoryLineEdit, 0, 1, 1, 1); - - workingDirectoryPushButton = new QPushButton(logGroupBox); - workingDirectoryPushButton->setObjectName(QString("workingDirectoryPushButton")); - - gridLayout->addWidget(workingDirectoryPushButton, 0, 2, 1, 1); - - verboseLevelLabel = new QLabel(logGroupBox); - verboseLevelLabel->setObjectName(QString("verboseLevelLabel")); - - gridLayout->addWidget(verboseLevelLabel, 1, 0, 1, 1); - - verboseLevelSpin = new QSpinBox(logGroupBox); - verboseLevelSpin->setObjectName(QString("verboseLevelSpin")); - - gridLayout->addWidget(verboseLevelSpin, 1, 1, 1, 1); - - - gridLayout_2->addLayout(gridLayout, 0, 0, 1, 1); - - horizontalLayout = new QHBoxLayout(); - horizontalLayout->setObjectName(QString("horizontalLayout")); - logInFileCheck = new QCheckBox(logGroupBox); - logInFileCheck->setObjectName(QString("logInFileCheck")); - logInFileCheck->setChecked(true); - - horizontalLayout->addWidget(logInFileCheck); - - removeLogOnSuccessCheck = new QCheckBox(logGroupBox); - removeLogOnSuccessCheck->setObjectName(QString("removeLogOnSuccessCheck")); - removeLogOnSuccessCheck->setChecked(true); - - horizontalLayout->addWidget(removeLogOnSuccessCheck); - - - gridLayout_2->addLayout(horizontalLayout, 1, 0, 1, 1); - - keepWorkingFilesCheck = new QCheckBox(logGroupBox); - keepWorkingFilesCheck->setObjectName(QString("keepWorkingFilesCheck")); - keepWorkingFilesCheck->setAutoExclusive(false); - - gridLayout_2->addWidget(keepWorkingFilesCheck, 2, 0, 1, 1); - - - gridLayout_4->addWidget(logGroupBox, 3, 0, 1, 2); - - - // retranslateUi(this); - - // QMetaObject::connectSlotsByName(this); - -} -void MgAdaptAdvWidget::_onWorkingDirectoryPushButton() -{ - QString aDirName=QFileDialog::getExistingDirectory (); - if (!(aDirName.isEmpty()))workingDirectoryLineEdit->setText(aDirName); -} -void MgAdaptAdvWidget::onMeshDimChanged(ADAPTATION_MODE aMode) -{ - /* default adaptation mode - * assume that if meshDim == 2 -->adaptation surface - * if meshDim == 3 and if there is not 2D mesh -->VOLUME - * else BOTH - */ - - QString adaptation("adaptation"), value; - switch(aMode) - { - case ADAPTATION_MODE::SURFACE: - { - value ="surface"; - setOptionValue(adaptation, value); - break; - } - case ADAPTATION_MODE::BOTH : - { - value = "both"; - setOptionValue(adaptation, value); - break; - } - case ADAPTATION_MODE::VOLUME : - { - value = "volume"; - setOptionValue(adaptation, value); - break; - } - } -} -void MgAdaptAdvWidget::setOptionValue(QString& option, QString& value) -{ - - std::map::iterator it = optionTreeWidgetItem.find(option); - if (it != optionTreeWidgetItem.end()) - { - it->second->setText( 0, tr( option.toLatin1().constData() )); - it->second->setText( 1, tr( value.toLatin1().constData() )); - it->second->setCheckState( 0, Qt::Checked ); - it->second->setData( NAME_COL, PARAM_NAME, option ); - myOptionTable->editItem( it->second, NAME_COL ); - } -} -namespace -{ -bool isEditable( const QModelIndex& index ) -{ - return index.isValid() && - index.flags() & Qt::ItemIsEditable && - index.flags() & Qt::ItemIsEnabled && - ( !index.data( Qt::UserRole + 1 ).isValid() || index.data( Qt::UserRole + 1 ).toInt() != 0 ); -} -} - -MgAdaptAdvWidgetTreeWidget::MgAdaptAdvWidgetTreeWidget( QWidget* parent ) - : QTreeWidget( parent ) -{ -} - -QModelIndex MgAdaptAdvWidgetTreeWidget::moveCursor( CursorAction action, Qt::KeyboardModifiers modifiers ) -{ - QModelIndex current = currentIndex(); - int column = current.column(); - if ( action == MoveNext ) { - if ( column < columnCount()-1 ) { - QModelIndex next = current.sibling( current.row(), column+1 ); - if ( isEditable( next ) ) - return next; - } - else { - QModelIndex next = current.sibling( current.row()+1, 0 ); - if ( isEditable( next ) ) - return next; - } - } - else if ( action == MovePrevious ) { - if ( column == 0 ) { - QModelIndex next = current.sibling( current.row()-1, columnCount()-1 ); - if ( isEditable( next ) ) - return next; - } - else { - QModelIndex next = current.sibling( current.row(), column-1 ); - if ( isEditable( next ) ) - return next; - } - } - return QTreeWidget::moveCursor( action, modifiers ); -} - -void MgAdaptAdvWidgetTreeWidget::keyPressEvent( QKeyEvent* e ) -{ - switch ( e->key() ) { - case Qt::Key_F2: - { - QModelIndex index = currentIndex(); - if ( !isEditable( index ) ) { - for ( int i = 0; i < columnCount(); i++ ) { - QModelIndex sibling = index.sibling( index.row(), i ); - if ( isEditable( sibling ) ) { - if ( !edit( sibling, EditKeyPressed, e ) ) - e->ignore(); - } - } - } - } - break; - default: - break; - } - QTreeWidget::keyPressEvent( e ); -} - - -// ======================================================================= -// renvoie le medId associe au fichier Med apres ouverture -// ======================================================================= -med_idt OuvrirFichier(QString aFile) -{ - med_idt medIdt = MEDfileOpen(aFile.toStdString().c_str(),MED_ACC_RDONLY); - if (medIdt <0) - { - QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), - QObject::tr("MG_ADAPT_MED_FILE_1") ); - } - return medIdt; -} - -// ====================================================== -// ======================================================== -QString lireNomMaillage(QString aFile, med_int& meshdim) -{ - QString nomMaillage = QString::null ; - int erreur = 0 ; - med_idt medIdt ; - - // Ouverture du fichier - medIdt = OuvrirFichier(aFile); - if ( medIdt < 0 ) - { - erreur = 1 ; - return nomMaillage; - } - med_int numberOfMeshes = MEDnMesh(medIdt) ; - if (numberOfMeshes == 0 ) - { - QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), - QObject::tr("MG_ADAPT_MED_FILE_2") ); - erreur = 2 ; - return nomMaillage; - } - if (numberOfMeshes > 1 ) - { - QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), - QObject::tr("MG_ADAPT_MED_FILE_3") ); - erreur = 3 ; - return nomMaillage; - } - - nomMaillage = lireNomMaillage2(medIdt,1, meshdim); - // Fermeture du fichier - if ( medIdt > 0 ) MEDfileClose(medIdt); - - return nomMaillage; -} - -// ======================================================================= -// ======================================================================= -QString lireNomMaillage2(med_idt medIdt,int meshId, med_int& meshdim ) -{ - QString NomMaillage=QString::null; - char meshname[MED_NAME_SIZE+1]; - med_int spacedim; - med_mesh_type meshtype; - char descriptionription[MED_COMMENT_SIZE+1]; - char dtunit[MED_SNAME_SIZE+1]; - med_sorting_type sortingtype; - med_int nstep; - med_axis_type axistype; - int naxis = MEDmeshnAxis(medIdt,1); - char *axisname=new char[naxis*MED_SNAME_SIZE+1]; - char *axisunit=new char[naxis*MED_SNAME_SIZE+1]; - med_err aRet = MEDmeshInfo(medIdt, - meshId, - meshname, - &spacedim, - &meshdim, - &meshtype, - descriptionription, - dtunit, - &sortingtype, - &nstep, - &axistype, - axisname, - axisunit); - - if ( aRet < 0 ) { - QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), \ - QObject::tr("MG_ADAPT_MED_FILE_4") ); - } - else { - NomMaillage=QString(meshname); - } - - delete[] axisname ; - delete[] axisunit ; - - return NomMaillage; -} - - - -// ======================================================================= -std::map GetListeChamps(QString aFile, bool errorMessage) -// ======================================================================= -{ -// Il faut voir si plusieurs maillages - - MESSAGE("GetListeChamps"); - std::map ListeChamp ; - - med_err erreur = 0 ; - med_idt medIdt ; - - while ( erreur == 0 ) - { - // Ouverture du fichier - SCRUTE(aFile.toStdString()); - medIdt = OuvrirFichier(aFile); - if ( medIdt < 0 ) - { - erreur = 1 ; - break ; - } - // Lecture du nombre de champs - med_int ncha = MEDnField(medIdt) ; - if (ncha < 1 ) - { - if(errorMessage) - { - QMessageBox::critical( 0, QObject::tr("_ERROR"), - QObject::tr("HOM_MED_FILE_5") ); - } - erreur = 2 ; - break ; - } - // Lecture des caracteristiques des champs - for (int i=0; i< ncha; i++) - { -// Lecture du nombre de composantes - med_int ncomp = MEDfieldnComponent(medIdt,i+1); -// Lecture du type du champ, des noms des composantes et du nom de l'unite - char nomcha [MED_NAME_SIZE+1]; - char meshname[MED_NAME_SIZE+1]; - char * comp = (char*) malloc(ncomp*MED_SNAME_SIZE+1); - char * unit = (char*) malloc(ncomp*MED_SNAME_SIZE+1); - char dtunit[MED_SNAME_SIZE+1]; - med_bool local; - med_field_type typcha; - med_int nbofcstp; - erreur = MEDfieldInfo(medIdt,i+1,nomcha,meshname,&local,&typcha,comp,unit,dtunit,&nbofcstp) ; - free(comp); - free(unit); - if ( erreur < 0 ) - { - if(errorMessage) - { - QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), - QObject::tr("MG_ADAPT_MED_FILE_6") ); - } - break ; - } - - ListeChamp.insert(std::pair (QString(nomcha), nbofcstp)); - - } - break ; - } - // Fermeture du fichier - if ( medIdt > 0 ) MEDfileClose(medIdt); - - return ListeChamp; -} - -std::string remove_extension(const std::string& filename) { - size_t lastdot = filename.find_last_of("."); - if (lastdot == std::string::npos) return filename; - return filename.substr(0, lastdot); -} - - diff --git a/src/SMESHGUI/MG_ADAPTGUI.hxx b/src/SMESHGUI/MG_ADAPTGUI.hxx deleted file mode 100644 index 5e2a90435..000000000 --- a/src/SMESHGUI/MG_ADAPTGUI.hxx +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright (C) 2011-2020 CEA/DEN, EDF R&D -// -// 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 -// - -// SMESH SMESHGUI : GUI for the adaptation in the SMESH component -// File : MG_ADAPTGUI.hxx -// -#ifndef MG_ADAPTGUI_HXX -#define MG_ADAPTGUI_HXX - -#include -// SMESH includes - -// Qt includes -#include -#include -#include - -#include "LightApp_DataOwner.h" -#include "SalomeApp_Application.h" -#include -#include -#include "SalomeApp_Module.h" -#include "SalomeApp_Study.h" -#include -#include - - -// model - - -#include "MG_ADAPT.hxx" - -class SUIT_ViewWindow; -class SUIT_Desktop; -class SUIT_Study; -class SUIT_ResourceMgr; - -class CAM_Module; - -class SALOMEDSClient_Study; -class SALOMEDSClient_SObject; - -class SalomeApp_Study; -class SalomeApp_Module; -class LightApp_SelectionMgr; - - -class QButtonGroup; -class QLineEdit; -class QGroupBox; -class QRadioButton; -class QLabel; -class QCheckBox; -class QGridLayout; -class QTabWidget; -class QDoubleSpinBox; -class QSpinBox; -class QTreeWidget; -class QTreeWidgetItem; -class QSpacerItem; -class QHBoxLayout; -class QItemDelegate; -class QComboBox; - -// IDL includes -#include - -class SVTK_ViewWindow; -class SVTK_Selector; -class SMESHGUI_MgAdaptDlg; -class SMESHGUI_MgAdaptArguments; -class SMESHGUI_SpinBox; -class MgAdaptAdvWidgetTreeWidget; -class MgAdaptAdvWidget; -class MgAdapt; -class QHeaderView; -class QFileDialog; - - -std::map GetListeChamps(QString aFile, bool errorMessage = true); -QString lireNomMaillage(QString aFile, med_int& meshDim); -QString lireNomMaillage2(med_idt medIdt,int meshId, med_int& meshDim); -med_idt OuvrirFichier(QString aFile); -std::string remove_extension(const std::string& filename); - - -enum ADAPTATION_MODE{ - SURFACE, // surface adaption when meshDim == 2 - VOLUME, // - BOTH -}; -//================================================================================= -// class : SMESHGUI_MgAdaptDlg -// purpose : -//================================================================================= -class SMESHGUI_MgAdaptDlg : public QDialog -{ - Q_OBJECT; -public: - //! Property type - enum Mode { Arguments, AdvancedOptions}; - SMESHGUI_MgAdaptDlg( SalomeApp_Module*, MgAdapt*, QWidget* parent= 0,bool isCreation = true ); - ~SMESHGUI_MgAdaptDlg(); - - void buildDlg(); - void reject(); - bool checkParams(QString& msg) ; - void setModel(MgAdapt*); - MgAdapt* getModel() const; - -public slots: - -protected slots: - - virtual bool clickOnApply(); -private slots: - virtual void clickOnHelp(); - virtual void clickOnOk(); -protected : - - SMESHGUI_MgAdaptArguments* myArgs; - MgAdaptAdvWidget* myAdvOpt; - bool readParamsFromHypo( ) const ; - bool readParamsFromWidgets( ) ; - bool storeParamsToHypo( const MgAdaptHypothesisData& ) const; - -private: - - - SalomeApp_Module* mySMESHGUI; /* Current SMESHGUI object */ - QTabWidget* myTabWidget; - - - MgAdaptHypothesisData* myData; - MgAdapt* model; - -}; - -class SMESHGUI_MgAdaptArguments : public QWidget -{ - Q_OBJECT; -public: - //! Property type - enum Mode { Mesh, Browser}; - enum SIZEMAP { Local, Background, Constant}; - SMESHGUI_MgAdaptArguments( QWidget* parent); - ~SMESHGUI_MgAdaptArguments(); - void setMode( const Mode, const SIZEMAP ); - med_int getMeshDim() const; - - QString* myFileInDir; - QString* myFileOutDir; - QString* myFileSizeMapDir; - QGroupBox* aMeshIn ; - QRadioButton* aMedfile; - QRadioButton* aBrowser ; - QLineEdit* aBrowserObject; - QPushButton* selectMedFilebutton ; - QSpacerItem* hspacer; - QLineEdit* selectMedFileLineEdit ; - QButtonGroup* meshInGroup ; - QGridLayout* meshIn ; - - QGroupBox* aMeshOut ; - QLabel* meshName; - QLineEdit* meshNameLineEdit; - QSpacerItem* secondHspacer; - QCheckBox* medFileCheckBox; - QPushButton* selectOutMedFilebutton; - QLineEdit* selectOutMedFileLineEdit; - QSpacerItem* thirdHspacer; - QCheckBox* publishOut; - QGridLayout* meshOut ; - - QGroupBox* sizeMapDefinition ; - QRadioButton* localButton; - QRadioButton* backgroundButton ; - QRadioButton* constantButton ; - QLabel* medFileBackground; - QPushButton* selectMedFileBackgroundbutton; - QLineEdit* selectMedFileBackgroundLineEdit; - QLabel* valueLabel; - QDoubleSpinBox* dvalue; - QButtonGroup* sizeMapDefGroup ; - QGridLayout* sizeMapDefGroupLayout; - - - QGroupBox* sizeMapField; - QLabel* fieldName; - QComboBox* fieldNameCmb; - QRadioButton* noTimeStep; - QRadioButton* lastTimeStep ; - QRadioButton* chosenTimeStep; - QLabel* timeStepLabel; - QSpinBox* timeStep; - QLabel* rankLabel; - QSpinBox* rankSpinBox; - QButtonGroup* timeStepGroup; - QGridLayout* sizeMapFieldGroupLayout; - -signals: - void updateSelection(); - void toExportMED(const char *); - void meshDimSignal(ADAPTATION_MODE aMode); -public slots: - -protected slots: - -private slots: - void modeChanged( int); - void sizeMapDefChanged(int); - void timeStepGroupChanged(int timeStepType, bool disableOther = false, int max = 0); - void onSelectMedFilebuttonClicked(); - void clear(); - void onMedFileCheckBox(int); - void onPublishOut(int); - void onSelectOutMedFilebutton(); - void onSelectMedFileBackgroundbutton(); - void onLocalSelected(QString); - void onNoTimeStep(bool disableOther = false); - void onLastTimeStep(bool disableOther = false); - void onChosenTimeStep(bool disableOther = false, int max = 0); - -private: - - QString getMedFileName(bool avertir); - LightApp_SelectionMgr* selMgr ; - med_int meshDim; - std::map myFieldList; - - -}; -enum { - OPTION_ID_COLUMN = 0, - OPTION_TYPE_COLUMN, - OPTION_NAME_COLUMN = 0, - OPTION_VALUE_COLUMN, - NB_COLUMNS, -}; - -////////////////////////////////////////// -// MgAdaptAdvWidget -////////////////////////////////////////// -class MgAdaptAdvWidget : public QWidget -{ - Q_OBJECT - -public: - MgAdaptAdvWidget( QWidget* = 0, std::vector * = nullptr, Qt::WindowFlags = 0 ); - ~MgAdaptAdvWidget(); - std::vector < std::string > * myOptions; - QGridLayout *gridLayout_4; - MgAdaptAdvWidgetTreeWidget *myOptionTable; - QPushButton *addBtn; - QSpacerItem *horizontalSpacer; - QGroupBox *logGroupBox; - QGridLayout *gridLayout_2; - QGridLayout *gridLayout; - QLabel *workingDirectoryLabel; - QLineEdit *workingDirectoryLineEdit; - QPushButton *workingDirectoryPushButton; - QLabel *verboseLevelLabel; - QSpinBox *verboseLevelSpin; - QHBoxLayout *horizontalLayout; - QCheckBox *logInFileCheck; - QCheckBox *removeLogOnSuccessCheck; - QCheckBox *keepWorkingFilesCheck; - - void AddOption( const char* name_value_type, bool isCustom = false ); - void GetOptionAndValue( QTreeWidgetItem * tblRow, QString& option, QString& value, bool& dflt ); - void setupWidget(); -public slots: - - void onAddOption(); - void itemChanged(QTreeWidgetItem * tblRow, int column); - void onMeshDimChanged(ADAPTATION_MODE aMode); -private slots: - void _onWorkingDirectoryPushButton(); -private: - void setOptionValue(QString& option, QString& value); - std::map optionTreeWidgetItem; - - QTreeWidgetItem* getNewQTreeWidgetItem(QTreeWidget* table, const char* option, QString& name, bool isCustom); - -}; - -enum { EDITABLE_ROLE = Qt::UserRole + 1, PARAM_NAME, - NAME_COL = 0, VALUE_COL - }; - - - -class ItemDelegate: public QItemDelegate -{ -public: - - ItemDelegate(QObject* parent=0): QItemDelegate(parent) {} - QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &o, const QModelIndex &index) const; -}; - -class MgAdaptAdvWidgetTreeWidget : public QTreeWidget -{ - Q_OBJECT -public: - MgAdaptAdvWidgetTreeWidget( QWidget* ); - -protected: - QModelIndex moveCursor( CursorAction, Qt::KeyboardModifiers ); - void keyPressEvent( QKeyEvent* ); -}; - - -#endif // MG_ADAPTGUI_HXX