diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index 0354ac89c..65b07b407 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -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): diff --git a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py index 6d228585f..3067bb192 100644 --- a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py +++ b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py @@ -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())