FEM: multiple nonlinear materials, each nonlinear material is based on a linear material

This commit is contained in:
Bernd Hahnebach
2016-09-25 19:36:58 +01:00
committed by Yorik van Havre
parent 68ee3ac73c
commit d5bc6ba441
5 changed files with 35 additions and 16 deletions

View File

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

View File

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

View File

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

View File

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

View File

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