diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index 58c4821d5..d854d0e26 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -201,6 +201,11 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): message += "No active Analysis\n" if self.analysis_type not in self.known_analysis_types: message += "Unknown analysis type: {}\n".format(self.analysis_type) + if not self.working_dir: + message += "Working directory not set\n" + import os + if not (os.path.isdir(self.working_dir)): + message += "Working directory \'{}\' doesn't exist.".format(self.working_dir) if not self.mesh: message += "No mesh object in the Analysis\n" if not self.material: @@ -312,11 +317,20 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): # @param self The python object self # @working_dir directory to be used for writing .inp file and executing CalculiX ccx def setup_working_dir(self, working_dir=None): - if working_dir is None: - self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") - self.working_dir = self.fem_prefs.GetString("WorkingDir", "/tmp") - else: + import os + if working_dir is not None: self.working_dir = working_dir + else: + self.working_dir = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem").GetString("WorkingDir") + + if not (os.path.isdir(self.working_dir)): + try: + os.makedirs(self.working_dir) + except: + print ("Dir \'{}\' doesn't exist and cannot be created.".format(self.working_dir)) + import tempfile + self.working_dir = tempfile.gettempdir() + print ("Dir \'{}\' will be used instead.".format(self.working_dir)) # Update inp file name self.set_inp_file_name() diff --git a/src/Mod/Fem/InitGui.py b/src/Mod/Fem/InitGui.py index dff1c52a1..bb6339365 100755 --- a/src/Mod/Fem/InitGui.py +++ b/src/Mod/Fem/InitGui.py @@ -58,6 +58,23 @@ class FemWorkbench (Workbench): FreeCAD.Console.PrintError("CalculiX ccx binary not found! Please set it manually in FEM preferences.\n") except Exception as e: FreeCAD.Console.PrintError(e.message) + fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") + + import os + working_dir = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem").GetString("WorkingDir") + if not (os.path.isdir(working_dir)): + try: + os.makedirs(working_dir) + except: + print ("Dir \'{}\' from FEM preferences doesn't exist and cannot be created.".format(working_dir)) + import tempfile + working_dir = tempfile.gettempdir() + print ("Dir \'{}\' will be used instead.".format(working_dir)) + if working_dir: + FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem").SetString("WorkingDir", working_dir) + else: + FreeCAD.Console.PrintError("Setting working directory \'{}\' for ccx failed!\n") + def GetClassName(self): return "FemGui::Workbench" diff --git a/src/Mod/Fem/TestFem.py b/src/Mod/Fem/TestFem.py index 9355f767c..c4561a663 100644 --- a/src/Mod/Fem/TestFem.py +++ b/src/Mod/Fem/TestFem.py @@ -182,7 +182,12 @@ class FemTest(unittest.TestCase): self.analysis.Member = self.analysis.Member + [self.pressure_constraint] fea = FemTools.FemTools(self.analysis, test_mode=True) - fcc_print('Checking FEM inp file prerequisites...') + fcc_print('Setting up working directory {}'.format(static_analysis_dir)) + fea.setup_working_dir(static_analysis_dir) + self.assertTrue(True if fea.working_dir == static_analysis_dir else False, + "Setting working directory {} failed".format(static_analysis_dir)) + + fcc_print('Checking FEM inp file prerequisites for static analysis...') error = fea.check_prerequisites() self.assertFalse(error, "FemTools check_prerequisites returned error message: {}".format(error)) @@ -192,11 +197,6 @@ class FemTest(unittest.TestCase): fea.set_analysis_type("static") self.assertTrue(True if fea.analysis_type == 'static' else False, "Setting anlysis type to \'static\' failed") - fcc_print('Setting up working directory {}'.format(static_analysis_dir)) - fea.setup_working_dir(static_analysis_dir) - self.assertTrue(True if fea.working_dir == static_analysis_dir else False, - "Setting working directory {} failed".format(static_analysis_dir)) - fcc_print('Writing {}/{}.inp for static analysis'.format(static_analysis_dir, mesh_name)) error = fea.write_inp_file() self.assertFalse(error, "Writing failed") @@ -238,6 +238,10 @@ class FemTest(unittest.TestCase): self.assertTrue(True if fea.working_dir == frequency_analysis_dir else False, "Setting working directory {} failed".format(frequency_analysis_dir)) + fcc_print('Checking FEM inp file prerequisites for frequency analysis...') + error = fea.check_prerequisites() + self.assertFalse(error, "FemTools check_prerequisites returned error message: {}".format(error)) + fcc_print('Writing {}/{}.inp for frequency analysis'.format(frequency_analysis_dir, mesh_name)) error = fea.write_inp_file() self.assertFalse(error, "Writing failed")