Exemplo n.º 1
0
 def get_material_elements(self):
     # it only works if either Volumes or Shellthicknesses or Beamsections are in the material objects
     # it means it does not work for mixed meshes and multiple materials, this is checked in check_prerequisites
     if self.femmesh.Volumes:
         # we only could do this for volumes, if a mesh contains volumes we're going to use them in the analysis
         # but a mesh could contain the element faces of the volumes as faces and the edges of the faces as edges,
         # there we have to check of some geometric objects
         all_found = False
         if self.femmesh.GroupCount:
             all_found = FemMeshTools.get_femelement_sets_from_group_data(self.femmesh, self.material_objects)
             print(all_found)
         if all_found is False:
             if not self.femelement_table:
                 self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
             # we're going to use the binary search for get_femelements_by_femnodes()
             # thus we need the parameter values self.femnodes_ele_table
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
             if not self.femnodes_ele_table:
                 self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table)
             FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects, self.femnodes_ele_table)
     if self.shellthickness_objects:
         if not self.femelement_table:
             self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
         FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects)
     if self.beamsection_objects or self.fluidsection_objects:
         if not self.femelement_table:
             self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
         FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects)
Exemplo n.º 2
0
    def get_constraints_pressure_faces(self):
        # TODO see comments in get_constraints_force_nodeloads(), it applies here too. Mhh it applies to all constraints ...
        '''
        # depreciated version
        # get the faces and face numbers
        for femobj in self.pressure_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
            femobj['PressureFaces'] = FemMeshTools.get_pressure_obj_faces_depreciated(self.femmesh, femobj)
            # print(femobj['PressureFaces'])
        '''

        if not self.femnodes_mesh:
            self.femnodes_mesh = self.femmesh.Nodes
        if not self.femelement_table:
            self.femelement_table = FemMeshTools.get_femelement_table(
                self.femmesh)
        if not self.femnodes_ele_table:
            self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(
                self.femnodes_mesh, self.femelement_table)

        for femobj in self.pressure_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
            pressure_faces = FemMeshTools.get_pressure_obj_faces(
                self.femmesh, self.femelement_table, self.femnodes_ele_table,
                femobj)
            # print(len(pressure_faces))
            femobj['PressureFaces'] = [(femobj['Object'].Name + ': face load',
                                        pressure_faces)]
            print(femobj['PressureFaces'])
Exemplo n.º 3
0
 def get_element_geometry2D_elements(self):
     # get element ids and write them into the objects
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(
             self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table,
                                      self.shellthickness_objects)
Exemplo n.º 4
0
 def get_constraints_force_nodeloads(self):
     # check shape type of reference shape
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         frc_obj = femobj['Object']
         if femobj['RefShapeType'] == 'Vertex':
             # print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation")
             pass
         elif femobj['RefShapeType'] == 'Face' and FemMeshTools.is_solid_femmesh(self.femmesh) and not FemMeshTools.has_no_face_data(self.femmesh):
             # print("solid_mesh with face data --> we do not need the femelement_table but we need the femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
         else:
             # print("mesh without needed data --> we need the femelement_table and femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
             if not self.femelement_table:
                 self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     # get node loads
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         frc_obj = femobj['Object']
         if frc_obj.Force == 0:
             print('  Warning --> Force = 0')
         if femobj['RefShapeType'] == 'Vertex':  # point load on vertieces
             femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_vertex_nodeload_table(self.femmesh, frc_obj)
         elif femobj['RefShapeType'] == 'Edge':  # line load on edges
             femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_edge_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
         elif femobj['RefShapeType'] == 'Face':  # area load on faces
             femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_face_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
Exemplo n.º 5
0
 def get_element_fluid1D_elements(self):
     # get element ids and write them into the objects
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(
             self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table,
                                      self.fluidsection_objects)
Exemplo n.º 6
0
 def get_ccx_elsets_multiple_mat_multiple_shell(self):
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(
             self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table,
                                      self.shellthickness_objects)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table,
                                      self.material_objects)
     for shellth_data in self.shellthickness_objects:
         shellth_obj = shellth_data['Object']
         for mat_data in self.material_objects:
             mat_obj = mat_data['Object']
             ccx_elset = {}
             ccx_elset['shellthickness_obj'] = shellth_obj
             elemids = []
             for elemid in shellth_data['FEMElements']:
                 if elemid in mat_data['FEMElements']:
                     elemids.append(elemid)
             ccx_elset['ccx_elset'] = elemids
             ccx_elset['ccx_elset_name'] = get_ccx_elset_shell_name(
                 mat_obj.Name, shellth_obj.Name, mat_data['ShortName'],
                 shellth_data['ShortName'])
             ccx_elset['mat_obj_name'] = mat_obj.Name
             ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
             self.ccx_elsets.append(ccx_elset)
