[FEM] better pipeline connection for CalculiX

- make the connection also working for frequency and buckling analysis by directly creating/updating the pipeline where the CalculiX results are loaded
This commit is contained in:
Uwe
2023-03-16 03:46:43 +01:00
parent 138688d25e
commit 4ecf74322c
6 changed files with 37 additions and 57 deletions

View File

@@ -133,7 +133,6 @@ void ViewProviderFemPostPipeline::onSelectionChanged(const Gui::SelectionChanges
void ViewProviderFemPostPipeline::updateColorBars()
{
// take all visible childs and update its shape coloring
auto children = claimChildren();
for (auto& child : children) {

View File

@@ -742,8 +742,13 @@ def makePostVtkResult(
):
"""makePostVtkResult(document, base_result, [name]):
creates a FEM post processing result object (vtk based) to hold FEM results"""
obj = doc.addObject("Fem::FemPostPipeline", name)
Pipeline_Name = "Pipeline_" + name
obj = doc.addObject("Fem::FemPostPipeline", Pipeline_Name)
obj.load(base_result)
if FreeCAD.GuiUp:
obj.ViewObject.SelectionStyle = "BoundBox"
# to assure the user sees something, set the default to Surface
obj.ViewObject.DisplayMode = "Surface"
return obj

View File

@@ -107,9 +107,7 @@ def importFrd(
.format(result_name_prefix, eigenmode_number)
)
elif number_of_increments > 1:
if result_analysis_type == "buckling":
results_name = (
"{}BucklingFactor_{}_Results"
.format(result_name_prefix, step_time)
@@ -119,7 +117,6 @@ def importFrd(
"{}Time_{}_Results"
.format(result_name_prefix, step_time)
)
else:
results_name = (
"{}Results"
@@ -193,6 +190,31 @@ def importFrd(
# fill Stats
res_obj = resulttools.fill_femresult_stats(res_obj)
# create a results pipeline if not already existing
pipeline_name = "Pipeline_" + results_name
pipeline_obj = doc.getObject(pipeline_name)
if pipeline_obj is None:
pipeline_obj = ObjectsFem.makePostVtkResult(doc, res_obj, results_name)
pipeline_visibility = True
if analysis:
analysis.addObject(pipeline_obj)
else:
if FreeCAD.GuiUp:
# store pipeline visibility because pipeline_obj.load makes the
# pipeline always visible
pipeline_visibility = pipeline_obj.ViewObject.Visibility
pipeline_obj.load(res_obj)
# update the pipeline
pipeline_obj.recomputeChildren()
pipeline_obj.recompute()
if FreeCAD.GuiUp:
pipeline_obj.ViewObject.updateColorBars()
# make results mesh invisible, will be made visible
# later in task_solver_ccxtools.py
res_obj.Mesh.ViewObject.Visibility = False
# restore pipeline visibility
pipeline_obj.ViewObject.Visibility = pipeline_visibility
else:
error_message = (
"Nodes, but no results found in frd file. "

View File

@@ -65,11 +65,6 @@ class _TaskPanel:
# if Mesh and result are in active analysis
# activate the result mesh object
self.mesh_obj.ViewObject.show()
# hide pipeline if any
CCX_pipeline = FreeCADGui.ActiveDocument.getObject("SolverCCXResult")
if CCX_pipeline is not None:
self.pipeline_visibility = CCX_pipeline.Visibility
CCX_pipeline.hide()
ui_path = FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/"
self.result_widget = FreeCADGui.PySideUic.loadUi(ui_path + "ResultShow.ui")
@@ -195,12 +190,6 @@ class _TaskPanel:
self.result_widget.sb_displacement_factor_max.setValue(10. * scale_factor)
self.result_widget.sb_displacement_factor.setValue(scale_factor)
def __del__(self):
# restore visibility
CCX_pipeline = FreeCADGui.ActiveDocument.getObject("SolverCCXResult")
if self.pipeline_visibility and CCX_pipeline is not None:
CCX_pipeline.Visibility = self.pipeline_visibility
def restore_result_dialog(self):
try:
rt = FreeCAD.FEM_dialog["results_type"]

View File

@@ -249,8 +249,6 @@ class _TaskPanel:
# print("calculixFinished(), exit code: {}".format(exitCode))
FreeCAD.Console.PrintLog("calculix state: {}\n".format(self.Calculix.state()))
had_errors = False
# Restore previous cwd
QtCore.QDir.setCurrent(self.cwd)
@@ -260,7 +258,6 @@ class _TaskPanel:
self.calculixNoError()
else:
self.calculixError()
had_errors = True
self.form.pb_run_ccx.setText("Re-run CalculiX")
self.femConsoleMessage("Loading result sets...")
@@ -290,47 +287,15 @@ class _TaskPanel:
self.fea.load_results()
except Exception:
FreeCAD.Console.PrintError("loading results failed\n")
had_errors = True
QApplication.restoreOverrideCursor()
self.form.l_time.setText("Time: {0:4.1f}: ".format(time.time() - self.Start))
# create a results pipeline from the just created results object
if not had_errors:
CCX_results = self.fea.analysis.Document.getObject("CCX_Results")
# safe guard
if CCX_results is None:
return
# check if there is already a pipeline
self.CCX_pipeline = self.fea.analysis.Document.getObject("SolverCCXResult")
if self.CCX_pipeline is None:
try:
self._createResults()
except Exception:
FreeCAD.Console.PrintError("Results pipeline could not be created\n")
had_errors = True
self.CCX_pipeline.load(CCX_results)
self.CCX_pipeline.recomputeChildren()
self.fea.analysis.Document.recompute()
# recompute() updated the result mesh data
# but not the shape and bar coloring
self.CCX_pipeline.ViewObject.updateColorBars()
# restore mesh object visibility
CCX_mesh = self.fea.analysis.Document.getObject("ResultMesh")
if CCX_mesh is not None:
CCX_mesh.ViewObject.Visibility = self.CCX_mesh_visibility
else:
FreeCAD.Console.PrintError("\nNo result pipeline was created.\n")
def _createResults(self):
self.CCX_pipeline = self.fea.analysis.Document.addObject(
"Fem::FemPostPipeline", "SolverCCXResult")
self.CCX_pipeline.Label = "SolverCCXResult"
self.CCX_pipeline.ViewObject.SelectionStyle = "BoundBox"
self.fea.analysis.addObject(self.CCX_pipeline)
# to assure the user sees something, set the default to Surface
self.CCX_pipeline.ViewObject.DisplayMode = "Surface"
# restore mesh object visibility
CCX_mesh = self.fea.analysis.Document.getObject("ResultMesh")
if CCX_mesh is not None:
CCX_mesh.ViewObject.Visibility = self.CCX_mesh_visibility
def choose_working_dir(self):
wd = QtGui.QFileDialog.getExistingDirectory(None, "Choose CalculiX working directory",
self.fea.working_dir)

View File

@@ -86,7 +86,7 @@ class TestObjectCreate(unittest.TestCase):
# thus they should not be counted
# solver children: equations --> 8
# gmsh mesh children: group, region, boundary layer --> 3
# resule children: mesh result --> 1
# result children: mesh result --> 1
# post pipeline children: region, scalar, cut, wrap --> 5
# analysis itself is not in analysis group --> 1
# thus: -18