From dd0b04e908620d89c7f87b25330dce904d50824a Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 10 Sep 2019 08:35:49 +0200 Subject: [PATCH] FEM: calculix task panel, Py3 fix for ccx output print --- .../_ViewProviderFemSolverCalculix.py | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py b/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py index fb150e1dc4..94046c5ce4 100644 --- a/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py +++ b/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py @@ -212,24 +212,39 @@ class _TaskPanelFemSolverCalculix: self.form.textEdit_Output.moveCursor(QtGui.QTextCursor.End) def printCalculiXstdout(self): + out = self.Calculix.readAllStandardOutput() + # print(type(out)) + # + if out.isEmpty(): self.femConsoleMessage("CalculiX stdout is empty", "#FF0000") + return False + + if sys.version_info.major >= 3: + # https://forum.freecadweb.org/viewtopic.php?f=18&t=39195 + # convert QByteArray to a binary string an decode it to "utf-8" + out = out.data().decode() # "utf-8" can be omitted + # print(type(out)) + # print(out) else: try: out = unicode(out, "utf-8", "replace") rx = QtCore.QRegExp("\\*ERROR.*\\n\\n") - print(rx) + # print(rx) rx.setMinimal(True) pos = rx.indexIn(out) while not pos < 0: match = rx.cap(0) FreeCAD.Console.PrintError(match.strip().replace("\n", " ") + "\n") pos = rx.indexIn(out, pos + 1) - out = os.linesep.join([s for s in out.splitlines() if s]) - self.femConsoleMessage(out.replace("\n", "
")) except UnicodeDecodeError: self.femConsoleMessage("Error converting stdout from CalculiX", "#FF0000") + out = os.linesep.join([s for s in out.splitlines() if s]) + out = out.replace("\n", "
") + # print(out) + self.femConsoleMessage(out) + if "*ERROR in e_c3d: nonpositive jacobian" in out: error_message = ( "\n\nCalculiX returned an error due to " @@ -237,6 +252,7 @@ class _TaskPanelFemSolverCalculix: "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: