From 473aac450043e8ce85213e16f4c8061a8f050459 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Wed, 24 Jan 2024 14:51:19 +0100
Subject: [PATCH] Meshing: Define meshing with MailleurTT.

---
 .gitlab-ci.yml              |  2 +-
 src/Meshing/Mage.py         | 57 +++++++++++++++++++++++++++++++++++++
 src/View/Geometry/Window.py |  6 ++--
 3 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4f4dddb2..b3cff017 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -27,7 +27,7 @@ stages:
 #############
 
 variables:
-  MAGE_VERSION: "v8.3.4"
+  MAGE_VERSION: "v8.3.3"
 
 dl-mage-linux:
   stage: downloads
diff --git a/src/Meshing/Mage.py b/src/Meshing/Mage.py
index 360b8422..aeab9af1 100644
--- a/src/Meshing/Mage.py
+++ b/src/Meshing/Mage.py
@@ -28,7 +28,9 @@ from ctypes import (
     POINTER, c_void_p,
     c_int, c_double, c_bool
 )
+from PyQt5.QtCore import QProcess
 
+from tools import logger_color_red, logger_color_reset
 from Meshing.AMeshingTool import AMeshingTool
 
 logger = logging.getLogger()
@@ -259,3 +261,58 @@ class MeshingWithMage(AMeshingTool):
 
         logger.debug(f"meshing: Import geometry from {m}")
         reach.import_geometry(m)
+
+
+class MeshingWithMageMailleurTT(AMeshingTool):
+    def __init__(self):
+        super(MeshingWithMageMailleurTT, self).__init__()
+
+    @classmethod
+    def _exe_path(cls):
+        ext = "" if os.name == "posix" else ".exe"
+
+        return os.path.abspath(
+            os.path.join(
+                os.path.dirname(__file__),
+                "..", "..", "..", "mage", f"mailleurTT{ext}"
+            )
+        )
+
+    ###########
+    # Meshing #
+    ###########
+
+    def meshing(self, reach, step: float = 50):
+        if reach is None or len(reach.profiles) == 0:
+            return reach
+
+        with tempfile.TemporaryDirectory() as tmp:
+            st_file = self.export_reach_to_st(reach, tmp)
+            m_file = st_file.rsplit(".ST", 1)[0] + ".M"
+
+            proc = QProcess()
+            proc.setWorkingDirectory(tmp)
+
+            proc.start(
+                self._exe_path(), [st_file, m_file, str(step)]
+            )
+            proc.waitForFinished()
+
+            errors = str(proc.readAllStandardError())
+            if len(errors) != 0:
+                logger.error(f"{logger_color_red()}{errors}{logger_color_reset()}")
+            else:
+                self.import_m_file(reach, m_file)
+            return reach
+
+    def export_reach_to_st(self, reach, tmp):
+        tmp_st = os.path.join(tmp, "meshing.ST")
+
+        logger.debug(f"meshing: Export ST to {tmp_st}")
+
+        reach.export_reach(tmp_st)
+        return tmp_st
+
+    def import_m_file(self, reach, m):
+        logger.debug(f"meshing: Import geometry from {m}")
+        reach.import_geometry(m)
diff --git a/src/View/Geometry/Window.py b/src/View/Geometry/Window.py
index 0569b9ce..2ebd12f5 100644
--- a/src/View/Geometry/Window.py
+++ b/src/View/Geometry/Window.py
@@ -46,7 +46,9 @@ from View.Tools.PamhyrWindow import PamhyrWindow
 from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar
 from View.Tools.Plot.PamhyrCanvas import MplCanvas
 
-from Meshing.Mage import MeshingWithMage
+from Meshing.Mage import (
+    MeshingWithMage, MeshingWithMageMailleurTT
+)
 
 from View.Geometry.Table import GeometryReachTableModel
 from View.Geometry.PlotXY import PlotXY
@@ -264,7 +266,7 @@ class GeometryWindow(PamhyrWindow):
 
     def _edit_meshing(self):
         try:
-            mesher = MeshingWithMage()
+            mesher = MeshingWithMageMailleurTT()
             self._table.meshing(mesher, -1)
         except Exception as e:
             logger_exception(e)
-- 
GitLab