From 03d855b75b0404e50b1b4a74d52f45d9de50654a Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 22 Mar 2021 15:02:50 +0300 Subject: [PATCH] bos #24009 Merge gni/adaptation branch (MG-Adapt) --- CMakeLists.txt | 63 +- SalomeSMESHConfig.cmake.in | 4 + doc/salome/examples/CMakeLists.txt | 1 + .../examples/MGAdaptTests_without_session.py | 472 +++++ .../examples/MGAdapt_med_files/test_01.med | Bin 0 -> 22900 bytes .../examples/MGAdapt_med_files/test_02.med | Bin 0 -> 25800 bytes .../examples/MGAdapt_med_files/test_02_bg.med | Bin 0 -> 71843 bytes .../examples/MGAdapt_med_files/test_04.med | Bin 0 -> 103188 bytes .../examples/MGAdapt_med_files/test_06.med | Bin 0 -> 23491 bytes .../examples/MGAdapt_med_files/test_07.med | Bin 0 -> 25636 bytes .../examples/MGAdapt_med_files/test_08.med | Bin 0 -> 8702 bytes .../examples/MGAdapt_med_files/test_08_bg.med | Bin 0 -> 24752 bytes .../examples/MGAdapt_med_files/test_10.med | Bin 0 -> 63374 bytes .../examples/MGAdapt_med_files/test_11.med | Bin 0 -> 90631 bytes .../examples/MGAdapt_med_files/test_13.med | Bin 0 -> 249077 bytes doc/salome/examples/tests.set | 1 + doc/salome/gui/SMESH/images/adaptation_01.png | Bin 0 -> 27514 bytes doc/salome/gui/SMESH/images/adaptation_02.png | Bin 0 -> 27968 bytes 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 | 148 ++ idl/SMESH_Gen.idl | 6 +- resources/CMakeLists.txt | 1 + resources/SalomeApp.xml.in | 8 + resources/adapt_mg_adapt.png | Bin 0 -> 2638 bytes src/CMakeLists.txt | 8 +- src/SMESH/CMakeLists.txt | 7 +- src/SMESH/MG_ADAPT.cxx | 1567 +++++++++++++++++ src/SMESH/MG_ADAPT.hxx | 278 +++ src/SMESHGUI/CMakeLists.txt | 6 +- src/SMESHGUI/SMESHGUI.cxx | 150 +- src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx | 428 +++++ src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h | 90 + src/SMESHGUI/SMESHGUI_MgAdaptDlg.cxx | 1338 ++++++++++++++ src/SMESHGUI/SMESHGUI_MgAdaptDlg.h | 279 +++ src/SMESHGUI/SMESHGUI_Operations.h | 2 + src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx | 20 +- 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 | 2 + src/SMESH_I/MG_ADAPT_i.cxx | 542 ++++++ src/SMESH_I/MG_ADAPT_i.hxx | 172 ++ src/SMESH_I/SMESH_Gen_i.hxx | 4 + src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx | 2 +- 48 files changed, 6025 insertions(+), 98 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 100755 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/SMESHGUI_MG_ADAPTDRIVER.cxx create mode 100644 src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h create mode 100644 src/SMESHGUI/SMESHGUI_MgAdaptDlg.cxx create mode 100644 src/SMESHGUI/SMESHGUI_MgAdaptDlg.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 2c6b952be..e1112805a 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,9 +237,19 @@ 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) + +SET (SALOME_SMESH_DISABLE_MG_ADAPT OFF) +IF(WIN32) + # On Windows temporarily disable MG_ADAPT + SET (SALOME_SMESH_DISABLE_MG_ADAPT ON) +ENDIF() +IF(SALOME_SMESH_DISABLE_MG_ADAPT) + ADD_DEFINITIONS(-DDISABLE_MG_ADAPT) +ENDIF() + IF(SALOME_SMESH_ENABLE_MEFISTO) SET(MEFISTO2D_NAME "MEFISTO_2D") ELSE(SALOME_SMESH_ENABLE_MEFISTO) @@ -247,32 +266,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) @@ -284,9 +303,9 @@ MARK_AS_ADVANCED(SALOME_SMESH_INSTALL_RES_DATA SALOME_SMESH_INSTALL_PLUGINS) 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/SalomeSMESHConfig.cmake.in b/SalomeSMESHConfig.cmake.in index 7c3c24132..70fe1217c 100644 --- a/SalomeSMESHConfig.cmake.in +++ b/SalomeSMESHConfig.cmake.in @@ -59,6 +59,10 @@ SET(SALOME_SMESH_BUILD_GUI @SALOME_BUILD_GUI@) SET(SALOME_SMESH_USE_CGNS @SALOME_SMESH_USE_CGNS@) SET(SALOME_SMESH_USE_TBB @SALOME_SMESH_USE_TBB@) SET(SALOME_SMESH_ENABLE_MEFISTO @SALOME_SMESH_ENABLE_MEFISTO@) +SET(SALOME_SMESH_DISABLE_MG_ADAPT @SALOME_SMESH_DISABLE_MG_ADAPT@) +IF(SALOME_SMESH_DISABLE_MG_ADAPT) + LIST(APPEND SMESH_DEFINITIONS "-DDISABLE_MG_ADAPT") +ENDIF() IF(NOT WIN32) LIST(APPEND SMESH_DEFINITIONS "-DENABLE_MEFISTO") ENDIF(NOT WIN32) diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt index 0920815b5..7ecb2db4a 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 0000000000000000000000000000000000000000..71664bb313795fbc68c61bad62619edab72264b3 GIT binary patch literal 22900 zcmeI430xJ`+sEf#;EI9>=91!q-~s}QO4{FT<^q>R;evqV4!G}8YMNy(f7i^VT>qA( zr2bJ`G}AOS2F+44wAH1u)N-vL&D=8H-|x;D7VkxPP2czL`+7c~FK3oB=XuU~o;l|^ zGjo|09T8c%Qte7cS64|-1tN{^t{n*xCsM0UTN)o7k!bX(du>ghXEWFI(erV}sw|^l zsOOc8l0lM8wIyU#VyuzzNvTm5t0mDKYf0KIDmCFsgH*v{O-hY3nKqi+Y?~L}mK$aceH7;CfJ}a2RldTB*UUQzOmc zmVq3IkUY_dVB8E$RxQIcrf+Du$ySRPpCql8M^mHCU6apO(@Lk7v)O{d1ad}HoFB~h<6KJJBzT1DkiGAz+f zNscqOsPxCGmSHxP>}FocU_kF04M>{M!XekGmSkv)V+p{(Ka5wjLavgFt7I@5jkaA^ zgbYrGtV-JTENM%t^^O1V{95#Y&h*v0sb-it>26jh@h-TV6-Jr6hDYDU7Dpt;$0Xmy z`tD|1AJp|f*8?06ID#`&=Y-$_xWeMR#leyT8^;L-ejNTQ1FXfQDgcAKEkNX2?;*fJ zzdB%;#6kaIPz!JxVVK7WuP(r}A=L*ypaI~-;e)2M-SfcT|o+X3@|$E4tju|pcm*3`hZlB2GT)a&=2$n1HeEq2n+^8 zz)&y@3~=rs$iBRa zIN?tD1J^p@8jjy7S8%N(bi32uw5x7U-FCDYZKK;n_m9$iL-z|u{-FCoX+EIa-;v#+ z!aYrQ5U!OcICBs|(t<@1WIGOYOzhyIKeDiwK?WO8 z7GM(L0!~Z$*(DnhZ~q|EuBG8o_M-K%qIcAonU0-k9J{&lE!`}hT;t&bUId57$F~#) za_mH`!O8~+NHeso=p}O8SK`dAPqcFmj=sS`&GEaez{jp3;7+ z6_xbdshVVP)Y0}2Xstflr9YUo+;K}w8pXlb#>WLE3YBV^V|FRo4|%Q%~n*pZ(xv3AwyxdHr!XuJoRNV-(6M?ce+6Jg!r& z?pt>Q^%Tk%^_RLYa>Z|rB4&(ylat<_ML7} ze=udWuQ@zOQFiVa@RF;S8q#WE*yL8h%GvxCfs0Z8QB4o!>^i@tkfZi!I_Tfq8a7gn zcjAy7dQYQb{VR87A2BrJ?>}iofDIHU57E~OXVNkQqE$-sq z+)Ev->8(a+?NT#FdOTJe?H27&ljp8%^4iECwU-(?y??_->ZJYG>NR*KNL@9f0&0_;vr2_0_=(%tMEH)l>`G_w8?8;;z;oI6b%byBD+5GmjttV(mrw=%23J zt&80i&!eM9pqw&w`J%PBPT4xkJ2h&vpAwxM^=96l`s$(Cb8^3sYN}5@+0s8eBtVIM zXF$$8Lrvvj>*$32AJ$hIp4@EOanw)g|9EeYE1&tPM*`an%so(7QCBO&U&*bj)_J_; z>}6q%)wv$O&yCsOt2~#|I`WMUjg_-GOMJgP)kyjFyZWoMw)v`(_ZF8$Z5s>!d03Hb z>0#yS=rgm<1U;nuDsn9fD>^UAsd_HTtD?Lr$`_s=*ZZ+4)5g?PWZZnk7c@>6iW^!w*$aeAYKKfJxc#)5TDhPn-V1oQS>#rRGa-#a2}(=Vmyicg)XzMbks| z`MkkG%K2fM)4J39s;J5qt2gw~kEuAr;g~n@ur>538sr z-WuF{ttCIZ;I#@9Q{(bw&&B)W4-c!L_+%`;*s`5bJ@os&Egco3s+#-`?P_II4h;|P zRyo|Ls4h|7UhjuzXVg42!{fN58m4W&sVu&hZFq6erjwO_%{I+?c1-8@cW0Xtykn*w z%gHwN$cPz!5&7`;?J~FR&dv$;J-~A5M}2+FxNiQ}D+kOBG^ld>HW?Edi_Gg*^fX2VQ-|pv>>sB*3lnV0r!r z{X5O=I84qS5_s;d8yDou%{}`sirOj{9G*FR#-?+!c~NH6U*^2*%k9>-9kghRoKsS?Ty0TiWUTE~5uY9~vW&Atq*~)s6B6SiWAI%>j5XPk zXf?-{FJ8GNs7bPmsTpY|URyu6tPqV65|f@gxl4xP-}>2yW{>h+7}8b|%--|RjPIE4 zdNMrrQu5vJn|!`=K)S#Crc%m)I%O{fy2kw$ptW{moztbg0pMCBg)b_R^hINd)l8D5 zrT%$LIUK3f@Llw~CJ286ax7cf1jluX)l8f@rh`~%t=|~^_H7nq3xw_tn_!KPSitwQ zNRGv^6W+#xlj#jDE4Co(*-RV~_m$X_Mm(AHP+1e+8@b~WCrl{hU zF{qT)?mfACkM+xRy*mSJlqKG7>>OC$#@*5bjz{4O$zh+BWk+@=lb)At$E)xurYtQh z#q&xi=;+nQ|FRu7^~@b{_xomrm)0rwci&WB-R9-;jKX7^3l~^$UA@f^_K|pMSlSRa zU5wJD4`CetI|;BHb&LSiiN{z6b*3)VI}-2yAL+tiu5)(5o#{hQ^fw-2E14FGLUz1a?55C+(u z3V{C3zURIlU>jMUZEFGQf>waX6c7x|fcH%};Jp$7c&}JMTM!9&A4CC`ryo;h6W|Ww zfE%Enal0{y0kNPnpbxTN`~iJ78L+Q-o_f-E*-pJLSr2`kI9rXSEh zXn$|9O}$(J?M)jy0rms?hJ6(bXd^=VGy?2@e-I!rAg3-30rjZ`s1N;^b<&Sp0{S$4 zmU_~s=&wA^^YkqrK)ceWyq3Pz0MNI50sEG^(#QM&b!9tvj51pT`Zw<*`dD9Z;>7G+WfWwIX13InXSBVgP0zUYMQ7(joeU$YOGvybSHL4f^a z1@uk&GqBBrud1-($M}T{`WcmcPmn%5BrI6z#)9VulY9EB%CJx*HiA;L#ROW-LlXNL0)u`q7 zXB;^2h|BV_mP~q|=y}HhAUA=}3uE_1zspGvLcz=l+5noIr2q$G=^|H9OO zpL7l|@Ko(nt*1psM}$fGFL`-T`e;}qx5A%ATaps&9v#rN3JXNU*#9W2M1kb)_BBvU z;WOh1OOh?nph`BcEj-iJnrwf@wk%0Xw0{z#S86MeXemP~e${1Px9u5rS8I&@8C#{L zef&|_8P;x&Ki8mY57L7kc+dm)z6bb=&<8x|gZtG77|SzmXZ+0Am}{vJz?hlq8phvT z%P=NqoX;4Y@jBNyjNiFd;ndHy0AqWuO%%YGJq&~c#`gMJjIlr00$dw#-O(Auf;gbB zFA}iLbpzvg#_WvC8E-Q-XZ+20y*uauxL(lXe8&8Y)6+mY=nMJ*#`}!r8RIjqXWTyo zFs^4z&$R(#`H|ppkO7_mPl8ckG#CS(0%O5A@H7|?o&nE-3E(*}5ljM;!4&XMFcnM# z)4>cd6U+k7gW2E(FbB*9^T2%YB6tZb01Lq)uox@>OToXuGVn5Z1uO@zg4e(buo7f~ z*TE{V8ms~T23cS&SO?aFH^7_VE$}wj05*bmz$Wl6*bKIS_rO-L4ZIJwgB@Te_yA-B z736?jU^n;>>;WHvkHKEB59|k@fCJ!DkP8liL*O&;Irsv63BCefgTvqmI0}vd?eRSS zQ&4ek``dq$7ayCMlFj_*374Z$2~)V1{ms9No*JvE)S$RJ+-`0#`l50tgOKn=Cv9Uu zXDy#C@=7KsXDd{m#Z-vuZJX$fKU3AVqL!d?brq7kwUagd{JGV zJ}c$>Wmf8xpw-4Z#FpIj4O`y-ndkS~{=ZHI>^l7aIva#}HwtTNOAK4-5;f^wP~xD2 z9cQsf;VJDJALOGS(~ExZJbsw%|LeF=61DB`?-Z+@6>fx`ldV1CY^6*rRYfahy|q-| z9aGk5|Aj|yg|4NZYgh2$9RCZC4|cUPJ%m0mx-IFs-@wVT?Z5E2d|m75K-=@Qc2cGE zZXEC)r2ij1V6#7m8!c5w)=rvGci?3G$bEzeIw5=$A? z^{GaCOjAlt3*Tr}sg$Y4Se4chU-A}a;(IGh=mx1~DPJ9q6cd!=DT%X;JYGD2u#@neOYHU^sSb>&G_~dW8ZaWO ziyt=+?`TjAS-bk=U3F5nI0X!jt6jmazFYOt_ZKV~v36iBlcMbTcFgXz24!P&r!W1w z=gZ2P7kme8IVTr1yAm?}qZ4wK=*ZlJ9jD}(G4H%F&*y^t=;G#;-VL}Y?~*U{-1h1f zIq=GRBgdS$Dfe96eEEtACOi3cLU*OsK4?<*rnd+hn`%_f)-(V1@9%HO%J}-vr%RXQ zOM}Ck2MjtdZ@bWV>q7OEeD=(q_^-Y=S$co=-?1w9W0yiXmbYB`Tsdec++VY&>(fJg zZx&wfY|i=hnY=4!^)t`YfuqsSL-$~VGa3*Vub zlsePj-1&H`>+;!c(c{x={Ve}w^8N1eg+Juk{xg5rfAEr=uxZSy(UBMBUI+b*n@#6r zb)Pl&)V4f%PfnArd#j(5L!M~%U9-VI$QLX6dw4rtke_cCI`qKrm*fH4j-MIZ{)U|M zrg`0&=|%ebu6|_8g@OvoKfJCPC*+!xSH5X`yuk%$Wo3`y#@eaY>j{Lh>(V}d+y%KhA{xpi}vl!l+Y zaC%;sYx2yrZB3V3f0O6WdFSfM87JgZdq+L7YU4RMeYV*e-0q^>&}H|@54Xaee|>d* zaqKmD)Ug8N^wBruPlGqLPf5KgH}2HA#?0@3l6U>}-I}q#o{*n2HLLc)43qNecWz&1 z?Uj^G(^pkobj-QX4w;`i=U%s-mtP#aWJ{~JB;{b9&vQ+jev`ks&^XkXd0F-zkam2d zmy=S{ZDNJw4JM`4*-N((2u5sE2poU zIdmrC8FVAH?PyEiB*Lv5x z-ZkvKZBbHuLX$@A8X0|j1YIfI{yaS-3K8>9XMLWQ6rW)Xy8KSN+=~Ad7@KQpn2~H` z6b2!@+X;zg$<~Cl%$!7v)skUOv1IN;q24m5K{T*fGjmeS=EX9-=DeF~p&kk5%+=m{ zh_Kgy-(~1ge4FaJNv~AZq??)xPv_?Ph6>>!BYd^URC9mfCuO3GMG;0>rwq2c$_bOL zP6^QqQ7K`DCB-Qr3KY|y+%U{_KdKh3F1+|;b8K2lT1Tyonv2!(`~Dt$=wD;)P3lx} zq_y8e4b{u`X%D^jP{_DS?=VJcYIk8zu@v=p-W`7xy7q%KX z8VlBP$EZEg37ImLVEZ@)NS5a*(nW!+LsJLM6+u}8>^>pLn09|pjm=6)ko9_KDWwr9 zEfr$*z+qmZmlhx=s}_)D+2Sj9YMBubJ8g1Dac6~qUSn+;VvQDnGL*0K9}x2@1Wb#v zEfil?$Z~#i+!E2DLbc~s{d7zWuTX7Bf8TSWRfQ~vO1fPZxfKEye|_Rg(vB5(YeDs{ zMiThl7BQ*;>a7)vc#m(x*K5)wIg1U#%aUSAwd_NKyjyEwz6s{kD@ORNRCw8R5-v5Bh?rG1N_l_KqAMaLni z80PA?G^%Ae^`e6`y@_Mm#U1AkwOe8@EuCh0^TJXa>9JmdwX7aFAk&`8TT9hUPvz^F zs!_>fcj@+;y+CK63wnC(uWqk{{*d3!Do8e^C%hasg zguiz0C&TScayr2XgQ2Cgwg%}iNTf$wVdyQx(&c{!?T>Z_)FXX_mya+QjYhlIM;^UA z3?-U@l}<}(cN_TQKb)=JedSk>%-LDB*E)GDHfPpmaU#JS zSBt%^)uz=KRxg2i2~;Bi+I((Fnjk$71KgXy#+Tj3XqOGkL3~HA*nhVziQQLquEB7*GdM0Z=$}p+l+CSH zxd!dO7IOqajH&d>f^|ri(?uI4 z;E*ucy@ct5+$=GDkeel1 zA|EdvMT~r@rII`F*bmWZaY+MQzsXT%jV$ANSo}5n4c7`*ewTU@HIN=Hg~64;ov%@o zaAZ1#qp|CrRvsJ|wr>g=P$^-RgA-dxC^hs9`FPbqJ!_OY=;*pfs8~l@aL`q*st$MS2zK)lPR_DEZ*6F6yDew&(pqg4Kqb@1MT%ofhiYwcQ?l|5yW6 z-CWvI{q}MC=dHheC-W(n4{W|F%PFfLH2^r6GB7Pga`Yd z?R`8*@%5YIJ3Ta1IWcM5l(s!1l}X2^uI#g-tx~-2==U!P=un+n>k;6lwrDXCE@l_^9|}L?~Q$0Pl`~KcXp3?%Ew=g zie45wJ33N1TfDa03Yq?Py&cNg%^|B~J?gNoV_)3aIaK*_;J`Cldy4gN<)rRc$Bo}T z@`qdemD%6)T@g3cpbY)aHZLJ!P`{kkr41+K8`O>GRtyZg)n6T_w_A^J(MW<9a)<~36y)ZuE+`FWi~)maCxbnNtSg!<4pDP2eeitP=|FYd z)8+{i{adT0eMaS3SNf`f_sl;$;?0Y;k?X(w^3zQhO~*@oc3D^WDt^cBpDfcUb5}3l zB=add76s%aZVOS8vJzjp@P43Lw0OzkPep5W>eL=#aZ%w)%IjnH78+VBZLIgFAAB!R z>3n*d_wM5%O5VLAn*Q=hhY%6_lu6GX?x426x5wgVV!NnMH2wLBa{2x$-tHA`R1)b`q*sx?EWTjG;5qXiXss-qG3CBXM{iP=T^Jq{@Ts3t{IYm3;L)Z^ z!HISU7Jloi%-VT;zs8Lh`W9&6bKl-|o0hKqXGin3db3D(WpOm-Vn-wnGp1Q?`B|*!ixE=E|y1 z26b%_<*&^8A#X}tQ8OjzrOw`ar~4}6@*^Kklm4O(VLQEKy5g(73XdG}R<{1*Voxo7 z?)*JV;zt>jqV`@3Oye6UrKuZDOP80JzS(O1M>;Lj>Nz#fWAnEMnyJcm zYk+JI!__F=uSE5DG`z)lqxyBb5ryXHQk!{hkJIxaezVO^n3?@dc&TmH)#X-C8GlM| zw;HAQOIzJWSxn|HF|y=LmyTgHvpWGS|lu4yncC$-q* zx8h*h(TNR|p!^jVd)#SMi+(<^y`N%KRqv3ZccYC;(WJ;BP2!A->XjJa|8|@$zje`q zre6xxFmKzxloeNOh9}3qak|NmHt$7`JTTzxeKzm(faJL+_S(FMeBGFZ-3+R!Pp|w(oBnFD70kZy(Xk&)tv%1|ZnAHkt#sd4 zs`>a2Cexx6+iNmDzkA0;IX&fgbQ{<0@@)oXX}_Dp8xI&~TDm8%{}cTtnr!2{o!fHt zd()*`{qmM4?l6@eT{vmM8|O^sx^q+SvCFrc_BPnnVf*^;Y|x*2Ttfod zUdp$-zT5P%?=}-sg!W)SyXVw)n5mZd9BW!mdPZ78vV7w!*_vg^u$ogUzam`KUd3Tk zlj*eI=8m)ftIbAKw^id#iS+OlhKg@HJ8#h*#|bZA?wB?Ahi%dN>-E*n-|!e~-`bZ= zlJ*9Zbah)ceG41^TK$nAJN2hq^xht@JQ-ibsV1+Vo{R^}N~fAkOAn)*Et+#fk*b;& zf=|D+vIZPna9Znv>oRewNi`>%(5TGJbBC(v!n~eZp+dOqf;BCEd6iwz4rZ_Q&`a2% zqx`#u)bY^>ayXcsZ1e6*)oCc-iXf|>y(M@yxfX|A*8-|!VyrF>SbWk~DPfhPQ>(Mr zceS6fb_{KzCC$lx-opWrhtaanK&tATgA}f9k+b}IUE_A9{P0ZClGTstj@$JHr^E2q z%`v^StV@VHRwt>i-rL?U?wVJ{lwFGx{k5j-GFT$eJ8>3T?BXEJ#c*2;CkON=#2jG znYg>}5_Chp2$0uUSbM~+2~KOVGz31A|a1SW(1!2w_jm;Hq zliv=wOFnh{qscce+-1G}(iJQidKLoK)P5m*J^o81P~DcjE95{{zrFLpQdGCMcYAhj zI$7=ZE-NE?8y4!Bz2jf0PL_T~U6^F`vgBLov*i9xbFO!PmG<+ljz3%V-0t7m2rlQy z`1=ssw(Z|;-0|nb>+M`6am6KG`}ni&>w+ECjVVP-RzIfuv89>ir8m58j%jxIkq2vE zHc8mN)os~C+;{$qYHf%7z;iA(-|_cGWF=%~S_Hq1H^`6CXWMr+7aE<6u}AS^O@sXI z@l{Q6)Dss16O!U%1;3Eh0)IYpsI|dU`=z-i@;Q1=WK53!z06}cvKc(NXVT+)<>=qP zl;CJ(@PwHXjqUkw&(XeT>DNv#)8NSyVk3L(9Xayrlvy}!89Z6H_JwdxWcR2X?OT&~ zdHB+csQ>#PBmsBNtKMkywa%+Nzv4z&IG$4jke}yN-Xrjw%5xSpsqDO}AYUxV^C-`I zJpb{$$Xm&4okJPUb13&U=_ub(9z5Uj9M5w&&+$B`^IRQ;a!ASxQ{CyD&+|6Vy)2J% zj7NEt6VtIBlr!bRdjX!;`EnNT0Vsc-<9RQ@djpd7k<8C?Kl8EQWFFe9fILt0+)X)f zJlX%@NYDOaArR~r$D94)xU(N4k)Q43d7a~zi+J8caDzjAAbDTGdx>k^V=$iQd+HDM ziuV=_Cz+4;9iz}Ljw|y~pLuV-j9?Sc6TAteJ!uJlE3gIV1vUr$K|hdopc(v}=WXG?1>`*UfS>caDg4w6 zl6n(?`2Jw1gTJ$b-wHqH1?Npygm(iQfh@lb{A@2aEoI-9c_W^7lyYo{aN2Fkv7xu>b-e3aA^&k;`mQQ=ke%_3DUoaJH4AP!4ybHo<$5Y@R z0MZUpU&0VhJDUYR^@{l^Pug9Mr=wo7J=9N@$9}P$Y#;m2_*~RaIWeAgjq)6dbd*2m z73I(Q#_?i0+GPd#8BhC6{oy=jx-m%4bz%zq>>t}R4&i-3+HaOmdp{cStdH|758-1$ z>On62%tv|9?sC1GjC5=->tnebKemf{J^}gI{(Io3Ua%e`!kd6iLE2r~Succpg7mk9 z-_dR~M>y>P?FZ+70OA==dHEom^PBV71L4#M3;fipNccIANY0;7#8dyn;17480e;G* zGyIfKTlgs-+GDnp_P7Vq(N5FOQl7L^w69Fh{Ipv^D2MZv^OW_{ZgoOB+O1&tskf9X z?N|unDOZjM)3Kj1NJsn4^@#SbFXG#S>~BN(*-y?thEvZd7xtI(V84P;4*SJ^vLEax z+rxgvA|Kn^4}Oljqh9n!d@@M;N_$N`pr3j~`xt?I)F&(aw41cg45!>EUy|ur9_K6V z66Z17$#}LS3H1&J*>Bq2Aqc0uIDaTl&M(TFc9-K3hy1j=95*wyoX2cuF2Y$3^Rs@|M?IV5P(JlB58*6t9Q+JteUvZdO}S1)dfM?Z@Q(s%Z)t~_ zp8d;3I`(ri{QNepp8A{3^>V0}gC>D`J*d}%KSB?<2xz2FE#`TZ; zGOm+c&$*6redRum>o50J+^2D0z;&DZCI#yS*IDjwxE^!ecH9?p-RHi5`v&fJ2B6#& zFcsuJh5M0ogmb^a^_c58*GsN%TsOJ?aeW<%a)yE2UpTJkT<5u-<|6$_kn1k@8C=J? zE^{5{dd>BIJo0nB<~q%N1J~s#NOv!o58ek(1*d`cgAahy!T$jZzz4yHz=y#{z(>Iu z;7o89I2)V;{x3KeoCnSa7k~@FMc`xLV(@Wr3HSt92rdPm1fK$*2A6@$!4=?2a25D} z;4|Q#z-PhL;B(*_a4onFTn|1E{u$f=z5u=mZUi@ho57dBm%&%SE#Rx*R`50Ob?^=F zO>i5y9efMi0qz9f26utG!FRwtpbb>Pz2LjxKJY#8eef^f2jG720C*7m5Ih8a1Re%I z28+N?z$4(N;9tSdz|X;>;4$zxcmlLP!sS0YZx0*1{H}+}UgNf8raQgwZA8|xMDfYa z|5mV5qO76LC7~euTjTbRf8s5f_K$xIGR9tlR);+%+nVJZWB(rxWM(*jL|(CAd!h`B o8@0=S3dy++)Sm1dV=uU>Fa65|WF2ztZ}QpHde%$e-ynhi2VW$&m;e9( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..15f1b868b857090c150f78397a18502bf819de77 GIT binary patch literal 71843 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..81c116fa5997a8c0754bc8f039c49c2725752af6 GIT binary patch literal 103188 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 Dcex{j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e100452baaefb0baf741b82865c7a81798138cea GIT binary patch literal 25636 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e23077e8ecc9f5118606a2376f7b2ca527d39e95 GIT binary patch literal 8702 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..221291f4e49ea7c03cd4166289f4976acf2b08ba GIT binary patch literal 63374 zcmeI52V76@`~TmCkc4cJ><}9Ex|D`!FDbN#w2)0!2-%5J*;&cn@g|#O@4d&z-rN6m zz0Wx%<@4#+hwty}_jevWyUscHeeQGL*LB_FoO7S^p3up}tfXocRpnyEWYY3gT&BDg z_UMTLUxz)oY}3iaURm2I^kvWWo-cb!a*(nH$B_<{q^hz^NhVXNB7-PpVQpsP;BIbe zZEA01Y3i^?OjHF&D#?nPT06K~85xa0d|p)4d2b;zBZuKCIrenyWaM^2*u($du37Lx z$P#DgTNeCXmdb0$3g^zQS`C@35CYUV(8{Q@tTc3jRV>;vW&G#$oRKW7b4B73hf;%Utr#``@cmP?(jckAb_so(AWO7h^&EyZ@z|*Sx35QjKp_$?K*{|E$k` zg@m&g5p*U~F=Qj^G}6np=;yWXq_3Fy^Z%|8|IJ6&-hOwPnSCc)8P_&tS?TP&N_A$g zXwZhD5=94;95L&F5?O11zk+0>lwb^AbRgZ1N=L0b7W>uMv6BgMgfo}HZXccD;t?fe z(pfgIuYAeO0kLFK{)DvHz&V$~GF#aooI?t!v|I?+6r)LUcCRg6j2$h_aNegJght}) zSD7r)&b5fF7AIOm*x_iJswP{-F~l9l{erb*Exy^&!e4GLo5?%GG&)=h>n|Jp&5nM0 z@+ev6H-|h5?l@UioX;X2@?g%(^D>ifPFt(9+5=gIZw|@$)bO3m<(nOoZd`o-=y~jW z-t}iGkOuyB>sPv{c;27V`h7mJwoE~?gj%d5D`IMCYGt}e%#ez(&)UY+$z+hxLczNZ!!Qraj=RTZ3* z{aS`v`MS zTP)9(*i&o;FNvyDwAp;H)Sik`GJ%lpkN+dO*tSb;qc$uPwo*7kNmfavhrgmFF2eCR zw>~xtW#%YLEJC2*V@<;yu?s! zuWO0nlI-8gdc2~&F0v)zrm`#)v8&0NuRB&)W`HEC$u8`BP(pSXtJ<=NQ&Y>xnjnI< zY~<2g8ZsNjYKC?PE!jGxsx7NFW}u#|A6Bc&f{ULrkOgAkpe>8O5o{uBpjh4i`lg92 z1&39WnLPg7Nfxb0Vd$ue4l*0X+01;4I?1@wXv(Rl_S#nNAeSA&DQe0-&)y@Kom3naUt{%d zSu;gq8ttO*%StKoU~2sCwJb=H!Y#|*Z)Fb^tCNFYf0C8QYBibF`zoJhFK}2jnR3|1 z)>!$!vncE@j>l0dLH|&Tun4+>5`;yt0~9PQg1M!tBbug&6e{>dR?>n6q{dxTr`W>5 z=@picYNhCDVnvaO-j-F_LlLFPD4IjlSVv zV`*Vx`tvesYj5gc@bi+BaeDecF+JR2a93Oy{G>D;oNV2j{-m@x8BWjeC#T1a?$25r zf2MJfDYnPYOp??4nfl}On*S{2Asxq`>C8xv{pDxs&+%tEGxBF@-OPrk?8B<;tz+Cw;P97fgI)?`htdXY&T`0A+AX&=xAk~^byA9gZ=1ALL>_I`l zs|W2mUMToK=RvP>c+l2bd3w+|lb){%kfm%7vaJ2HJ;?9Gy+Xg(gVKIi4>}f9XmtV1 zRlqjrWeyMeSSL>p+T(xjX#uj7?LkxO{%jBW+Ol@VU+h6@8bYRjyI!pHm)>>-FjoOR z=tT|>YR7YVc*!}E&Mc%GP=G9Dd(d$)-TY)Sf8!wkgb_Z!*n_(Nt{znK>C)Q;Fjszz zlgBvdc@7U6(LivZ?>xxK?-n3S*&gKB=x2M7VZ~KVez6CA`dvM!;+2x21u$2B zs&^i3(9;|qRH#Xw9uzvf(TxIRDcgf$#dPzN$^5lJ*Ds%G@rymkQk&Cohs z0CVNXIC*%`lN=soDm}`{IS#r#PVZ9zvXt#X=f!mMlga#fP~8S29{yqvO88wpsG@i1 zr2?2MKgP+!gC6Jbpz+f4?VKJ|VcvqT1;|pi2UQWD>*ptv`STzP|1TeZu?Ic+T|KBr z-=vWRFjszzlZOXA%HctWr0G66J!osXrAGm>lOoIOuiRDubLGc4d3eyn93EsP&1ui+L0{dDrxqYf*&cLVOgBH7%%2C< z*nL{KbN}l+=<@ICK_ASI4l01T@?)GlJm^6V51QIG&ug(tvnqQQAWPXERI}aBzMAhh z<<4M5mVTWF>5A_J{C2%qS*<2T3t+ASdeHqG9(1C8o*pz_rOBHDWGUN&eCTI;(4i~J z*1y<;hW)M{)a$N__&tID(GB1NdeFTb9#qySPY?RqY)ksT@}Oif-TY)Sf4$h@+l$qI zu?J=Rt{$Y8IlNl|%#|PGSRX`8Aox_7JnCICBQTW421;|pi2L*Nd*&bwPx#IaR_Mo)i z)q|!RFMe47a~05oZsqVG&CYpxP;292!nF2+KATS!)6GvN^Vf^Lu%Gs;XLqQHZ(#p+ zz1Ty;t1_-(KOWAGEGcnzt=Ru_&mfHJ^+o0~hs|O8DQ~3|J zK{s-E&^+rrJ;)%Ubke`_AOoA9-HV01J$L;Vdyuu*`22Ql(C+z@ukag>;=@SMr2kHE zdeS4Wf0vSQw2{HjNF_TBBWX@R_O5@m#vf0?=R9Qm@)EvFA>;3q@MkmlD-=BGzck>f z+dKn^XG8NOTpsoC^e8RBFC6fcaehgO-?ZgdP1*oEP!I5nnf%=po{*;mxZ<&X`Lis| zfh*_^_%%6u&JFeGSO(4kzU5a0yaoIs=sVyH>Vu`A8z_ro=Rxv^ zWXfZ`GFXds{*sI)*72wK5E7@uy3q#T>bM5BS;wqf)+6VG(`S9KPT2;mf7T1zi1osH zXFITtxy+nTE(`0Hb;I_Qbj;=9yt9tk9-LRU6X&rFU>z9&Nyn@!*0DQay|SHI$E9kXuP4_LSC3v3(KG5ZVanDxp! zX5B8pI_s5n%(`8Vbwkh;v;=KIM_>X>K__4ax&TXH0l1Ot3VMLnz#Mc2^T9%}4r~Bh z!8ULNoCjCIL+}@P1RjGo;63;NJ^~HosT`;Ps(`9M2h<0;pb^jm`oI7ff)2n4m;rMT z0D6HS5DY>9e^4kK^aq2$U=RWL)1{GMELZ>*f<<64SOrqSdawa(1e-u6I0jCFQ{XbV z0kx z4PNJX49{2LSx-E7j%Q#pJeQZ@S>e2&-!EV|{`cwd+bay`i;>dc^M4DUhvE077=H7P z;deM0ejAwKyfb`WM#?9@Z_Y^jInNB|QOYNWeSbXXSIV-4MgT#+rDvL#U$o(vqVcd^mSt!c?j*nd~%P_c;cQO96qV z<;zvzVVMVl+v1se8Dd@UhD#S3cE|=^RV>T|Fv@eDUYCm0yN>-H!oLt3W?;WQP1DNA*J^&!(Tjbc=Edr9B$Zr zpaPgHKgP+U$K?z9>>jtfw^(6v4n3pokNvw>)1Hdy<|mW+^PtPi-c0_*9@L(1f?)aW zhMwg+x2=}92Z=*Zpla(q+M7Lm$mllbNK4zi{tWKF-K{$>qLWzXa}3t^M{%fq=!+R;4ssil!-X#L(+ zc{|b|R`bHiIn^u}Kx|Dq+SpVK5W@3zB2MAfL?Om_K}anTepMiFlDJDvl%hy@d!ngL z$4*`H{sEV)KFicmbdDE2&U@$WMA@HJZVu)0BFRGKWJ-A{I`P$snZ9u+7CXY4cLg?XPt*$mHg9y3j zj;#He1IuZU!ak9r{*rQ)Pco8Vza-Iqk<>&yUP@2U>t=ejAU&pRhcw!Lv{sEyb9T}7 zNBV|_hI8Oi$aDPhmN~(xD{Y zf3bPTjT}!p?uvb>ezMK`veGYq*0O4P`#m%|;L6+nPxeu4xivj*4cSYlloyYj_RaaE z<4+7JyT}abm+U?{{tP7Ns?W9s!f07 zzd9>i@UzG)JwJ=sJtxv*Ck44)^msOKSC$?GzdV$sH??)KJwr)ph`(U|vN^>v;>hE6spqVpC!)QhgO@ehVRDo# zW@){7`Y40e9Cm8M+tT?y8N9B)4Cjv;<9N7w*h(6Za;Y|#_vFp8MV=x4mIuzRtjBnt z-o?1wty@*yz3IO=<_YN^c_v+(1&{&@vk)Jk>0$q{YE#QBi5f$ zS@N{oNsFV0+`V-4CrTUliM0m>Hp~W~{I$n^HpN5m=_66hF?#rgN3my7m54EOp16UgGi7MGu zeFQRY0&Fd`{+pQE@ zj9%s3qBYbMt(KwTdTLqtNzLk|S5wPl^66XUtLaVVoHL8-ttUh0rIt%RuAze;E?M*W zT~oIeUV;3?*D;>J`MbTh*`ml|D=2(?!;I^*Q>cDDPyK1fpq7i)GNTSGp#o-f$} z`O$7`{c&gyKCC=$(>r=64cYHsDXHmBs?_6dg+8z3H1g1+d3TL=ll8R9o%y^w747O8 z(GDB3q@*XQ+~1dD^v+K0xg6!b9J|Hkc&TWoQ>dg^{!)%#o^$#U)rO7Ya($m(;LfD| z+w^x+u;&e3%VBbId8j{h;z2nzIz8*4!7@1|r=Kye8nug5Rwp%kb8T&w{-k_M=}GpH zwmLGmGi8hw7C@mSYK&I$mkq>Q9BovV)g?i;f70UB?#Ye2S z5xI^R{60H8{^f<1DNXlL=V5+NxPL1XoRGW{+fsT`eU-MQ<8#&{A39L2@$9pYwvqGo zTDuH}?V!`vwT#&xO00H&nwW<_^kp{<+d(%K1=>cP`hQ+~;_@C!u^N?FYgRg)2#%Xz zc4HgOo_56jOr;&vS0i(P&60G=NcmFtcBQ>^zSKcE+w-f%g+gr46PnB3Dm~v#j}AsJ z|M+otuI<9R7Z2y-Be#rh!^cOd@4sp~UQQb6{q6LPcav7DDoLZ!-ky$-k7ilMtjm%5o)>nz`h`%8UYwlcD5T2}ca{oJnHW)=IJ;pE6* z_P=uFzII^0t87y)=@t6n$%=kt2MzORR6NaO2L)M#eR^!Yhh`iUTWPVRb?OA zr7r=yY%*4)lkTSTOJjZZP_%rVj>VdE^7Y#`r$vk1^dc>#&xW?U>HV6FR>8w}kyglr zCLC^8cHBmeKfU5?XFgs_eTX@SNA?~wh~vL4H+>!-|LCQztjskz9f%$AqBLZsO|vR< zzaf>|L2S>Y@=EnusxN|n{J4I_W9sqva`DW!w;Eu3Q0e6(W+DG`j0dE4pSq69EBO@;YP6oFwyGS@`AlqF z`Rr)#{p8Zeufb51L-5~2SyHfHwtl7aOZz>Wyw`|}SxrTr^^a4&lS-Y=jd5G`IF+`oihyrks!9^rUh~dX%<{^jX)jSkNlcI#loDON~^@2zby!9+*m&HJt+H zn=GZl$q#(5%w9&DJ1kgYzHu2X+%rdm^;*foa69XH+=V&utasVRkGnWLvC!;(96xM? z@&G=*=Kk2|@n4S8n{wMSUrfxP4dKBvc{@eB{Vm>hdvHNh9pk^|(Yop^%Wb*)F$H=( zywl5*^%^*@;?6nH`~1@uLs{>7GY_QkcqwAtss$|X7F{=+_3n4!BeCAsJ=!$r#iCSl znfUqB!L*gMXV2prPiL&4=X1v2^QoJAoG0`nj>K1ec3VQke#4PesteoFcuNRnN97 z$@<^7@XWKF(7VTukYj9zaqhFz+uNp4)w)X)D-Bsi&%zI18>5mU_D7C1SWzK;#POtK zR=y94`-OJLkpdrFtXt~y_N;N$anIFhF|!v^^T;Yb26Glt$=01GeSWkjt6h<<->yAY zbJ~`Cl+H#s?7>p<7pc7oTk==?v=Ng?l3Rv9vAd;wR2(lyQ1h+zi}JWvXg?yzqT-ev ze~n6}!lk3;ayg`aLcesWpf;mF zxg=Kz+azw27*DkK;w&lcm!z0}R``L9j?)vnc&Gj7yu$t%F@B8vf4VK@cU_;SFZ@4` zk?$2GN%@y#-|+({-53&s@m}O==z-#DHCV>_cpmuHAN%EEJb8H7-SIbuMAG7RG2yp| zL`vK8iNZDoeHZR0Y|CTB@J?0A*w$(jDL;NqC)BxrB+2F<&@i9#g69pMRf;ILQ|95a zBv|=H`*qh3#DB zydxY>VtQG2@DS3c2V%HZvl)ktd(0;>A6fCj6ncuJyR$p=zyE$NIflm#MLtQj>Z5_2 zUyTcOx?{imr9y9!x$-ZjFTX67W25DQ682kg9p};YW1-$wJGVc(Grw2bbh*&}WZV77 z^;QjezfAkD_lVcNgWVNw7`0xEBRXC4a*5T?0K0Zx25AHV|Fy{OU z^&m-Jq|ZZ{-lbUTtKZ0Ff7KYVo+e50Bq_JMT|N!*vW}DVElRnS5Kh|`yOcffO*-Ov zDDbMA1M6?vt>qbfKI!~Bg!odr()qH&rFc?0(za9%QA+WtQb_yCH4Vb$(@%f4o%?pO z{O+X|htI0T$PWfR?0I8IIGxsca8C2nWHK|FmUw$exO}I0{*k(OWK};+mUlY(dAhe| z3|WX$D)-q&N|vm*u?oKqrxwY(_pv<&EBrlNzI){H@d+~6HTvU{t`XrhXHxYJxB7(3 zH_2$z=zG!~Obu$(s9ogQSlcrWKNrN_x z*FC2nE{{1gsKN%7aJpI2@0jMRep%(4ak=4_-8ld5K?^VTN4Yh^Z>~XkxlulDIJz3%DaS>l{v@etBQs&wiAF5ws{gwy{^L?Sl*K=~c=4-D(Pu+%_bh(Rin)mF!$9YSH zJgHOE)7wLQAjDd$y?Y>sC8^Jf5)j3es7->sjafh(C5?y-Lj@V(Gc=qMeDw zBS@`r=bC-g;wZV7cGVWHQ^fmw3&e3^T&``Y{z>)t{uWj1iBqQ2>_L}`%G*t#sPVBc z&1ytu9WRVK}=a6b9eJqxW`xlWM}R_%BA)zDbEr%uBv@lS@!zbdQMJLi-{ ztGZpBGkeo~8oJkUSMRO!==l5A`+Qo@p}>-U^GY>Hq=eHUUbfNGsKTudiA@g9q%V~k zJ-zUL5;ZLaUiJT63xOiAlO2 zht8tAIvTMVU1F%5&V?G$fpPTqnryQU>TNIKJo0$qJn~c_Kk~!<-bU?9O_D!;>N_~P z#$tJG+oDUlrZ1EW_eB@T#q#Fb7RwU}LG`Uz_sr>Ty6~Amp zx#W{e>0P??ev;VUX7!VD(Qfhug5BhAgmTGS3gwdP3gwj#zS80Dtef-YPb2D9tkx}2 z-m_7dt=^36d`kJ1+M8$h&OS%^A z7gkkM9w+~&a(!P8|F*@SgbYJJ;%@c4-0;|3^)o~a{~(4-{kSCi2;uZq2+xwzeks4- zm!pwbPo?w&#PdkUNm8muPXzmtXkStn>_yRny-4&268#~UpRN@BWsm4D3Cf+rmuSwU zae_TbU95L0V!c}@)C-Cf>IF@_*60!RLppUHr)qv0PW`V3yfNYc_0w?q2C*JZ z6YEjvimo1LH{^jsFDlMd<8**cz-JmE}k9f2jG|gcC`&(!agzM4SRA2F&B|#il z$7IP|;esEL=tm^_5k(4qL30Japp$}M&~w3$Xq(_i6e;)-9Toj1O7y2#(Vw2&EL}5j z@^o69ac^}*n+cTAWOc{=RU>IeLh=aSe|zD@FTCA!efzp25k4dNY`p_jBju$xrnSbl zd_>}%35X}}o9Vk3$IDF&R|X-z{M;=YUEaUx)u=*Op%;^_@7~=*`DL;-jZ@DwZ7-Em zl2Usm*iHyZn|Q>R+KntbOLmvWCt`b- zrI#PIGg7-EwKJ03KR}})w=cHi6Ss4F)8Tk(JlbLTxEtCHQtW2Y?MKyi?w>fD`aNl< z-&rY^UX6I@jQ#T4Q3)NeEx-OO>Jq}Gb~dZOk@6+kQR=58x%30=JzQ>teA4^Pmd6c! z<*C*C$^9RWl1Co!Tyc5EV7Z~HQKu(;9Ob&xuWdTJB1G<*;xgVWaxU#$-Dbz!m{@8& zq1GmB%UhZySR};6%1_5`o$y{KiC$c@sJrM=5*4eW|H5Qi0$H6NGwIpm*j#!SIR`Quo*@Z2{}eEyr=uZ}LfZlBM9aC!WQiWPPRh03?@{M_xt z%fa$-l~&fSy>>2@YxnZSAk_q#Yd_=JKHoU{UXPM~jn#Cl_xr}l?^oVgW3Xz1yxZ&k z4me&uR52d(A| zD(Acs@>by{N%n6iXW+Y zV@luzxpATLSDr7PE;kR49KF8#H2IdgTXt94I!Yd8*fQ8OEkSN(dNE{9+xT4lh}2(5 za*7b29EJE~E*>YP^L@BX<`EF$+oFBj=VLEo{3K6LdsPGDCz9Qte!kYb6Yc8^xf^oN z-BDh?@r$WfXF1Y>a^L2%I{ z7Z1M@6PCrtO`uXmpC5{gn~-(s%sx)pAA3SH0 z{7XQSnCgXN#cl9hxwhY%v)GnTQ|o<)5b1@QfB-Bw0vJru6NktK3s* zZp{#m2;$fGu>A6=H2mt|PhXne_xi^#gGf4&b-dJ&r`RYtj0wP zr46m8TlsHhpPgGQM3W}@<(PfuU}`u^oCKH;NBZG(tCHV2$fVbWcW@E%PE(wHW@Th? zQk)rg{n?uzeaeETzp05npJx%QZA^5g3g^%Jbew|8G$BTcm{Bncm_YYT3{kv(`)x6F zZx;Ti+FOjPITlI&vxiO*=gMk}Q|a=~agOH2I**BP{N`JZNI$g9FR8uDZ0+m*oCen1 z)FxNk$uko3Rk-gW<=qO~9oakjpX?~TNGQpFwqq*4#E!*7^nl;fjzzSFc{>YIn;AffnX3A42FQAU>FzpdpYxg4G!7O~Cgb!)l6s%|LU|0<;9JKx@zj zv<2-zdqAKAFapM)BQOD`zzp!mv^oI`&>3_AmcR;F0~=rq?0`LR0FJ;3ID@Xh1#|=M z2gHGRFc&0%M34mLf%#woSO^w@#b60Y21~&*upF!aD?tia1yaFkum-FJ>%e-j0c-@D zz-F)oYz5oEc8~^kfSo`Nc7fd>9qa*n!9K7b8~_KwA#fNR0U6*Z$OOm0ac}~h1gF4h za0Z+O=fHVz0bB%^z-4d+Tm{#_b#MdR1h>F#a0lE4_rQJd06YYLfk)smcmke+XW%(_ z0bYVv;5B#y-hy}FJ@^1Vf=}Qx_yWEH?)a5}GAINJgCal$6a~dVae%w7vJyZIlmzOa z6etbK01Z$Ulmq2K1yB)G0+m4(z&FBw{;jO-+$~`7;L>3EJ#S^*w=RF^A8%zj+Ba{@ z9W55~&{W~3`QLop-m-`gSCapHTTqj`RxEnu1zA8{-o(*rHH3#(YCNR;&)(kk(ORwh zV_oLRSYG#Uxogi6=|{Q$E>hn2ZwKg|6Fy4*H-=(;@gm88HdL2%;fSb0g8V%V)nNH7 z;fIWWs%}p4_zlbNt((9>D~GZZ=WSW(rnHk)29J`ll!|MeX6E2vDr<=P#*5NiWyMGW zZSSq-V--P{ii<(0-rSkUlm?(@XBV<~TfLMbiu5TpC3K=)IQIR9Z(__knHbBY@7M9p z&1*K*R}#;IJ_3)S+zs4~47$2;Ad)RCw#7n_p}Ud(Aul25&;Q?017@8pjAfsTW#`a2JCd~K-@*CfTDm;z#gg!N&q!b5~zbxpfo50 zG(cHU4sb_R0aOH)KxI$`Xo9Ms8qfmOfi|cCYJyszHmC#Yf_gv))CUbfL!b*9fyST- z&;$Cw02qR%pc!ZmT7Z_I6=)6GfVQ9=Xb%W<07k$VbOa{A6qo^X&ym%-2w0S1Fpayu+GN;*4Zks7OV$+ z9=5%tt43Jw4T40;_8kJ;0Uysc91U1UoNsO54Mu_(pbbU>KAz)o`9^^;BD#=?fXl)0 zdAldzea8WxF9RF~K7f6cKnK7+$NL5XPf!+E0k(|>;C=l8+lhT{JeUG50=CyZa0RF< z33e?5sSSd$kL~6FLclUG8LR=z!A(#MoCEtnQ5?g1ehJ=zx1cXj!~Ro{>?5VYL=Xj1 zK{vqZtp-a0+j@z(eHxO_$LG2Z$|Ie5khLMpf;ylmwktzw0=7Mb!rq#YjYZgZIG-g& zxLoA`mx;^AdEtE37GYhn-o^vg7yD*4peHf~lJ~CyEr5YYFGz-U!RKTDWY{jub-?-< zE;0?0xd(g!>y3TWUxfA69P6xyhJbD20mWePpH)5kBY`*I z{Bt?@_>n*##DFn?%gFKhIL>b(;BXG(b*_Vr0LSOLmjT?salpDJpbA(YKH_=@NGsq0 zJOTR?%ksbxu>Xt)6@e4D0`37$k8Q|y<~qpn*_I)Y4uEYK43>j6fa}gOun(LA?ZHjJ zbx-mou9K&*E&0-0tVe-~KnHN040@3mE}0rhXT$I!+PQR$U5V=Qd=msVXQk>F%Ij`AL|VJ7Bdg99=OcwvCjTc z1+X75lKog0T(7u}u`jY6xvad8%TpcH0IZ|NfXmYYNabYT9R=(_J-~V8xC226z-5^R z*j`))UoZn$gPEWX@B__2A;5Jo0Q3>JxlC+ZZfm$)WdWCM0g!ab^~?zH`FaDcOU6JO zaF{#b{ajZ@1FnlwT5Ru;fXksTuJiFRfa7!7#sEH!^O^`a-@K2vxeoF^j?c$)9b{cg z_9U!xnI*lmUOE8Is|T+(FWdt%fe-VSQ;wg~TICIc=*JFo*x5|PT}hHbVT$GZ+VU#CEOz`C0z!amBd@3Id4AsH?^ z>%bmxTe%97Sqr%AT*nUswjtZnQ^XK50<;C;zyySX*`PI;1;RkAxV{*25m*Q0ARTN0 zo5l5GkjxQq6088{!EJCETmmxW=RU*(alH_>Utpc33iyEakAT;Ce{slHkQ$IRKqXKS zQ~~vXC1@;48_0&B0pN9e&;)QeuRDRZpq;qx0@)Na1HA4AT7p*MdQZqSoO?Uqbx+V9 zkhtyx*#Q^Ie*Y`uN1?vE>^SyMw7r#|p=lj|j;3(kr z$AHt~GJA(Oxna2W7?@u}F~59@tFVQgDqo9~gwLGpd_IgmpUHUvmM!}rXS zv7hgov;VF@*mA)4&-Y`S@1e8b@_qChkbEzlCErhHAC_z&>5lKMvwupu<9qC{5s&Y) z*T8;B2YkQ19=7?OJNqNwcb^D38jJy~gO(r?*a9vy*SmPY<(Lc1K{VjHxDqS`o4`h} zOJpnLHgFVhIS+yZ;2Pk%$93=yxB$M0e1`l4l#mbR3DyfkGS9L83~>G9a=ii7vA-m! z2`T_BPz`hzIfOV?SZ8!WBVa4i0FvvcgGgz}Qovb++mS7x8@8E_z!-EF;d*6Lz_D`;>MX}9(%g?T){7b&W{>sm>q&7ve8~ZKS#g#aB3Xt^1KFrUz zof6T1Q~ z54S74pUXZBa347zq=21Z1K17HM9F~MqVC6 zJ_1Fs&ShlD^|Bb`d&m-yQr#(s^;)1Vs0zA(`alO*gBGG}4rvDrL}>`=2=qm%2iX<0 z6lE(&SHQ=yl zAOy?++^)0i2WEjGq8ti22aFJ91ms*WPL$&z(?F6a6CvdwS(Hm4)4_64u7KPJHi~i+ z!2mp2O!Qsz+<(=fcp>W*>PvA za~)*AAZ|WWVJ;k;}s6;P!$0MD}6n88iDZ*FpAM_D|_~Gy5pF zLFWP6hV8<2Q1Vso6WLd}PaFn09B>_EKlp&#)_?e;gFim-zv~0tP`6!y8|V&rywDT4 z0}tQ{ynr|G0lvTw@HJ@w=mi2nZx956K?vZsi^sQpKwrS)UG8i910F*R1Ux1l42FQA zfcxCxfZN6qU?dm?MuRbc+ez-9$AR%63UFUN5ljNnU^18jrh;i;I+y`wf*3Fh!~*Wy zdE6Zbcs#)EX97qBNnjqB4;FxhU=iSUb_qxZOTjX*9B>=E5^#IF3Z#P7U=3Ic)`9ha z#}7PK;xW@^z~kVpU>n#D(!dVDZM7Wi0=q#v*aP;0ePBP}{`4R?1P+5EAOjo)+_oPB z#{swRe7$oDoCe&!^BCnEI1es>i{KKt46cBy;2O9NZh)KM7Pt-WfVVUeS9?${xK?Beb=mNeLY7CkH9&hp3%K-3LtSM*)nu8XgCEzhwYoK`4pY^C$85OHR zpQ}oROR*ZTsPd!!Mh5!sj)sF;2)mRDmljr}Km&ItgKe#(z%n@l4c(peKedqpHN?P@ zLb6Tq8oQZ$%l7T1@Umif2_d|hyQz!g$PQ9yIWbf`y1Bc9ldXHpbYm&Je9rI|itrYN zO{MS(Im25j!ke3!OW_rBhPP6L>ql8g;gxcP8|o=?uYb6U6ka)JxV|F1shYJEUL|L^ zfg-$_wTrm>e?{c9KeEuyVb-PWsUCu=p=ldS3lr18VnQC3xJD=zHHD#C;Ijm#4hEM+ z1uF4{+Bd;16~X#iV)>N{7s?UbN}-1q9#w_CN`(uH!NSS)^%Qn!x=>3BFOoA{UlDG2 zTU!cO$r)~-2ya%mmK0u83>TbR-_YIBAfS#EC>BvBo?LKIgBA6p@Z#dZVt6w}<_#a! zm%>$ZhBsG)H*c&fg_jV+#gn&ichnDSECs6NJXr8hgLQgRc*&dxw{mxE`pQ5GR2KtF z36)3B-PF3Hkpt!sHWLH#5(@kGlMKQ!_V=z+f`6MvF_F*I!8X_X&TQPQ2qqR*e;>iI zTkaJ2G@OFsLl-8d4vMEB>{1H9$qI3@cFY~3$d-eB?jN_25>-U7H~ojRTH9FVPFs;5 zCu@t`A&NwQ^b12-%CL6H`!|6&Yk!tM8u%~Nfbe>}Q|QZ{-}1M=0jq*8UP-3nXk=k& zY5If*dc1TL#J~K1cy(l;FlGGP?C^RMCFPn(oX2B|C4)znSbFm45=*2gzyFQ1NFEhp zslX#cUhW9u|NQ^aZg#hSU|s&8K?@#zV-fon@#6;^@`cCJSONr*b8hsHe$k8%{KNx$ zEXxFeL9w(VO3m3f8~^<;{H_tryF#?4&?De*X+$BWBzeJiC&;ylp+we^!ZF(L-6?!E zpjb{dth4C*U-l}aHUFG=ADTu|Uq z%pjSz;%MIIC;F%~K$PUXy5@z2U-&&+d2mC;9EUbCRZo{_KIqT#|Ahwf_=Vp#vft{Ji}Y9#y5j~`yc%9WZ=Q64}Z|rC@U`cznv@2 z>v$r7HcYFLqFQzYxLw%?B}to8%?ZwHvmTrnL_K@jF4%>l8Moi}^+r zmai)h*ZDya_*71Op9+gK$`J~{AshJa6_zG~_^!7!&izZB{3JpREqvBxj=7Oj&I=9% z@se30u#v+0`rkyhHOuE`0sr<4SBf+_|6}dsu(`FlQLYO-*iN=EqmcM3uHTQ;@T|Wa zKeSO&;-c~*$wK-50nS^ZR?kDjiiPiW{x(bM;_9ZX-n?B`1;ZjGnQ}*)Iigd^7B?wf zrt@2)?UDX;a(LSlZR-aS`Hht?4+tUWLMPRfJBCp3d@WbkY9X|!rHf`2>prwA^o-xi z>$Y@Z^N7wVUpi1&$HN`F9kiq8D;&MLmvN&*L+`e4KFyupZya&qu8BLHS!risRl|p7 zU5h=Rxi5f}4_@2frbusk-#LXon7h%Ym&fW?edIy4E?25Fp`kam9_;ITqlh`HgKZxWmGet;v{t80vHQr?TS?iZU+&umC1wC|4bUdA*nW%KaFLB4dcbnJjO9$l!` z-jJz!t-L9Cui;|v#$j|g>WS*Zo4v?ozV5Yo^*t%G-S~2g_H?3>1ImTZe&3T?UOd+D z;(K4ZT)u17m}`MFTgA|_*;E%&zFYlc5&sU<(_zE9R@c4A_Etbd=2?5{GU$Mn!8vO> z*|w3-q2ZnB!puIAU$l_Vi=K;i6>%iJfUB(^zwn|x)i;E$NbE+YU-fzqu`r@D^&2

