diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index 118cfd60f..640a84e0b 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -142,7 +142,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): self.mesh.ViewObject.applyDisplacement(displacement_factor) def update_objects(self): - # [{'Object':material}, {}, ...] + # [{'Object':materials}, {}, ...] # [{'Object':fixed_constraints, 'NodeSupports':bool}, {}, ...] # [{'Object':force_constraints, 'NodeLoad':value}, {}, ... # [{'Object':pressure_constraints, 'xxxxxxxx':value}, {}, ...] @@ -152,7 +152,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): ## @var mesh # mesh of the analysis. Used to generate .inp file and to show results self.mesh = None - self.material = [] + self.materials = [] ## @var fixed_constraints # set of fixed constraints from the analysis. Updated with update_objects # Individual constraints are "Fem::ConstraintFixed" type @@ -174,7 +174,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): elif m.isDerivedFrom("App::MaterialObjectPython"): material_dict = {} material_dict['Object'] = m - self.material.append(material_dict) + self.materials.append(material_dict) elif m.isDerivedFrom("Fem::ConstraintFixed"): fixed_constraint_dict = {} fixed_constraint_dict['Object'] = m @@ -209,8 +209,14 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): message += "Working directory \'{}\' doesn't exist.".format(self.working_dir) if not self.mesh: message += "No mesh object in the Analysis\n" - if not self.material: + if not self.materials: message += "No material object in the Analysis\n" + has_no_references = False + for m in self.materials: + if len(m['Object'].References) == 0: + if has_no_references is True: + message += "More than one Material has empty References list (Only one empty References list is allowed!).\n" + has_no_references = True if not self.fixed_constraints: message += "No fixed-constraint nodes defined in the Analysis\n" if self.analysis_type == "static": @@ -237,7 +243,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): import sys self.inp_file_name = "" try: - inp_writer = iw.inp_writer(self.analysis, self.mesh, self.material, + inp_writer = iw.inp_writer(self.analysis, self.mesh, self.materials, self.fixed_constraints, self.force_constraints, self.pressure_constraints, self.beam_sections, self.shell_thicknesses, diff --git a/src/Mod/Fem/MechanicalMaterial.py b/src/Mod/Fem/MechanicalMaterial.py index 84ace47ad..eb028f767 100644 --- a/src/Mod/Fem/MechanicalMaterial.py +++ b/src/Mod/Fem/MechanicalMaterial.py @@ -57,33 +57,22 @@ class _CommandMechanicalMaterial(FemCommands): self.is_active = 'with_analysis' def Activated(self): - MatObj = None - for i in FemGui.getActiveAnalysis().Member: - if i.isDerivedFrom("App::MaterialObject"): - MatObj = i - - if (not MatObj): - femDoc = FemGui.getActiveAnalysis().Document - if FreeCAD.ActiveDocument is not femDoc: - FreeCADGui.setActiveDocument(femDoc) - FreeCAD.ActiveDocument.openTransaction("Create Material") - FreeCADGui.addModule("MechanicalMaterial") - FreeCADGui.doCommand("MechanicalMaterial.makeMechanicalMaterial('MechanicalMaterial')") - FreeCADGui.doCommand("App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member = App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member + [App.ActiveDocument.ActiveObject]") - FreeCADGui.doCommand("Gui.activeDocument().setEdit(App.ActiveDocument.ActiveObject.Name,0)") - # FreeCADGui.doCommand("Fem.makeMaterial()") - else: - if FreeCAD.ActiveDocument is not MatObj.Document: - FreeCADGui.setActiveDocument(MatObj.Document) - FreeCADGui.doCommand("Gui.activeDocument().setEdit('" + MatObj.Name + "',0)") + femDoc = FemGui.getActiveAnalysis().Document + if FreeCAD.ActiveDocument is not femDoc: + FreeCADGui.setActiveDocument(femDoc) + FreeCAD.ActiveDocument.openTransaction("Create MechanicalMaterial") + FreeCADGui.addModule("MechanicalMaterial") + FreeCADGui.doCommand("MechanicalMaterial.makeMechanicalMaterial('MechanicalMaterial')") + FreeCADGui.doCommand("App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member = App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member + [App.ActiveDocument.ActiveObject]") + FreeCADGui.doCommand("Gui.activeDocument().setEdit(App.ActiveDocument.ActiveObject.Name)") class _MechanicalMaterial: "The Material object" def __init__(self, obj): - self.Type = "MechanicalMaterial" + obj.addProperty("App::PropertyLinkSubList", "References", "Material", "List of material shapes") obj.Proxy = self - # obj.Material = StartMat + self.Type = "MechanicalMaterial" def execute(self, obj): return diff --git a/src/Mod/Fem/ccxInpWriter.py b/src/Mod/Fem/ccxInpWriter.py index a6ffaa367..7c6442052 100644 --- a/src/Mod/Fem/ccxInpWriter.py +++ b/src/Mod/Fem/ccxInpWriter.py @@ -115,13 +115,15 @@ class inp_writer: else: # multiple mats, solid self.get_ccx_elsets_multiple_mat_solid() for ccx_elset in self.ccx_elsets: - # print(ccx_elset) f.write('*ELSET,ELSET=' + ccx_elset['ccx_elset_name'] + '\n') - if ccx_elset['ccx_elset'] == self.ccx_eall: - f.write(self.ccx_eall + '\n') + if ccx_elset['ccx_elset']: + if ccx_elset['ccx_elset'] == self.ccx_eall: + f.write(self.ccx_eall + '\n') + else: + for elid in ccx_elset['ccx_elset']: + f.write(str(elid) + ',\n') else: - for elid in ccx_elset['ccx_elset']: - f.write(str(elid) + ',\n') + f.write('**No elements found for these objects\n') def write_node_sets_constraints_fixed(self, f): f.write('\n***********************************************************\n') @@ -212,27 +214,28 @@ class inp_writer: f.write('** Sections\n') f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) for ccx_elset in self.ccx_elsets: - if 'beamsection_obj'in ccx_elset: # beam mesh - beamsec_obj = ccx_elset['beamsection_obj'] - elsetdef = 'ELSET=' + ccx_elset['ccx_elset_name'] + ', ' - material = 'MATERIAL=' + ccx_elset['ccx_mat_name'] - setion_def = '*BEAM SECTION, ' + elsetdef + material + ', SECTION=RECT\n' - setion_geo = str(beamsec_obj.Height.getValueAs('mm')) + ', ' + str(beamsec_obj.Width.getValueAs('mm')) + '\n' - f.write(setion_def) - f.write(setion_geo) - elif 'shellthickness_obj'in ccx_elset: # shell mesh - shellth_obj = ccx_elset['shellthickness_obj'] - elsetdef = 'ELSET=' + ccx_elset['ccx_elset_name'] + ', ' - material = 'MATERIAL=' + ccx_elset['ccx_mat_name'] - setion_def = '*SHELL SECTION, ' + elsetdef + material + '\n' - setion_geo = str(shellth_obj.Thickness.getValueAs('mm')) + '\n' - f.write(setion_def) - f.write(setion_geo) - else: # solid mesh - elsetdef = 'ELSET=' + ccx_elset['ccx_elset_name'] + ', ' - material = 'MATERIAL=' + ccx_elset['ccx_mat_name'] - setion_def = '*SOLID SECTION, ' + elsetdef + material + '\n' - f.write(setion_def) + if ccx_elset['ccx_elset']: + if 'beamsection_obj'in ccx_elset: # beam mesh + beamsec_obj = ccx_elset['beamsection_obj'] + elsetdef = 'ELSET=' + ccx_elset['ccx_elset_name'] + ', ' + material = 'MATERIAL=' + ccx_elset['ccx_mat_name'] + setion_def = '*BEAM SECTION, ' + elsetdef + material + ', SECTION=RECT\n' + setion_geo = str(beamsec_obj.Height.getValueAs('mm')) + ', ' + str(beamsec_obj.Width.getValueAs('mm')) + '\n' + f.write(setion_def) + f.write(setion_geo) + elif 'shellthickness_obj'in ccx_elset: # shell mesh + shellth_obj = ccx_elset['shellthickness_obj'] + elsetdef = 'ELSET=' + ccx_elset['ccx_elset_name'] + ', ' + material = 'MATERIAL=' + ccx_elset['ccx_mat_name'] + setion_def = '*SHELL SECTION, ' + elsetdef + material + '\n' + setion_geo = str(shellth_obj.Thickness.getValueAs('mm')) + '\n' + f.write(setion_def) + f.write(setion_geo) + else: # solid mesh + elsetdef = 'ELSET=' + ccx_elset['ccx_elset_name'] + ', ' + material = 'MATERIAL=' + ccx_elset['ccx_mat_name'] + setion_def = '*SOLID SECTION, ' + elsetdef + material + '\n' + f.write(setion_def) def write_step_begin(self, f): f.write('\n***********************************************************\n')