FEM: add preference setting to keep results on rerun an analysis

This commit is contained in:
Bernd Hahnebach 2016-05-27 17:12:12 +01:00 committed by Yorik van Havre
parent 62cb403125
commit fca5cd99bb
10 changed files with 73 additions and 29 deletions

View File

@ -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

View File

@ -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))

View File

@ -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))

View File

@ -573,6 +573,25 @@
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="Gui::PrefCheckBox" name="cb_keep_results_on_rerun">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Keep results on calculation Re-Run</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>KeepResultsOnReRun</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Fem</cstring>
</property>
</widget>
</item>
<item>
<widget class="Gui::PrefCheckBox" name="cb_restore_result_dialog">
<property name="text">

View File

@ -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");

View File

@ -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...')

View File

@ -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)

View File

@ -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()

View File

@ -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"):

View File

@ -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"):