FEM: multiple nonlinear materials, each nonlinear material is based on a linear material
This commit is contained in:
committed by
Yorik van Havre
parent
68ee3ac73c
commit
d5bc6ba441
@@ -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
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user