From ce068a71c4273d37a2f88155f0d35b260ac96bc3 Mon Sep 17 00:00:00 2001 From: marioalexis Date: Wed, 2 Apr 2025 10:50:45 -0300 Subject: [PATCH] Fem: Rename base_femmeshtaskpanel to base_femlogtaskpanel --- src/Mod/Fem/CMakeLists.txt | 2 +- ...shtaskpanel.py => base_femlogtaskpanel.py} | 56 +++++++++++++------ src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py | 10 ++-- src/Mod/Fem/femtaskpanels/task_mesh_netgen.py | 10 ++-- 4 files changed, 49 insertions(+), 29 deletions(-) rename src/Mod/Fem/femtaskpanels/{base_femmeshtaskpanel.py => base_femlogtaskpanel.py} (81%) diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index aabc377464..622c3a3d46 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -579,7 +579,7 @@ SET(FemGuiObjects_SRCS SET(FemGuiTaskPanels_SRCS femtaskpanels/__init__.py femtaskpanels/base_femtaskpanel.py - femtaskpanels/base_femmeshtaskpanel.py + femtaskpanels/base_femlogtaskpanel.py femtaskpanels/task_constraint_bodyheatsource.py femtaskpanels/task_constraint_centrif.py femtaskpanels/task_constraint_currentdensity.py diff --git a/src/Mod/Fem/femtaskpanels/base_femmeshtaskpanel.py b/src/Mod/Fem/femtaskpanels/base_femlogtaskpanel.py similarity index 81% rename from src/Mod/Fem/femtaskpanels/base_femmeshtaskpanel.py rename to src/Mod/Fem/femtaskpanels/base_femlogtaskpanel.py index 5bce46cc90..5c37d7ceb2 100644 --- a/src/Mod/Fem/femtaskpanels/base_femmeshtaskpanel.py +++ b/src/Mod/Fem/femtaskpanels/base_femlogtaskpanel.py @@ -21,13 +21,13 @@ # * * # *************************************************************************** -__title__ = "FreeCAD FEM mesh base task panel for mesh object object" +__title__ = "FreeCAD FEM base task panel with logging" __author__ = "Mario Passaglia" __url__ = "https://www.freecad.org" -## @package base_femmeshtaskpanel +## @package base_femlogtaskpanel # \ingroup FEM -# \brief base task panel for mesh object +# \brief base task panel for logging from abc import ABC, abstractmethod @@ -44,27 +44,34 @@ from . import base_femtaskpanel class _Thread(QtCore.QThread): """ Class for thread and subprocess manipulation - 'tool' argument must be an object with 'compute' and 'prepare' methods + 'tool' argument must be an object with 'compute', 'prepare', 'update_properties' methods and a 'process' attribute of type QProcess object """ def __init__(self, tool): super().__init__() self.tool = tool + self.prepare_ok = False def run(self): - self.tool.prepare() + try: + self.tool.prepare() + self.prepare_ok = True + except Exception as e: + self.prepare_ok = False + FreeCAD.Console.PrintError("{}\n".format(e)) -class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): +class _BaseLogTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): """ - Abstract base class for FemMesh object TaskPanel + Abstract base class for TaskPanel with logging """ def __init__(self, obj, tool): super().__init__(obj) self.tool = tool self.timer = QtCore.QTimer() + self.elapsed = QtCore.QElapsedTimer() self._thread = _Thread(self.tool) self.text_log = None self.text_time = None @@ -97,17 +104,27 @@ class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): def thread_started(self): self.text_log.clear() - self.write_log("Prepare meshing...\n", QtGui.QColor(getOutputWinColor("Text"))) + self.write_log("Prepare process...\n", QtGui.QColor(getOutputWinColor("Text"))) QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) def thread_finished(self): + QtGui.QApplication.restoreOverrideCursor() + if self._thread.prepare_ok: + self.write_log("Preparation finished\n", QtGui.QColor(getOutputWinColor("Text"))) + self.preparation_finished() + else: + self.timer.stop() + self.write_log("Preparation failed.\n", QtGui.QColor(getOutputWinColor("Error"))) + return None + + def preparation_finished(self): self.tool.compute() def process_finished(self, code, status): if status == QtCore.QProcess.ExitStatus.NormalExit: if code != 0: self.write_log( - "Process finished with errors. Mesh not updated\n", + "Process finished with errors. Result not updated\n", QtGui.QColor(getOutputWinColor("Error")), ) return @@ -117,7 +134,8 @@ class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): self.write_log("Process crashed\n", QtGui.QColor(getOutputWinColor("Error"))) def process_started(self): - self.write_log("Start meshing...\n", QtGui.QColor(getOutputWinColor("Text"))) + QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) + self.write_log("Start process...\n", QtGui.QColor(getOutputWinColor("Text"))) def write_output(self): self.write_log( @@ -143,11 +161,11 @@ class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): self.text_log.ensureCursorVisible() @abstractmethod - def set_mesh_params(self): + def set_object_params(self): pass @abstractmethod - def get_mesh_params(self): + def get_object_params(self): pass def getStandardButtons(self): @@ -166,7 +184,7 @@ class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): self.timer.stop() QtGui.QApplication.restoreOverrideCursor() - self.set_mesh_params() + self.set_object_params() return super().accept() def reject(self): @@ -190,8 +208,10 @@ class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): FreeCAD.Console.PrintWarning("Process already running\n") return None - self.set_mesh_params() - self.run_mesher() + self.apply() + + def apply(self): + self.run_process() def update_timer_text(self): self.text_time.setText(f"Time: {self.elapsed.elapsed()/1000:4.1f} s") @@ -200,8 +220,8 @@ class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): self.timer.stop() QtGui.QApplication.restoreOverrideCursor() - def run_mesher(self): - self.elapsed = QtCore.QElapsedTimer() + def run_process(self): + self.set_object_params() self.elapsed.start() self.update_timer_text() self.timer.start(100) @@ -210,4 +230,4 @@ class _BaseMeshTaskPanel(base_femtaskpanel._BaseTaskPanel, ABC): def get_version(self): full_message = self.tool.version() - QtGui.QMessageBox.information(None, "{} - Information".format(self.tool.name), full_message) + QtGui.QMessageBox.information(None, "{} - Info".format(self.tool.name), full_message) diff --git a/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py b/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py index bbdf906d2c..0ebe8f7534 100644 --- a/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py +++ b/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py @@ -36,10 +36,10 @@ import FreeCADGui from femmesh import gmshtools -from . import base_femmeshtaskpanel +from . import base_femlogtaskpanel -class _TaskPanel(base_femmeshtaskpanel._BaseMeshTaskPanel): +class _TaskPanel(base_femlogtaskpanel._BaseLogTaskPanel): """ The TaskPanel for editing References property of MeshGmsh objects and creation of new FEM mesh @@ -78,16 +78,16 @@ class _TaskPanel(base_femmeshtaskpanel._BaseMeshTaskPanel): self.form.pb_get_gmsh_version, QtCore.SIGNAL("clicked()"), self.get_version ) - self.get_mesh_params() + self.get_object_params() self.set_widgets() - def get_mesh_params(self): + def get_object_params(self): self.clmax = self.obj.CharacteristicLengthMax self.clmin = self.obj.CharacteristicLengthMin self.dimension = self.obj.ElementDimension self.order = self.obj.ElementOrder - def set_mesh_params(self): + def set_object_params(self): self.obj.CharacteristicLengthMax = self.clmax self.obj.CharacteristicLengthMin = self.clmin self.obj.ElementDimension = self.dimension diff --git a/src/Mod/Fem/femtaskpanels/task_mesh_netgen.py b/src/Mod/Fem/femtaskpanels/task_mesh_netgen.py index 8d8081170c..e5d5e5a5c2 100644 --- a/src/Mod/Fem/femtaskpanels/task_mesh_netgen.py +++ b/src/Mod/Fem/femtaskpanels/task_mesh_netgen.py @@ -36,10 +36,10 @@ import FreeCADGui from femmesh import netgentools -from . import base_femmeshtaskpanel +from . import base_femlogtaskpanel -class _TaskPanel(base_femmeshtaskpanel._BaseMeshTaskPanel): +class _TaskPanel(base_femlogtaskpanel._BaseLogTaskPanel): """ The TaskPanel for editing References property of MeshNetgen objects and creation of new FEM mesh @@ -97,10 +97,10 @@ class _TaskPanel(base_femmeshtaskpanel._BaseMeshTaskPanel): self.form.pb_get_netgen_version, QtCore.SIGNAL("clicked()"), self.get_version ) - self.get_mesh_params() + self.get_object_params() self.set_widgets() - def get_mesh_params(self): + def get_object_params(self): self.min_size = self.obj.MinSize self.max_size = self.obj.MaxSize self.fineness = self.obj.Fineness @@ -110,7 +110,7 @@ class _TaskPanel(base_femmeshtaskpanel._BaseMeshTaskPanel): self.second_order = self.obj.SecondOrder self.user_p = self.get_user_fineness_params(self.obj) - def set_mesh_params(self): + def set_object_params(self): self.obj.MinSize = self.min_size self.obj.MaxSize = self.max_size self.obj.Fineness = self.fineness