From 37a9122aa8276e6283e54fe02d3d287efff15663 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Tue, 8 Oct 2024 17:40:30 +0200 Subject: [PATCH 01/19] debug td --- doc/users/Tuto1/img/hs.png | Bin 58004 -> 54184 bytes doc/users/Tuto1/pas-a-pas.tex | 38 ++++++++++++++++++---------------- doc/users/Tuto1/step1.pamhyr | Bin 163840 -> 163840 bytes 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/doc/users/Tuto1/img/hs.png b/doc/users/Tuto1/img/hs.png index 090ccb74efdea55859bd60f963623334c58b571c..17dc38cd407617ff3d77c00bf489afd0782e2b9a 100644 GIT binary patch literal 54184 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

gDEju_ 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 [Éditer le réseau]} ou sur l'icône \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/network.png} pour créer la structure de votre rivière. +Cliquez sur \texttt{[Réseau] => [Modifier le réseau]} ou sur l'icône \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/network.png} pour créer la structure de votre rivière. Nous voici dans la fenêtre \textit{Réseau}. -Dans cette fenêtre, nous allons définir un graphe orienté qui représente les biefs de notre réseau fluvial : les arêtes sont les biefs, les n½uds sont soit des conditions limites amont, soit des conditions limites aval, soit des jonctions entre biefs. +Dans cette fenêtre, nous allons définir un graphe orienté qui représente les biefs de notre réseau fluvial : les arêtes sont les biefs, les n\oe{}uds sont soit des conditions limites amont, soit des conditions limites aval, soit des jonctions entre biefs. Un bief par défaut existe dans la nouvelle étude. Pour les besoins de ce tutoriel, nous allons le supprimer : -cliquez sur le bouton \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/del.png} pour entrer dans le mode \textit{Suppression} puis cliquez sur les n½uds. +cliquez sur le bouton \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/del.png} pour entrer dans le mode \textit{Suppression} puis cliquez sur les n\oe{}uds. Nous voilà repartis sur une fenêtre vierge. -Appuyez sur le bouton \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/add.png} pour entrer dans le mode \textit{Ajout}. Créez deux n½uds en cliquant dans la zone grise de la fenêtre, et créez un lien en cliquant à nouveau sur chaque n½ud. +Appuyez sur le bouton \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/add.png} pour entrer dans le mode \textit{Ajout}. Créez deux n\oe{}uds en cliquant dans la zone grise de la fenêtre, et créez un lien en cliquant à nouveau sur chaque n\oe{}ud. Appuyez à nouveau sur \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/add.png} pour quitter le mode \textit{Ajout}. -Vous avez créé votre premier bief, avec un n½ud amont et un n½ud aval. -Dans la partie inférieure de la fenêtre \textit{Réseau}, vous pouvez renommer les n½uds et les biefs. +Vous avez créé votre premier bief, avec un n\oe{}ud amont et un n\oe{}ud aval. +Dans la partie inférieure de la fenêtre \textit{Réseau}, vous pouvez renommer les n\oe{}uds et les biefs. Comme le bief que nous avons créé est automatiquement sélectionné, toutes les étapes suivantes s'appliqueront à ce bief. La fenêtre doit se présenter comme suit : @@ -154,7 +156,7 @@ Fermez la fen \section{Éditer la géométrie de la rivière} -Cliquez sur \texttt{[Géométrie] => [Éditer la géométrie]} ou sur l'icône \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/geometry.png} pour définir la géométrie du bief sélectionné. +Cliquez sur \texttt{[Géométrie] => [Modifier la géométrie]} ou sur l'icône \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/geometry.png} pour définir la géométrie du bief sélectionné. Pour Importer une géométrie depuis un fichier, cliquez sur le bouton \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/import.png}. Sélectionnez le fichier \texttt{Data/Bief\_1.st}. Vous devriez voir : @@ -237,8 +239,8 @@ Nous pouvons cliquer sur la nouvelle ligne pour s Ici, nous définirons le débit mesuré lors de la crue de février 2002. Sélectionnez la cellule \textit{Nom} pour donner un nom à la condition limite par exemple "crue2002". Sélectionner la cellule \textit{Type} et utiliser la combo box pour mettre une loi \textit{Q(t)} : débit en fonction du temps (hydrogramme). -Sélectionnez la cellule \textit{N½ud} et attribuez cette condition au n½ud amont. -Les noms des n½uds sont rappelés dans le panneau de droite, avec une vue du réseau. +Sélectionnez la cellule \textit{n\oe{}ud} et attribuez cette condition au n\oe{}ud amont. +Les noms des n\oe{}uds sont rappelés dans le panneau de droite, avec une vue du réseau. Sélectionnez maintenant la ligne entière et cliquez sur le bouton d'édition \includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"}. Vous avez ouvert la fenêtre \textit{Éditer les conditions aux limites}. Dans un éditeur de texte, ouvrez le fichier \texttt{data/Fevrier\_2002.txt}. @@ -250,7 +252,7 @@ Vous pouvez maintenant voir la courbe de d \par\end{center} Fermez cette fenêtre. Revenez sur la fenêtre \textit{Conditions aux limites}. -Ajoutez une nouvelle ligne, donnez lui un nom, donnez lui le type \textit{Z(T)} (limnigramme) et associez là au n½ud aval du réseau. +Ajoutez une nouvelle ligne, donnez lui un nom, donnez lui le type \textit{Z(T)} (limnigramme) et associez là au n\oe{}ud aval du réseau. Ouvrez la fenêtre d'édition des conditions aux limites (\includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"}). Ajoutez deux lignes et rentrez les valeurs suivantes : \begin{center} @@ -271,7 +273,7 @@ Vous pouvez fermer les fen % Cette condition limite se trouve au niveau d'un seuil. % A cet endroit, l'écoulement passe d'un régime fluvial à un régime torentiel. % Nous allons donc calculer une courbe de tarage qui correspond au régime critique de l'écoulement au niveau du seuil. -% Sélectionnez la condition limite et ouvrez la fenêtre \textit{Éditer les conditions aux limites} : (\includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"}). +% Sélectionnez la condition limite et ouvrez la fenêtre \textit{Éditer les conditions aux limites} : (\includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"}). % Dans la fenêtre \textit{Éditer les conditions aux limites} cliquez sur \texttt{[Générer régime critique]} pour générer cette courbe. % Cliquez ensuite sur \texttt{[Rendre croissant]} pour suprimer les points de la courbe qui ne sont pas strictement croissants. % Vous pouvez fermer les fenêtres \textit{Éditer les conditions aux limites} et \textit{Conditions aux limites}. @@ -400,19 +402,19 @@ Si vous r \section{Paramètres du solveur} -Dans la fenêtre principale, cliquez sur \texttt{[Exécuter] => [Parameters numériques des solveurs]}. +Dans la fenêtre principale, cliquez sur \texttt{[Exécuter] => [Paramètres numériques des solveurs]}. Dans la fenêtre \textit{Paramètres du solveur}, sélectionnez l'onglet \texttt{[Mage v8]}. Ces paramètres pilotent le comportement du solveur numérique. -la valeur 999:99:00:00 du temps final indique au solveur de s'arrêter lorsqu'il a atteint un régime permanent. +la valeur {\NoAutoSpacing 999:99:00:00} du temps final indique au solveur de s'arrêter lorsqu'il a atteint un régime permanent. Vous pouvez changer la fréquence d'écriture des résultats dans la ligne \textit{Pas de temps d'écriture dans le fichier .BIN}. -Une valeur inférieure à 1 seconde indique que la valeur de la ligne \textit{Pas de temps d'écriture dans le fichier .TRA} s sera prise à la place. +Une valeur inférieure à 1 seconde indique que la valeur de la ligne \textit{Pas de temps d'écriture dans le fichier .TRA} s sera prise à la place. % En effet, durant la montée du pic de crue, le solveur a besoin de réduire le pas de temps suffisament pour permettre la convergence des itérations. -Pour accélérer les calculs et pour aider le solveur à démarer, nous allons l'autoriser à dégrader la précision, à l'aide des facteurs de réduction de la précision. +Pour accélérer les calculs et pour aider le solveur à démarrer, nous allons l'autoriser à dégrader la précision, à l'aide des facteurs de réduction de la précision. Les précisions internes du solveur sont de 10$^{-9}$. Cette précision est multipliée par le facteur de réduction de la précision : un facteur de 1000 ramènera donc la précision à 10$^{-5}$. Pour utiliser ce facteur de réduction de la précision, il faut donner un \textit{nombre d'itérations à précision maximum} inférieur au \textit{nombre maximum d'itérations} : le solveur va d'abord tenter de converger avec un certain nombre d'itératons à la précision maximum avant de basculer sur une précision dégradée pour le reste des itérations. Dans notre cas, c'est nécessaire pour lancer le solveur à partir de la condition initiale calculée par Pamhyr2. -rentrez 1000 dans les trois lignes \textit{facteurs de réduction de la précision}, rentrez 99 pour le \textit{Nombre d'itérations} et 5 pour le \textit{nombre d'itérations à la précision maximum}. +Rentrez 1000 dans les trois lignes \textit{facteurs de réduction de la précision}, rentrez 99 pour le \textit{Nombre maximum d'itérations} et 5 pour le \textit{nombre d'itérations à la précision maximum}. Gardez les autres paramètres du solveur par défaut. Fermer la fenêtre \textit{Paramètres du solveur}. @@ -426,12 +428,13 @@ Cette fen \section{Visualiser les résultats} -il est aussi possible d'ouvrir la fenêtre \textit{Résultats} si vous avez fermé la fenêtre \textit{Log du solveur}, en cliquant sur \texttt{[Résultats] => [Visualiser les derniers résultats]} à partir de la fenêtre principale. +Il est aussi possible d'ouvrir la fenêtre \textit{Résultats} si vous avez fermé la fenêtre \textit{Log du solveur}, en cliquant sur \texttt{[Résultats] => [Visualiser les derniers résultats]} à partir de la fenêtre principale. Le panneau supérieur vous permet de sélectionner le bief, le panneau inférieur gauche vous permet de sélectionner une section dans ce bief. Les trois diagrammes sur la droite montrent le bief et la section en travers de la même manière que dans la fenêtre \textit{Géométrie}. Vous pouvez utiliser le curseur du bas pour visualiser les résultats à différents pas de temps. Les croix rouges dans les deux vues du haut correspondent aux points ou l'eau déborde de la géométrie au moins une fois dans la simulation. En pratique il n'y a pas de perte de volume par débordement en dehors du modèle, car le solveur ajoute un mur virtuel aux extrémités des sections. + Pour visualiser le débit, passez à l'onglet \textit{Hydrogramme}. Pour créer des tracés 2D personnalisés, cliquez sur le bouton \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/add.png} en haut à gauche de la fenêtre. Sélectionnez les valeurs que vous voulez sur les axes $X$ et $Y$ et cliquez sur \texttt{[OK]}. @@ -440,4 +443,3 @@ Le bouton \includegraphics[width=0.5cm]{../../../src/View/ui/ressources/export.p \pagebreak{} \end{document} - diff --git a/doc/users/Tuto1/step1.pamhyr b/doc/users/Tuto1/step1.pamhyr index 1808572d116fb8aeee88abc90da6846be1df9866..687fe288533a1d0520500ba6ff1698b69310201e 100644 GIT binary patch delta 195 zcmZo@;A&{#+Q2R#$iV-O-;>XY{~-TX{z?3K{E-_QwfHtW$!RgFnHVauGi&PSBo>#% z7bljb#-}8fq#BwVSr}WInOYd=8JQRx85wV$B(GLr#lXS9$jr>h$jHplY0uERo{5=R zh!G~n#L%`3D9psf#LvXRzzI~x$;r?(5h%*U$GrJdzsLoSl??nZ_)qe$+$?A?n}7O> md`5dwF`$|9oJ>G71M>4qf?Ny@3~QR(|K>Ap|C`UmEC2u>DlfzU delta 196 zcmZo@;A&{#+Q2R#$jJYW-;>XY{~-TX{z?4#{E-_QwfHtW$!RgF8C&uzvNLPy<|G!E z#1|))rN*ZumZTb*8<|^}T9{dy>zNuDo11N(B(GLr#lpeB$jr>h$jHplY0uERo{5=R zh!rNr#L%`3D9psf#LvdTzzI~x$;r?(5h%*U$G-VfzsLoS6%72(`A_h#*eqx;i+}pc nd`5dQaRv?sc}|d-0r`0)K`w>{h71i%?SJzbxBty&Vio`ZJ`pcV From 69f40748e5ae48c2c8ae2404155ff55eea722bca Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Tue, 15 Oct 2024 10:24:40 +0200 Subject: [PATCH 02/19] doc: dev: Update wine runner environement creation and minor change. --- doc/dev/documentation.org | 203 +++++++++++++++++++++++--------------- doc/tools/PamhyrDoc.cls | 4 + doc/tools/macro.org | 24 ++++- 3 files changed, 149 insertions(+), 82 deletions(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index f7285945..7e96edc4 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -28,20 +28,6 @@ #+OPTIONS: toc:t #+LANGUAGE: UKenglish -#+NAME: attr_wrap -#+HEADER: :var width="\\textwidth" -#+HEADER: :var caption="" -#+HEADER: :var smallcaption="" -#+HEADER: :var name="" -#+HEADER: :var data="" -#+HEADER: :var float="nil" -#+BEGIN_SRC sh :results output :exports none - echo "#+CAPTION[$smallcaption]: $caption" - echo "#+NAME: $name" - echo "#+ATTR_LATEX: :width $width :float $float" - echo "$data" -#+END_SRC - #+BEGIN_abstract This document is for the use of developers. It describes the project architecture, the tools available to assist development and @@ -54,13 +40,13 @@ documentation, translations or code. * Introduction -Pamhyr2 is free and open source software (FOSS) graphical user +{{{pamhyr2}}} is free and open source software (FOSS) graphical user interface (GUI) for 1D hydro-sedimentary modelling of rivers developed in Python (with version 3.8). It use PyQt at version 5 and matplotlib in version 3.4.1 or later for the user insterface (see {{{file(/requirements.txt)}}} for details). The architecture of project code follow the Qt Model/View architecture [fn:qt-arch] (see -details in section [[Architecture]]). Pamhyr2 packages can be build +details in section [[Architecture]]). {{{pamhyr2}}} packages can be build manually (see section [[Building packages]]), but there are automatically build with the gitlab-ci (see the section [[Setup the CI environment]]). Documentation files are written with org-mode[fn:org], @@ -75,7 +61,7 @@ https://doc.qt.io/qt-5/model-view-programming.html (last access * Architecture -Pamhyr2's architecture is based on Qt Model/View, see Figure +{{{pamhyr2}}}'s architecture is based on Qt Model/View, see Figure [[graph-architecture]]. It is made up of several different components: the model (in blue), the graphical components (in red), the actions/delegates (in green), the commands (in purple), the solvers @@ -178,7 +164,7 @@ https://doc.qt.io/qt-5/model-view-programming.html ** Model -The model is a set of Python classes. In Pamhyr2, this classes must +The model is a set of Python classes. In {{{pamhyr2}}}, this classes must respect some constraint. Each model class must inherits =Model.Tools.SQLSubModel= abstract class, except the =Model.Study= class who inherits =Model.Tools.SQLModel= (see [[SQL]]). @@ -456,12 +442,12 @@ of Bar (Listing [[sql-bar]] and [[sql-foo]]). bar._sql_save(execute, data=data) #+end_src -Let see the results database scheme for Pamhyr2 at version v0.0.7 in +Let see the results database scheme for {{{pamhyr2}}} at version v0.0.7 in Figure [[sql_schema]]. #+NAME: sql_schema #+ATTR_LATEX: :width 16cm -#+CAPTION: SQLite database scheme at Pamhyr2 version v0.0.7 (generate with [[https://gitlab.com/Screwtapello/sqlite-schema-diagram]]) +#+CAPTION: SQLite database scheme at {{{pamhyr2}}} version v0.0.7 (generate with [[https://gitlab.com/Screwtapello/sqlite-schema-diagram]]) [[./images/schema_v0.0.7.png]] @@ -486,7 +472,7 @@ PamhyrModelList but use a dictionary instead of list. ** View -Pamhyr2 use Qt as graphical user interface library with the +{{{pamhyr2}}} use Qt as graphical user interface library with the application "Qt designer" for windows or widget creation (see [[UI file]]) and "Qt linguist" for interface translate (see [[Translate]]). In addition, we use matplotlib as ploting library (see [[Plot]]). @@ -501,11 +487,11 @@ componant translate, and possible other files or sub-directories. *** UI file -We define as possible all Pamhyr2 windows and custom widgets with "Qt -designer". This application generate UI file who describes interface -organisation with table, layout, button, etc. This method is faster -than hand made windows and widget creation, and saves us some purely -descriptive code. The UI files are saved into =src/View/ui= for +We define as possible all {{{pamhyr2}}} windows and custom widgets +with "Qt designer". This application generate UI file who describes +interface organisation with table, layout, button, etc. This method is +faster than hand made windows and widget creation, and saves us some +purely descriptive code. The UI files are saved into =src/View/ui= for window, and =/src/View/ui/Widgets= for custom widget. *** Translate @@ -533,10 +519,11 @@ window, and =/src/View/ui/Widgets= for custom widget. *** Window -The abstract class PamhyrWindow and PamhyrDialog are used for most of -Pamhyr2 window. These class allow to create an window for Pamhyr2 GUI -and implemente some useful methods. The super class method difine some -generic value from optional parameters, for examples: +The abstract class =PamhyrWindow= and =PamhyrDialog= are used for most +of {{{pamhyr2}}} window. These class allow to create an window for +{{{pamhyr2}}} GUI and implemente some useful methods. The super class +method difine some generic value from optional parameters, for +examples: - =self._study=: The study giving in constructor parameters =study= (typically a =Model.Study= class object) - =self._config=: The configuration giving in constructor parameters @@ -546,7 +533,7 @@ generic value from optional parameters, for examples: object) #+NAME: window -#+CAPTION: Example of Pamhyr2 window +#+CAPTION: Example of {{{pamhyr2}}} window #+begin_src python :python python3 :results output :noweb yes from View.Tools.PamhyrWindow import PamhyrWindow from View.My.Translate import MyTranslate @@ -593,7 +580,7 @@ window componants or connections. *** Table -An abstract class PamhyrTableModel is available to define a simple +An abstract class =PamhyrTableModel= is available to define a simple QAbstractTableModel shortly. In simple cases, there are only =data= and =setData= methode to implement, but the constructor needs more information than a classic QAbstractTableModel class. @@ -654,7 +641,7 @@ class AddNodeCommand(QUndoCommand): All undo command must be push into a =QUndoStack= (see Listing [[undo-cmd-push]]) to perform the action and allow user undo and redo this -action. In PamhyrWindow (and PamhyrDialog) the undo stack is +action. In =PamhyrWindow= (and =PamhyrDialog=) the undo stack is automatically create if the option ="undo"= is activate at window creation, this stack is accessible at =self._undo_stack=. @@ -672,7 +659,7 @@ creation, this stack is accessible at =self._undo_stack=. *** Plot To define a new plot you can create a class who inherit to -PamhyrPlot. The creator need at leaste five argument: +=PamhyrPlot=. The creator need at leaste five argument: - A =canvas= of type =MplCanvas= - A (optional) =trad= of type =PamhyrTranslate= - A =data= used in =draw= and =update= to create and update the plot @@ -719,8 +706,8 @@ data has changed. ** Solver -The Pamhyr2 architecture allow to define multiple solver. A solver is -define by a: +The {{{pamhyr2}}} architecture allow to define multiple solver. A +solver is define by a: - type - name - description, @@ -736,11 +723,11 @@ different solver type, this solver type implement the code for export study to solver input format, and read the solver output to study results. There exists a generic solver with a generic input and output format, the type could be use to use a solver not implemented in -Pamhyr2, but this solver must can read/write input and output generic -format or use external script. There is possible to define different -solver with the same type, for example two differents version of the -same solver. Finaly, with input and output formater is possible to -execute a code on distant computer, for example, over ssh. +{{{pamhyr2}}}, but this solver must can read/write input and output +generic format or use external script. There is possible to define +different solver with the same type, for example two differents +version of the same solver. Finaly, with input and output formater is +possible to execute a code on distant computer, for example, over ssh. #+name: graph-multi-solver #+header: :results drawer @@ -857,8 +844,8 @@ solver and get results: - (2.1) The solver read the input file(s) - (2.2) The solver compute results and write it to solver output file(s) - - (3) Pamhyr2 create a =Results= object - - (3.1) The Pamhyr2 solver class read solver output file(s) and + - (3) {{{pamhyr2}}} create a =Results= object + - (3.1) The {{{pamhyr2}}} solver class read solver output file(s) and complete Results with readed data #+name: graph-pipeline @@ -976,7 +963,7 @@ the temporal order of action is prensented in Figure } #+end_src -To implement a Solver in Pamhyr2, there exists a abstract class +To implement a Solver in {{{pamhyr2}}}, there exists a abstract class =Solver.AbstractSolver=. A class who herits this class, must implement different methods: - =export=: Export the study to solver input file(s) @@ -987,7 +974,7 @@ different methods: ** Unit tests -A very small part of Pamhyr2 has unit test. This part is limited to the Model. +A very small part of {{{pamhyr2}}} has unit test. This part is limited to the Model. #+begin_src shell python3 -m venv test @@ -1000,9 +987,9 @@ A very small part of Pamhyr2 has unit test. This part is limited to the Model. ** The debug mode -To activate an deactivate the Pamhyr2 debug mode you can open the -configuration window and type "Ctrl+G" or run Pamhyr2 with command -line: +To activate an deactivate the {{{pamhyr2}}} debug mode you can open +the configuration window and type "Ctrl+G" or run {{{pamhyr2}}} with +command line: #+begin_src shell ./Pamhyr2 debug #+end_src @@ -1015,7 +1002,7 @@ data base file. #+NAME: debug-repl #+ATTR_LATEX: :width 14cm -#+CAPTION: Pamhyr2 debug Python REPL +#+CAPTION: {{{pamhyr2}}} debug Python REPL [[./images/python-debug-repl.png]] * Build the project @@ -1028,7 +1015,7 @@ to build packages manually. If you need an hand made package, you can script available in {{{file(packages)}}} directory. -*** GNU/Linux +*** GNU/Linux {{{linux}}} On GNU/Linux building GNU/Linux packages is easy, you just need python in version 3.8 must be installed with venv and pyinstaller packages @@ -1050,7 +1037,7 @@ cd packages ./linux.sh #+end_src -*** Windows +*** Windows {{{windows}}} To make the Windows packages you have two choice: If you use Windows you can use the script {{{file(packages/windows.bat)}}}, other else @@ -1065,10 +1052,10 @@ winetricks installed. ** Setup the CI environment -Pamhyr2 need a Linux ci-runner and a Windows ci-runner for building +{{{pamhyr2}}} need a Linux ci-runner and a Windows ci-runner for building package. The windows ci-runner could run on a Wine environement. -*** Linux +*** Linux {{{linux}}} The Linux ci-runner need some software and dependencies in addtion of gitlab-ci. @@ -1078,10 +1065,11 @@ gitlab-ci. emacs emacs-goodies-el \ texlive-full \ python3.8 python3.8-venv + sudo python3 -m pip install pyinstaller #+end_src -*** Windows (Wine) +*** Windows (Wine) {{{windows}}} The ci-runner environment for Wine need at least wine version 8, let [[https://www.numetopia.fr/comment-installer-wine-sur-ubuntu-ou-linux-mint/][see who to add wine official depot to your linux distribution]]. @@ -1090,18 +1078,77 @@ The ci-runner environment for Wine need at least wine version 8, let sudo apt install wine-stable winetricks #+end_src -In addition, the environment need windows version of: - - [[https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe][Python 3.8.10]] - - Git - - PowerShell - - Gitlab-ci +**** Setup environment + +Export Wine environment variable to set wine as 64 bits architecture +and set the correct path for wine environment. + +#+begin_src shell + export WINARCH=win64 + export WINEPREFIX=$PWD/my-wine-runner-prefix +#+end_src + +Setup Wine environment to Windows 10 and install the minimal fonts +with =winetricks=. + +#+begin_src shell + winetricks corefonts win10 +#+end_src + +**** Install dependencies + +First install 7zip with help of =winetricks=. + +#+begin_src shell + winetricks 7zip +#+end_src + +In addition, install in the environment the Windows version of: + - [[https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe][Python 3.8.10]] (ensure the python path is set and Pip is enable) + - [[https://git-scm.com/downloads][Git]] + - [[https://github.com/PowerShell/PowerShell/releases/download/v7.0.1/PowerShell-7.0.1-win-x64.msi][PowerShell]] - [[https://freefr.dl.sourceforge.net/project/nsis/NSIS%203/3.08/nsis-3.08-setup.exe][Nsis]] +To run a Windows executable into wine environement, use =wine64= command: + +#+begin_src shell + wine64 +#+end_src + Now, we can install =pyinstaller= on this windows environment: #+begin_src shell wine python -m pip install pyinstaller #+end_src +Now, we can download [[https://docs.gitlab.com/runner/install/windows.html][Gitlab-ci]] runner for Windows an put it in the +current path. + +**** Setup runner + +You can configure the runner with command: + +#+begin_src shell + wine64 gitlab-runner-windows-amd64.exe register +#+end_src + +**** Run the runner + +Create a new executable shell script =runner.sh= with following lines: + +#+begin_src shell + #! /bin/sh + + export WINARCH=win64 + export WINEPREFIX=$PWD/my-wine-runner-prefix + + wine64 gitlab-runner-windows-amd64.exe run +#+end_src + +Now you can run the runner with command =./runner.sh=. + +{{{bulb}}} You can run this command into a =screen= terminal, detach +the terminal and disconnect from runner machine to keep runner alive. + * Documentation files This document and the user documentation are org files. This text file @@ -1284,23 +1331,23 @@ Some org-mode configuration used in documentations files are define in * How to contribute? -Pamhyr2 is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License[fn:license], either -version 3 of the License, or any later version. +{{{pamhyr2}}} is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License[fn:license], +either version 3 of the License, or any later version. [fn:license] The GPLv3 web page: https://www.gnu.org/licenses/gpl-3.0.en.html ** Guidelines -To contribute to Pamhyr2, we expect a minimum of respect between +To contribute to {{{pamhyr2}}}, we expect a minimum of respect between contributors. We therefore ask you to respect the following rules regarding communication and contribution content: + No gender, racial, religious or social discrimination + No insults, personal attacks or potentially offensive remarks -+ Pamhyr2 is free software, and intended to remain so, so take care - with the licensing of libraries and external content you want to add - to the project ++ {{{pamhyr2}}} is free software, and intended to remain so, so take + care with the licensing of libraries and external content you want + to add to the project + Humour or hidden easter eggs are welcome if they respect the previous rules @@ -1311,11 +1358,12 @@ an issue on the project's gitlab page[fn:p2-gitlab], or you can create a merge request on the same page with the changes you have made to the code, translation or documentation. -The Pamhyr2 copyright is owned by INRAE[fn:inrae], but we keep a -record of each contributors. If you made a modification to pamhyr2 -software, please add your name at the end of {{{file(AUTHORS)}}} file -and respect the Listing [[auth-format]] format. You can update this file -information for following contribution. +The {{{pamhyr2}}} copyright is owned by INRAE[fn:inrae], but we keep a +record of each contributors. If you made a modification to +{{{pamhyr2}}} software, please add your name at the end of +{{{file(AUTHORS)}}} file and respect the Listing [[auth-format]] +format. You can update this file information for following +contribution. #+NAME: auth-format #+CAPTION: =AUTHORS= file format @@ -1326,16 +1374,17 @@ information for following contribution. #+CAPTION: Current =AUTHORS= file #+INCLUDE: "../../AUTHORS" src text -[fn:p2-gitlab] The Pamhyr2 Gitlab project page: +[fn:p2-gitlab] The {{{pamhyr2}}} Gitlab project page: https://gitlab.irstea.fr/theophile.terraz/pamhyr [fn:inrae] The INRAE web site: https://www.inrae.fr/ ** Translate You can improve or add translation for the project. To contribute to -Pamhyr2 translate, you need to use Qt Linguist[fn:qt-linguist]. Open -Qt-linguist and edit the translation ({{{file(.ts)}}}) file, finally, -commit the new version of file and make a merge request. +{{{pamhyr2}}} translate, you need to use Qt +Linguist[fn:qt-linguist]. Open Qt-linguist and edit the translation +({{{file(.ts)}}}) file, finally, commit the new version of file and +make a merge request. If you want add a new language, edit the script {{{file(src/lang/create_ts.sh)}}} like Listing [[ts-it]]. Run the script @@ -1344,7 +1393,7 @@ and open the new file with Qt-linguist, setup target language (Figure file and make a merge request. #+NAME: ts-it -#+CAPTION: Example of modified {{{file(src/lang/create_ts.sh)}}} to add italian (it) translate for Pamhyr2 +#+CAPTION: Example of modified {{{file(src/lang/create_ts.sh)}}} to add italian (it) translate for {{{pamhyr2}}} #+begin_src shell ... LANG="fr it" @@ -1362,7 +1411,7 @@ https://doc.qt.io/qt-5/qtlinguist-index.html (last access 2023-09-18) ** Code contribution If you are developper you can improve and/or add features to -Pamhyr2. Please, follow the architecture described in section +{{{pamhyr2}}}. Please, follow the architecture described in section [[Architecture]] as closely as possible. Keep the code simple, clear and efficient as possible. The master branch is reserved for the project maintainer; you can create a new branch or fork the project before the diff --git a/doc/tools/PamhyrDoc.cls b/doc/tools/PamhyrDoc.cls index a5883720..431f8942 100644 --- a/doc/tools/PamhyrDoc.cls +++ b/doc/tools/PamhyrDoc.cls @@ -163,3 +163,7 @@ \SetWatermarkScale{3} \SetWatermarkFontSize{1cm} \SetWatermarkText{Work in progress} + +%% Icons + +\usepackage{fontawesome5} diff --git a/doc/tools/macro.org b/doc/tools/macro.org index 9c59153f..87cf15c8 100644 --- a/doc/tools/macro.org +++ b/doc/tools/macro.org @@ -17,11 +17,15 @@ # -*- coding: utf-8 -*- # Constant name -#+MACRO: oldPamhyr PAMHyR -#+MACRO: Pamhyr Pamhyr2 -#+MACRO: Mage Mage -#+MACRO: Rubarbe RubarBE -#+MACRO: Inrae INRAE +#+MACRO: pamhyr \textsc{PAMHyR} +#+MACRO: pamhyr2 \textsc{Pamhyr2} +#+MACRO: mage \textsc{Mage} +#+MACRO: mage7 \textsc{Mage7} +#+MACRO: mage8 \textsc{Mage8} +#+MACRO: rubarbe \textsc{RubarBE} +#+MACRO: adists \textsc{AdisTS} +#+MACRO: mascaret \textsc{Mascaret} +#+MACRO: inrae INRAE #+MACRO: latex \LaTeX # Information @@ -35,6 +39,16 @@ #+MACRO: cite [cite:$1] #+MACRO: biblio \bibliography{documentation} +# Icons +#+MACRO: bulb \faIcon{lightbulb} +#+MACRO: OK \faIcon{check} + +#+MACRO: linux \faIcon{linux} +#+MACRO: windows \faIcon{windows} + +#+MACRO: python \faIcon{python} +#+MACRO: java \faIcon{java} + # Wrapper #+NAME: attr_wrap #+HEADER: :var width="\\textwidth" From a19ab7aa79a6d766717fddf2e4b3e5d0ab2f13f3 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 10:31:11 +0100 Subject: [PATCH 03/19] debug rubar --- src/Solver/CommandLine.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Solver/CommandLine.py b/src/Solver/CommandLine.py index 5f706d1a..18a237ed 100644 --- a/src/Solver/CommandLine.py +++ b/src/Solver/CommandLine.py @@ -99,7 +99,10 @@ class CommandLineSolver(AbstractSolver): params = study.river.get_params(self.type) args = params.get_by_key("all_command_line_arguments") - return args.split(" ") + if args is None: + return [] + else: + return args.split(" ") def input_param(self): """Return input command line parameter(s) From 77baba08935e8aba3db692fa5f5a75d6e93456f3 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 12:00:11 +0100 Subject: [PATCH 04/19] add XY geom view in main window --- src/View/MainWindowTabInfo.py | 35 ++++++++++ src/View/PlotXY.py | 119 ++++++++++++++++++++++++++++++++++ src/View/Translate.py | 5 +- 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 src/View/PlotXY.py diff --git a/src/View/MainWindowTabInfo.py b/src/View/MainWindowTabInfo.py index f655d799..2dd9881a 100644 --- a/src/View/MainWindowTabInfo.py +++ b/src/View/MainWindowTabInfo.py @@ -20,8 +20,13 @@ import logging from tools import timer, trace +from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar +from View.Tools.Plot.PamhyrCanvas import MplCanvas +from View.PlotXY import PlotXY from View.Tools.PamhyrWidget import PamhyrWidget +from PyQt5.QtWidgets import QVBoxLayout + logger = logging.getLogger() @@ -38,7 +43,9 @@ class WidgetInfo(PamhyrWidget): parent=parent ) + self.parent = parent self.set_initial_values() + self.setup_graph() @property def study(self): @@ -64,6 +71,25 @@ class WidgetInfo(PamhyrWidget): self.set_label_text("label_lc", "-") self.set_label_text("label_hs", "-") + def setup_graph(self): + self.canvas = MplCanvas(width=5, height=4, dpi=100) + self.canvas.setObjectName("canvas") + self.plot_layout_xy = self.find(QVBoxLayout, "verticalLayout") + self._toolbar_xy = PamhyrPlotToolbar( + self.canvas, self, + items=["home", "zoom", "save", "iso", "back/forward", "move"] + ) + self.plot_layout_xy.addWidget(self._toolbar_xy) + self.plot_layout_xy.addWidget(self.canvas) + + self.plot = PlotXY( + canvas=self.canvas, + data=None, + trad=self.parent._trad, + toolbar=self._toolbar_xy, + parent=self + ) + def update(self): if self._study is None: self.set_initial_values() @@ -75,6 +101,15 @@ class WidgetInfo(PamhyrWidget): self.set_network_values() self.set_geometry_values() + self.plot = PlotXY( + canvas=self.canvas, + data=self._study.river.enable_edges(), + trad=self.parent._trad, + toolbar=self._toolbar_xy, + parent=self + ) + self.plot.update() + def set_network_values(self): river = self._study.river diff --git a/src/View/PlotXY.py b/src/View/PlotXY.py new file mode 100644 index 00000000..07ae3fad --- /dev/null +++ b/src/View/PlotXY.py @@ -0,0 +1,119 @@ +# PlotXY.py -- Pamhyr +# Copyright (C) 2023-2024 INRAE +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# -*- coding: utf-8 -*- + +from tools import timer, trace +from View.Tools.PamhyrPlot import PamhyrPlot +from matplotlib import collections +import numpy as np + +from PyQt5.QtCore import ( + QCoreApplication, Qt, QItemSelectionModel, + QItemSelection, QItemSelectionRange, +) +from PyQt5.QtWidgets import QApplication, QTableView + +_translate = QCoreApplication.translate + + +class PlotXY(PamhyrPlot): + def __init__(self, canvas=None, trad=None, data=None, toolbar=None, + table=None, parent=None): + super(PlotXY, self).__init__( + canvas=canvas, + trad=trad, + data=data, + toolbar=toolbar, + table=table, + parent=parent + ) + + self._data = data + self.label_x = self._trad["x"] + self.label_y = self._trad["y"] + self.parent = parent + + self._isometric_axis = True + + self._auto_relim_update = True + self._autoscale_update = True + + @timer + def draw(self): + self.init_axes() + + if self._data is None: + self.idle() + return + + if len(self._data) < 1: + self.idle() + return + + self.line_lr = [] + for data in self._data: + if data.reach.number_profiles != 0: + self.draw_xy(data.reach) + self.draw_lr(data.reach) + self.idle() + return + + def draw_xy(self, reach): + line_xy = [] + for xy in zip(reach.get_x(), reach.get_y()): + line_xy.append(np.column_stack(xy)) + + line_xy_collection = collections.LineCollection( + line_xy, + colors=self.color_plot_river_bottom + ) + self.canvas.axes.add_collection(line_xy_collection) + + def draw_lr(self, reach): + lx = [] + ly = [] + rx = [] + ry = [] + + for x, y in zip(reach.get_x(), + reach.get_y()): + lx.append(x[0]) + ly.append(y[0]) + + rx.append(x[-1]) + ry.append(y[-1]) + + line = self.canvas.axes.plot( + lx, ly, + color=self.color_plot_river_bottom, + linestyle="dotted", + lw=1., + ) + self.line_lr.append(line) + + line = self.canvas.axes.plot( + rx, ry, + color=self.color_plot_river_bottom, + linestyle="dotted", + lw=1., + ) + self.line_lr.append(line) + + @timer + def update(self): + self.draw() + self.update_idle() diff --git a/src/View/Translate.py b/src/View/Translate.py index eb289f6a..e39279e5 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -73,8 +73,7 @@ class UnitTranslate(CommonWordTranslate): self._dict["unit_date_s"] = _translate("Unit", "Date (sec)") self._dict["unit_date_iso"] = _translate("Unit", "Date (ISO format)") - - self._dict["unit_wet_area"] = _translate("Unit", "Wet Area (m^2)") + self._dict["unit_wet_area"] = _translate("Unit", "Wet Area (m²)") self._dict["unit_wet_perimeter"] = _translate( "Unit", "Wet Perimeter (m)" ) @@ -133,3 +132,5 @@ class MainTranslate(UnitTranslate): "MainWindow", "Do you want to save current study before closing it?" ) + self._dict["x"] = _translate("MainWindow", "X (m)") + self._dict["y"] = _translate("MainWindow", "Y (m)") From 15da23183b38fc1b8cc24f3579ef40b37528664e Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 15:38:43 +0100 Subject: [PATCH 05/19] debug VAR --- doc/users/Tuto1/data/Hogneau.var | 1 - doc/users/Tuto1/step3.pamhyr | Bin 229376 -> 172032 bytes src/Solver/Mage.py | 51 ++++++++++++++++++++++--------- src/View/Results/PlotXY.py | 22 ++++++++++--- 4 files changed, 54 insertions(+), 20 deletions(-) delete mode 100644 doc/users/Tuto1/data/Hogneau.var diff --git a/doc/users/Tuto1/data/Hogneau.var b/doc/users/Tuto1/data/Hogneau.var deleted file mode 100644 index 33b537e6..00000000 --- a/doc/users/Tuto1/data/Hogneau.var +++ /dev/null @@ -1 +0,0 @@ -$Clapet_001 clapet \ No newline at end of file diff --git a/doc/users/Tuto1/step3.pamhyr b/doc/users/Tuto1/step3.pamhyr index 00a39e3a44170e11157d417d529b9238a17d726a..49eb6beed088718d3dee8f1777f2e0e3fec52904 100644 GIT binary patch literal 172032 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

4%v*xYf@!H1;2 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".replace(" ", "0") + if not hs.input_reach.is_enable(): + continue - f.write( - f"${name} clapet" - ) + if not hs.enabled: + continue + for bhs in hs.basic_structures: + logger.info(bhs._type) + if bhs._type != "CV": + continue + + name = bhs.name + if name == "": + name = f"HS_{bhs.id:>3}".replace(" ", "0") + + f.write( + f"${name} clapet" + ) return files def _export_DEV(self, study, repertory, qlog, name="0"): diff --git a/src/View/Results/PlotXY.py b/src/View/Results/PlotXY.py index 8ae76c04..615e96d5 100644 --- a/src/View/Results/PlotXY.py +++ b/src/View/Results/PlotXY.py @@ -146,8 +146,9 @@ class PlotXY(PamhyrPlot): return reach = self.results.river.reach(self._current_reach_id) + reaches = self.results.river.reachs - self.draw_profiles(reach) + self.draw_profiles(reach, reaches) self.draw_water_elevation(reach) self.draw_water_elevation_max(reach) self.draw_guide_lines(reach) @@ -156,12 +157,12 @@ class PlotXY(PamhyrPlot): self.idle() self._init = True - def draw_profiles(self, reach): + def draw_profiles(self, reach, reaches): if reach.geometry.number_profiles == 0: self._init = False return - - self.line_xy = [] + # TODO uncomment to draw all the reaches + # self.draw_other_profiles(reaches) for xy in zip(reach.geometry.get_x(), reach.geometry.get_y()): self.line_xy.append(np.column_stack(xy)) @@ -176,6 +177,19 @@ class PlotXY(PamhyrPlot): ) self.canvas.axes.add_collection(self.line_xy_collection) + def draw_other_profiles(self, reaches): + + for reach in reaches: + for xy in zip(reach.geometry.get_x(), + reach.geometry.get_y()): + self.line_xy.append(np.column_stack(xy)) + + self.line_xy_collection = collections.LineCollection( + self.line_xy, + colors=self.color_plot_river_bottom, + ) + self.canvas.axes.add_collection(self.line_xy_collection) + def draw_guide_lines(self, reach): x_complete = reach.geometry.get_guidelines_x() y_complete = reach.geometry.get_guidelines_y() From c4e965a631739789701ced441986397cf1b6826b Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 17:12:20 +0100 Subject: [PATCH 06/19] cleaning --- src/Solver/Mage.py | 4 ++-- src/View/Results/PlotXY.py | 2 +- src/View/Results/Window.py | 7 +++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py index 98eb0bca..ce7423a2 100644 --- a/src/Solver/Mage.py +++ b/src/Solver/Mage.py @@ -599,7 +599,6 @@ class Mage(CommandLineSolver): if qlog is not None: qlog.put("Export VAR file") - nb_cv = 0 for hs in hydraulic_structures: if hs.input_reach is None: @@ -618,7 +617,8 @@ class Mage(CommandLineSolver): nb_cv += 1 if nb_cv != 0: - with mage_file_open(os.path.join(repertory, f"{name}.VAR"), "w+") as f: + with mage_file_open(os.path.join( + repertory, f"{name}.VAR"), "w+") as f: files.append(f"{name}.VAR") for hs in hydraulic_structures: diff --git a/src/View/Results/PlotXY.py b/src/View/Results/PlotXY.py index 615e96d5..290259f0 100644 --- a/src/View/Results/PlotXY.py +++ b/src/View/Results/PlotXY.py @@ -181,7 +181,7 @@ class PlotXY(PamhyrPlot): for reach in reaches: for xy in zip(reach.geometry.get_x(), - reach.geometry.get_y()): + reach.geometry.get_y()): self.line_xy.append(np.column_stack(xy)) self.line_xy_collection = collections.LineCollection( diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index eb4684cf..661d25d6 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -606,11 +606,17 @@ class ResultsWindow(PamhyrWindow): def export_to(self, filename, x, y): timestamps = sorted(self._results.get("timestamps")) + reach = self._results.river.reachs[self._get_current_reach()] + first_line = [f"Study: {self._results.study.name}", + f"Reach: {reach.name}"] if x == "rk": timestamp = self._get_current_timestamp() + first_line.append(f"Time: {timestamp}s") val_dict = self._export_rk(timestamp, y, filename) elif x == "time": profile = self._get_current_profile() + pname = profile.name if profile.name != "" else profile.rk + first_line.append(f"Profile: {pname}") val_dict = self._export_time(profile, y, filename) with open(filename, 'w', newline='') as csvfile: @@ -619,6 +625,7 @@ class ResultsWindow(PamhyrWindow): dict_x = self._trad.get_dict("values_x") dict_y = self._trad.get_dict("values_y") header = [dict_x[x]] + writer.writerow(first_line) for text in y: header.append(dict_y[text]) writer.writerow(header) From 36597d9b3dfac7972ba3801c08635f7f0c10e081 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 17:24:20 +0100 Subject: [PATCH 07/19] debug IC --- src/View/InitialConditions/Window.py | 69 +++++++++++++++------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py index add3f1a7..f7397def 100644 --- a/src/View/InitialConditions/Window.py +++ b/src/View/InitialConditions/Window.py @@ -365,40 +365,43 @@ class InitialConditionsWindow(PamhyrWindow): self._update() def generate_growing_constant_depth(self): - dlg = DepthDialog(self.depth_value, - self.depth_option, - trad=self._trad, - parent=self) - if dlg.exec(): - self.depth_value = dlg.value - self.depth_option = dlg.option - self._table.generate("growing", - self.depth_value, - self.depth_option) - self._update() + if self._reach.reach.number_profiles > 0: + dlg = DepthDialog(self.depth_value, + self.depth_option, + trad=self._trad, + parent=self) + if dlg.exec(): + self.depth_value = dlg.value + self.depth_option = dlg.option + self._table.generate("growing", + self.depth_value, + self.depth_option) + self._update() def generate_discharge(self): - dlg = DischargeDialog(self.discharge_value, - self.discharge_option, - trad=self._trad, - parent=self) - if dlg.exec(): - self.discharge_value = dlg.value - self.discharge_option = dlg.option - self._table.generate("discharge", - self.discharge_value, - self.discharge_option) - self._update() + if self._reach.reach.number_profiles > 1: + dlg = DischargeDialog(self.discharge_value, + self.discharge_option, + trad=self._trad, + parent=self) + if dlg.exec(): + self.discharge_value = dlg.value + self.discharge_option = dlg.option + self._table.generate("discharge", + self.discharge_value, + self.discharge_option) + self._update() def generate_height(self): - dlg = HeightDialog(self.height_values, - self.height_option, - trad=self._trad, - parent=self) - if dlg.exec(): - self.height_values = dlg.values - self.height_option = dlg.option - self._table.generate("height", - self.height_values, - self.height_option) - self._update() + if self._reach.reach.number_profiles > 0: + dlg = HeightDialog(self.height_values, + self.height_option, + trad=self._trad, + parent=self) + if dlg.exec(): + self.height_values = dlg.values + self.height_option = dlg.option + self._table.generate("height", + self.height_values, + self.height_option) + self._update() From e6b36f3fe5fddcffc92d7449095f75d930fcf055 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 17:29:01 +0100 Subject: [PATCH 08/19] pep8 --- src/View/InitialConditions/Window.py | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py index f7397def..573dd4b6 100644 --- a/src/View/InitialConditions/Window.py +++ b/src/View/InitialConditions/Window.py @@ -367,41 +367,41 @@ class InitialConditionsWindow(PamhyrWindow): def generate_growing_constant_depth(self): if self._reach.reach.number_profiles > 0: dlg = DepthDialog(self.depth_value, - self.depth_option, - trad=self._trad, - parent=self) + self.depth_option, + trad=self._trad, + parent=self) if dlg.exec(): self.depth_value = dlg.value self.depth_option = dlg.option self._table.generate("growing", - self.depth_value, - self.depth_option) + self.depth_value, + self.depth_option) self._update() def generate_discharge(self): if self._reach.reach.number_profiles > 1: dlg = DischargeDialog(self.discharge_value, - self.discharge_option, - trad=self._trad, - parent=self) + self.discharge_option, + trad=self._trad, + parent=self) if dlg.exec(): self.discharge_value = dlg.value self.discharge_option = dlg.option self._table.generate("discharge", - self.discharge_value, - self.discharge_option) + self.discharge_value, + self.discharge_option) self._update() def generate_height(self): if self._reach.reach.number_profiles > 0: dlg = HeightDialog(self.height_values, - self.height_option, - trad=self._trad, - parent=self) + self.height_option, + trad=self._trad, + parent=self) if dlg.exec(): self.height_values = dlg.values self.height_option = dlg.option self._table.generate("height", - self.height_values, - self.height_option) + self.height_values, + self.height_option) self._update() From 7cd4d070acc2fba72ce142eb904b041ce68ec3f5 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 17:33:30 +0100 Subject: [PATCH 09/19] switch axes in reservoirs --- src/View/Reservoir/Edit/Plot.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/View/Reservoir/Edit/Plot.py b/src/View/Reservoir/Edit/Plot.py index ac1859a1..e7cc70ad 100644 --- a/src/View/Reservoir/Edit/Plot.py +++ b/src/View/Reservoir/Edit/Plot.py @@ -49,8 +49,8 @@ class Plot(PamhyrPlot): self._mode = mode self._table_headers = self._trad.get_dict("table_headers") - self.label_x = self._table_headers["z"] - self.label_y = self._table_headers["area"] + self.label_x = self._table_headers["area"] + self.label_y = self._table_headers["z"] self._isometric_axis = False @@ -71,8 +71,8 @@ class Plot(PamhyrPlot): self._init = True def draw_data(self): - x = list(map(lambda v: v[0], self.data.data)) - y = list(map(lambda v: v[1], self.data.data)) + x = list(map(lambda v: v[1], self.data.data)) + y = list(map(lambda v: v[0], self.data.data)) self._line, = self.canvas.axes.plot( x, y, color=self.color_plot, @@ -89,7 +89,7 @@ class Plot(PamhyrPlot): self.update_idle() def update_data(self): - x = list(map(lambda v: v[0], self.data.data)) - y = list(map(lambda v: v[1], self.data.data)) + x = list(map(lambda v: v[1], self.data.data)) + y = list(map(lambda v: v[0], self.data.data)) self._line.set_data(x, y) From 38560cdcf51b84c239a453c8b79bfc6c810464d7 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 30 Oct 2024 17:42:28 +0100 Subject: [PATCH 10/19] translation --- src/lang/fr.ts | 55 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/lang/fr.ts b/src/lang/fr.ts index 6abba31a..f358e6d6 100644 --- a/src/lang/fr.ts +++ b/src/lang/fr.ts @@ -1,5 +1,6 @@ - + + About @@ -1167,7 +1168,7 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie. - Copyright © 2022-2024 INRAE + Copyright © 2022-2024 INRAE Copyright © 2022-2024 INRAE @@ -1175,11 +1176,6 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie.Version: @version @codename Version : @version @codename - - - Copyright © 2022-2024 INRAE - - Frictions @@ -1456,17 +1452,17 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie. MainWindow - + Open debug window Ouvrir la fenêtre de débogage - + Open SQLite debuging tool ('sqlitebrowser') Ouvrir l'outil de débogage SQLite ('sqlitebrowser') - + Enable this window Activer cette fenêtre @@ -2311,12 +2307,12 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie.Maillage - + Summary Résumé - + Checks Vérifications @@ -2536,7 +2532,7 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie.Données - + Please select a reach Veuillez sélectionner un bief @@ -2546,35 +2542,45 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie.L'édition de la géométrie nécessite un bief sélectionné dans le réseau fluvial pour pouvoir travailler dessus - + Last open study Dernière étude ouverte - + Do you want to open again the last open study? Voulez-vous rouvrir la dernière étude ? - + This edition window need a reach selected into the river network to work on it Cette fenêtre d'édition a besoin d'un bief sélectionné dans le réseau pour travailler dessus - + Close without saving study Fermer sans sauvegarder l'étude - + Do you want to save current study before closing it? Souhaitez-vous sauvegarder l'étude en cours avant de la fermer ? - + Warning Avertissement + + + X (m) + X (m) + + + + Y (m) + Y (m) + MainWindow_reach @@ -3255,17 +3261,17 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie.Vitesse (m/s) - + Wet Perimeter (m) Périmètre mouillé (m) - + Hydraulic Radius (m) Rayon hydraulique (m) - + Froude number Nombre de Froude @@ -3277,6 +3283,11 @@ Cette fonctionnalité nécessite un bief muni d'une géométrie. Wet Area (m^2) + Aire mouillée (m²) + + + + Wet Area (m²) Aire mouillée (m²) From e25a3ae98c4e36dc53201b09ce982088212bbfcc Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Mon, 4 Nov 2024 10:44:09 +0100 Subject: [PATCH 11/19] debug --- src/View/Results/Window.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index 661d25d6..589aa189 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -614,10 +614,11 @@ class ResultsWindow(PamhyrWindow): first_line.append(f"Time: {timestamp}s") val_dict = self._export_rk(timestamp, y, filename) elif x == "time": - profile = self._get_current_profile() + profile_id = self._get_current_profile() + profile = reach.profile(profile_id) pname = profile.name if profile.name != "" else profile.rk first_line.append(f"Profile: {pname}") - val_dict = self._export_time(profile, y, filename) + val_dict = self._export_time(profile_id, y, filename) with open(filename, 'w', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=',', From 5f043468ee135ca377abf28ab661405aa9dcbad3 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Mon, 4 Nov 2024 16:03:18 +0100 Subject: [PATCH 12/19] add envelop in custom plots + optim + clean --- src/View/Geometry/PlotRKZ.py | 2 +- src/View/InitialConditions/Table.py | 6 +- src/View/InitialConditions/translate.py | 4 +- src/View/Results/CustomPlot/Plot.py | 375 ++++++++++++++++-- src/View/Results/CustomPlot/Translate.py | 18 +- src/View/Results/Table.py | 2 +- src/View/Results/Window.py | 8 +- src/View/Results/translate.py | 18 +- src/View/SedimentLayers/Reach/Plot.py | 2 +- src/View/SedimentLayers/Reach/Profile/Plot.py | 2 +- .../SedimentLayers/Reach/Profile/translate.py | 2 +- src/View/SedimentLayers/Reach/translate.py | 2 +- src/View/Translate.py | 48 ++- 13 files changed, 414 insertions(+), 75 deletions(-) diff --git a/src/View/Geometry/PlotRKZ.py b/src/View/Geometry/PlotRKZ.py index 55fdee91..f15e6826 100644 --- a/src/View/Geometry/PlotRKZ.py +++ b/src/View/Geometry/PlotRKZ.py @@ -52,7 +52,7 @@ class PlotRKZ(PamhyrPlot): self.line_rk_zmin_zmax_highlight = None self.label_x = self._trad["unit_rk"] - self.label_y = self._trad["unit_height"] + self.label_y = self._trad["unit_depth"] self.before_plot_selected = None self.plot_selected = None diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py index c9db850f..a008979d 100644 --- a/src/View/InitialConditions/Table.py +++ b/src/View/InitialConditions/Table.py @@ -104,15 +104,15 @@ class InitialConditionTableModel(PamhyrTableModel): row = index.row() column = index.column() - if self._headers[column] is "speed": + if self._headers[column] == "velocity": z = self._lst.get(row)["elevation"] q = self._lst.get(row)["discharge"] profile = self._reach.reach.get_profiles_from_rk( self._lst.get(row)["rk"] ) if len(profile) >= 1: - speed = profile[0].speed(q, z) - return f"{speed:.4f}" + velocity = profile[0].speed(q, z) + return f"{velocity:.4f}" return "" elif self._headers[column] not in ["name", "comment"]: diff --git a/src/View/InitialConditions/translate.py b/src/View/InitialConditions/translate.py index 0edee4dc..0b782f21 100644 --- a/src/View/InitialConditions/translate.py +++ b/src/View/InitialConditions/translate.py @@ -39,7 +39,7 @@ class ICTranslate(MainTranslate): "rk": self._dict["unit_rk"], "discharge": self._dict["unit_discharge"], "elevation": self._dict["unit_elevation"], - "height": self._dict["unit_height"], - "speed": self._dict["unit_speed"], + "height": self._dict["unit_depth"], + "velocity": self._dict["unit_velocity"], # "comment": _translate("InitialCondition", "Comment"), } diff --git a/src/View/Results/CustomPlot/Plot.py b/src/View/Results/CustomPlot/Plot.py index f1f2438f..5b7fd323 100644 --- a/src/View/Results/CustomPlot/Plot.py +++ b/src/View/Results/CustomPlot/Plot.py @@ -30,11 +30,15 @@ from View.Results.CustomPlot.Translate import CustomPlotTranslate logger = logging.getLogger() unit = { - "elevation": "0-meter", + "bed_elevation": "0-meter", "water_elevation": "0-meter", + "water_elevation_envelop": "0-meter", "discharge": "1-m3s", + "discharge_envelop": "1-m3s", "velocity": "2-ms", - "max_depth": "3-meter", + "velocity_envelop": "2-ms", + "depth": "3-meter", + "depth_envelop": "3-meter", "mean_depth": "3-meter", "froude": "4-dimensionless", "wet_area": "5-m2", @@ -105,15 +109,15 @@ class CustomPlot(PamhyrPlot): self._axes[ax].spines['right'].set_position(('outward', shift)) shift += 60 - lines = {} - if "elevation" in self._y: + self.lines = {} + if "bed_elevation" in self._y: - ax = self._axes[unit["elevation"]] + ax = self._axes[unit["bed_elevation"]] line = ax.plot( rk, z_min, color='grey', lw=1., ) - lines["elevation"] = line + self.lines["bed_elevation"] = line if "water_elevation" in self._y: @@ -122,14 +126,46 @@ class CustomPlot(PamhyrPlot): rk, z, lw=1., color='blue', ) - lines["water_elevation"] = line + self.lines["water_elevation"] = line - if "elevation" in self._y: - ax.fill_between( + if "bed_elevation" in self._y: + self.fill = ax.fill_between( rk, z_min, z, color='blue', alpha=0.5, interpolate=True ) + #if "water_elevation_envelop" in self._y: + + ax = self._axes[unit["water_elevation_envelop"]] + + d = list( + map( + lambda p: max(p.get_key("Z")), + reach.profiles + ) + ) + + line1 = ax.plot( + rk, d, lw=1., + color='blue', + linestyle='dotted', + ) + self.lines["water_elevation_envelop"] = line1 + + d = list( + map( + lambda p: min(p.get_key("Z")), + reach.profiles + ) + ) + + line2 = ax.plot( + rk, d, lw=1., + color='blue', + linestyle='dotted', + ) + #self.lines["water_elevation_envelop2"] = line2 + if "discharge" in self._y: ax = self._axes[unit["discharge"]] @@ -137,7 +173,37 @@ class CustomPlot(PamhyrPlot): rk, q, lw=1., color='r', ) - lines["discharge"] = line + self.lines["discharge"] = line + + #if "discharge_envelop" in self._y: + + ax = self._axes[unit["discharge_envelop"]] + + q1 = list( + map( + lambda p: max(p.get_key("Q")), + reach.profiles + ) + ) + line1 = ax.plot( + rk, q1, lw=1., + color='r', + linestyle='dotted', + ) + self.lines["discharge_envelop"] = line1 + + q2 = list( + map( + lambda p: min(p.get_key("Q")), + reach.profiles + ) + ) + line2 = ax.plot( + rk, q2, lw=1., + color='r', + linestyle='dotted', + ) + #self.lines["discharge_envelop2"] = line2 if "velocity" in self._y: @@ -155,11 +221,39 @@ class CustomPlot(PamhyrPlot): rk, v, lw=1., color='g', ) - lines["velocity"] = line + self.lines["velocity"] = line - if "max_depth" in self._y: + #if "velocity_envelop" in self._y: - ax = self._axes[unit["max_depth"]] + velocities = list(map(lambda p: + list(map(lambda q, z: + p.geometry.speed(q, z), + p.get_key("Q"), p.get_key("Z") + )), reach.profiles + ) + ) + + ax = self._axes[unit["velocity_envelop"]] + vmax = [max(v) for v in velocities] + + line1 = ax.plot( + rk, vmax, lw=1., + color='g', + linestyle='dotted', + ) + self.lines["velocity_envelop"] = line1 + vmin = [min(v) for v in velocities] + + line2 = ax.plot( + rk, vmin, lw=1., + color='g', + linestyle='dotted', + ) + #self.lines["velocity_envelop2"] = line2 + + if "depth" in self._y: + + ax = self._axes[unit["depth"]] d = list( map( lambda p: p.geometry.max_water_depth( @@ -171,7 +265,37 @@ class CustomPlot(PamhyrPlot): rk, d, color='brown', lw=1., ) - lines["max_depth"] = line + self.lines["depth"] = line + + #if "depth_envelop" in self._y: + + ax = self._axes[unit["depth_envelop"]] + + d = list(map(lambda p1, p2: p1 - p2, + map( + lambda p: max(p.get_key("Z")), + reach.profiles + ), z_min) + ) + line1 = ax.plot( + rk, d, + color='brown', lw=1., + linestyle='dotted', + ) + self.lines["depth_envelop"] = line1 + + d = list(map(lambda p1, p2: p1 - p2, + map( + lambda p: min(p.get_key("Z")), + reach.profiles + ), z_min) + ) + line2 = ax.plot( + rk, d, + color='brown', lw=1., + linestyle='dotted', + ) + #self.lines["depth_envelop2"] = line2 if "mean_depth" in self._y: @@ -188,7 +312,7 @@ class CustomPlot(PamhyrPlot): rk, d, color='orange', lw=1., ) - lines["mean_depth"] = line + self.lines["mean_depth"] = line if "froude" in self._y: @@ -212,7 +336,7 @@ class CustomPlot(PamhyrPlot): line = ax.plot( rk, fr, color='black', linestyle='--', lw=1., ) - lines["froude"] = line + self.lines["froude"] = line if "wet_area" in self._y: @@ -229,17 +353,110 @@ class CustomPlot(PamhyrPlot): rk, d, color='blue', linestyle='--', lw=1., ) - lines["wet_area"] = line + self.lines["wet_area"] = line # Legend lns = reduce( lambda acc, line: acc + line, - map(lambda line: lines[line], lines), + map(lambda line: self.lines[line], self.lines), [] ) - labs = list(map(lambda line: self._trad[line], lines)) + labs = list(map(lambda line: self._trad[line], self.lines)) self.canvas.axes.legend(lns, labs, loc="best") + def _redraw_rk(self): + results = self.data + reach = results.river.reach(self._reach) + rk = reach.geometry.get_rk() + z_min = reach.geometry.get_z_min() + q = list( + map( + lambda p: p.get_ts_key(self._timestamp, "Q"), + reach.profiles + ) + ) + z = list( + map( + lambda p: p.get_ts_key(self._timestamp, "Z"), + reach.profiles + ) + ) + if "bed_elevation" in self._y: + self.lines["bed_elevation"][0].set_ydata(z_min) + + if "water_elevation" in self._y: + self.lines["water_elevation"][0].set_ydata(z) + + if "bed_elevation" in self._y: + ax = self._axes[unit["water_elevation"]] + self.fill.remove() + self.fill = ax.fill_between( + rk, z_min, z, + color='blue', alpha=0.5, interpolate=True + ) + + if "discharge" in self._y: + self.lines["discharge"][0].set_ydata(q) + + if "velocity" in self._y: + v = list( + map( + lambda p: p.geometry.speed( + p.get_ts_key(self._timestamp, "Q"), + p.get_ts_key(self._timestamp, "Z")), + reach.profiles + ) + ) + self.lines["discharge"][0].set_ydata(v) + + if "depth" in self._y: + d = list( + map( + lambda p: p.geometry.max_water_depth( + p.get_ts_key(self._timestamp, "Z")), + reach.profiles + ) + ) + self.lines["depth"][0].set_ydata(d) + + if "mean_depth" in self._y: + d = list( + map( + lambda p: p.geometry.mean_water_depth( + p.get_ts_key(self._timestamp, "Z")), + reach.profiles + ) + ) + self.lines["mean_depth"][0].set_ydata(d) + + if "froude" in self._y: + fr = list( + map( + lambda p: + p.geometry.speed( + p.get_ts_key(self._timestamp, "Q"), + p.get_ts_key(self._timestamp, "Z")) / + sqrt(9.81 * ( + p.geometry.wet_area( + p.get_ts_key(self._timestamp, "Z")) / + p.geometry.wet_width( + p.get_ts_key(self._timestamp, "Z")) + )), + reach.profiles + ) + ) + self.lines["froude"][0].set_ydata(fr) + + if "wet_area" in self._y: + d = list( + map( + lambda p: p.geometry.wet_area( + p.get_ts_key(self._timestamp, "Z")), + reach.profiles + ) + ) + self.lines["wet_area"][0].set_ydata(d) + def _customize_x_axes_time(self, ts, mode="time"): # Custom time display nb = len(ts) @@ -308,17 +525,17 @@ class CustomPlot(PamhyrPlot): ) ) - lines = {} - if "elevation" in self._y: + self.lines = {} + if "bed_elevation" in self._y: # Z min is constant in time - ax = self._axes[unit["elevation"]] + ax = self._axes[unit["bed_elevation"]] line = ax.plot( ts, ts_z_min, color='grey', lw=1. ) - lines["elevation"] = line + self.lines["bed_elevation"] = line if "water_elevation" in self._y: @@ -327,11 +544,11 @@ class CustomPlot(PamhyrPlot): ts, z, lw=1., color='b', ) - lines["water_elevation"] = line + self.lines["water_elevation"] = line - if "elevation" in self._y: + if "bed_elevation" in self._y: - ax.fill_between( + self.fill = ax.fill_between( ts, ts_z_min, z, color='blue', alpha=0.5, interpolate=True ) @@ -343,7 +560,7 @@ class CustomPlot(PamhyrPlot): ts, q, lw=1., color='r', ) - lines["discharge"] = line + self.lines["discharge"] = line if "velocity" in self._y: @@ -359,11 +576,11 @@ class CustomPlot(PamhyrPlot): ts, v, lw=1., color='g', ) - lines["velocity"] = line + self.lines["velocity"] = line - if "max_depth" in self._y: + if "depth" in self._y: - ax = self._axes[unit["max_depth"]] + ax = self._axes[unit["depth"]] d = list( map(lambda z: profile.geometry.max_water_depth(z), z) ) @@ -372,7 +589,7 @@ class CustomPlot(PamhyrPlot): ts, d, color='brown', lw=1., ) - lines["max_depth"] = line + self.lines["depth"] = line if "mean_depth" in self._y: @@ -385,7 +602,7 @@ class CustomPlot(PamhyrPlot): ts, d, color='orange', lw=1., ) - lines["mean_depth"] = line + self.lines["mean_depth"] = line if "froude" in self._y: @@ -402,7 +619,7 @@ class CustomPlot(PamhyrPlot): line = ax.plot( ts, d, color='black', linestyle='--', lw=1., ) - lines["froude"] = line + self.lines["froude"] = line if "wet_area" in self._y: @@ -414,21 +631,100 @@ class CustomPlot(PamhyrPlot): line = ax.plot( ts, d, color='blue', linestyle='--', lw=1., ) - lines["wet_area"] = line + self.lines["wet_area"] = line self._customize_x_axes_time(ts) # Legend lns = reduce( lambda acc, line: acc + line, - map(lambda line: lines[line], lines), + map(lambda line: self.lines[line], self.lines), [] ) - labs = list(map(lambda line: self._trad[line], lines)) + labs = list(map(lambda line: self._trad[line], self.lines)) self.canvas.axes.legend(lns, labs, loc="best") - @timer + def _redraw_time(self): + + results = self.data + reach = results.river.reach(self._reach) + profile = reach.profile(self._profile) + ts = list(results.get("timestamps")) + ts.sort() + + q = profile.get_key("Q") + z = profile.get_key("Z") + z_min = profile.geometry.z_min() + ts_z_min = list( + map( + lambda ts: z_min, + ts + ) + ) + + if "water_elevation" in self._y: + self.lines["water_elevation"][0].set_ydata(z) + + if "bed_elevation" in self._y: + ax = self._axes[unit["bed_elevation"]] + self.fill.remove() + self.fill = ax.fill_between( + ts, ts_z_min, z, + color='blue', alpha=0.5, interpolate=True + ) + + if "discharge" in self._y: + self.lines["discharge"][0].set_ydata(q) + + if "velocity" in self._y: + v = list( + map( + lambda q, z: profile.geometry.speed(q, z), + q, z + ) + ) + self.lines["velocity"][0].set_ydata(v) + + if "depth" in self._y: + d = list( + map(lambda z: profile.geometry.max_water_depth(z), z) + ) + self.lines["depth"][0].set_ydata(d) + + if "mean_depth" in self._y: + d = list( + map(lambda z: profile.geometry.mean_water_depth(z), z) + ) + self.lines["mean_depth"][0].set_ydata(d) + + if "froude" in self._y: + d = list( + map(lambda z, q: + profile.geometry.speed(q, z) / + sqrt(9.81 * ( + profile.geometry.wet_area(z) / + profile.geometry.wet_width(z)) + ), z, q) + ) + self.lines["froude"][0].set_ydata(d) + + if "wet_area" in self._y: + d = list( + map(lambda z: profile.geometry.wet_area(z), z) + ) + self.lines["wet_area"][0].set_ydata(d) + def draw(self): + self.draw_static() + + def draw_update(self): + if self._x == "rk": + self._redraw_rk() + elif self._x == "time": + self._redraw_time() + + @timer + def draw_static(self): self.canvas.axes.cla() self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) @@ -485,9 +781,10 @@ class CustomPlot(PamhyrPlot): @timer def update(self): if not self._init: - self.draw() + #self.draw_static() self.draw_current() - return + self.draw_update() + return def set_reach(self, reach_id): self._reach = reach_id diff --git a/src/View/Results/CustomPlot/Translate.py b/src/View/Results/CustomPlot/Translate.py index 3937d720..1bfe7f96 100644 --- a/src/View/Results/CustomPlot/Translate.py +++ b/src/View/Results/CustomPlot/Translate.py @@ -36,14 +36,16 @@ class CustomPlotTranslate(ResultsTranslate): self._dict['time'] = self._dict["unit_time_s"] self._dict['rk'] = self._dict["unit_rk"] self._dict['water_elevation'] = self._dict["unit_water_elevation"] + self._dict['water_elevation_envelop'] = self._dict["unit_water_elevation_envelop"] self._dict['discharge'] = self._dict["unit_discharge"] - self._dict['elevation'] = _translate( - "CustomPlot", "Bed elevation (m)" - ) - self._dict['velocity'] = self._dict["unit_speed"] + self._dict['discharge_envelop'] = self._dict["unit_discharge_envelop"] + self._dict['bed_elevation'] = self._dict["unit_bed_elevation"] + self._dict['velocity'] = self._dict["unit_velocity"] self._dict['width'] = self._dict["unit_width"] - self._dict['max_depth'] = self._dict["unit_max_height"] - self._dict['mean_depth'] = self._dict["unit_mean_height"] + self._dict['velocity_envelop'] = self._dict["unit_velocity_envelop"] + self._dict['depth'] = self._dict["unit_depth"] + self._dict['depth_envelop'] = self._dict["unit_depth_envelop"] + self._dict['mean_depth'] = self._dict["unit_mean_depth"] self._dict['wet_area'] = self._dict["unit_wet_area"] self._dict['wet_perimeter'] = self._dict["unit_wet_perimeter"] self._dict['hydraulic_radius'] = self._dict["unit_hydraulic_radius"] @@ -55,7 +57,7 @@ class CustomPlotTranslate(ResultsTranslate): "CustomPlot", "Elevation (m)" ) self._dict['1-m3s'] = self._dict["unit_discharge"] - self._dict['2-ms'] = self._dict["unit_speed"] - self._dict['3-meter'] = self._dict["unit_height"] + self._dict['2-ms'] = self._dict["unit_velocity"] + self._dict['3-meter'] = self._dict["unit_depth"] self._dict['4-dimensionless'] = self._dict["unit_froude"] self._dict['5-m2'] = self._dict["wet_area"] diff --git a/src/View/Results/Table.py b/src/View/Results/Table.py index c92e994e..7a4c3b1d 100644 --- a/src/View/Results/Table.py +++ b/src/View/Results/Table.py @@ -97,7 +97,7 @@ class TableModel(PamhyrTableModel): z = self._lst[row].get_ts_key(self._timestamp, "Z") v = self._lst[row].geometry.wet_width(z) return f"{v:.4f}" - elif self._headers[column] == "max_depth": + elif self._headers[column] == "depth": z = self._lst[row].get_ts_key(self._timestamp, "Z") v = self._lst[row].geometry.max_water_depth(z) return f"{v:.4f}" diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index 589aa189..df9021b5 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -703,8 +703,8 @@ class ResultsWindow(PamhyrWindow): reach.profiles ) ) - if "max_depth" in y: - my_dict["max_depth"] = list( + if "depth" in y: + my_dict["depth"] = list( map( lambda p: p.geometry.max_water_depth( p.get_ts_key(timestamp, "Z")), @@ -768,8 +768,8 @@ class ResultsWindow(PamhyrWindow): q, z ) ) - if "max_depth" in y: - my_dict["max_depth"] = list( + if "depth" in y: + my_dict["depth"] = list( map(lambda z: profile.geometry.max_water_depth(z), z) ) if "mean_depth" in y: diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py index 8b66124e..68675e51 100644 --- a/src/View/Results/translate.py +++ b/src/View/Results/translate.py @@ -57,10 +57,10 @@ class ResultsTranslate(MainTranslate): "name": _translate("Results", "Profile"), "water_elevation": self._dict["unit_water_elevation"], "discharge": self._dict["unit_discharge"], - "velocity": self._dict["unit_speed"], + "velocity": self._dict["unit_velocity"], "width": self._dict["unit_width"], - "max_depth": self._dict["unit_max_height"], - "mean_depth": self._dict["unit_mean_height"], + "depth": self._dict["unit_depth"], + "mean_depth": self._dict["unit_mean_depth"], "wet_area": self._dict["unit_wet_area"], "wet_perimeter": self._dict["unit_wet_perimeter"], "hydraulic_radius": self._dict["unit_hydraulic_radius"], @@ -73,12 +73,16 @@ class ResultsTranslate(MainTranslate): } self._sub_dict["values_y"] = { - "elevation": self._dict["unit_elevation"], + "bed_elevation": self._dict["unit_bed_elevation"], "water_elevation": self._dict["unit_water_elevation"], + #"water_elevation_envelop": self._dict["unit_water_elevation_envelop"], "discharge": self._dict["unit_discharge"], - "velocity": self._dict["unit_speed"], - "max_depth": self._dict["unit_max_height"], - "mean_depth": self._dict["unit_mean_height"], + #"discharge_envelop": self._dict["unit_discharge_envelop"], + "velocity": self._dict["unit_velocity"], + #"velocity_envelop": self._dict["unit_velocity_envelop"], + "depth": self._dict["unit_depth"], + #"depth_envelop": self._dict["unit_depth_envelop"], + "mean_depth": self._dict["unit_mean_depth"], "froude": self._dict["unit_froude"], "wet_area": self._dict["unit_wet_area"], } diff --git a/src/View/SedimentLayers/Reach/Plot.py b/src/View/SedimentLayers/Reach/Plot.py index 7d5ff700..619c87da 100644 --- a/src/View/SedimentLayers/Reach/Plot.py +++ b/src/View/SedimentLayers/Reach/Plot.py @@ -44,7 +44,7 @@ class Plot(PamhyrPlot): ) self.label_x = self._trad["rk"] - self.label_y = self._trad["height"] + self.label_y = self._trad["elevation"] self.line_rk_zmin = None self.line_rk_sl = [] diff --git a/src/View/SedimentLayers/Reach/Profile/Plot.py b/src/View/SedimentLayers/Reach/Profile/Plot.py index 8069cc20..474ab59a 100644 --- a/src/View/SedimentLayers/Reach/Profile/Plot.py +++ b/src/View/SedimentLayers/Reach/Profile/Plot.py @@ -44,7 +44,7 @@ class Plot(PamhyrPlot): ) self.label_x = self._trad["x"] - self.label_y = self._trad["height"] + self.label_y = self._trad["elevation"] self.line_rk_zmin = None self.line_rk_sl = [] diff --git a/src/View/SedimentLayers/Reach/Profile/translate.py b/src/View/SedimentLayers/Reach/Profile/translate.py index c6bef267..db9292a0 100644 --- a/src/View/SedimentLayers/Reach/Profile/translate.py +++ b/src/View/SedimentLayers/Reach/Profile/translate.py @@ -30,7 +30,7 @@ class SedimentProfileTranslate(SedimentReachTranslate): self._dict["x"] = _translate( "SedimentLayers", "X (m)" ) - self._dict["height"] = self._dict["unit_height"] + self._dict["elevation"] = self._dict["unit_elevation"] self._dict["Profile sediment layers"] = _translate( "SedimentLayers", "Profile sediment layers" diff --git a/src/View/SedimentLayers/Reach/translate.py b/src/View/SedimentLayers/Reach/translate.py index 38ae8108..c00e384c 100644 --- a/src/View/SedimentLayers/Reach/translate.py +++ b/src/View/SedimentLayers/Reach/translate.py @@ -35,7 +35,7 @@ class SedimentReachTranslate(SedimentTranslate): ) self._dict["rk"] = self._dict["unit_rk"] - self._dict["height"] = self._dict["unit_height"] + self._dict["elevation"] = self._dict["unit_elevation"] self._sub_dict["table_headers"] = { "name": self._dict["name"], diff --git a/src/View/Translate.py b/src/View/Translate.py index e39279e5..160c95e9 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -54,18 +54,54 @@ class UnitTranslate(CommonWordTranslate): self._dict["unit_rk"] = _translate("Unit", "River Kilometer (m)") self._dict["unit_width"] = _translate("Unit", "Width (m)") - self._dict["unit_height"] = _translate("Unit", "Depth (m)") - self._dict["unit_max_height"] = _translate("Unit", "Max Depth (m)") - self._dict["unit_mean_height"] = _translate("Unit", "Mean Depth (m)") + self._dict["unit_width_envelop"] = _translate( + "Unit", "Width Envelop (m)" + ) + self._dict["unit_max_width"] = _translate("Unit", "Max Width (m)") + self._dict["unit_min_width"] = _translate("Unit", "Min Width (m)") + self._dict["unit_depth"] = _translate("Unit", "Depth (m)") + self._dict["unit_max_depth"] = _translate("Unit", "Max Depth (m)") + self._dict["unit_min_depth"] = _translate("Unit", "Min Depth (m)") + self._dict["unit_depth_envelop"] = _translate( + "Unit", "Depth Envelop (m)" + ) + self._dict["unit_mean_depth"] = _translate("Unit", "Mean Depth (m)") self._dict["unit_diameter"] = _translate("Unit", "Diameter (m)") self._dict["unit_thickness"] = _translate("Unit", "Thickness (m)") self._dict["unit_elevation"] = _translate("Unit", "Elevation (m)") + self._dict["unit_bed_elevation"] = _translate("Unit", "Bed Elevation (m)") self._dict["unit_water_elevation"] = _translate( - "Unit", "Water elevation (m)" + "Unit", "Water Elevation (m)" + ) + self._dict["unit_water_elevation_envelop"] = _translate( + "Unit", "Water Elevation Envelop (m)" + ) + self._dict["unit_max_water_elevation"] = _translate( + "Unit", "Max Water Elevation (m)" + ) + self._dict["unit_min_water_elevation"] = _translate( + "Unit", "Min Water Elevation (m)" + ) + self._dict["unit_velocity"] = _translate("Unit", "Velocity (m/s)") + self._dict["unit_velocity_envelop"] = _translate( + "Unit", "Velocity Envelop (m/s)" + ) + self._dict["unit_max_velocity"] = _translate( + "Unit", "Max Velocity (m/s)" + ) + self._dict["unit_min_velocity"] = _translate( + "Unit", "Min Velocity (m/s)" ) - - self._dict["unit_speed"] = _translate("Unit", "Velocity (m/s)") self._dict["unit_discharge"] = _translate("Unit", "Discharge (m^3/s)") + self._dict["unit_discharge_envelop"] = _translate( + "Unit", "Discharge Envelop (m^3/s)" + ) + self._dict["unit_max_discharge"] = _translate( + "Unit", "Max Discharge (m^3/s)" + ) + self._dict["unit_min_discharge"] = _translate( + "Unit", "Min Discharge (m^3/s)" + ) self._dict["unit_area"] = _translate("Unit", "Area (hectare)") self._dict["unit_time_s"] = _translate("Unit", "Time (sec)") From b21b6be9ca4783fa27fe451117b1667a40d80fa6 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Mon, 4 Nov 2024 16:32:44 +0100 Subject: [PATCH 13/19] envelop optional --- .../CustomPlotValuesSelectionDialog.py | 21 +- src/View/Results/CustomPlot/Plot.py | 199 +++++++++--------- src/View/Results/Window.py | 12 +- 3 files changed, 127 insertions(+), 105 deletions(-) diff --git a/src/View/Results/CustomPlot/CustomPlotValuesSelectionDialog.py b/src/View/Results/CustomPlot/CustomPlotValuesSelectionDialog.py index e88e5386..bcad21b6 100644 --- a/src/View/Results/CustomPlot/CustomPlotValuesSelectionDialog.py +++ b/src/View/Results/CustomPlot/CustomPlotValuesSelectionDialog.py @@ -42,6 +42,7 @@ class CustomPlotValuesSelectionDialog(PamhyrDialog): self._available_values_y = self._trad.get_dict("values_y") self.setup_radio_buttons() + self.setup_envelop_box() self.setup_check_boxs() self.value = None @@ -61,6 +62,24 @@ class CustomPlotValuesSelectionDialog(PamhyrDialog): self._radio[0][1].setChecked(True) layout.addStretch() + def setup_envelop_box(self): + self._envelop = [] + layout = self.find(QVBoxLayout, "verticalLayout_x") + self._envelop = QCheckBox( + "envelop", + parent=self + ) + layout.addWidget(self._envelop) + self._envelop.setChecked(True) + for r in self._radio: + r[1].clicked.connect(self.envelop_box_status) + + def envelop_box_status(self): + if self._radio[0][1].isChecked(): + self._envelop.setEnabled(True) + else: + self._envelop.setEnabled(False) + def setup_check_boxs(self): self._check = [] layout = self.find(QVBoxLayout, "verticalLayout_y") @@ -94,6 +113,6 @@ class CustomPlotValuesSelectionDialog(PamhyrDialog): ) ) - self.value = x, y + self.value = x, y, self._envelop.isChecked() super().accept() diff --git a/src/View/Results/CustomPlot/Plot.py b/src/View/Results/CustomPlot/Plot.py index 5b7fd323..c8bb0c6c 100644 --- a/src/View/Results/CustomPlot/Plot.py +++ b/src/View/Results/CustomPlot/Plot.py @@ -46,7 +46,7 @@ unit = { class CustomPlot(PamhyrPlot): - def __init__(self, x, y, reach, profile, timestamp, + def __init__(self, x, y, envelop, reach, profile, timestamp, data=None, canvas=None, trad=None, toolbar=None, parent=None): super(CustomPlot, self).__init__( @@ -59,6 +59,7 @@ class CustomPlot(PamhyrPlot): self._x = x self._y = y + self._envelop = envelop self._reach = reach self._profile = profile self._timestamp = timestamp @@ -134,37 +135,37 @@ class CustomPlot(PamhyrPlot): color='blue', alpha=0.5, interpolate=True ) - #if "water_elevation_envelop" in self._y: + if self._envelop: - ax = self._axes[unit["water_elevation_envelop"]] + ax = self._axes[unit["water_elevation_envelop"]] - d = list( - map( - lambda p: max(p.get_key("Z")), - reach.profiles + d = list( + map( + lambda p: max(p.get_key("Z")), + reach.profiles + ) ) - ) - line1 = ax.plot( - rk, d, lw=1., - color='blue', - linestyle='dotted', - ) - self.lines["water_elevation_envelop"] = line1 - - d = list( - map( - lambda p: min(p.get_key("Z")), - reach.profiles + line1 = ax.plot( + rk, d, lw=1., + color='blue', + linestyle='dotted', ) - ) + self.lines["water_elevation_envelop"] = line1 - line2 = ax.plot( - rk, d, lw=1., - color='blue', - linestyle='dotted', - ) - #self.lines["water_elevation_envelop2"] = line2 + d = list( + map( + lambda p: min(p.get_key("Z")), + reach.profiles + ) + ) + + line2 = ax.plot( + rk, d, lw=1., + color='blue', + linestyle='dotted', + ) + #self.lines["water_elevation_envelop2"] = line2 if "discharge" in self._y: @@ -175,35 +176,35 @@ class CustomPlot(PamhyrPlot): ) self.lines["discharge"] = line - #if "discharge_envelop" in self._y: + if self._envelop: - ax = self._axes[unit["discharge_envelop"]] + ax = self._axes[unit["discharge_envelop"]] - q1 = list( - map( - lambda p: max(p.get_key("Q")), - reach.profiles + q1 = list( + map( + lambda p: max(p.get_key("Q")), + reach.profiles + ) ) - ) - line1 = ax.plot( - rk, q1, lw=1., - color='r', - linestyle='dotted', - ) - self.lines["discharge_envelop"] = line1 - - q2 = list( - map( - lambda p: min(p.get_key("Q")), - reach.profiles + line1 = ax.plot( + rk, q1, lw=1., + color='r', + linestyle='dotted', ) - ) - line2 = ax.plot( - rk, q2, lw=1., - color='r', - linestyle='dotted', - ) - #self.lines["discharge_envelop2"] = line2 + self.lines["discharge_envelop"] = line1 + + q2 = list( + map( + lambda p: min(p.get_key("Q")), + reach.profiles + ) + ) + line2 = ax.plot( + rk, q2, lw=1., + color='r', + linestyle='dotted', + ) + #self.lines["discharge_envelop2"] = line2 if "velocity" in self._y: @@ -223,33 +224,33 @@ class CustomPlot(PamhyrPlot): ) self.lines["velocity"] = line - #if "velocity_envelop" in self._y: + if self._envelop: - velocities = list(map(lambda p: - list(map(lambda q, z: - p.geometry.speed(q, z), - p.get_key("Q"), p.get_key("Z") - )), reach.profiles + velocities = list(map(lambda p: + list(map(lambda q, z: + p.geometry.speed(q, z), + p.get_key("Q"), p.get_key("Z") + )), reach.profiles + ) ) - ) - ax = self._axes[unit["velocity_envelop"]] - vmax = [max(v) for v in velocities] + ax = self._axes[unit["velocity_envelop"]] + vmax = [max(v) for v in velocities] - line1 = ax.plot( - rk, vmax, lw=1., - color='g', - linestyle='dotted', - ) - self.lines["velocity_envelop"] = line1 - vmin = [min(v) for v in velocities] + line1 = ax.plot( + rk, vmax, lw=1., + color='g', + linestyle='dotted', + ) + self.lines["velocity_envelop"] = line1 + vmin = [min(v) for v in velocities] - line2 = ax.plot( - rk, vmin, lw=1., - color='g', - linestyle='dotted', - ) - #self.lines["velocity_envelop2"] = line2 + line2 = ax.plot( + rk, vmin, lw=1., + color='g', + linestyle='dotted', + ) + #self.lines["velocity_envelop2"] = line2 if "depth" in self._y: @@ -267,35 +268,35 @@ class CustomPlot(PamhyrPlot): ) self.lines["depth"] = line - #if "depth_envelop" in self._y: + if self._envelop: - ax = self._axes[unit["depth_envelop"]] + ax = self._axes[unit["depth_envelop"]] - d = list(map(lambda p1, p2: p1 - p2, - map( - lambda p: max(p.get_key("Z")), - reach.profiles - ), z_min) - ) - line1 = ax.plot( - rk, d, - color='brown', lw=1., - linestyle='dotted', - ) - self.lines["depth_envelop"] = line1 + d = list(map(lambda p1, p2: p1 - p2, + map( + lambda p: max(p.get_key("Z")), + reach.profiles + ), z_min) + ) + line1 = ax.plot( + rk, d, + color='brown', lw=1., + linestyle='dotted', + ) + self.lines["depth_envelop"] = line1 - d = list(map(lambda p1, p2: p1 - p2, - map( - lambda p: min(p.get_key("Z")), - reach.profiles - ), z_min) - ) - line2 = ax.plot( - rk, d, - color='brown', lw=1., - linestyle='dotted', - ) - #self.lines["depth_envelop2"] = line2 + d = list(map(lambda p1, p2: p1 - p2, + map( + lambda p: min(p.get_key("Z")), + reach.profiles + ), z_min) + ) + line2 = ax.plot( + rk, d, + color='brown', lw=1., + linestyle='dotted', + ) + #self.lines["depth_envelop2"] = line2 if "mean_depth" in self._y: diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index df9021b5..38f7005d 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -490,11 +490,13 @@ class ResultsWindow(PamhyrWindow): def _add_custom_plot(self): dlg = CustomPlotValuesSelectionDialog(parent=self) if dlg.exec(): - x, y = dlg.value - self.create_new_tab_custom_plot(x, y) + x, y, envelop = dlg.value + self.create_new_tab_custom_plot(x, y, envelop) - def create_new_tab_custom_plot(self, x: str, y: list): + def create_new_tab_custom_plot(self, x: str, y: list, envelop: bool): name = f"{x}: {','.join(y)}" + if envelop and x == "rk": + name += "_envelop" wname = f"tab_custom_{x}_{y}" tab_widget = self.find(QTabWidget, f"tabWidget") @@ -518,7 +520,7 @@ class ResultsWindow(PamhyrWindow): ) plot = CustomPlot( - x, y, + x, y, envelop, self._get_current_reach(), self._get_current_profile(), self._get_current_timestamp(), @@ -589,7 +591,7 @@ class ResultsWindow(PamhyrWindow): dlg = CustomPlotValuesSelectionDialog(parent=self) if dlg.exec(): - x, y = dlg.value + x, y, = dlg.value else: return From 2896c604a5eb82b5358663f6d6f29f0c7844b9b6 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Mon, 4 Nov 2024 17:44:30 +0100 Subject: [PATCH 14/19] export envelops to .csv --- src/View/Results/CustomPlot/Plot.py | 26 ++--- src/View/Results/CustomPlot/Translate.py | 4 +- src/View/Results/Window.py | 125 +++++++++++++++++------ src/View/Results/translate.py | 15 ++- src/View/Translate.py | 4 +- 5 files changed, 123 insertions(+), 51 deletions(-) diff --git a/src/View/Results/CustomPlot/Plot.py b/src/View/Results/CustomPlot/Plot.py index c8bb0c6c..f807d508 100644 --- a/src/View/Results/CustomPlot/Plot.py +++ b/src/View/Results/CustomPlot/Plot.py @@ -165,7 +165,7 @@ class CustomPlot(PamhyrPlot): color='blue', linestyle='dotted', ) - #self.lines["water_elevation_envelop2"] = line2 + # self.lines["water_elevation_envelop2"] = line2 if "discharge" in self._y: @@ -204,7 +204,7 @@ class CustomPlot(PamhyrPlot): color='r', linestyle='dotted', ) - #self.lines["discharge_envelop2"] = line2 + # self.lines["discharge_envelop2"] = line2 if "velocity" in self._y: @@ -226,8 +226,9 @@ class CustomPlot(PamhyrPlot): if self._envelop: - velocities = list(map(lambda p: - list(map(lambda q, z: + velocities = list(map( + lambda p: list(map( + lambda q, z: p.geometry.speed(q, z), p.get_key("Q"), p.get_key("Z") )), reach.profiles @@ -250,7 +251,7 @@ class CustomPlot(PamhyrPlot): color='g', linestyle='dotted', ) - #self.lines["velocity_envelop2"] = line2 + # self.lines["velocity_envelop2"] = line2 if "depth" in self._y: @@ -272,8 +273,8 @@ class CustomPlot(PamhyrPlot): ax = self._axes[unit["depth_envelop"]] - d = list(map(lambda p1, p2: p1 - p2, - map( + d = list(map( + lambda p1, p2: p1 - p2, map( lambda p: max(p.get_key("Z")), reach.profiles ), z_min) @@ -285,8 +286,8 @@ class CustomPlot(PamhyrPlot): ) self.lines["depth_envelop"] = line1 - d = list(map(lambda p1, p2: p1 - p2, - map( + d = list(map( + lambda p1, p2: p1 - p2, map( lambda p: min(p.get_key("Z")), reach.profiles ), z_min) @@ -296,7 +297,7 @@ class CustomPlot(PamhyrPlot): color='brown', lw=1., linestyle='dotted', ) - #self.lines["depth_envelop2"] = line2 + # self.lines["depth_envelop2"] = line2 if "mean_depth" in self._y: @@ -781,10 +782,9 @@ class CustomPlot(PamhyrPlot): @timer def update(self): - if not self._init: - #self.draw_static() - self.draw_current() + #if not self._init: self.draw_update() + self.draw_current() return def set_reach(self, reach_id): diff --git a/src/View/Results/CustomPlot/Translate.py b/src/View/Results/CustomPlot/Translate.py index 1bfe7f96..b864f206 100644 --- a/src/View/Results/CustomPlot/Translate.py +++ b/src/View/Results/CustomPlot/Translate.py @@ -36,7 +36,9 @@ class CustomPlotTranslate(ResultsTranslate): self._dict['time'] = self._dict["unit_time_s"] self._dict['rk'] = self._dict["unit_rk"] self._dict['water_elevation'] = self._dict["unit_water_elevation"] - self._dict['water_elevation_envelop'] = self._dict["unit_water_elevation_envelop"] + self._dict['water_elevation_envelop'] = self._dict[ + "unit_water_elevation_envelop" + ] self._dict['discharge'] = self._dict["unit_discharge"] self._dict['discharge_envelop'] = self._dict["unit_discharge_envelop"] self._dict['bed_elevation'] = self._dict["unit_bed_elevation"] diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index 38f7005d..00b4434e 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -591,7 +591,7 @@ class ResultsWindow(PamhyrWindow): dlg = CustomPlotValuesSelectionDialog(parent=self) if dlg.exec(): - x, y, = dlg.value + x, y, envelop = dlg.value else: return @@ -601,12 +601,12 @@ class ResultsWindow(PamhyrWindow): ) self.file_dialog( select_file="AnyFile", - callback=lambda f: self.export_to(f[0], x, y), + callback=lambda f: self.export_to(f[0], x, y, envelop), default_suffix=".csv", file_filter=["CSV (*.csv)"], ) - def export_to(self, filename, x, y): + def export_to(self, filename, x, y, envelop): timestamps = sorted(self._results.get("timestamps")) reach = self._results.river.reachs[self._get_current_reach()] first_line = [f"Study: {self._results.study.name}", @@ -614,7 +614,7 @@ class ResultsWindow(PamhyrWindow): if x == "rk": timestamp = self._get_current_timestamp() first_line.append(f"Time: {timestamp}s") - val_dict = self._export_rk(timestamp, y, filename) + val_dict = self._export_rk(timestamp, y, envelop, filename) elif x == "time": profile_id = self._get_current_profile() profile = reach.profile(profile_id) @@ -626,15 +626,14 @@ class ResultsWindow(PamhyrWindow): writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) dict_x = self._trad.get_dict("values_x") - dict_y = self._trad.get_dict("values_y") - header = [dict_x[x]] + header = [] writer.writerow(first_line) - for text in y: - header.append(dict_y[text]) + for text in val_dict.keys(): + header.append(text) writer.writerow(header) - for row in range(len(val_dict[x])): - line = [val_dict[x][row]] - for var in y: + for row in range(len(val_dict[dict_x[x]])): + line = [] + for var in val_dict.keys(): line.append(val_dict[var][row]) writer.writerow(line) @@ -676,28 +675,59 @@ class ResultsWindow(PamhyrWindow): self._additional_plot.pop(tab_widget.tabText(index)) tab_widget.removeTab(index) - def _export_rk(self, timestamp, y, filename): + def _export_rk(self, timestamp, y, envelop, filename): reach = self._results.river.reachs[self._get_current_reach()] + dict_x = self._trad.get_dict("values_x") + dict_y = self._trad.get_dict("values_y") + if envelop: + dict_y.update(self._trad.get_dict("values_y_envelop")) my_dict = {} - my_dict["rk"] = reach.geometry.get_rk() - if "elevation" in y: - my_dict["elevation"] = reach.geometry.get_z_min() + my_dict[dict_x["rk"]] = reach.geometry.get_rk() + if "bed_elevation" in y: + my_dict[dict_y["bed_elevation"]] = reach.geometry.get_z_min() if "discharge" in y: - my_dict["discharge"] = list( + my_dict[dict_y["discharge"]] = list( map( lambda p: p.get_ts_key(timestamp, "Q"), reach.profiles ) ) + if envelop: + my_dict[dict_y["min_discharge"]] = list( + map( + lambda p: min(p.get_key("Q")), + reach.profiles + ) + ) + my_dict[dict_y["max_discharge"]] = list( + map( + lambda p: max(p.get_key("Q")), + reach.profiles + ) + ) if "water_elevation" in y: - my_dict["water_elevation"] = list( + my_dict[dict_y["water_elevation"]] = list( map( lambda p: p.get_ts_key(timestamp, "Z"), reach.profiles ) ) + if envelop: + my_dict[dict_y["min_water_elevation"]] = list( + map( + lambda p: min(p.get_key("Z")), + reach.profiles + ) + ) + my_dict[dict_y["max_water_elevation"]] = list( + map( + lambda p: max(p.get_key("Z")), + reach.profiles + ) + ) + if "velocity" in y: - my_dict["velocity"] = list( + my_dict[dict_y["velocity"]] = list( map( lambda p: p.geometry.speed( p.get_ts_key(timestamp, "Q"), @@ -705,16 +735,44 @@ class ResultsWindow(PamhyrWindow): reach.profiles ) ) + if envelop: + velocities = list(map( + lambda p: list(map( + lambda q, z: + p.geometry.speed(q, z), + p.get_key("Q"), p.get_key("Z") + )), reach.profiles + ) + ) + my_dict[dict_y["min_velocity"]] = [min(v) for v in velocities] + my_dict[dict_y["max_velocity"]] = [max(v) for v in velocities] + if "depth" in y: - my_dict["depth"] = list( + my_dict[dict_y["depth"]] = list( map( lambda p: p.geometry.max_water_depth( p.get_ts_key(timestamp, "Z")), reach.profiles ) ) + if envelop: + my_dict[dict_y["min_depth"]] = list(map( + lambda p1, p2: p1 - p2, map( + lambda p: min(p.get_key("Z")), + reach.profiles + ), reach.geometry.get_z_min() + ) + ) + my_dict[dict_y["max_depth"]] = list(map( + lambda p1, p2: p1 - p2, map( + lambda p: max(p.get_key("Z")), + reach.profiles + ), reach.geometry.get_z_min() + ) + ) + if "mean_depth" in y: - my_dict["mean_depth"] = list( + my_dict[dict_y["mean_depth"]] = list( map( lambda p: p.geometry.mean_water_depth( p.get_ts_key(timestamp, "Z")), @@ -722,7 +780,7 @@ class ResultsWindow(PamhyrWindow): ) ) if "froude" in y: - my_dict["froude"] = list( + my_dict[dict_y["froude"]] = list( map( lambda p: p.geometry.speed( @@ -738,7 +796,7 @@ class ResultsWindow(PamhyrWindow): ) ) if "wet_area" in y: - my_dict["wet_area"] = list( + my_dict[dict_y["wet_area"]] = list( map( lambda p: p.geometry.wet_area( p.get_ts_key(timestamp, "Z")), @@ -753,33 +811,36 @@ class ResultsWindow(PamhyrWindow): profile = reach.profile(profile) ts = list(self._results.get("timestamps")) ts.sort() + dict_x = self._trad.get_dict("values_x") + dict_y = self._trad.get_dict("values_y") my_dict = {} - my_dict["time"] = ts + my_dict[dict_x["time"]] = ts z = profile.get_key("Z") q = profile.get_key("Q") - if "elevation" in y: - my_dict["elevation"] = [profile.geometry.z_min()] * len(ts) + if "bed_elevation" in y: + my_dict[dict_y["bed_elevation"]] = [ + profile.geometry.z_min()] * len(ts) if "discharge" in y: - my_dict["discharge"] = q + my_dict[dict_y["discharge"]] = q if "water_elevation" in y: - my_dict["water_elevation"] = z + my_dict[dict_y["water_elevation"]] = z if "velocity" in y: - my_dict["velocity"] = list( + my_dict[dict_y["velocity"]] = list( map( lambda q, z: profile.geometry.speed(q, z), q, z ) ) if "depth" in y: - my_dict["depth"] = list( + my_dict[dict_y["depth"]] = list( map(lambda z: profile.geometry.max_water_depth(z), z) ) if "mean_depth" in y: - my_dict["mean_depth"] = list( + my_dict[dict_y["mean_depth"]] = list( map(lambda z: profile.geometry.mean_water_depth(z), z) ) if "froude" in y: - my_dict["froude"] = list( + my_dict[dict_y["froude"]] = list( map(lambda z, q: profile.geometry.speed(q, z) / sqrt(9.81 * ( @@ -788,7 +849,7 @@ class ResultsWindow(PamhyrWindow): ), z, q) ) if "wet_area" in y: - my_dict["wet_area"] = list( + my_dict[dict_y["wet_area"]] = list( map(lambda z: profile.geometry.wet_area(z), z) ) diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py index 68675e51..abdc2efb 100644 --- a/src/View/Results/translate.py +++ b/src/View/Results/translate.py @@ -75,14 +75,21 @@ class ResultsTranslate(MainTranslate): self._sub_dict["values_y"] = { "bed_elevation": self._dict["unit_bed_elevation"], "water_elevation": self._dict["unit_water_elevation"], - #"water_elevation_envelop": self._dict["unit_water_elevation_envelop"], "discharge": self._dict["unit_discharge"], - #"discharge_envelop": self._dict["unit_discharge_envelop"], "velocity": self._dict["unit_velocity"], - #"velocity_envelop": self._dict["unit_velocity_envelop"], "depth": self._dict["unit_depth"], - #"depth_envelop": self._dict["unit_depth_envelop"], "mean_depth": self._dict["unit_mean_depth"], "froude": self._dict["unit_froude"], "wet_area": self._dict["unit_wet_area"], } + + self._sub_dict["values_y_envelop"] = { + "min_water_elevation": self._dict["unit_min_water_elevation"], + "max_water_elevation": self._dict["unit_max_water_elevation"], + "min_discharge": self._dict["unit_min_discharge"], + "max_discharge": self._dict["unit_max_discharge"], + "min_velocity": self._dict["unit_min_velocity"], + "max_velocity": self._dict["unit_max_velocity"], + "min_depth": self._dict["unit_min_depth"], + "max_depth": self._dict["unit_max_depth"], + } diff --git a/src/View/Translate.py b/src/View/Translate.py index 160c95e9..fcde628a 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -69,7 +69,9 @@ class UnitTranslate(CommonWordTranslate): self._dict["unit_diameter"] = _translate("Unit", "Diameter (m)") self._dict["unit_thickness"] = _translate("Unit", "Thickness (m)") self._dict["unit_elevation"] = _translate("Unit", "Elevation (m)") - self._dict["unit_bed_elevation"] = _translate("Unit", "Bed Elevation (m)") + self._dict["unit_bed_elevation"] = _translate( + "Unit", "Bed Elevation (m)" + ) self._dict["unit_water_elevation"] = _translate( "Unit", "Water Elevation (m)" ) From 6852b08cfc9c8ea997f3828cfd833d15cabd3386 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Tue, 5 Nov 2024 11:16:17 +0100 Subject: [PATCH 15/19] debug CI --- .../InitialConditions/InitialConditions.py | 33 +++---------------- src/View/InitialConditions/PlotDRK.py | 27 +++++++-------- src/View/Results/CustomPlot/Plot.py | 2 +- 3 files changed, 19 insertions(+), 43 deletions(-) diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py index 82756070..b069a5db 100644 --- a/src/Model/InitialConditions/InitialConditions.py +++ b/src/Model/InitialConditions/InitialConditions.py @@ -360,26 +360,11 @@ class InitialConditions(SQLSubModel): def get_discharge(self): return self._data_get("discharge") - def _sort_by_z_and_rk(self, profiles): - profiles.sort( - reverse=False, - key=lambda p: p.rk - ) - - first_z = profiles[0].z() - last_z = profiles[-1].z() - - if first_z > last_z: - profiles.sort( - reverse=True, - key=lambda p: p.rk - ) - def generate_growing_constant_depth(self, height: float, compute_discharge: bool): profiles = self._reach.reach.profiles.copy() - self._sort_by_z_and_rk(profiles) + profiles.reverse() previous_elevation = -99999.99 @@ -433,12 +418,12 @@ class InitialConditions(SQLSubModel): previous_elevation = elevation self._data.append(new) - self._generate_resort_data(profiles) + self._data.reverse() def generate_discharge(self, discharge: float, compute_height: bool): profiles = self._reach.reach.profiles.copy() - self._sort_by_z_and_rk(profiles) + profiles.reverse() previous_elevation = -99999.99 @@ -491,7 +476,7 @@ class InitialConditions(SQLSubModel): previous_elevation = elevation self._data.append(new) - self._generate_resort_data(profiles) + self._data.reverse() def generate_height(self, elevation1: float, @@ -525,13 +510,3 @@ class InitialConditions(SQLSubModel): new["discharge"] = d new["elevation"] = elevation self._data.append(new) - - def _generate_resort_data(self, profiles): - is_reverse = False - if profiles[0].rk > profiles[-1].rk: - is_reverse = True - - self._data.sort( - reverse=not is_reverse, - key=lambda d: d['rk'] - ) diff --git a/src/View/InitialConditions/PlotDRK.py b/src/View/InitialConditions/PlotDRK.py index 352f7e47..42574896 100644 --- a/src/View/InitialConditions/PlotDRK.py +++ b/src/View/InitialConditions/PlotDRK.py @@ -77,31 +77,32 @@ class PlotDRK(PamhyrPlot): rk = self.data.get_rk() elevation = self.data.get_elevation() + sorted_rk, sorted_elevation = zip( + *sorted(zip(rk, elevation)) + ) + self.line_rk_elevation = self.canvas.axes.plot( - rk, elevation, + sorted_rk, sorted_elevation, color=self.color_plot_river_water, **self.plot_default_kargs ) z_min = self.data.reach.reach.get_z_min() geometry_rk = self.data.reach.reach.get_rk() - - filtred_elevation = list( - map( - lambda x: elevation[x[0]], - filter( - lambda x: x[1] in geometry_rk, - enumerate(rk) - ) - ) + sorted_geometry_rk, sorted_z_min = zip( + *sorted(zip(geometry_rk, z_min), reverse=True) ) - self.collection = self.canvas.axes.fill_between( - geometry_rk, z_min, filtred_elevation, + poly_x = sorted_rk + sorted_geometry_rk + poly_y = sorted_elevation + sorted_z_min + + self.collection = self.canvas.axes.fill( + poly_x, poly_y, color=self.color_plot_river_water_zone, - alpha=0.7, interpolate=True + alpha=0.7, ) + @timer def update(self, ind=None): self.draw() diff --git a/src/View/Results/CustomPlot/Plot.py b/src/View/Results/CustomPlot/Plot.py index f807d508..fcf5f8f2 100644 --- a/src/View/Results/CustomPlot/Plot.py +++ b/src/View/Results/CustomPlot/Plot.py @@ -782,7 +782,7 @@ class CustomPlot(PamhyrPlot): @timer def update(self): - #if not self._init: + # if not self._init: self.draw_update() self.draw_current() return From 5d0109769de4f8d32714fc435c239358fc350204 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Tue, 5 Nov 2024 11:25:10 +0100 Subject: [PATCH 16/19] pep8 --- src/View/InitialConditions/PlotDRK.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/View/InitialConditions/PlotDRK.py b/src/View/InitialConditions/PlotDRK.py index 42574896..edf94a20 100644 --- a/src/View/InitialConditions/PlotDRK.py +++ b/src/View/InitialConditions/PlotDRK.py @@ -102,7 +102,6 @@ class PlotDRK(PamhyrPlot): alpha=0.7, ) - @timer def update(self, ind=None): self.draw() From cef67540c2cf0429981ef61ba2ee5c647fd586af Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 6 Nov 2024 13:40:16 +0100 Subject: [PATCH 17/19] debug --- src/View/Results/translate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py index 7032f213..b6e8d4d5 100644 --- a/src/View/Results/translate.py +++ b/src/View/Results/translate.py @@ -109,7 +109,7 @@ class ResultsTranslate(MainTranslate): "name": _translate("Results", "Profile"), "water_elevation": self._dict["unit_water_elevation"], "discharge": self._dict["unit_discharge"], - "speed": self._dict["unit_speed"], + "discharge": self._dict["unit_discharge"], } self._sub_dict["values_y_envelop"] = { From 69134303d29d0ba12a4d478cf844717cd8db9495 Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Wed, 6 Nov 2024 17:52:11 +0100 Subject: [PATCH 18/19] work on bed evolution visu --- src/View/Results/CustomPlot/Plot.py | 165 ++++++++++++++++++++--- src/View/Results/CustomPlot/Translate.py | 3 + src/View/Results/Window.py | 1 + src/View/Results/translate.py | 2 + src/View/Translate.py | 9 ++ 5 files changed, 165 insertions(+), 15 deletions(-) diff --git a/src/View/Results/CustomPlot/Plot.py b/src/View/Results/CustomPlot/Plot.py index fcf5f8f2..4770fc7d 100644 --- a/src/View/Results/CustomPlot/Plot.py +++ b/src/View/Results/CustomPlot/Plot.py @@ -21,6 +21,7 @@ import logging from functools import reduce from datetime import datetime from numpy import sqrt +from numpy import asarray from tools import timer from View.Tools.PamhyrPlot import PamhyrPlot @@ -31,6 +32,7 @@ logger = logging.getLogger() unit = { "bed_elevation": "0-meter", + "bed_elevation_envelop": "0-meter", "water_elevation": "0-meter", "water_elevation_envelop": "0-meter", "discharge": "1-m3s", @@ -82,11 +84,97 @@ class CustomPlot(PamhyrPlot): self._axes = {} + def draw_bottom_with_bedload(self, reach): + self._bedrock = self.sl_compute_bedrock(reach) + + rk = reach.geometry.get_rk() + z = self.sl_compute_current_z(reach) + + return z + + def sl_compute_current_z(self, reach): + z_br = self._bedrock + sl = self.sl_compute_current_rk(reach) + + z = list( + map( + lambda z, sl: reduce( + lambda z, h: z + h[0], + sl, z + ), + z_br, # Bedrock elevation + sl # Current sediment layers + ) + ) + + return z + + def sl_compute_bedrock(self, reach): + z_min = reach.geometry.get_z_min() + sl = self.sl_compute_initial(reach) + + z = list( + map( + lambda z, sl: reduce( + lambda z, h: z - h[0], + sl, z + ), + z_min, # Original geometry + sl # Original sediment layers + ) + ) + + return z + + def sl_compute_initial(self, reach): + """ + Get SL list for profile p at initial time (initial data) + """ + t0 = min(list(self.data.get("timestamps"))) + return map( + lambda p: p.get_ts_key(t0, "sl")[0], + reach.profiles + ) + + def sl_compute_current_rk(self, reach): + """ + Get SL list for profile p at current time + """ + return map( + lambda p: p.get_ts_key(self._timestamp, "sl")[0], + reach.profiles + ) + + def get_ts_zmin(self, profile): + results = self.data + nt = len(list(results.get("timestamps"))) + reach = results.river.reach(self._reach) + berdrock = self.sl_compute_bedrock(reach) + sl = reach.profile(profile).get_key("sl") + + ts_z_bedrock = [berdrock[profile]]*nt + + ts_z_min = list( + map( + lambda z, sl: reduce( + lambda z, h: z + h, + sl, z + ), + ts_z_bedrock, # Bedrock elevations + asarray(sl)[:,0,:,0] # Sediment layers + ) + ) + return ts_z_min + def _draw_rk(self): results = self.data reach = results.river.reach(self._reach) rk = reach.geometry.get_rk() - z_min = reach.geometry.get_z_min() + if reach.has_sediment(): + z_min = self.draw_bottom_with_bedload(reach) + else: + z_min = reach.geometry.get_z_min() + q = list( map( lambda p: p.get_ts_key(self._timestamp, "Q"), @@ -120,6 +208,36 @@ class CustomPlot(PamhyrPlot): ) self.lines["bed_elevation"] = line + if self._envelop and reach.has_sediment(): + + ax = self._axes[unit["bed_elevation_envelop"]] + + e = list( + map( + lambda p: max(self.get_ts_zmin(p)), + range(len(reach)) + ) + ) + line1 = ax.plot( + rk, e, + color='grey', lw=1., + linestyle='dotted', + ) + self.lines["bed_elevation_envelop"] = line1 + + e = list( + map( + lambda p: min(self.get_ts_zmin(p)), + range(len(reach)) + ) + ) + line2 = ax.plot( + rk, e, + color='grey', lw=1., + linestyle='dotted', + ) + # self.lines["bed_elevation_envelop"] = line2 + if "water_elevation" in self._y: ax = self._axes[unit["water_elevation"]] @@ -371,6 +489,11 @@ class CustomPlot(PamhyrPlot): reach = results.river.reach(self._reach) rk = reach.geometry.get_rk() z_min = reach.geometry.get_z_min() + if reach.has_sediment(): + z_min = self.draw_bottom_with_bedload(reach) + else: + z_min = reach.geometry.get_z_min() + q = list( map( lambda p: p.get_ts_key(self._timestamp, "Q"), @@ -520,12 +643,15 @@ class CustomPlot(PamhyrPlot): q = profile.get_key("Q") z = profile.get_key("Z") z_min = profile.geometry.z_min() - ts_z_min = list( - map( - lambda ts: z_min, - ts + if reach.has_sediment(): + ts_z_min = self.get_ts_zmin(self._profile) + else: + ts_z_min = list( + map( + lambda ts: z_min, + ts + ) ) - ) self.lines = {} if "bed_elevation" in self._y: @@ -656,13 +782,18 @@ class CustomPlot(PamhyrPlot): q = profile.get_key("Q") z = profile.get_key("Z") - z_min = profile.geometry.z_min() - ts_z_min = list( - map( - lambda ts: z_min, - ts + if reach.has_sediment(): + ts_z_min = self.get_ts_zmin(self._profile) + else: + z_min = profile.geometry.z_min() + ts_z_min = list( + map( + lambda ts: z_min, + ts + ) ) - ) + if "bed_elevation" in self._y: + self.lines["bed_elevation"][0].set_ydata(ts_z_min) if "water_elevation" in self._y: self.lines["water_elevation"][0].set_ydata(z) @@ -716,6 +847,9 @@ class CustomPlot(PamhyrPlot): ) self.lines["wet_area"][0].set_ydata(d) + self.canvas.axes.relim(visible_only=True) + self.canvas.axes.autoscale_view() + def draw(self): self.draw_static() @@ -776,15 +910,15 @@ class CustomPlot(PamhyrPlot): lw=1., ) - self.canvas.figure.canvas.draw_idle() if self.toolbar is not None: self.toolbar.update() + self.canvas.draw_idle() @timer def update(self): - # if not self._init: self.draw_update() self.draw_current() + # self.draw_static() return def set_reach(self, reach_id): @@ -817,4 +951,5 @@ class CustomPlot(PamhyrPlot): elif self._x == "time": x = self._timestamp self._current.set_data([x, x], self.canvas.axes.get_ylim()) - self.canvas.figure.canvas.draw_idle() + self.canvas.draw_idle() + diff --git a/src/View/Results/CustomPlot/Translate.py b/src/View/Results/CustomPlot/Translate.py index b864f206..9148f07a 100644 --- a/src/View/Results/CustomPlot/Translate.py +++ b/src/View/Results/CustomPlot/Translate.py @@ -42,6 +42,9 @@ class CustomPlotTranslate(ResultsTranslate): self._dict['discharge'] = self._dict["unit_discharge"] self._dict['discharge_envelop'] = self._dict["unit_discharge_envelop"] self._dict['bed_elevation'] = self._dict["unit_bed_elevation"] + self._dict['bed_elevation_envelop'] = self._dict[ + "unit_bed_elevation_envelop" + ] self._dict['velocity'] = self._dict["unit_velocity"] self._dict['width'] = self._dict["unit_width"] self._dict['velocity_envelop'] = self._dict["unit_velocity_envelop"] diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index 00b4434e..c87c998e 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -685,6 +685,7 @@ class ResultsWindow(PamhyrWindow): my_dict[dict_x["rk"]] = reach.geometry.get_rk() if "bed_elevation" in y: my_dict[dict_y["bed_elevation"]] = reach.geometry.get_z_min() + #if envelop and reach.has_sediment(): if "discharge" in y: my_dict[dict_y["discharge"]] = list( map( diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py index abdc2efb..cb6ae63e 100644 --- a/src/View/Results/translate.py +++ b/src/View/Results/translate.py @@ -84,6 +84,8 @@ class ResultsTranslate(MainTranslate): } self._sub_dict["values_y_envelop"] = { + "min_bed_elevation": self._dict["unit_min_bed_elevation"], + "max_bed_elevation": self._dict["unit_max_bed_elevation"], "min_water_elevation": self._dict["unit_min_water_elevation"], "max_water_elevation": self._dict["unit_max_water_elevation"], "min_discharge": self._dict["unit_min_discharge"], diff --git a/src/View/Translate.py b/src/View/Translate.py index fcde628a..232eade9 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -72,6 +72,15 @@ class UnitTranslate(CommonWordTranslate): self._dict["unit_bed_elevation"] = _translate( "Unit", "Bed Elevation (m)" ) + self._dict["unit_bed_elevation_envelop"] = _translate( + "Unit", "Bed Elevation Envelop (m)" + ) + self._dict["unit_max_bed_elevation"] = _translate( + "Unit", "Max Bed Elevation (m)" + ) + self._dict["unit_min_bed_elevation"] = _translate( + "Unit", "Min Bed Elevation (m)" + ) self._dict["unit_water_elevation"] = _translate( "Unit", "Water Elevation (m)" ) From 58f72cfa6b411550d313e51a36f28d9b85f66d5c Mon Sep 17 00:00:00 2001 From: Theophile Terraz Date: Thu, 7 Nov 2024 16:28:07 +0100 Subject: [PATCH 19/19] add solver dirs in .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 7922bbcd..abdda20f 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,9 @@ __old__ *-venv +mage8 +adists + ### END CUSTOM ### # Created by https://www.toptal.com/developers/gitignore/api/python