From f696a3b7ee0ba8e435652d48a7f89fbb2f50626e Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 22 Mar 2021 15:02:50 +0300 Subject: [PATCH] Merge gni/adaptation as is --- CMakeLists.txt | 63 +- doc/salome/examples/CMakeLists.txt | 1 + .../examples/MGAdaptTests_without_session.py | 472 +++++ .../examples/MGAdapt_med_files/test_01.med | 0 .../examples/MGAdapt_med_files/test_02.med | 0 .../examples/MGAdapt_med_files/test_02_bg.med | 0 .../examples/MGAdapt_med_files/test_04.med | 0 .../examples/MGAdapt_med_files/test_06.med | 0 .../examples/MGAdapt_med_files/test_07.med | 0 .../examples/MGAdapt_med_files/test_08.med | 0 .../examples/MGAdapt_med_files/test_08_bg.med | 0 .../examples/MGAdapt_med_files/test_10.med | 0 .../examples/MGAdapt_med_files/test_11.med | 0 .../examples/MGAdapt_med_files/test_13.med | 0 doc/salome/examples/tests.set | 1 + doc/salome/gui/SMESH/images/adaptation_01.png | 0 doc/salome/gui/SMESH/images/adaptation_02.png | 0 doc/salome/gui/SMESH/input/adaptation.rst | 38 + doc/salome/gui/SMESH/input/index.rst | 14 +- .../gui/SMESH/input/smeshpy_interface.rst | 7 +- doc/salome/gui/SMESH/input/tui_adaptation.rst | 18 + idl/CMakeLists.txt | 1 + idl/MG_ADAPT.idl | 152 ++ idl/SMESH_Gen.idl | 8 +- resources/CMakeLists.txt | 1 + resources/SalomeApp.xml.in | 8 + resources/adapt_mg_adapt.png | 0 src/CMakeLists.txt | 8 +- src/SMESH/CMakeLists.txt | 4 + src/SMESH/MG_ADAPT.cxx | 1575 +++++++++++++++++ src/SMESH/MG_ADAPT.hxx | 340 ++++ src/SMESHGUI/CMakeLists.txt | 12 +- src/SMESHGUI/MG_ADAPTGUI.cxx | 1365 ++++++++++++++ src/SMESHGUI/MG_ADAPTGUI.hxx | 329 ++++ src/SMESHGUI/SMESHGUI.cxx | 126 +- src/SMESHGUI/SMESHGUI_AdaptDlg.cxx | 162 ++ src/SMESHGUI/SMESHGUI_AdaptDlg.h | 77 + src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx | 758 ++++++++ src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h | 210 +++ src/SMESHGUI/SMESHGUI_Operations.h | 2 + src/SMESHGUI/SMESH_images.ts | 6 +- src/SMESHGUI/SMESH_msg_en.ts | 226 ++- src/SMESHGUI/SMESH_msg_fr.ts | 214 ++- src/SMESH_I/CMakeLists.txt | 4 + src/SMESH_I/MG_ADAPT_i.cxx | 528 ++++++ src/SMESH_I/MG_ADAPT_i.hxx | 162 ++ src/SMESH_I/SMESH_Gen_i.hxx | 4 + 47 files changed, 6813 insertions(+), 83 deletions(-) create mode 100644 doc/salome/examples/MGAdaptTests_without_session.py create mode 100644 doc/salome/examples/MGAdapt_med_files/test_01.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_02.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_02_bg.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_04.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_06.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_07.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_08.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_08_bg.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_10.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_11.med create mode 100644 doc/salome/examples/MGAdapt_med_files/test_13.med create mode 100644 doc/salome/gui/SMESH/images/adaptation_01.png create mode 100644 doc/salome/gui/SMESH/images/adaptation_02.png create mode 100644 doc/salome/gui/SMESH/input/adaptation.rst create mode 100644 doc/salome/gui/SMESH/input/tui_adaptation.rst create mode 100644 idl/MG_ADAPT.idl create mode 100644 resources/adapt_mg_adapt.png create mode 100644 src/SMESH/MG_ADAPT.cxx create mode 100644 src/SMESH/MG_ADAPT.hxx create mode 100644 src/SMESHGUI/MG_ADAPTGUI.cxx create mode 100644 src/SMESHGUI/MG_ADAPTGUI.hxx create mode 100644 src/SMESHGUI/SMESHGUI_AdaptDlg.cxx create mode 100644 src/SMESHGUI/SMESHGUI_AdaptDlg.h create mode 100644 src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx create mode 100644 src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h create mode 100644 src/SMESH_I/MG_ADAPT_i.cxx create mode 100644 src/SMESH_I/MG_ADAPT_i.hxx diff --git a/CMakeLists.txt b/CMakeLists.txt index feff178cd..242782dc4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,7 @@ SET(BUILD_SHARED_LIBS TRUE) # ============ OPTION(SALOME_BUILD_TESTS "Build SALOME tests" ON) OPTION(SALOME_BUILD_DOC "Generate SALOME SMESH documentation" ON) - + # Advanced options: OPTION(SALOME_BUILD_GUI "Enable GUI" ON) OPTION(SALOME_SMESH_USE_CGNS "Enable import/export to CGNS format" OFF) @@ -146,7 +146,7 @@ IF(SALOME_BUILD_GUI) IF(EXISTS ${GUI_ROOT_DIR}) FIND_PACKAGE(SalomeGUI) SALOME_GUI_WITH_CORBA() #check whether GUI built with CORBA - SALOME_GUI_MODE(SALOME_USE_VTKVIEWER SALOME_USE_SALOMEOBJECT + SALOME_GUI_MODE(SALOME_USE_VTKVIEWER SALOME_USE_SALOMEOBJECT OPTIONAL SALOME_USE_PLOT2DVIEWER SALOME_USE_PYCONSOLE) ## ## Prerequisites From GUI: @@ -195,6 +195,15 @@ IF(NOT WITH_SHAPER_STUDY AND SALOME_BUILD_TESTS) MESSAGE(WARNING "SHAPERSTUDY is not found; the corresponding tests will be omitted") ENDIF() +# Find MEDCoupling +# ================ +SET(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} CACHE PATH "Path to the MEDCoupling tool") +IF(EXISTS ${MEDCOUPLING_ROOT_DIR}) + FIND_PACKAGE(SalomeMEDCoupling REQUIRED) # will reload HDF5, MEDFile, XDR, etc ... +ELSE(EXISTS ${MEDCOUPLING_ROOT_DIR}) + MESSAGE(FATAL_ERROR "We absolutely need the MEDCoupling tool, please define MEDCOUPLING_ROOT_DIR !") +ENDIF(EXISTS ${MEDCOUPLING_ROOT_DIR}) + ## ## SMESH specifics ## @@ -202,7 +211,7 @@ ENDIF() # VTK is obligatiry for the SMESH FIND_PACKAGE(SalomeVTK REQUIRED) -FIND_PACKAGE(SalomeOpenCASCADE REQUIRED) +FIND_PACKAGE(SalomeOpenCASCADE REQUIRED) IF(SALOME_SMESH_USE_CGNS) FIND_PACKAGE(SalomeCGNS) @@ -228,7 +237,7 @@ IF(WIN32) MESSAGE(STATUS "Build MEFISTO2D mesher using Fortran to C generator") ELSE(${F2C_FOUND}) MESSAGE(FATAL "Fortran to C generator is not found: MEFISTO2D mesher cannot be compiled! Please define F2C_ROOT_DIR !") - ENDIF(${F2C_FOUND}) + ENDIF(${F2C_FOUND}) ENDIF(WIN32) IF(SALOME_SMESH_ENABLE_MEFISTO) @@ -247,32 +256,32 @@ SET(SALOME_INSTALL_BINS "${SALOME_INSTALL_BINS}" CACHE PATH "Install path: SALOM SET(SALOME_INSTALL_LIBS "${SALOME_INSTALL_LIBS}" CACHE PATH "Install path: SALOME libs") SET(SALOME_INSTALL_IDLS "${SALOME_INSTALL_IDLS}" CACHE PATH "Install path: SALOME IDL files") SET(SALOME_INSTALL_HEADERS "${SALOME_INSTALL_HEADERS}" CACHE PATH "Install path: SALOME headers") -SET(SALOME_INSTALL_SCRIPT_SCRIPTS "${SALOME_INSTALL_SCRIPT_SCRIPTS}" CACHE PATH +SET(SALOME_INSTALL_SCRIPT_SCRIPTS "${SALOME_INSTALL_SCRIPT_SCRIPTS}" CACHE PATH "Install path: SALOME scripts") -SET(SALOME_INSTALL_SCRIPT_DATA "${SALOME_INSTALL_SCRIPT_DATA}" CACHE PATH +SET(SALOME_INSTALL_SCRIPT_DATA "${SALOME_INSTALL_SCRIPT_DATA}" CACHE PATH "Install path: SALOME script data") -SET(SALOME_INSTALL_SCRIPT_PYTHON "${SALOME_INSTALL_SCRIPT_PYTHON}" CACHE PATH +SET(SALOME_INSTALL_SCRIPT_PYTHON "${SALOME_INSTALL_SCRIPT_PYTHON}" CACHE PATH "Install path: SALOME Python scripts") -SET(SALOME_INSTALL_APPLISKEL_SCRIPTS "${SALOME_INSTALL_APPLISKEL_SCRIPTS}" CACHE PATH +SET(SALOME_INSTALL_APPLISKEL_SCRIPTS "${SALOME_INSTALL_APPLISKEL_SCRIPTS}" CACHE PATH "Install path: SALOME application skeleton - scripts") -SET(SALOME_INSTALL_APPLISKEL_PYTHON "${SALOME_INSTALL_APPLISKEL_PYTHON}" CACHE PATH +SET(SALOME_INSTALL_APPLISKEL_PYTHON "${SALOME_INSTALL_APPLISKEL_PYTHON}" CACHE PATH "Install path: SALOME application skeleton - Python") SET(SALOME_INSTALL_PYTHON "${SALOME_INSTALL_PYTHON}" CACHE PATH "Install path: SALOME Python stuff") -SET(SALOME_INSTALL_PYTHON_SHARED "${SALOME_INSTALL_PYTHON_SHARED}" CACHE PATH +SET(SALOME_INSTALL_PYTHON_SHARED "${SALOME_INSTALL_PYTHON_SHARED}" CACHE PATH "Install path: SALOME Python shared modules") -SET(SALOME_INSTALL_CMAKE_LOCAL "${SALOME_INSTALL_CMAKE_LOCAL}" CACHE PATH - "Install path: local SALOME CMake files") +SET(SALOME_INSTALL_CMAKE_LOCAL "${SALOME_INSTALL_CMAKE_LOCAL}" CACHE PATH + "Install path: local SALOME CMake files") SET(SALOME_INSTALL_AMCONFIG_LOCAL "${SALOME_INSTALL_AMCONFIG_LOCAL}" CACHE PATH "Install path: local SALOME config files (obsolete, to be removed)") SET(SALOME_INSTALL_RES "${SALOME_INSTALL_RES}" CACHE PATH "Install path: SALOME resources") SET(SALOME_INSTALL_DOC "${SALOME_INSTALL_DOC}" CACHE PATH "Install path: SALOME documentation") # Specific to SMESH: -SET(SALOME_SMESH_INSTALL_RES_DATA "${SALOME_INSTALL_RES}/smesh" CACHE PATH +SET(SALOME_SMESH_INSTALL_RES_DATA "${SALOME_INSTALL_RES}/smesh" CACHE PATH "Install path: SALOME SMESH specific data") -SET(SALOME_SMESH_INSTALL_PLUGINS share/salome/plugins/smesh CACHE PATH +SET(SALOME_SMESH_INSTALL_PLUGINS share/salome/plugins/smesh CACHE PATH "Install path: SALOME SMESH plugins") - + MARK_AS_ADVANCED(SALOME_INSTALL_BINS SALOME_INSTALL_LIBS SALOME_INSTALL_IDLS SALOME_INSTALL_HEADERS) MARK_AS_ADVANCED(SALOME_INSTALL_SCRIPT_SCRIPTS SALOME_INSTALL_SCRIPT_DATA SALOME_INSTALL_SCRIPT_PYTHON) MARK_AS_ADVANCED(SALOME_INSTALL_APPLISKEL_SCRIPTS SALOME_INSTALL_APPLISKEL_PYTHON SALOME_INSTALL_CMAKE_LOCAL SALOME_INSTALL_RES) @@ -280,13 +289,23 @@ MARK_AS_ADVANCED(SALOME_INSTALL_PYTHON SALOME_INSTALL_PYTHON_SHARED) MARK_AS_ADVANCED(SALOME_INSTALL_AMCONFIG_LOCAL SALOME_INSTALL_DOC) MARK_AS_ADVANCED(SALOME_SMESH_INSTALL_RES_DATA SALOME_SMESH_INSTALL_PLUGINS) +# Specific to ADAPT: +# SET(SALOME_ADAPT_INSTALL_RES_DATA "${SALOME_INSTALL_RES}/adapt" CACHE PATH +# "Install path: SALOME ADAPT specific data") +SET(SALOME_ADAPT_INSTALL_SAMPLES share/salome/adaptsamples CACHE PATH + "Install path: SALOME ADAPT samples") +SET(SALOME_ADAPT_INSTALL_TEST ${SALOME_INSTALL_SCRIPT_SCRIPTS}/test CACHE PATH + "Install path: SALOME ADAPT Test files") +SET(SALOME_ADAPT_INSTALL_RES_DATA "${SALOME_INSTALL_RES}/adapt" CACHE PATH + "Install path: SALOME ADAPT specific data") + # Accumulate environment variables for SMESH module SALOME_ACCUMULATE_ENVIRONMENT(PYTHONPATH NOCHECK ${CMAKE_INSTALL_PREFIX}/${SALOME_INSTALL_BINS} ${CMAKE_INSTALL_PREFIX}/${SALOME_INSTALL_PYTHON} ${CMAKE_INSTALL_PREFIX}/${SALOME_INSTALL_PYTHON_SHARED}) -SALOME_ACCUMULATE_ENVIRONMENT(LD_LIBRARY_PATH NOCHECK ${CMAKE_INSTALL_PREFIX}/${SALOME_INSTALL_LIBS}) +SALOME_ACCUMULATE_ENVIRONMENT(LD_LIBRARY_PATH NOCHECK ${CMAKE_INSTALL_PREFIX}/${SALOME_INSTALL_LIBS}) -# Sources +# Sources # ======== ADD_SUBDIRECTORY(idl) @@ -313,7 +332,7 @@ INCLUDE(CMakePackageConfigHelpers) # List of targets in this project we want to make visible to the rest of the world. # They all have to be INSTALL'd with the option "EXPORT ${PROJECT_NAME}TargetGroup" -SET(_${PROJECT_NAME}_exposed_targets +SET(_${PROJECT_NAME}_exposed_targets SMESHControls MeshDriver MeshDriverDAT MeshDriverGMF MeshDriverMED MeshDriverSTL MeshDriverUNV MEDWrapper SMDS SMESHimpl SMESHEngine SMESHClient SMESHDS @@ -323,7 +342,7 @@ SET(_${PROJECT_NAME}_exposed_targets IF(SALOME_SMESH_ENABLE_MEFISTO) LIST(APPEND _${PROJECT_NAME}_exposed_targets - MEFISTO2D) + MEFISTO2D) ENDIF(SALOME_SMESH_ENABLE_MEFISTO) IF(SALOME_BUILD_GUI) @@ -333,7 +352,7 @@ IF(SALOME_BUILD_GUI) ENDIF(SALOME_BUILD_GUI) IF(SALOME_SMESH_USE_CGNS) - LIST(APPEND _${PROJECT_NAME}_exposed_targets + LIST(APPEND _${PROJECT_NAME}_exposed_targets MeshDriverCGNS ) ENDIF(SALOME_SMESH_USE_CGNS) @@ -350,7 +369,7 @@ SET(GEOM_ROOT_DIR "${GEOM_ROOT_DIR}") SET(MEDFILE_ROOT_DIR "${MEDFILE_ROOT_DIR}") SET(CGNS_ROOT_DIR "${CGNS_ROOT_DIR}") SET(TBB_ROOT_DIR "${TBB_ROOT_DIR}") - + SET(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/include" "${PROJECT_BINARY_DIR}/include") # Build variables that will be expanded when configuring SalomeConfig.cmake: @@ -373,5 +392,5 @@ INSTALL(FILES DESTINATION "${SALOME_INSTALL_CMAKE_LOCAL}") # Install the export set for use with the install-tree -INSTALL(EXPORT ${PROJECT_NAME}TargetGroup DESTINATION "${SALOME_INSTALL_CMAKE_LOCAL}" +INSTALL(EXPORT ${PROJECT_NAME}TargetGroup DESTINATION "${SALOME_INSTALL_CMAKE_LOCAL}" FILE ${PROJECT_NAME}Targets.cmake) diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt index 52f2cf71f..78060692c 100644 --- a/doc/salome/examples/CMakeLists.txt +++ b/doc/salome/examples/CMakeLists.txt @@ -47,3 +47,4 @@ INSTALL(FILES CTestTestfileInstall.cmake DESTINATION ${TEST_INSTALL_DIRECTORY} RENAME CTestTestfile.cmake) INSTALL(FILES tests.set DESTINATION ${TEST_INSTALL_DIRECTORY}) +INSTALL(DIRECTORY MGAdapt_med_files DESTINATION ${TEST_INSTALL_DIRECTORY}) diff --git a/doc/salome/examples/MGAdaptTests_without_session.py b/doc/salome/examples/MGAdaptTests_without_session.py new file mode 100644 index 000000000..4855345c1 --- /dev/null +++ b/doc/salome/examples/MGAdaptTests_without_session.py @@ -0,0 +1,472 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Tests des adaptations par MGAdapt en standalone + +Copyright 2021 EDF +Gérald NICOLAS ++33.1.78.19.43.52 +""" + +__revision__ = "V04.04" + +#========================= Les imports - Début =================================== + +import sys +import os +import salome + +salome.standalone() +salome.salome_init() + +import SMESH +from salome.smesh import smeshBuilder +smesh = smeshBuilder.New() + +#========================== Les imports - Fin ==================================== + +#========================= Paramétrage - Début =================================== +# 1. REPDATA = répertoire du cas +REPDATA = "MGAdapt_med_files" +# +# 2. Repérage des données +D_DATA = dict() +D_DATA["01"] = "01" # 2D plan ; carte locale +D_DATA["02"] = "02" # 2D plan ; carte en arrière-plan +D_DATA["03"] = "01" # 2D plan ; taille constante +D_DATA["04"] = "04" # 3D ; carte locale et dernier pas de temps +D_DATA["05"] = "04" # 3D ; carte locale et pas de temps n°1 +D_DATA["06"] = "06" # 2D non plan; carte locale +D_DATA["07"] = "07" # 2D plan ; carte locale anisotrope +D_DATA["08"] = "08" # 3D ; carte en arrière-plan anisotrope +D_DATA["10"] = "10" # 2D plan ; carte locale et maillage initial quadratique +D_DATA["11"] = "11" # 2D plan ; carte locale et maillage initial en quadrangles +D_DATA["13"] = "13" # 3D ; carte locale en simple précision et dernier pas de temps +#========================== Paramétrage - Fin ==================================== + +class MGAdaptTest (object): + + """Test de l'adaptation par MGAdapt + +Options facultatives +******************** +Le(s) nom du/des tests à passer. Si aucun n'est donné, tous les cas sont passés. + """ + +# A. La base + + message_info = "" + _verbose = 0 + _verbose_max = 0 + affiche_aide_globale = 0 + +# B. Les variables + + l_cas = None + rep_test = None + nro_cas = None + cas = None + +#=========================== Début de la méthode ================================= + + def __init__ ( self, liste_option ): + + """Le constructeur de la classe MGAdaptTest""" + + self.l_cas = list() + + for option in liste_option : + + #print (option) + saux = option.upper() + #print (saux) + if saux in ( "-H", "-HELP" ): + self.affiche_aide_globale = 1 + elif saux == "-V" : + self._verbose = 1 + elif saux == "-VMAX" : + self._verbose = 1 + self._verbose_max = 1 + else : + self.l_cas.append(option) + + if not self.l_cas: + for cle in D_DATA: + self.l_cas.append(cle) + self.l_cas.sort() + + if self._verbose_max: + print ("Liste des cas : {}".format(self.l_cas)) + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def __del__(self): + """A la suppression de l'instance de classe""" + if self._verbose_max: + print ("Suppression de l'instance de la classe.") + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _add_file_in (self, objet_adapt): + """Ajout du fichier med d'entrée + +Entrées/Sorties : + :objet_adapt: l'objet du module + """ + if self._verbose_max: + print ("_add_file_in pour {}".format(self.nro_cas)) + + ficmed = os.path.join (REPDATA, "test_{}.med".format(D_DATA[self.nro_cas])) + if self._verbose_max: + print ("Fichier {}".format(ficmed)) + if not os.path.isfile(ficmed): + erreur = 1 + message = "Le fichier {} est inconnu.".format(ficmed) + else: + objet_adapt.setMEDFileIn(ficmed) + erreur = 0 + message = "" + + return erreur, message + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _add_file_out (self, objet_adapt): + """Ajout du fichier de sortie + +Entrées/Sorties : + :objet_adapt: l'objet du module + """ + if self._verbose_max: + print ("_add_file_out pour {}".format(self.nro_cas)) + + ficmed = os.path.join (REPDATA, "test_{}.adapt.tui.med".format(self.nro_cas)) + if os.path.isfile(ficmed): + os.remove(ficmed) + + objet_adapt.setMEDFileOut(ficmed) + + if self._verbose: + print (". Maillage adapté dans le fichier {}".format(ficmed)) + + return + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _add_file_bkg (self, objet_adapt): + """Ajout du fichier med de fond + +Entrées/Sorties : + :objet_adapt: l'objet du module + """ + if self._verbose_max: + print ("_add_file_bkg pour {}".format(self.nro_cas)) + + ficmed = os.path.join (REPDATA, "test_{}_bg.med".format(D_DATA[self.nro_cas])) + if self._verbose_max: + print ("Fichier {}".format(ficmed)) + if not os.path.isfile(ficmed): + erreur = 1 + message = "Le fichier {} est inconnu.".format(ficmed) + else: + objet_adapt.setMEDFileBackground(ficmed) + erreur = 0 + message = "" + + return erreur, message + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _hypo_creation (self, maptype, option, niveau=3): + """Création d'une hypothèse + +Entrées : + :maptype: type de carte : "Local", "Background", "Constant" + :option: nom du champ si "Local" ou "Background", valeur si "Constant" + :niveau: niveau de verbosité + +Sortie : + :hypo: l'objet hypothèse + """ + if self._verbose_max: + print ("_hypo_creation pour {} avec {}".format(maptype,option)) + + erreur = 0 + message = "" + + while not erreur : + + #--- Création de l'hypothèse --- + hypo = smesh.CreateAdaptationHypothesis() + + # Type de données + if ( maptype in ("Local", "Background", "Constant") ): + hypo.setSizeMapType(maptype) + else: + message = "Le type de carte {} est inconnu.".format(maptype) + erreur = 2 + break + + # Valeur + if ( maptype in ("Local", "Background") ): + hypo.setSizeMapFieldName(option) + else: + hypo.setConstantSize(option) + + # Verbosité + self._hypo_verbose (hypo, niveau) + + break + + return erreur, message, hypo +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _hypo_verbose (self, hypo, niveau=10): + """Débogage des hypothèses + +Entrées : + :niveau: niveau de verbosité + +Entrées/Sorties : + :hypo: l'objet hypothèse + """ + + hypo.setVerbosityLevel(niveau) + + if self._verbose_max: + + hypo.setPrintLogInFile(True) + hypo.setKeepWorkingFiles(True) + hypo.setRemoveOnSuccess(False) + + return +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _calcul (self, objet_adapt, hypo): + """Calcul + +Entrées : + :objet_adapt: l'objet du module + :hypo: l'objet hypothèse + """ + + #--- association de l'hypothese à l'objet de l'adaptation + objet_adapt.AddHypothesis(hypo) + + #-- Calcul + if self._verbose_max: + print (hypo.getCommandToRun()) + erreur = objet_adapt.Compute(False) + if erreur: + message = "Echec dans l'adaptation." + else: + message = "" + + return erreur, message + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _test_00 (self, objet_adapt): + """Test générique + +Entrées/Sorties : + :objet_adapt: l'objet du module + """ + + erreur = 0 + message = "" + + while not erreur : + + #--- les fichiers MED ---# + erreur, message = self._add_file_in (objet_adapt) + if erreur: + break + self._add_file_out (objet_adapt) + if self.nro_cas in ("02", "08"): + erreur, message = self._add_file_bkg (objet_adapt) + if erreur: + break + + #--- Création de l'hypothèse --- + if self.nro_cas in ("01", "04", "05", "06", "07", "10", "11", "13"): + maptype = "Local" + if self.nro_cas in ("01", "04", "05", "06", "07", "10"): + option = "TAILLE" + elif self.nro_cas in ("11",): + option = "Taille de maille" + elif self.nro_cas in ("13",): + option = "Elevation" + elif self.nro_cas in ("02", "08"): + maptype = "Background" + option = "TAILLE" + elif self.nro_cas in ("03",): + maptype = "Constant" + option = 0.5 + + if self._verbose: + niveau = 3 + elif self._verbose_max: + niveau = 10 + else: + niveau = 0 + erreur, message, hypo = self._hypo_creation(maptype, option, niveau) + if erreur: + break + + #-- Ajout des options + if self.nro_cas in ("04", "06", "07", "08", "10", "11"): + hypo.setTimeStepRankLast() + elif self.nro_cas in ("05",): + hypo.setTimeStepRank(1,1) + elif self.nro_cas in ("13",): + hypo.setTimeStepRank(0,0) + + # options facultatives + if self.nro_cas in ("03",): + hypo.setOptionValue("adaptation", "surface") + + #-- Calcul + try : + erreur, message = self._calcul (objet_adapt, hypo) + except : + erreur = 1871 + message = "Erreur dans le calcul par SMESH" + + break + + return erreur, message + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def _traitement_cas (self ): + """Traitement d'un cas + + +Sorties : + :erreur: code d'erreur + :message: message d'erreur + """ + + nom_fonction = __name__ + "/_traitement_cas" + blabla = "\nDans {} :".format(nom_fonction) + + if self._verbose_max: + print (blabla) + +# 1. Préalables + + erreur = 0 + message = "" + if self._verbose: + print ("Passage du cas '{}'".format(self.nro_cas)) + + if ( self.nro_cas in ("01", "02", "03", "04", "05", "06", "07", "08", "10" ,"11" ,"13") ): + objet_adapt = smesh.Adaptation('MG_Adapt') + erreur, message = self._test_00 (objet_adapt) + del objet_adapt + + else: + erreur = 1 + message = "Le cas '{}' est inconnu.".format(self.nro_cas) + + return erreur, message + +#=========================== Fin de la méthode ================================== + +#=========================== Début de la méthode ================================= + + def lancement (self): + + """Lancement + +Sorties : + :erreur: code d'erreur + :message: message d'erreur + """ + + nom_fonction = __name__ + "/lancement" + blabla = "\nDans {} :".format(nom_fonction) + + erreur = 0 + message = "" + + if self._verbose_max: + print (blabla) + + for nom_cas in self.l_cas: + self.nro_cas = nom_cas + erreur_t, message_t = self._traitement_cas () + if erreur_t: + erreur += 1 + message += "\nErreur n° {} pour le cas {} :\n".format(erreur_t,nom_cas) + message += message_t + + if ( erreur and self._verbose_max ): + print (blabla, message) + + return erreur, message + +#=========================== Fin de la méthode ================================== + +#========================== Fin de la classe ==================================== + +#================================================================================== +# Lancement +#================================================================================== + +if __name__ == "__main__" : + +# 1. Options + + L_OPTIONS = list() + #L_OPTIONS.append("-h") + #L_OPTIONS.append("-v") + #L_OPTIONS.append("-vmax") + L_OPTIONS.append("01") + L_OPTIONS.append("02") + L_OPTIONS.append("03") + L_OPTIONS.append("07") + L_OPTIONS.append("10") + L_OPTIONS.append("11") + L_OPTIONS.append("04") + L_OPTIONS.append("05") + L_OPTIONS.append("06") + L_OPTIONS.append("08") + #L_OPTIONS.append("13") + +# 2. Lancement de la classe + + #print ("L_OPTIONS :", L_OPTIONS) + MGADAPT_TEST = MGAdaptTest(L_OPTIONS) + if MGADAPT_TEST.affiche_aide_globale: + sys.stdout.write(MGADAPT_TEST.__doc__+"\n") + else: + ERREUR, MESSAGE_ERREUR = MGADAPT_TEST.lancement() + if ERREUR: + sys.stdout.write(MGADAPT_TEST.__doc__+"\n") + MESSAGE_ERREUR += "\n {} erreur(s)\n".format(ERREUR) + sys.stderr.write(MESSAGE_ERREUR) + #raise Exception(MESSAGE_ERREUR) + assert(False) + + del MGADAPT_TEST + + #sys.exit(0) diff --git a/doc/salome/examples/MGAdapt_med_files/test_01.med b/doc/salome/examples/MGAdapt_med_files/test_01.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_02.med b/doc/salome/examples/MGAdapt_med_files/test_02.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_02_bg.med b/doc/salome/examples/MGAdapt_med_files/test_02_bg.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_04.med b/doc/salome/examples/MGAdapt_med_files/test_04.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_06.med b/doc/salome/examples/MGAdapt_med_files/test_06.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_07.med b/doc/salome/examples/MGAdapt_med_files/test_07.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_08.med b/doc/salome/examples/MGAdapt_med_files/test_08.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_08_bg.med b/doc/salome/examples/MGAdapt_med_files/test_08_bg.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_10.med b/doc/salome/examples/MGAdapt_med_files/test_10.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_11.med b/doc/salome/examples/MGAdapt_med_files/test_11.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/MGAdapt_med_files/test_13.med b/doc/salome/examples/MGAdapt_med_files/test_13.med new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/examples/tests.set b/doc/salome/examples/tests.set index 89f21a798..02ffd1e76 100644 --- a/doc/salome/examples/tests.set +++ b/doc/salome/examples/tests.set @@ -45,6 +45,7 @@ SET(BAD_TESTS radial_prism_3d_algo.py test_smeshplugin_mg_tetra_parallele.py test_smeshplugins.py + MGAdaptTests_without_session.py ) SET(GOOD_TESTS diff --git a/doc/salome/gui/SMESH/images/adaptation_01.png b/doc/salome/gui/SMESH/images/adaptation_01.png new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/gui/SMESH/images/adaptation_02.png b/doc/salome/gui/SMESH/images/adaptation_02.png new file mode 100644 index 000000000..e69de29bb diff --git a/doc/salome/gui/SMESH/input/adaptation.rst b/doc/salome/gui/SMESH/input/adaptation.rst new file mode 100644 index 000000000..624851d75 --- /dev/null +++ b/doc/salome/gui/SMESH/input/adaptation.rst @@ -0,0 +1,38 @@ +.. _adaptation_page: + +********** +Adaptation +********** + +Mesh module provides the possibility to perform different adaptations of a mesh. + +.. note:: + A mesh adaptation based on splitting is available by the HOMARD module. + +.. _mg_adapt_anchor: + +MG_Adapt +######## + +For meshes made of triangles and/or tetrahedra, remeshing operations are available with the MG-Adapt plugin. The remeshing is based on wanted mesh sizes defined over the mesh or as a constant. The boundaries are dedeuced from the initial mesh. + +To start **Remeshing** operation, select **MG Adapt** tab in **Adaptation** dialog. + +.. image:: ../images/adaptation_01.png + :align: center + + +* **Mesh In** is the initial mesh to remesh. +* **Mesh Out** is the resulting mesh after remeshing. By default, the name of the initial mesh is kept and the file name is based on the name of the initial mesh. +* **Size map definition** is a choice between **Local**, **Background** and **Constant**. + +- If the choice is **Background**, the name of the MED file must be given. +- If the choice is **Local** or **Background**, the name of the field must be selected from the list, together with time step. + +.. image:: ../images/adaptation_02.png + :align: center + +.. note:: + The exhaustive description of MG-Adapt can be read into its documentation. It can be reached by the general help button. + +**See Also** a sample TUI Script of :ref:`tui_adaptation_page`. diff --git a/doc/salome/gui/SMESH/input/index.rst b/doc/salome/gui/SMESH/input/index.rst index c6a2ade37..fcd97b7b8 100644 --- a/doc/salome/gui/SMESH/input/index.rst +++ b/doc/salome/gui/SMESH/input/index.rst @@ -14,15 +14,16 @@ Introduction to Mesh module * :ref:`creating meshes ` in different ways: - * by meshing geometrical models previously created or imported by the Geometry component; + * by meshing geometrical models previously created or imported by the Geometry component; * bottom-up, using :ref:`mesh edition `, especially :ref:`extrusion ` and :ref:`revolution `; - * by generation of the 3D mesh from the 2D mesh not based on the geometry (:ref:`imported ` for example); - + * by generation of the 3D mesh from the 2D mesh not based on the geometry (:ref:`imported ` for example); + * :ref:`importing and exporting meshes ` in various formats; -* :ref:`modifying meshes ` with a vast array of dedicated operations; +* :ref:`modifying meshes ` with a vast array of dedicated operations; * :ref:`creating groups ` of mesh elements; * filtering mesh entities (nodes or elements) using :ref:`Filters ` functionality for :ref:`creating groups ` and applying :ref:`mesh modifications `; * :ref:`viewing meshes ` in the VTK viewer and :ref:`getting info ` on mesh and its sub-objects; +* :ref:`remeshing meshes `; * applying to meshes :ref:`Quality Controls `, allowing to highlight important elements; * taking various :ref:`measurements ` of the mesh objects. @@ -35,7 +36,7 @@ It is possible to use the variables predefined in :ref:`Salome notebook ` (generate mesh nodes and elements): .. code-block:: python mesh.Compute() An easiest way to start with Python scripting is to do something in -GUI and then to get a corresponding Python script via +GUI and then to get a corresponding Python script via **File > Dump Study** menu item. Don't forget that you can get all methods of any object in hand (e.g. a mesh group or a hypothesis) by calling *dir()* Python built-in function. @@ -95,6 +95,7 @@ the following links: tui_transforming_meshes tui_viewing_meshes tui_quality_controls + tui_adaptation tui_measurements tui_work_on_objects_from_gui tui_notebook_smesh diff --git a/doc/salome/gui/SMESH/input/tui_adaptation.rst b/doc/salome/gui/SMESH/input/tui_adaptation.rst new file mode 100644 index 000000000..7db15c66a --- /dev/null +++ b/doc/salome/gui/SMESH/input/tui_adaptation.rst @@ -0,0 +1,18 @@ +.. _tui_adaptation_page: + +********** +Adaptation +********** + +.. _tui_mg_adapt: + +MG_Adapt +======== + +.. literalinclude:: ../../../examples/adaptation_ex01.py + :language: python + +:download:`Download this script <../../../examples/adaptation_ex01.py>` + + +**See Also** the GUI :ref:`adaptation_page`. diff --git a/idl/CMakeLists.txt b/idl/CMakeLists.txt index 7ab17aef9..6387eb741 100644 --- a/idl/CMakeLists.txt +++ b/idl/CMakeLists.txt @@ -36,6 +36,7 @@ SET(SalomeIDLSMESH_IDLSOURCES SMESH_Pattern.idl SMESH_MeshEditor.idl SMESH_Measurements.idl + MG_ADAPT.idl ) SET(_idl_include_dirs diff --git a/idl/MG_ADAPT.idl b/idl/MG_ADAPT.idl new file mode 100644 index 000000000..7608ab67a --- /dev/null +++ b/idl/MG_ADAPT.idl @@ -0,0 +1,152 @@ +// 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_IDL +#define MG_ADAPT_IDL + +#include "SALOME_Component.idl" +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" +#include "SALOMEDS.idl" +#include "SMESH_Mesh.idl" + +module SMESH{ + + typedef sequence str_array ; + struct MgAdaptHypothesisData + { + string myFileInDir, myMeshFileIn, myInMeshName, myMeshFileBackground, myOutMeshName, + myMeshFileOut, myFileOutDir, myFileSizeMapDir, myFieldName; + boolean fromMedFile; + boolean myPublish, myMeshOutMed; + boolean myUseLocalMap, myUseBackgroundMap, myUseConstantValue; + double myConstantValue; + long myRank, myTimeStep; + boolean myUseNoTimeStep, myUseLastTimeStep, myUseChosenTimeStep; + string myWorkingDir, myLogFile; + boolean myPrintLogInFile, myKeepFiles, myRemoveLogOnSuccess; + long myVerboseLevel; + }; + + + interface MG_ADAPT : SALOME::GenericObj + { + //MG_ADAPT CreateMG_ADAPT(in PortableServer::POA_var poa); + void setData( inout MgAdaptHypothesisData data); + + void setMedFileIn(in string MedFileIn ); + string getMedFileIn(); + + void setMedFileOut(in string MedFileOut); + string getMedFileOut(); + + void setMeshName(in string s); + string getMeshName(); + + void setMeshNameOut(in string s); + string getMeshNameOut(); + + void setMeshOutMed(in boolean b); + boolean getMeshOutMed(); + + void setPublish(in boolean b); + boolean getPublish(); + + void setSizeMapFieldName(in string s); + string getSizeMapFieldName(); + + void setTimeStep(in long s); + long getTimeStep() ; + + void setTimeStepRank(in long s, in long f); + long getRank(); + + void setTimeStepRankLast(); + void setNoTimeStep(); + + void setLogFile(in string f); + string getLogFile(); + + void setVerbosityLevel(in long f); + long getVerbosityLevel(); + + void setRemoveOnSuccess(in boolean f); + boolean getRemoveOnSuccess(); + + MgAdaptHypothesisData getData(); + + void setUseLocalMap(in boolean f); + boolean getUseLocalMap(); + + void setUseBackgroundMap(in boolean f); + boolean getUseBackgroundMap(); + + void setUseConstantValue(in boolean f); + boolean getUseConstantValue(); + + void setConstantSize(in double f); + double getConstantSize() ; + + void setSizeMapFile(in string f); + string getSizeMapFile(); + + void setFromMedFile(in boolean f); + boolean isFromMedFile(); + + void setKeepWorkingFiles(in boolean f); + boolean getKeepWorkingFiles(); + + void setPrintLogInFile(in boolean f); + boolean getPrintLogInFile(); + + void setWorkingDir(in string f); + string getWorkingDir() ; + + void setSizeMapType(in string f); + boolean setAll(); + string getCommandToRun() ; + void compute() raises(SALOME::SALOME_Exception); + string getErrMsg(); + string getFileName() ; + string getExeName(); + void copyMgAdaptHypothesisData(in MgAdaptHypothesisData f ) ; + + //void checkDirPath(inout string f); + + boolean hasOptionDefined( in string optionName ) ; + void setOptionValue(in string optionName, in string optionValue) raises (SALOME::SALOME_Exception); + string getOptionValue(in string optionName, inout boolean isDefault) raises (SALOME::SALOME_Exception); + str_array getCustomOptionValuesStrVec() ; + str_array getOptionValuesStrVec() ; + }; + + typedef MG_ADAPT MG_ADAPT_HYPOTHESIS; + interface MG_ADAPT_OBJECT : SALOME::GenericObj + { + void setMeshIn(in SMESH_Mesh theMesh ) raises (SALOME::SALOME_Exception); + void setMEDFileIn(in string f) raises (SALOME::SALOME_Exception); + void setMEDFileOut(in string f) raises (SALOME::SALOME_Exception); + void setMEDFileBackground(in string f) raises (SALOME::SALOME_Exception); + void AddHypothesis(in MG_ADAPT mg) raises (SALOME::SALOME_Exception); + long Compute(in boolean Publish) raises (SALOME::SALOME_Exception); + }; + +}; +#endif // MG_ADAPT_IDL diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index a7e4c5094..52295a43b 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -43,6 +43,8 @@ module SMESH interface FilterManager; interface SMESH_Pattern; interface Measurements; + interface MG_ADAPT; + interface MG_ADAPT_OBJECT; /*! * Tags definition @@ -136,7 +138,6 @@ module SMESH SMESH_Pattern GetPattern(); Measurements CreateMeasurements(); - /*! Set the current mode */ @@ -584,7 +585,10 @@ module SMESH in GEOM::GEOM_Object theGeom, in double theTolerance ); - + + MG_ADAPT CreateMG_ADAPT(); + MG_ADAPT_OBJECT Adaptation(in string adaptType); + MG_ADAPT CreateAdaptationHypothesis(); }; }; diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 05688ce81..3d9bae667 100644 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -22,6 +22,7 @@ SET(SMESH_RESOURCES_FILES ModuleMesh.png + adapt_mg_adapt.png advanced_mesh_info.png bare_border_face.png bare_border_volume.png diff --git a/resources/SalomeApp.xml.in b/resources/SalomeApp.xml.in index c69c4b578..c11851f4f 100644 --- a/resources/SalomeApp.xml.in +++ b/resources/SalomeApp.xml.in @@ -98,6 +98,11 @@ + + + + +
@@ -106,6 +111,9 @@ + + + diff --git a/resources/adapt_mg_adapt.png b/resources/adapt_mg_adapt.png new file mode 100644 index 000000000..e69de29bb diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6e74f5b56..69ec0d051 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,7 +51,7 @@ ENDIF(SALOME_SMESH_ENABLE_MEFISTO) # CGNS ## IF(SALOME_SMESH_USE_CGNS) - SET(SUBDIRS_CGNS + SET(SUBDIRS_CGNS DriverCGNS ) ENDIF(SALOME_SMESH_USE_CGNS) @@ -60,9 +60,9 @@ ENDIF(SALOME_SMESH_USE_CGNS) # GUI ## IF(SALOME_BUILD_GUI) - SET(SUBDIRS_GUI OBJECT - SMESHFiltersSelection - SMESHGUI + SET(SUBDIRS_GUI OBJECT + SMESHFiltersSelection + SMESHGUI PluginUtils SMESH_SWIG_WITHIHM StdMeshersGUI diff --git a/src/SMESH/CMakeLists.txt b/src/SMESH/CMakeLists.txt index 129ec5c41..55b8da584 100644 --- a/src/SMESH/CMakeLists.txt +++ b/src/SMESH/CMakeLists.txt @@ -38,6 +38,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/SMDS ${PROJECT_SOURCE_DIR}/src/SMESHDS ${PROJECT_SOURCE_DIR}/src/SMESHUtils + ${MEDCOUPLING_INCLUDE_DIRS} ) # additional preprocessor / compiler flags @@ -67,6 +68,7 @@ SET(_link_LIBRARIES MeshDriverUNV MeshDriverGMF ${DriverCGNS_LIB} + ${MEDCoupling_medloader} ) # --- headers --- @@ -86,6 +88,7 @@ SET(SMESHimpl_HEADERS SMESH_MesherHelper.hxx SMESH_ProxyMesh.hxx SMESH_SMESH.hxx + MG_ADAPT.hxx ) # --- sources --- @@ -104,6 +107,7 @@ SET(SMESHimpl_SOURCES SMESH_HypoFilter.cxx SMESH_ProxyMesh.cxx SMESH_MesherHelper.cxx + MG_ADAPT.cxx ) # --- rules --- diff --git a/src/SMESH/MG_ADAPT.cxx b/src/SMESH/MG_ADAPT.cxx new file mode 100644 index 000000000..f0accd50d --- /dev/null +++ b/src/SMESH/MG_ADAPT.cxx @@ -0,0 +1,1575 @@ +// 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_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 "Utils_CorbaException.hxx" + +#include +#include +#include +#include +#include +#include +#include + +using namespace MG_ADAPT; +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; +} +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); +} +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) +{ + if ( isFileExist(fileName) ) + { + medFileIn = fileName; + + if (medFileOut == "") // default MED file Out + medFileOut = remove_extension( fileName )+ ".adapt.med"; + } + else + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "\nThe file " + fileName + " does not exist.\n" ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } +} + +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::setTimeStepRankLast() +{ + myUseLastTimeStep = true; + myUseChosenTimeStep = false; + myUseNoTimeStep = false; + //~med_int aRank, tmst; + //~std::string fieldFile = useBackgroundMap ? sizeMapFile : medFileIn; + //~getTimeStepInfos(fieldFile, tmst, aRank); + //~setRankTimeStep((int) tmst, (int) aRank); +} +void MgAdapt::setNoTimeStep() +{ + myUseLastTimeStep = false; + myUseChosenTimeStep = false; + myUseNoTimeStep = true; + //~int aRank = (int)MED_NO_IT; + //~int tmst = (int)MED_NO_DT ; + //~setRankTimeStep(tmst, aRank); +} +void MgAdapt::setChosenTimeStepRank() +{ + myUseLastTimeStep = false; + myUseChosenTimeStep = true; + myUseNoTimeStep = false; + //~int aRank = (int)MED_NO_IT; + //~int tmst = (int)MED_NO_DT ; + //~setRankTimeStep(tmst, aRank); +} +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) +{ + if ( mapFile == "" || isFileExist(mapFile) ) + { + sizeMapFile = mapFile; + } + else + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "\nThe file " + mapFile + " does not exist.\n" ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } +} +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); + if (data->myUseNoTimeStep) + setNoTimeStep(); + else if (data->myUseLastTimeStep) + setTimeStepRankLast(); + else + { + setChosenTimeStepRank(); + setRankTimeStep(data->myTimeStep, data->myRank); + } + /* 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) +{ +// INFOS("setOptionValue"); +// std::cout << "optionName: " << optionName << ", optionValue: " << optionValue << std::endl; + 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 ); +// std::cout << "==> value: " << value << std::endl; + if ( _defaultOptionValues[ optionName ] == value ) value.clear(); + +// std::cout << "==> value: " << value << std::endl; + 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) +{ +// INFOS("getOptionValue"); +// std::cout << "optionName: " << optionName << ", isDefault: " << isDefault << std::endl; + 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; + } +// std::cout << "==> val: " << val << std::endl; + + 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(); +// std::cout << cmd << std::endl; + + 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(""); + updateTimeStepRank(); + 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"; + tmpFilesToBeDeleted.push_back(meshFormatOutputMesh); + 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 + //~} + // Check coherence between mesh dimension and option fo adaptation + checkDimensionOptionAdaptation(); + +// sizemap file is written only if level is higher than 3 + if ( verbosityLevel > 3) + { + std::string solFileOut = getFileName()+".sol"; + cmd+= " --write_sizemap "+ solFileOut; + solFormatOutput.push_back(solFileOut); + tmpFilesToBeDeleted.push_back(solFileOut); + } + + 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 += " "; +// std::cout << "--- option: '" << option << ", value: '" << value <<"'"<< std::endl; + cmd += option + " " + value; + } + } + + // Verbosity Level + if (verbosityLevel != defaultVerboseLevel()) + { + cmd+= " --verbose "+ ToComment(verbosityLevel); + } + //~} +//~cmd+= " >" +#ifdef WIN32 + cmd += " < NUL"; +#endif +// std::cout << "--- cmd :"<< std::endl; +// std::cout << cmd << std::endl; + + return cmd; +} + +bool MgAdapt::isFileExist(const std::string& fName) +{ + + 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( const 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; +} + +std::vector MgAdapt::getListFieldsNames(std::string fileIn) +{ + MEDCoupling::MCAuto mfd = MEDCoupling::MEDFileData::New(fileIn); + std::vector listFieldsNames(mfd->getFields()->getFieldsNames()); + return listFieldsNames ; +} + +void MgAdapt::checkDimensionOptionAdaptation() +{ + // Quand le maillage est 3D, tout est possible + // Quand le maillage est 2D, il faut 'surface' sauf si carte de fonds 3D + MEDCoupling::MCAuto mfd = MEDCoupling::MEDFileData::New(medFileIn); + int meshdim = mfd->getMeshes()->getMeshAtPos(0)->getMeshDimension() ; +// std::cout << "meshdim = " << meshdim << std::endl; + + if ( meshdim == 2 ) + { + std::string optionName = "adaptation"; + std::string optionValue = getOptionValue(optionName); +// std::cout << "optionValue = '" << optionValue <<"'"<< std::endl; + bool a_tester = false ; + // carte locale ou constante : impératif d'avoir "surface" + if ( useLocalMap || useConstantValue) a_tester = true ; + // carte de fond : impératif d'avoir "surface" si le fonds est aussi 2D + else + { + MEDCoupling::MCAuto mfdbg = MEDCoupling::MEDFileData::New(sizeMapFile); + int meshdimbg = mfdbg->getMeshes()->getMeshAtPos(0)->getMeshDimension() ; +// std::cout << "meshdimbg = " << meshdimbg << std::endl; + if ( meshdimbg == 2 ) a_tester = true ; + } + if ( a_tester ) + { + if ( optionValue == "" ) setOptionValue (optionName, "surface"); + else + { + if ( optionValue != "surface" ) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "Mesh dimension is 2; the option should be 'surface' instead of '" + optionValue + "'." ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + } + } + } +} + +void MgAdapt::checkFieldName(std::string fileIn) +{ + bool ret = false ; + std::vector listFieldsNames = getListFieldsNames(fileIn); + std::size_t jaux(listFieldsNames.size()); + for(std::size_t j=0;j mfd = MEDCoupling::MEDFileData::New(fileIn); + MEDCoupling::MCAuto fts( mfd->getFields()->getFieldWithName(fieldName) ); + std::vector timevalue; + std::vector< std::pair > timesteprank = fts->getTimeSteps(timevalue); + std::size_t jaux(timesteprank.size()); + for(std::size_t j=0;j 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! + if (meshNameOut =="") + meshNameOut = fileMesh->getName(); + storeGroupsAndFams(fileMesh); + + MEDCoupling::MCAuto fields = MEDCoupling::MEDFileFields::New(); + solFormatFieldFileName = getFileName(); + solFormatFieldFileName+=".sol"; + fieldFileNames.push_back(solFormatFieldFileName); + + if (useBackgroundMap) + { + checkFieldName(sizeMapFile) ; + checkTimeStepRank(sizeMapFile) ; + meshFormatsizeMapFile = getFileName(); + meshFormatsizeMapFile += ".mesh"; + buildBackGroundMeshAndSolFiles(fieldFileNames, meshFormatsizeMapFile); + } + else if(useLocalMap) + { + checkFieldName(medFileIn) ; + checkTimeStepRank(medFileIn) ; + MEDCoupling::MCAuto fts( 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 // + { + 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::MCAuto fts( tmpFields->getFieldWithName(fieldName) ); + MEDCoupling::MCAuto fts1 = MEDCoupling::DynamicCastSafe(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) + { + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + std::string text = "\nThe med file " + aFile + " cannot be opened.\n" ; + es.text = CORBA::string_dup(text.c_str()); + throw SALOME::SALOME_Exception(es); + } + 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); + +} + +void MgAdapt::updateTimeStepRank() +{ + + med_int arank; + med_int tmst; + if (myUseNoTimeStep) + { + arank = MED_NO_IT; + tmst = MED_NO_DT ; + setRankTimeStep((int)tmst, (int)arank); + } + else if (myUseLastTimeStep) + { + std::string fieldFile = useBackgroundMap ? sizeMapFile : medFileIn; + getTimeStepInfos(fieldFile, tmst, arank); + setRankTimeStep((int)tmst, (int)arank); + } +} diff --git a/src/SMESH/MG_ADAPT.hxx b/src/SMESH/MG_ADAPT.hxx new file mode 100644 index 000000000..ba128314b --- /dev/null +++ b/src/SMESH/MG_ADAPT.hxx @@ -0,0 +1,340 @@ +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : 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 +std::string remove_extension(const std::string& filename); +namespace MG_ADAPT{ +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* data); + + 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 setTimeStepRankLast(); + void setNoTimeStep(); + void setChosenTimeStepRank(); + void updateTimeStepRank(); + + 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( const 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(); + static bool isFileExist(const std::string& fName); + + 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; + bool myUseLastTimeStep, myUseNoTimeStep, myUseChosenTimeStep; + 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) ; + void execCmd( const char* cmd, int& err); + void cleanUp(); + void appendMsgToLogFile(std::string& msg); + std::vector getListFieldsNames(std::string fileIn) ; + void checkDimensionOptionAdaptation() ; + void checkFieldName(std::string fileIn) ; + void checkTimeStepRank(std::string fileIn) ; + +}; + +} + +#endif // MG_ADAPT_HXX diff --git a/src/SMESHGUI/CMakeLists.txt b/src/SMESHGUI/CMakeLists.txt index af116da9f..4f50dbc8e 100644 --- a/src/SMESHGUI/CMakeLists.txt +++ b/src/SMESHGUI/CMakeLists.txt @@ -45,6 +45,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/SMESH_I ${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/idl + ${MEDCOUPLING_INCLUDE_DIRS} ) # additional preprocessor / compiler flags @@ -75,6 +76,7 @@ SET(_link_LIBRARIES SMESHControls SMESHObject SMESHEngine + ${MEDCoupling_medloader} ) # --- headers --- @@ -147,6 +149,9 @@ SET(_moc_HEADERS SMESHGUI_SplitBiQuad.h SMESHGUI_IdPreview.h SMESHGUI_PreVisualObj.h + SMESHGUI_AdaptDlg.h + SMESHGUI_MG_ADAPTDRIVER.h + MG_ADAPTGUI.hxx # to replace in ../ADAPTGUI/ ) # header files / no moc processing @@ -169,6 +174,7 @@ SET(_other_HEADERS SMESHGUI_FileValidator.h SMESHGUI_SelectionProxy.h SMESH_SMESHGUI.hxx + #~MG_ADAPT.hxx # to replace in ../ADAPT/ ) # header files / to install @@ -262,6 +268,10 @@ SET(_other_SOURCES SMESHGUI_SplitBiQuad.cxx SMESHGUI_PreVisualObj.cxx SMESHGUI_IdPreview.cxx + SMESHGUI_AdaptDlg.cxx + SMESHGUI_MG_ADAPTDRIVER.cxx + MG_ADAPTGUI.cxx # to replace in ../ADAPTGUI/ + #MG_ADAPT.cxx ) # sources / to compile @@ -275,7 +285,7 @@ SET(_ts_RESOURCES SMESH_msg_en.ts SMESH_msg_fr.ts SMESH_msg_ja.ts -) +) # --- rules --- diff --git a/src/SMESHGUI/MG_ADAPTGUI.cxx b/src/SMESHGUI/MG_ADAPTGUI.cxx new file mode 100644 index 000000000..b8ee3c879 --- /dev/null +++ b/src/SMESHGUI/MG_ADAPTGUI.cxx @@ -0,0 +1,1365 @@ +// 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 "MEDFileData.hxx" +#include "MEDLoader.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 +#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, SMESH::MG_ADAPT_ptr myModel, QWidget* parent, bool isCreation ) + : mySMESHGUI( theModule ), QDialog(parent) +{ + //~model = new MgAdapt(*myModel); + model = SMESH::MG_ADAPT::_duplicate(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 ); + SMESH::str_array* str = model->getOptionValuesStrVec(); + SMESH::str_array* str2 = model->getCustomOptionValuesStrVec(); + std::vector s; + for (int i = 0; i< str->length(); i++) s.push_back( (*str)[i].in()); + for (int j = str->length(); j< str2->length(); j++) s.push_back((*str2)[ j - str->length() ].in() ); + //~str.insert( str.end(), str2.begin(), str2.end() ); + + myAdvOpt = new MgAdaptAdvWidget(myTabWidget, &s); + + 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* buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), this); + buttonOk->setAutoDefault(false); + QPushButton* buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), this); + buttonApply->setAutoDefault(false); + QPushButton* buttonCancel = new QPushButton( tr( "SMESH_BUT_CANCEL" ), this ); + buttonCancel->setAutoDefault( false ); + QPushButton* buttonHelp = new QPushButton( tr( "SMESH_BUT_HELP" ), this ); + buttonHelp->setAutoDefault( false ); + + QHBoxLayout* btnLayout = new QHBoxLayout; + btnLayout->setSpacing( SPACING ); + btnLayout->setMargin( 0 ); + btnLayout->addWidget( buttonOk ); + btnLayout->addStretch( 10 ); + btnLayout->addWidget( buttonApply ); + btnLayout->addStretch( 10 ); + btnLayout->addWidget( buttonCancel ); + btnLayout->addStretch( 10 ); + btnLayout->addWidget( buttonHelp ); + + QVBoxLayout* l = new QVBoxLayout ( this ); + l->setMargin( MARGIN ); + l->setSpacing( SPACING ); + l->addWidget( myTabWidget ); + l->addStretch(); + l->addLayout( btnLayout ); + + connect( buttonOk, SIGNAL(pressed()), this, SLOT(PushOnOK())); + connect( buttonApply, SIGNAL(pressed()), this, SLOT(PushOnApply())); + connect( buttonCancel, SIGNAL(pressed()), this, SLOT(close())); + connect( buttonHelp, SIGNAL(pressed()), this, SLOT(PushOnHelp())); + + 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; +//~} +SMESH::MG_ADAPT_ptr SMESHGUI_MgAdaptDlg::getModel() const +{ + return model; +} +/*! +\brief Perform clean-up actions on the dialog box closing. +*/ +bool SMESHGUI_MgAdaptDlg::PushOnApply() +{ + bool ret = readParamsFromWidgets(); + return ret; +} +void SMESHGUI_MgAdaptDlg::PushOnOK() +{ + bool ret = PushOnApply(); + if ( ret ) 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) ; + myArgs->selectMedFileLineEdit->setText(QString(myData->myMeshFileIn)) ; + // myData->myInMeshName = // TODO + + } + else + { + myArgs->aBrowserObject->setText(QString(myData->myInMeshName)); + //~ myArgs->myFileInDir =""; // TODO + //~ myArgs->selectMedFileLineEdit->setText(); // TODO + } + myArgs->meshNameLineEdit->setText(QString(myData->myOutMeshName)); + myArgs->medFileCheckBox->setChecked(myData->myMeshOutMed); + + if(myData->myMeshOutMed) + { + *(myArgs->myFileOutDir) = QString(myData->myFileOutDir); + myArgs->selectOutMedFileLineEdit->setText(QString(myData->myMeshFileOut)); + } + 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) ; + myArgs->selectMedFileBackgroundLineEdit->setText(QString(myData->myMeshFileBackground)); + } + else + { + *(myArgs->myFileSizeMapDir) = QString("") ; //TODO + myArgs->selectMedFileBackgroundLineEdit->setText(""); //TODO + } + + myArgs->fieldNameCmb->setCurrentText(QString(myData->myFieldName)); + 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(QString(myData->myWorkingDir)); + 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() +{ + MESSAGE ("readParamsFromWidgets") ; + bool ret = true ; + SMESH::MgAdaptHypothesisData* aData = new SMESH::MgAdaptHypothesisData(); + while ( ret ) + { + // 1. Fichier du maillage de départ + aData->fromMedFile = myArgs->aMedfile->isChecked(); + if (aData->fromMedFile) + { + aData->myFileInDir = CORBA::string_dup(myArgs->myFileInDir->toStdString().c_str()); + aData->myMeshFileIn = CORBA::string_dup(myArgs->selectMedFileLineEdit->text().toStdString().c_str()); + // aData->myInMeshName = // TODO + } + else // TODO browser + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_4") ); + ret = false ; + break ; + // aData->myInMeshName = CORBA::string_dup(myArgs->aBrowserObject->text().toStdString().c_str()); + // aData->myFileInDir = CORBA::string_dup(myAdvOpt->workingDirectoryLineEdit->text().toStdString().c_str()); + // + // TCollection_AsciiString aGenericName = (char*)aData->myFileInDir; + // 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(); + } + // 2. Fichier du maillage de sortie + aData->myOutMeshName = CORBA::string_dup(myArgs->meshNameLineEdit->text().toStdString().c_str()); + aData->myMeshOutMed = myArgs->medFileCheckBox->isChecked(); + if(aData->myMeshOutMed) + { + aData->myFileOutDir = CORBA::string_dup(myArgs->myFileOutDir->toStdString().c_str()); + aData->myMeshFileOut = CORBA::string_dup(myArgs->selectOutMedFileLineEdit->text().toStdString().c_str()); + } + else + { + aData->myMeshFileOut = ""; + } + aData->myPublish = myArgs->publishOut->isChecked(); + + // 3. Type de carte de tailles + aData->myUseLocalMap = myArgs->localButton->isChecked(); + aData->myUseBackgroundMap = myArgs->backgroundButton->isChecked(); + aData->myUseConstantValue = myArgs->constantButton->isChecked(); + // 3.1. Constante + if (aData->myUseConstantValue) + { + aData->myConstantValue = myArgs->dvalue->value(); + } + else + { + aData->myConstantValue = 0.0; + } + // 3.2. Arrière-plan + if (aData->myUseBackgroundMap) + { + aData->myFileSizeMapDir = CORBA::string_dup(myArgs->myFileSizeMapDir->toStdString().c_str()); + aData->myMeshFileBackground = CORBA::string_dup(myArgs->selectMedFileBackgroundLineEdit->text().toStdString().c_str()); + } + else + { + aData->myMeshFileBackground = ""; + } + + // 4. Le champ + if ( ! aData->myUseConstantValue ) + { + if ( strlen(myArgs->fieldNameCmb->currentText().toStdString().c_str()) == 0 ) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_5") ); + ret = false ; + break ; + } + { + aData->myFieldName = CORBA::string_dup(myArgs->fieldNameCmb->currentText().toStdString().c_str()); + 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(); + } + } + } + + // 5. Options avancées + aData->myWorkingDir = CORBA::string_dup(myAdvOpt->workingDirectoryLineEdit->text().toStdString().c_str()); + 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); + break ; + } + + delete aData; + + return ret; +} +bool SMESHGUI_MgAdaptDlg::storeParamsToHypo( const SMESH::MgAdaptHypothesisData& ) const +{ +} +/*! + \brief Show help page +*/ +void SMESHGUI_MgAdaptDlg::PushOnHelp() +{ +// 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( "NO_PERMISSION" ) ); + 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; + meshDimBG = 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("...", 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); + visibleTimeStepRankLabel (false); + + // 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); + + visibleTimeStepRankLabel (false); + rankSpinBox->setValue(-2); + timeStep->setValue(-2); + + lastTimeStep->setDisabled(disableOther); + chosenTimeStep->setDisabled(disableOther); +} +void SMESHGUI_MgAdaptArguments::onLastTimeStep(bool disableOther) +{ + lastTimeStep->setChecked(true); + + visibleTimeStepRankLabel (false); + rankSpinBox->setValue(-1); + timeStep->setValue(-1); + noTimeStep->setDisabled(disableOther); +} +void SMESHGUI_MgAdaptArguments::onChosenTimeStep(bool disableOther, int vmax) +{ + chosenTimeStep->setChecked(true); + + visibleTimeStepRankLabel (true); + rankSpinBox->setValue(-1); + timeStep->setValue(-1); + if (vmax) timeStep->setMaximum(vmax); +} + +void SMESHGUI_MgAdaptArguments::visibleTimeStepRankLabel(bool visible) +{ + rankLabel->setVisible(visible); + rankSpinBox->setVisible(visible); + + timeStepLabel->setVisible(visible); + timeStep->setVisible(visible); +} + +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, false); + } + // Dimension du maillage de fonds + MEDCoupling::MCAuto mfd = MEDCoupling::MEDFileData::New(fileName.toStdString()); + meshDimBG = mfd->getMeshes()->getMeshAtPos(0)->getMeshDimension() ; + valueAdaptation (); + } + } + 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); + valueAdaptation (); +// 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::valueAdaptation() +{ + ADAPTATION_MODE aMode ; + if ( meshDimBG < 3 ) + { + aMode = meshDim == 3 ? ADAPTATION_MODE::BOTH : ADAPTATION_MODE::SURFACE; + } + else + { + aMode = ADAPTATION_MODE::BOTH; + } + emit meshDimSignal(aMode); +} + +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)); + // Je ne comprends pas le rapport entre pas de temps et apparition d'un nouveau champ... GN + int typeStepInField = it->second > 2 ? 2 : it->second ; +// std::cout << "SMESHGUI_MgAdaptArguments::onLocalSelected typeStepInField : " << typeStepInField << std::endl; + timeStepGroupChanged(typeStepInField, false); + } + } +} +// ======================================================================= +// 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); + } + meshDimBG = 0; + valueAdaptation(); +} +void SMESHGUI_MgAdaptArguments::timeStepGroupChanged(int timeStepType, bool disableOther, int vmax) +{ + switch (timeStepType) + { + case 0 : + onNoTimeStep(disableOther); + break; + case 1 : + onLastTimeStep(disableOther); + break; + case 2 : + onChosenTimeStep(disableOther, vmax); + 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->setText(QApplication::translate("SMESH_AdvOptionsWdg", "ADD_OPTION_BTN", Q_NULLPTR)); + 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); + +} +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 and no 3D backgrounmesh-->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 ); +} + +// ====================================================== +// ======================================================== +QString lireNomMaillage(QString aFile, med_int& meshdim) +{ + QString nomMaillage = QString::null ; + + while ( true ) + { + std::vector listMeshesNames = MEDCoupling::GetMeshNames(aFile.toStdString()); + + std::size_t numberOfMeshes(listMeshesNames.size()); + // std::cout << "numberOfMeshes:" << numberOfMeshes << std::endl; + if (numberOfMeshes == 0 ) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_2") ); + break ; + } + if (numberOfMeshes > 1 ) + { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("MG_ADAPT_MED_FILE_3") ); + break ; + } + +// std::cout << "nomMaillage:" << listMeshesNames[0] << std::endl; + nomMaillage = QString(listMeshesNames[0].c_str()); + + // Dimension du maillage + MEDCoupling::MCAuto mfd = MEDCoupling::MEDFileData::New(aFile.toStdString()); + meshdim = mfd->getMeshes()->getMeshAtPos(0)->getMeshDimension() ; +// std::cout << "meshdim:" << meshdim << std::endl; + + break ; + } + + return nomMaillage; +} + +// ======================================================================= +std::map GetListeChamps(QString aFile, bool errorMessage) +// ======================================================================= +{ +// Il faut voir si plusieurs maillages + + std::map ListeChamp ; + + while ( true ) + { + MEDCoupling::MCAuto mfd = MEDCoupling::MEDFileData::New(aFile.toStdString()); + std::vector listFieldsNames(mfd->getFields()->getFieldsNames()); + std::size_t jaux(listFieldsNames.size()); + if (jaux < 1 ) + { + if(errorMessage) + { + QMessageBox::critical( 0, QObject::tr("_ERROR"), + QObject::tr("HOM_MED_FILE_5") ); + } + break ; + } + // nbofcstp inutile pour le moment + med_int nbofcstp = 1; + for(std::size_t j=0;j (QString(listFieldsNames[j].c_str()), nbofcstp)); + } + break ; + } + + 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 new file mode 100644 index 000000000..5121d1102 --- /dev/null +++ b/src/SMESHGUI/MG_ADAPTGUI.hxx @@ -0,0 +1,329 @@ +// 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 +// +// 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" + +#include CORBA_SERVER_HEADER(MG_ADAPT) + +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); + +std::string remove_extension(const std::string& filename); + +enum ADAPTATION_MODE{ + SURFACE, + VOLUME, + BOTH +}; +//================================================================================= +// class : SMESHGUI_MgAdaptDlg +// purpose : +//================================================================================= +class SMESHGUI_MgAdaptDlg : public QDialog +{ + Q_OBJECT; +public: + //! Property type + enum Mode { Arguments, AdvancedOptions}; + SMESHGUI_MgAdaptDlg( SalomeApp_Module*, SMESH::MG_ADAPT_ptr, QWidget* parent= 0,bool isCreation = true ); + ~SMESHGUI_MgAdaptDlg(); + + void buildDlg(); + void reject(); + bool checkParams(QString& msg) ; + //~void setModel(MgAdapt*); + SMESH::MG_ADAPT_ptr getModel() const; + +public slots: + +protected slots: + virtual bool PushOnApply(); + +private slots: + virtual void PushOnHelp(); + virtual void PushOnOK(); + +protected : + + SMESHGUI_MgAdaptArguments* myArgs; + MgAdaptAdvWidget* myAdvOpt; + bool readParamsFromHypo( ) const ; + bool readParamsFromWidgets( ) ; + bool storeParamsToHypo( const SMESH::MgAdaptHypothesisData & ) const; + +private: + + SalomeApp_Module* mySMESHGUI; /* Current SMESHGUI object */ + QTabWidget* myTabWidget; + + + SMESH::MgAdaptHypothesisData* myData; + SMESH::MG_ADAPT_ptr 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 ); + + 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 vmax = 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 vmax = 0); + void visibleTimeStepRankLabel(bool visible); + void valueAdaptation (); + +private: + + QString getMedFileName(bool avertir); + LightApp_SelectionMgr* selMgr ; + med_int meshDim; + med_int meshDimBG; + 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/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index e96570c1f..762c7cb34 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -30,6 +30,7 @@ // SMESH includes #include "SMESHGUI.h" +#include "SMESHGUI_AdaptDlg.h" #include "SMESHGUI_Add0DElemsOnAllNodesDlg.h" #include "SMESHGUI_AddMeshElementDlg.h" #include "SMESHGUI_AddQuadraticElementDlg.h" @@ -1971,12 +1972,12 @@ void SMESHGUI::OnEditDelete() int objectCount = 0; QString aNameList; QString aParentComponent = QString::null; - + for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() ) { Handle(SALOME_InteractiveObject) anIO = anIt.Value(); if ( anIO.IsNull() ) continue; - + QString father = "unknown", name; _PTR(SObject) aSO = aStudy->FindObjectID( anIO->getEntry() ); @@ -3042,6 +3043,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } break; } + // Adaptation - begin + case SMESHOp::OpMGAdapt: + { + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil(); + SMESHGUI_AdaptDlg *objet = new SMESHGUI_AdaptDlg( this, theCommandID, aMesh); + } + // Adaptation - end case SMESHOp::OpSplitBiQuadratic: case SMESHOp::OpConvertMeshToQuadratic: case SMESHOp::OpCreateBoundaryElements: // create 2D mesh from 3D @@ -4279,6 +4287,10 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpAutoColor, "AUTO_COLOR" ); createSMESHAction( SMESHOp::OpDisableAutoColor, "DISABLE_AUTO_COLOR" ); + // Adaptation - begin + createSMESHAction( SMESHOp::OpMGAdapt, "MG_ADAPT", "ICON_MG_ADAPT" ); + // Adaptation - end + createSMESHAction( SMESHOp::OpMinimumDistance, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" ); createSMESHAction( SMESHOp::OpBoundingBox, "MEASURE_BND_BOX", "ICON_MEASURE_BND_BOX" ); createSMESHAction( SMESHOp::OpPropertiesLength, "MEASURE_LENGTH", "ICON_MEASURE_LENGTH" ); @@ -4320,6 +4332,7 @@ void SMESHGUI::initialize( CAM_Application* app ) meshId = createMenu( tr( "MEN_MESH" ), -1, 70, 10 ), ctrlId = createMenu( tr( "MEN_CTRL" ), -1, 60, 10 ), modifyId = createMenu( tr( "MEN_MODIFY" ), -1, 40, 10 ), + adaptId = createMenu( tr( "MEN_ADAPT" ), -1, 80, 10 ), measureId = createMenu( tr( "MEN_MEASURE" ), -1, 50, 10 ), viewId = createMenu( tr( "MEN_VIEW" ), -1, 2 ); @@ -4492,6 +4505,10 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpSmoothing, modifyId, -1 ); createMenu( SMESHOp::OpPatternMapping, modifyId, -1 ); + // Adaptation - begin + createMenu( SMESHOp::OpMGAdapt, adaptId, -1 ); + // Adaptation - end + createMenu( SMESHOp::OpMinimumDistance, measureId, -1 ); createMenu( SMESHOp::OpBoundingBox, measureId, -1 ); createMenu( SMESHOp::OpAngle, measureId, -1 ); @@ -4506,22 +4523,7 @@ void SMESHGUI::initialize( CAM_Application* app ) connect( volumeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) ); // ----- create toolbars -------------- - int meshTb = createTool( tr( "TB_MESH" ), QString( "SMESHMeshToolbar" ) ), - info = createTool( tr( "TB_INFO" ), QString( "SMESHInformationToolbar" ) ), - groupTb = createTool( tr( "TB_GROUP" ), QString( "SMESHGroupToolbar" ) ), - ctrl0dTb = createTool( tr( "TB_CTRL0D" ), QString( "SMESHNodeControlsToolbar" ) ), - ctrl1dTb = createTool( tr( "TB_CTRL1D" ), QString( "SMESHEdgeControlsToolbar" ) ), - ctrl2dTb = createTool( tr( "TB_CTRL2D" ), QString( "SMESHFaceControlsToolbar" ) ), - ctrl3dTb = createTool( tr( "TB_CTRL3D" ), QString( "SMESHVolumeControlsToolbar" ) ), - addElemTb = createTool( tr( "TB_ADD" ), QString( "SMESHAddElementToolbar" ) ), - addNonElemTb = createTool( tr( "TB_ADDNON" ), QString( "SMESHAddElementToolbar" ) ), - remTb = createTool( tr( "TB_REM" ), QString( "SMESHRemoveToolbar" ) ), - //renumbTb = createTool( tr( "TB_RENUMBER" ), QString( "SMESHRenumberingToolbar" ) ), - transformTb = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ), - modifyTb = createTool( tr( "TB_MODIFY" ), QString( "SMESHModificationToolbar" ) ), - measuremTb = createTool( tr( "TB_MEASUREM" ), QString( "SMESHMeasurementsToolbar" ) ), - dispModeTb = createTool( tr( "TB_DISP_MODE" ), QString( "SMESHDisplayModeToolbar" ) ); - + int meshTb = createTool( tr( "TB_MESH" ), QString( "SMESHMeshToolbar" ) ) ; createTool( SMESHOp::OpCreateMesh, meshTb ); createTool( SMESHOp::OpCreateSubMesh, meshTb ); createTool( SMESHOp::OpEditMeshOrSubMesh, meshTb ); @@ -4533,25 +4535,30 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpEvaluate, meshTb ); createTool( SMESHOp::OpMeshOrder, meshTb ); + int infoTb = createTool( tr( "TB_INFO" ), QString( "SMESHInformationToolbar" ) ) ; + createTool( SMESHOp::OpMeshInformation, infoTb ); + //createTool( SMESHOp::OpStdInfo, meshTb ); + //createTool( SMESHOp::OpWhatIs, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command) + createTool( SMESHOp::OpFindElementByPoint, infoTb ); + + int groupTb = createTool( tr( "TB_GROUP" ), QString( "SMESHGroupToolbar" ) ) ; createTool( SMESHOp::OpCreateGroup, groupTb ); createTool( SMESHOp::OpCreateGeometryGroup, groupTb ); createTool( SMESHOp::OpConstructGroup, groupTb ); createTool( SMESHOp::OpEditGroup, groupTb ); - createTool( SMESHOp::OpMeshInformation, info ); - //createTool( SMESHOp::OpStdInfo, meshTb ); - //createTool( SMESHOp::OpWhatIs, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command) - createTool( SMESHOp::OpFindElementByPoint, info ); - + int ctrl0dTb = createTool( tr( "TB_CTRL0D" ), QString( "SMESHNodeControlsToolbar" ) ) ; createTool( SMESHOp::OpFreeNode, ctrl0dTb ); createTool( SMESHOp::OpEqualNode, ctrl0dTb ); //createTool( SMESHOp::OpNodeConnectivityNb, ctrl0dTb ); + int ctrl1dTb = createTool( tr( "TB_CTRL1D" ), QString( "SMESHEdgeControlsToolbar" ) ) ; createTool( SMESHOp::OpFreeBorder, ctrl1dTb ); createTool( SMESHOp::OpLength, ctrl1dTb ); createTool( SMESHOp::OpConnection, ctrl1dTb ); createTool( SMESHOp::OpEqualEdge, ctrl1dTb ); + int ctrl2dTb = createTool( tr( "TB_CTRL2D" ), QString( "SMESHFaceControlsToolbar" ) ) ; createTool( SMESHOp::OpFreeEdge, ctrl2dTb ); createTool( SMESHOp::OpFreeFace, ctrl2dTb ); createTool( SMESHOp::OpBareBorderFace, ctrl2dTb ); @@ -4568,6 +4575,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpEqualFace, ctrl2dTb ); createTool( SMESHOp::OpDeflection2D, ctrl2dTb ); + int ctrl3dTb = createTool( tr( "TB_CTRL3D" ), QString( "SMESHVolumeControlsToolbar" ) ) ; createTool( SMESHOp::OpAspectRatio3D, ctrl3dTb ); createTool( SMESHOp::OpVolume, ctrl3dTb ); createTool( SMESHOp::OpMaxElementLength3D, ctrl3dTb ); @@ -4575,6 +4583,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpOverConstrainedVolume, ctrl3dTb ); createTool( SMESHOp::OpEqualVolume, ctrl3dTb ); + int addElemTb = createTool( tr( "TB_ADD" ), QString( "SMESHAddElementToolbar" ) ) ; createTool( SMESHOp::OpNode, addElemTb ); createTool( SMESHOp::OpElem0D, addElemTb ); createTool( SMESHOp::OpElem0DOnElemNodes, addElemTb ); @@ -4590,6 +4599,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpHexagonalPrism, addElemTb ); createTool( SMESHOp::OpPolyhedron, addElemTb ); + int addNonElemTb = createTool( tr( "TB_ADDNON" ), QString( "SMESHAddElementToolbar" ) ) ; createTool( SMESHOp::OpQuadraticEdge, addNonElemTb ); createTool( SMESHOp::OpQuadraticTriangle, addNonElemTb ); createTool( SMESHOp::OpBiQuadraticTriangle, addNonElemTb ); @@ -4603,14 +4613,17 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpQuadraticHexahedron, addNonElemTb ); createTool( SMESHOp::OpTriQuadraticHexahedron, addNonElemTb ); + int remTb = createTool( tr( "TB_REM" ), QString( "SMESHRemoveToolbar" ) ) ; createTool( SMESHOp::OpRemoveNodes, remTb ); createTool( SMESHOp::OpRemoveElements, remTb ); createTool( SMESHOp::OpRemoveOrphanNodes, remTb ); createTool( SMESHOp::OpClearMesh, remTb ); +// int renumbTb = createTool( tr( "TB_RENUMBER" ), QString( "SMESHRenumberingToolbar" ) ) ; //createTool( SMESHOp::OpRenumberingNodes, renumbTb ); //createTool( SMESHOp::OpRenumberingElements, renumbTb ); + int transformTb = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ) ; createTool( SMESHOp::OpMergeNodes, transformTb ); createTool( SMESHOp::OpMergeElements, transformTb ); createTool( SMESHOp::OpTranslation, transformTb ); @@ -4621,6 +4634,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpSewing, transformTb ); createTool( SMESHOp::OpDuplicateNodes, transformTb ); + int modifyTb = createTool( tr( "TB_MODIFY" ), QString( "SMESHModificationToolbar" ) ) ; createTool( SMESHOp::OpConvertMeshToQuadratic, modifyTb ); createTool( SMESHOp::OpCreateBoundaryElements, modifyTb ); createTool( SMESHOp::OpExtrusion, modifyTb ); @@ -4638,8 +4652,15 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpSmoothing, modifyTb ); createTool( SMESHOp::OpPatternMapping, modifyTb ); + // Adaptation - begin + int adaptTb = createTool( tr( "TB_ADAPTATION" ),QString( "SMESHAdaptationToolbar" ) ) ; + createTool( SMESHOp::OpMGAdapt, adaptTb ); + // Adaptation - end + + int measuremTb = createTool( tr( "TB_MEASUREM" ), QString( "SMESHMeasurementsToolbar" ) ) ; createTool( SMESHOp::OpMinimumDistance, measuremTb ); + int dispModeTb = createTool( tr( "TB_DISP_MODE" ), QString( "SMESHDisplayModeToolbar" ) ); createTool( SMESHOp::OpUpdate, dispModeTb ); QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality(); @@ -4715,9 +4736,11 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), -1, 0 ); createPopupItem( SMESHOp::OpConvertMeshToQuadratic, OB, mesh_submesh, "&& " + hasElems ); createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh_group, "&& selcount=1 && dim>=2"); - //popupMgr()->insert( separator(), -1, 0 ); + popupMgr()->insert( separator(), -1, 0 ); - //popupMgr()->insert( separator(), -1, 0 ); + // Adaptation - begin + createPopupItem( SMESHOp::OpMGAdapt, OB, mesh ); + // Adaptation - end QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc ); QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc ); @@ -5139,7 +5162,7 @@ bool SMESHGUI::activateModule( SUIT_Study* study ) lab = lab + tr("INFO_COMPUTE") + "
"; lab = lab + tr("INFO_REFINE") + ":"; items << wrap(tr("INFO_REFINE_LOCAL_SIZE"), "li") - << wrap(tr("INFO_REFINE_SUBMESH"), "li"); + << wrap(tr("INFO_REFINE_SUBMESH"), "li"); lab = lab + wrap(items.join(""), "ul"); items.clear(); @@ -5147,26 +5170,26 @@ bool SMESHGUI::activateModule( SUIT_Study* study ) gb = app->infoPanel()->addGroup(tr("INFO_GRP_IMPORT_MESH")); items << wrap("UNV", "li") - << wrap("MED", "li") - << wrap("STL", "li") - << wrap("CGNS", "li") - << wrap("SAUV", "li") - << wrap("GMF", "li"); + << wrap("MED", "li") + << wrap("STL", "li") + << wrap("CGNS", "li") + << wrap("SAUV", "li") + << wrap("GMF", "li"); lab = tr("INFO_AVAILABLE_FORMATS") + ":" + wrap(items.join(""), "ul"); items.clear(); - + app->infoPanel()->addLabel(lab, gb); - + gb = app->infoPanel()->addGroup(tr("INFO_GRP_CHECK_MESH")); lab = tr("INFO_DISPLAY") + "
"; items << wrap(tr("INFO_QUALITY_AREA"), "li") - << wrap(tr("INFO_QUALITY_VOLUME"), "li") - << wrap(tr("INFO_QUALITY_ASPECT_RATION"), "li") - << wrap("...", "li"); + << wrap(tr("INFO_QUALITY_VOLUME"), "li") + << wrap(tr("INFO_QUALITY_ASPECT_RATION"), "li") + << wrap("...", "li"); lab = lab + tr("INFO_QUALITY_INFO") + ":" + wrap(items.join(""), "ul"); items.clear(); lab = lab + tr("INFO_CLIPPING"); - + app->infoPanel()->addLabel(lab, gb); // << Help Panel @@ -5374,7 +5397,7 @@ void SMESHGUI::createPreferences() setPreferenceProperty( dispgroup, "columns", 2 ); addPreference( tr( "PREF_FITALL_ON_DISPLAYONLY" ), dispgroup, LightApp_Preferences::Bool, "SMESH", "fitall_on_displayonly" ); - + int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), dispgroup, LightApp_Preferences::Selector, "SMESH", "display_mode" ); QStringList modes; modes.append( tr("MEN_WIRE") ); @@ -5751,6 +5774,29 @@ void SMESHGUI::createPreferences() setPreferenceProperty( coloringType, "indexes", indices ); addPreference( tr( "SMESH_DISTRIBUTION_COLOR" ), distributionGr, LightApp_Preferences::Color, "SMESH", "distribution_color" ); + // Adaptation - begin + // Adaptation tab ------------------------------------------------------------------------ + int adaptTab = addPreference( tr( "ADAPT_PREF_TAB_GENERAL" ) ); + int bloc, pref ; + // MG-Adapt + bloc = addPreference( tr( "ADAPT_PREF_MG_ADAPT" ), adaptTab ); + setPreferenceProperty( bloc, "columns", 1 ); + pref = addPreference( tr( "ADAPT_PREF_MG_ADAPT_FILE_MAILLAGE_OUT" ), bloc, LightApp_Preferences::Bool, "HOMARD", "mg_adapt_file_mesh_out" ); + pref = addPreference( tr( "ADAPT_PREF_MG_ADAPT_PUBLICATION_MAILLAGE_OUT" ), bloc, LightApp_Preferences::Bool, "HOMARD", "mg_adapt_publish_mesh_out" ); + pref = addPreference( tr( "ADAPT_PREF_MG_ADAPT_SIZE_MAP" ), bloc, LightApp_Preferences::Selector, "HOMARD", "mg_adapt_size_map" ); + QStringList aListOfSizeMap; + aListOfSizeMap << tr( "ADAPT_PREF_MG_ADAPT_SIZE_MAP_LOCAL" ); + aListOfSizeMap << tr( "ADAPT_PREF_MG_ADAPT_SIZE_MAP_BACKGROUND" ); + aListOfSizeMap << tr( "ADAPT_PREF_NONE" );; + setPreferenceProperty( pref, "strings", aListOfSizeMap ); + pref = addPreference( tr( "ADAPT_PREF_MG_ADAPT_TIME_STEP" ), bloc, LightApp_Preferences::Selector, "HOMARD", "mg_adapt_time_step" ); + QStringList aListOfTimeStep; + aListOfTimeStep << tr( "ADAPT_PREF_NONE" ); + aListOfTimeStep << tr( "ADAPT_PREF_MG_ADAPT_TIME_STEP_LAST" ); + aListOfTimeStep << tr( "ADAPT_PREF_MG_ADAPT_TIME_STEP_C" );; + setPreferenceProperty( pref, "strings", aListOfTimeStep ); + // Adaptation - end + } void SMESHGUI::preferencesChanged( const QString& sect, const QString& name ) @@ -5964,6 +6010,10 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const case SMESHOp::OpElem0DOnElemNodes: // Create 0D elements on all nodes op = new SMESHGUI_Add0DElemsOnAllNodesOp(); break; + // Adaptation - begin + case SMESHOp::OpMGAdapt: + break; + // Adaptation - end default: break; } diff --git a/src/SMESHGUI/SMESHGUI_AdaptDlg.cxx b/src/SMESHGUI/SMESHGUI_AdaptDlg.cxx new file mode 100644 index 000000000..a37c196d3 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_AdaptDlg.cxx @@ -0,0 +1,162 @@ +// 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 : SMESHGUI_AdaptDlg.cxx +// Author : Gerald NICOLAS, EDF + +// SMESH includes +#include "SMESHGUI.h" +#include "SMESHGUI_AdaptDlg.h" +#include "SMESHGUI_MG_ADAPTDRIVER.h" +//~#include "MG_ADAPT_i.hxx" +//~#include "MG_ADAPT.hxx" + +// SALOME GUI includes +#include +#include +#include +#include +#include + +// SALOME KERNEL includes +#include "utilities.h" +#include + +//================================================================================= +// function : SMESHGUI_AdaptDlg() +// purpose : +//================================================================================= +SMESHGUI_AdaptDlg::SMESHGUI_AdaptDlg( SMESHGUI* theModule, + int theCommandID, + SMESH::SMESH_Mesh_ptr theMesh ) + : mySMESHGUI( theModule ) +{ + action( theCommandID ) ; +} + +//================================================================================= +// function : ~SMESHGUI_AdaptDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +SMESHGUI_AdaptDlg::~SMESHGUI_AdaptDlg() +{ +} + +/*! + * \brief Pilote les actions d'adaption de maillage + * \param + * \return bool OK/notOK +*/ +void SMESHGUI_AdaptDlg::action (int theCommandID) +//======================================================================= +{ +// std::cout << "SMESHGUI_AdaptDlg::action avec theCommandID : " << theCommandID << std::endl; + +// Preferences +// recupPreferences(); + +// Menus and actions + bool ok = OnGUIEvent (theCommandID) ; + if ( ! ok ) INFOS("Erreur"); + + return ; +} + +// /*! +// * \brief Gets the preferences for the adaptation +// * \param +// * \return +// * +// * Pour chaque valeur, le defaut est la valeur definie dans ADAPT_Gen +// * . Si la recuperation dans config/salome s'est bien passee a la creation de ADAPT_Gen +// * ces valeurs sont les valeurs definies. +// * . Si cela ne s'est pas bien passe, ce sont les valeurs par defaut de ADAPT_Gen +// */ +// void SMESHGUI_AdaptDlg::recupPreferences() +// { +// INFOS("Début de recupPreferences") +// // +// // A. Declarations +// // +// SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); +// SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA(app->namingService()); +// Engines::EngineComponent_var comp = ls->FindOrLoad_Component("FactoryServer", "SMESH"); +// ADAPT::ADAPT_Gen_var adaptGen = ADAPT::ADAPT_Gen::_narrow(comp); +// if (!CORBA::is_nil(adaptGen)) +// adaptGen->UpdateStudy(); +// +// SUIT_ResourceMgr* resMgr = mySMESHGUI->getApp()->resourceMgr(); +// +// } + +/*! + * \brief Launches the GUI for the adaptation + * \param theCommandID - the integer that references the operation + * \return bool OK/notOK +*/ +bool SMESHGUI_AdaptDlg::OnGUIEvent (int theCommandID) +{ +// std::cout << "SMESHGUI_AdaptDlg:OnGUIEvent avec theCommandID : " << theCommandID << std::endl; +// A. Controles + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return false; + + SalomeApp_Study* aStudy = dynamic_cast ( app->activeStudy() ); + if ( !aStudy ) + { + INFOS ( "FAILED to cast active study to SalomeApp_Study" ); + return false; + } + + SUIT_Desktop* parent = SUIT_Session::session()->activeApplication()->desktop(); + + SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA(app->namingService()); + Engines::EngineComponent_var comp = ls->FindOrLoad_Component("FactoryServer", "SMESH"); +// ADAPT::ADAPT_Gen_var adaptGen = ADAPT::ADAPT_Gen::_narrow(comp); +// if (!CORBA::is_nil(adaptGen)) +// adaptGen->UpdateStudy(); + + mySMESHGUI->getApp()->updateObjectBrowser(); +// +// B. Choix selon les commandes + bool ok = true ; + SCRUTE(theCommandID); + switch (theCommandID) + { + case 8020: // Adaptation avec MG-Adpat + { +// INFOS("Interface avec MG-Adapt" ); + + SMESH::MG_ADAPT_ptr model = SMESHGUI::GetSMESHGen()->CreateMG_ADAPT(); + bool isCreation = false; + if (mySMESHGUI->isStudyLocked()) break; + mySMESHGUI->EmitSignalDeactivateDialog(); + SMESHGUI_MG_ADAPTDRIVER *mgAdapt = new SMESHGUI_MG_ADAPTDRIVER(mySMESHGUI, model, isCreation); + mgAdapt->show(); + break; + } + + } + mySMESHGUI->getApp()->updateObjectBrowser(); + return ok; +} + + + diff --git a/src/SMESHGUI/SMESHGUI_AdaptDlg.h b/src/SMESHGUI/SMESHGUI_AdaptDlg.h new file mode 100644 index 000000000..1231b067e --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_AdaptDlg.h @@ -0,0 +1,77 @@ +// 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 : SMESHGUI_AdaptDlg.h +// Author : Gérald NICOLAS, EDF +// +#ifndef SMESHGUI_ADAPTDLG_H +#define SMESHGUI_ADAPTDLG_H + +// SMESH includes +#include "SMESH_SMESHGUI.hxx" + +// Qt includes +#include + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_Mesh) + +class SMESHGUI; + +//================================================================================= +// class : SMESHGUI_AdaptDlg +// purpose : +//================================================================================= +class SMESHGUI_EXPORT SMESHGUI_AdaptDlg : public QWidget +{ +public: + SMESHGUI_AdaptDlg( SMESHGUI*, + int theCommandID, + SMESH::SMESH_Mesh_ptr = SMESH::SMESH_Mesh::_nil() ); + ~SMESHGUI_AdaptDlg(); + + void action (int theCommandID); + virtual bool OnGUIEvent (int theCommandID); + +// static ADAPT::ADAPT_Gen_var InitAdaptGen(SalomeApp_Application*); + +public slots: + +protected slots: + +private slots: + +private: + +// void recupPreferences(); + SMESHGUI* mySMESHGUI; /* Current SMESHGUI object */ + + QString _ObjectName; + QString _LanguageShort ; + int _PublisMeshIN ; + int _PublisMeshOUT ; + int _YACSMaxIter ; + int _YACSMaxNode ; + int _YACSMaxElem ; + int _YACSTypeTest ; +}; + +#endif // SMESHGUI_ADAPTDLG_H diff --git a/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx new file mode 100644 index 000000000..d3bed87fd --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx @@ -0,0 +1,758 @@ +// 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 : SMESHGUI_MG_ADAPTDRIVER.cxx + +#include "SMESHGUI_MG_ADAPTDRIVER.h" + +#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_Comment.hxx" +#include "SMESH_Actor.h" +#include "SMESHGUI.h" +#include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_Selection.h" +#include +#include "SMESHGUI_IdValidator.h" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_MeshEditPreview.h" +#include "SMESHGUI_VTKUtils.h" +#include +#include +#include +#include +#include +#include "SMESHGUI_SpinBox.h" + +#include +#include +#include +#include +#include +#include +#include "SMESHGUI_MeshUtils.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 +// 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 + +SALOME_ListIO mySelected; + + +//================================================================ +// Function : firstIObject +// Purpose : Return the first selected object in the selected object list +//================================================================ +Handle(SALOME_InteractiveObject) firstIObject() +{ + const SALOME_ListIO& aList = selectedIO(); + return aList.Extent() > 0 ? aList.First() : Handle(SALOME_InteractiveObject)(); +} +//================================================================ +// Function : selectedIO +// Return the list of selected SALOME_InteractiveObject's +//================================================================ +const SALOME_ListIO& selectedIO() +{ + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* > ( SUIT_Session::session()->activeApplication() ); + LightApp_SelectionMgr* aSelectionMgr = app->selectionMgr(); + if( aSelectionMgr ) + { + aSelectionMgr->selectedObjects( mySelected ); + for (SALOME_ListIteratorOfListIO it (mySelected); it.More(); it.Next()) + SCRUTE(it.Value()->getEntry()); + }; + return mySelected; +} +//================================================================ +// Function : getStudy +// Returne un pointeur sur l'etude active +//================================================================ +_PTR(Study) getStudy() +{ + static _PTR(Study) _study; + if(!_study) + _study = SalomeApp_Application::getStudy(); + return _study; +} + +bool createAndPublishMed(QString fileName) +{ + + SMESH::DriverMED_ReadStatus res; + SMESH::mesh_array_var aMeshes = new SMESH::mesh_array; + // SMESHGUI aGui; + + aMeshes = SMESHGUI::GetSMESHGen()->CreateMeshesFromMED( fileName.toUtf8().constData(), res ); + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[0] ); + _PTR(Study) aStudy = SMESH::getStudy(); + QStringList anEntryList; + // bool isEmpty; + if ( aMeshSO ) + { + _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder(); + _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" ); + aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" ); + anEntryList.append( aMeshSO->GetID().c_str() ); + } + else + { + // isEmpty = true; + return false; + } + SMESHGUI::GetSMESHGUI()->updateObjBrowser(); + + // browse to the published meshes + if( LightApp_Application* anApp = + dynamic_cast( SUIT_Session::session()->activeApplication() ) ) + anApp->browseObjects( anEntryList ); + return true; +} +bool createMgAdaptObject(MgAdapt *myMgAdapt ) +{ + // SMESH::SMESH_Mesh_var newMesh = SMESHGUI::GetSMESHGen()->CreateEmptyMesh(); + + // _PTR(SObject) aHypothesis; + _PTR(Study) aStudy = SMESH::getStudy(); + QStringList anEntryList; + _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder(); + _PTR(SComponent) mgadapt = aStudy->FindComponent("MG-ADAPT"); + _PTR(GenericAttribute) ga; + if (!aBuilder->FindAttribute(mgadapt, ga, "AttributeName") ) + { + mgadapt = aBuilder->NewComponent("MG-ADAPT"); + _PTR(AttributeName) Name = aBuilder->FindOrCreateAttribute(mgadapt, "AttributeName"); + Name->SetValue("MG-ADAPT"); + _PTR(AttributePixMap) myPixmap = aBuilder->FindOrCreateAttribute( mgadapt, "AttributePixMap" ); + myPixmap->SetPixMap( "ICON_MG_ADAPT" ); + anEntryList.append( mgadapt->GetID().c_str() ); + } + + _PTR(SObject) obj = aBuilder->NewObject(mgadapt); + _PTR(AttributeName) myName = aBuilder->FindOrCreateAttribute(obj, "AttributeName"); + myName->SetValue("hypo"); + _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( obj, "AttributePixMap" ); + aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); + anEntryList.append( obj->GetID().c_str() ); + + SMESHGUI::GetSMESHGUI()->updateObjBrowser(); + + // // browse to the published meshes + if( LightApp_Application* anApp = + dynamic_cast( SUIT_Session::session()->activeApplication() ) ) + anApp->browseObjects( anEntryList ); + return true; +} + + +// MG ADAPT UTILS +//================================================================ +// Function : IObjectCount +// Return the number of selected objects +//================================================================ +int IObjectCount() +{ + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + LightApp_SelectionMgr* aSelectionMgr = app->selectionMgr(); + if( aSelectionMgr ) + { + aSelectionMgr->selectedObjects( mySelected ); + SCRUTE(mySelected.Extent()); + return mySelected.Extent(); + } + return 0; +} + + + +SMESHGUI_MG_ADAPTDRIVER::SMESHGUI_MG_ADAPTDRIVER( SMESHGUI* theModule, SMESH::MG_ADAPT_ptr myModel, bool isCreation ) + : mySMESHGUI( theModule ), + myFilterDlg(0), + myIsApplyAndClose( false ), + SMESHGUI_MgAdaptDlg((SalomeApp_Module*)theModule, myModel, SMESHGUI::desktop(), isCreation) +{ + + resMgr = resourceMgr(); + + selMgr = selectionMgr(); + + // connections + connect(myArgs, SIGNAL(updateSelection()), this, SLOT(updateSelection())); + connect(myArgs, SIGNAL(toExportMED(const char*)), this, SLOT(exportMED(const char*))); +} + +SUIT_ResourceMgr* SMESHGUI_MG_ADAPTDRIVER::resourceMgr() +{ + return dynamic_cast( SUIT_Session::session()->resourceMgr() ); +} + +LightApp_SelectionMgr* SMESHGUI_MG_ADAPTDRIVER::selectionMgr() +{ + SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + if( anApp ) + return dynamic_cast( anApp->selectionMgr() ); + else + return 0; +} + +void SMESHGUI_MG_ADAPTDRIVER::updateSelection() +{ + disconnect( selMgr, 0, this, 0 ); + selMgr->clearFilters(); + + SMESH::SetPointRepresentation( true ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow() ) + aViewWindow->SetSelectionMode( ActorSelection ); + if (myArgs->aBrowser->isChecked()) + { + connect( selMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( selectionChanged() )); + selectionChanged(); + } + +} +void SMESHGUI_MG_ADAPTDRIVER::selectionChanged() +{ + //~ get selected mesh + SALOME_ListIO aList; + selMgr->selectedObjects(aList); + QString aString = ""; + int nbSel = aList.Extent(); + if (nbSel != 1) + return; + + Handle(SALOME_InteractiveObject) IO = aList.First(); + SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(IO); + if ( !mesh->_is_nil() ) + { + myMesh = mesh; + + mySelectedObject = SMESH::IObjectToInterface( IO ); + if ( mySelectedObject->_is_nil() ) + return; + } + else + return; + + SMESH::GetNameOfSelectedIObjects( selMgr, aString ); + if ( aString.isEmpty() ) aString = " "; + else aString = aString.trimmed(); + + + bool ok = !aString.isEmpty(); + if ( !mesh->_is_nil() ) + { + myArgs->aBrowserObject->setText( aString ); + myArgs->meshNameLineEdit->setText( aString ); + myArgs->selectOutMedFileLineEdit->setText(aString+QString(".med")); + ADAPTATION_MODE aMode; + int nbVolumes = myMesh->NbVolumes(); + int nbFaces = myMesh->NbFaces(); + if(nbFaces > 0 && nbVolumes > 0) aMode = ADAPTATION_MODE::BOTH; + else if(nbFaces > 0) aMode = ADAPTATION_MODE::SURFACE; + else aMode = ADAPTATION_MODE::VOLUME; + emit myArgs->meshDimSignal(aMode); + } + +} +void SMESHGUI_MG_ADAPTDRIVER::exportMED(const char* tmp_file) +{ + bool toOverwrite = true; + bool toFindOutDim = true; + myMesh->ExportMED(tmp_file, false, -1, toOverwrite, toFindOutDim); +} +void SMESHGUI_MG_ADAPTDRIVER::setMyMesh(SMESH::SMESH_Mesh_var mesh) +{ + myMesh = mesh; +} +SMESH::SMESH_Mesh_var SMESHGUI_MG_ADAPTDRIVER::getMyMesh() +{ + return myMesh; +} + +//================================================================================= +// function : PushOnOk() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::PushOnOK() +{ + setIsApplyAndClose( true ); + bool ret = PushOnApply(); +// std::cout << "SMESHGUI_MG_ADAPTDRIVER::PushOnOK ret : " <getPublish()) this->createMeshInObjectBrowser(); +// std::cout << "SMESHGUI_MG_ADAPTDRIVER::PushOnApply ok 2 : " <compute(); + err = 0; + errStr = getModel()->getErrMsg(); + std::string msg = err == 0 ? " ok" : std::string("Not ok \n")+CORBA::string_dup(errStr) ; + } + catch (const std::exception& e) + { + std::cerr<clear(); + myNbOkElements = 0; + + buttonOk->setEnabled(false); + buttonApply->setEnabled(false); + + //~myActor = 0; + myMesh = SMESH::SMESH_Mesh::_nil(); + + myIdSourceCheck->setChecked(true); + + onConstructor( 0 ); + } + +} + +//======================================================================= +//function : onConstructor +//purpose : switch operation mode +//======================================================================= + +void SMESHGUI_MG_ADAPTDRIVER::onConstructor( int withGeom ) +{ + + myGeomLabel ->setVisible( withGeom ); + myGeomNameEdit ->setVisible( withGeom ); + myReuseHypCheck ->setVisible( withGeom ); + myCopyElementsCheck->setVisible( withGeom ); + myFilterBtn ->setVisible( !withGeom ); + myIdSourceCheck ->setVisible( !withGeom ); + + if ( !withGeom ) + myMeshNameEdit->setText( SMESH::UniqueMeshName("Mesh")); + +} + +//~void SMESHGUI_MG_ADAPTDRIVER::onSelectIdSource( bool ) +//~{} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::enterEvent (QEvent*) +{ + + // if ( !ConstructorsBox->isEnabled() ) { + // SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ); + // if ( aViewWindow && !mySelector ) { + // mySelector = aViewWindow->GetSelector(); + // } + // activateThisDialog(); + // } + +} + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::keyPressEvent( QKeyEvent* e ) +{ + + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) + { + e->accept(); + PushOnHelp(); + } + +} + +//================================================================================= +// function : PushOnHelp() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::PushOnHelp() +{ + + QString aHelpFile = "adaptation.html#_mg_adapt_anchor"; + + SMESH::ShowHelpFile( aHelpFile ); + +} + +//======================================================================= +//function : getErrorMsg +//purpose : Return an error message and entries of invalid smesh object +//======================================================================= + +QString SMESHGUI_MG_ADAPTDRIVER::getErrorMsg( SMESH::string_array_var theInvalidEntries, + QStringList & theEntriesToBrowse ) +{ + + if ( theInvalidEntries->length() == 0 ) + return tr("OPERATION_FAILED"); + + // theInvalidEntries - SObject's that hold geometry objects whose + // counterparts are not found in the newGeometry, followed by SObject's + // holding mesh sub-objects that are invalid because they depend on a not found + // preceding sub-shape + + QString msg = tr("SUBSHAPES_NOT_FOUND_MSG") + "\n"; + + QString objString; + for ( CORBA::ULong i = 0; i < theInvalidEntries->length(); ++i ) + { + _PTR(SObject) so = SMESH::getStudy()->FindObjectID( theInvalidEntries[i].in() ); + + int objType = SMESHGUI_Selection::type( theInvalidEntries[i].in() ); + if ( objType < 0 ) // geom object + { + objString += "\n"; + if ( so ) + objString += so->GetName().c_str(); + else + objString += theInvalidEntries[i].in(); // it's something like "FACE #2" + } + else // smesh object + { + theEntriesToBrowse.push_back( theInvalidEntries[i].in() ); + + objString += "\n "; + switch ( objType ) { + case SMESH::MESH: + objString += tr("SMESH_MESH"); + break; + case SMESH::HYPOTHESIS: + objString += tr("SMESH_HYPOTHESIS"); + break; + case SMESH::ALGORITHM: + objString += tr("SMESH_ALGORITHM"); + break; + case SMESH::SUBMESH_VERTEX: + case SMESH::SUBMESH_EDGE: + case SMESH::SUBMESH_FACE: + case SMESH::SUBMESH_SOLID: + case SMESH::SUBMESH_COMPOUND: + case SMESH::SUBMESH: + objString += tr("SMESH_SUBMESH"); + break; + case SMESH::GROUP: + objString += tr("SMESH_GROUP"); + break; + default: + ; + } + objString += " \""; + if ( so ) + objString += so->GetName().c_str(); + objString += "\" ("; + objString += theInvalidEntries[i].in(); + objString += ")"; + } + } + if ( !objString.isEmpty() ) + msg += objString; + + return msg; +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= + +bool SMESHGUI_MG_ADAPTDRIVER::isValid() +{ + bool ok = true; + return ok; +} + +bool SMESHGUI_MG_ADAPTDRIVER::createMeshInObjectBrowser() +{ + QString filename(getModel()->getMedFileOut()); + QStringList errors; + QStringList anEntryList; + bool isEmpty = false; + bool ok = false; + SMESH::SMESH_Gen_var SMESH_Gen_ptr = SMESHGUI::GetSMESHGen(); + if (!SMESH_Gen_ptr) { + std::cerr << "Could not retrieve SMESH_Gen_ptr" << std::endl; + throw SALOME_Exception(LOCALIZED("Could not retrieve SMESH::GetSMESHGen()")); + } + SMESH::mesh_array_var aMeshes = new SMESH::mesh_array; + aMeshes->length( 1 ); // one mesh only + SMESH::DriverMED_ReadStatus res; + aMeshes = SMESH_Gen_ptr->CreateMeshesFromMED( filename.toUtf8().constData(), res ); + if ( res != SMESH::DRS_OK ) { + errors.append( QString( "%1 :\n\t%2" ).arg( filename ).arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) ); + } + _PTR(Study) aStudy = SMESH::getStudy(); + for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) + { + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] ); + if ( aMeshSO ) + { + _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder(); + _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" ); + aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" ); // put REFINED mesh ico + anEntryList.append( aMeshSO->GetID().c_str() ); + } + else + { + isEmpty = true; + } + } + // update Object browser + SMESHGUI::GetSMESHGUI()->updateObjBrowser(); + // browse to the published meshes + if( LightApp_Application* anApp = + dynamic_cast( SUIT_Session::session()->activeApplication() ) ) + anApp->browseObjects( anEntryList ); + + // show Error message box if there were errors + if ( errors.count() > 0 ) { + SUIT_MessageBox::critical( SMESHGUI::desktop(), + QObject::tr( "SMESH_ERROR" ), + QObject::tr( "SMESH_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) ); + } + + // show warning message box, if some imported mesh is empty + if ( isEmpty ) { + SUIT_MessageBox::warning( SMESHGUI::desktop(), + QObject::tr( "SMESH_WRN_WARNING" ), + QObject::tr( "SMESH_DRS_SOME_EMPTY" ) ); + } + return true; +} + +//================================================================ +// function : setIsApplyAndClose +// Purpose : Set value of the flag indicating that the dialog is +// accepted by Apply & Close button +//================================================================ +void SMESHGUI_MG_ADAPTDRIVER::setIsApplyAndClose( const bool theFlag ) +{ + myIsApplyAndClose = theFlag; +}//================================================================ +// function : isApplyAndClose +// Purpose : Get value of the flag indicating that the dialog is +// accepted by Apply & Close button +//================================================================ +bool SMESHGUI_MG_ADAPTDRIVER::isApplyAndClose() const +{ + return myIsApplyAndClose; +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::deactivateActiveDialog() +{ + if (ConstructorsBox->isEnabled()) + { + ConstructorsBox->setEnabled(false); + GroupArguments->setEnabled(false); + GroupButtons->setEnabled(false); + mySMESHGUI->ResetState(); + mySMESHGUI->SetActiveDialogBox(0); + if ( selMgr ) + selMgr->removeFilter( myIdSourceFilter ); + } +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::activateThisDialog() +{ + + /* Emit a signal to deactivate the active dialog */ + // mySMESHGUI->EmitSignalDeactivateDialog(); + // ConstructorsBox->setEnabled(true); + // GroupArguments->setEnabled(true); + // GroupButtons->setEnabled(true); + + // mySMESHGUI->SetActiveDialogBox((QDialog*)this); + + // onSelectIdSource( myIdSourceCheck->isChecked() ); + + // SelectionIntoArgument(); +} + +//================================================================================= +// function : setFilters() +// purpose : SLOT. Called when "Filter" button pressed. +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::setFilters() +{ + if(myMesh->_is_nil()) + { + SUIT_MessageBox::critical(this, + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); + return; + } + if ( !myFilterDlg ) + myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, SMESH::ALL ); + + QList types; + if ( myMesh->NbEdges() ) types << SMESH::EDGE; + if ( myMesh->NbFaces() ) types << SMESH::FACE; + if ( myMesh->NbVolumes() ) types << SMESH::VOLUME; + if ( myMesh->NbBalls() ) types << SMESH::BALL; + if ( myMesh->Nb0DElements()) types << SMESH::ELEM0D; + if ( types.count() > 1 ) types << SMESH::ALL; + + myFilterDlg->Init( types ); + myFilterDlg->SetSelection(); + myFilterDlg->SetMesh( myMesh ); + myFilterDlg->SetSourceWg( myLineEditElements ); + + myFilterDlg->show(); +} + +//================================================================================= +// function : onOpenView() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::onOpenView() +{ + if ( mySelector ) { + SMESH::SetPointRepresentation(false); + } + else { + mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector(); + activateThisDialog(); + } +} + +//================================================================================= +// function : onCloseView() +// purpose : +//================================================================================= +void SMESHGUI_MG_ADAPTDRIVER::onCloseView() +{ + deactivateActiveDialog(); + mySelector = 0; +} diff --git a/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h new file mode 100644 index 000000000..20e09dd95 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h @@ -0,0 +1,210 @@ +// 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 : SMESHGUI_MG_ADAPTDRIVER.h +// +#ifndef SMESHGUI_MG_ADAPTDRIVER_H +#define SMESHGUI_MG_ADAPTDRIVER_H + +#include +// SMESH includes +#include "SMESH_SMESHGUI.hxx" + +// Qt includes +#include +#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_ADAPTGUI.hxx" + +#include CORBA_SERVER_HEADER(MG_ADAPT) + +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 SUIT_SelectionFilter; + + +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; +class QObject; + + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_Mesh) +#include CORBA_SERVER_HEADER(SMESH_Gen) +class SMESHGUI; +class SMESHGUI_MgAdaptDlg; +class SMESHGUI_IdValidator; +class SMESHGUI_FilterDlg; +class MgAdapt; +class QHeaderView; +class QFileDialog; + + +int IObjectCount(); +const SALOME_ListIO& selectedIO(); +_PTR(Study) getStudy(); +Handle(SALOME_InteractiveObject) firstIObject(); +bool createAndPublishMed(QString fileName); +bool createMgAdaptObject(MgAdapt* myMgAdapt = 0); + + +class SMESHGUI_MG_ADAPTDRIVER : public SMESHGUI_MgAdaptDlg +{ + Q_OBJECT; + +public : + SMESHGUI_MG_ADAPTDRIVER( SMESHGUI*, SMESH::MG_ADAPT_ptr, bool isCreation = true ); + void setMyMesh(SMESH::SMESH_Mesh_var); + SMESH::SMESH_Mesh_var getMyMesh() ; + +private : + + SMESHGUI* mySMESHGUI; /* Current SMESHGUI object */ + LightApp_SelectionMgr* selMgr ; + SUIT_ResourceMgr* resMgr; + SUIT_ResourceMgr* resourceMgr(); + LightApp_SelectionMgr* selectionMgr(); + SMESH::SMESH_Mesh_var myMesh ; + + + + void Init( bool = true ); + void enterEvent( QEvent* ); /* mouse enter the QWidget */ + void keyPressEvent( QKeyEvent* ); + QString getErrorMsg( SMESH::string_array_var invalidEntries, + QStringList & entriesToBrowse ); + + bool isValid(); + bool createMeshInObjectBrowser(); + void setIsApplyAndClose( const bool theFlag ); + bool isApplyAndClose() const; + bool execute(); + SMESHGUI_IdValidator* myIdValidator; + int myNbOkElements; /* to check when elements are defined */ + + SVTK_Selector* mySelector; + + bool myBusy; + GEOM::GEOM_Object_var myNewGeometry; + //~SMESH_Actor* myActor; // + SUIT_SelectionFilter* myIdSourceFilter; + + SMESH::SMESH_IDSource_var mySelectedObject; + + QTabWidget* myTabWidget; + QButtonGroup* GroupConstructors; + + QGroupBox* ConstructorsBox; + QGroupBox* GroupArguments; + QGroupBox* GroupButtons; + + QPushButton* buttonOk; + QPushButton* buttonCancel; + QPushButton* buttonApply; + QPushButton* buttonHelp; + + QLabel* myTextLabelElements; + QLabel* myGeomLabel; + QLineEdit* myLineEditElements; + QLineEdit* myMeshNameEdit; + QLineEdit* myGeomNameEdit; + QCheckBox* myIdSourceCheck; + QCheckBox* myCopyGroupsCheck; + QCheckBox* myReuseHypCheck; + QCheckBox* myCopyElementsCheck; + QCheckBox* myKeepIdsCheck; + + QPushButton* myFilterBtn; + SMESHGUI_FilterDlg* myFilterDlg; + + QString myHelpFileName; + + bool myIsApplyAndClose; + + QString inputMeshName; + QString outputMeshName; +private slots: + void selectionChanged(); + void updateSelection(); + +protected slots : + +private slots: + + void exportMED(const char* ); + + virtual bool PushOnApply(); + virtual void PushOnOK(); + virtual void PushOnHelp(); + + void deactivateActiveDialog(); + void activateThisDialog(); + void onConstructor( int ); + //~void onTextChange( const QString& ); + //~void onSelectIdSource( bool ); + void setFilters(); + void onOpenView(); + void onCloseView(); + + +}; + + + + +#endif // SMESHGUI_MG_ADAPTDRIVER_H diff --git a/src/SMESHGUI/SMESHGUI_Operations.h b/src/SMESHGUI/SMESHGUI_Operations.h index 2782458aa..d63c592c0 100644 --- a/src/SMESHGUI/SMESHGUI_Operations.h +++ b/src/SMESHGUI/SMESHGUI_Operations.h @@ -186,6 +186,8 @@ namespace SMESHOp { OpConvertMeshToQuadratic = 4513, // MENU MODIFICATION - CONVERT TO/FROM QUADRATIC OpCreateBoundaryElements = 4514, // MENU MODIFICATION - CREATE BOUNDARY ELEMENTS OpSplitBiQuadratic = 4515, // MENU MODIFICATION - SPLIT BI-QUADRATIC TO LINEAR + // Adaptation ---------------------//-------------------------------- + OpMGAdapt = 8020, // MENU ADAPTATION - MG-ADAPT // Measurements -------------------//-------------------------------- OpPropertiesLength = 5000, // MENU MEASUREMENTS - BASIC PROPERTIES - LENGTH OpPropertiesArea = 5001, // MENU MEASUREMENTS - BASIC PROPERTIES - AREA diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts index 932d60f07..317a769cb 100644 --- a/src/SMESHGUI/SMESH_images.ts +++ b/src/SMESHGUI/SMESH_images.ts @@ -83,6 +83,10 @@ ICON_CREATE_GEO_GROUP mesh_groups_from_gemetry.png + + ICON_MG_ADAPT + adapt_mg_adapt.png + ICON_CONV_TO_QUAD mesh_conv_to_quad.png @@ -654,7 +658,7 @@ ICON_MEASURE_AREA mesh_measure_area.png - + ICON_MEASURE_VOLUME mesh_measure_volume.png diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index cdbcfc114..32fb70b88 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -340,6 +340,126 @@ MEN_CONSTRUCT_GROUP Construct Group + + MEN_MG_ADAPT + Remesh with MG_Adapt + + + Args + Arguments + + + MeshOut + Mesh Out + + + MeshIn + Mesh In + + + MEDFile + MED file + + + Browser + Browser + + + Publish_MG_ADAPT + Publish + + + SIZE_MAP_FIELD + Size map field + + + MG_ADAPT_FIELD_NAME + Field Name + + + MG_ADAPT_MED_FILE_1 + This MED file cannot be read. + + + MG_ADAPT_MED_FILE_2 + No mesh in this MED file. + + + MG_ADAPT_MED_FILE_3 + More than one mesh in this MED file. + + + MG_ADAPT_MED_FILE_4 + The mesh in this MED file cannot be read. + + + MG_ADAPT_MED_FILE_5 + No field in this MED file. + + + MG_ADAPT_ERROR + Error + + + MG_ADAPT_CH_ST + Chosen time step + + + MG_ADAPT_RANK + Rank + + + MG_ADAPT_TSTP + Time step + + + MG_ADAPT_NO_T_ST + No time step + + + MG_ADAPT_L_ST + Last time step + + + MeshName + Mesh name + + + LOCAL_MG_ADAPT + Local + + + BACKGRND_MG_ADAPT + Background + + + CNST_MG_ADAPT + Constant + + + MED_FILE_BCKG + MED file background size map + + + VALUE_MG_ADAPT + Value + + + SIZE_MAP_DEF + Size map definition + + + ADVOP + Advanced Options + + + MG_ADAPT_DIAG_1 + Adaptation succeeded. + + + MG_ADAPT_DIAG_2 + Adaptation failed. + MEN_CONV_TO_QUAD Convert to/from quadratic @@ -788,6 +908,10 @@ MEN_MODIFY Modification + + MEN_ADAPT + Adaptation + MEN_MEASURE Measurements @@ -1502,6 +1626,10 @@ Please enter correct values and try again SMESH_AVAILABLE Available + + SMESH_NOT_AVAILABLE + Not available + SMESH_AVAILABLE_ALGORITHMS Available algorithms @@ -2897,6 +3025,82 @@ Check algorithm documentation for supported geometry SMESH_MULTICOLOR Multicolor + + ADAPT_PREF_TAB_GENERAL + Adaptation + + + ADAPT_PREF_NONE + None + + + ADAPT_PREF_MG_ADAPT + Adaptation with MG-Adapt + + + ADAPT_PREF_MG_ADAPT_FILE_MAILLAGE_OUT + Write the OUT mesh + + + ADAPT_PREF_MG_ADAPT_PUBLICATION_MAILLAGE_OUT + Publication of the OUT mesh + + + OPTION_VALUE_COLUMN + Option + + + OPTION_NAME_COLUMN + Value + + + compute_ridges + Compute ridges + + + max_memory + Maximum memory (Mb) + + + Adaption + adaptation + + + components + Components + + + ADAPT_PREF_MG_ADAPT_SIZE_MAP + Size map + + + ADAPT_PREF_MG_ADAPT_SIZE_MAP_LOCAL + Local + + + ADAPT_PREF_MG_ADAPT_SIZE_MAP_BACKGROUND + Background + + + ADAPT_PREF_MG_ADAPT_TIME_STEP_LAST + Last + + + ADAPT_PREF_MG_ADAPT_TIME_STEP + Choosen time step + + + ADAPT_PREF_MG_ADAPT_TIME_STEP_C + Value + + + MG_ADAPT_SELECT_FILE_0 + MG-ADAPT select file + + + ADAPT_PREF_MG_ADAPT_ADVOP + Advanced Options + SMESH_VISU_PROBLEM Mesh visualization failed @@ -3112,6 +3316,10 @@ Use Display Entity menu command to show them. STB_CONSTRUCT_GROUP Construct Group + + STB_MG_ADAPT + Remesh with MG_Adapt + STB_CONV_TO_QUAD Convert to/from quadratic @@ -3708,6 +3916,10 @@ Use Display Entity menu command to show them. TB_CTRL3D Volume Controls Toolbar + + TB_ADAPTATION + Adaptation Toolbar + TB_MEASUREM Measurements Toolbar @@ -3812,6 +4024,10 @@ Use Display Entity menu command to show them. TOP_CONSTRUCT_GROUP Construct Group + + TOP_MG_ADAPT + Remesh with MG_Adapt + TOP_CONV_TO_QUAD Convert to/from quadratic @@ -4443,8 +4659,8 @@ Use Display Entity menu command to show them. FULL_RECOMPUTE_QUESTION -The mesh has been edited since a last total re-compute -that may prevent successful computation. +The mesh has been edited since a last total re-compute +that may prevent successful computation. Do you wish to re-compute the mesh totally to discard the modifications? @@ -6637,7 +6853,7 @@ Please specify them and try again GEOMETRY_OBJECT_IS_NOT_DEFINED_MESH Geometry object is not defined. -Do you want to create an empty mesh +Do you want to create an empty mesh without algorithms and hypotheses? @@ -6712,7 +6928,7 @@ select mesh or sub-mesh and try again CONCURRENT_SUBMESH_APPEARS -The assigned algorithm has the same priority as one assigned to an +The assigned algorithm has the same priority as one assigned to an adjacent sub-mesh, hence it's undefined which algorithm to use for meshing boundary shared by two sub-meshes. Would you like to set the order of sub-mesh computation? @@ -8322,7 +8538,7 @@ as they are of improper type: SUBSHAPES_NOT_FOUND_MSG -Some sub-shapes not found in the new geometry. They are listed +Some sub-shapes not found in the new geometry. They are listed below along with dependent mesh objects that are marked with red in the Object Browser. diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts index 318c62947..b69f4650a 100644 --- a/src/SMESHGUI/SMESH_msg_fr.ts +++ b/src/SMESHGUI/SMESH_msg_fr.ts @@ -340,6 +340,126 @@ MEN_CONSTRUCT_GROUP Construire un groupe + + MEN_MG_ADAPT + Remaillage avec MG_Adapt + + + Args + Arguments + + + MeshOut + Maillage en sortie + + + MeshIn + Maillage en entrée + + + MEDFile + Fichier MED + + + Browser + Arbre d'études + + + Publish_MG_ADAPT + Publication + + + SIZE_MAP_FIELD + Champ de la carte de taille + + + MG_ADAPT_FIELD_NAME + Nom du champ + + + MG_ADAPT_MED_FILE_1 + Ce fichier MED est illisible. + + + MG_ADAPT_MED_FILE_2 + Ce fichier MED ne contient aucun maillage. + + + MG_ADAPT_MED_FILE_3 + Ce fichier MED contient plus d'un maillage. + + + MG_ADAPT_MED_FILE_4 + Impossible de lire le maillage de ce fichier MED. + + + MG_ADAPT_MED_FILE_5 + Ce fichier MED ne contient aucun champ. + + + MG_ADAPT_ERROR + Erreur + + + MG_ADAPT_CH_ST + Pas de temps choisi + + + MG_ADAPT_RANK + Numéro d'ordre + + + MG_ADAPT_TSTP + Pas de temps + + + MG_ADAPT_NO_T_ST + Sans pas de temps + + + MG_ADAPT_L_ST + Dernier pas de temps + + + MeshName + Nom du maillage + + + LOCAL_MG_ADAPT + Locale + + + BACKGRND_MG_ADAPT + Arrière-plan + + + CNST_MG_ADAPT + Constante + + + MED_FILE_BCKG + Fichier MED de la carte en arrière-plan + + + VALUE_MG_ADAPT + Valeur + + + SIZE_MAP_DEF + Définition de la carte de taille + + + ADVOP + Options avancées + + + MG_ADAPT_DIAG_1 + Adaptation réussie. + + + MG_ADAPT_DIAG_2 + Echec de l'adaptation. + MEN_CONV_TO_QUAD Convertir vers/depuis quadratique @@ -482,7 +602,7 @@ MEN_EDIT - Edition + Editer MEN_EDIT_GROUP @@ -788,6 +908,10 @@ MEN_MODIFY Modification + + MEN_ADAPT + Adaptation + MEN_MEASURE Outils de mesure @@ -2895,6 +3019,82 @@ Référez-vous à la documentation sur l'algorithme et la géométrie supportée SMESH_MULTICOLOR Multicouleur + + ADAPT_PREF_TAB_GENERAL + Adaptation + + + ADAPT_PREF_NONE + Sans + + + ADAPT_PREF_MG_ADAPT + Adaptation avec MG-Adapt + + + ADAPT_PREF_MG_ADAPT_FILE_MAILLAGE_OUT + Ecriture du maillage de sortie + + + ADAPT_PREF_MG_ADAPT_PUBLICATION_MAILLAGE_OUT + Publication du maillage de sortie + + + OPTION_VALUE_COLUMN + Option + + + OPTION_NAME_COLUMN + Valeur + + + compute_ridges + Calcul des crêtes + + + max_memory + Maximum mémoire (Mb) + + + Adaption + Adaptation + + + components + Composantes + + + ADAPT_PREF_MG_ADAPT_SIZE_MAP + Carte de tailles + + + ADAPT_PREF_MG_ADAPT_SIZE_MAP_LOCAL + Locale + + + ADAPT_PREF_MG_ADAPT_SIZE_MAP_BACKGROUND + Arrière-plan + + + ADAPT_PREF_MG_ADAPT_TIME_STEP_LAST + Dernier + + + ADAPT_PREF_MG_ADAPT_TIME_STEP + Choix du pas de temps + + + ADAPT_PREF_MG_ADAPT_TIME_STEP_C + Valeur + + + MG_ADAPT_SELECT_FILE_0 + MG-ADAPT selection fichier MED + + + ADAPT_PREF_MG_ADAPT_ADVOP + Options avancées + SMESH_VISU_PROBLEM Impossible de visualiser le maillage, probablement à cause d'un manque de mémoire @@ -3111,6 +3311,10 @@ Utilisez le menu "Visualiser une entité" pour les afficher. STB_CONSTRUCT_GROUP Construire un groupe + + STB_MG_ADAPT + Remaillage avec MG_Adapt + STB_CONV_TO_QUAD Convertir vers/depuis quadratique @@ -3707,6 +3911,10 @@ Utilisez le menu "Visualiser une entité" pour les afficher. TB_CTRL3D Barre des contrôles des volumes + + TB_ADAPTATION + Barre de l'adaptation + TB_MEASUREM Barre des mesures @@ -3811,6 +4019,10 @@ Utilisez le menu "Visualiser une entité" pour les afficher. TOP_CONSTRUCT_GROUP Construire un groupe + + TOP_MG_ADAPT + Remaillage avec MG_Adapt + TOP_CONV_TO_QUAD Convertir vers/de quadratique diff --git a/src/SMESH_I/CMakeLists.txt b/src/SMESH_I/CMakeLists.txt index 9079fbf5a..b9df761dd 100644 --- a/src/SMESH_I/CMakeLists.txt +++ b/src/SMESH_I/CMakeLists.txt @@ -40,6 +40,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/SMESHUtils ${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/idl + ${MEDCOUPLING_INCLUDE_DIRS} ) # additional preprocessor / compiler flags @@ -84,6 +85,7 @@ SET(_link_LIBRARIES SMESHDS SMESHControls MeshDriverMED + ${MEDCoupling_medloader} ) # --- headers --- @@ -113,6 +115,7 @@ SET(SMESHEngine_HEADERS SMESH_MeshPartDS.hxx SMESH.hxx SMESH_Component_Generator.hxx + MG_ADAPT_i.hxx ) # --- sources --- @@ -141,6 +144,7 @@ SET(SMESHEngine_SOURCES SMESH_Measurements_i.cxx SMESH_PreMeshInfo.cxx SMESH_Component_Generator.cxx + MG_ADAPT_i.cxx ) # --- rules --- diff --git a/src/SMESH_I/MG_ADAPT_i.cxx b/src/SMESH_I/MG_ADAPT_i.cxx new file mode 100644 index 000000000..188a35236 --- /dev/null +++ b/src/SMESH_I/MG_ADAPT_i.cxx @@ -0,0 +1,528 @@ +// 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 +// + +#include "MG_ADAPT_i.hxx" + +#include "string.h" +#include "SMESH_Gen_i.hxx" +#include +#include +#include CORBA_CLIENT_HEADER(SALOMEDS) + + +//============================================================================= +/*! + * SMESH_Gen_i::CreateMG_ADAPT + * + * Create measurement instance + */ +//============================================================================= + + +using namespace SMESH; +void MG_ADAPT_i::copyHypothesisDataToImpl(const SMESH::MgAdaptHypothesisData& from, ::MG_ADAPT::MgAdaptHypothesisData* to) const +{ + to->myFileInDir = from.myFileInDir; + to->myMeshFileIn = from.myMeshFileIn; + to->myMeshFileBackground = from.myMeshFileBackground; + to->myOutMeshName = from.myOutMeshName; + to->myMeshFileOut = from.myMeshFileOut; + to->myFileOutDir = from.myFileOutDir; + to->myFileSizeMapDir = from.myFileSizeMapDir; + to->myFieldName = from.myFieldName; + to->fromMedFile = from.fromMedFile; + to->myPublish = from.myPublish; + to->myMeshOutMed = from.myMeshOutMed; + to->myUseLocalMap = from.myUseLocalMap; + to->myUseBackgroundMap = from.myUseBackgroundMap; + to->myUseConstantValue = from.myUseConstantValue; + to->myConstantValue = from.myConstantValue; + to->myTimeStep = from.myTimeStep; + to->myRank = from.myRank; + to->myUseNoTimeStep = from.myUseNoTimeStep; + to->myUseLastTimeStep = from.myUseLastTimeStep; + to->myUseChosenTimeStep = from.myUseChosenTimeStep; + to->myWorkingDir = from.myWorkingDir; + to->myLogFile = from.myLogFile; + to->myPrintLogInFile = from.myPrintLogInFile; + to->myKeepFiles = from.myKeepFiles; + to->myRemoveLogOnSuccess = from.myRemoveLogOnSuccess; + to->myVerboseLevel = from.myVerboseLevel; +} +void MG_ADAPT_i::copyHypothesisDataFromImpl(const ::MG_ADAPT::MgAdaptHypothesisData* from, SMESH::MgAdaptHypothesisData* to) const +{ + to->myFileInDir = CORBA::string_dup(from->myFileInDir.c_str()); + to->myMeshFileIn = CORBA::string_dup(from->myMeshFileIn.c_str()); + to->myMeshFileBackground = CORBA::string_dup(from->myMeshFileBackground.c_str()); + to->myOutMeshName = CORBA::string_dup(from->myOutMeshName.c_str()); + to->myMeshFileOut = CORBA::string_dup(from->myMeshFileOut.c_str()); + to->myFileOutDir = CORBA::string_dup(from->myFileOutDir.c_str()); + to->myFileSizeMapDir = CORBA::string_dup(from->myFileSizeMapDir.c_str()); + to->myFieldName = CORBA::string_dup(from->myFieldName.c_str()); + to->fromMedFile = from->fromMedFile; + to->myPublish = from->myPublish; + to->myMeshOutMed = from->myMeshOutMed; + to->myUseLocalMap = from->myUseLocalMap; + to->myUseBackgroundMap = from->myUseBackgroundMap; + to->myUseConstantValue = from->myUseConstantValue; + to->myConstantValue = from->myConstantValue; + to->myTimeStep = from->myTimeStep; + to->myRank = from->myRank; + to->myUseNoTimeStep = from->myUseNoTimeStep; + to->myUseLastTimeStep = from->myUseLastTimeStep; + to->myUseChosenTimeStep = from->myUseChosenTimeStep; + to->myWorkingDir = CORBA::string_dup(from->myWorkingDir.c_str()); + to->myLogFile = CORBA::string_dup(from->myLogFile.c_str()); + to->myPrintLogInFile = from->myPrintLogInFile; + to->myKeepFiles = from->myKeepFiles; + to->myRemoveLogOnSuccess = from->myRemoveLogOnSuccess; + to->myVerboseLevel = from->myVerboseLevel; +} +SMESH::MG_ADAPT_ptr SMESH_Gen_i::CreateMG_ADAPT() +{ + SMESH::MG_ADAPT_i* aMGadapt = new SMESH::MG_ADAPT_i(); + SMESH::MG_ADAPT_var anObj = aMGadapt->_this(); + return anObj._retn(); +} +SMESH::MG_ADAPT_ptr SMESH_Gen_i::CreateAdaptationHypothesis() +{ + SMESH::MG_ADAPT_i* aMGadapt = new SMESH::MG_ADAPT_i(); + SMESH::MG_ADAPT_var anObj = aMGadapt->_this(); + return anObj._retn(); +} +SMESH::MG_ADAPT_OBJECT_ptr SMESH_Gen_i::Adaptation( const char* adaptationType) +{ + + if (!strcmp(adaptationType, "MG_Adapt")) + { + SMESH::MG_ADAPT_OBJECT_i* mg_adapt_object = new SMESH::MG_ADAPT_OBJECT_i(); + SMESH::MG_ADAPT_OBJECT_var anObj = mg_adapt_object->_this(); + return anObj._retn(); + } + +} +//~SMESH::MG_ADAPT_ptr MG_ADAPT_i::CreateMG_ADAPT() +//~{ + + //~SMESH_Gen_i* smeshGen_i = SMESH_Gen_i::GetSMESHGen(); + //~SMESH::MG_ADAPT_i* aMGadapt = new SMESH::MG_ADAPT_i(smeshGen_i->GetPOA()); + //~SMESH::MG_ADAPT_var anObj = aMGadapt->_this(); + //~return anObj._retn(); +//~} +//============================================================================= +/*! + * standard constructor + */ +//============================================================================= +MG_ADAPT_i::MG_ADAPT_i(): SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() ) +{ + myMgAdapt = new ::MG_ADAPT::MgAdapt(); +} +//~MG_ADAPT_i::MG_ADAPT_i(PortableServer::POA_var myPoa): SALOME::GenericObj_i( myPoa ) +//~{ + //~myMgAdapt = new ::MG_ADAPT::MgAdapt(); +//~} + +//============================================================================= +/*! + * standard constructor + */ +//============================================================================= +//~MG_ADAPT_i::MG_ADAPT_i( CORBA::ORB_ptr orb, + //~ADAPT::ADAPT_Gen_var engine ) +//~{ + + //~_gen_i = engine; + //~_orb = orb; + //~myMgAdapt = new MgAdapt(); +//~} + +//============================================================================= +/*! + * standard destructor + */ +//============================================================================= +MG_ADAPT_i::~MG_ADAPT_i() +{ +} +void MG_ADAPT_i::setData( SMESH::MgAdaptHypothesisData& data) +{ + ::MG_ADAPT::MgAdaptHypothesisData* baseData = new ::MG_ADAPT::MgAdaptHypothesisData(); + copyHypothesisDataToImpl(data, baseData); + myMgAdapt->setData(baseData); + delete baseData; +} +void MG_ADAPT_i::setMedFileIn(const char* str) +{ + myMgAdapt->setMedFileIn(str); +} +char* MG_ADAPT_i::getMedFileIn() +{ + return CORBA::string_dup(myMgAdapt->getMedFileIn().c_str()); +} +void MG_ADAPT_i::setMedFileOut(const char* str) +{ + myMgAdapt->setMedFileOut(str); +} +char* MG_ADAPT_i::getMedFileOut() +{ + return CORBA::string_dup(myMgAdapt->getMedFileOut().c_str()); +} +void MG_ADAPT_i::setMeshName(const char* str) +{ + myMgAdapt->setMeshName(str); +} +char* MG_ADAPT_i::getMeshName() +{ + return CORBA::string_dup(myMgAdapt->getMeshName().c_str()); +} +void MG_ADAPT_i::setMeshNameOut(const char* str) +{ + myMgAdapt->setMeshNameOut(str); +} +char* MG_ADAPT_i::getMeshNameOut() +{ + return CORBA::string_dup(myMgAdapt->getMeshNameOut().c_str()); +} +void MG_ADAPT_i::setMeshOutMed(bool mybool) +{ + myMgAdapt->setMeshOutMed(mybool); +} +bool MG_ADAPT_i::getMeshOutMed() +{ + return myMgAdapt->getMeshOutMed(); +} +void MG_ADAPT_i::setPublish(bool mybool) +{ + myMgAdapt->setPublish(mybool); +} +bool MG_ADAPT_i::getPublish() +{ + return myMgAdapt->getPublish(); +} +void MG_ADAPT_i::setSizeMapFieldName(const char* str) +{ + myMgAdapt->setFieldName(str); +} +char* MG_ADAPT_i::getSizeMapFieldName() +{ + return CORBA::string_dup(myMgAdapt->getFieldName().c_str()); +} +void MG_ADAPT_i::setTimeStep(CORBA::Long t) +{ + myMgAdapt->setTimeStep(t); +} +CORBA::Long MG_ADAPT_i::getTimeStep() +{ + return myMgAdapt->getTimeStep(); +} +void MG_ADAPT_i::setTimeStepRank(CORBA::Long t, CORBA::Long r) +{ + myMgAdapt->setChosenTimeStepRank(); + myMgAdapt->setRankTimeStep(t, r); +} +CORBA::Long MG_ADAPT_i::getRank() +{ + return myMgAdapt->getRank(); +} +void MG_ADAPT_i::setTimeStepRankLast() +{ + myMgAdapt->setTimeStepRankLast(); +} +void MG_ADAPT_i::setNoTimeStep() +{ + myMgAdapt->setNoTimeStep(); +} +void MG_ADAPT_i::setLogFile(const char* str) +{ + myMgAdapt->setLogFile(str); +} +char* MG_ADAPT_i::getLogFile() +{ + return CORBA::string_dup(myMgAdapt->getLogFile().c_str()); +} + +void MG_ADAPT_i::setVerbosityLevel(CORBA::Long v) +{ + myMgAdapt->setVerbosityLevel(v); +} +CORBA::Long MG_ADAPT_i::getVerbosityLevel() +{ + return myMgAdapt->getVerbosityLevel(); +} +void MG_ADAPT_i::setRemoveOnSuccess(bool mybool) +{ + myMgAdapt->setRemoveOnSuccess(mybool); +} +bool MG_ADAPT_i::getRemoveOnSuccess() +{ + myMgAdapt->getRemoveOnSuccess(); +} +SMESH::MgAdaptHypothesisData* MG_ADAPT_i::getData() +{ + SMESH::MgAdaptHypothesisData* result = new SMESH::MgAdaptHypothesisData(); + ::MG_ADAPT::MgAdaptHypothesisData* from = myMgAdapt->getData(); + copyHypothesisDataFromImpl(from, result); + return result; +} +void MG_ADAPT_i::setUseLocalMap(bool mybool) +{ + myMgAdapt->setUseLocalMap(mybool); +} +bool MG_ADAPT_i::getUseLocalMap() +{ + return myMgAdapt->getUseLocalMap(); +} +void MG_ADAPT_i::setUseBackgroundMap(bool mybool) +{ + myMgAdapt->setUseBackgroundMap(mybool); +} +bool MG_ADAPT_i::getUseBackgroundMap() +{ + return myMgAdapt->getUseBackgroundMap(); +} +void MG_ADAPT_i::setUseConstantValue(bool mybool) +{ + myMgAdapt->setUseConstantValue(mybool); +} +bool MG_ADAPT_i::getUseConstantValue() +{ + return myMgAdapt->getUseConstantValue(); +} +void MG_ADAPT_i::setConstantSize(double value) +{ + myMgAdapt->setConstantValue(value); +} +double MG_ADAPT_i::getConstantSize() +{ + return myMgAdapt->getConstantValue(); +} +void MG_ADAPT_i::setSizeMapFile(const char* str) +{ + myMgAdapt->setSizeMapFile(str); +} +char* MG_ADAPT_i::getSizeMapFile() +{ + return CORBA::string_dup(myMgAdapt->getSizeMapFile().c_str()); +} +void MG_ADAPT_i::setFromMedFile(bool mybool) +{ + myMgAdapt->setFromMedFile(mybool); +} +bool MG_ADAPT_i::isFromMedFile() +{ + return myMgAdapt->isFromMedFile(); +} + +void MG_ADAPT_i::setKeepWorkingFiles(bool mybool) +{ + myMgAdapt->setKeepWorkingFiles(mybool); +} +bool MG_ADAPT_i::getKeepWorkingFiles() +{ + return myMgAdapt->getKeepWorkingFiles(); +} + +//~void MG_ADAPT_i::setPrCORBA::LongLogInFile(bool); +//~bool MG_ADAPT_i::getPrCORBA::LongLogInFile(); + +void MG_ADAPT_i::setSizeMapType(const char* type) +{ + setUseLocalMap(false); + setUseBackgroundMap(false); + setUseConstantValue(false); + + if (!strcmp("Local", type)) + setUseLocalMap(true); + else if (!strcmp("Background", type)) + setUseBackgroundMap(true); + else + setUseConstantValue(true); +} +void MG_ADAPT_i::setWorkingDir(const char* dir) +{ + myMgAdapt->setWorkingDir(dir); +} +char* MG_ADAPT_i::getWorkingDir() +{ + return CORBA::string_dup(myMgAdapt->getWorkingDir().c_str()); +} +bool MG_ADAPT_i::setAll() +{ + return myMgAdapt->setAll(); +} +char* MG_ADAPT_i::getCommandToRun() +{ + return CORBA::string_dup(myMgAdapt->getCommandToRun().c_str()); +} + +void MG_ADAPT_i::compute() +{ + errStr = ""; + try + { + myMgAdapt->compute(errStr); + } + catch (const std::exception& e) + { + std::ostringstream oss; oss << "Exception thrown on MG_ADAPT_i::compute invocation with error message \"" << errStr + << "\" with exception message \"" << e.what() << "\""; + THROW_SALOME_CORBA_EXCEPTION(oss.str().c_str(),SALOME::INTERNAL_ERROR); + } + if(myMgAdapt->getPublish()) + { + SMESH_Gen_i* smeshGen_i = SMESH_Gen_i::GetSMESHGen(); + SMESH::DriverMED_ReadStatus theStatus; + smeshGen_i->CreateMeshesFromMED(myMgAdapt->getMedFileOut().c_str(), theStatus); + } +} +char* MG_ADAPT_i::getErrMsg() +{ + return CORBA::string_dup(errStr.c_str()); +} +char* MG_ADAPT_i::getFileName() +{ + return CORBA::string_dup(myMgAdapt->getFileName().c_str()); +} +char* MG_ADAPT_i::getExeName() +{ + return CORBA::string_dup(myMgAdapt->getExeName().c_str()); +} +void MG_ADAPT_i::copyMgAdaptHypothesisData( const SMESH::MgAdaptHypothesisData& data) +{ + ::MG_ADAPT::MgAdaptHypothesisData* baseData = new ::MG_ADAPT::MgAdaptHypothesisData(); + copyHypothesisDataToImpl(data, baseData); + myMgAdapt->copyMgAdaptHypothesisData(baseData); + delete baseData; +} + +//~void MG_ADAPT_i::checkDirPath(char*& str) +//~{ + //~myMgAdapt->checkDirPath(str); +//~} + +bool MG_ADAPT_i::hasOptionDefined( const char* optionName ) +{ + return myMgAdapt->hasOptionDefined(optionName); +} +void MG_ADAPT_i::setOptionValue(const char* optionName, + const char* optionValue) throw (std::invalid_argument) +{ + myMgAdapt->setOptionValue(optionName, optionValue); +} + +char* MG_ADAPT_i::getOptionValue(const char* optionName, + bool& isDefault) throw (std::invalid_argument) +{ + return CORBA::string_dup(myMgAdapt->getOptionValue(optionName, &isDefault).c_str()); +} +str_array* MG_ADAPT_i::getCustomOptionValuesStrVec() +{ + SMESH::str_array_var result = new SMESH::str_array(); + std::vector vals = myMgAdapt->getCustomOptionValuesStrVec(); + result->length(vals.size()); + for (int i = 0; i vals = myMgAdapt->getOptionValuesStrVec(); + result->length(vals.size()); + for (int i = 0; isetPrintLogInFile(mybool); +} +bool MG_ADAPT_i::getPrintLogInFile() +{ + return myMgAdapt->getPrintLogInFile(); +} +//~TOptionValues MG_ADAPT_i::getOptionValues() const; +//~const TOptionValues& MG_ADAPT_i::getCustomOptionValues() const ; + +MG_ADAPT_OBJECT_i::MG_ADAPT_OBJECT_i(): SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() ) +{ + medFileIn=""; + medFileOut=""; + medFileBackground=""; + publish = false; + //~myMesh = CORBA::nil; +} + +void MG_ADAPT_OBJECT_i::setMeshIn(SMESH::SMESH_Mesh_ptr theMesh ) +{ + myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh); +} +void MG_ADAPT_OBJECT_i::setMEDFileIn(const char* f) +{ + medFileIn = f; +} +void MG_ADAPT_OBJECT_i::setMEDFileOut(const char* f) +{ + medFileOut = f; +} +void MG_ADAPT_OBJECT_i::setMEDFileBackground(const char* f) +{ + medFileBackground = f; +} +void MG_ADAPT_OBJECT_i::AddHypothesis(SMESH::MG_ADAPT_ptr mg) +{ + + mg->setMedFileIn(medFileIn.c_str()); + mg->setMedFileOut(medFileOut.c_str()); + mg->setSizeMapFile(medFileBackground.c_str()); + hypothesis = SMESH::MG_ADAPT::_duplicate(mg); +} +CORBA::Long MG_ADAPT_OBJECT_i::Compute(bool publish) +{ + if(!checkMeshFileIn()){ + std::cerr<< "\n Error : Please check the MED file input or mesh input. \n"; + return -1; + } + hypothesis->setPublish(publish); + hypothesis->compute(); + return 0; +} + +bool MG_ADAPT_OBJECT_i::checkMeshFileIn() +{ + bool ret = false; // 1 ok , 0 nook + if(!::MG_ADAPT::MgAdapt::isFileExist(medFileIn)) + { + if(!myMesh->_is_nil()) + { + bool toOverwrite = true; + bool toFindOutDim = true; + medFileIn = hypothesis->getFileName(); + medFileIn+= ".med"; + myMesh->ExportMED(medFileIn.c_str(), false, -1, toOverwrite, toFindOutDim); + hypothesis->setMedFileIn(medFileIn.c_str()); + ret = true; + } + } + else + ret = true; + + return ret; +} diff --git a/src/SMESH_I/MG_ADAPT_i.hxx b/src/SMESH_I/MG_ADAPT_i.hxx new file mode 100644 index 000000000..edc398d07 --- /dev/null +++ b/src/SMESH_I/MG_ADAPT_i.hxx @@ -0,0 +1,162 @@ +#ifndef MG_ADAPT_I_HXX +#define MG_ADAPT_I_HXX + +#include "MG_ADAPT.hxx" +#include "SMESH.hxx" +#include +//~#include CORBA_SERVER_HEADER(ADAPT_Gen) +#include CORBA_SERVER_HEADER(MG_ADAPT) + +#include "SALOME_GenericObj_i.hh" +#include "SALOME_Component_i.hxx" +#include "SALOME_NamingService.hxx" +#include "Utils_CorbaException.hxx" +#include +#include +#include +#include + +//~struct MgAdaptHypothesisData; +//~static void copyHypothesisDataToImpl(SMESH::MgAdaptHypothesisData& from, MG_ADAPT::MgAdaptHypothesisData* to); +//~static void copyHypothesisDataFromImpl(MG_ADAPT::MgAdaptHypothesisData* from, SMESH::MgAdaptHypothesisData& to); +//~class MgAdapt; +namespace SMESH +{ + +class SMESH_I_EXPORT MG_ADAPT_i : + public virtual SALOME::GenericObj_i, + public virtual POA_SMESH::MG_ADAPT +{ +public: + //~MG_ADAPT_i( CORBA::ORB_ptr orb, ADAPT::ADAPT_Gen_var gen_i ); + //~static SMESH::MG_ADAPT_ptr CreateMG_ADAPT(); + //~MG_ADAPT_i(PortableServer::POA_var poa); + MG_ADAPT_i(); + virtual ~MG_ADAPT_i(); + //~void setData( SMESH::MgAdaptHypothesisData* data); + void setData( SMESH::MgAdaptHypothesisData& data); + + void setMedFileIn(const char* str); + char* getMedFileIn(); + + void setMedFileOut(const char* str); + char* getMedFileOut(); + + void setMeshName(const char* str); + char* getMeshName(); + + void setMeshNameOut(const char* str); + char* getMeshNameOut(); + + void setMeshOutMed(bool mybool); + bool getMeshOutMed(); + + void setPublish(bool mybool); + bool getPublish(); + + void setSizeMapFieldName(const char* str); + char* getSizeMapFieldName(); + + void setTimeStep(CORBA::Long t); + CORBA::Long getTimeStep() ; + + void setTimeStepRank(CORBA::Long t, CORBA::Long r ); + CORBA::Long getRank(); + + void setTimeStepRankLast(); + void setNoTimeStep(); + + void setLogFile(const char* str); + char* getLogFile(); + + void setVerbosityLevel(CORBA::Long v); + CORBA::Long getVerbosityLevel(); + + void setRemoveOnSuccess(bool mybool); + bool getRemoveOnSuccess(); + + SMESH::MgAdaptHypothesisData* getData() ; + void setSizeMapType(const char* type); + void setUseLocalMap(bool mybool); + bool getUseLocalMap(); + + void setUseBackgroundMap(bool mybool); + bool getUseBackgroundMap(); + + void setUseConstantValue(bool mybool); + bool getUseConstantValue(); + + void setConstantSize(double value); + double getConstantSize(); + + void setSizeMapFile(const char* str); + char* getSizeMapFile(); + + void setFromMedFile(bool mybool); + bool isFromMedFile(); + + void setKeepWorkingFiles(bool mybool); + bool getKeepWorkingFiles(); + + //~void setPrCORBA::LongLogInFile(bool); + //~bool getPrCORBA::LongLogInFile(); + + void setWorkingDir(const char* str); + char* getWorkingDir() ; + + void setPrintLogInFile(bool mybool); + bool getPrintLogInFile(); + + bool setAll(); + char* getCommandToRun() ; + void compute(); + char* getFileName(); + char* getExeName(); + void copyMgAdaptHypothesisData( const SMESH::MgAdaptHypothesisData& data ) ; + //~void copyMgAdaptHypothesisData( const SMESH::MgAdaptHypothesisData& data ) { + //~copyMgAdaptHypothesisData(&data); + //~} + + //~void checkDirPath(char*& str); + + bool hasOptionDefined( const char* optionName ) ; + void setOptionValue(const char* optionName, + const char* optionValue) throw (std::invalid_argument); + char* getOptionValue(const char* optionName, + bool& isDefault) throw (std::invalid_argument); + str_array* getCustomOptionValuesStrVec() ; + str_array* getOptionValuesStrVec() ; + void copyHypothesisDataFromImpl(const ::MG_ADAPT::MgAdaptHypothesisData* from, SMESH::MgAdaptHypothesisData* to) const; + void copyHypothesisDataToImpl(const SMESH::MgAdaptHypothesisData& from, ::MG_ADAPT::MgAdaptHypothesisData* to) const; + //~TOptionValues getOptionValues() const; + //~const TOptionValues& getCustomOptionValues() const ; + char* getErrMsg(); +private: + ::MG_ADAPT::MgAdapt* myMgAdapt; + std::string errStr; + //~CORBA::ORB_ptr _orb; + //~ADAPT::ADAPT_Gen_var _gen_i; + +}; + +class SMESH_I_EXPORT MG_ADAPT_OBJECT_i: + public virtual SALOME::GenericObj_i, + public virtual POA_SMESH::MG_ADAPT_OBJECT { +public : + MG_ADAPT_OBJECT_i(); + void setMeshIn( SMESH::SMESH_Mesh_ptr theMesh ); + void setMEDFileIn(const char* f); + void setMEDFileOut(const char* f); + void setMEDFileBackground(const char* f); + void AddHypothesis(SMESH::MG_ADAPT_ptr); + CORBA::Long Compute(bool Publish); +private: +std::string medFileIn, medFileOut, medFileBackground; +bool checkMeshFileIn(); +bool publish; +SMESH::SMESH_Mesh_ptr myMesh; +SMESH::MG_ADAPT_ptr hypothesis; +}; + +} +#endif // MG_ADAPT_I_HXX diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 5a5ba6fad..d5c6be399 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -477,6 +477,10 @@ public: int CountInPyDump(const TCollection_AsciiString& text); + SMESH::MG_ADAPT_ptr CreateMG_ADAPT(); + SMESH::MG_ADAPT_ptr CreateAdaptationHypothesis(); + SMESH::MG_ADAPT_OBJECT_ptr Adaptation( const char* adaptationType); + // ***************************************** // Internal methods // ***************************************** -- 2.39.2