def get_constraints_fixed_nodes(self): # get nodes for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object'] FreeCAD.Console.PrintMessage("Constraint fixed: " + femobj['Object'].Name + '\n') femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj) # add nodes to constraint_conflict_nodes, needed by constraint plane rotation for node in femobj['Nodes']: self.constraint_conflict_nodes.append(node) # if mixed mesh with solids the node set needs to be split because solid nodes do not have rotational degree of freedom if self.femmesh.Volumes and (len(self.shellthickness_objects) > 0 or len(self.beamsection_objects) > 0): print('We need to find the solid nodes.') if not self.femelement_volumes_table: self.femelement_volumes_table = FemMeshTools.get_femelement_volumes_table(self.femmesh) for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object'] nds_solid = [] nds_faceedge = [] for n in femobj['Nodes']: solid_node = False for ve in self.femelement_volumes_table: if n in self.femelement_volumes_table[ve]: solid_node = True nds_solid.append(n) break if not solid_node: nds_faceedge.append(n) femobj['NodesSolid'] = set(nds_solid) femobj['NodesFaceEdge'] = set(nds_faceedge)
def get_constraints_fixed_nodes(self): # get nodes for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj["Object"] print_obj_info(femobj["Object"]) femobj["Nodes"] = meshtools.get_femnodes_by_femobj_with_references( self.femmesh, femobj) # add nodes to constraint_conflict_nodes, needed by constraint plane rotation for node in femobj["Nodes"]: self.constraint_conflict_nodes.append(node) # if mixed mesh with solids the node set needs to be split # because solid nodes do not have rotational degree of freedom if self.femmesh.Volumes \ and (len(self.shellthickness_objects) > 0 or len(self.beamsection_objects) > 0): FreeCAD.Console.PrintMessage("We need to find the solid nodes.\n") if not self.femelement_volumes_table: self.femelement_volumes_table = meshtools.get_femelement_volumes_table( self.femmesh) for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj["Object"] nds_solid = [] nds_faceedge = [] for n in femobj["Nodes"]: solid_node = False for ve in self.femelement_volumes_table: if n in self.femelement_volumes_table[ve]: solid_node = True nds_solid.append(n) break if not solid_node: nds_faceedge.append(n) femobj["NodesSolid"] = set(nds_solid) femobj["NodesFaceEdge"] = set(nds_faceedge)
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 FreeCAD.Console.PrintMessage('Materials\n') 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) FreeCAD.Console.PrintMessage(all_found) FreeCAD.Console.PrintMessage('\n') if all_found is False: if not self.femelement_volumes_table: self.femelement_volumes_table = FemMeshTools.get_femelement_volumes_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_faces_table: self.femelement_faces_table = FemMeshTools.get_femelement_faces_table( self.femmesh) FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_faces_table, self.material_objects) if self.beamsection_objects or self.fluidsection_objects: if not self.femelement_edges_table: self.femelement_edges_table = FemMeshTools.get_femelement_edges_table( self.femmesh) FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.material_objects)