FEM: add preference setting to keep results on rerun an analysis
This commit is contained in:
parent
62cb403125
commit
fca5cd99bb
|
@ -76,6 +76,16 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
|
||||||
self.mesh.ViewObject.ElementColor = {}
|
self.mesh.ViewObject.ElementColor = {}
|
||||||
self.mesh.ViewObject.setNodeColorByScalars()
|
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
|
## Resets mesh color, deformation and removes all result objects
|
||||||
# @param self The python object self
|
# @param self The python object self
|
||||||
def reset_all(self):
|
def reset_all(self):
|
||||||
|
@ -96,6 +106,8 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
|
||||||
self.reset_mesh_color()
|
self.reset_mesh_color()
|
||||||
return
|
return
|
||||||
if self.result_object:
|
if self.result_object:
|
||||||
|
if self.result_object.Mesh.ViewObject.Visibility is False:
|
||||||
|
self.result_object.Mesh.ViewObject.Visibility = True
|
||||||
if result_type == "Sabs":
|
if result_type == "Sabs":
|
||||||
values = self.result_object.StressValues
|
values = self.result_object.StressValues
|
||||||
elif result_type == "Uabs":
|
elif result_type == "Uabs":
|
||||||
|
@ -362,13 +374,31 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
|
||||||
# Update inp file name
|
# Update inp file name
|
||||||
self.set_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):
|
def use_results(self, results_name=None):
|
||||||
for m in self.analysis.Member:
|
self.result_object = None
|
||||||
if m.isDerivedFrom("Fem::FemResultObject") and m.Name == results_name:
|
if results_name is not None:
|
||||||
self.result_object = m
|
for m in self.analysis.Member:
|
||||||
break
|
if m.isDerivedFrom("Fem::FemResultObject") and m.Name == results_name:
|
||||||
if not self.result_object:
|
self.result_object = m
|
||||||
raise Exception("{} doesn't exist".format(results_name))
|
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
|
## Returns minimum, average and maximum value for provided result type
|
||||||
# @param self The python object self
|
# @param self The python object self
|
||||||
|
|
|
@ -194,12 +194,11 @@ class FemToolsCcx(FemTools.FemTools):
|
||||||
import ccxFrdReader
|
import ccxFrdReader
|
||||||
frd_result_file = os.path.splitext(self.inp_file_name)[0] + '.frd'
|
frd_result_file = os.path.splitext(self.inp_file_name)[0] + '.frd'
|
||||||
if os.path.isfile(frd_result_file):
|
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:
|
for m in self.analysis.Member:
|
||||||
if m.isDerivedFrom("Fem::FemResultObject"):
|
if m.isDerivedFrom("Fem::FemResultObject"):
|
||||||
self.result_object = m
|
self.results_present = True
|
||||||
if self.result_object:
|
|
||||||
self.results_present = True
|
|
||||||
else:
|
else:
|
||||||
raise Exception('FEM: No results found at {}!'.format(frd_result_file))
|
raise Exception('FEM: No results found at {}!'.format(frd_result_file))
|
||||||
|
|
||||||
|
|
|
@ -121,15 +121,13 @@ class FemToolsZ88(FemTools.FemTools):
|
||||||
# z88_testrun for memory
|
# z88_testrun for memory
|
||||||
QtCore.QDir.setCurrent(self.calc_path.path())
|
QtCore.QDir.setCurrent(self.calc_path.path())
|
||||||
if not self.z88_is_running:
|
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"
|
z88_testrun_binary = self.z88_binary + " -t -choly"
|
||||||
print("Testrun Z88")
|
print("Testrun Z88")
|
||||||
print(z88_testrun_binary)
|
print(z88_testrun_binary)
|
||||||
self.z88_is_running = True
|
self.z88_is_running = True
|
||||||
self.z88_testrun.start(z88_testrun_binary)
|
self.z88_testrun.start(z88_testrun_binary)
|
||||||
else:
|
else:
|
||||||
print("Can not stat CalculiX, because it runs (testrun)!")
|
print("Unable to start Z88, because it runs (testrun)!")
|
||||||
QtCore.QDir.setCurrent(self.cwd)
|
QtCore.QDir.setCurrent(self.cwd)
|
||||||
QApplication.restoreOverrideCursor()
|
QApplication.restoreOverrideCursor()
|
||||||
|
|
||||||
|
@ -143,7 +141,7 @@ class FemToolsZ88(FemTools.FemTools):
|
||||||
self.z88_is_running = True
|
self.z88_is_running = True
|
||||||
self.z88_solverun.start(z88_solverun_binary)
|
self.z88_solverun.start(z88_solverun_binary)
|
||||||
else:
|
else:
|
||||||
print("Can not stat CalculiX, because it runs (solverun)!")
|
print("Unable to start Z88, because it runs (solverun)!")
|
||||||
QtCore.QDir.setCurrent(self.cwd)
|
QtCore.QDir.setCurrent(self.cwd)
|
||||||
QApplication.restoreOverrideCursor()
|
QApplication.restoreOverrideCursor()
|
||||||
|
|
||||||
|
@ -179,11 +177,10 @@ class FemToolsZ88(FemTools.FemTools):
|
||||||
import z88DispReader
|
import z88DispReader
|
||||||
disp_result_file = self.working_dir + '/z88o2.txt'
|
disp_result_file = self.working_dir + '/z88o2.txt'
|
||||||
if os.path.isfile(disp_result_file):
|
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:
|
for m in self.analysis.Member:
|
||||||
if m.isDerivedFrom("Fem::FemResultObject"):
|
if m.isDerivedFrom("Fem::FemResultObject"):
|
||||||
self.result_object = m
|
self.results_present = True
|
||||||
if self.result_object:
|
|
||||||
self.results_present = True
|
|
||||||
else:
|
else:
|
||||||
raise Exception('FEM: No results found at {}!'.format(disp_result_file))
|
raise Exception('FEM: No results found at {}!'.format(disp_result_file))
|
||||||
|
|
|
@ -573,6 +573,25 @@
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
<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>
|
<item>
|
||||||
<widget class="Gui::PrefCheckBox" name="cb_restore_result_dialog">
|
<widget class="Gui::PrefCheckBox" name="cb_restore_result_dialog">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
|
|
@ -62,6 +62,7 @@ void DlgSettingsFemImp::saveSettings()
|
||||||
cb_use_mat_from_custom_dir->onSave();
|
cb_use_mat_from_custom_dir->onSave();
|
||||||
fc_custom_mat_dir->onSave();
|
fc_custom_mat_dir->onSave();
|
||||||
cb_restore_result_dialog->onSave();
|
cb_restore_result_dialog->onSave();
|
||||||
|
cb_keep_results_on_rerun->onSave();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DlgSettingsFemImp::loadSettings()
|
void DlgSettingsFemImp::loadSettings()
|
||||||
|
@ -80,6 +81,7 @@ void DlgSettingsFemImp::loadSettings()
|
||||||
cb_use_mat_from_custom_dir->onRestore();
|
cb_use_mat_from_custom_dir->onRestore();
|
||||||
fc_custom_mat_dir->onRestore();
|
fc_custom_mat_dir->onRestore();
|
||||||
cb_restore_result_dialog->onRestore();
|
cb_restore_result_dialog->onRestore();
|
||||||
|
cb_keep_results_on_rerun->onRestore();
|
||||||
|
|
||||||
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath
|
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath
|
||||||
("User parameter:BaseApp/Preferences/Mod/Fem");
|
("User parameter:BaseApp/Preferences/Mod/Fem");
|
||||||
|
|
|
@ -243,7 +243,6 @@ class FemTest(unittest.TestCase):
|
||||||
|
|
||||||
fcc_print('Checking FEM frd file read from static analysis...')
|
fcc_print('Checking FEM frd file read from static analysis...')
|
||||||
fea.load_results()
|
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))
|
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...')
|
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...')
|
fcc_print('Checking FEM frd file read from frequency analysis...')
|
||||||
fea.load_results()
|
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))
|
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...')
|
fcc_print('Reading stats from result object for frequency analysis...')
|
||||||
|
|
|
@ -54,7 +54,7 @@ class _CommandRunSolver(FemCommands):
|
||||||
if FreeCADGui.Selection.getSelection()[0].SolverType == "FemSolverCalculix":
|
if FreeCADGui.Selection.getSelection()[0].SolverType == "FemSolverCalculix":
|
||||||
import FemToolsCcx
|
import FemToolsCcx
|
||||||
self.fea = FemToolsCcx.FemToolsCcx()
|
self.fea = FemToolsCcx.FemToolsCcx()
|
||||||
self.fea.reset_all()
|
self.fea.reset_mesh_purge_results_checked()
|
||||||
message = self.fea.check_prerequisites()
|
message = self.fea.check_prerequisites()
|
||||||
if message:
|
if message:
|
||||||
QtGui.QMessageBox.critical(None, "Missing prerequisite", message)
|
QtGui.QMessageBox.critical(None, "Missing prerequisite", message)
|
||||||
|
@ -64,7 +64,7 @@ class _CommandRunSolver(FemCommands):
|
||||||
elif FreeCADGui.Selection.getSelection()[0].SolverType == "FemSolverZ88":
|
elif FreeCADGui.Selection.getSelection()[0].SolverType == "FemSolverZ88":
|
||||||
import FemToolsZ88
|
import FemToolsZ88
|
||||||
self.fea = FemToolsZ88.FemToolsZ88()
|
self.fea = FemToolsZ88.FemToolsZ88()
|
||||||
self.fea.reset_all()
|
self.fea.reset_mesh_purge_results_checked()
|
||||||
message = self.fea.check_prerequisites()
|
message = self.fea.check_prerequisites()
|
||||||
if message:
|
if message:
|
||||||
QtGui.QMessageBox.critical(None, "Missing prerequisite", message)
|
QtGui.QMessageBox.critical(None, "Missing prerequisite", message)
|
||||||
|
|
|
@ -142,7 +142,7 @@ class _TaskPanelFemSolverCalculix:
|
||||||
self.femConsoleMessage("Loading result sets...")
|
self.femConsoleMessage("Loading result sets...")
|
||||||
self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
|
self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
|
||||||
fea = FemToolsCcx.FemToolsCcx()
|
fea = FemToolsCcx.FemToolsCcx()
|
||||||
fea.reset_all()
|
fea.reset_mesh_purge_results_checked()
|
||||||
fea.inp_file_name = self.inp_file_name
|
fea.inp_file_name = self.inp_file_name
|
||||||
QApplication.setOverrideCursor(Qt.WaitCursor)
|
QApplication.setOverrideCursor(Qt.WaitCursor)
|
||||||
fea.load_results()
|
fea.load_results()
|
||||||
|
|
|
@ -305,7 +305,7 @@ def calculate_von_mises(i):
|
||||||
return vm_stress
|
return vm_stress
|
||||||
|
|
||||||
|
|
||||||
def importFrd(filename, analysis=None):
|
def importFrd(filename, analysis=None, result_name_prefix=None):
|
||||||
m = readResult(filename)
|
m = readResult(filename)
|
||||||
mesh_object = None
|
mesh_object = None
|
||||||
if(len(m['Nodes']) > 0):
|
if(len(m['Nodes']) > 0):
|
||||||
|
@ -341,9 +341,9 @@ def importFrd(filename, analysis=None):
|
||||||
for result_set in m['Results']:
|
for result_set in m['Results']:
|
||||||
eigenmode_number = result_set['number']
|
eigenmode_number = result_set['number']
|
||||||
if eigenmode_number > 0:
|
if eigenmode_number > 0:
|
||||||
results_name = 'Mode_' + str(eigenmode_number) + '_results'
|
results_name = result_name_prefix + 'mode_' + str(eigenmode_number) + '_results'
|
||||||
else:
|
else:
|
||||||
results_name = 'Results'
|
results_name = result_name_prefix + 'results'
|
||||||
results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name)
|
results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name)
|
||||||
for m in analysis_object.Member:
|
for m in analysis_object.Member:
|
||||||
if m.isDerivedFrom("Fem::FemMeshObject"):
|
if m.isDerivedFrom("Fem::FemMeshObject"):
|
||||||
|
|
|
@ -53,7 +53,7 @@ def insert(filename, docname):
|
||||||
import_z88_disp(filename)
|
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
|
'''insert a FreeCAD FEM Result object in the ActiveDocument
|
||||||
'''
|
'''
|
||||||
m = read_z88_disp(filename)
|
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 !
|
analysis_object = analysis # see if statement few lines later, if not analysis -> no FemMesh object is created !
|
||||||
|
|
||||||
for result_set in m['Results']:
|
for result_set in m['Results']:
|
||||||
results_name = 'Results'
|
results_name = result_name_prefix + 'results'
|
||||||
results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name)
|
results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name)
|
||||||
for m in analysis_object.Member:
|
for m in analysis_object.Member:
|
||||||
if m.isDerivedFrom("Fem::FemMeshObject"):
|
if m.isDerivedFrom("Fem::FemMeshObject"):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user