FEM: multiple materials for shell and beam meshes

This commit is contained in:
Bernd Hahnebach 2015-10-05 18:42:59 +02:00 committed by Yorik van Havre
parent f02ba31d02
commit 8cb6ed7d6a
3 changed files with 50 additions and 52 deletions

View File

@ -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,

View File

@ -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

View File

@ -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')