From d39ef34b4aecb84f627c4dde50929edb6b7887c5 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sun, 25 Sep 2016 19:37:05 +0100 Subject: [PATCH] FEM: nonlinear materials, set CalculiX solver to nonlinear analysis if nonlinear material is added --- src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py | 13 +++++++++++++ src/Mod/Fem/_CommandSolverCalculix.py | 13 +++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py index 3067bb192..76ea283cf 100644 --- a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py +++ b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py @@ -30,6 +30,7 @@ from FemCommands import FemCommands if FreeCAD.GuiUp: import FreeCADGui + import FemGui from PySide import QtCore @@ -60,6 +61,18 @@ class _CommandMaterialMechanicalNonlinear(FemCommands): FreeCAD.ActiveDocument.openTransaction("Create FemMaterialMechanicalNonlinear") FreeCADGui.addModule("FemMaterialMechanicalNonlinear") FreeCADGui.doCommand(command_to_run) + # set the material nonlinear property of the solver to nonlinear if only one solver is available and if this solver is a CalculiX solver + solver_object = None + for m in FemGui.getActiveAnalysis().Member: + if m.isDerivedFrom('Fem::FemSolverObjectPython'): + if not solver_object: + solver_object = m + else: + # we do not change the material nonlinear attribut if we have more than one solver + solver_object = None + break + if solver_object and solver_object.SolverType == 'FemSolverCalculix': + solver_object.MaterialNonlinearity = "nonlinear" if FreeCAD.GuiUp: FreeCADGui.addCommand('Fem_MaterialMechanicalNonlinear', _CommandMaterialMechanicalNonlinear()) diff --git a/src/Mod/Fem/_CommandSolverCalculix.py b/src/Mod/Fem/_CommandSolverCalculix.py index 482bb6c80..851aad36e 100644 --- a/src/Mod/Fem/_CommandSolverCalculix.py +++ b/src/Mod/Fem/_CommandSolverCalculix.py @@ -30,6 +30,7 @@ from FemCommands import FemCommands if FreeCAD.GuiUp: import FreeCADGui + import FemGui from PySide import QtCore @@ -44,10 +45,18 @@ class _CommandSolverCalculix(FemCommands): self.is_active = 'with_analysis' def Activated(self): + has_nonlinear_material_obj = False + for m in FemGui.getActiveAnalysis().Member: + if hasattr(m, "Proxy") and m.Proxy.Type == "FemMaterialMechanicalNonlinear": + has_nonlinear_material_obj = True FreeCAD.ActiveDocument.openTransaction("Create SolverCalculix") FreeCADGui.addModule("FemSolverCalculix") - FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemSolverCalculix.makeFemSolverCalculix()]") - + if has_nonlinear_material_obj: + FreeCADGui.doCommand("solver = FemSolverCalculix.makeFemSolverCalculix()") + FreeCADGui.doCommand("solver.MaterialNonlinearity = 'nonlinear'") + FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [solver]") + else: + FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemSolverCalculix.makeFemSolverCalculix()]") if FreeCAD.GuiUp: FreeCADGui.addCommand('Fem_SolverCalculix', _CommandSolverCalculix())