From fca5cd99bb2be5e504982b1a15f15474ab105faa Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Fri, 27 May 2016 17:12:12 +0100 Subject: [PATCH] FEM: add preference setting to keep results on rerun an analysis --- src/Mod/Fem/FemTools.py | 42 ++++++++++++++++++---- src/Mod/Fem/FemToolsCcx.py | 7 ++-- src/Mod/Fem/FemToolsZ88.py | 13 +++---- src/Mod/Fem/Gui/DlgSettingsFem.ui | 19 ++++++++++ src/Mod/Fem/Gui/DlgSettingsFemImp.cpp | 2 ++ src/Mod/Fem/TestFem.py | 3 -- src/Mod/Fem/_CommandRunSolver.py | 4 +-- src/Mod/Fem/_TaskPanelFemSolverCalculix.py | 2 +- src/Mod/Fem/ccxFrdReader.py | 6 ++-- src/Mod/Fem/z88DispReader.py | 4 +-- 10 files changed, 73 insertions(+), 29 deletions(-) diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index 901386153..6c93cbf29 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -76,6 +76,16 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): self.mesh.ViewObject.ElementColor = {} self.mesh.ViewObject.setNodeColorByScalars() + ## Resets mesh color, deformation and removes all result objects if preferences to keep them is not set + # @param self The python object self + def reset_mesh_purge_results_checked(self): + self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") + keep_results_on_rerun = self.fem_prefs.GetBool("KeepResultsOnReRun", False) + if not keep_results_on_rerun: + self.purge_results() + self.reset_mesh_color() + self.reset_mesh_deformation() + ## Resets mesh color, deformation and removes all result objects # @param self The python object self def reset_all(self): @@ -96,6 +106,8 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): self.reset_mesh_color() return if self.result_object: + if self.result_object.Mesh.ViewObject.Visibility is False: + self.result_object.Mesh.ViewObject.Visibility = True if result_type == "Sabs": values = self.result_object.StressValues elif result_type == "Uabs": @@ -362,13 +374,31 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): # Update inp file name self.set_inp_file_name() + ## Set the analysis result object + # if no result object is provided, check if the analysis has result objects + # if the analysis has exact one result object use this result object + # @param self The python object self + # @param result object name def use_results(self, results_name=None): - for m in self.analysis.Member: - if m.isDerivedFrom("Fem::FemResultObject") and m.Name == results_name: - self.result_object = m - break - if not self.result_object: - raise Exception("{} doesn't exist".format(results_name)) + self.result_object = None + if results_name is not None: + for m in self.analysis.Member: + if m.isDerivedFrom("Fem::FemResultObject") and m.Name == results_name: + self.result_object = m + break + if not self.result_object: + raise Exception("{} doesn't exist".format(results_name)) + else: + has_results = False + for m in self.analysis.Member: + if m.isDerivedFrom("Fem::FemResultObject"): + self.result_object = m + if has_results is True: + self.result_object = None + raise Exception("No result name was provided, but more than one result objects in the analysis.") + has_results = True + if not self.result_object: + raise Exception("No result object found in the analysis") ## Returns minimum, average and maximum value for provided result type # @param self The python object self diff --git a/src/Mod/Fem/FemToolsCcx.py b/src/Mod/Fem/FemToolsCcx.py index 136d671fb..f2d7e4073 100644 --- a/src/Mod/Fem/FemToolsCcx.py +++ b/src/Mod/Fem/FemToolsCcx.py @@ -194,12 +194,11 @@ class FemToolsCcx(FemTools.FemTools): import ccxFrdReader 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) + result_name_prefix = 'CalculiX_' + self.solver.AnalysisType + '_' + ccxFrdReader.importFrd(frd_result_file, self.analysis, result_name_prefix) for m in self.analysis.Member: if m.isDerivedFrom("Fem::FemResultObject"): - self.result_object = m - if self.result_object: - self.results_present = True + self.results_present = True else: raise Exception('FEM: No results found at {}!'.format(frd_result_file)) diff --git a/src/Mod/Fem/FemToolsZ88.py b/src/Mod/Fem/FemToolsZ88.py index 6f5a67cff..1225e6121 100644 --- a/src/Mod/Fem/FemToolsZ88.py +++ b/src/Mod/Fem/FemToolsZ88.py @@ -121,15 +121,13 @@ class FemToolsZ88(FemTools.FemTools): # z88_testrun for memory QtCore.QDir.setCurrent(self.calc_path.path()) if not self.z88_is_running: - #self.z88_binary = "/home/hugo/z88progr/z88v14os/bin/unix64/z88r" - #self.z88_testrun.start(self.z88_binary, ["-c -choly"]) z88_testrun_binary = self.z88_binary + " -t -choly" print("Testrun Z88") print(z88_testrun_binary) self.z88_is_running = True self.z88_testrun.start(z88_testrun_binary) else: - print("Can not stat CalculiX, because it runs (testrun)!") + print("Unable to start Z88, because it runs (testrun)!") QtCore.QDir.setCurrent(self.cwd) QApplication.restoreOverrideCursor() @@ -143,7 +141,7 @@ class FemToolsZ88(FemTools.FemTools): self.z88_is_running = True self.z88_solverun.start(z88_solverun_binary) else: - print("Can not stat CalculiX, because it runs (solverun)!") + print("Unable to start Z88, because it runs (solverun)!") QtCore.QDir.setCurrent(self.cwd) QApplication.restoreOverrideCursor() @@ -179,11 +177,10 @@ class FemToolsZ88(FemTools.FemTools): import z88DispReader disp_result_file = self.working_dir + '/z88o2.txt' if os.path.isfile(disp_result_file): - z88DispReader.import_z88_disp(disp_result_file, self.analysis) + result_name_prefix = 'Z88_' + self.solver.AnalysisType + '_' + z88DispReader.import_z88_disp(disp_result_file, self.analysis, result_name_prefix) for m in self.analysis.Member: if m.isDerivedFrom("Fem::FemResultObject"): - self.result_object = m - if self.result_object: - self.results_present = True + self.results_present = True else: raise Exception('FEM: No results found at {}!'.format(disp_result_file)) diff --git a/src/Mod/Fem/Gui/DlgSettingsFem.ui b/src/Mod/Fem/Gui/DlgSettingsFem.ui index eaa83d973..c23df5865 100644 --- a/src/Mod/Fem/Gui/DlgSettingsFem.ui +++ b/src/Mod/Fem/Gui/DlgSettingsFem.ui @@ -573,6 +573,25 @@ + + + + true + + + Keep results on calculation Re-Run + + + false + + + KeepResultsOnReRun + + + Mod/Fem + + + diff --git a/src/Mod/Fem/Gui/DlgSettingsFemImp.cpp b/src/Mod/Fem/Gui/DlgSettingsFemImp.cpp index 3e867e108..c72e949db 100644 --- a/src/Mod/Fem/Gui/DlgSettingsFemImp.cpp +++ b/src/Mod/Fem/Gui/DlgSettingsFemImp.cpp @@ -62,6 +62,7 @@ void DlgSettingsFemImp::saveSettings() cb_use_mat_from_custom_dir->onSave(); fc_custom_mat_dir->onSave(); cb_restore_result_dialog->onSave(); + cb_keep_results_on_rerun->onSave(); } void DlgSettingsFemImp::loadSettings() @@ -80,6 +81,7 @@ void DlgSettingsFemImp::loadSettings() cb_use_mat_from_custom_dir->onRestore(); fc_custom_mat_dir->onRestore(); cb_restore_result_dialog->onRestore(); + cb_keep_results_on_rerun->onRestore(); ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath ("User parameter:BaseApp/Preferences/Mod/Fem"); diff --git a/src/Mod/Fem/TestFem.py b/src/Mod/Fem/TestFem.py index 8ac511a45..103d34abd 100644 --- a/src/Mod/Fem/TestFem.py +++ b/src/Mod/Fem/TestFem.py @@ -243,7 +243,6 @@ class FemTest(unittest.TestCase): fcc_print('Checking FEM frd file read from static analysis...') fea.load_results() - fcc_print('Result object created as \"{}\"'.format(fea.result_object.Name)) self.assertTrue(fea.results_present, "Cannot read results from {}.frd frd file".format(fea.base_name)) fcc_print('Reading stats from result object for static analysis...') @@ -293,8 +292,6 @@ class FemTest(unittest.TestCase): fcc_print('Checking FEM frd file read from frequency analysis...') fea.load_results() - - fcc_print('Last result object created as \"{}\"'.format(fea.result_object.Name)) self.assertTrue(fea.results_present, "Cannot read results from {}.frd frd file".format(fea.base_name)) fcc_print('Reading stats from result object for frequency analysis...') diff --git a/src/Mod/Fem/_CommandRunSolver.py b/src/Mod/Fem/_CommandRunSolver.py index e3771ceab..d9bcf4459 100644 --- a/src/Mod/Fem/_CommandRunSolver.py +++ b/src/Mod/Fem/_CommandRunSolver.py @@ -54,7 +54,7 @@ class _CommandRunSolver(FemCommands): if FreeCADGui.Selection.getSelection()[0].SolverType == "FemSolverCalculix": import FemToolsCcx self.fea = FemToolsCcx.FemToolsCcx() - self.fea.reset_all() + self.fea.reset_mesh_purge_results_checked() message = self.fea.check_prerequisites() if message: QtGui.QMessageBox.critical(None, "Missing prerequisite", message) @@ -64,7 +64,7 @@ class _CommandRunSolver(FemCommands): elif FreeCADGui.Selection.getSelection()[0].SolverType == "FemSolverZ88": import FemToolsZ88 self.fea = FemToolsZ88.FemToolsZ88() - self.fea.reset_all() + self.fea.reset_mesh_purge_results_checked() message = self.fea.check_prerequisites() if message: QtGui.QMessageBox.critical(None, "Missing prerequisite", message) diff --git a/src/Mod/Fem/_TaskPanelFemSolverCalculix.py b/src/Mod/Fem/_TaskPanelFemSolverCalculix.py index eae135b55..67a6c9a86 100644 --- a/src/Mod/Fem/_TaskPanelFemSolverCalculix.py +++ b/src/Mod/Fem/_TaskPanelFemSolverCalculix.py @@ -142,7 +142,7 @@ class _TaskPanelFemSolverCalculix: self.femConsoleMessage("Loading result sets...") self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start)) fea = FemToolsCcx.FemToolsCcx() - fea.reset_all() + fea.reset_mesh_purge_results_checked() fea.inp_file_name = self.inp_file_name QApplication.setOverrideCursor(Qt.WaitCursor) fea.load_results() diff --git a/src/Mod/Fem/ccxFrdReader.py b/src/Mod/Fem/ccxFrdReader.py index e944f532c..4464be2d2 100644 --- a/src/Mod/Fem/ccxFrdReader.py +++ b/src/Mod/Fem/ccxFrdReader.py @@ -305,7 +305,7 @@ def calculate_von_mises(i): return vm_stress -def importFrd(filename, analysis=None): +def importFrd(filename, analysis=None, result_name_prefix=None): m = readResult(filename) mesh_object = None if(len(m['Nodes']) > 0): @@ -341,9 +341,9 @@ def importFrd(filename, analysis=None): for result_set in m['Results']: eigenmode_number = result_set['number'] if eigenmode_number > 0: - results_name = 'Mode_' + str(eigenmode_number) + '_results' + results_name = result_name_prefix + 'mode_' + str(eigenmode_number) + '_results' else: - results_name = 'Results' + results_name = result_name_prefix + 'results' results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name) for m in analysis_object.Member: if m.isDerivedFrom("Fem::FemMeshObject"): diff --git a/src/Mod/Fem/z88DispReader.py b/src/Mod/Fem/z88DispReader.py index acc23e272..3fd0a2eec 100644 --- a/src/Mod/Fem/z88DispReader.py +++ b/src/Mod/Fem/z88DispReader.py @@ -53,7 +53,7 @@ def insert(filename, docname): import_z88_disp(filename) -def import_z88_disp(filename, analysis=None): +def import_z88_disp(filename, analysis=None, result_name_prefix=None): '''insert a FreeCAD FEM Result object in the ActiveDocument ''' m = read_z88_disp(filename) @@ -67,7 +67,7 @@ def import_z88_disp(filename, analysis=None): analysis_object = analysis # see if statement few lines later, if not analysis -> no FemMesh object is created ! for result_set in m['Results']: - results_name = 'Results' + results_name = result_name_prefix + 'results' results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name) for m in analysis_object.Member: if m.isDerivedFrom("Fem::FemMeshObject"):