FEM: multiple nonlinear materials, check if each linear material has only one nonlinear material

This commit is contained in:
Bernd Hahnebach 2016-09-25 19:37:02 +01:00 committed by Yorik van Havre
parent 9db81d238a
commit dd92486ab5
2 changed files with 22 additions and 8 deletions

View File

@ -340,7 +340,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
message += "FEM mesh has no volume and no shell elements, either define a beam section or provide a FEM mesh with volume elements.\n"
if self.mesh.FemMesh.VolumeCount == 0 and self.mesh.FemMesh.FaceCount == 0 and self.mesh.FemMesh.EdgeCount == 0:
message += "FEM mesh has neither volume nor shell or edge elements. Provide a FEM mesh with elements!\n"
# materials_linear
# materials linear and nonlinear
if not self.materials_linear:
message += "No material object defined in the analysis\n"
has_no_references = False
@ -365,6 +365,14 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
message += "Thermomechanical analysis: No ThermalExpansionCoefficient defined for at least one material.\n"
if 'SpecificHeat' not in mat_map:
message += "Thermomechanical analysis: No SpecificHeat defined for at least one material.\n"
for m in self.materials_linear:
has_nonlinear_material = False
for nlm in self.materials_nonlinear:
if nlm['Object'].LinearBaseMaterial == m['Object']:
if has_nonlinear_material is False:
has_nonlinear_material = True
else:
message += "At least two nonlinear materials use the same linear base material. Only one nonlinear material for each linear material allowed. \n"
# constraints
if self.analysis_type == "static":
if not (self.fixed_constraints or self.displacement_constraints):

View File

@ -47,13 +47,19 @@ class _CommandMaterialMechanicalNonlinear(FemCommands):
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)
# check if an nonlinear material exists which is based on the selected material already
allow_nonlinear_material = True
for o in FreeCAD.ActiveDocument.Objects:
if hasattr(o, "Proxy") and o.Proxy is not None and o.Proxy.Type == "FemMaterialMechanicalNonlinear" and o.LinearBaseMaterial == lin_mat_obj:
FreeCAD.Console.PrintError(o.Name + ' is based on the selected material: ' + lin_mat_obj.Name + '. Only one nonlinear object for each material allowed.\n')
allow_nonlinear_material = False
break
if allow_nonlinear_material:
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())