From 96f515748b05c05a88028126c23e6fdd3e5820ae Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Wed, 24 Oct 2018 21:11:36 +0200 Subject: [PATCH] FEM: ccx solver task panel run, return error if CalculiX has finished but there are errors in output. Happens on nonpositive jacobians --- .../_ViewProviderFemSolverCalculix.py | 24 ++++++++++++++++--- src/Mod/Fem/feminout/importCcxFrdResults.py | 7 +++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py b/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py index b962104987..d55a507ac7 100644 --- a/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py +++ b/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py @@ -179,6 +179,7 @@ class _TaskPanelFemSolverCalculix: try: out = unicode(out, 'utf-8', 'replace') rx = QtCore.QRegExp("\\*ERROR.*\\n\\n") + print(rx) rx.setMinimal(True) pos = rx.indexIn(out) while not pos < 0: @@ -189,15 +190,30 @@ class _TaskPanelFemSolverCalculix: self.femConsoleMessage(out.replace('\n', '
')) except UnicodeDecodeError: self.femConsoleMessage("Error converting stdout from CalculiX", "#FF0000") + if '*ERROR in e_c3d: nonpositive jacobian' in out: + error_message = ( + "\n\nCalculiX returned an error due to " + "nonpositive jacobian determinant in at least one element\n" + "Use the run button on selected solver to get a better error output.\n" + ) + FreeCAD.Console.PrintError(error_message) + if '*ERROR' in out: + return False + else: + return True def UpdateText(self): if(self.Calculix.state() == QtCore.QProcess.ProcessState.Running): self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start)) - def calculixError(self, error): + def calculixError(self, error=''): print("Error() {}".format(error)) self.femConsoleMessage("CalculiX execute error: {}".format(error), "#FF0000") + def calculixNoError(self): + print("CalculiX done without error!") + self.femConsoleMessage("CalculiX done without error!", "#00AA00") + def calculixStarted(self): print("calculixStarted()") print(self.Calculix.state()) @@ -218,10 +234,12 @@ class _TaskPanelFemSolverCalculix: # Restore previous cwd QtCore.QDir.setCurrent(self.cwd) - self.printCalculiXstdout() self.Timer.stop() - self.femConsoleMessage("CalculiX done!", "#00AA00") + if self.printCalculiXstdout(): + self.calculixNoError() + else: + self.calculixError() self.form.pb_run_ccx.setText("Re-run CalculiX") self.femConsoleMessage("Loading result sets...") diff --git a/src/Mod/Fem/feminout/importCcxFrdResults.py b/src/Mod/Fem/feminout/importCcxFrdResults.py index 1a6ab5009b..bbb698edcb 100644 --- a/src/Mod/Fem/feminout/importCcxFrdResults.py +++ b/src/Mod/Fem/feminout/importCcxFrdResults.py @@ -108,7 +108,12 @@ def importFrd(filename, analysis=None, result_name_prefix=None): if analysis: analysis_object.addObject(results) else: - FreeCAD.Console.PrintMessage('We have nodes but no results in frd file, which means we only have a mesh in frd file. Normaly this happens for analysis type "NOANALYSIS".\n') + error_message = ( + "We have nodes but no results in frd file, which means we only have a mesh in frd file. " + "Usually this happens for analysis type 'NOANALYSIS' or if CalculiX returned no results because " + "of nonpositive jacobian determinant in at least one element.\n" + ) + FreeCAD.Console.PrintMessage(error_message) if analysis: analysis_object.addObject(result_mesh_object)