Exemplo n.º 7
0
 def get_ccx_elsets_multiple_mat_multiple_beam(self):
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(
             self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table,
                                      self.beamsection_objects)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table,
                                      self.material_objects)
     for beamsec_data in self.beamsection_objects:
         beamsec_obj = beamsec_data['Object']
         for mat_data in self.material_objects:
             mat_obj = mat_data['Object']
             ccx_elset = {}
             ccx_elset['beamsection_obj'] = beamsec_obj
             elemids = []
             for elemid in beamsec_data['FEMElements']:
                 if elemid in mat_data['FEMElements']:
                     elemids.append(elemid)
             ccx_elset['ccx_elset'] = elemids
             ccx_elset['ccx_elset_name'] = get_ccx_elset_beam_name(
                 mat_obj.Name, beamsec_obj.Name, mat_data['ShortName'],
                 beamsec_data['ShortName'])
             ccx_elset['mat_obj_name'] = mat_obj.Name
             ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
             self.ccx_elsets.append(ccx_elset)
Exemplo n.º 8
0
def get_z88_element_type(femmesh, femelement_table=None):
    import FemMeshTools
    if not femmesh:
        print("Error: No femmesh!")
    if not femelement_table:
        print("We need to get the femelement_table first!")
        femelement_table = FemMeshTools.get_femelement_table(femmesh)
    # in some cases lowest key in femelement_table is not [1]
    for elem in sorted(femelement_table):
        elem_length = len(femelement_table[elem])
        print(elem_length)
        break  # break after the first elem
    if FemMeshTools.is_solid_femmesh(femmesh):
        if femmesh.TetraCount == femmesh.VolumeCount:
            if elem_length == 4:
                return 17
            elif elem_length == 10:
                return 16
            else:
                print('Tetra with neiter 4 nor 10 nodes')
        elif femmesh.HexaCount == femmesh.VolumeCount:
            if elem_length == 8:
                return 1
            elif elem_length == 20:
                return 10
            else:
                print('Hexa with neither 8 nor 20 nodes')
                return 0
        else:
            print('no tetra, no hexa or Mixed Volume Elements')
    elif FemMeshTools.is_face_femmesh(femmesh):
        if femmesh.TriangleCount == femmesh.FaceCount:
            if elem_length == 3:
                print('tria3mesh, not supported by z88')
                return 0
            elif elem_length == 6:
                return 24
            else:
                print('Tria with neither 3 nor 6 nodes')
                return 0
        elif femmesh.QuadrangleCount == femmesh.FaceCount:
            if elem_length == 4:
                print('quad4mesh, not supported by z88')
                return 0
            elif elem_length == 8:
                return 23
            else:
                print('Quad with neiter 4 nor 8 nodes')
                return 0
        else:
            print('no tria, no quad')
            return 0
    elif FemMeshTools.is_edge_femmesh(femmesh):
        print('Edge femmesh will be exported as 3D truss element nr 4')
        return 4
    else:
        print('Neither, edge, face or solid femmesh')
        return 0
    return 0
