From d5bc6ba44139a3aa3f07df4942452f0386f200d5 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sun, 25 Sep 2016 19:36:58 +0100 Subject: [PATCH] FEM: multiple nonlinear materials, each nonlinear material is based on a linear material --- src/Mod/Fem/FemCommands.py | 9 +++++++++ src/Mod/Fem/FemInputWriterCcx.py | 19 ++++++++++--------- src/Mod/Fem/FemMaterialMechanicalNonlinear.py | 5 +++-- .../_CommandMaterialMechanicalNonlinear.py | 16 +++++++++++----- .../Fem/_FemMaterialMechanicalNonlinear.py | 2 ++ 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/Mod/Fem/FemCommands.py b/src/Mod/Fem/FemCommands.py index 373c366190..2db6c9c668 100644 --- a/src/Mod/Fem/FemCommands.py +++ b/src/Mod/Fem/FemCommands.py @@ -56,6 +56,8 @@ class FemCommands(object): active = FemGui.getActiveAnalysis() is not None and self.active_analysis_in_active_doc() and self.results_present() elif self.is_active == 'with_part_feature': active = FreeCADGui.ActiveDocument is not None and self.part_feature_selected() + elif self.is_active == 'with_material': + active = FemGui.getActiveAnalysis() is not None and self.active_analysis_in_active_doc() and self.material_selected() elif self.is_active == 'with_solver': active = FemGui.getActiveAnalysis() is not None and self.active_analysis_in_active_doc() and self.solver_selected() elif self.is_active == 'with_analysis_without_solver': @@ -77,6 +79,13 @@ class FemCommands(object): else: return False + def material_selected(self): + sel = FreeCADGui.Selection.getSelection() + if len(sel) == 1 and sel[0].isDerivedFrom("App::MaterialObjectPython"): + return True + else: + return False + def active_analysis_in_active_doc(self): return FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 033d2e3f4f..d8267a15d8 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -337,15 +337,16 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): f.write('{0:.3e}\n'.format(TEC_in_mmK)) f.write('*SPECIFIC HEAT\n') f.write('{0:.3e}\n'.format(SH_in_JkgK)) - if self.solver_obj.MaterialNonlinearity == 'nonlinear': - if len(self.material_nonlinear_objects) == 1: # workaround since multiple is on TODO - nl_mat_obj = self.material_nonlinear_objects[0]['Object'] - if nl_mat_obj.MaterialModelNonlinearity == "simple hardening": - f.write('*PLASTIC\n') - f.write(nl_mat_obj.YieldPoint1 + '\n') - f.write(nl_mat_obj.YieldPoint2 + '\n') - else: - print('Only one nonlinear material supported!!') + # nonlinear material properties + if self.solver_obj.MaterialNonlinearity == 'nonlinear': + for femobj in self.material_nonlinear_objects: # femobj --> dict, FreeCAD document object is femobj['Object'] + nl_mat_obj = femobj['Object'] + if nl_mat_obj.LinearBaseMaterial == mat_obj: + if nl_mat_obj.MaterialModelNonlinearity == "simple hardening": + f.write('*PLASTIC\n') + f.write(nl_mat_obj.YieldPoint1 + '\n') + f.write(nl_mat_obj.YieldPoint2 + '\n') + f.write('\n') def write_constraints_initialtemperature(self, f): f.write('\n***********************************************************\n') diff --git a/src/Mod/Fem/FemMaterialMechanicalNonlinear.py b/src/Mod/Fem/FemMaterialMechanicalNonlinear.py index a6e26b8f27..e4b424d404 100644 --- a/src/Mod/Fem/FemMaterialMechanicalNonlinear.py +++ b/src/Mod/Fem/FemMaterialMechanicalNonlinear.py @@ -30,10 +30,11 @@ import FemGui import _FemMaterialMechanicalNonlinear -def makeFemMaterialMechanicalNonlinear(name="MechanicalMaterialNonlinear"): - '''makeFemMaterialMechanicalNonlinear([name]): creates an nonlinear material object''' +def makeFemMaterialMechanicalNonlinear(base_material, name="MechanicalMaterialNonlinear"): + '''makeFemMaterialMechanicalNonlinear(base_material, [name]): creates an nonlinear material object''' obj = FemGui.getActiveAnalysis().Document.addObject("Fem::FeaturePython", name) _FemMaterialMechanicalNonlinear._FemMaterialMechanicalNonlinear(obj) + obj.LinearBaseMaterial = base_material if FreeCAD.GuiUp: import _ViewProviderFemMaterialMechanicalNonlinear _ViewProviderFemMaterialMechanicalNonlinear._ViewProviderFemMaterialMechanicalNonlinear(obj.ViewObject) diff --git a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py index a7a8de5523..6d228585f0 100644 --- a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py +++ b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py @@ -41,13 +41,19 @@ class _CommandMaterialMechanicalNonlinear(FemCommands): 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialMechanicalNonlinear", "Nonlinear mechanical material"), 'Accel': "C, W", 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialMechanicalNonlinear", "Creates a nonlinear mechanical material")} - self.is_active = 'with_analysis' + self.is_active = 'with_material' def Activated(self): - FreeCAD.ActiveDocument.openTransaction("Create FemMaterialMechanicalNonlinear") - FreeCADGui.addModule("FemMaterialMechanicalNonlinear") - FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemMaterialMechanicalNonlinear.makeFemMaterialMechanicalNonlinear()]") - + sel = FreeCADGui.Selection.getSelection() + if len(sel) == 1 and sel[0].isDerivedFrom("App::MaterialObjectPython"): + lin_mat_obj = sel[0] + # TODO --> check print + print "check if an nonlinear material exists which referes to the selected material already, becaue for each linear material only one nonlinear material is allowed !!!\n" + string_lin_mat_obj = "App.ActiveDocument.getObject('" + lin_mat_obj.Name + "')" + command_to_run = "FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemMaterialMechanicalNonlinear.makeFemMaterialMechanicalNonlinear(" + string_lin_mat_obj + ")]" + FreeCAD.ActiveDocument.openTransaction("Create FemMaterialMechanicalNonlinear") + FreeCADGui.addModule("FemMaterialMechanicalNonlinear") + FreeCADGui.doCommand(command_to_run) if FreeCAD.GuiUp: FreeCADGui.addCommand('Fem_MaterialMechanicalNonlinear', _CommandMaterialMechanicalNonlinear()) diff --git a/src/Mod/Fem/_FemMaterialMechanicalNonlinear.py b/src/Mod/Fem/_FemMaterialMechanicalNonlinear.py index 1a22f2ed7f..9ac39849e4 100644 --- a/src/Mod/Fem/_FemMaterialMechanicalNonlinear.py +++ b/src/Mod/Fem/_FemMaterialMechanicalNonlinear.py @@ -31,6 +31,8 @@ class _FemMaterialMechanicalNonlinear: obj.Proxy = self self.Type = "FemMaterialMechanicalNonlinear" + obj.addProperty("App::PropertyLink", "LinearBaseMaterial", "Base", "Set the linear material the nonlinear build uppon.") + choices_nonlinear_material_models = ["simple hardening"] obj.addProperty("App::PropertyEnumeration", "MaterialModelNonlinearity", "Fem", "Set the type on nonlinear material model") obj.MaterialModelNonlinearity = choices_nonlinear_material_models