+RCM?;?Wq(((_>1$HW}wjEnH^L zcpcY`-UPjFamd7klGQ6eA7*St$C`A}yHUOqy?+w&bobb<)O}{6?IGJ9)ZuHPiz?0@ z)F=4u7x|SQ6!LP_D79mrw88XM=_&pED8pg9&DcA==;GItOa99AB-KG>Yi|w;peG@7 zpZmWEB-y|R$2J-Ep#41$mzKHP(r2xtq@6qL=#l@c`6o+w(XhnjC&RaTlf$dpk5rO< z=#^uQcUJaZGibwk`_Jd zMTbMJ7e~2vrPIY$E)7C!1HBq>y77o$UuyW*yCuyg`%$GC z8;*Mp@uS;M%~wxo;Y$YPhtzv~JbD_#+H=QeMJ$i+$KWY0Wcf4yCNa}T#xRgC&PPg22>OFa5M_#q#sxQ3InL_pJnyJLP z(uks^nzWzoLb94yj%|yzqd?WVJL{cwpe|j{y<4^2m7I5IPFc~>k$OE<_ZkMfYuFdw zoU+%8)`s606pH;8A7y34s^60uPF8!_Z@VYyYN!V%t?NR8)00>G_cf*d zMiUG+&NHSr%gWkqx!;98q}*?Nu)Y_O_mqd~tKBJfhI(vV!;aKKufzxQg&yQ*POSku)jjF4al1R~R|nI}(Q}(Nv<{^bI~s+lTn(l12Ws`X@uerp%T{k4SfV?1GMw0T zi;)Luy!E{HV3ZBDu6ta$bfGTv(Ra7nW!)6-MNWnSn&d!N+O@u_7=DXvv)?M9iAi}jl3f#)qL^uwrP7cX|AeNU$s ziLd5JQ-=mmx%Jtely3Lcq#-Vpyu5ewSr3fpV`53?>ISB?MXyk+38PKOxoxo~Aug8W zyHn?{jXPZ_dSRQh4(Cj1-MQDk>Yr_CM}tergWq){<1!N-%Vt>7tE8{h^eVZL$sPU6 zwRG%hX4ma2Uo9}9P#vqNOl=GDs`1S6K~p=LQ@i_&x$PV&qEGrxortca-lwE*a4|bd zeShLo@Ch5bWA$omzmZPVeTKD$+`c!_fYi}ZJAA2@Yx5B0&4Cns)Hl}tp*KA;zjs;p zRY!8Z^z@R&DJyy*Q#(`7)P^d({t&8>YDViU2M*6bxfc&jZade>ipHH?(trD7BkFR! z$y4V`HZ;n1RqImYd?+ny-_;{Ed`ZL7ude?if0};R$$M)TV`{MAqSM)6Jhu@tF zveDjyeC|J*FmH7T4K5$P=SV^boqk(pb+T>{eX7!M%KQ!fv~|aben%2|)5@UmOX@}Z zXmN0f2LYvn$k;eyLGzXV6kXNn{HKuK^v>EX^u>N(YWBQ|bIS+8bhpT(4_#7&Xeu^tUKPo5rt_F{bv!}7gp zt-eaLLnV4s)U70=PNzJ`GOX6ChL>F^WX65H%laO)Wx|!Ii^@7tg9nfAUMcKE>#B4O z4}pJIu97flY!NZQ2QE2NbemEX>*(^W76j3Q7q`mb`NnMvC}l`iE$?Jn*y8}iPbyzh?&o6eDR$zE=^L)O(s9G{%C_b0siOa$)QTxy)ZldBnT~N@)Y|m$q_M5L zP*_?;l{!t#$bI_q=69aC(bof~wvW8#MB#(_-}dn7M#DaYOuX06lHLU*9W@^0LW>i9 zlnnneBdv374xex6PM2HUoViHZo>Vv83QQ{RL5JT&ZaOA&qT795l}Rt-OdWL}rrdmK zMHdZw6q$0~kvjKvZ>fC3oRa%_1oUt)qDgDh_M9nXN^2hvn{9O7hSoSNc~sZOkrpQO z`5M`wGd16!Q>KzqCsLnY%0O$dCB;-OySB?|2fCEn{Hys)H(FX+Udws1Gg*5~JFl7S zMyEULH~w5XvX`xOOKkuOZRX=+QdNSnHz{^(T-ur7iwOjTy zBTb`8D8_Z;FYW5SaxTVY8Nu_4Dm&0|&-W{OD>>4@g!tAAW4qCUnVvS`Rk~67odwS) zO>v^08#ANp*6L30$0jaaVrfV1rC~U zbG%Qpj$IwdZKr;n)_3Vbw*GNy^Q?^NOwk@j z#!Ve)X*sX1TRwH5n(H=Iu!=Gv^_Fz#+^J5~<;}S_>k~TQ_oC;kglCwL{g-Hs8ipNd zT1a@}bo3kX7rP&yvD}$H6nR*2pSl~VR!l$i*A7Q&uHXH1>6MOjL&?OWGwfQfY>ULM zMck;JvrC6gqwGoR*@vPNPC3&4)Prlal5A*@@5@uy7pfNs9+GHj-o9HN5AzLQ^u_DdhQs`|3-)=usghQ~Tmxv`TG8*^R~BskKL! zI5pNFlqQ%B9yLH{| zO;N=>wT9_?Q>nFnfv%r@>BCtX7;foF`rRXs)n4R5H@~)edVQ5AbvZZJ<_7Bha@TEB z$2T{kDSHnlj4NY8gRkppd2jTi%!9RWk4W~X!v5zxQr7rUQLh!XOq%qjqnht$tM&+@ zT9%39#*Pdk{lqJ_+uL=g`9>Z3wZpjY%r&#i8}@ajNyUeiZ?M~z93}==RVr*x#f!`> zqW;R2x+~3URW#X&jIBTV#@uxw^~7cI8vf4oCF*P8Cc3yjYI)45Z=wfjX)SMlHN88T zcvrlz_Gou%y|?b%nig)Q(APYwXny?U-Xrvnmale6yG>Wu{oAoPLYz zmb&d*)T`@A)At;a%LBtG#$nOS9w);n+3Cf}654ijt$6>qR#zRUq`{!a{kOYN|JNr+ zn2mFy6YF}tvi#DG>hFjP4>s>fY89)NuD{!z76vakQ)eu$j}l)NzPzj(jox!fuUk<_u zUXE|VXy?>O^?R%BXieYkVekFz=y=8_htdb^Y3i1Se#6#!(HIN2PvwRO(pjyYU8nrz zM^*c-ZuQ|>SE?}To!9!#9%Q<5W1*#${b{sJ=Z4Rw0F1wTH_ou|qILd#2D}(xNk=2D zEWbaZC%K=z685~L8`YWJ^JI*B0Cn%t%4(LSJC)sazeJT{X7tqSQS{S@5E{L4{MwC5 zxE^cr%&|JV@KqhH8J&`Q(^rPd%4BX*FwuJ$25Upx36AA60R%KD@!M7Zr|q z+Ie$-V_Fth$isJ42Rh}euKoCE08LJ}^YzdQplybsK^~`ik<7Vc*$%q?bR+EW&=Kj~ zNUhnuX9vx~Xz#I`J$hO@P}_xF$~xe>F|&81OSeH*6tcPF^Eox#Nb!-8w&JrlrCG{~ ziSc-4YR&AV{NB#_@tu?$H>xa6trc&33bRMF70-S6hG5P}=D8#B-K=7*o2V(WDm{2o z!ZRFO&fyBXM@}pi&#gE;WyQOCybFtTV-p2aEK*7Fh(}l?DQ-%$L&VJ=3LKVoBm?Ocl}=E+GhKJM69 zQ!#;1+R>tsUl+y9MShK!59x3%tiNJfn-s%!YrR#9ZwBxVULN>&KcbkFDV^oPoR{Yn zZwE<-+_!0bTk$$C@8FV5x^eM+?C`l8703Vi_fs^Wm@*_iR#&8`k^I>>dlF2?+&_`P zrpStr*Nh;ZvXym1T$-E1Zq4<|*)zzue_!paB|D}xS4WDO6-8Y6HfA1ki4^mF@UtF@ z+wVf%#@l6{J_hdkdfEB?QNxl|AWNgXZ;@w5_(7|a9l<*96j1m-%O4H=cWFRT|E1|S koHg5O$J=F38P#c|muu0_YhNpI2G4(2>Hg&ApEU6Q0H1DR!vFvP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7d8b6cff4cfc161ef782792d6800e0a7fcbf0f14 GIT binary patch literal 90631 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 z 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..32a8af19f946d57271dc5f98adf8a2cda583bf09 GIT binary patch literal 249077 zcmeFa2UL~GvNpWMoDp-zjEIT|0)kNFoIy|&5hN-i=A3hmGv=Ig&Ptne&N+=a=P-uv zh5bC|p4l_!%&hO8_22LQYgp@?$EvQXuCA`C?)PPHW`wu9XW;_n3K-?fr{m8L{JcM& zGn-|Jff;j$ZVU2u4>dA%ZdW$;pa0k0*jT6Y3pVlUN$996t|?_rkR6UQ z!I!`OaR9piy8z@VmSrPPKtiYFRt>r!usS!o^WVZz9lF2BT1y^n19Ir{dIW~G3UG1R zkC^z~_%brv;VS=}Kw1ADk>lTatlzS7*n*Y7JPotvFsp0%yPpPs#H*ecE33dA`fsiD z|F_EasY7OYhI$8QXTOn7D?a|Pj&34=XIT@52!%pa{1epFX(2ngbviQ*-yha@Ae}CD z_l@nY;ok0=M_RUO*{f?~Rz0`gXd$g)^*^d;N+-`SO-e`qxX(lgYLf-)x@&XjOG&3o z?5Qt;@(>`l%BZ;2HQe7*oA>7|8!lOGL#JE$&_1^=XBNX(&zKd`Jh$$07DH0h)M=>BgkW}j2J zbS1K?HdqrZX6l^XEVL}vSr^n<|IiAT$4XWle!Hlk(7(1QH?QBjkd^HGi61m_<^Rp; zS0t>ndxwo zv18hVDczK3-)p{Ts@lw*a5a8^lyc3rG8;!6v;UFBFZ8`$>nypRmp_%r(%agw6_sE{@9*bCE(W%+S)XxnVRT$bElo#iL}{!iimw)Icw)A?p< zqbP|=U7X{(ca#*Ix2xSd&;P}b7J5i(_Z9mf%cLgY(?zHZ7D z*4L3ySAAU-wARp5RNeSLRDy*Dka?*oSZ>>M<4_$kdF z+G&OQe_}bWU=z*1=_7R;v;3=tx_*Q@ckJ@-{Tl`UN}=yG!TjdN)#ewj+Ej)jKEw$I z^!)WJJd89s`txV&>xp@$8pOYM!8|i{nw{?PFN)^XFum8fOQBCfr9i-&*cuv|e@n=7 zZEmQPYG8fGVnnDo6xY{Zzh?USt8p>AkEs!;zrCnG@AxOX?KS=7^E1wG(e#(U={5hj zra#1KT*tb*LuK2X!MUDlbPPP|O`W}q?8#BJ^qmX-GBZMNzu>=E2mR-I zXlE_#{#CzDKP=<(PV=kbietz6YJQdRtsZqxqh}N=lAh(~B*bCTD2thcwe_d&sd#Ci z7LQ+JmYJ29?JK=6UmhmYd?h}nt>d;?zH)Tmlw7mt`pRsZ8WmnN)9e-f^tOIfBY8PY zpJzvG^mSl$MSuRpp$>W@&l;f)E~5@!<6OI0Utb43KI_lDF@ZT6*7s~A0myS3=q(#P zcVtD^Mlx-Pe!jZ~^9{m0tuU{5?;g)vn>CV${cCs+{#-`AF8Jn>Q+t0ozq*mb^-li( zuup%`FBSb6eo%iN&xBvaH>P}C)5>3#SD5$e`ZO0=?oz7KqZZccRrU7+&g;BXy|>N3 zH#QDY`)Un5^&>h$Rr@%*ZH;14D&g^D?^CHR5)^UqZT~1YIp6X2d7DWt(qo>{eVaPf zr0SubwM(~%P`mtpshFtg&-psmqD&4i^=4?3AM2Z2E6W?#uFq{+UMl$~U$)fjnRV$k z|M8C~b^3hD@%kTJWLd}kdv6+-m%+%VjV<(b@fCH^6m^mFQk(D*#iNwT^6!na^bgw( zFdwhcmyzfFk>>>l>d%*JrusbhojQF)fzy@bKKE!*#bu8u zo57uyP1f!ktG562VYYVvxE~jBVUBhmdGh|_XNv<-%6Rjt;i($ExYk{Z4chp%4L|!H z*W|wrDt7UkroVnwn_ZW+`;281BacbPDkz_{S98mmG!WNq>uOs>TgkhhQge@M5G;1Z z&GJ{CP?|pSBg*9_J~A@|oPJH6vKMTjuq0vUHH(8%38io>N8n?{yxVx05J4 z8%Gbvu{KIASY5}byT$+b{KXfC)<0xwsbbD=J{_{eS_Q6oG0Cq-b#?r8m6aEpSC-i= zbN8L#TU~|kxKQZThO+XaM6jb+Pc~GSoYRJN z*^?9^%{Rtu`uHwT99vc1Jnn;sd@+kEn()a>2A2(PeR_(sG~Vc4VPHWo342}h!^>!U z`M#uO`;P}a#KrZwS$kmD;-$`y{M_xX^Uot5=PZ6UNWP72qwCesT_#lN zF?aZWH?iA0edMOQzOuApnflIgA+owa?T%A-hD(`sk0##F6QXLK^EP%E@2ZNPT5!ns zyr&9s?!V^qaBme{`-a#0Aweo*z(AvS)~+ga+~g0Y6}?r7sKMhmT864qH%j+gobIl6 zuiVc(y#1nX!@g;%4^c` zc-MACWwdW-r-yGGRP7PKoHP4Rl zvQgho-Mu{QdR+ot-u zD@r7 zcpFiz_D`H>JN<6vt={SOV++=j{WX0nwz4m#avAMdYI8bNcDVQT-#*D!Y>&KY5wRph z<^1)~nK$2p)s+VM>&*J$qvjcfmHv5$DC5ZuM+Po3QYPMZ%YBE6v@hPPSf6uUGmq6< z8|zrzMopQpvrndrtuk4*clptmZfeHTrag3xi>TA-_Z}@fVW)zX@6Z>nUTWM1r_xo% zH&7+_2i545%S_rvZo6|lpN%vQ`?!BZnzynTRD1WscyBfG*LOYL>Ni#|qx(HS+o+0i z`ZO%}h&GOD`upWmr|hy($*yrds#GW7BoDu4Etk5tPFhkwOjT|imDb>{r}C&a z)1m)iA62>M`u4XYJ!Ow`?{CMv&82CchR+*xcai|pexoxSJfw(G^HMWBJ)}*yqXVpK zddl0R3p6ltYHjVeHd~|wgz9Z<8l!zAEBJQrA{( z>{Q2}%Dszy>aA|gH9eyX2vPxe_l!$e7^Z43?Ka@Yj4*ZH#d_$=?_TOep(R^KS9eo; z9iFvlXBVKNYqreX*2Pa9GU{4lz*SGR(Yg7^QpsM*J?Aaw58te0$QG0R19I7`Q4>2I z-*&a3vTwJoV|8P1Io5Q>x}vKCRJWP2DS)9H&@HN<(22= z&hZa#ct|~&FyiYAM@fkp(x~#R8<_)-j2xQpsH>E)X|Th+uC+Yc*}VVoW46*V)v3qT zv*lHRcZo&^!i<&O`1l9G^{Ob_s|8~|z7sXl!M@6ajiUCp-LK1h?5#5IISrax#zv)e zlTwk7EaX}FnF9wVR#X1xE1c<`$3ayd-J?juxg}KJS9KOvEYeW@`l$BIY9?W7ipzu2 z%X5XRy19zy_}~$shV@;1XU4}+X?nEz&Jw$VL^tN?N2g!H~ zl(W&C!B0N9sLv~MTy1eCK!#t){UtiBh>U$(xXq2UhVr?Y)#rUaO{B!h_g5@B`>Kj@ zGfbALFxA(6YEX@X{_0yj+Y_nAp(u;{r<;UE_auRYEBjU_ynms!JWS}9H`xQ&$<_B@~o;%SXpD!uG@AJQnyk0Wfw}R zK6kpTuN~1qUAS=Gw^=n8^<$~$$gb=C)V1YKP1{jc0dt2quyW@&&RyLwbToGk#?=1(f zolPFO*-B;j&pKQ~+|+o-)m3_17nG51cRnR9tS@Ko7T@&bvzeOmvG=;+O>-$@kF#4V z2DnJ)3Pn0L=@TN|20bX1t817l-RRrMu_@J6g$iYKb7$DATJtwroIB>D(nQve)UFRT zn?Kw0)-hBq7#n@7e+O$Zoq63Vah01~eYLODjEhcEZB1}qrSN2p5f7&YzU zpb%9zcZ8MkTyM3b{q3l>#*WIVME7EaKD$fJn*lNRj##MS3(G%T(AHcQJgo0Hb-10> z(2Xv=@}<2paZfEcdR+~5z~|P}{@vWw>hP|S7e0P*?l=6fN&cM$mC;V?$;B%h>-fsPdK>TsL!rn~WRSyrQMn zSI-?C`BQW|FBP`*)op9HU~woAWb>$;x6E&Hw{sppciHKecIEMQJE`}5=1!AR?$WE@ z*gWIbhROb*J~>xa3zq4zp81k)HI(5_BPM-ccg1;}S+ha9p*bWZy6da@`Ml+T#o?W4 znc)(nJ9c^bZFjYA`Hq#n=7-CM8DHX)(;LeRv&pC5TyhoX9zF6MS=&&peOl>OtpX8J ze4tp~pA#(mXDystsh@|clq27`%%4M4O3i>Rt*84+^476E(#8ghf6m1Ay-hvj%<}uw zHc#^wWOzD+1ulkg$^dij<^&;28wVGe* z@v;1-nxDV(pX>O)#s6*V-@4yqLyre`vMr!%V5G8@6GL;@r{4N6Y^0B)449l9M_H|p zqg=|J9Y@)ICOeLDcUYB%1(dC-)U4eed0?k149m9jr+7TVBHCM%kJay+q+iU=8&!8_ zcHXGZsyL;8)c@?8}(J6H>!+ZcHXF^`n*v+P7HUQzRFb{@8=LbV2`b8Wm~KC zW&7?<6`E$}rHWmXoj0;SBmP>Nw(juZ+4&=B!?N>7=*M4Ox1s(2uK!Oby|nOL>8f_T z^mx;BrK`|iLq84o=>hibqW_-a>sPsolUI#^>w9d)ZN`)Jo9lT=AaD!n(CBjS_P2aP z<>h7L9u`l$rPZ)C#d2!*hD&$0BtGyCRkcw!15ihHsH+*MvlpnlbkyNx)McJ4`Z}$P z`ei-0M}7A}z5AdK82S_Kb^qr;%^%tczp1bPu!TXL&ph&0H{8E|xUczF5&jK^fA)Xk zpMrn+(RX|?e~-=ib|_~r)mI;%e_)6Ky`YBE_otd1{rR)?vA@|F#Q)b)1;XAqdr6-! zN7NM!ABU}eyEQ6Uz8+sR_PK^*3kU3RSs5%hPCAB6I2bIJs6S`aUt83lQ67E$y*aC| zzt}drzFmk4R#jRqDW0-2SeNi^C{+V_=8rnqh&oWq_2*G;7ybEUc1>Rg`%nk7aIPKp z(VufcsDpT`{!MLLMM;~x`aB;Ez2{bYPj_q;rD|b5Z-e>nA)k+6-hy>QoWc;YrS%OxazdkEO^J*a7Fv{XR(1l1yC2>@XM>y*fHy;giFPn`*t=B>y`5bj+^(J2=TEhcghxurz@I*cYxf2VUlwbzRcR8KVKRm&pnXmrD{yv`RlVN z)u#W~%d0{nWkZX{7xTZ0QoiHtN`4*_sS2#k|75au-}ti3G;@!3{}^AusdkIUZtC*J zy)Uj5uA|OL^vaMYZt{3gV3G0KJ;we0bguzg9dz0_XUL^7kuui({g-l8>d0%`TeTBj zMoC1&!cIl!M@iXb&o;=UD7Dt#BznUA+G6+c{gboF+Iyr7)0sY3g2mW-gI9oMu#Aoy zcxS7J$lM_B_E%aIQ`WYH>zLeiQ%_EREHgJgST#*;oqNxlVC62BeZSW5S5a1pS4w}e zSBK@OW3|QB%J@X+e%DARCAH&rEZWalmA7g8s~^UAs;*P3%y4^DTlI*sy|$FFEytA*NZKZ+|`B#bxg+Eo2lX*`fnVy(^lR!Dz&@Q4Ijx<;cd5bxm+bKr1Z^0 zd2Hp;-2Je-lFBpC(frFh51CxK(Dz#Djih~A&92j5c}mdgp~rSkFQJ~k{$w_&i?s~c z^1c7p-en{tzm-+rnx<;ht3~OS+v-TIVL6`GynNf)bpNKCMT2Xq=$7A%ymz~)g|}aqQ3Oomg|?YbIsMKI*W&% z{pzIrN6t4H+^Df!s2G;os%LqLGL0E&GQvW3%s=q?_>O9-SHk3iyGzzp57JIn9Jbs> zeyKn6NJ>i&DPDKB)%1oUGs+yE^f)YB<$JwoP(;5_wP9(_%N^OZesD^kshH?K>gpTbQSmUEXa#*TLF;=h&Kb_OQE@ zUfH_x#GCd~w!)^kfNEA!XHsPOkmAv(O|T7j^UUzG7YT`l|7JzNXh* z=%u`D*PJZx@1yGamUwACyPUMxc&qiC5?)gF@WXB0wYa1uu09=HE>L#cUpcT%tJ(zx z+U#i7H%tu~THm+-hEP?fig|$|Rl?MSwPTv*FIY`ko1U}__tnX?a+|+8K5D4^cYPjG zeL!ugKIv%D)v2$YuRoeN-Dqc7$=`icKAR?1a%RVf-L8FJI(Pk8w#EL7u4+OLn@)FL zHjw>uHqJ+{!+T3$JiO5OPAgsa&3k6ZPqw~PF8wfl>=>&@lrtvTMChWkp6=PljcmpjVPif3A@ zCT6lJZEf1SAP=#5GA4MzK6h!p^}>rnPkbd|lX>?ZL%qeZz2gLjx?##acF3zw4Z~FY zk6JlabhnlDL7OJ6*%qR5HO{oSbKYMq=sc;_tUPWiZm9pSQ?6R8T3Qaf_L-MWclEXA*YweLt}=Y=@tupGhN^d4&h#y`HduAP98!07dmk~a zxw24H#HGy4LhYOn^)4^#t64uQ^43SYWH(Za(5T?QDR2&Tt;{X;c#_+;36Dv6&&t!lh<ohe`4Zqkt?$i()<#plBgM@s3s$P!dmYyc= zD#@f}-Sexp_in3>l`yOBp#q$mSai4;s@nUnO31O@Lgl^~G2%c)FE#3FpMod6d{p$> zl>FWEzgS2_{e?O!5AEEjTy?x-x|=+? z8B?~wM1L6?X?NIsSD;KDpXcPo+riQ+@AqH(77CSS-SYNxdYt?Ra->gd!CuWsivl`#W%lyJ6fth#yRebM5hgX-kzP&U^XPl+vJGXBY? z#_DnTbp=OzgvgKFYaTB&36;dX6F*J~^^-X^eS2k8u~RpSbbBx-ys@-x>Arp93SU`W zqu0AzokAt^%0r9$$;DOmq~K+HjooBf`LVOkJP4Ki9`_q>92h1e<81cKDsQW%ZHTnL z7Ud~7N=?kOP5U^<+X_p7vI+X@)ql${hq^Sa-GofVUl_@bSNtI?_of@uoBrm4lk2ZrI5PV z_`sm(2HNL1X5U`nZyl<=7y16K&-yUwIo{R$R`nwC^~?OGtA8r58h)7e%WJKl2vLh~EH~@o?yMU7dz&>1 z@>N^B4wQUzB1FclwUEvA3Q485sk^3zp3cnvyoTy1`p<3P|4IKZK#$TbJD>4z5Iy=y zmor)a3K!38ezc6LxBb!lf~~=CBP}%P(l?UCD|@`H)Ypbbt!^))v*j{=8;9Qn<^N4$ zcfi2!D~qPdWnc62<&S9RbN2co#X5UkF*4}M0k<6G?W8zx@*_P>%>7tTPdruEub8Hv zf91{E{&#|ZXD9p9)0uJdc)k`NtIp4^*+FP04f3f#pF{Weduo1?{)Zga*%WfEfL#obes071 zt$>Wje9#YoH(=M}nLb`^p6Zb_v39XmdtR-zmCZlmc2`xOzUCshm0Mmf_eDap*p#4*qB$peMF7_s8 z=El0G%OdcJ_Is`ebk_I}uBb_6HMznVCzb_G`{NAsH-nA?_66oIJ8J0N=(fL$6YE}I z=h0FpYRao%@9=-D_jq<4c*_c)H`dMg=)O1LAI`KJ zc&eTBY&U(=<=7DUTHE=_l6{eqw7jXOecKp$lz#q=ln9lvz%K3e^ibe#;E5}1##C(` zBD3D#9I;u`w~T&izCJZZK4&G0R(G=o8$XTrO_Y33cgDY;lOmJ+rZ?$*x}8)!JZ0#u zF70G0Fdi5Hd~!%X-Wh1+RMT@^Kszb?Zo!Nb3GHM&3@dbSRvYd9JM;6zk=CKovuUf^ z^EA3{#Z?p5YBb|er0AfRdsA8 zg}x^mO~02czob>EX0xJ=^tv-dqpngGvc=fi*TR~4)n z)30NS+yQMck~)~EX_YktiiVe=Jm+f(zaQO7(wnU&;sKVfGvQ9t~TkhGB!ob zpXPd0G%iI>K7N@zcxfB)39t9duV-WBXZW`W{xt?#fPWn8*$i~g)hd10{aBfh+cxmq zpcwf%G<~1x(-^5Y)};BfXE9RwM#nr^Sf$FI$1gOj>Q$_4iZ*^e*ZLA|*ThKYx-$x` z+8rkcOHZ@T=aDFRBix+bz9&enf>o-fY4}mNpvTHVdVCV7 zNB0XG`>be_DCS=_eK|TKM$*si?7q8EjBJeCGI>vx7k%K8x$vn%uDw2=@us?-0K>2aQV6}$1Q@ak^Gc-=@ z0|)PO$QLiqQi8544fEuw?4GIN{9f%UZP9Ri-*n57pX0>oW_sJaU*cpzb92u-c5$-i z#FW6CYYjt?0hGI=a^4edtES#FGiqZv2wuuEXP`L7Hzp51&Li)iiO(*TG40A+e@Q z$4PNA)%e+ys6%bUsjfwZ)v0k(L3q zpLZzL#3WU&&zKyv-leUiTAdwQbbE?SxN&dGijwUlVd`$TjyaQMRq0v-XBwx->|Rst zS5!|Bxn;d*?9(JM4LdbIpLwEOI5OdO?X(zap5EPN?XWmme1Glgz)|rM)T~13hjvMF zwb9uRBmCl|{kAC=?3TpH=?6gXW(@6wFy$Qp6jM|)``-fccVtV z+sDc0TE{*w^^KAqZJy?csTn4VH`vtfP$oCO+ibor3!^0FaJ!rZHno(N zt6Znv&L1t!=I83S$F8ZYDLr%he(iHhc{A>Y>|fDL95g&dUxL6QYv0;KB4{f7BbS|$`Q4;wM4dGJSDPq zYuP+Bf5-7hqh;9HpWb$V87I>hZE*YWE>;%V|5UPkw-|}3pJ|@6RugGjA~ij8yPw!@ z+JEBqTpt-^J>BndZ3hW3+B50OM{j9c?|m2BqK?v~O=QIT)xL7IcJhvmokOL^tnmk} z?>3bcA8QuvGCWj<*$q0~XyZT0fWgeuzm_#`jnoZ@yRa$>}E#8nyJC_9;yJJ?TZuuBQX!^+5kqYcdmL#n*9xjZIRdUyAO-oP#Z; z$d>%c-`Xx*dyhQBc>A>|nVd7T!R2Goa(?H%CSyBf$bkd5t5tg1 zL5}#FmKYYCE>+7uF1e>#hUBfAGoq_U8+l>kbNNlNSQ#~{wB5{zSV?NPyxqLCmSTLr z*yrtII!M8Q@w0xN?<47}Ohd~b43$Q^c9xqF6e(_b-!^MKI9!}N1iCc)#K zvxBsCa&qmu*iSOvswv%0`$>WAwK8vC^^=+(j=41M8zx`FR~LEaA1an#$Brm+G(=|f zd-Q6{fB^(N@-&Ui~srQnY)F zU7hK<6J=N3t{<-tNtUMGXH2H2w3ESs=7+zo)8xh;-D7s7y&U-%busfxdl@r(?wt0K zZROC&gr=?TrAhL}mS5N0YauIooH(R=7$Yw#nC&%b87po2y$);8C{gauwJWa6>m$F! zMnyjD7%TVB6t1=-&__CqtJ*ioqrF(9Cf&`M6fWl0O$Qp43m2Qs)@Qq=HJ941tB!oh z2$FY>r&bK8<{%?W2KuyEYA?Pmmj)I*&|Y?CjD0*SvxA&mcx1Fkd__!uTjVjLnLHcXK2i-$hA%W0Ix8_{dMyOxsEKh>vrA{xacV6i8Tc znApiI;zL`hbo-{8PYtb)?(8w9Tjex~OnshFp-G0kpV45F(FGr|9P*^k+-BZVf8p0n zoqcU3{iJj25hfWD7~Z1bm3!@_Oy+}S73-wQm>2Kgx9ZtORO6-%XD^Qz-)rT+oUuxm zX5RY`_j8Sw)E4V@CDe?OsMRAUWJ@>)O1e=#odrEz2Jb1j=o%&y}v_4ZZh za%rQF^r^hJV9jCi5$t)fTxwH05>Qey{yX)6U!wOMg_zZTcLHWw4x#K>;TGy5Osij%t^`VN?B8z&BL zb?)m5L!U2~f?x0QeyYp1;*>LAxkc8b5#!d8CiJ+5PDm9{dq`=+D|Cz9puu7u;) z?k7sZ-gN_JHftk`6ZVfS-#t!NB-oV>JJVi1Ev!_mDX7(2C`(M`%B;5#O1)Y?ZFudvaJ7ji_}9Y zvfQD`!x!4~PJseplfMiIk?I3?w*O!nA^W2D7OSN_FM4*|{JPB0HgaT4ndL9mCCKTa zrp~`i((*Icofo~`66LI|+4&nI+DP_aMQNb_!z|f<6(!iyUzhbKP|9fk%lcY!fQNgl zz@S#ap+TNL{vNG-0>eE*16}-o`;GH|_g!U!FExk#?yKqi#<}mBqAmaQtJ?UcG`}&O zvyd*wKmQq-KlqAvATGis^!WeTSG2XiT=Ad#Nog{#Q zyY%56)EW|E|!o{#MF=?q}lu%})QB=HTTK^t+n3MA84{ z#Tf|x>n<{JesbEM?I}Y`{0n=!Mendg=p+2Ub5BiQN0$Bcy^za#K>1pbb|-x2sb0)I!~?+E-Ifxjd0cLe^9z~2%0e+p7zJzwj0bvPrAeUcfo=;r#Q@ub{s6g-pt}M)0lNcx0(%2Pf&GB}4X_XB0l>iq zNg z3VIuGCvdj`E`fi$z_$f`2y`&$+@KZkpaGo;`UH@ElIA){r$O!v@B(le@Eou+ko&L- zbPpio#r@X)zI*o1LX0!dvwr=a^+Wjr7~f7a=`Z)bzgedaoC!RI;K6ExSsd^60y z@{k(>i~=(54dH(r_{|N*DbKuOo-=RA4~1SG!FZioo@ndh|IGTj1PhzoTnf73b+y26}TVB{>=U6 zytKpow}O4{TU+R-0v7@216dc;C!cZ)A;)}Sp0KYHoe)os`#`TT`1OIT587j2XMXm9 z|JFcv*ck!jy38=12wV)r2V!(3FdxsiFwoQs1$`QJ(}9dbd(dBj6(G-i;JSNZocE{* z$Wf0-{&2`I1CnouM=^d4coyrc1Ud@y6aZZj_zK9nXTE%a{yU8Gp2#>+ZY9QDfNsE5 z23Q_+Gx))}N&=tz#(P97@JUYv&3vB%dN=%Jd}x>bk?}unFwYmz$w1b1f7p8j{$qo2 zTlgOjK9T*8_Ycyv!}|jJAMrfw@H}RJngc%j8=niv?*~86Lhco4+T}gvse#-W1Dg7i zU?&%F7H|;oCU6UI2axxo7O+eDgTXlaD$lVi81D~ce`J3n_P{vlVu=59@Ock$2LBh@ zg+CKPb3Ggdnw7z|p9eSuI0G0BmhU6jcdNo4<#^9s4ZXP-H-dfM zw_U(L0J&X2(j7qWG~hG-y}{23yY`^jXV|Ye{vP8Yz?MM9ndbxdiS@~S41zrCwG!wl zK!2*M*!_ZEvFN1PA(GLZLHu9NE?i17iy=|I*m`#$eMI9R7WT{2CzpEzfiIpqa?D6^FCivVJ_PJEZkzW&XyjSpj&tdS{ zk4>RRxhkMHL5_98bu>o2Sr43_@2k5*pEw3~*f*J%+?O7Z=Y6In=ne*a))U{y@cv1D zEaXYEu4qpOKiKE_`?Iy+^Ip$$WghsIVD~dE* zf8txT+JD|%|3kea(6a_I&kffV1wB6h@%eEd^!Og)gaK{HZ-H_4C+5dG@NI#-&oeH! zz$cys&AbjroSFB0US;2NhJ0PDgU^3Cz~{YXFX#=x+CbKIJIurU;k|}+NUQ-pA0YkV z^E{u=*%vq;X;aMO0{w6B`x=n*vp(3z=>IR!y9c}ry^Wx`@9dMjpWcET@9A#v!`J|M z?}9nq3jBljLE4!JKJg~(voE>Bt{;%+)mrF%f;{(Kfu4==2+J<}hJAdQT*vz%$9W$u3;q1iYYn|s;4`0tG0t;@G@oyX^k**gc|H(- zfKPNZq%jZkn$Hj8Ah#08^-TwT7k+a+^q=yZA;)}X-%9}B1IYEV&u|}3VSFd%sRo+& zQsy=9jhyc^2z&H{-^-1F9QpqWdF~B>Jo6|BG|xxwk2(06z@0z=^7l1d zw_!fA4q3lX;C~6|7X~f|E(Hcbj`xo*;PZ22JP&q(?+qLY1RRcF`s#lYzlrd@EFhz`j;_3&ow?*F#d-izZ!DP$AjSO zfIPREZyzDgbB*tRJA==2tugcsKetDkb+it0>>K!78oHMB1M6Yj?7%MwKJ({1_+x;E z_y76ukMBSE`5Drzm$i^%9M~U9VZKJN&$u#=NylOQ5|Dl78T|tCxoa$Fp1<^;{rw#L z=>R#_Zz5=(f9!LV4#+;HK>J``);HfDOod-JfP6mX^JP=$lO|RGKR+-D$a^E7+j;Lljd7m) z*Ff`LPySi(+XAZs*}s|RSHWk#@gB$dO)=gF$iBdMb6#((oAqxBx&z|19QxCMFM(At zUIp|=;7#BT;2R+O1p7YomHzTR#(HC)VqWsxU_T?j9{gZmp9+dWnfI%~=RJx12=E_ZzNeshuj>W+4v^0ce7@)V5axw3ZwmS~=nJsJ`^#MLd7j<|&GVDzIX@4^{x%tMKCoX7 zcG>s&T*LVCzP$i?%p>mi0qFDn>=@8%fELhWd~Si}?{obi$38&$qTn+ha)M@`b%Fow z!9Nb{3HvL7$H3>g6bHIKka2T`Jom*Nv?bVr&l!<+1D|yp1wHl)p4Sf{w+^@h zelVT|!Ds$+-c-o-1lj`o06n3{{>whW^Qsoc*_YYpcyHqKA^Q;XiuVf2yJEf#K;{iU zhs<;G5$5CPEp~wBzOcXV1HS;`#q)uEhxZ}c9SM2v3-g=jJJ(Bn-WU1aV+s5&f%z%` z2Y}D>Yz}DFEAKC?*9eTWf6M?K4SRh48v}o51Nl7A3-a_M8Z`Hp`{@lmN5%(oA;3^z zZ(tF~TLZbTyifB!L%XcUiIC^M7}hcSHOCo8fB3~bO@SY*r&q9h1sDnBdok8$N!a0i zavtpPeBga}7WljuPJ+F0K%Rq+pqUSp=Xsinan{jI(CqJnF;5p@M~u^s9q9eQ7+<-Wv$J2f?R5JlFZ&sT<_jcLN~*0yrMyr4c{g_Ze@VJM8l_A>SAJ1Au10 z2SDDRZ-Dj$K88Nu>#+Y10DmuVJmjYUnSbm*>{IN^w8!@<_Ru5E`OAOp z*kixh4L;w$(T_yP)dq53e}X*w1NrPvYazcJa&3VNfqdWL0Xb9fzXACiaS`+<;8}xl z#+TRz_814=YnWGtajFP=?4ztd?qeJ5V=35W-=crR!QTs{Jm0hNy)5@D2jp1SH!wf< zi}!^JkmLE?2sHhi4n3}~D`)|-4tXDAfA5I#Jg`T9*oW8`*f05hcoy_{KjQlgK37wI zDeN8qo`xRd%D&9F*M%JWPi4sSykq~)2mUsoFHo>Q7C=An>%lJbv;k9$eE&5JeD)*acF6I$ zxin~=(|qsX1b!&&Bq46>=UhMUEl!XNgZ{#JlDy4QZV>@kIZ`^?dF3%`8Pou z-nV$~Yy^ABK-MGI@eF)^o}wLS8{jso>N8FOX-yd<~lW!G4?<)6U#)>X?jQ4*&%MN(kYk^s+yL-b0(pNr4w}yktiK8Hi{~Eivt7Zj3cLa2 zxG!kd%Olw5cn6Fp0q+270A~WZ9=-?UIY)WEAK`m0Q|PtCd_959z&{6MUh?_*8srLL zoc?h?Y5y3;Pe7jM`Eu~T0tW#3T+H`6+_$nAPXm4f(#}rM7ctKTU`6nsf#&lj`v&ug zSQ&XsKlytn(#v3v&#Am8^8FO`ePJgR@{vI1J^8HDTp0faNIUgG$H4zhK*pQr-5c-| zAECkDje)!m&H&AR$9os|yAI~(Jyr+#qQJKpXP+TH0RJeE zd1(nfu6qG!#t+NT6@=a#;A!A>$g@v-fOf;U7iiXf3JeYf|1*$r&JVr!z#%~9+c3~X z#+~u54g1``3$Q;GdiQ}}z^@9Ld2$APo{PMX^L@?F7-v6S3!3lePr)AV0la@K1wRaU z19%VmwBrey?`ex;J$&y!8spy3=l-z|?**UtdDf2=>~Q=z>=1chFoxV|jI%CNVAmb| zF~CVc-qY@YUI^R<^w*ndbX%**)n2mK22`>6-NJ7S!DpLsw(xgRFb zI}Ca5_i*qZg3sra1kn9}BOph6mBHt8y*b9`fzN)*=ZE>=>)`ib(C?tf=OI4tHpe)h zr`R7-AkY4E0CHb|$IOU;*gzz#EXi37YnSpLQ0-xvREznai&i!u+n*3Uz z`5aXXdVD@ui17|UzE9=(c@XlnlMXrdk1&ig9?Tm*5f}4e!_NUwj`%|3*Up5$0x2`M^$)W1jH$GUdQ0HUmxMdHn%=3)pi8egfVF-i91MSH*iX&%2Wt-vfC*r*QvR zkCu>I2V}f?k7qtJulW1ohLFDk>fHi?$7~cR~ z3-koe1=3C~%uhMKXJWi~&e+2~>yYn1m|uL}pndk&49s^O$bQ28-wnIdG5!EFpW_CB z9}NDlK;E-i=R6m9e;{_i`q(%49;PnrY=iw9z&PM#V0|F(DK5}E20ot)d2iZ`arSqf zJ59jny-z^%`K=G^4FkWJfjr~Dd-+a`GY=K?W3gWLk-FgLhx{YZyf-`nzZCctfjsYN zkIylWAzy%cn2+OppZFSfazT#yL_PlAiFL9Y@*kM0n{~Cw!EkLe^=M>Ka z-m7?i?}9wvyJb=zI1R{prajuB-#jP2LB0_D+zQ$cv_CM=06883eiX2U0c|)=xeAyk z5%R4;r+_A(^OMiMoB_Gcz>Wq;K9T-6haBtD5Th~P1=tVR7yfkzT@5t(ycctvI2iIj z0Rw-GyY}Z2hT&!&phM)P~H&f zk0IX%^Km~rf&N!G2Y&2=9I*%Z>@RIWE69}q&G$GwH;9~{I2U^KyFF<7PdXX=Q^0e; zR=~4Bu7~@;I5YpqPlBIyphrIQ5o}#o{Nn}Wdx56^J;A3O`J`DFA}b3<+*=*OU0H>7z#48l0;miu9d z>}P!LqJKG|&vnoapSzMU&iFE}hVoAEm+uK^m-@s=*yHoBv%&n_AD%135s(`O90eS1 zfO8CJj&mOj^N{C5IP{pmKY`v1Wd0F(AO4JSL%JFG>=*10M2<7hQXx;|`T4Jqb~#Qx z`p@+ePr^R;g>h{PKK-!+&3gj(D+>GwAmc^9`3Ut@_C-;0GxnEPj z=ef!}XZ{jXAlCuNyd$>8d>b(y0h|ro0HpohpeaxPX#XI_+XA^?uAn(D{aOfq4ah$UepVX$`(Fke^$A1e$%6cBoJLd{4@A(+2VSKkS_eoX%C-_<#1j zBxSF$WJ?*M>~8zc*s_HoYsge8OL0d^LZelPkwitNQVC^JN}IH4uc1wg(xSBb&&>V( zdh(0vectE)e%|MK?>?XR{XW-quCra|I@dYBGXu|$R|W{g8BiJd%pR8&=h@B z+Hu|qA=!NJH1_U$^^V_lGH?DsJMu2%PiSWcv|Y=;MQ^>D)H?~9rwSuK3yVPQf1;hM z?T7L;$i8Q9M*kI5E{hz2#*z9m=#?Fx{ux2J>*RT1J{(24dCu}1(O=IvZSN-Z+Ifzo zh5E5w*T*=UMtjPR<7hNro8MlfpO@iUX!)I?a^uAGXz5q*DT^Vd}5Y49>Q9QJ{ZLs@%i zyN<7&?a=Qv$g|1$I9AO$Ijn3ub4Yl zL6)cd80fiwBeH&ySE3(Jzp_+FZi3wwIF9m#P`Nd-_cgzVT(=q2S9YCUN8@@kcG90i zn*Wn2cOQCAXy?B5oUoq$NMM}j(oQcp7@mn=KH?MTD9oQGUx1je>?*miNJ1@^) z%hen2#-sijOMTC4=jp!p_fljA<8odPQD1t#d!O;U*`JqOjlK6#?@7jCCH&<3!Ef|; zJN$wA{#@r9^b0~f6}xlb&y-h!r~~t*^RZqF>>PgtS^E94488a9=a8GzfpmX(9{)=D z>CpH!UrEoCZrC}W7wN}xY5Sfx-ml!Rg=k0F_kvEeR~#xAU_HiB?*(YP;rD_;l=py+ z+w)M_pAS7nf8H;iKt4cysl9w1J87J_zqV8Vb?DCz^^3Ip<ONq zO1bOcIeIC2^VpZj+d_K#-HYDy-u|M@TfTrScO$1#-}{dF;3o99K>Ht!Je~UHzdh)G zgo|J!cmtdplGWcvd&<(dFGBfB>Z>1wekSziHXk8x4(Z(&52AlFRPOt=_4-qO8vS~2 zFpsRG+O7ei>z_5KCf{BK-&z8U99^s@lEKCV|E z^l||59Oyk}1G49Yvh6=Y`HApTXukXe+4G|Svg_jboUgw><$QW#ubuvLKE}WC>;CoL zXI^sugyY`&j>~>*U;l*liy2q(5Iv{NqpwoF7V4ia$ok##!RTkf>)}FZT>70-aFTdF@){ui-ve16GHpK+lT@kTc+3=)UzH>^hI7{37W7aR1jrf2e)@`v5fm zy^K5;`_fSTE0mj$^s_Wyxli+gO!fZpGa z)laveH;!IMcAwk7@xPh!FQMz}cT_pX(--=lQX6~AT?gaM_`imF`JwsW^~#4{JMWjW z59OX8k0P7*yq|wY zA5dRzLq14(d*sQ;Pa?O4>tG6e7uv7iH=k19^V;}T)(LpBe3{(Mb& z59s~S{bhUh+XlPFa2{*|D}>7Rr{(<_hxZ2k-W9!Zl_w-GK^{u`aw+l_I10O>(BJ*V}4QEnXFglr!69w4>*7(36?ZpiA(BfCEO{Z_`Q zzxpDZ4{k(WMSW?Wwcf*&7lc1jZzl2}cn);^pGJNP4y2y<7|XrKq)~nnG++AN{4Dyj z;ZEB196xlvqQ4mGN85WG{W54AJcpc%_75OeLN+eb(O(Pg=OW~_*n1x|AJj)*2|H!& z( z+Gz;gH!o0L4;G=^IP-q?DCPH2Zk`>D{!-{UXCAYj_tN6nNx$3Nr|#Pt*!70L((g>< zcagt@?jN}VyDiXtc`~y5)A&^O+;AQzVsHL7zSp7mT+yHQUy$;Ppz`y`=Gz3uKN7v` zb257K<1Lhb3HL$cz;fg95y}tJj_dF)dhMo#{GrpZ6}p-$F~I8{pUT+^YTN=htiJu*mJK5`eE1^Zx^6X2{9SFw&=|V=c6|s z&4;e4jhw?p&7o0QwX>vRG7Td}_exn_vFD1Q&V{WyQu z!Jlinj@s!L{b~7r+Vkfg`rq-)qu+%gdLF)seiJ-{_S^^F2U98E42?hczxVjhsBe45 znfsy*<(+89bEqNuv(azY4w^So)MMv8!g1H8{2|Ic5A>VkzK!yV(C?+skgtXh!uGT~ z#`d9cfC@=z8SC&b+37ZAUxjQ6GE9v4VExHsm|7+lf2@ z+55HMy^m178X6bhBKzlaj8pwHj`FKue&~Gt4wYjmf0%JJfyTA#^CJ4=;Y=97OKInR zXdd)?@)7J-K;H}NWAC|SyUMP&=Y##}KYyQKKJB`mj&}|18`r&&z1QYN?gJ-4_x-WR ziL`H=C>x*ZAH}Xe^~OW*ecl(|L+|}a4nglZ<@{UF?yc}V?94MSBkTXqk>_Hsp9>WS(PsYQ&=r>^ZKCFx0_+O5GF8WC@f_^g`jNUvgTT||Ra3pq~x6U^i{WR>|-}X0v za_1FAcAZ-wcci}UT#UXLyo&O6$X_8phwQj6K>sv)*KawpaqK#`vR!Dq=A9F$*By?A z-p4%$U#GtN^$P5qm-h$vOETqh8M5~r_hn=Bx5CSy^BRHt8|=n7%y+ZUyDy!ed80Yy z?g#t#z0LdYMB4oT`v;->!TQ!SK6hi+0J=WsBl{k4NvOOH@>%rT9Nq;>!fUbfymh?Z zFVCgi?@!0?J*g?}=qLACC-mm=`Lv_ITz~s>-!;OnEp(ssr@j2pd&XYmZLkg8O8x4{ zcOVag?(1F1=9!nUe+CwUEwEdR+!fY_&f_!e%ss)V~M54(+cavh#JlU6%_fe-!E`&!vj=cP!L@ zov^PL(!YkjC!7fNYg1(BX+Elm{ukIDx<8ELm(U-i-ww!re>flahkp49JMUwwkd4<- zAz3@$14_}~mDrh&qsZF5joc6#U#^#NvWfP*f4U!5QqT2M*3XVp|2RLt@7$;65%+Ni z`a7BSzk$9#U4YySyJpB0py#9aBj<0wo2h4hQg*$}k5y@}JoLWpeexvquFLbtr_ufb zQ%mU02)H4;RwGPVBZo%b%j$dy{#*IC{Td^kc8wu?D=SyT0RS zS3kI3EzsXUd#?Xd^yQ%S%}?HQ&0k+&=XcON+ItRtW9WV@7P3Ex?7FzF1!%`{d+vXX zz47e%W1gu(x#xRtl1f0BCo<8$N_u#*uM(s>#m z#^EaL{a!zGe?+hUU!eU=IEwP&@LBY=;0pLEEQ_6a?j7{2;V-ZccFOwIbx{5U`!3M^ zV7cv{LVF3YH@ug6rIFpI`H)+}cd>I_1|lzpKfw9Wd3nF~em0YG>zm*1q@N{}KMno; zaKB4jC);)0%Er%4wCDPdrM;f$y+?FIzKnAH=N4fV4+o_BGcX_dM1vp#EEMId*N~?QkOHw?N-N8z9$&zULXY+Pja9 z2leZz=RL>uZce}2=fckK7W2bX*t!1hC)?Rix#xlXUQc@~V1rP9Ly)}>dCnRq%H}ci z-_O*W2xrp%0qFV_qy*ZR`f}X$n z#r;|k`?}C|_5L^;z47u9?QIC@ry;*hx$E`DhivF=s`w8fO zg(WDT3(Xtmd-q30?2YR^$c?Bs0$FPJ8u|pN?7bs`z9{W@KXV`NL~opbg>3$Oo%;RY z7f`#-*x!NP`RSib^yY^e$RERIusmExdoLr;f|sNBK4Km-|GVD`V`u-Hsc+o4-iy#1 zpO(At&2K}oD+F^x_qp*P{l2uH{Mdg0jc5CJf3IZR##txq>!A0(d^7s0p>}<*X@p+C zH9@XMJL8alfWEhDzXQGb?lxq~Dd-UkpLM z1P+BiQqMS;f!=eq1?BD&@29iS55V4Yt~q-1zvt8C*twp+Av+H5xz;xhU6=2$&w#by zSI~HUo&L{+=2i3GWb}Ry`R=n8{a)I0pP28Q=SIpMkMZMozV#l#Za%yodLBQHY+Nit zUd1?4k=KXpjAPFo>l-IGVDG-P|7Xy*hvrH5tLKaP)&2f<$o@LyE{wBVh&_-k?}OYA z4uZ+h^8U!O0{wWeJ`MRi?9}@XGY-A^_9Enq;e-$;h04v}(UATMWc61ftC#Kv&oA%C z%GXg(S>A;H7B~{7!UZ8tL|y{x;+Ofz&P)GvMQ@%lzAc|jx$o)8wC8<#73Is}YG{8` zkn2PDQ7`05@O-Gf{#JH;qp@>c(~&QPmqFJ(Hmcu|AJosNd38q{){){(eviJj}Hoz%|umcK`R|Gl+!*!l0j_~+d_p!Xb-zH7-UwC_G}f4aU>z5e@%_P4{2q48v#4MK0; zy9K!_{r-sT?~(d@r_#TNUU?w)$Kwav_dDkt$}fSpL*sS{@;tZ@I?ppg<*vi6=#4Yu zPP*PVVwVj2!+OkjG4cR7BxKhQ*?rqU{hcNqs^JLB1M$6?(5 zNPjD6&+-Y#p3B{lZO`>lZ@rsC;~I^uUi!}Cd3pf5=1@OM&lA_lxNL#F@#DFoY@V^- zzSw^cZFeZL>!_W2`2ltr@GEGXwnO&2c~40G5!s(-`S%$3@0XlGJhjB`W%x6E4c5o5 zHT0ami}keK+LTwOUR&hPkqaYFr(SKC2n$lKT{utZ{|N0_ZafdCov$gcKzp5_d2$`) zemA=A*87rj_s?Wx|GgUb^K)4rpy%#xt`2}{eDSn&^ zS3E*hV|wLG#BN-+ygZP3mdN0_G?EP^9@>L;w<>}}hpYxc;c+3wsVCVf(*?A7b zk9)Ce3%9^0pyM^)7e;>@oC9etsLVL5Ulv)rFvn2wyradEcM z-WR-wcz#^SyliIx_MSi8nWyy{B3u6x?EU%fFxu;f-t+xw^$v-+c8c^3|{fe3W_2LY6I&-5(wCM`idM^~NIKi>$v|qSv2K zP_C@s)9J@|hFTnWE@g?uBlf9(dL?*iRFayRog9`=suDQXukmT z`#>&6pO5}pB71(0L0(IF1LQWy?qk>0{WyW~Tn3MU{v79A>U*9l_e4J(dVUx$KcIJ? z>(9REhr%nM_k$ty@4r9oeQOtX_LqrV34R7^LHC*aAOXGk$$0TT>%W(HEd9Gq<|X~- zeAdyP;~Nrw<33-|C8Z?kluJdn{xa2T)GK+^GG_f^B#aa1bWWs z5BKeI${qjd$hGL#cU<>NfZm^PYG?UC;?Z?#6_!_jJuq=AS3%U%4pb z>%yBO~j^bdu~{r3yr!_K(!US6Mm{k_Mz)UOYhL+7X8-={s> z_2&%NV1F&;?;|&Y_rY8+0Xx4BoyRYfdr$G5!F4K5x##LJ$l85~EIsd1(Ju^f7V_2b z9;n|ZGR}LT`$fMPU&HaI>tnw2e&YSoeO#1&r2A?L?U)~b!_Iw>7ukK*4B7ohdv(*0d&6_#mC$%eLN?w!x0N5Gd2(_@uJ;m%3Uw>srNJQEBmnf2Krs4|2;pA zWApj_jAIeJ18V0w`Fj*~nZNn=M(jQ3{ds`*fK8O^cYhA$?;GC5c>R4`{p-5CO8MDv z2=sf&`Itup+Dlli`ohczqt( zd;I&z73tsn=)KzS2fs^h!`^wOGk*O$p7JkYBJJw0&FIZri;(>;>Q8&dx%>4z+UbjZ z4VZx5eeeAA;{({Ofg`c+7NYyKGx~nebJBU~=Pk6S|K3G*J)GBQ^gH0hko*F23jKA0 z<)H0fh+oVrJk1lX(=h7!J?Xv2_;;Mo;ScwR`j4pZ`RUK)e?{*-#PiVnu5ACFb3>?i5Spjb zkf*`x7|$cfu8Z_N=|jrr!}ai2>KnJlwc|*|PQRNU`k?pyX^HL9p5IfJ8`s`D9gq9X z{`5mt;$txFhRavbkA6CI@28&UxBKc=>>q;4&(eNA=)QOcIRX1+$d0QT{p_dQ{qKJE ze6cYLY(qaE)h>OBv()4%N-x5a74@34Bx(SFNd?|t{{7-ZwCEqdRp{QmO2{LAGY+YIdBqszXLm> z_q_L9^&Yv3a_o?d-yC4Rn5^u=o73UHfT8x#xrZdGB@oJP(u|?@!df z2qr_nhw_EW?_+%aT=#6sd&9g?z41x4!1Km;uZ+f%M=UNDaDrk?9)K6annPx)l%dbOtA%g`I2)<2(e_k;PO z7;)`+HwwFrv@-^|0QCN?eOc_hcX(g;2K$M$uYNf8zK5*9?q}$It_AXm)K8|K=dN-8 z1$HOEGq9VDte@{hz6w^rPJj2HAN{hOa@ThVviaV3RP#+T<$Gy=A+q<550M?$X6&9q z?|M4lYUo=+BsZi^U-t7dD?zD_N(Ds+PM38l2HpRTb0qDRqkK1Xzn4ZHL;tRi z<9ZhT8*l>l!{KMJ1KbHKLw}F^ZDhyochwcN`!40Xk&VZW=*|1K=YFlk{5Dfhe;q?T z@4dcXxn7H~KbHE_vG+UAc_mQ(HRVH)f1X~P~zq)Tc=N5;?F@Sz5Qs4M%kKIS;y+<3@ ze%I?4zYE;I-W$AUIxg4MIC1>->BoD5-&dYD`sq~0)fO(Mp7~w>xQ}yFehK#4m15p0 z=sh3J11F=mo_XMI+OxhtZ)<~n6Uv()=ZCYQ<7%$X(z@_$Is-I&Sm6_pIKOyH4K!3otHO8oQg|jc_vlCpd$KZi&g)BL@7JD3i>Ozh@(YGO#=i#Rntzo9&hcJ;q;^)=;1 zDK7=R_Y|kx`>*YLkMf){kGf7z)6RL&Jm5XRcbYS4-+h?K_^YCKoxQL1qy`cAuP1Ji4{V~w@h3tx)zB94&o%9W4?Ovci z_o??e^JF>fZwb{agkRsL{_&LC-cRT|pf~?|e$7UIDXa#!LBBKIzva;%2cLv~KaNIj zO~2YLK%W4=rQCDOc=X=ajCqyD-gCy^4;X~r`>Nj)zGIm8iecwEI=>dQAO2o2{%rS0 z>PO*H=>2Rr^C*k{CAb@YOnGx;^MUK-x;}=T-!tBiy#E?M?_zfs?d?JK_gfvm=dItP z?nB$HO8xQB@9>{#&vhC{c}@6H$bKdARn%Jqjbrnu_b>Z1{ukRa<(|f@ylzX4CU;S2tcB)`k0-8U!Q(lLD{Z8}!((`|7 zsQy>fGe0ax_U9Z`ke`O07oX9N=ePF&<6Ex5&i5PhobS4~(rza7=LbcQ4?y#i{WL`H z`?m4ueQOTo0sd$fvUgs;F+R^_^Tbo=jTiYH`a5aw2dKYRBe#Ktv7Z57f|KFb*tM4E zXCr$~c>mpt{xs(G4e~kEdk`AW-b2l2&P%^HpuYa}`^k5rYiRFo?0hHbiQar-{+frr z2h3iQPlskUUH_z8ks8!`mRy?(JBzpM3!`NR8;@4m*X=fYc|eq84(>8}Fx=de|f z&2Q%EH)%)z`yT%g`fj0e@6Q9#*M{bW#`IGReIl#_&1a`!*AM-5$X$?qZ+i&6`PKI% zzdz5S+mw53%m!l zpnNg3|1@NOFF}9(Z2OGUc=GpklF|D`|0-nH(R+jA@%t?ayB^T{VlU*rZ~z<(hr<5wTsRC4hohl!F&23oJRgpS zDR2VxU1TD%d3p-+YW$6yA096kZJ!ZvUldJ&i1%3)yc+mM%(&ee5%#e%+1y0sIJl42`!> zkp2GLgZwEppIUDNdfUGZ`7*d9BpV+y(0>lE56SMoFVGubdy&6{`a$_C^xuT|E%J9T zEUW*Xa_`mCk$XYQ4c>2s57txf zy4p^-eeGOF_q}$u8>aUf&ui~-z7Oc1mCVQeTbOZr4|JWCeGfG6nXml$x4&nhY`MQb zUe{=1!V`}5~AjN6|lRzQ{s$lkY}q`u>m_InfMr%=y(oAN!B z7ouE!nC7W)9G0iv0@^Xpsjo)4_e}5Kr=s`W&HHgJ^n+;6xH=tuZFnx_?o0Ef{`5Tb z=WWZeUkH8I^<1`|<2UY%m%8-pJJ@2{84C4#eeBMJ-Y2vhhP`p+{lWE8Z~QgG-ga(A zmezOQI1crd7>DEa_mM3hLVM2t8)W@yd*)f~(y(*g&1dE>`>|i`JpXSE)%Tucef{To zZ9L4R-Ve}zj1SKp=jFJJ7yaaT2GEY{>v-+opXa!K{yfL;ZQoy?qaA-P;yv2;24%+? zVO`t@Es@nL8&A&5{BJ(@UAYzY+x$(MXWC)!due-Q^XJj{S9alY&tvD&fqpu|&d~Gq zUHoZWxL(?SO}Xc_`@9S7$garVf7elO6SUm8a2?f~U)~GZtJmJ~cB8+R*qd+tZW)i> zJhB4W@h4GVdQPmy&iFAtYhv#`%D6E;jlb^L`K}di$9tFY=Xn{X^N~Gh_iD!Hxu`x& ze-5EuS-(l|&*mB5qdW)A6VAi@={@Rf#$`R(2fgQBSZ_V;`eNS?8joRpSoXfxpL*f@ zpzq__h2;{|b06vNbI>1+?knHxX0tAy$L2$2<4C_Q!ru4voyhJx?aaHbgK=WJe)o8< zpG7;h8Nd78a^H0ZQf~Y8kiCDH=ZsVHpZU=IsJ->Q&$y5EtM>%&KaO)S{l3h&?dKO{ z^^PYjJC571Po_Ql-+?fl?33(V) zw%y_A9jE@ef%=YD|K5S#d5@sJ)P5v-Y5(RC_mh4Zg}t0ZKcmrqfb4m!Z24I1#)PQ; zypX;DviE_Rv>(=w!%q5hT;-$Dc(?p~+NlIxFZHgg`PK8k~t zC{rkRKes{l+_0W@(sS8;d;#^s^d4nise@f%=>5$3pNQW3famNs=Hq$mytVf}U_4sx zy)%(^z2_H1zVImYT=d=5yyZPc7Nfqh`C8fWT!h`x=seEGPXFsq&v$7abX?!yAHR#` z9`r?NcP;W(==hbT@l=X>%K9;Emw=t?FagLPm&IKVjDp-+PDA7$6gdq#L&n^8}__Od(W(zvnQ zbINn>0mk(cG|ru$_Rhn5hWE@jsOR{-e`)tI<@ZCsBbOt)Un?_ixsP)5r~Mr|7by1~ z#qV;@<*>XEd&|4fpLx%FN(c0QFKA~y^P2nUH0)gu^%K#Tg_Gc9Xg*f&IX9GY->1As zs1GR51(VqL<{Vt`rktRcz${=d)}G{mE~o$TM4=!FGju`YUg*C z_dDYu{4V1C!#Foy&ZIrpr$4ga=eB2jI*;Mlxi01p=Q{&GcyBUJ%$KdHUktjh%onbU zdBOR*PUZ>y;XL${dFw64Vf?y}^U<$)$^AJV`%9sD&~Z5)^Pv8*|30*u=ljyfkji#!CwITEWk;^PDmNNWX`@H+%jWFYe2pv}b;1;~RdT;^^g0; zbKCemhjADW%3<1%-)G_TV*>4Hryo5>jA!ZkEW|I4w;8hco1?J={kac@AiEysJ@47l zbu*ty_emMrG4C1I+S#9SnD+ZC^H4VK^^-L2&ZS?efA6Oqn=hU2jh_U3Qxygy6zeqR}f?qkc%hvp&QIUJAsbqnJ$t{X89W$hh*Ps-1yp8c4= z<p+(yEo0UoPK=wG)}r;XPkLnd9K+{YwY}Piy%KlyD}YFYUlp%L_Jvp zxeoLkS2iyEdCWVsKN)-JJWoU~dm!sa_l4)L=YsW}hki7U^|Ntfc|qEDKbyzhzvg+* z-Llx5*B!s><2pNDzXz@7`e-K~z%Q<+es{e3xj+58553>J-tHUc>%Dp)S`<(mVxbHx@ z>+=@%jX&vmYo3+nAMK34PPFTMx+5Ex1CfnC*U5RRcmE`Y#_9emf&NLxeG0O9%{-k4 z{khP7YK7zp$i|uDRd1f!PJg!R{b(b4s za_>RrUHdVfrTI!fIbY{#++9e!#<_Nu+rP5=rx^9jJL(;mvdo9Q{kbnZ4{YE4t-rO` zFV^cvd)6O}?7s4x7=^wSECA04>8<}F>*4-2A6Vb{7NP!~*t=hh=i?~%-Y$Jta-8NL z+jYOWZaZjSzq;PWsrM@Hz2-st@xEodmX~9E-QaNe8U5L>dG8hU2chRuBkD=>fc_gx z`F`rzPbRYCay>jB^v_+`8E-{t&-2Rf@u}$7VsCjede=vN-cUP^-}{a28UND!T$cLk zFQ?y0=$%Kike&9PAAZ;C7vpst^@31)ZIC_Z!W>Dt^nT^OzLfIP&^%;b8i3w;7zft# zoH5V%4)z7}_gwNFNO>3Kj^FPW{bAg=e{9!%>35EC?Y{HA;h&3a&G@DJ-Th)c%hi9+ z_-y}4WaGf~C`kLBSH^+o>!Z~3{^>i#`PBQ6@||!9dh^U=Wc~jVcIx%B`^!9NzGz2% z_lxuNdsKh+#m@ckPG~%hDQ|;*E;LT9Z+zIV`?f0em1S}C<{jh8eNusP`_~VygK?nV zcxuV`jC;?&T(svt(NCq&TRst4hS#MP?N`B0zgvGV<({wlyBGG(s}Qp5X`DE2_k;V@ zcuk<*Kd7-WSVK zPrpg`v2o-gXh6{wCj5J!Or-W)zI6o z>*)HOM!EBKy)U*N{Vap7({sqdad9?lx}(0==q>u^oO#3nt;7|#rW0E`M4ggljAckN79b=wUHgC-v!2r=aKWX zKUtCb%KFo|97wtT?Tvqoci-z9VCVkTKd!U+!E;ADsejtij(OAhhwHhItnYf6*UW#z z8E*^P_1@?BTnF>6f3KYP1?z?B`Qg4YPSv|#3ed0Y%Foktqj%r7M(zb2zu#YHQ%}9) zse^qz=PrFVbf0v|uB=kP!IXfg&ZXTP2UcY$0J8tu*^K`$M-;7V~ zrS~7@D)gfty#K0qKc9%5@uI#pemBq9j`y5=)T;~U9A&+$Qto?+zi(pu?icf=_cH1H zmGz@PH#aZXzT+rDzsAQn#%G*1rrfx8ezyM}_9tWKd99zk2Y9ZVSNdRI6gp4WvkQ7< zsUK{A6a5?KmK!hLU#xGwG7ijtu9N<;9ciAo+594$Ez~1oq}B+xOngxhTi+K?K@uW%&W$!``vl2qaEW( zyEEy(8}wZB+;Tr%KzVoQesjIF^PSCoWqz}s{_tJFee(e0n@anxukm60c@Osca60we z*ZRlrj5Q(uIsaeK8;9r8uW@n?vir>Wn>W1Agy}f-Zyz3sXl zo?CS&_ngvi?gQKLKIPw|r+q!@+s+gC$NXX(`1j$3{qJ}6YU(-PZ;&02abAl4)N60v zu-^&TX@3XpdA@o+IR3ua`+E!e$$e6ja`&_Sn?LlE`FuR~uKT<6Um3mmp*OO0KglVS z8!z^&zs#GXLj7%`Kkq}{w<=+$ybC+?rG6iWT>>;um>2Ye`@wm;&z<*a)Yp&R+nrAt z%GI|-Ht$LAGtRplcAkfRPdP8+LD@Xvew)R-oxk&~O}n;dUNSFtrrdUqM{Wm=2iL=X zdviZ7gx$;Z?|sDk*x*pP_cPB){bAgycmFxAFuf=FJ*OYkd!9(w&HV3qvV(D(Hyv*^ z#_i7^ou~WXb5uD6du8{r<5q9HyB}O{%%Z{|DeUC8*qpq}%% z487mSu8;fPeO?$l^Mdj3{j~+{x<0M2H?P{C_blVt{@ounsOLHsM|MBhpZZ>u+pg!f z=Tu3`eQ&XRGez^#F3>;2<{XPhNGJ5X=#-;J=`c%RGYV6(5 zXQQ`W&l~f1Im-QeZ&yWH21YZH+jul0;0<+|8C%KXg_?nm>T{xd$!k!*-_8?gZEn zx?Zv%diO~L*?WlP_cK1n<2rg@aG!WCI$p=Imio@O1^sxwos1m8&i7ko{b3w9uHn@C zkb3SD_x~xBn=i&9KZ(70elD_c<$0#P{dqoG-}rJ}To2>T`=9p%S@v7gehuSj^tZ)9a zA8G%_Pbb=OKiiM<=p8C|9iyRfaovj}?t!=m;vR^5Ant*<2jU)xdm!$CxCi1Mh4=YfWds0=I*o4^{d8Eg(Cum!aK801#4HEaXh!gjDd>;Nl4|J^eGy{pdX{r4@x z|4v2{<^H=}{(Zat`(eF8?fdTpR7UT==i|SN+ZTO5*dNY<=Rp5{??K3eVKN*7hr)A1 z9Ep4$Yyii?aqxUN9;Uzqcu|NKAWwjepzGxPv~#@&V7CH>*WGzWD0jZbK}+(ZSO1f{PcE+J`KZ$l%Lid&X$^CUF!JJpCFE4N13nDr z!x!N~sDI5X8`0koqWeO>xvyTpPQ7&BJO3xJyA^JRj>G;RL+?J7?o;>W%h)Nug1i)N zfobqr=(?I`ZbvUIm*%Uduv-zL`_FwUU&GGzeiHdExEkIKjk|k70z+d3oa2rgA z_rho3+EDp($R9xcav!q$QUAIR*HQi;dzBRAU&6Pbc|e*c+%K-PR4b?(Ys&vh3t#bzILBbz6ZMA zA0r=t+8slE?Tx2TvHJ|3h@J8A1^Tk+U4P@nIB*`Nv2*;|g=N=A{~t>|Q8wJ z;|kMt2-9|?@#{KD=W86)q#t=IvaE%ipZHfk4ShlMrz6YS$TAVR4m^%}b&-!pJ_Gp# zo}Y#X)`khxWE>zf!%_ z-tmUz%J`uQtO}dZ-zmt|VN>)qk((peLXIGxj$9ii!aA@nJOkE)_2HTDEZ6|rp5tvy ze~zmea#(*V^;=PX8nWYZ+>WaSc8<$=wn6XsY)^e_${mO8v_;<@wu2o)dj0NvtXGlo zj)mo5dDt|>X2{K91nS2!$Sq+j*c!HhZDBju9y08}eNh~}`>_PF`>`al`|(8N@P6!o zJ`X$wI^JWE^TD#veOdr{JS+qY!y>RKECyS^A#f<14oASza10FZANPy8ahY&^O@=c0F?8mGO{8?O=M!O-}1+~za$ZfESwmu-;Gh3@lV$X#G7I2?9` z=IN=(=8emdM?&+V zsP`Id3XQY-kO#qwq4`C>D?dW{EwCYc9bN<7S9c-LhQ|FB$jQ+CdMk1dXgqdDo(8o` zLXN_R;e7ZIya`?pAB8tS_t}leo(mh0t$#JLap-(Ipf?Y;M{WllPg~>%q5IZ-;(l}g zy1!iaIn-+buY`BN2wV%B!)EYaI14(TOOSWM70~^9C-OviA$0!NB3o|~vhlML*>>#T zaog`|>}JAca5rvDYD;#A0wwh^OOF(AN>PxFduc+c^9bySL%p za0PUKJb}Clz7F+w2D0OM1^G4TyUCNtu8(nV|1VSi9oz(+&wgb6W`El2AN{RAeJ65V ztZy8-9-q^`?=ahtpN76)J&T+xSL}bd@7_WG2|Ng2g~ru~$i~rT$ZpTU!m*fJC||de)GMfAvQ?c0WPu8F#;-cVD@W zeQ)}O@^7Jj^_|9cey03KsNa1bI)MHM=swZUzBj%}d0y7_8)W_aHS(^IKD<8psIMO_ zcRhWFa=nZr=k5EG`$qri2j3%ISN*7e0{Zt|&GqoT(|0u2&G*RfnU~`#Ks)Y-g2?9e zipcIS&!NKTOGDoUeRnK_-gWSO)^|wle3vs0w6nhU%DzWBj&T3#eV24zzOOnT--Gp+ z>!Y8HFa7MhukXQ@8-L;VUDwZbtBOC=yDy!u^TaI3!#d@IzBlGYE&zSUD}-Dm#A3+O z_d?(Kr0;vucRuO+p6_|`7~1!})OSY5=eV@@ow6|X?5`;DvC#L(H7mNB=p0=jHpNeo(f5+fna0a?@XBcnb9Ws|s>8=(}1CMvzKfK;Esqea9iR?UW*ZCOF;W%*K zM~jEWw3`4^q4Vj5d>w27J3;qbXXLuD3+xKp!EUfU>;aQt2iP6E{DRRdU)t`gDIqVH1a3D192O;Y>*Ksg<>xbi3|0ZJB7Am(v4*S0~ z`tUl`Lq7txf+L~j#;@@-it^FWeIv)9p9I~{eUaT??q~N|W6Irc=Oeow#;bWNh4TLJ z0(ddZ3th*Hkc}7D+ji{F^}H1Oaqv#K5>AB9cM0-js9$eG?h2>C;qWpz3|5bKf5ljS1RTEq3ii3@^$cG zXgs`*d?Pe|o=4sYH^J@jQE2?y|6}Ow$GErun<+Pb-$7mgmEE7N|09%3^-rNUe)RVi z^iRXJ(0IHL`5Cwk>VNCIPVUF)*ty>xM2QTF{O91qUx zbK2KW+V4Z}K5+c{`5Vd|ukoed%Q1ibt^XZ=I`uzo9sQtQKNzRJ z1Nx4p|MK7${o}i%`@s4B%KTgx?X2g!qy5^S@1Bk?f&QF_o50X9{i9O=7+x9+TZVOU>;`o04eLv~z_+j03m=(wDx@0yO!_SE}s z>Nsr2cghB=kMD~9o}+sG?tHB0dzbXRt}63T_C2jSdf(%u?`P6?H{ToUP_HH9JOjBE za(!gq9nV5;0CPjzbzB{(?|2r{imn-tkGt*MV}!7pCL$-BWwpwO^@T zYVUZ%a<^9PI~C1xVxAyx*6$oIO<=5%3HfG$?;9X@BNbfzbEF- z$rYjb94wqWJC*0p%73|nJYBoB-qtzhh9ghEcvk-TuuIHhJp-n0+ZJ6Gcg5>w+Z>DL z8^^c%tL3_ow&Y(g*RBzCl~U< z(YIi);%A-wS8J+kw*-*Zj7*E@aLKeGk1t{S<5{9T4$G-`02DM{?4 zRxIIv5B;v2StL8mj+_DxZQ!2kyT!UK*EMg$e`X3x(*(Z5ZPZpUjUhqO9(rL4BS82%w+oA3(f&l+1!VEvu2>fPlJnf=fN4Cq6O|HA*+ zGkaCR?3Fn37+8r`?OW_RAHNM=`$NlK?OO-=vJchlTj8+kO)rdktz+BVlVg=X z+ba9cnPoL0Y<2(eMHl=Rh8j1Gdm!$CxCi1Mh+0{(Qdxy~KXP7zBlo{YjHQFZbvA{=EGE*U$B1 zZ>vF2hH;dINuqvz$YrpfxfK+91QAEiw$+A;X|OG7LH(!=NKF3_2mhpmR(P{&W93@{e@? z{C8D;|AX=g<8$XYCx6y&?c@pyb-j38hheRTj~!cT>L2x8#}6AmJRx>cW&a|}=4kAH zC;Y>`#TLB2C}&82_|>8_bH#qlY=ZB1L9By({Myi|F#KcYVpC#vOJVTEKYIJW@V|zR zdE}9!EOPc5TzP5CJ>D~7zmAk$GGlVAWGY@d>~~YTw*KSqk?GCs%1tkcRbHpk`(n0y zQR2Ca+xBRm6l7m2a|c=G{^#!sq_fJOv&cEW(3Wi!YgO~uuM-@Sj{ZNgZbgS`#+pvZ zs=NQGSo{US4+GkcZQC>Jr~H9E8)nkB^9D)5#2_I{jFmJZhP{8vU-z$G*|JyXwn4t7 zCm!D}$o@6e#=+3mcfMvrasJ19AZPvaADU(?1}?8K;)+A6`2YA%_CU@r7G{0;W&dt( z$(-Nq&B~g`B{Vz0BjjU~>EVV)Xi>vF zX%+52%29FTUtHsNS1V;F!%|22MdkGzFh~A{tL(F))5O^P2RO5W{*NGdplq?_*>23X zE0i9y^Qg*SBD>!LU0QTFy=R-cUvuIF!K$-b4LHg)vYR=MbImXC*d&fTyu)1gXTQFh z-SC~vqnpFeKHg&gwZHnw!a329^_l-)|4r|#Gv!dFb}f46{Cary>67D*ck|VLBd6&< zwK{wv?OOcdm+NAuSrBwTaoaIRzJUGXcf0-lJDI0skn2cc{m0+&Za6l!g#LnQaJL@% zcVPEj$8XMd^^rG2{;VgjTtV(u-S!g)HF_@Y8UEG5{8z*r@Q+^|Ecw;vU$*VpvrX`F z)+HtTzg+L-3M%DTopRRJtY@X{9*+{86=Q*s^G5(Wx9OUdWP@ON!IUNmbxr9h{A!rJXGiYy|J5} z?)D> zQ!Wm2{^$_zkDrb_=eeNw?;3q&^HVPdv$Gqe+fNsK`$pDPGwZ*sD%pnD?t1ITK_^V? zl&y;Y_pkB5kuzlY6ZMyAv1p8N;>?Q@ouS`^-Z?*}A9a0<|JOcI>vcQ+tUo!hyRdUT z_y6&U+8M|FQ=h2$XU4ppv){7A;`g7Z9eO{%u47TNlTglo5;1!V{+<7_a^0bt zu{sG^+joD4>8{rgdy9vE#XSFvSe1XACVBgwvg@DwkX^Sr){`Hw^0cdqZis)#{+$*4 z&$Wqv$o}W9?cbSM&iBRt^$*!AIEIdV7tj6xEO~V-9UtjKHdnX1a{dHZwq4%`Vs;*A zzq@^BeaLR$Tnd7dUpRK;pPY+t&5AYiFaMAo&peLsAzST^EsJxa;Xm_3_AmdCa-nNt zK0ovUd;j0rKmXfo9$q;7w8xoy4I#iq{f9(eg1zpF4f~@GZy7mEUDW zu>YU>eUX3l?-^8P{8b>|XF*luYB2kIGW)-*5BZ$`vcA%C{yP=^PyK#~Z#8rqN8AH( z55zqX_dwhOf6D{^^rf%HxEkC6vYR;a<@xY8>VMrs_B*%4Zfj*uk6!cpS^m9;?0G)N zdB>47F+Saf1f$#juw#|Mq$tr8UAnmedegY*W88i!k{ZM47wr1ASotCU=(J+pgZL-3Nv8P zgK`*!88GNcIgG*#81$kXMqvgFdQ%RgFari>Qx2mr0|tF4hf$aTgT9o*D9nICKgwYg zX2767XZe97bUV3ca?3hEbRXGhikRhEg9!U^0xtG?)Q1VQ_9F$o?+@Mqo0G!ZerxGhr}{ z`Y-~MVHBpp444Un;nar_m<*#Z4Q9Yh7>uAkjKE|Vg=sJYX2M`3^?B(_seO0W;w~7+ggEFaajQ2uy;>Fa<_oDolgv zFaz#@nQ$KrCeS}jfQc{ylVCDTfl-(W(_lKxfIDC&+y{e;=^rM*L>PfdFd3%6C`^TE zFdb&V9WWE_gTW>A4-;S_jKCzA3{zkfrouFs4m02mmPfd zFd3%6C`^TEFdb&V9WWE_gF!Ube?eFrmWBziI!uHOU<9^@Nw6aNn)8TrU0k^>&@C}#=_rQJd01U2R{;)VK4HIB>m!4x9```f>%!mZp{}qJAVQH8EtHVUt07hVYm<0R6 zWH<_@z=<#lXTems0H(oJFdeRk8E_li0pEa`a1Y!E55V9`<`0X*(l7y5hl#KOjKKCV z3HF7_a1=~|6R(WqJfqk7-5-Sd+y72R+22(<>Ytv!azwe*> z{{24x|MPsF=l6T=qfgiOI?n4j&*MCf<9xYxo#%NR|IJ=9T3$J&vi1J@n$VxW%%8Zn zs<7oR4_NZoKZF14P6=96KJD_)9zr}TziQ!sy$+Q>q8CXqu)21ms^3H+^Lr#M`WM$0 zDmERDA@=RkVUi!?muw%j{GSw~GP~Q>RjtrTa```c2ys=ts-;ve_{4{+7JNbV>K{=3 zCerHadQbd6yc_-N%VGcJ-RZyb5Mp(qtF854ehBfvtyNW&*iY50{gUu*T=m7%7w1^ZeafByVKF@tLpf#cBk>1ia+=lCHTAD z=>_}A+_cD{{~N{l>lOU_?eH%ykX3I}l{?fFB}uE^HtKkD*w%Yn{P)cXX}& zEB|Qst&zX3&H0r@{-RY?vWu0pYLlq^WbU-8PcnS+_ci$!&!9^eso%EhEc{=748C&4 zTTi&JsCofscylH@@hqOrbC}2^2A<2#?82_>#$=wy?mVA8*pt0jecVkEzmUDzhkaRn z4C*g_5mQ;+1_Q*acc?+)mvAtLFpWbwjKevCBRPtrna)dj8OLxe$8kI-uzCx*T>J`N z$%(v*lQ@}~yqZ%umD6|)ujO^j;&jg7^_hxc+hS8yfo<0{_I)qH?!_#oHvA?EX8uHz$I&qw(f zA7=rd;08X)jeLqv^BETMSw6?-xrr}uGhgHuzQnD3ncMgZU*&5o;_G~aZ*n`|;@f{6|@;iRdz5Ibc@+X$_ zXa2%pxsSi`cmBbOZ$bM*4OWdbSaA{(ugyBF9_O`sT-GSl4`lT?uLp_O=fP~i{SW+C zIZwO$ALZG^f;ct)~p^UwT*c7xTDqMmsXE^T0K5$^?0W3rLP|Uw1ar{IH=X*mR65* zT0OpL^?0XeNdJ%HnO2WqT0IVE_4uEO(pQfI8pO|KXLe!rxT60!j^{s)*LlA5J=l}I zcmY#*A$zkA`*MF@4i(!=fANc$%8NOG138G7a4?53jYBz%!#RQ@If|p1&P#b2$8api zaXcq5gO~FPUdf5Pijz2*nY@})IF-|Q4X@>O%;I#;;PsrzS)9!|%;sF)z2OLzyD@=h+}UCiU%yodL4IahEc@8c@o&((Z@Yxp47@*(E) zVXosNT+c`O7$0W=pWp^Q$&Gx9PxBcT@>xE|=edb5a5G=z7QV!-e3{$$3SZ@GEaK~Y zgKu&>-{RYRhsAuC@9}-^;0OGWAF+fV^Amo`o&1cS^9z>pOYY)V+|94Khu^S_-|{IYS8)U5g*P?NP-n{`;12QZ2Uvf^*x{ox?i=fP~i zLm16N*^q~^5f5i$9>EwM$tFCCP1%gic{F2r46AySibReTZ^`4>ipMjKC$Ke7WE-|+ zJD$XNp3L?ZuF6Roal zKFoD|gzNbzALHXJ;1k@yC%KVN@o7H8LO#pq_&hi91#aex+`^Ywb@Z=({rB?^RW*^6 zxZi(2|4>yA|9<|VsvZ(Awq5Yw&p+5chE^HNM5Zx|c`RfJBg4$kM5Zx|c`RfJBf}FT zl_8diOk)=FSjZAaMwp+8Ok)=FSjZAaMw*|AOk)=FSjZAaMwy?9Ok)=FSjZAaMw_3B zOk)=FSjZAa(#_9ArZJ0oEMy5Imztl6Ok)=FSjZAaE;Bz9nZ_*Uv5+N;Ok8OwMkGKFc( zU>0+j$9xvDh$SpzC9jzvzW~s<}#0~n9l+hatn)C%o3KejOC2XP<}=; zhOvxeJQJA6WTr5cX-sDZGnvI~<}jCeT*Z7Au#j6=#A24Plw~YuMJ#3sOIgNp{=fMA!~S~DnwhxYZ00bR zd0fSO7O;?8Sj1wMu#{yiXJl4Y{!xr(3}YF`cqTBB$xLA?)0oZ-W-^P}%waC`xQh8K zU?I1#h{Y^nDa%;S$ZX|jG-DXcIL0%9iA-h+Q<=teW-yak%w`UAna5SkX8{Yjg+(l8 z2}@bVaz^GTKcgALSjI7)2~1=%Q<%y$rZafHjNGLBjAjgD8OL}gFp-2PUu+6WN)`?7X8|{|kej%L+gQZyEancDa3@Q-n`PX~a_(c~ zR_)Iy)@L*uF@{YU%a)8|8^*H(6WED~?962LU<&&(m4leZ5lrV;W^f`iIgMGI$!yMN z4i_<(OPR;zT*Woa=Xw@!BMZ5STeyuy+|FX|U)X&k|Hj%5ZXGLzGo#hJ|JeCBWwbGejxT+UTo z!+fr10XMRco4AGBSj6ot<_?x{Cri1TW!%eh?qg)J_Gc99Gn$PU!={X7OUAJc>kiQ|Z9Lo$& zWG1IEi!+(c`OM)W=5i_XxSXrFhWT920&Zj>H*pKMv54DQ%pEM@PL^^v%ea^2+{efg z?awIIXEYlzhD{mEmW*Q?#Vtq!l5o6et zv24jWwqZOwFoB(z$j(e=52mm$Q#puf9Km#sWd973%HSm+{7*1 z#v*QKF?XK0MwqzXJFrFQlz)nnLXC|`;Q`ncO z9KS#gA%|r%vW>+S&JA1GfQ`nn* z*`KK#z(E|$G!Ekkj$%45<5-So2Cv{mPGTmfa2l^=7H4oKXEU2Oa6T6>hYPugw=tJX zxRlG7$9uS(E4hlRxrS?*&vjhS$5_A(+{mX{$mh6;o4JKsxs9)~h;MK^-)1r2;|_kv z5`My+{G6rS#ogS)GJeOs{E_ASh5PtBBX`^XS(|kk#d@sI28?DyHezGOunC*8Ib+#^ zE!m23Y|S=o$9T492cE_Rp21E$n~4nU%&tskclKZ}rm#2rvOiNffP*-gX&lB89L02A z#<3jF3|_&BoWx8{;WS>$EY9Fe&So}m;CwD%4i|C}Z(}Z(a4DBDkN0pnS8^3sa}C!r zpX<1ukFkIoxRFn@kk4@wH**WOavNV|5#Qi;zRhC3#~u8TCH#at`8i9ui@UjpW&DnN z`6J8u3-|GNM((lyvo`B8iuG8Z4H(UaY{bTlVG}lGbH=g-Te217*qUwFj`3{I4m^zs zJcFHhHWL}xnO&L8?(D%{Okr>KWq+n}00(g}(>RPHIEv}KjAJ>T8N7lMIf$skev49)6kx#Rb&v6qsa|^d}8((D+-{5w> z&0@aC9sH0b{DeFCIZL^VySayD{EmD1Bg^><_wjc|mfQbXn{^q*daTa|jAlbNVq?az z37fJxW7&c&*@|&&%{FYuc(!K;p2h^8!A?Azi45$_u1sck_Fyljus8d%KT|n?gE*LJ z9L5nG#dKcAu^i6~Ucrf+#7s`%G+xUr&frYWW;So&d@f)P7jhAAV=k9)DVH&i_i#B^ zauru|4c9WC>$skev49)6kx#Rb&v6qsa|^d}8((D+-{5w>&0@aC9sH0b{DeFCIZL^V zySayD{EmD1Bg^><_wjc|R@nbpn{^q*daTa|jAlbNVq?az37fJxW7&c&*@|&&%{FYu zc(!K;p2h^8!A?Azi45$_u1sck_F%6SiTj6}`WK@kRu8#VZLR-wbj0(HuT}Y7Eb`|t zZtM0(|C_z++?RRmU)RlPHEOn~C`_#yO7!?KRpmXeMU@j+uWqD9#lMPBHQL$7Syi83 zIlaorZVUMT3C}LR>aec8lT#uGR1~;oB>Hc~t{&F2dTfGQ)nG-cs!*+Hb^o zHB#rU#)ox_9A5G9nUP_gSH30PzxkhE1N+;*?w{qX+6Jy^Hfs8xlm7kYe{u~}j$;{J zaiqM+xg%X+|9*VO3wlSQqbhoT+W%qV-;Q||@wyEv4>PrTUC`y{Y1N0lL0{bb@Sl~o z)e-V#ZsRL_m9Mdguk#JQ$?bfLZ}S}%^Ig8j_ql@~@I!vY5`N52_$hbtGk(r5SjsQC zi(hd!zvdo(!!mx$@Ay6U@(2FNpIFYH`3ryLKK{nv`3ECfu?B0h7HhK(>+%3b@j%w& zL9EY%*?@;InuoF>4`U-9&c-}~F+7q@codtm8JqKH#?qIrNcC5RV@-ErjvOa$$kd20 zrI9$(Phe}F$Tn=tc07skJeloz3On#rp2pLez>YkFXR;H|;@LchiA-YPx$Mj??8-$ju|F?jDlg^$4&)$S!oeKEG!Er34(AAta6Jb0%kTHs>&#b9n>j zaXxS40^Y8~7wQ@+m&eXIRK*`5d3;CcePUe34uD61VbYZsRL_ zm9Mdguk#JQ$?bfLZ}S}%^Ig8j_ql@~@I!vY5`N52_$hbtGk(r5SjsQCi(hd!zvdo( z!!mx$@Ay6U@(2FNpIFYH`3ryLKK{nv`3EcheB2*uuqJD!!HHsaxI%p(}XBiV#Uu_>FeIge&6k6{ZQ%a%Njt#~}+cmiAVM7CjDw&O{R z=gDl(Q`mv0@-&{#1a{;ZJd>Sx7SHB6Ok@%R&t+$JVOMrzGS6dop3ffa$zHsGDZG%q z*@u1EkNtTOQ+Y85a3BZq5)S4Nrg12TaX3eCBu8;H(|IW`;~0+RIF9E8X7F-e!7DkD zS8)<2Gm}?y3a4@!ui>@4j#-?}8N8k|Ig7J7huNIV8#s^ic_SC_Cg$*FF61p-#9MhA z7c-Z)a|!R@Qr^jByo-6foA>ZuF6RoalKFoD|gzNbzALHXJ z;1k@yC%KVN@o7H8LO#pq_&hi91#aex+`^Z*l`nG}U*W5KjYWK&Z}3fS=UaT6@35Hf z@;$!K9sGbF@*|e;V}8Oj*qSG@4coFEPhvbzW_zB(4m_2o@pLAzBhTQO z?8LKpHqT)qlNfj|JF^SBvKy0m9=r2=_Fzx;;ss3Mh3w5f?8|=a&x@GKi#dP;If$2V zFo!UWLphAYIf5fOildp%OL-Z`a4g4hJSQ-Nm-7l<$%(v*lQ@}~yqZ%umD6|)ujO^j z;&jg7^_ zhxc+hS8yfo<0{_I)qH?!_#oHvA?EX8uHz$I&qw(fA7=rd;08X)jeLqv^BETMSw6?- zxrr}uGhgHuzQnD3ncMgZU*&5o;_G~aZ*n`|;@f{6|@;iRdz5Ibc@+X$_Xa2%pxsSi`cmBbMtARCGleJiz zby$}NFp3AV;x2{#;UL!M!EC@o7|lc3kcY7m4`*W@!5ALNCOnEw*^JG3G-G)TTku%6 zj*qSG@4coFEPhvbzW_zB(4m_2o@pLAzBhTQO?8LKpHqT)qlNfj|JF^SB zvKy0m9=r2=_Fzx;;ss3Mh3w5f?8|=a&x@GKi#dP;If$2VFo!UWLphAYIf5fOildp% zOL-Z`a4g4hJSQ-Nm-7l<$%(v*lQ@}~yqZ%umD6|)ujO^j;&jg7^_hxc+hS8yfo<0{_I)qH?! z_#oHvA?EX8uHz$I&qw(fA7=rd;08X)jeLqv^BETMSw6?-xrr}uGhgHuzQnD3ncMgZ zU*&5o;_G~aZ*n`|;@f{6|@;iRdz5Ibc@+X$_Xa2%pxsSi`cmBcsch6Ovv1?S`MOP7OvKDKz4(sv&M)5$_ z<3X&?gV}(GFq((5ArE6C9?r%*f-yXjO?VWWvKgE6XvXpww&1aB$>Z3H$1{#6ur*I) z8@6RTp2T>b%=SEm9e65F;aHC2cursj zFXt7!k`s9qCvh?}c{QhSDyQ)pUd!v4#p#^E>p7FNIGb~r&AGgR^EjV3ash8*4sYf{ z-oiz^mA7#*b9pTRe2H86GPm&+zRK5F#Mk)--{f|_ z#kctmi}^0!j*qSG@4coFEPhvbzW_zB( z4m_2o@pLAzBhTQO?8LKpHqT)qlNfj|JF^SBvKy0m9=r2=_Fzx;;ss3Mh3w5f?8|=a z&x@GKi#dP;If$2VFo!UWLphAYIf5fOildp%OL-Z`a4g4hJSQ-Nm-7l<$%(v*lQ@}~ zyqZ%umD6|)ujO^j;&jg7^_hxc+hS8yfo<0{_I)qH?!_#oHvA?EX8uHz$I&qw(fA7=rd;08X) zjeLqv^BETMSw6?-xrr}uGhgHuzQnD3ncMgZU*&5o;_G~aZ*n`|;@f{6|@;iRdz5Ibc@+X$_Xa2%pxsSi` zcmBc1fmP?<8m!4$tj#*C%L5q216hv;u|5xG10KR?9?FJ1jE#6W8}kUp@JKe{QEbX) zY|f(@%VXGr$Fe1lV=ErdIG(`PJdthKmhE^F<9RaM^AvXAsXUFRGl3m>2G3+Cp2f3y z4ilNgz;oG|UD%b~n9TFoo#(R$d$JcVUALF#?Oeh;xRiHt8Si2q@8&(cm&>_= zD|sJR@qVu616;!gxt0$xpAT~#AK`jF%E$OP3-|;#@JVjuQ+%4wu#nI4IX=%#e1V(! zBDe4*Zsp6|##i_%Ut8y7Q|w{r>a;8NbnWxR`dyqov%UM}YfuH=1O#rwIM4{!}1GOxRoz+8(-n8e2qnXop10> zZs%KkoA0og@A5sq&mH`LAMzuX@MC_$Pq~wy@pFE`Qhv!@{EEBzHTUovmhoGD$M3n9 zKk!HX#B%=3U-&Ec@i+d?Ke)e}nu@OgH7dKSsR%V$i?vyYb$I}zcp&TXAlB!>Y`{Yp z%|qFchp`b4XJa107#_(cJc>=(jLms8V|ff)@L0Cwacsro8OIaYnkTXi+p--`Vmwb~ zd!E7$Je8;MbSAJP&)}Kt#Itxd&tW2y7h?j6MhcJypIgGwJT6ay#GR+kA(`e3$R> zeeU1~{E#29gdg)0e#)KvjGyxhmhwyP;#b_wuepccu#DgGJATi-{DD96CzkVP{=#3m zkH7JE{=rE7s`Gvg)?`J$jQc}v)?r;9z$hNbdOV2rc`zIB5JvM*HsoP!#KYN`M=*v* zvI&o3Q#NCB9?e)D!xlW2EqNSU@p#7Z1h(dhY{Rx}$CDV(li8l9umex!X*`_??8q~C zCOh#gp3QTZ$Rq}y%g*e=uI$ESp2zMypFP-lcPUSRS!)tjR zvpAhIcs*xw7H4w~vpJVHa31ILMlRq@%;C*k$XmFGxAHbFW-f2%65he3ypzj#7xQ>G z@8P{%&J|qA`?!ktb2T5}8a~Lie2DpcnCtim*Yi<6#>ZK}C%A!6awDJO(|m@7e3sAg zd2Zqh+{_obg)ea{U*SVKLw3dwice_yIrUM=asT{Dhx! zCqLuo{DP(YlDqg7ck^rR;WsSfxBQOZb1#43kNk<{{F%S-SMK9){GER=a07mgZ*5g5}&x6^3hcKFlvLO#+BOcDiJc2Pil1+FNo3a_3^JvEM7`EWCY{}!; zipMjKC$Ke7WE-|+JD$XNp3L?|)Q;4z_#f%rx$l4IqxG*7{zYf5)d|0B zc=-eS`y`J&XY7$_|LgzEnhh%t3)Km$tyiB&GKSUC-;$ zWypEG`gZBvE2+o)YpQw{`|Cnfc0PObwN)twRvme&JDS}e+ZNSq>_1th%2_|Vu4>kk z%v!ZVf1TCe)mN|ZAN#b;(gkYef~Q!g3#!+t`u6BZWao}%k5slw{gbQeKdQ3+Q@Zwu z99EGwrs99)V*W{GMCw=czFpa9`)BHw)NlVxmHl+@&-;TqCl&8s^uJ8?_XX*e^dB0& zs^9NO`&vUGQ%>S}C_vq3qQdzrIee%Ta-#9Ao&-?pC-Tq^u%9f9QaoqEj`P8jg zLXF6QUB-@_G<4#n6UNWgHD=G-+TRd~?C&YRa+!bGQ~qqb!tK@FfL8YoRBgqKm7)5g zK~?OZzgEol=bTkrXI#a){ZQR`Wu*J*d%Ewh-l)p59$K-W5piG1yWXF<+_w3qP}K*1 z_4-wB>D5-RK~*34aTU?3Pgdww^C$_bJ^k$|_wMflJu0%N@}pxak8zR6$0aRmM$#%L zw62eWLGR3b?J=!AjYGsPpstKpJ9d&+WedUCTeYY}2;zt=*MLJZ@ zVxa?`IR3#%QN`E z_q?X2H)C@i%~)3KJo`fn9?O=rFGX63AJ58tzcQRqMdgmXKb*)mY|D16{w5JGUU8D& zAKLR2cHpTzji)n#9eD=#@68qOJBgpgvw02^nZ&?z*_mC~mED-k^Vpr|v+`_I8G2R` z>BZ_VJp0dD71J&>y*K-?FZ;1SFJdY$<^T@lAYQ`39KtjXKi8;KP3wa9{@mAi(#mwdHT*5oJly`C&?_wVB<~_WZ%ejIpc^_Btey-*N zT*C*smJczX4|5$K;d(yG$M`r4_yjlbNp9p*e45X&kk9ftKF>{jft&dvx9}xy<;&d0 zSNJMlV-a8H8+?=7`4->iJ1pkAe2?#Q2S4D4{D>v|n4j=d?&N3uoL{h%Uvd|};%pv)jlc5``r=yghg#KynyelcthRU^*5v_=;(@Hk zgIJ#jvjO*i$*ssTTKrHpY!`YZeFos9636Ek^He+)h%~&487Ce?Mc^q5uc*gMr zw&sa!!?tY4lNisF*`B9x|2O-JdOB77G@i}`cH|j6lbv`L&*nKyWD*0@4j#-?}8N8k|Ig7J7huNIV z8#s^ic_SC_Cg$*FF61p-#9MhA7c-Z)a|!R@Qr^jByo-6foA>ZuF6RoalKFoD|gzNbzALHXJ;1k@yC%KVN@o7H8LO#pq_&hi91#aex+`^Z*l`nG} zU*W5KjYWK&Z}3fS=UaT6@35Hf@;$!K9sGbF@*|e;V}8Oje< zcs%2H0$cM$wqaYg<4KI?$!yP4*ny|=G@i}`cH|j6lbv`L&*nKyWD*0?yQj^_ks&=2{ME5xtlL|(;7oXkvK%_*G9X}pHl@;YYmudmixqQ!P5;pby)SVQ`LV4Rqagw<6n2L9&!DDZH(Ys)L=wA{HZ#sK1}~-RaX0N zKix*E=83KFhw5RxBI6d0I`AJy|NYD$Wq-S{G$~=wv;TXe{}#IP(Zq^YJ9%^Agny6z z`=7Pm|Lo8IJ^Jte?DqZ7O1J-3gSJ)Iog3}Hi=pDO)uFNHxOkKp>2Oe_L*>A5)yKff z1^)fr2Y+!lNp-G&m+=3V`%`M=HCy-BSL^-{?oVlxS9Qw#>zhU@FV;OH#lY&4MOD9v zL{54lKJA~ZQsu0(3?F%tIV!$|SDXa?I;+2{um9}+lqPpqt@Q=ft8zf~o5-bW;}iF{ z?8#Lv`#JzHBl7({&;Bk5-}cYmbK`UfvJ}FMBeK@3^XPu469aSP{#%-3dxlirvfj@))#$T=x1bi02>IH~2F zaOU|phTHF76ox;tH2m_~@-T4Zn$Y{AgwXS$^Fp@+28N^|W5bz`UlW$hnG^o(4`1zv+;g4yH!^B(Ggd^X*Jj`pK5ytGhBD`2*N?1L3Mp%CG+z`rh z!Y9pd4KPh+wmNJawkGs^c6B)O$FX7Q)XebagSUncFTXLI z({EOI_Uox(^<5J}@%^L1*vE#35yuV<_y0N~+*SLYFml*^;rch{hvC0mA6{NMDZJi! zWO!$HpRlw+2shT-leFQCI^pVuhlhe8$AuqucL-lD459Fx*I)QuD*JDs26u}nDWQ4 zaLA;)!@8*D;g7sKy71n~k?_X)-AQv^C`r03^Mj-l z>wlWGv+=h{zjdt@rgv!=(qD=VkFFmYUixZec<+;W;p0JfhHYOi3N7}I3$Ztz6sEM9 z9QM4jBz$;bPPpOzCgH$0>W73KwZd($|CTi8fqh9)?P`W4arMH0sPu4T$>gx6@yu}k z2lK-6m~r8YH!cpdd-e()pSvXd@MB77StB_-e(V$bl(0cV8= zK5ZLXy>N2)ZeW*CdUC(evfquN$&B{l!X5G9$d#vrH`ksK?&#Jvd^R~D%qtC{sNOB% zlID}c`se3_ej~F&%;Onh*EMOO>k$`*PTga}@J@$^%!3XIyG9%wwzi87$9Fg)EE{ud z7})uSaPi`{q2tt+;kda+hZ;XN4@+Nf5l)RgF?=z+TR82Ui^9$GM~6t`$>D_$6T;^$ zXN1m6Z7 z*Oj4NA-_R`F+_+V!8Q(O_*l=Lj^l3@byk!MRb@$wt z^mCj0lOFi;#iUu;-z5F~!olH;mwrzwIHWjf#)5Z~dJT<)yRSSbe7L8gU2}Sd#@7rF zC#Me%JMTygvHerR*4_QXod@>}?Hi_t!LzOm(fy`}#vSK{(_2pqV>iqUO*%~vZ*-Ux zW*jvo?5j63luW-dtT<$Lc&^jTa8T=oA#3ow(Cx(8;iZYQLe4W4WqEc&_-)Y{p>|yV z(0b{RaP9GlA-m<#Vf>*T!{yD|hK&Qx2`^P_%k6i!3&p#R40lg$7oI)y*l=A;$ME&< zr-z1jri709i6QFYbHkOhT7x~L~ZoDMyeWH69)o5fm?Vd}+%fp9<25-HYv|{CFNpnA_8D_p!Ba}^R5DwXOYWV1y zsId0Y8sYhtQK4b%Z%HR-S8T^O)DN%DZXP;Mx++}#=;-iR7#Di1yE5e5Fe9ATCo8P% z+#s~seocsryFTRAJ0>i?ph*~db)7J!UC;3RYZrwR*0v4(erOWXe?LBawIDtW?00>5 zzvnF>K4E0obE*leGYCa_NoZTtRd98nF{?4c{{;-K*#MtZ*dudkKS~M-(v}{u7*D@yb+nf}7 z+}}5}J+Vt@aC@WB;@%!1@2==Db=}giqj$D`k>?UNsDjI z34V5TpoVDDkD6-Y;bsZ^q4T{kO^VejCLXSj`KqP73YMV?==m--+6M_IQr;Nu)SwU z%cwmdEz`ADCTaoCtJXUX6&q4cWoJ9rHyt`AWDfW^Y0v84 zlA3)yJzTbJZkW7zQTV^MebF?hy3F}b{wy<`BK;OQ@tMtaid;L{>5KC;r}}sNPGJfi zPA(JTo%lI>oVZqYIK}cdI=kz0eveU)WhEA2OLQZ?;&UaeX zH{B`8o6BjT{vxOE!K<9QtCu;QdQj-ZslM7tI(MOyK&zKi^Gq+Ni5mAEnWm;X@urtK zZ8x9bw8605$#k!#laZad6WbL{Cl5tKr#CgToY>B&J2`Arb8<5@bGlmB=XBh(+bI*6 z-it0fI2ngnJBfNsb(+c<;PgCD%jx~~$~qY?O>)YU)N^{gRl})jkG)e)V4Kr6&Ne3&r3$AyMF%I}m{=$KBRo#F3KN`o zCQfvEa<0VbY+9aE$@T`PJ5L*&7%i-wBv1J}anxBm`2`s|u{>3C;`<-$^m0R?lZH!{ z6GP8NCk~fRC&P4S;L=#&%Hu5!kj@%><#CX)D>GQ8ZxU3djftTO+)h5cK-CYm4UD_R z$)gDAO@MbBP`o}F?4YC2u~0_1gIWTA!q)8&w?5etHjW7#W&;Bl4drq{X+jiG8(b$i zXc)ljlc8g03=DO*Y$DLtCwD{bMyyZ%cfUS{y!FYqaI8=6Z42ukU7t)S_J+4SIIm1q zg7o*{**dvp^>nZdY>7T17ja7`Z3Iif#<1a<;%razfMsC$2BGP}TK+9=9xhG{uqgs? zp#HS$_kr&*@^kjbxzz-&C?qlfLlG=%!8gA6`TK$w5(@$?0ToILXaKm%8M;L#)X$S> zl_98`Y2aq~Izr3<4UvFs^Gz+zh&Ke=fwwe+`^m=<_Z}OBA{^T>5DNTon*wyzC>RZa z0S*Ch{)bH^g51Kq?BroaSng%eFd!1VZiWq!g&aQr`PK#Dw;j+dL@1sK`o zKWxqsWD|!#vIy*^%dcYTs(a-#{V%CVVfj?xes1RxVQ%67|;*( z!!pzl9?B06!aN2I*6cXej zn-m5P5e=xDl9P;#O$`l<6hcZ<72Hyj6cmgU49%8ewEiH@?T@b$r b%;15Y8C!6>q;sM=Ml)|zvEGEeAd8F3Uu0z?P|g7Q&9L>>ZxDuF*&Emy8CltzT00!UwD3V7WRQ;{ zf{HFb_ZOU16-=Jsj=7;k{H13IF`(dANfZk?mLAQ6-M{Eim8jQDs6?hR55p%NmKJqxpY}sEtuFS5d>s>uj#N0^BOprQ=Yx;!l)8oSz zzK8QMlDfLOm|jEhV@{V85>mk6D*ypM>7Nm_w6ykTDz>JV+x$(S5yqgFe|tYYqVT$3 z?#HI2pd?De)oGR-CWVINC4KAL0O$W17zm7yk56uBXiyLkXniXfj7t1S`07<99Tk;$ z+95?~NJyAMrWlIrSk9*wbRLiEW8bQ(Dw>+#At4gqUcy3mc6IThH+tMKOTBwF`Po?z zJVSQxz`y|J?)LU}egirMMaJ*pv9Ut(?|mCQ)uJLIvqEHw&M&~98NH3~Yg?wEpeSzt zciVzZdaXJ?Ct}Z$3TGXOKAXhSK9$l8EpZ)-g-82rTK@N(_^TlZh7xa%SY(ZjDdD28 z8I(((s^xdxR758f6c^NHW=y9>a5H;k-Y^;g$Sst z6Id-ZD{S;V*?U98qAr9JRPSZZ8og2i13E=IJG%=q`t4{6eueQ&ef^2b=^qdvl5N)V zVC|gl^|7}XkIjz7Yq1WgT=rLMm6g`Gqpg^bKBm+DY+zn6T3@5IrAN!~ow&-vi^yk>l8j6URIIcTJGCP6OnWX*o>*HM| zI9fW|W3!=XCKmy3!>#o+g&LCU`!U($Yg=Rrir0D;77i+_XhyI#PtsR-yp|i7_Xg#>SLT>E0-c6iMM5uL5qCi4JKPG(e zCI_zt8XAi4Q5G!%|7JL9YeUmEt_5#3gH&31F% z)noF^053!&j1Mdx2t>WgRNDgKM_f*`j)Z-&P7~s#Q?<+WJA!XHG96j@W6vXIQB+($ z=xr3(vw@?+8b=)qye5xc;hSV#BwE8h1ZLIA&O^X}S8kt;!o*LtWHdoUV z_BI>}Qmj$cIi6S%*R9TBU9#HTltN4?eS_$HxF}rsgANLEc(G8XH((AC=s`VT`fCj> z1NW=_im;{YpyA49ZIjNy^a)Cx&02dm0qda~n^RWVsapQi3I;~4-2s7mjYa6j60M&A znLxPl0HfYtmFb(gBUP5CFAxD3Su_jv8XSnOxxU{gev7t;GDa4Q<$M2?(qv1AY>$sIL{mFE-#~m4^Yis* z&pGXF!Gh{q>y9K??HNcu=Agv!Cg#ejjCgu%V9nh*!X1_VfrB%Bf8Zwl^AwweFANT% zs-dR0R?k{iUR`ori(F#93&Pi*zk_1t<^(tl19KA@xw*k--Z~;6T$@i61YQTgLInD7 z1|*4Sj>paJ9k&@XNcf%)LdYH_3MuX;?HvQ7qEIoveWSMQ&)|s|ypvrWD=F5O>SzeX zHJ>aB4UQ(k=8UeWz=AAq^u-6xT3A|qUK&7Qw_5O%rtFB+s2Ryok}@=I?v6}$9ea*q z%5>_j0&l2aWo_tLo206UySarvfKYXNwc~I7qqMagi)y5*f}x0(F77rVc?v3~rjIdI zB~vUfJr}-CGpb^X;av_D<=fREZ)c{>y`@~V2xJu2#|NP#DOnY?+uK`flD!?lmLRW} z_TQr#5DW7a+Q=b3;v*v*uDh>fesKl<{7Ka4^+4eLbT{SlDChwdw$$Zta*9o>UXNTi zswthw0;NFt!$aLUl7Ka>v=ohZVYT!?bCD_h{HXN2vB_N;BA}v@`$z5c4(AGspS1c3 zVk?`vx_hzba#f7qb5;_WQ(JsAKE0@36mRJ!dP#>)6pEH zdNZyp71L3Pi*s;tt%9$h{FD+@>HV1hkJr526^>i$_P{k;ZB=|u?szT$2@oRplSzex zaByyTZpS$kZQMo@LVVn&<9zFr%+vXdmN z$a7uXRG)eQvAOxHB#Isw6dHST%eq@XPFLQ&>Tt_=G(AyG%nh~fIb375Aj$OU-79LR zWbABO$N2bPzev1pSGe!3w@_W&Twa;ilvj)G{h&K}$3?KmW+kMo{3GMjrFBf4*w_+7 zR$b0Ol79~qlZ~B2=ce_P-dWAw^7?j2!t}IILrkAPczx;1A51_EcA|HO_B|&#DJd;f z#Xz&(4tr;(bU05ChQ(?c9Ry-w@amnMs>6;>)+-p<;UN}tmQD;1H4Z+1$r7h;GTG*sQFI?$6YaqVVwOT0U(0|DM`PO&6~zaXEiS@N{Q@wr_brMs1@^ z2pKQ2^hp54Qu7_!I2&Uth_cvJ#12QZFSNMtR&UO>IBd4jGe~#@N{9I9Z2L1dUEOPv zK>9ni#>u=gNnQ0a#q)YHKqK1UKkmpu$=gydr=ur3GK7MJVKIWcQGarm7xdDw{VQKX zJv}qK>doyfxU|@$3kJX8>ge@uoA7fOJPkNG)=|DjBzj?Xdl%TUSW-v->t*+#r3QBT z3kX;qW%hHEh~B|S5ZF@frqx0j>ewf({2&ybld-F%{05>?8;_RHYPR9wAt9BB{{Lnh zZHs{stGt4Pi-BQ=4fkJcwY2F2!HJ<(ZH1y(;19VLwuVyU7QtmCgttj}-99g{qGMph zB`&K;LZjJ%3r;Sp1&WAdDdB1UPqz+zvnOqt;u5m5;_Bu})O-1py9rai<>?r^la6xE z??pri3Z+#BU5>Xg0)&WJzKqmUn-@%4X*NLrF|sjo!N9=Imu_?18zgo(Jy6EJK=+AR z7D$+43Kse5t5T}{JOJobU#7$?{b$Q6DwM$W%$0Jq0_S;Et48I=boDJF>PxK9pE1Y+ zc5Hp`h7XZlXID2FJw58><>fAYsD$NTkBD%U)nfHaR2g(gOmEgMeIQG~=XU{3nOG#e z5%T}I;^wlxgAyGSEHa%u#kXFvSGzV>OiJ!XX!M)PajS=d)QC&CBJ-;NG0iy=N8~9Yy@y^{P93BGAi_hzpg4brYO*)Mkxu$We`+R!3AYdt;5c5YFyDL^RYvi z$_um7L*{YH?Qt`Q?R6w~DqQd@JWV0DkJVeQ?N8a8QCjeYb&c~iS`AM6)5Ga_T!siv z2ebL(l;a~^w--z8Bfa=s^=>|zQAJawOkVdc<4iR^k;TOK4=P)hGp`c14vZQXnjLnS z6DF8~i&J<}iMax>X_VXN+c9MZ={cMae`b_QQ+JJK_kEt4z;^7XW3*eBFl=x zcm>2*Y!Y#ez@WgDzS121#d%KjrIv6|x2}SZ6w6N=T`sz{oCIB z0ENfwf*yp5AK`fi6B8GgJ-#(xXJ6}aVl83+8w%3*gF#$cn)Yy^E|PGngo1;kcE0bE zv~=s5I9mC7vNfa2pU-dJbgqr~zoSjyCk4<@<^0a6L+mH7J5H{@%!;5Pteu@*xy=Yg zb~!W*42In;i~Lv2kxX&4>zhb;$R9iVS5KQu@IHDS;<|_PoGw3pgjJBY)!Jp7*Dzn* z*Wo_gUWhI=dzNhtHAz}>a&ji{UVW)$Hw_T`l(gD##T>td;%2jSWY1q&dEOHCA+2ZiU;I%1%yfsHB`>d`<4@ z)~Sme9_x9d@VhmH>?#>0d zefbz#s6tQ9M=m&0eUWQRA%_SoDXlYJAzS^cu4px-Z_B} zFZh2E6BB>m42_oc2@n6aYP(QBXiZm>NAP`apkEs5PkO0N=I~l0U2|hI6H~eA{zf3d zEo-`pFsaies>|tm=&0)Cq;gmfg&dusvGEU8DS=i#*kIU9*YF?504IiG_4HK@Qj=)3 zo`CYSvk$47jjgPzTyRY+(q`2#EyHu^@jN9%asX`Nh8 zEqV2{LOno1$aDRd*Tzs;zf1!j_Q20piucx zz9n0vTK{TrP==9-t@~?N_$$knhe!S*&2r?ZsHo?C886Ok*SE`=Cp5ojWxYvAPNw6G%8$H~D)z)*zaw~h$~)gG%|MMccF zi~4^2_vi?SRqSV0VLqOBG2hXn9luQKuIDjr3>709Po=tFWq7wVhxI(%U38_oFYVJy zOGpHK`}S?MJUqN&)$3@n37yCe&dkhALP|>bPh!RP#GXB*^?=)Xq(R5K)}1XNu9$bX z&Yj{tr<&Q!j~_T;cU9&S?R!(D*wJfPnBRXW4Fd+oVS5`%1D=AnI)v9sTIfO&f+WioDQd>kZ>P^tfvl5 z_r^$a{iPPe-hg0H-lcRYyZCgl7}@3zCz$jt+kueTh0*Eh1U^hE2ny!bVD@|`BsyB$ z!-FU1Q)m>2zH_F%R z{c2fRSrCYYMG*!eVPV47$r@glr@`yj4mF;^GIRpkdn&2|@H zsbKuS=cI7phvY1NdLFb7l$3C6Y?EOi0 zp6Hv^8W9w7Wa!QsMZSx_r83!{y`Tv~BULxOEz=V&`!ZG9HF$L~&uLTU>=W;-z+ydv z$#*a-C@U*F^7wF-Y`fa|QB{2|!#=*`S~mI+yTo=i;N&{XMD~1V42{xw6OYS*0}ci6 z^X84oz)xSaS#JblUeB&d*(c(m%BUAOw3-1+P6q`xo*U)-%aGgi!)y+=Z{B-z4eZdU z_b(vZ7dKl8EjAdKm{_qf2_ddXIMk6$rn=tuk1Y$=58e$-rpw6}WU&&urmBP#u?V)d zvP_n@5q1-7Y2N((iR@?~zPJEJWs^ZO%aoAG120D=H8d~p-TL~v04-`yg6$giLH5Lb zb?-My{fk*g1VpYt019AJxFT8iCJj!rLM0y%qd2`+^v@3`q(+R5jf3*?R!d)8-(6Qy*wyuI8PYr z*ubNa_?7%3p}dalSbZynO-24^!>-a|3>9K?a4OmbzneeSrdn&tq_1zFYi1UB;~l=A1Zjk=5sy>h8mc$51TK$yC_DhiBF{iYCC6YR(PKAHQ|J{iE$wog>i zZ}umJ9xj}E3FTHMh1)SRqD#e>ia4CVuB{#Kx-Z>I)0kqXvQV9wHF#{S1C@dD`sVs_ z#SmW?2#KFF#TJ=H=m4);f3dU*h*D9$o}waJj|#*0s3d&Qkn75=9#uwflJkp;zDmAF zE*JE|siF=L0mhx}J5~dcKrAlFidP8*{01PCLpKMK;#^5Gu0C=46{0O}aElqSI^H7p z|KuZ9n^D7KHKuJOVDFxtc%;@T=|)FDFZ0%^^9%o5lBYXDiA+y{a<7I(MMYItR3=tKfY9+-&Bk-OnfGz}EO+&!e2r@P@GxgwobsFAOjul= z$`TgNWHlIRB2Y2CI%p#&Hyx>`Gbc=Ln;3wZ^L`XHdnB!~@-Iw=f8LiXEFKUP6qnDY z_1!-1euqOFv~&-e}@S2jgN{vPXmdlAJ8iz=?J**P&jBxGFt znD%Y@xQ-VWSX!x9yD$FqUA~s9zol3={&?(q)C{l*qxpEAFKP9CNM34i)c;uC(3r$TwawW@qvuPfGCx4u zi8@|hh)(X&LIkGhQ;@2-xj2@$WBqNM?5OP?b3QeddmoX2bx*`^iwSB*QB8|VYAH$z z3Y6T_Bin@rd#tO&`GB;LR3j2@CzkH0WQeT`2dJuTpS<3|q2TA3lJYokw0G)*$OjRK zH9*IZyT}-&D;bq0I)VpmM)Lz4#qEhfZQVr2bA5A=dVY`Rd50n*Z9&V!Gk>yI(!PZ9 znj&LY6y%3zNFJW^^C!@>6leY`B(7-3)%0VSszmO1?1V!pV@Dmuw ziHwX)?Pw7Pt0FJY91#&oR-l9=lpdo)L`hK~wrpyC{?Y z-z=>-&B9}?kdBVnpFjP)e`P~Kb`vIj4uFLp=jG#MrSdd zM*oFEkRd~C4-qg|r`B%r@O>>FonB#0HC~`3H4yh>e|Y6}0<$C6FFwyO+K=_}$<2St zhAaP`HW%?zWQ>}2mI#H4_<>-X_T`G?*kTyr5;ZFCEoS-;30Qb|aThj=h(WD}mDTJ% zmy|@cU6)%5VT+{`sq`Hx7?^YhX2o5V@q+^=nAZv%4U;{~=^eIPhYOhTy!Mww_m6ur zq5{}NvPz2OkEhm-w8bM2nb8;|B?K78;LR@A!nkZoNS5 zRQFuWkJZPG-WMp3-@0qKPU$?>hj^g}K1&M>Vo@bUcA+7Qp|k!pJUm1wglvkp!^C_Z z93CDX%WG@?49(X=yR`>%-afqEhe|wrpqQFpn5S0E1dOJp)}H=m zgjoWgCH0R|RV71y&scIWSdzHB>DhCB5J!Y@eNkGU&b`&xCH#P#C|Z zk#U{W;d}jBSo$X;iJpGBep2%vbV7DZF)enqaTZ2s2+$YxW+T*W9P;7eO;n_lnUK`f z)F3`^k;!Dt%!m+lQqt%oI57zciR+q21eWttILPzL-m4~Uo$iOWB0)JhW8lW_qqX$J zR>Hz)N*yQB{Mh?G&+>ZH-}w4?rPg*0Zhn4#d2=)9%T&qx!1(lXjIZCmN)b<4@8cDz zHIM-Q5>jSyg9vW#F=g*yVb5N(-l6VK^?h++M)mw+wb_|7hx;QBbTp|y$3Dq3kKocf zYBzOuc}w$2ZAz#4{9NT3tphzLfArjbi(&c5p4=tn1QSv=>dgvPzGl4*PW%&JFeqaU zCU#jNK8FkSEBiNR5T6e5Xh9tvQt{|i2;?WPHwgfZFpvm5PJ#-P0RcN9B0qnb<=u(G zu#Gq)&!(B~imHG00%-lqb3XA%x!Y3+np4y3G$Wgsn20u1RD7V`zX=;SZURP@8gweyHLR~((=C9YoGrMNAvJd?iAS~e^<}?SXN#x$Fum*LsF!1 zfCeDc^vsOj!|cQ~*aH!WKGd>(1hr)ANM;X{-aQ8quNyMN=5XE>WEE^k8o>1d0kEJ% zZ*6OX(rA8?Ve(R&oSI|B7`gjsFi5Q!_|j_)Fc>%J2(YTB1ML)d->>i#g@h=iKS?jv zRZmY-9a}A8LZ1Bz@qMhjJ?v*wQb4k)eyl|KU@{;$+`AU$1P>3N{rK`_sEw_yGLKWS z2JXp;YXb~-rFAqzOHxn-^2-wKrZ6pT?;sQZ?ih(TwN4LQ)s_p;km;)}D_Wg$M5*{< zpZvu4lf@@07Lm^{;hzKF+@;i0i7NlJ0L=)%W`ong@%4#;sJnv$3zx$-L_t9TX!GWX z{eNo%SN7&!mR4xLK69k3cR191e{ncR>I2xj<}(gd)Js5%A$`2HH*9wEox*2`y(zfY zuzNA3qxRk80ZO1)y^7I%T|%?LOW5poE?v*SAaZ-VC#(mJl-IAgI8q;93HzKMSI8Vn3R-AK<(f$TZq*4xVk^Y|E1Rmnd!D$xR9c$RBz{$LtkVPs$aiQ+z0+mj(=Kb+ zLI8x(;Tjh`yd(D8Hy8oV5b7_U7_pZMcO^n-&dx-fZphV_sEllbb1!NPdQiKVitp*@ zAV6ovrvM87i1(v{Ss%l0f^yqJFbLYf`O(_m4o!MpDZJckU^<^S!p-2^xWs`FD0EK9 zfe=mF(^{;}ORHU(Hox|&>M=~=*F}7b_Omhw0NwG}B&p;+zsaO@|BV~p?6m^~a=x>G zRADmsxzhP)5=9|*NMy^~ztG-9r~enXY&i`&#Les8dz;+`UEd(JwPS&}!Kv}aKl}G2 zE`}L@Tg7)+SF;qE6x8mmCO4>4`37jn>KfMP+$ekp$G#uoiHV7T9cG@rtqith>WTiv z>mJmH%g~yur2*uU3h6avTupD0tWZ09``90s(W_;Gp|H?I2nYi4-cPl3p|dr$K8-EA zb5)l93b`;Va!Xi2-C}tLR#0R|3DUQHxFHb{KGwN1_rrA1Q=}M5R3HsOK36EydEAeP zhlE53h}7aeWo>vK^%O;M0uVvtc(r^NvKJjvfE4+%!~-bJE83|l%%$&2_$l0$@*j$X zKp}ssYxAr)==~42BOwfArQEh?=_f-r7lL2wrAFQr@2a)+Eh6hU(cEM->#Z^Z-vo62 z`}azU_!vs;n>aX(A6R{ZgLCVpi8B$?iIyduwvU*8d{cv-J zyS+VEHSI)^@mJq?lEB2ze_Si*)_-reZM;m;(s(bwtc?DzVq1+!Pc> z;2?9|Pb$+_!M&m)St9m+QuGSW_(>lJ*C{BdCH(!uH8e$6-N-5AGcelT#`ltMm9$gz zwp|E`D8?AW;?~rLygc*aQEX)qk%<&ak4+Fik~qfO>am=evfT|390Qi?5S}n0 z@`*%yvWvnBxm;aNA3m_QMSf8kZZz7Xri}_I$lRMMY3=ViLoM$Hp4KKUZ5+=8z`kpT?U3Q&GW|WZ^1q}= zn*$v^PgfYAwmtSHeSkmP@{GhTyvOzoo6Y!}s(h?t<%)rkAN|*_Z^)YVeyT|6zOnbK zQ6H1pDr`0%A)944pvy5{xe&#!G6LA7JF@yV>~iI`nEv6unuL^$fP@WtiDpv)i?{A) zbeUAH(5!2!?U5$JdrBGV>R+J7TU(3fmrt5JTYKsN8e!kLhh4>+Fz>S?EDX5`1vQ&G z4(`m7a3oaV=Mj%0@lVWu4;1gXTMJNbC$p6VhgW=%{`6_N#ry>z!m>@LCMHBZgrL7F z$S-d%`xI+5t0X-&3=ppDufu}(D}85~oT_nVxSzXQ!k~H5gze zMK|S@&X-=Q&34#03~FHvRJe--VWE+M@y_Ev+L^1f0g%sB%{QLz0JRO*90iHvx%EM{C=49 zzs0#-45rOeHvPXiVU}pM!ZLfJ)_^011I(=-v|2$kA57levV56*^<~OCJR$;Fgx?Ff z2N?q?y(& zz9C=`gM+!f7L=|V^o%wR7GO1M?tM7zx5#(fU}`4{gHyfc{U|>*zVh^%ZhUEQ-)#{0 zM4+ms4j|0VvsRSh3I1XFq(=o3jvtjNI!1md5WD>vD`j$J;MdNyn;@?FTEJ`iSC*{R z*9YRTv#(*UQrxr-)N&=+|0>c@a}oob1M~iUK8OjvK%$_=0a%?tnmSI1I~O(vRl-dwj8OG4zRo7wMn>(8!=;D7^+SggFs8u~g?ZC+7=#dUbS7;G$wg4+R7t ziW0J{h={rX8M?q%xf|RspL?0;0kXF;0ykq1?JMv$I9$=m4i4A=^4t`ZP>-MU^8YLz z{>LYwuKPoefsI3n+HtnU5R>#Z<4`{2@4#~m&Y?U$K2~&ok4&FY0JwL5Y06+QjUD5K z6!rd1y4APAQ1aax(n-s-R&k6MJeTS3S6`F1iK*{fW&$U+F8H4}4+mT^|HHE&S@n|M zGdBI1M9Yv&!)VK9VD7vmZh4jD#mpGvD=Z=+36d5>_wJGy_=6^gb$a2z%_!4|6`h;dKU@~nE;xQTO4rf=}SI>5}%|L zlDxYly;WzXJ4UieqCfzBn)sq;u!S&n`-{VS<%pS|fr7$K*ubyvKLSea{GptIrDwE< zz~hCyTILSq*sfxi-7&ww?T;f>%}xjJBik zZzmPypM3p;+rg!I+|YgVB$zBLEt$L@g|ct3u&^+&$-4oE%V^Pw8zL(q5Ww;3Y;&-! zU(NpSePc+-Hp+irZCxo%%H|H^S2M3fNX!fF}i>HaA2 zaOBXNDoMtTSfBMJMZO~4xy1lfX4Wzzn`}J z*Vo&nT30OlExOi}Ip^d38+(WkShS<}#yL3|a&Inj@1K0pm?vH2kmE zdo43a=C*XQj_jsm+TM##P*WHKXzVxtK6YeK>sslhA7X}32U0f1<70GBFn;);y~_m}G9^?pP?;NM4nZe@@!sLC18SiPSa>#F7lV20SUL0L~! zByOm`h!qsI`3=Z$@zqkFKEA+HCm?5iTNS`|NRoBs55{bQMAO-7sk`qyej};p&oIKL z#wI1j*vnYq!DD&$XCo835}`R-N&F7ONJf=x-DaKFhBda*nH4HApWl0h+_jyt+&^El zXsUL?k&!+XvermWwMGe~{a-oA9YJF7JOiOSo~gWW^wvG=UZyCJBp}vg&}r@jjU_QZe*zk7i+O0O`2l|VY)iXq zZH-E%ePN(jh;@5srwvGD#)An#J7YQeU~P+Dj^W}9QGQF$@r~7&Dy*fW2YwlBng_Y1 z3i2XLVn*Yiq|D53unW+1ZOr~gh7<&e!A}jQaL4}o6(yG`Cin(3&XupF+@Q?(z^yA7 z=p;0Zw(Zx>CArSPguFAlK{0n)QxZ07=RWtJhHx6~1kJ%@%K4By$-Ia42){R&FTL&# z*jda*Vd*rgJ2wZCft8&}uRXvna_#@nZ$KS^`hV%SJi3gpLOtEx1VcKF?^NhSXPVb= z_vg;w0sjVp6e`pD%LdCF>(n(0t(`D3(wZ@Lk?!E zJhyC#i1uyQmvwCH?1};kPMdqWmgPS{P4UYqjpP|<3Z@vHM{QNPc>{3nx*NHOh&7Ak$_-vGH!0dD`8UtQn*S?)XBFnJQB0rFktVJZ z5qoV&K~(pP_}EwsKY#y|^BskAK(@}G#XHOw=xUht)KH%i7iBcVE022up$3S%jEmNq zb@6g2Fg9i%yr1n=@4do+2PMX5JE`Qgsb2(?z&{E zDa&gQ3sDruTI@rnr!z4&4=XGC?Bd3DeT6LTg;8zZd)C~HK^c^&cG6~KZ0-kaacQo7 zlS-pL$)? zW|79y7B~IgB&W#8$mgwvv`$agj&_gY;!__^F?|r8tF|n2s^SN$gxV7SMSPb4z}M{46aC|uk2nY-&3~*%k065qoIZ82CCxO>$LQEb{RN0>M9L2 zwfBeNA{5U~utFer{yo!%Q~3y*9bSftWVrkU)JNXXS`Sm$9WX%YefgrWTl=Z0soZ(U zipTR5@5{Z4-ud)NoB|^T#`}Dywuz#A_DSys419b{9xoz);2*=?{ouK20enZV`S?i2 zOa{7vH%yAydHa}w3@7+C6%{;$3>|^G$qBr^ptdU4F}R<|$N|OvSoN3J2n!9)G~>An zJ!m5Z2k@qo8LXOGnv7q%&*gg#Zcd)kms$nO%Bnjux}?g!^f)PfmlaVwFzdvPp;0hf zDmI@^gBnbEshq@SJpM=MOg5P-d;A1x@o1_B?e^k8VKeEPn2{nQEZ^ywPs>^uZ|*YE zx9}VD?fJ`#_6+?%0`A_pw*$|mWIeAW0Z>^WkUanQTTvsx^7SdPvH+D7N@>GK(oc#y zj=A<(Os&&I%~w=^R#+(-KoJa@%AVP$cdt&Td_qGCFu-BZHTlsvXH{i|=9{En-{>eb zK%6m#5^0&4nPH;n7_o5QB(niv0yTNjdASm%CV-ucjEtYVh5;opaPq%FhuFgtxN&ty zZNkATnp4G^X8@?0P`@nc%z6`Xee@1+7p<*-UJ-LUca0eIU?1Gaco}r}&rCnumHrv{ z3VF9w|9-kA@22)w=(cCp*JXl}u6L^Hs>|IMG}lybF_vgGeSmL8sdCF(0t)(&0qr%v zv1#N=o2h7vESb#vISdUAUp4S(d1Cx1R()wtL-@?E9LHv=?z9m6U~{suEsh4b_T8e7;;-jyHTA` z2URPqn&jO-4vDJhz=HSClmsWam!%7yV*ySD=$UM6AZbS-prFv$@#1KvTGzk`C@bUS z$RtC#i{nmnav1DZ;{W;km--Co<}87deuZikISK6E5rijliWDv4zS4c=qq@bZef)mS;j2@sZiaj}1i#==hxWUw395}g_`>tQqP-C6u zn@a^Dqm_;ra=#J{xb})YYj9_4_w{KCdjy%#bhIdN^(O98b5R@j1?k>yI65vN$`=|M zh>r+`Z(K3VXlgF@%+KK_%%f4>TV<+V@&MbF{>29TOGwB+gS6|S-zpX+;>6A6SwRtChVsAul?|?`ENcbp z2lUP*2hIZU&1m|E(L%EY6-*3WJ=_+8fFuei#P^{mfnMn!fJde4 z0d$Z_Ry7R_PAb(m-V$JIm`qziFYT1F+3j?BCX>@V?6c$JSwFlIW-|R#CYetMSTr#) zF-Asoa!NKFgNJUAE-Y`Qc_O2G#;#qYllhSR;ZWZ>HTuHb(p)^5&qh$Y)4xbep7P~r z+}6s6Fai^z2dg98>MuUg`LWz*0|?ytk;;xEp!t#{{l3gkGpUwc6ONZx3K|^cfDR)F zx3dMqxb;?v4wKhvmXHay4AD{WFWx6KV8sc@uLG}?)E9i0ilimK<$_-wD6&5iOF8V! z!Vq&+GJsT+8)Z6EK-ZXD|v2QHy_Dj@1|7vHb6ONYz~>Vn7-_06CrfTW<_#cKiBGVR<#< zMO$`mE<8*u0;~D>=dNRr7GHoar#JX<-tEbfQMNnV+cq?Sc}&7WfTiZt%=-Q9!?QPO zBDuiM$K?MCyvy}gAua`S@DTO(zQ5j5BY>nunGpk3rF~&RYalL``uL(m``S&xXgFc{ ztHc`)Vj@2{6vFljLE-Uy15^kg?79l$8En?KnH(+;0@SO_^Xo=404R=q`%%RiUtL&3 z`{-)LaUx(Vjjoj43_cQp{{MJ@7@3)s&F#@Sp&=Fr#5O1GuGf{8{z=)5b*wA=)Y!7v zrOwT>RVc$5qDU61H8>4z|KD@|Z ztq4q2*~rD{sg;2bZq4q4~2kI~$X)xTkD@xR|mju-2$0uo>VGY3;VP&0voi z_y40Gkr$|5z)~m5dj(hayS%4{kd1maBZEY@HI2Ni+&&aI%T<|*E2m1brkc`{K@;#y6(5`T6|Ya@)mT=qg0AHr1lW3tw62Or zCsY5O^+Vbr~B`CjxB0P_0(Urv@$)E)GAH2-AA1{J!EjT11q68>#GR20N6z51(E zSg!jx^-MwLY0W_#_v)8(No(HC_Wh2MQV%94HyN%!fM;Z@@JR*{9C&TJJZ_$FJU&Uf zd&gBau6AdA1+e1lSB1}W!xASh|Fuborm`sRu@Hk2XKggFqW1oZbH2fw6jb|im8HNq zg!|YW0y>Z|=$oT!b5Fvm|1+Mp{dv5a9^B${8cUtsZfWkzHpE%1Cl#3vp5_|P$|y^k z(3W*R6GF|9qqBu7qvt7$&VO#4oTR3&xuB*{kFR&Pv@E2ZEH*Eut!gU1@YJ|-YiepL zuBvv?DAv&09W8k0B!>_VodIizVe}IA?b)LqKGq**U*z89qcff}oeM+)Rtk4G7XQQes%!4h&#s|d z*^K6DM4uJTKV8xMBpv0igUMQ4VTPjd{f$a#P5QpdFNzLUeUWH!A=&cgiv(UK0;QV# z6O1FNogF-WtD-?WdV?ZsI~Cp`>W9>F7`((|xX=jt-M;TrGzkd9)lc zABw2^!tjN;iGi}oAoB~E5zhGqpmMux932I>27~y8=B^gJnaoBFL93Oik( zK?H14bDu#<04zMAg|m_p>uq2VIRm@Y5mPATg^PU~>*8*`V?{@KX7EUh4uA0-dvr>3 zZMen3N!y)9Y{ET#^NkxjTu{(&qbA|o<%V%<3_Lst=pOt%%)k1mpq%LT^z==UI@6FePs8(0;O4uxOy+sFwze53Cwp|xwauUy zy%hz_w0d7%M0qpQK0bN?b}2(oRwx!Q>1E2X$De7=eerKzb6lT_0=D$Dj8)Xe#y3IE z)xX=D#}#?FZ}I&bk{*av+^Om5eHC|yO0M=tVC-C(8nhMPh!2tQR`RhwoEq_vazg#m zZbqM(?N}H?di(b6JzIj!u%LYRD!Mg@WGN#QiJaQPUnGvvA_ck$Nce@E_+W;PYoV%&z4R5nD8820Z3U@m8g~$aRYrkZcScG=E?c_@b!HI=RaP4 z3m7h$M+Zdzpn%s|*8D_F$0c!n&rgA|mdI;c$JLP0xVrMj!QQ^3Ot0hf=g+M_wzjrj zQ&2#Inj7L1cFJ6P?@Ci#{svQaeT%=~&Q1GQw+=KP-(u~r_}q&+VDoB|`k)_^cmn@w z!dZ@@B^0on%2jK&IV9Hf5s@{Kktmx($-&|AqcfI4`ne2;5S#mLJ&)x2(ylF0%up&s zM60sBUHih1XF5KtEbzd`g%~K*RstIRG@MPUj!(auR=#K8U&`A`CLlc_!6OJ07I&b+ z5;m}qc=CEE1GDJW0&QzU??=@#)At%V2e_Vdx3dB*IMzHBRP^P+c&tiS(-)vMkDQhk z8O&6`FLcL{3zyk%$y7Ji?~?HFbQW_>R_5iqykVIr@b-n3<>##6BuXvG6wt)dHOa~F$k^4&pt&)yHIuZ=y!D2ls~ni z<>lv#YHRc1&}+BE z5Rh&G0YQ2Z!9^44T{@v!sM4fLk*f3#A(Tjy-XTaY5_-=athMgFd+)Q)e$M&9^CX#J z&XF<4_{#fz?>hxcDyynNkgjKjFRvG|%>TG#v4jv|Ho!thFu8#rRfGfTFRI>qS3*zjqY07{p@4aGcrFyCyoRmpp!c z$BjMveY@*SEOu=xWvesXu`^XA??dQd6W1qw)-1y+pasYZ)E9XDqsibWE+>3?f6mF& z1Ge`wBk$!7O!sYTzj0h@Y&rb3Iu~)4=1(DV`zCPLGI3CYo$~(Pn+v&kkY4$AwT<=#8iN4LbhU{KQw8B4Is|A}fd4XvNy&y=8wU7CgC#?HCy{iiPuJ zmnfX>j4L|`J@O7ojb{JDooqs?4mT9^=wQE4u}G%m-gINTdWJAU+h*0uzgz<8{jx!v z(DgujtIA;!CggeXW^&T^4UOl|k=qSP@(0CfOJimCzPKaJS8{OmZ+5wXF=K~s=T#+| zs!RM)i!||^OfsRIP68c*{w8w4Gb6Z+B_@iC9*QKD)m4P9u3a@?wY_;$iu;kHE|d#@ z8+rXVxVa$)IEiQ#4%0bplbBZs;cDQN~oQ51v zJ=HpRm6_S}K_sKa!VM~o6)xP~?~UNJ7RB_mG=h(u;cY>?R$Y^~!v@r`k9hp$^|@~c zQ2fO8;_WGANm)OmQ*2Yi9*KoZDQ!#^Z-GqczOYoBsT3J~gz4}9z)GZvmiBTbv zH()we{h5tY#ZrY$sy};nO}^klvV;?MjslE=N5{;Joq>^Yc9vDdZL;<@^sg3HoVqY; zz`M4alUhn(-2Z8C|1xfEMz8%-?}PoNz-~6Zj8v;7@q*ls6tWT$hE&=e>*Mj;Tb>68 z$|j35;SJ&5*Q9SsqGDY#X@8AWUR*oFI!LNQ_6;LU^(o&65uSRE-sly)oMm?FWXEOw{1RhQ+@vfhvb4I^x(7x#QB zqIm7xwSPW;F>Xo#iBSpc(xbw?xK9DrB0peO4GayfNE%wa=M}M24oD2Xi12>8CcQ~W z^-<$itgGCZAjG0O$$Y=7qf1`Xkqkv;R~ae=`uD##ij84CtVNW9bbschAL z{m7~ASW1n1#JsHy??3v@@B+lMc%3~-!iiX#St{V>b53AQqAEnJf9h!~D_`1r^R2|b z#r;Q;FiGo{sXivwWc`z92^%zJ(r#>rUZ?s6rR^^RIYZlPwRN?{?(4b{)u5i_8}@2( z)9Oebh&-{u#N{oH2ao%bV5dqCRb(D_3!i-Qrljr0hl8|rWt|TUukbt&xq9|`2#|6% zvA;SXZPO#w2D+gUiBo7_LK1ZiJ^yz5xp&bA*J^K5LCB|LavFM5rF{r4?!s2lhQP~!QKB_vVq+|j^(Ko^c3Xf z$xeHxakXR2SC8f@950d(5kLe4&0TSJ8t-{)^0r4-ywr_E2grB52>nxltFK$L7Zeb{ z?Y#AMTz*fncdcdV zRp#0!`*pmSve5L>(avhrgw^ooXkjw%-tpRWs@Za>w(f*hrS&q^!z3|gjg0J;(JpWk zdYX2YUU9w}{{ly#6Z40gJG8VjDWlN!Q)03QJt%`cF#T6upX0!GT&cq37e6j;)FH7qcZY+TWm zpVBY^z$lFVlWocpWQiFX8cP5A^(L@>vR@u2ABbH9|8`|)WF!QQR;aA0X#zo4rqlL^ zO515@pnnD-0O*WuY_8tBcMow*j+7O30d{Us1FMhRqhn)bxM}WVSAJ$)S+lmmp{Sp1 zs!M^h5dg^9FMVi7v=+BTuMIA;WN-uQs|7$Nc0H^NsYnz&A5{BXM3LluP}u*Ud4o8g z`hlnS&cs1*nks8BP4*=if;4v83xxlCa%)Nnt8mrsa1hRZ{`U+lbAN2qdBO%?EEfpDERz z_6pu2wdg*Z$g9^W%|^+G@zcr%v}38`s%=z!Vic7dXqGf;gmUbZPX=FF-M zOR^e%=Z%x>#(OdVohxA-AEnp)3XycaQPQJnWu8ajam6qCWPcf86l^2O3=Iu+YMkrP z2#{K|cg32t967}cTR?xcwzkKb8+RqlO zt_mQ1r)B=Uq-oS+?ch?an47>N5@Z!EgM&oLaEBVIj$OgR`cpYvS4t5DMeh}enyzl> zW{7%wSEpr(U9ScpWA0n+rQQ=15QG`e7$?UuC#H;RF1B82Xzb`y|81eKr8T%j%MesM z!BZZIO_!|{gUjV=HaCqvGMk+2XVi+BPdZ||IPHU%;(T~=?{walb!w`XJ}^*Jxcu<& z(6no1PJoeVN^LD5PUZNzaYb}` zfSP5tOH>x(YrqZAX5Y0H7B$Ujd4n#gf#GLqg$pS|UUjv%L4@B_xH!M)fau=Rjx)jg z5_0kI42&QghHlmhu@fiIlaH(YnM5f}9h-L0#p4|qbeVZOl$Do$R$T$~6~AAZw@;7# z&t`5l-_AjmSvGm{oE-}Q_7(^L2($$S_`!(^juoDSHFs8C{Hqn~Ye>YR=S@aN#;=Ak zZ_8FiEv<_Rw9ffH0D$J=sYPeeJn2POzpNhU}91j|W zdmr+NnNXCR??;Ltd0&6}_l-mf+AFy}E@X6KbpAnrOl}cz%r>&z*Z=zT$SJ}Gj+lxZ zv>I;G;%Ra)W2c0fy4LKpro*`TzmvWp$Pn0HW6jj!!7h-oJv_hF=!mcY6?wk5vM+3G zBIJUv{p_L-5M??$KkV3{T*+noAcxETy+|60L;t!cn`U&SQlc7`3L45t$$f4z^z{us zn`#!9mZ$erT||$KF>oso(Q4B=hz3$*sAJg*7O-pKKYoy1BqG8e_Vn+N7c@8C&w45o zd)Ghg3I~);5}Yreh$Q$HJ3Dp5nLE7;_eOk;IEoZn2nCcSnb&H?z)*$sosZzsr8HWE ztkN;nfb=bD5L2Jql>pMq98mDuPZk+QAsh1f|G9wwdPrwN`WB|N6l|Fwcnl2$qHUq= z>KX#z3(JLAN;xiPCdSq{oy%d$`j-PQv^`0B@LGw~&rfbI$Qt-oeokD_17Dg0v`cLlQjds9M5*7iql?GyTO?Fs`RM?lAr|H8;NIswb*@pmIPN zH`qOZBLe)m$XnK%{3Gxxwx!(qgZ)LL&50}Cy-6^ZFeUx-Q67YliiwGpj(1`(>V}5h zg>VT86P*Lnn{c-e8p)B7k4KKXDmd-(C5|v^9&4WjMVw>(uvSM0XZG`#fii(#nbp(- zT!HM#=BbOA!(RB^MC)fl7GuGq)Y_nCCo3x}^f-LyO#;X%9_|9Ine6MhR7dFd zF6N_I@zg&WVQuahkSLQ&FMr(J{f(q4!Krb_=LOJ=bO5t zd_I#PCzr*p2d5CofGb-#8~qp4Kc*YlU7sX*NKH)6bWM@gWoL!S&*yAaux?#Iv!Q*6 zS#SE7#It(;Eoz(`V`P-(khIfx18xwGOctrC8m3?pq^7cy4w0&(q+#;k3cXwoN*+%Y zaf6Xj2b`Q)#*<@%fE0cKKwWZC%uhX!I@%bH*A5zzmj>Y%BcU512N=Qj_8%`WWXToP zXsQ_z+oQ;W$c1n>0NPAKdF4bsNC2*|HhM1Z1=PuU^R@Z(YhBgZ-A3UOpLd*do80C6 z{9$iUq@E`o*9zv59e3NKJ6>2#7u`cGcKo-d?LHc}wW}*QPVHBw=_%mPRlrw$8|_ zNzyXMjG2ojDYp4!^`VUxM~0>*qkjF^sdz?CfjM1}36QvofBP2l^5g)=fcf|Yao#)^ zY(f{5TTo!W=XqE)B|*TiA}{RlZAM~laj|UzTAx*7kel-|^Qq55#ZK7T(Yz{cJhN0L z@#;X?RfvYZW;+N&9%`Apg*m-fLTxb8(KYHHt_##m4Lmkz+r!~ZrlvnN>-W63|06E# zh`@5^6rj6xUW-(4C|DqASzjM?yLxz3xQBDqFCdGQZky(DV|LML{CI{M!{^?KfDvjk zd^Ne^2>k(5xeOQSqMwTc$x1dqUZP^6Ppxh3bmfZwVNU7Sc-S!vEAwF5y8`M{)INep|ltygP>EAYo9^8m08ULEb`<;v8^g4j)ad7+3n7JCRFzdShM>8 zP3Fq`onE-WykeEFrtR=#@eBy|v`k6Ws5^dx{N}u4(v+U%KHi#j=I6(_Hg|Gzq0Vbq zUdmaYjuGzk|B=gLBaW>^OKa;FmorK+PL{^DCEMOu0 zFkZ?YDTT_(br*UIkV;t{9Xg;ga9%ZKl?yUn>`u0Ja~hNaHeGz!4gf)e`BcTur^FHK z{ps1*h!L^tG&E^BIiz-9!&?C4D6wkq;3WU-SvjRtzfGUtq0Y&^Ip|7Ikdq@UeEGt7 z;j6gBzR#;YeGoub`rr|eE@WOnMp$jFCy#z@z%~r*rz7;w zkxDvQ2Xy$4Q~J24>Rp~SF60jTwpr-iEx5}@ajI3W-T40cF!8F~H>=v+GOdRrjcO6= z`y0_P5FES&L^1XoVF_8PHw3{)%U=b>aZKorzLHj9YlF6d3PWv&C^sLg%hX_hfGYVy z?mLQw@j4Gj=Hu-iXBYuNU3{TIjlgM&_a|}pC6aT?Dh*jkt`LQ7Y;1&o`$+u_ggAAn zaB#MEwTL0CSc2OUY-IxLCP;?7IJXM4BotoH}I zVUc&@0ezDnUomHvJU8ZPiqSel8?ohx}^G^2avU{M3c} ztDE$+p~|bhRi+8y$SYq^TI%WqY7{(%^72FtPW?A6Y3i}EuvbzN+C0?5m9Njj!wBS> zieId6615AF==v^Jsy)>8?WV!Jc%WbD1D9<1zN$BU=Yc`r=dX4ZbGW|9y*0TSPdguY z4}pfjuqRdudLa@Cdq^)Wp)K^h)2aYwKkEsX+_t#&iBG19mGqjMiiMjMtyi0MPpcaI zT<_A?#J{&|ilENl4>#I?w<$+#7DyfSQZ9acXPRz@NOXWX866H8&TR$c^yA-vGmUNel->%Vih zmAPOrq13Lb`0650!Tn0Q{-8bUqFgKhpn;$kzUc?OAU``NajMT5OGIg*Ncl+huGGPi zQ!om{SX8%n4#+RQfmAvyUaR%;JdbE??JOo>cF+X@0C+4O9A zE6Ixd2wrE;qq`R_c(ink5>c|_{qpJQt*f5qqPFIXWU%vB8#c~df7k8r5(~rbUIOIE zCe$TrV+#usAlS{6>iN}4c3^neY`#;+aX+rPs7Cr(VYs}Pmz172P!}U(7Pt;1LP<&2 zB78Q+T4TWuF~!6_xVU%C?+fb66za|U1eD(oH@YF0dv<=8SP8}ST9P-%CNkN(T+>%8eh&G-rAnVm&Yb*I&>5I z272FLp~Dk&YAsm{7Z*VP_?0O`s;>q$k2AVid?bT_6w&On*{hP$3*xm~o%gKWfVvH6 zLbt!We!*MZgIF>0X5ZL;HiwiH(|fbF6&`ILTcC|2ASj62PUt_FU!&KrdPCIF5p{ID zRqLh{5+;YNC2fmjmKh5aDqqX6VVMPrYhs?8Bmi*5dbfC4PkdKC21;!Cshm1I_J{;) zN~MQnU5n)@MnJr>wa3B-J?l^MJ|@9ePrjnE$6ljHx*q3R_WZmn=zfy^rOZ z*eT%_K%x0futsSqlnsv_wKkmX((n1;nIOi^C}r2f`KtI6Y#0PGZo8+{;7BP`=RpVo zaxB>jk6H%r`Mic|4`^n5o*_NZ{d(cle=JIoMBpe(`k##s*6JtBzY;1|BVjnhvy8bDNo_!MjG{Ez29g2HQNc!ocjCFM{3^%YlBM`&@f#hnER}(g8$8 zRh1GKr{3QA!+5{sFBoNZw6BNmX53J(2+2cb((PQ~gYd9iGgC{1sKwgh;FsV1BingO?4|IK z>})%g@AFw~PlJbx^W^k23rH$5I_ZOC_BXugKqYs;3m>SG)tsyG1%?oy8k>5V{ly4f ziKCvGpSuFizZvbCmYMk=<8g`3kHYbhkPw8M#^?R+I@uqOAQZbh2-)OBfA6l%b}uL5%4#z`wo-m5m8 zUhh8M4fVU(%d_eZR8pc52zA(>0F+G92eG!sWNh*KEzsx#wZFMauVWE7goub}&0%YM zoAtet5OKSjTR))T8nuF_yV%b*6Ol0sk%DJEG?={{N)nH!6lBu&#$Vm%{yhUWiI9lM zO7h9d_-!hrLgLoe)_260SM(GTkl;b8@TqDksrRX=J%vUM-Ub;BPoyVlYZ^{2h;D7a zi?1XKi-VeDfT+-BTdG%HwH|WC!$sYx;_0^Q4BlEZl`vbM#|e?}VpbfQ9sbuZ#*B|M z4i^~>pa0~-0$bGxWbRzLU7s*?Wjx}qpSx=MKwsC%0j=#(kN*BjJ*VD9+YA|*5+r5x z+nnSU!h|L?^cNTR2X^o(TVDPZ*}Jr@?6x#Q;?EdrgJSO%;s=UP`bX`-sy?>e15!0I zCMK+B^=mOVWcp}la&k3<$F9?+es(bBC-WbPxrf_Z=n{K9LozThaEp)c3Hxl0v`c67 z-H?c|wt{rF32ts#Ykf&Tj%$wXNdT}HK${sDAVEN#ibhYwXG)SsZ|^ebu>7paZNK{m z@ynis{4zdItW~q_il@LJTlC+?@nv^NQ)o;{dryy|xj6@D*c1a6U_Zvrv*)hdTzdUv zdyxTNP1ZR=x#R0OLw9AlPy*LaG;4q3A@n3&c^S$q^6X0 zrh`LUt<~#y4z7Cd#+bMFVA?h}O?V^6zgti5u@2RhF;m&GgfmJLw6p}j8tAX>UKoE? z=*l!%b8NB+^rV?7efxY2tp=THzsUNPc#Q{-oOHuCx8tyZ9X|b*sYecG+J*P;8$;L> zA|IgI-!Cx@Fy7OyZHiS?h?M*BBVluIw>7&$bPkU=4dB)L{u;s779oHB`4+CV_HY~K zv@$Jpj9bLHW|`d_tJVRt(c0{x|8V4)+;&yL;&6TuPYZZ95Wlnj?IX!aas&dAv{+eQ z%`3vm85uTJzeM+^!{Gglmn@BT2;2s_C|X`N3u{>7|LtBLx0BEB=(Mc`=Z&#IM$yY9 zxPslJ)NQen@^W;V9Esa$%DG20eB3P)8ON6r6A0vGqmuYZQOz_Tz%@Vek< zCwmWTYHf43+@@-7jH>wH7eiVO-pK$@flsFOU|y(HuvjYpNZEE^a4&b)JGX{mi&-SQe;7#_r3;qr^2=GYr?pmU%& zN_-NKT&so)GxG8-gIvSL?hfoOkd+dXkid4NNV!T~>mr!@uBgw&iB5B96`*IN?LG${ zNnbr#i6a?g(KxR_nZ8ex*mSmx^1Eravc0aI9|K69q(dC<*69Eb5=iMsn|^FTD7gyJN9 WaQs6|9(Z^bL|OjvgF;zjzyAY@C@MVw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1f3f9edcca9f3a14eea144aa7b72628375f8ecbd GIT binary patch literal 27968 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 literal 0 HcmV?d00001 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..e0bf7d0da --- /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/MGAdaptTests_without_session.py + :language: python + +:download:`Download this script <../../../examples/MGAdaptTests_without_session.py>` + + +**See Also** the GUI :ref:`adaptation_page`. diff --git a/idl/CMakeLists.txt b/idl/CMakeLists.txt index 782dc0faf..7953664c2 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..d6da96565 --- /dev/null +++ b/idl/MG_ADAPT.idl @@ -0,0 +1,148 @@ +// Copyright (C) 2020-2021 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 +// + +#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 +{ + 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 + { + 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); + SMESH::string_array getCustomOptionValuesStrVec(); + SMESH::string_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 6f82a469a..ffeb15ee3 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 @@ -584,7 +586,9 @@ 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 3be42b3be..6c6c90d80 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 100755 index 0000000000000000000000000000000000000000..f2c1a93eb76a36b575e940be9d1974765ae813a5 GIT binary patch literal 2638 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 w;M1& literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 643170041..c38097315 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 95a1d3fd0..ad34d18d8 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,13 +107,15 @@ SET(SMESHimpl_SOURCES SMESH_HypoFilter.cxx SMESH_ProxyMesh.cxx SMESH_MesherHelper.cxx + MG_ADAPT.cxx ) # --- rules --- ADD_LIBRARY(SMESHimpl ${SMESHimpl_SOURCES}) IF(WIN32) - TARGET_COMPILE_OPTIONS(SMESHimpl PRIVATE /bigobj) + TARGET_COMPILE_OPTIONS(SMESHimpl PRIVATE /bigobj) + ADD_DEFINITIONS(-DNOMINMAX) ENDIF(WIN32) TARGET_LINK_LIBRARIES(SMESHimpl ${_link_LIBRARIES} ) diff --git a/src/SMESH/MG_ADAPT.cxx b/src/SMESH/MG_ADAPT.cxx new file mode 100644 index 000000000..849a3f966 --- /dev/null +++ b/src/SMESH/MG_ADAPT.cxx @@ -0,0 +1,1567 @@ +// Copyright (C) 2020-2021 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.hxx" + +#include "SMESH_File.hxx" +#include "SMESH_Comment.hxx" + +#include +#include +#include +#include +#include + +#include +#include + +#ifndef WIN32 +#include // getpid() +#else +#include +#endif +#include +#include +#include // unique_ptr + +typedef SMESH_Comment ToComment; + +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 MG_ADAPT::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 +{ + + bool isFileExist( const std::string& fName ) + { + return SMESH_File( fName ).exists(); + } + +// ======================================================================= +med_idt 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) + { + THROW_SALOME_EXCEPTION("\nThe med file " << aFile << " cannot be opened.\n"); + } + return medIdt; +} + + +// ======================================================================= +void getTimeStepInfos(std::string aFile, med_int& numdt, med_int& numit, std::string fieldName) +// ======================================================================= +{ +// 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( 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); + +} + +struct GET_DEFAULT // struct used to get default value from GetOptionValue() +{ + bool isDefault; + operator bool* () { + return &isDefault; + } +}; + +class outFileStream : public std::ofstream{ +public: + ~outFileStream(){close();} //to close file at dtor +}; +} + +//---------------------------------------------------------------------------------------- +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 + { + THROW_SALOME_EXCEPTION("\nThe file "<< fileName <<" does not exist.\n"); + } +} + +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 + { + THROW_SALOME_EXCEPTION("\nThe file "<< mapFile <<" does not exist.\n"); + } +} +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) +{ +// 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++; + size_t 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 +{ +// 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 ) +{ + 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] = (char) tolower( s[i] ); + return s; +} +//================================================================================ +/*! + * \brief Converts a string to a bool + */ +//================================================================================ + +bool MgAdapt::toBool(const std::string& str, bool* isOk ) +{ + std::string s = str; + if ( isOk ) *isOk = true; + + for ( size_t i = 0; i <= s.size(); ++i ) + s[i] = (char) 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 ) +{ + 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-Adapt 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 if ( !isFileExist( meshFormatOutputMesh )) + { + errStr = ToComment(" failed to find file ") << meshFormatOutputMesh + << " output from MG-Adapt run"; + } + 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); + + +#if defined(WIN32) +#if defined(UNICODE) + const wchar_t * aCmd = Kernel_Utils::utf8_decode(cmd); + std::unique_ptr pipe(_wpopen(aCmd, O_RDONLY), _pclose ); +#else + std::unique_ptr pipe(_popen(cmd, "r"), _pclose ); +#endif +#else + std::unique_ptr pipe(popen(cmd, "r"), pclose ); +#endif + + 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; +} + +//======================================================================= +//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 * double( ramMB )); + } +#endif + return 1024; +} + +//======================================================================= +//function : defaultWorkingDirectory +//======================================================================= + +std::string MgAdapt::defaultWorkingDirectory() +{ + std::string aTmpDir; + + char *Tmp_dir = getenv("SALOME_TMP_DIR"); + if(Tmp_dir != NULL) + { + aTmpDir = Tmp_dir; + } + else { +#ifdef WIN32 + aTmpDir = "C:\\"; +#else + aTmpDir = "/tmp/"; +#endif + } + return aTmpDir; +} +//================================================================================ +/*! + * \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 + + SMESH_Comment aGenericName( aTmpDir ); + aGenericName << "MgAdapt_"; +#ifndef WIN32 + aGenericName << getpid(); +#else +aGenericName << _getpid(); +#endif + aGenericName << "_"; + aGenericName << std::abs((int)(long) aGenericName.data()); + + return aGenericName; +} +//======================================================================= +//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" ) + { + THROW_SALOME_EXCEPTION("Mesh dimension is 2; the option should be 'surface'" + " instead of '" << optionValue << "'."); + } + } + } + } +} + +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::vector< int> famListId; + for ( size_t i = 0; i < famNames.size(); ++i ) + { + famListId.push_back( FromIdType( 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, FromIdType( 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 size_t 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 (size_t 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(); +} + +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::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, fieldName); + 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..4970ccce5 --- /dev/null +++ b/src/SMESH/MG_ADAPT.hxx @@ -0,0 +1,278 @@ +// Copyright (C) 2020-2021 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 +// + +#ifndef MG_ADAPT_HXX +#define MG_ADAPT_HXX + +#include +#include +#include +#include + +#include "SMESH_SMESH.hxx" + +namespace MEDCoupling +{ + class MEDFileMesh; +} + +namespace MG_ADAPT +{ +typedef std::map< std::string, std::string > TOptionValues; +typedef std::set< std::string > TOptionNames; + +std::string remove_extension(const std::string& filename); + +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 SMESH_EXPORT 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); + std::string getOptionValue(const std::string& optionName, + bool* isDefault=0) const; + std::vector getCustomOptionValuesStrVec() const; + std::vector getOptionValuesStrVec() const; + + + TOptionValues getOptionValues() const; + const TOptionValues& getCustomOptionValues() const ; + static double toDbl(const std::string&, bool* isOk = 0); + static bool toBool(const std::string&, bool* isOk = 0); + static int toInt(const std::string&, bool* isOk = 0 ); + static std::string toLowerStr(const std::string& str); + + /* default values */ + static std::string defaultWorkingDirectory(); + static std::string defaultLogFile(); + static bool defaultKeepFiles(); + static bool defaultRemoveLogOnSuccess(); + static int defaultVerboseLevel(); + static bool defaultPrintLogInFile(); + static bool defaultFromMedFile(); + static bool defaultMeshOutMed(); + static bool defaultPublish(); + static bool defaultUseLocalMap(); + static bool defaultUseBackgroundMap(); + static bool defaultUseConstantValue(); + static bool defaultUseNoTimeStep(); + static bool defaultUseLastTimeStep(); + static bool defaultUseChosenTimeStep(); + static double defaultMaximumMemory(); + + enum Status { + DRS_OK, + DRS_EMPTY, // a file contains no mesh with the given name + DRS_WARN_RENUMBER, // a file has overlapped ranges of element numbers, + // so the numbers from the file are ignored + DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data + DRS_WARN_DESCENDING, // some elements were skipped due to descending connectivity + DRS_FAIL, // general failure (exception etc.) + DRS_NO_TIME_STEP // general failure (exception etc.) + }; + + struct group + { + std::string _name; + std::vector _famListId; + std::vector _famNames; + group(std::string name, std::vector famListId, std::vector famNames) + :_name(name), _famListId( famListId ), _famNames( famNames ) {} + }; + + struct family + { + std::string _famName; + int _famId; + family(std::string famName, int 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 size_t nbNodes) const; + void buildBackGroundMeshAndSolFiles(const std::vector& fieldFileNames, const std::string& meshFormatsizeMapFile) const; + Status addMessage(const std::string& msg, const bool isFatal = false); + 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) ; + +}; + +} // namespace MG_ADAPT + +#endif // MG_ADAPT_HXX diff --git a/src/SMESHGUI/CMakeLists.txt b/src/SMESHGUI/CMakeLists.txt index cd5c81252..e1696341b 100644 --- a/src/SMESHGUI/CMakeLists.txt +++ b/src/SMESHGUI/CMakeLists.txt @@ -147,6 +147,8 @@ SET(_moc_HEADERS SMESHGUI_SplitBiQuad.h SMESHGUI_IdPreview.h SMESHGUI_PreVisualObj.h + SMESHGUI_MG_ADAPTDRIVER.h + SMESHGUI_MgAdaptDlg.h ) # header files / no moc processing @@ -262,6 +264,8 @@ SET(_other_SOURCES SMESHGUI_SplitBiQuad.cxx SMESHGUI_PreVisualObj.cxx SMESHGUI_IdPreview.cxx + SMESHGUI_MG_ADAPTDRIVER.cxx + SMESHGUI_MgAdaptDlg.cxx ) # sources / to compile @@ -275,7 +279,7 @@ SET(_ts_RESOURCES SMESH_msg_en.ts SMESH_msg_fr.ts SMESH_msg_ja.ts -) +) # --- rules --- diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index b521be09a..5c3cfa08e 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -60,6 +60,7 @@ #include "SMESHGUI_GroupUtils.h" #include "SMESHGUI_Hypotheses.h" #include "SMESHGUI_HypothesesUtils.h" +#include "SMESHGUI_MG_ADAPTDRIVER.h" #include "SMESHGUI_Make2DFrom3DOp.h" #include "SMESHGUI_MakeNodeAtPointDlg.h" #include "SMESHGUI_Measurements.h" @@ -167,22 +168,22 @@ #include // SALOME KERNEL includes +#include #include #include #include #include -#include #include -#include "utilities.h" +#include +#include #include +#include // OCCT includes #include #include #include -#include - // Below macro, when uncommented, switches on simplified (more performant) algorithm // of auto-color picking up #define SIMPLE_AUTOCOLOR @@ -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,21 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } break; } + // Adaptation - begin +#ifndef DISABLE_MG_ADAPT + case SMESHOp::OpMGAdapt: + { + if ( isStudyLocked() ) + break; + EmitSignalDeactivateDialog(); + + SALOME::GenericObj_wrap< SMESH::MG_ADAPT > model = GetSMESHGen()->CreateMG_ADAPT(); + bool isCreation = false; + ( new SMESHGUI_MG_ADAPTDRIVER( this, model, isCreation ))->show(); + break; + } +#endif + // Adaptation - end case SMESHOp::OpSplitBiQuadratic: case SMESHOp::OpConvertMeshToQuadratic: case SMESHOp::OpCreateBoundaryElements: // create 2D mesh from 3D @@ -4279,6 +4295,12 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpAutoColor, "AUTO_COLOR" ); createSMESHAction( SMESHOp::OpDisableAutoColor, "DISABLE_AUTO_COLOR" ); + // Adaptation - begin +#ifndef DISABLE_MG_ADAPT + createSMESHAction( SMESHOp::OpMGAdapt, "MG_ADAPT", "ICON_MG_ADAPT" ); +#endif + // 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 +4342,9 @@ 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 ), +#ifndef DISABLE_MG_ADAPT + adaptId = createMenu( tr( "MEN_ADAPT" ), -1, 80, 10 ), +#endif measureId = createMenu( tr( "MEN_MEASURE" ), -1, 50, 10 ), viewId = createMenu( tr( "MEN_VIEW" ), -1, 2 ); @@ -4492,6 +4517,12 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpSmoothing, modifyId, -1 ); createMenu( SMESHOp::OpPatternMapping, modifyId, -1 ); + // Adaptation - begin +#ifndef DISABLE_MG_ADAPT + createMenu( SMESHOp::OpMGAdapt, adaptId, -1 ); +#endif + // Adaptation - end + createMenu( SMESHOp::OpMinimumDistance, measureId, -1 ); createMenu( SMESHOp::OpBoundingBox, measureId, -1 ); createMenu( SMESHOp::OpAngle, measureId, -1 ); @@ -4506,22 +4537,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 +4549,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 +4589,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 +4597,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 +4613,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 +4627,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 +4648,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 +4666,17 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpSmoothing, modifyTb ); createTool( SMESHOp::OpPatternMapping, modifyTb ); + // Adaptation - begin +#ifndef DISABLE_MG_ADAPT + int adaptTb = createTool( tr( "TB_ADAPTATION" ), QString( "SMESHAdaptationToolbar" ) ) ; + createTool( SMESHOp::OpMGAdapt, adaptTb ); +#endif + // 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 +4752,14 @@ 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 ); + // Adaptation - begin +#ifndef DISABLE_MG_ADAPT + popupMgr()->insert( separator(), -1, 0 ); + createPopupItem( SMESHOp::OpMGAdapt, OB, mesh ); + popupMgr()->insert( separator(), -1, 0 ); +#endif + // 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 +5181,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 +5189,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 +5416,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 +5793,30 @@ void SMESHGUI::createPreferences() setPreferenceProperty( coloringType, "indexes", indices ); addPreference( tr( "SMESH_DISTRIBUTION_COLOR" ), distributionGr, LightApp_Preferences::Color, "SMESH", "distribution_color" ); + // Adaptation - begin +#ifndef DISABLE_MG_ADAPT + // 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 ); +#endif + // Adaptation - end } void SMESHGUI::preferencesChanged( const QString& sect, const QString& name ) diff --git a/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx new file mode 100644 index 000000000..627b3ded2 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.cxx @@ -0,0 +1,428 @@ +// Copyright (C) 2020-2021 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 "SMESHGUI_MG_ADAPTDRIVER.h" + +#include "SMESHGUI.h" +#include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_MeshUtils.h" +#include "SMESH_TryCatch.hxx" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// SALOME KERNEL includes + +const int SPACING = 6; // layout spacing +const int MARGIN = 9; // layout margin + +// 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; +// } + + +SMESHGUI_MG_ADAPTDRIVER::SMESHGUI_MG_ADAPTDRIVER( SMESHGUI* theModule, SMESH::MG_ADAPT_ptr myModel, bool isCreation ) + : SMESHGUI_MgAdaptDlg((SalomeApp_Module*)theModule, myModel, SMESHGUI::desktop(), isCreation), + mySMESHGUI( theModule ), + myIsApplyAndClose( false ) +{ + + //resMgr = mySMESHGUI->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( false ); + 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; + + SMESH::SMESH_IDSource_var sSelectedObj = SMESH::IObjectToInterface( IO ); + if ( sSelectedObj->_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 = SMESH::toStdStr( getModel()->getErrMsg() ); + } + SMESH_CATCH( SMESH::returnError ); + + std::string msg = " ok"; + if ( !errStr.empty() || err != 0 ) + { + msg = "Not ok \n" + errStr + "\n"; + std::cerr << msg; + err = 1; + } + return err == 0; +} +#undef SMESH_CAUGHT +#define SMESH_CAUGHT + +//================================================================================= +// 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 : isValid +// purpose : +//================================================================================= + +bool SMESHGUI_MG_ADAPTDRIVER::isValid() +{ + bool ok = true; + return ok; +} + +bool SMESHGUI_MG_ADAPTDRIVER::createMeshInObjectBrowser() +{ + QString filename( SMESH::toQStr( 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->_is_nil() ) { + QMessageBox::critical( 0, QObject::tr("MG_ADAPT_ERROR"), + QObject::tr("Could not retrieve SMESH_Gen_ptr") ); + return false; + } + 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 (isEnabled()) + // { + // mySMESHGUI->ResetState(); + // mySMESHGUI->SetActiveDialogBox(0); + // setEnabled( false ); + // } +} + +//================================================================================= +// 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(); +} diff --git a/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h new file mode 100644 index 000000000..ecaa1a9f4 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MG_ADAPTDRIVER.h @@ -0,0 +1,90 @@ +// Copyright (C) 2020-2021 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 +// + +#ifndef SMESHGUI_MG_ADAPTDRIVER_H +#define SMESHGUI_MG_ADAPTDRIVER_H + +#include "SMESH_SMESHGUI.hxx" + +// model +#include "SMESHGUI_MgAdaptDlg.h" + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_Mesh) +#include CORBA_SERVER_HEADER(MG_ADAPT) + +class SMESHGUI; +class LightApp_SelectionMgr; +//class MgAdapt; + +// 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 ; + LightApp_SelectionMgr* selectionMgr(); + SMESH::SMESH_Mesh_var myMesh ; + bool myIsApplyAndClose; + + void enterEvent( QEvent* ); /* mouse enter the QWidget */ + void keyPressEvent( QKeyEvent* ); + + bool isValid(); + bool createMeshInObjectBrowser(); + void setIsApplyAndClose( const bool theFlag ); + bool isApplyAndClose() const; + bool execute(); + + +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(); +}; + +#endif // SMESHGUI_MG_ADAPTDRIVER_H diff --git a/src/SMESHGUI/SMESHGUI_MgAdaptDlg.cxx b/src/SMESHGUI/SMESHGUI_MgAdaptDlg.cxx new file mode 100644 index 000000000..113d24860 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MgAdaptDlg.cxx @@ -0,0 +1,1338 @@ +// Copyright (C) 2020-2021 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 "SMESHGUI_MgAdaptDlg.h" + +#include "MED_Factory.hxx" + +#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 + +const int SPACING = 6; // layout spacing +const int MARGIN = 9; // layout margin + +namespace +{ + + // ====================================================== + QString lireNomDimMaillage(QString aFile, int& meshdim) + // ======================================================== + { + QString nomMaillage = QString::null ; + + try { + while ( true ) + { + + MED::PWrapper aMed = MED::CrWrapperR( aFile.toUtf8().data() ); + MED::TInt numberOfMeshes = aMed->GetNbMeshes(); + + 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 ; + } + + MED::PMeshInfo aMeshInfo = aMed->GetPMeshInfo( 1 ); + nomMaillage = aMeshInfo->GetName().c_str(); + meshdim = (int) aMeshInfo->GetDim(); + + break ; + } + } + catch ( const SALOME::SALOME_Exception & S_ex ) + { + SalomeApp_Tools::QtCatchCorbaException(S_ex); + } + + return nomMaillage; + } + + // ======================================================================= + std::map GetListeChamps(QString aFile, bool errorMessage=true) + // ======================================================================= + { + // Il faut voir si plusieurs maillages + + std::map ListeChamp ; + + try + { + while ( true ) + { + MED::PWrapper aMed = MED::CrWrapperR( aFile.toUtf8().data() ); + MED::TInt jaux = aMed->GetNbFields(); + if (jaux < 1 ) + { + if(errorMessage) + { + QMessageBox::critical( 0, QObject::tr("_ERROR"), + QObject::tr("HOM_MED_FILE_5") ); + } + break ; + } + // nbofcstp inutile pour le moment + MED::PMeshInfo aMeshInfo = aMed->GetPMeshInfo( 1 ); + int nbofcstp = 1; + for( MED::TInt j=0;jGetPFieldInfo( aMeshInfo, j + 1 ); + ListeChamp.insert({ QString( aFiledInfo->GetName().c_str()), nbofcstp }); + } + break ; + } + } + catch ( const SALOME::SALOME_Exception & S_ex ) + { + SalomeApp_Tools::QtCatchCorbaException(S_ex); + } + + 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); + } +} + +//================================================================================= +// function : SMESHGUI_MgAdaptDlg() +// purpose : +//================================================================================= +SMESHGUI_MgAdaptDlg::SMESHGUI_MgAdaptDlg( SalomeApp_Module* theModule, SMESH::MG_ADAPT_ptr myModel, QWidget* parent, bool isCreation ) + : QDialog(parent), mySMESHGUI( theModule ) +{ + //~model = new MgAdapt(*myModel); + model = SMESH::MG_ADAPT::_duplicate(myModel); + model->Register(); + 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::string_array_var str = model->getOptionValuesStrVec(); + SMESH::string_array_var str2 = model->getCustomOptionValuesStrVec(); + std::vector s; + for (CORBA::ULong i = 0; i< str->length(); i++) s.push_back( str[i].in()); + for (CORBA::ULong j = str->length(); j< str2->length(); j++) s.push_back(str[ 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 = 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(myData->myMeshFileOut.in()); + } + else + { + myArgs->myFileOutDir = ""; //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 = ""; //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() +{ + bool ret = true ; + SMESH::MgAdaptHypothesisData data, *aData = &data; + while ( ret ) + { + // 1. Fichier du maillage de départ + aData->fromMedFile = myArgs->aMedfile->isChecked(); + if (aData->fromMedFile) + { + aData->myFileInDir = CORBA::string_dup(myArgs->myFileInDir.toUtf8().data()); + aData->myMeshFileIn = CORBA::string_dup(myArgs->selectMedFileLineEdit->text().toUtf8().data()); + // 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.toUtf8().data()); + aData->myMeshFileOut = CORBA::string_dup(myArgs->selectOutMedFileLineEdit->text().toUtf8().data()); + } + 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.toUtf8().data()); + aData->myMeshFileBackground = CORBA::string_dup(myArgs->selectMedFileBackgroundLineEdit->text().toUtf8().data()); + } + 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 ; + } + + return ret; +} +bool SMESHGUI_MgAdaptDlg::storeParamsToHypo( const SMESH::MgAdaptHypothesisData& ) const +{ + return true; +} +/*! + \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) +{ + + 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 + lireNomDimMaillage( fileName, meshDimBG ); + 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 = lireNomDimMaillage(fileName.trimmed(), meshDim); + if (aMeshName.isEmpty() ) + { + 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 ( size_t 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 ); +} diff --git a/src/SMESHGUI/SMESHGUI_MgAdaptDlg.h b/src/SMESHGUI/SMESHGUI_MgAdaptDlg.h new file mode 100644 index 000000000..036f35f25 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MgAdaptDlg.h @@ -0,0 +1,279 @@ +// Copyright (C) 2020-2021 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 +// + +#ifndef MG_ADAPTGUI_HXX +#define MG_ADAPTGUI_HXX + +// Qt includes +#include +#include +#include + +#include + +#include +#include CORBA_SERVER_HEADER(MG_ADAPT) +#include + +class SalomeApp_Module; + +class QButtonGroup; +class QLineEdit; +class QGroupBox; +class QRadioButton; +class QLabel; +class QCheckBox; +class QGridLayout; +class QTabWidget; +class QDoubleSpinBox; +class QSpacerItem; +class QSpinBox; +class QTreeWidgetItem; +class QHBoxLayout; +class QComboBox; + +class SMESHGUI_MgAdaptArguments; +class MgAdaptAdvWidgetTreeWidget; +class MgAdaptAdvWidget; + +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; + QTabWidget* myTabWidget; + + SMESH::MgAdaptHypothesisData_var myData; + SALOME::GenericObj_wrap< SMESH::MG_ADAPT > 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); + int meshDim; + 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_Operations.h b/src/SMESHGUI/SMESHGUI_Operations.h index 5b0da258a..d1884f948 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/SMESHGUI_SingleEditDlg.cxx b/src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx index 7992e0abc..3c020b38f 100644 --- a/src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx @@ -369,9 +369,9 @@ void SMESHGUI_SingleEditDlg::onTextChange (const QString& /*theNewText*/) if ( findTriangles(aNode1,aNode2,tria1,tria2) ) { - newIndices.push_back( aNode1->GetID() ); - newIndices.push_back( aNode2->GetID() ); - + newIndices.push_back( aNode1->GetID() ); + newIndices.push_back( aNode2->GetID() ); + myOkBtn->setEnabled(true); myApplyBtn->setEnabled(true); } @@ -410,22 +410,22 @@ void SMESHGUI_SingleEditDlg::onSelectionDone() if(SMDS_Mesh* aMesh = aVisualObj->GetMesh()) { const SMDS_MeshElement* tria[2]; - - bool valid = false; + + bool valid = false; SVTK_IndexedMapOfIds anIds; mySelector->GetCompositeIndex(anIO,anIds); if( anIds.Extent() == 1 && anIds(1).size() == 2 ) { - anId1 = anIds(1)[0]; - anId2 = anIds(1)[1]; - valid = true; + anId1 = anIds(1)[0]; + anId2 = anIds(1)[1]; + valid = true; } - + if( valid && findTriangles( aMesh->FindNode( anId1 ), aMesh->FindNode( anId2 ), tria[0],tria[1] ) ) { QString aText = QString("%1-%2").arg(anId1).arg(anId2); myEdge->setText(aText); - + myOkBtn->setEnabled(true); myApplyBtn->setEnabled(true); } 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 a01898e5d..dc500e2c7 100644 --- a/src/SMESH_I/CMakeLists.txt +++ b/src/SMESH_I/CMakeLists.txt @@ -113,6 +113,7 @@ SET(SMESHEngine_HEADERS SMESH_MeshPartDS.hxx SMESH.hxx SMESH_Component_Generator.hxx + MG_ADAPT_i.hxx ) # --- sources --- @@ -141,6 +142,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..02415c69e --- /dev/null +++ b/src/SMESH_I/MG_ADAPT_i.cxx @@ -0,0 +1,542 @@ +// Copyright (C) 2020-2021 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 "MG_ADAPT.hxx" +#include "SMESH_File.hxx" +#include "SMESH_Gen_i.hxx" +#include "SMESH_PythonDump.hxx" +#include "SMESH_TryCatch.hxx" + +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_Gen_i::CreateMG_ADAPT + * + * Create measurement instance + */ +//============================================================================= + +SMESH::MG_ADAPT_ptr SMESH_Gen_i::CreateMG_ADAPT() +{ +#ifndef DISABLE_MG_ADAPT + SMESH::MG_ADAPT_i* aMGadapt = new SMESH::MG_ADAPT_i(); + SMESH::MG_ADAPT_var anObj = aMGadapt->_this(); + return anObj._retn(); +#else + return SMESH::MG_ADAPT_ptr(); +#endif +} +SMESH::MG_ADAPT_ptr SMESH_Gen_i::CreateAdaptationHypothesis() +{ +#ifndef DISABLE_MG_ADAPT + SMESH::MG_ADAPT_i* aMGadapt = new SMESH::MG_ADAPT_i(); + SMESH::MG_ADAPT_var anObj = aMGadapt->_this(); + return anObj._retn(); +#else + return SMESH::MG_ADAPT_ptr(); +#endif +} +SMESH::MG_ADAPT_OBJECT_ptr SMESH_Gen_i::Adaptation( const char* adaptationType) +{ +#ifndef DISABLE_MG_ADAPT + 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(); + } +#endif + return SMESH::MG_ADAPT_OBJECT_ptr(); +} +//============================================================================= +/*! + * standard constructor + */ +//============================================================================= +MG_ADAPT_i::MG_ADAPT_i(): SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() ) +{ + myMgAdapt = new ::MG_ADAPT::MgAdapt(); +} + +//============================================================================= +/*! + * standard destructor + */ +//============================================================================= +MG_ADAPT_i::~MG_ADAPT_i() +{ + delete myMgAdapt; +} +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() +{ + return 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()); +} + +// macro used to initialize excStr by exception description +// returned by SMESH_CATCH( SMESH::returnError ) +#undef SMESH_CAUGHT +#define SMESH_CAUGHT excStr = + +void MG_ADAPT_i::compute() +{ + SMESH::TPythonDump noDumpSoFar; + + errStr = ""; + std::string excStr; + SMESH_TRY; + + myMgAdapt->compute(errStr); + + SMESH_CATCH( SMESH::returnError ); + + SMESH_Comment errMsg; + if ( !excStr.empty() ) + { + errMsg << "Exception thrown on MG_ADAPT_i::compute invocation with error message \"" + << errStr << "\" with exception \"" << excStr << "\""; + } + else if ( !errStr.empty() ) + { + errMsg << "MG_ADAPT_i::compute invocation returned error message \"" << errStr << "\""; + } + if ( !errMsg.empty() ) + { + THROW_SALOME_CORBA_EXCEPTION( errMsg.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); + } +} +#undef SMESH_CAUGHT +#define SMESH_CAUGHT + +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) +{ + SMESH_TRY; + myMgAdapt->setOptionValue(optionName, optionValue); + SMESH_CATCH( SMESH::throwCorbaException ); +} + +char* MG_ADAPT_i::getOptionValue(const char* optionName, + bool& isDefault) +{ + SMESH_TRY; + return CORBA::string_dup(myMgAdapt->getOptionValue(optionName, &isDefault).c_str()); + SMESH_CATCH( SMESH::throwCorbaException ); + return 0; +} +SMESH::string_array* MG_ADAPT_i::getCustomOptionValuesStrVec() +{ + SMESH::string_array_var result = new SMESH::string_array(); + std::vector vals = myMgAdapt->getCustomOptionValuesStrVec(); + result->length((CORBA::ULong) vals.size()) ; + for (CORBA::ULong i = 0; i vals = myMgAdapt->getOptionValuesStrVec(); + result->length((CORBA::ULong) vals.size()); + for (CORBA::ULong 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); + hypothesis->Register(); +} +CORBA::Long MG_ADAPT_OBJECT_i::Compute(bool publish) +{ + SMESH::TPythonDump noDumpSoFar; + + 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() +{ + SMESH::TPythonDump noDumpSoFar; + + bool ret = false; // 1 ok , 0 nook + if ( !( ret = SMESH_File( medFileIn ).exists())) + { + if(!myMesh->_is_nil()) + { + bool toOverwrite = true; + bool toFindOutDim = true; + medFileIn = (CORBA::String_var( hypothesis->getFileName() )).in(); + medFileIn+= ".med"; + myMesh->ExportMED(medFileIn.c_str(), false, -1, toOverwrite, toFindOutDim); + hypothesis->setMedFileIn(medFileIn.c_str()); + 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..7b9f26572 --- /dev/null +++ b/src/SMESH_I/MG_ADAPT_i.hxx @@ -0,0 +1,172 @@ +// Copyright (C) 2020-2021 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 +// + +#ifndef MG_ADAPT_I_HXX +#define MG_ADAPT_I_HXX + +#include "SMESH.hxx" + +#include +#include CORBA_SERVER_HEADER(MG_ADAPT) +#include "SALOME_GenericObj_i.hh" +#include + +#include + +namespace MG_ADAPT +{ + class MgAdaptHypothesisData; + 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(); + virtual ~MG_ADAPT_i(); + 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); + char* getOptionValue(const char* optionName, + bool& isDefault); + SMESH::string_array* getCustomOptionValuesStrVec() ; + SMESH::string_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; + +}; + +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_var myMesh; +SALOME::GenericObj_wrap 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 7c2597752..0aaa84461 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 // ***************************************** diff --git a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx index 6ea864c40..b15711998 100644 --- a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx +++ b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx @@ -2052,7 +2052,7 @@ public: for ( int i = 1; i <= idMap.Extent(); i++ ) { myResult.push_back( std::make_pair( (int)idMap(i)[0], (int)idMap(i)[1]) ); - } + } } };