Exemplo n.º 9
0
def get_z88_element_type(femmesh, femelement_table=None):
    import FemMeshTools
    if not femmesh:
        print("Error: No femmesh!")
    if not femelement_table:
        print("We need to get the femelement_table first!")
        femelement_table = FemMeshTools.get_femelement_table(femmesh)
    # in some cases lowest key in femelement_table is not [1]
    for elem in sorted(femelement_table):
        elem_length = len(femelement_table[elem])
        print(elem_length)
        break  # break after the first elem
    if FemMeshTools.is_solid_femmesh(femmesh):
        if femmesh.TetraCount == femmesh.VolumeCount:
            if elem_length == 4:
                return 17
            elif elem_length == 10:
                return 16
            else:
                print('Tetra with neiter 4 nor 10 nodes')
        elif femmesh.HexaCount == femmesh.VolumeCount:
            if elem_length == 8:
                return 1
            elif elem_length == 20:
                return 10
            else:
                print('Hexa with neither 8 nor 20 nodes')
                return 0
        else:
            print('no tetra, no hexa or Mixed Volume Elements')
    elif FemMeshTools.is_face_femmesh(femmesh):
        if femmesh.TriangleCount == femmesh.FaceCount:
            if elem_length == 3:
                print('tria3mesh, not supported by z88')
                return 0
            elif elem_length == 6:
                return 24
            else:
                print('Tria with neither 3 nor 6 nodes')
                return 0
        elif femmesh.QuadrangleCount == femmesh.FaceCount:
            if elem_length == 4:
                print('quad4mesh, not supported by z88')
                return 0
            elif elem_length == 8:
                return 23
            else:
                print('Quad with neiter 4 nor 8 nodes')
                return 0
        else:
            print('no tria, no quad')
            return 0
    elif FemMeshTools.is_edge_femmesh(femmesh):
        print('Edge femmesh will be exported as 3D truss element nr 4')
        return 4
    else:
        print('Neither, edge, face or solid femmesh')
        return 0
    return 0
Exemplo n.º 10
0
 def get_element_geometry1D_elements(self):
     # get element ids and write them into the objects
     print("Beam sections")
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(
             self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table,
                                      self.beamsection_objects)
Exemplo n.º 11
0
 def get_material_elements(self):
     # it only works if either Volumes or Shellthicknesses or Beamsections are in the material objects
     # it means it does not work for mixed meshes and multiple materials, this is checked in check_prerequisites
     print("Materials")
     if self.femmesh.Volumes:
         # we only could do this for volumes, if a mesh contains volumes we're going to use them in the analysis
         # but a mesh could contain the element faces of the volumes as faces and the edges of the faces as edges,
         # there we have to check of some geometric objects
         all_found = False
         if self.femmesh.GroupCount:
             all_found = FemMeshTools.get_femelement_sets_from_group_data(
                 self.femmesh, self.material_objects)
             print(all_found)
         if all_found is False:
             if not self.femelement_table:
                 self.femelement_table = FemMeshTools.get_femelement_table(
                     self.femmesh)
             # we're going to use the binary search for get_femelements_by_femnodes()
             # thus we need the parameter values self.femnodes_ele_table
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
             if not self.femnodes_ele_table:
                 self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(
                     self.femnodes_mesh, self.femelement_table)
             FemMeshTools.get_femelement_sets(self.femmesh,
                                              self.femelement_table,
                                              self.material_objects,
                                              self.femnodes_ele_table)
     if self.shellthickness_objects:
         if not self.femelement_table:
             self.femelement_table = FemMeshTools.get_femelement_table(
                 self.femmesh)
         FemMeshTools.get_femelement_sets(self.femmesh,
                                          self.femelement_table,
                                          self.material_objects)
     if self.beamsection_objects or self.fluidsection_objects:
         if not self.femelement_table:
             self.femelement_table = FemMeshTools.get_femelement_table(
                 self.femmesh)
         FemMeshTools.get_femelement_sets(self.femmesh,
                                          self.femelement_table,
                                          self.material_objects)
Exemplo n.º 12
0
 def get_ccx_elsets_multiple_mat_solid(self):
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects)
     for mat_data in self.material_objects:
         mat_obj = mat_data['Object']
         ccx_elset = {}
         ccx_elset['ccx_elset'] = mat_data['FEMElements']
         ccx_elset['ccx_elset_name'] = get_ccx_elset_solid_name(mat_obj.Name, None, mat_data['ShortName'])
         ccx_elset['mat_obj_name'] = mat_obj.Name
         ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
         self.ccx_elsets.append(ccx_elset)
