FEM: multiple nonlinear materials, check if each linear material has only one nonlinear material
This commit is contained in:
parent
9db81d238a
commit
dd92486ab5
|
@ -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):
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue
Block a user