diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index 5659bcaa8..0ec5bda2d 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -164,13 +164,13 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): def write_inp_file(self): import ccxInpWriter as iw import sys - self.base_name = "" + self.inp_file_name = "" try: inp_writer = iw.inp_writer(self.analysis, self.mesh, self.material, self.fixed_constraints, self.force_constraints, self.pressure_constraints, self.analysis_type, self.eigenmode_parameters, self.working_dir) - self.base_name = inp_writer.write_calculix_input_file() + self.inp_file_name = inp_writer.write_calculix_input_file() except: print "Unexpected error when writing CalculiX input file:", sys.exc_info()[0] raise @@ -179,7 +179,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): import multiprocessing import os import subprocess - if self.base_name != "": + if self.inp_file_name != "": ont_backup = os.environ.get('OMP_NUM_THREADS') if not ont_backup: ont_backup = "" @@ -187,7 +187,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): # change cwd because ccx may crash if directory has no write permission # there is also a limit of the length of file names so jump to the document directory cwd = QtCore.QDir.currentPath() - f = QtCore.QFileInfo(self.base_name) + f = QtCore.QFileInfo(self.inp_file_name) QtCore.QDir.setCurrent(f.path()) p = subprocess.Popen([self.ccx_binary, "-i ", f.baseName()], stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -212,6 +212,15 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): else: self.base_name = base_name + ## sets inp file name that is used to determine location and name of frd result file. + # Normally inp file name is set set by write_inp_file + # Can be used to read mock calculations file + def set_inp_file_name(self, inp_file_name=None): + if inp_file_name is not None: + self.inp_file_name = inp_file_name + else: + self.inp_file_name = self.working_dir + '/' + self.base_name + '.inp' + def set_analysis_type(self, analysis_type=None): if analysis_type is None: self.analysis_type = "static" @@ -243,16 +252,16 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): import ccxFrdReader import os self.results_present = False - result_file = self.working_dir + '/' + self.base_name + ".frd" - if os.path.isfile(result_file): - ccxFrdReader.importFrd(result_file, self.analysis) + frd_result_file = os.path.splitext(self.inp_file_name)[0] + '.frd' + if os.path.isfile(frd_result_file): + ccxFrdReader.importFrd(frd_result_file, self.analysis) for m in self.analysis.Member: if m.isDerivedFrom("Fem::FemResultObject"): self.result_object = m if self.result_object is not None: self.results_present = True else: - raise Exception('FEM: No results found at {}!'.format(result_file)) + raise Exception('FEM: No results found at {}!'.format(frd_result_file)) def use_results(self, results_name=None): for m in self.analysis.Member: diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index 1fc81cdf6..03a86be59 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -460,17 +460,16 @@ class _JobControlTaskPanel: self.ext_editor_process.start(ext_editor_path, [filename]) def editCalculixInputFile(self): - filename = self.base_name + '.inp' - print 'editCalculixInputFile {}'.format(filename) + print 'editCalculixInputFile {}'.format(self.inp_file_name) if self.fem_prefs.GetBool("UseInternalEditor", True): - FemGui.open(filename) + FemGui.open(self.inp_file_name) else: ext_editor_path = self.fem_prefs.GetString("ExternalEditorPath", "") if ext_editor_path: - self.start_ext_editor(ext_editor_path, filename) + self.start_ext_editor(ext_editor_path, self.inp_file_name) else: print "External editor is not defined in FEM preferences. Falling back to internal editor" - FemGui.open(filename) + FemGui.open(self.inp_file_name) def runCalculix(self): print 'runCalculix' diff --git a/src/Mod/Fem/TestFem.py b/src/Mod/Fem/TestFem.py index 19bdacdd0..ed822c07a 100644 --- a/src/Mod/Fem/TestFem.py +++ b/src/Mod/Fem/TestFem.py @@ -208,6 +208,11 @@ class FemTest(unittest.TestCase): self.assertTrue(True if fea.base_name == static_base_name else False, "Setting base name to {} failed".format(static_base_name)) + fcc_print('Setting inp file name to read test {}.frd file...'.format('cube_static')) + fea.set_inp_file_name() + self.assertTrue(True if fea.inp_file_name == static_analysis_inp_file else False, + "Setting inp file name to {} failed".format(static_analysis_inp_file)) + fcc_print('Checking FEM frd file read from static analysis...') fea.load_results() fcc_print('Result object created as \"{}\"'.format(fea.result_object.Name)) @@ -244,6 +249,11 @@ class FemTest(unittest.TestCase): self.assertTrue(True if fea.base_name == frequency_base_name else False, "Setting base name to {} failed".format(frequency_base_name)) + fcc_print('Setting inp file name to read test {}.frd file...'.format('cube_frequency')) + fea.set_inp_file_name() + self.assertTrue(True if fea.inp_file_name == frequency_analysis_inp_file else False, + "Setting inp file name to {} failed".format(frequency_analysis_inp_file)) + fcc_print('Checking FEM frd file read from frequency analysis...') fea.load_results() diff --git a/src/Mod/Fem/ccxInpWriter.py b/src/Mod/Fem/ccxInpWriter.py index 22572b8d0..2d927f972 100644 --- a/src/Mod/Fem/ccxInpWriter.py +++ b/src/Mod/Fem/ccxInpWriter.py @@ -23,8 +23,8 @@ class inp_writer: self.dir_name = FreeCAD.ActiveDocument.TransientDir.replace('\\', '/') + '/FemAnl_' + analysis_obj.Uid[-4:] if not os.path.isdir(self.dir_name): os.mkdir(self.dir_name) - self.base_name = self.dir_name + '/' + self.mesh_object.Name - self.file_name = self.base_name + '.inp' + self.base_name = self.mesh_object.Name + self.file_name = self.dir_name + '/' + self.base_name + '.inp' self.fc_ver = FreeCAD.Version() def write_calculix_input_file(self): @@ -48,7 +48,7 @@ class inp_writer: self.write_step_end(inpfile) self.write_footer(inpfile) inpfile.close() - return self.base_name + return self.file_name def write_element_sets_material_and_femelement_type(self, f): f.write('\n***********************************************************\n')