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" 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: 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" 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: if not self.materials_linear:
message += "No material object defined in the analysis\n" message += "No material object defined in the analysis\n"
has_no_references = False 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" message += "Thermomechanical analysis: No ThermalExpansionCoefficient defined for at least one material.\n"
if 'SpecificHeat' not in mat_map: if 'SpecificHeat' not in mat_map:
message += "Thermomechanical analysis: No SpecificHeat defined for at least one material.\n" 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 # constraints
if self.analysis_type == "static": if self.analysis_type == "static":
if not (self.fixed_constraints or self.displacement_constraints): if not (self.fixed_constraints or self.displacement_constraints):

View File

@ -47,13 +47,19 @@ class _CommandMaterialMechanicalNonlinear(FemCommands):
sel = FreeCADGui.Selection.getSelection() sel = FreeCADGui.Selection.getSelection()
if len(sel) == 1 and sel[0].isDerivedFrom("App::MaterialObjectPython"): if len(sel) == 1 and sel[0].isDerivedFrom("App::MaterialObjectPython"):
lin_mat_obj = sel[0] lin_mat_obj = sel[0]
# TODO --> check print # check if an nonlinear material exists which is based on the selected material already
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" allow_nonlinear_material = True
string_lin_mat_obj = "App.ActiveDocument.getObject('" + lin_mat_obj.Name + "')" for o in FreeCAD.ActiveDocument.Objects:
command_to_run = "FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemMaterialMechanicalNonlinear.makeFemMaterialMechanicalNonlinear(" + string_lin_mat_obj + ")]" if hasattr(o, "Proxy") and o.Proxy is not None and o.Proxy.Type == "FemMaterialMechanicalNonlinear" and o.LinearBaseMaterial == lin_mat_obj:
FreeCAD.ActiveDocument.openTransaction("Create FemMaterialMechanicalNonlinear") FreeCAD.Console.PrintError(o.Name + ' is based on the selected material: ' + lin_mat_obj.Name + '. Only one nonlinear object for each material allowed.\n')
FreeCADGui.addModule("FemMaterialMechanicalNonlinear") allow_nonlinear_material = False
FreeCADGui.doCommand(command_to_run) 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: if FreeCAD.GuiUp:
FreeCADGui.addCommand('Fem_MaterialMechanicalNonlinear', _CommandMaterialMechanicalNonlinear()) FreeCADGui.addCommand('Fem_MaterialMechanicalNonlinear', _CommandMaterialMechanicalNonlinear())