Exemplo n.º 13
0
 def get_constraints_force_nodeloads(self):
     # check shape type of reference shape
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         frc_obj = femobj['Object']
         # in GUI defined frc_obj all ref_shape have the same shape type
         # TODO in FemTools: check if all RefShapes really have the same type an write type to dictionary
         femobj['RefShapeType'] = ''
         if frc_obj.References:
             first_ref_obj = frc_obj.References[0]
             first_ref_shape = first_ref_obj[0].Shape.getElement(
                 first_ref_obj[1][0])
             femobj['RefShapeType'] = first_ref_shape.ShapeType
         else:
             # frc_obj.References could be empty ! # TODO in FemTools: check
             FreeCAD.Console.PrintError(
                 'At least one Force Object has empty References!\n')
         if femobj['RefShapeType'] == 'Vertex':
             # print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation")
             pass
         elif femobj[
                 'RefShapeType'] == 'Face' and FemMeshTools.is_solid_femmesh(
                     self.femmesh) and not FemMeshTools.has_no_face_data(
                         self.femmesh):
             # print("solid_mesh with face data --> we do not need the femelement_table but we need the femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
         else:
             # print("mesh without needed data --> we need the femelement_table and femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
             if not self.femelement_table:
                 self.femelement_table = FemMeshTools.get_femelement_table(
                     self.femmesh)
     # get node loads
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         frc_obj = femobj['Object']
         if frc_obj.Force == 0:
             print('  Warning --> Force = 0')
         if femobj['RefShapeType'] == 'Vertex':  # point load on vertieces
             femobj[
                 'NodeLoadTable'] = FemMeshTools.get_force_obj_vertex_nodeload_table(
                     self.femmesh, frc_obj)
         elif femobj['RefShapeType'] == 'Edge':  # line load on edges
             femobj[
                 'NodeLoadTable'] = FemMeshTools.get_force_obj_edge_nodeload_table(
                     self.femmesh, self.femelement_table,
                     self.femnodes_mesh, frc_obj)
         elif femobj['RefShapeType'] == 'Face':  # area load on faces
             femobj[
                 'NodeLoadTable'] = FemMeshTools.get_force_obj_face_nodeload_table(
                     self.femmesh, self.femelement_table,
                     self.femnodes_mesh, frc_obj)
Exemplo n.º 14
0
 def get_ccx_elsets_multiple_mat_single_shell(self):
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     shellth_obj = self.shellthickness_objects[0]['Object']
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects)
     for mat_data in self.material_objects:
         mat_obj = mat_data['Object']
         ccx_elset = {}
         ccx_elset['shellthickness_obj'] = shellth_obj
         ccx_elset['ccx_elset'] = mat_data['FEMElements']
         ccx_elset['ccx_elset_name'] = get_ccx_elset_shell_name(mat_obj.Name, shellth_obj.Name, mat_data['ShortName'])
         ccx_elset['mat_obj_name'] = mat_obj.Name
         ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
         self.ccx_elsets.append(ccx_elset)
Exemplo n.º 15
0
 def get_ccx_elsets_multiple_mat_single_beam(self):
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     beamsec_obj = self.beamsection_objects[0]['Object']
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects)
     for mat_data in self.material_objects:
         mat_obj = mat_data['Object']
         ccx_elset = {}
         ccx_elset['beamsection_obj'] = beamsec_obj
         ccx_elset['ccx_elset'] = mat_data['FEMElements']
         ccx_elset['ccx_elset_name'] = get_ccx_elset_beam_name(mat_obj.Name, beamsec_obj.Name, mat_data['ShortName'])
         ccx_elset['mat_obj_name'] = mat_obj.Name
         ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
         self.ccx_elsets.append(ccx_elset)
Exemplo n.º 16
0
 def get_ccx_elsets_single_mat_multiple_shell(self):
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     mat_obj = self.material_objects[0]['Object']
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.shellthickness_objects)
     for shellth_data in self.shellthickness_objects:
         shellth_obj = shellth_data['Object']
         ccx_elset = {}
         ccx_elset['shellthickness_obj'] = shellth_obj
         ccx_elset['ccx_elset'] = shellth_data['FEMElements']
         ccx_elset['ccx_elset_name'] = get_ccx_elset_shell_name(mat_obj.Name, shellth_obj.Name, None, shellth_data['ShortName'])
         ccx_elset['mat_obj_name'] = mat_obj.Name
         ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
         self.ccx_elsets.append(ccx_elset)
def export(objectslist, filename):
    "called when freecad exports a file"
    if len(objectslist) != 1:
        FreeCAD.Console.PrintError("This exporter can only export one object.\n")
        return
    obj = objectslist[0]
    if not obj.isDerivedFrom("Fem::FemMeshObject"):
        FreeCAD.Console.PrintError("No FEM mesh object selected.\n")
        return
    femnodes_mesh = obj.FemMesh.Nodes
    femelement_table = FemMeshTools.get_femelement_table(obj.FemMesh)
    z88_element_type = get_z88_element_type(obj.FemMesh, femelement_table)
    f = pyopen(filename, "wb")
    write_z88_mesh_to_file(femnodes_mesh, femelement_table, z88_element_type, f)
    f.close()
Exemplo n.º 18
0
 def write_z88_input(self):
     if not self.femnodes_mesh:
         self.femnodes_mesh = self.femmesh.Nodes
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
         self.element_count = len(self.femelement_table)
     self.set_z88_elparam()
     self.write_z88_mesh()
     self.write_z88_contraints()
     self.write_z88_face_loads()
     self.write_z88_materials()
     self.write_z88_elements_properties()
     self.write_z88_integration_properties()
     self.write_z88_memory_parameter()
     self.write_z88_solver_parameter()
     return self.dir_name
Exemplo n.º 19
0
 def write_z88_input(self):
     if not self.femnodes_mesh:
         self.femnodes_mesh = self.femmesh.Nodes
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
         self.element_count = len(self.femelement_table)
     self.set_z88_elparam()
     self.write_z88_mesh()
     self.write_z88_contraints()
     self.write_z88_face_loads()
     self.write_z88_materials()
     self.write_z88_elements_properties()
     self.write_z88_integration_properties()
     self.write_z88_memory_parameter()
     self.write_z88_solver_parameter()
     return self.dir_name
Exemplo n.º 20
0
def export(objectslist, filename):
    "called when freecad exports a file"
    if len(objectslist) != 1:
        FreeCAD.Console.PrintError(
            "This exporter can only export one object.\n")
        return
    obj = objectslist[0]
    if not obj.isDerivedFrom("Fem::FemMeshObject"):
        FreeCAD.Console.PrintError("No FEM mesh object selected.\n")
        return
    femnodes_mesh = obj.FemMesh.Nodes
    femelement_table = FemMeshTools.get_femelement_table(obj.FemMesh)
    z88_element_type = get_z88_element_type(obj.FemMesh, femelement_table)
    f = pyopen(filename, "wb")
    write_z88_mesh_to_file(femnodes_mesh, femelement_table, z88_element_type,
                           f)
    f.close()
Exemplo n.º 21
0
 def get_ccx_elsets_multiple_mat_solid(self):
     all_found = False
     if self.femmesh.GroupCount:
         all_found = FemMeshTools.get_femelement_sets_from_group_data(self.femmesh, self.material_objects)
         print(all_found)
     if all_found is False:
         if not self.femelement_table:
             self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
         FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects)
     for mat_data in self.material_objects:
         mat_obj = mat_data['Object']
         ccx_elset = {}
         ccx_elset['ccx_elset'] = mat_data['FEMElements']
         ccx_elset['ccx_elset_name'] = get_ccx_elset_solid_name(mat_obj.Name, None, mat_data['ShortName'])
         ccx_elset['mat_obj_name'] = mat_obj.Name
         ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
         self.ccx_elsets.append(ccx_elset)
Exemplo n.º 22
0
 def get_ccx_elsets_multiple_mat_multiple_beam(self):
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.beamsection_objects)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects)
     for beamsec_data in self.beamsection_objects:
         beamsec_obj = beamsec_data['Object']
         for mat_data in self.material_objects:
             mat_obj = mat_data['Object']
             ccx_elset = {}
             ccx_elset['beamsection_obj'] = beamsec_obj
             elemids = []
             for elemid in beamsec_data['FEMElements']:
                 if elemid in mat_data['FEMElements']:
                     elemids.append(elemid)
             ccx_elset['ccx_elset'] = elemids
             ccx_elset['ccx_elset_name'] = get_ccx_elset_beam_name(mat_obj.Name, beamsec_obj.Name, mat_data['ShortName'], beamsec_data['ShortName'])
             ccx_elset['mat_obj_name'] = mat_obj.Name
             ccx_elset['ccx_mat_name'] = mat_obj.Material['Name']
             self.ccx_elsets.append(ccx_elset)
Exemplo n.º 23
0
 def get_constraints_force_nodeloads(self):
     # check shape type of reference shape
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         print("Constraint force: " + femobj['Object'].Name)
         frc_obj = femobj['Object']
         if femobj['RefShapeType'] == 'Vertex':
             # print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation")
             pass
         elif femobj[
                 'RefShapeType'] == 'Face' and FemMeshTools.is_solid_femmesh(
                     self.femmesh) and not FemMeshTools.has_no_face_data(
                         self.femmesh):
             # print("solid_mesh with face data --> we do not need the femelement_table but we need the femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
         else:
             # print("mesh without needed data --> we need the femelement_table and femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
             if not self.femelement_table:
                 self.femelement_table = FemMeshTools.get_femelement_table(
                     self.femmesh)
     # get node loads
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         frc_obj = femobj['Object']
         if frc_obj.Force == 0:
             print('  Warning --> Force = 0')
         if femobj['RefShapeType'] == 'Vertex':  # point load on vertieces
             femobj[
                 'NodeLoadTable'] = FemMeshTools.get_force_obj_vertex_nodeload_table(
                     self.femmesh, frc_obj)
         elif femobj['RefShapeType'] == 'Edge':  # line load on edges
             femobj[
                 'NodeLoadTable'] = FemMeshTools.get_force_obj_edge_nodeload_table(
                     self.femmesh, self.femelement_table,
                     self.femnodes_mesh, frc_obj)
         elif femobj['RefShapeType'] == 'Face':  # area load on faces
             femobj[
                 'NodeLoadTable'] = FemMeshTools.get_force_obj_face_nodeload_table(
                     self.femmesh, self.femelement_table,
                     self.femnodes_mesh, frc_obj)
    def get_constraints_pressure_faces(self):
        # TODO see comments in get_constraints_force_nodeloads(), it applies here too. Mhh it applies to all constraints ...

        '''
        # depreciated version
        # get the faces and face numbers
        for femobj in self.pressure_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
            femobj['PressureFaces'] = FemMeshTools.get_pressure_obj_faces_depreciated(self.femmesh, femobj)
            # print(femobj['PressureFaces'])
        '''

        if not self.femnodes_mesh:
            self.femnodes_mesh = self.femmesh.Nodes
        if not self.femelement_table:
            self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
        if not self.femnodes_ele_table:
            self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table)

        for femobj in self.pressure_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
            pressure_faces = FemMeshTools.get_pressure_obj_faces(self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj)
            # print(len(pressure_faces))
            femobj['PressureFaces'] = [(femobj['Object'].Name + ': face load', pressure_faces)]
Exemplo n.º 25
0
 def get_constraints_force_nodeloads(self):
     # check shape type of reference shape
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         frc_obj = femobj['Object']
         # in GUI defined frc_obj all ref_shape have the same shape type
         # TODO in FemTools: check if all RefShapes really have the same type an write type to dictionary
         femobj['RefShapeType'] = ''
         if frc_obj.References:
             first_ref_obj = frc_obj.References[0]
             first_ref_shape = first_ref_obj[0].Shape.getElement(first_ref_obj[1][0])
             femobj['RefShapeType'] = first_ref_shape.ShapeType
         else:
             # frc_obj.References could be empty ! # TODO in FemTools: check
             FreeCAD.Console.PrintError('At least one Force Object has empty References!\n')
         if femobj['RefShapeType'] == 'Vertex':
             # print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation")
             pass
         elif femobj['RefShapeType'] == 'Face' and FemMeshTools.is_solid_femmesh(self.femmesh) and not FemMeshTools.has_no_face_data(self.femmesh):
             # print("solid_mesh with face data --> we do not need the femelement_table but we need the femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
         else:
             # print("mesh without needed data --> we need the femelement_table and femnodes_mesh for node load calculation")
             if not self.femnodes_mesh:
                 self.femnodes_mesh = self.femmesh.Nodes
             if not self.femelement_table:
                 self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     # get node loads
     for femobj in self.force_objects:  # femobj --> dict, FreeCAD document object is femobj['Object']
         frc_obj = femobj['Object']
         if frc_obj.Force == 0:
             print('  Warning --> Force = 0')
         if femobj['RefShapeType'] == 'Vertex':  # point load on vertieces
             femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_vertex_nodeload_table(self.femmesh, frc_obj)
         elif femobj['RefShapeType'] == 'Edge':  # line load on edges
             femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_edge_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
         elif femobj['RefShapeType'] == 'Face':  # area load on faces
             femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_face_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj)
Exemplo n.º 26
0
 def get_element_geometry2D_elements(self):
     # get element ids and write them into the objects
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.shellthickness_objects)
Exemplo n.º 27
0
 def get_element_fluid1D_elements(self):
     # get element ids and write them into the objects
     if not self.femelement_table:
         self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
     FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.fluidsection_objects)