def get_region_data(self): # mesh regions self.ele_length_map = {} # { 'ElementString' : element length } self.ele_node_map = {} # { 'ElementString' : [element nodes] } if not self.mesh_obj.MeshRegionList: # print (' No mesh regions.') pass else: print (' Mesh regions, we need to get the elements.') # by the use of MeshRegion object and a BooleanSplitCompound there could be problems with node numbers see # http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 # http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 part = self.part_obj if self.mesh_obj.MeshRegionList: if part.Shape.ShapeType == "Compound" and hasattr(part, "Proxy"): # other part obj might not have a Proxy, thus an exception would be raised if (part.Proxy.Type == "FeatureBooleanFragments" or part.Proxy.Type == "FeatureSlice" or part.Proxy.Type == "FeatureXOR"): error_message = " The mesh to shape is a boolean split tools Compound and the mesh has mesh region list. GMSH could return unexpected meshes in such circumstances. It is strongly recommended to extract the shape to mesh from the Compound and use this one." FreeCAD.Console.PrintError(error_message + "\n") # TODO: no gui popup because FreeCAD will be in a endless print loop # as long as the pop up is on --> maybe find a better solution for # either of both --> thus the pop up is in task panel for mr_obj in self.mesh_obj.MeshRegionList: # print(mr_obj.Name) # print(mr_obj.CharacteristicLength) # print(Units.Quantity(mr_obj.CharacteristicLength).Value) if mr_obj.CharacteristicLength: if mr_obj.References: for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") # print(" But we are going to try to find it in the Shape to mesh :-)") search_ele_in_shape_to_mesh = True for elems in sub[1]: # print(elems) # elems --> element if search_ele_in_shape_to_mesh: # we're going to try to find the element in the Shape to mesh and use the found element as elems ele_shape = FemMeshTools.get_element(sub[0], elems) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) if found_element: elems = found_element else: FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") # print(elems) # element if elems not in self.ele_length_map: self.ele_length_map[elems] = Units.Quantity(mr_obj.CharacteristicLength).Value else: FreeCAD.Console.PrintError("The element " + elems + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the CharacteristicLength is 0.0 mm.\n") for eleml in self.ele_length_map: ele_shape = FemMeshTools.get_element(self.part_obj, eleml) # the method getElement(element) does not return Solid elements ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) self.ele_node_map[eleml] = ele_vertexes print(' {}'.format(self.ele_length_map)) print(' {}'.format(self.ele_node_map))
def get_region_data(self): # mesh regions self.ele_length_map = {} # { 'ElementString' : element length } self.ele_node_map = {} # { 'ElementString' : [element nodes] } if not self.mesh_obj.MeshRegionList: # print (' No mesh regions.') pass else: print (' Mesh regions, we need to get the elements.') # by the use of MeshRegion object and a BooleanSplitCompound there could be problems with node numbers see # http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 # http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 part = self.part_obj if self.mesh_obj.MeshRegionList: if part.Shape.ShapeType == "Compound" and hasattr(part, "Proxy"): # other part obj might not have a Proxy, thus an exception would be raised if (part.Proxy.Type == "FeatureBooleanFragments" or part.Proxy.Type == "FeatureSlice" or part.Proxy.Type == "FeatureXOR"): error_message = " The mesh to shape is a boolean split tools Compound and the mesh has mesh region list. Gmsh could return unexpected meshes in such circumstances. It is strongly recommended to extract the shape to mesh from the Compound and use this one." FreeCAD.Console.PrintError(error_message + "\n") # TODO: no gui popup because FreeCAD will be in a endless print loop # as long as the pop up is on --> maybe find a better solution for # either of both --> thus the pop up is in task panel for mr_obj in self.mesh_obj.MeshRegionList: # print(mr_obj.Name) # print(mr_obj.CharacteristicLength) # print(Units.Quantity(mr_obj.CharacteristicLength).Value) if mr_obj.CharacteristicLength: if mr_obj.References: for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") # print(" But we are going to try to find it in the Shape to mesh :-)") search_ele_in_shape_to_mesh = True for elems in sub[1]: # print(elems) # elems --> element if search_ele_in_shape_to_mesh: # we're going to try to find the element in the Shape to mesh and use the found element as elems ele_shape = FemMeshTools.get_element(sub[0], elems) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) if found_element: elems = found_element else: FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") # print(elems) # element if elems not in self.ele_length_map: self.ele_length_map[elems] = Units.Quantity(mr_obj.CharacteristicLength).Value else: FreeCAD.Console.PrintError("The element " + elems + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the CharacteristicLength is 0.0 mm.\n") for eleml in self.ele_length_map: ele_shape = FemMeshTools.get_element(self.part_obj, eleml) # the method getElement(element) does not return Solid elements ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) self.ele_node_map[eleml] = ele_vertexes print(' {}'.format(self.ele_length_map)) print(' {}'.format(self.ele_node_map))
def get_group_data(self): if self.analysis: print(' Group meshing.') self.group_elements = FemMeshTools.get_analysis_group_elements(self.analysis, self.part_obj) print(' {}'.format(self.group_elements)) else: print(' NO group meshing.') self.ele_length_map = {} # { 'ElementString' : element length } self.ele_node_map = {} # { 'ElementString' : [element nodes] } if not self.mesh_obj.MeshRegionList: print (' No Mesh regions.') else: print (' Mesh regions, we need to get the elements.') if self.part_obj.Shape.ShapeType == 'Compound': # see http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 and http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 err = "GMSH could return unexpected meshes for a boolean split tools Compound. It is strongly recommended to extract the shape to mesh from the Compound and use this one." FreeCAD.Console.PrintError(err + "\n") for mr_obj in self.mesh_obj.MeshRegionList: # print(mr_obj.Name) # print(mr_obj.CharacteristicLength) # print(Units.Quantity(mr_obj.CharacteristicLength).Value) if mr_obj.CharacteristicLength: if mr_obj.References: for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") # print(" But we gone try to find it in the Shape to mesh :-)") search_ele_in_shape_to_mesh = True for eles in sub[1]: # print(eles) # element if search_ele_in_shape_to_mesh: # we gone try to find the element it in the Shape to mesh and use the found element as eles ele_shape = FemMeshTools.get_element(sub[0], eles) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) if found_element: eles = found_element else: FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") # print(eles) # element if eles not in self.ele_length_map: self.ele_length_map[eles] = Units.Quantity(mr_obj.CharacteristicLength).Value else: FreeCAD.Console.PrintError("The element " + eles + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the CharacteristicLength is 0.0 mm.\n") for elel in self.ele_length_map: ele_shape = FemMeshTools.get_element(self.part_obj, elel) # the method getElement(element) does not return Solid elements ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) self.ele_node_map[elel] = ele_vertexes print(' {}'.format(self.ele_length_map)) print(' {}'.format(self.ele_node_map))
def has_equal_references_shape_types(self): import FemMeshTools if not self.references: self.references_shape_type = None for ref in self.references: r = FemMeshTools.get_element(ref[0], ref[1]) # the method getElement(element) does not return Solid elements # print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1]) if self.references_shape_type is None: self.references_shape_type = r.ShapeType if r.ShapeType != self.references_shape_type: FreeCAD.Console.PrintError('Different ShapeTypes in Reference List not allowed\n') return False return True
def has_equal_references_shape_types(self): import FemMeshTools ref_shty = '' for ref in self.references: r = FemMeshTools.get_element(ref[0], ref[1]) # the method getElement(element) does not return Solid elements # print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1]) if not ref_shty: ref_shty = r.ShapeType if r.ShapeType != ref_shty: message = 'Multiple shape types are not allowed in the reference list.\n' FreeCAD.Console.PrintError(message) QMessageBox.critical(None, "Multiple ShapeTypes not allowed", message) return False return True
def has_equal_references_shape_types(self): import FemMeshTools if not self.references: self.references_shape_type = None for ref in self.references: r = FemMeshTools.get_element( ref[0], ref[1] ) # the method getElement(element) does not return Solid elements # print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1]) if self.references_shape_type is None: self.references_shape_type = r.ShapeType if r.ShapeType != self.references_shape_type: FreeCAD.Console.PrintError( 'Different ShapeTypes in Reference List not allowed\n') return False return True
def get_refshape_type(fem_doc_object): # returns the reference shape type # for force object: # in GUI defined frc_obj all frc_obj have at leas one ref_shape and ref_shape have all the same shape type # for material object: # in GUI defined material_obj could have no RefShape and RefShapes could be different type # we gone need the RefShapes to be the same type inside one fem_doc_object # TODO here: check if all RefShapes inside the object really have the same type import FemMeshTools if hasattr(fem_doc_object, 'References') and fem_doc_object.References: first_ref_obj = fem_doc_object.References[0] first_ref_shape = FemMeshTools.get_element(first_ref_obj[0], first_ref_obj[1][0]) st = first_ref_shape.ShapeType print(fem_doc_object.Name + ' has ' + st + ' reference shapes.') return st else: print(fem_doc_object.Name + ' has empty References.') return ''
def get_refshape_type(fem_doc_object): # returns the reference shape type # for force object: # in GUI defined frc_obj all frc_obj have at leas one ref_shape and ref_shape have all the same shape type # for material object: # in GUI defined material_obj could have no RefShape and RefShapes could be different type # we're going to need the RefShapes to be the same type inside one fem_doc_object # TODO: check if all RefShapes inside the object really have the same type import FemMeshTools if hasattr(fem_doc_object, 'References') and fem_doc_object.References: first_ref_obj = fem_doc_object.References[0] first_ref_shape = FemMeshTools.get_element(first_ref_obj[0], first_ref_obj[1][0]) st = first_ref_shape.ShapeType print(fem_doc_object.Name + ' has ' + st + ' reference shapes.') return st else: print(fem_doc_object.Name + ' has empty References.') return ''
def get_group_data(self): self.group_elements = {} # TODO solid, face, edge seam not work together, some print or make it work together # TODO handle groups for Edges and Vertexes # mesh groups and groups of analysis member if not self.mesh_obj.MeshGroupList: print (' No mesh group objects.') else: print (' Mesh group objects, we need to get the elements.') for mg in self.mesh_obj.MeshGroupList: new_group_elements = FemMeshTools.get_mesh_group_elements(mg, self.part_obj) for ge in new_group_elements: if ge not in self.group_elements: self.group_elements[ge] = new_group_elements[ge] else: FreeCAD.Console.PrintError(" A group with this name exists already.\n") if self.analysis: print(' Group meshing.') new_group_elements = FemMeshTools.get_analysis_group_elements(self.analysis, self.part_obj) for ge in new_group_elements: if ge not in self.group_elements: self.group_elements[ge] = new_group_elements[ge] else: FreeCAD.Console.PrintError(" A group with this name exists already.\n") else: print(' No anlysis members for group meshing.') print(' {}'.format(self.group_elements)) # mesh regions self.ele_length_map = {} # { 'ElementString' : element length } self.ele_node_map = {} # { 'ElementString' : [element nodes] } if not self.mesh_obj.MeshRegionList: print (' No mesh regions.') else: print (' Mesh regions, we need to get the elements.') if self.part_obj.Shape.ShapeType == 'Compound': # see http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 and http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 err = "GMSH could return unexpected meshes for a boolean split tools Compound. It is strongly recommended to extract the shape to mesh from the Compound and use this one." FreeCAD.Console.PrintError(err + "\n") for mr_obj in self.mesh_obj.MeshRegionList: if mr_obj.RelativeLength: if mr_obj.References: for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") # print(" But we gone try to find it in the Shape to mesh :-)") search_ele_in_shape_to_mesh = True for elems in sub[1]: # print(elems) # elems --> element if search_ele_in_shape_to_mesh: # we gone try to find the element it in the Shape to mesh and use the found element as elems ele_shape = FemMeshTools.get_element(sub[0], elems) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) if found_element: elems = found_element else: FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") # print(elems) # element if elems not in self.ele_length_map: # self.ele_length_map[elems] = Units.Quantity(mr_obj.CharacteristicLength).Value mr_rellen = mr_obj.RelativeLength if mr_rellen > 1.0: mr_rellen = 1.0 FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " should not use a relative length greater than unity.\n") elif mr_rellen < 0.01: mr_rellen = 0.01 # Relative length should not be less than 1/100 of base length FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " should not use a relative length smaller than 0.01.\n") self.ele_length_map[elems] = mr_rellen*self.clmax else: FreeCAD.Console.PrintError("The element " + elems + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n") else: FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the CharacteristicLength is 0.0 mm.\n") for eleml in self.ele_length_map: ele_shape = FemMeshTools.get_element(self.part_obj, eleml) # the method getElement(element) does not return Solid elements ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) self.ele_node_map[eleml] = ele_vertexes print(' {}'.format(self.ele_length_map)) print(' {}'.format(self.ele_node_map))
def get_boundary_layer_data(self): # mesh boundary layer, # currently only one boundary layer setting object is allowed, but multiple boundary can be selected # Mesh.CharacteristicLengthMin, must be zero, or a value less than first inflation layer height self.bl_setting_list = [] # list of dict, each item map to MeshBoundaryLayer object self.bl_boundary_list = [] # to remove duplicated boundary edge or faces if not self.mesh_obj.MeshBoundaryLayerList: print (' No mesh boundary layer setting document object.') else: print (' Mesh boundary layers, we need to get the elements.') if self.part_obj.Shape.ShapeType == 'Compound': # see http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 and http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 err = "GMSH could return unexpected meshes for a boolean split tools Compound. It is strongly recommended to extract the shape to mesh from the Compound and use this one." FreeCAD.Console.PrintError(err + "\n") for mr_obj in self.mesh_obj.MeshBoundaryLayerList: if mr_obj.MinimumThickness and Units.Quantity(mr_obj.MinimumThickness).Value > 0: if mr_obj.References: belem_list = [] for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to # check if the shape of the mesh boundary_layer is an element of the Part to mesh, if not try to find the element in the shape to mesh search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): # print(" One element of the mesh boundary layer " + mr_obj.Name + " is not an element of the Part to mesh.") # print(" But we going to find it in the Shape to mesh :-)") search_ele_in_shape_to_mesh = True for elems in sub[1]: # print(elems) # elems --> element if search_ele_in_shape_to_mesh: # we try to find the element it in the Shape to mesh and use the found element as elems ele_shape = FemMeshTools.get_element(sub[0], elems) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) if found_element: # also elems = found_element else: FreeCAD.Console.PrintError("One element of the mesh boudary layer " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") # print(elems) # element if elems not in self.bl_boundary_list: # fetch settings in DocumentObject, fan setting is not implemented belem_list.append(elems) self.bl_boundary_list.append(elems) else: FreeCAD.Console.PrintError("The element " + elems + " of the mesh boundary layer " + mr_obj.Name + " has been added to another mesh boudary layer.\n") setting = {} setting['hwall_n'] = Units.Quantity(mr_obj.MinimumThickness).Value setting['ratio'] = mr_obj.GrowthRate setting['thickness'] = sum([setting['hwall_n'] * setting['ratio'] ** i for i in range(mr_obj.NumberOfLayers)]) setting['hwall_t'] = setting['thickness'] # setting['hwall_n'] * 5 # tangetial cell dimension # hfar: cell dimension outside boundary should be set later if some character length is set if self.clmax > setting['thickness'] * 0.8 and self.clmax < setting['thickness'] * 1.6: setting['hfar'] = self.clmax else: setting['hfar'] = setting['thickness'] # set a value for safety, it may works as background mesh cell size # from face name -> face id is done in geo file write up #fan angle setup is not implemented yet if self.dimension == '2': setting['EdgesList'] = belem_list elif self.dimension == '3': setting['FacesList'] = belem_list else: FreeCAD.Console.PrintError("boundary layer is only supported for 2D and 3D mesh") self.bl_setting_list.append(setting) else: FreeCAD.Console.PrintError("The mesh boundary layer: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n") else: FreeCAD.Console.PrintError("The mesh boundary layer: " + mr_obj.Name + " is not used to create the mesh because the min thickness is 0.0 mm.\n") print(' {}'.format(self.bl_setting_list))
def get_boundary_layer_data(self): # mesh boundary layer, # currently only one boundary layer setting object is allowed, but multiple boundary can be selected # Mesh.CharacteristicLengthMin, must be zero, or a value less than first inflation layer height self.bl_setting_list = [ ] # list of dict, each item map to MeshBoundaryLayer object self.bl_boundary_list = [ ] # to remove duplicated boundary edge or faces if not self.mesh_obj.MeshBoundaryLayerList: print(' No mesh boundary layer setting document object.') else: print(' Mesh boundary layers, we need to get the elements.') if self.part_obj.Shape.ShapeType == 'Compound': # see http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 and http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 err = "GMSH could return unexpected meshes for a boolean split tools Compound. It is strongly recommended to extract the shape to mesh from the Compound and use this one." FreeCAD.Console.PrintError(err + "\n") for mr_obj in self.mesh_obj.MeshBoundaryLayerList: if mr_obj.MinimumThickness and Units.Quantity( mr_obj.MinimumThickness).Value > 0: if mr_obj.References: belem_list = [] for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to # check if the shape of the mesh boundary_layer is an element of the Part to mesh, if not try to find the element in the shape to mesh search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): # print(" One element of the mesh boundary layer " + mr_obj.Name + " is not an element of the Part to mesh.") # print(" But we're going to find it in the Shape to mesh :-)") search_ele_in_shape_to_mesh = True for elems in sub[1]: # print(elems) # elems --> element if search_ele_in_shape_to_mesh: # we try to find the element it in the Shape to mesh and use the found element as elems ele_shape = FemMeshTools.get_element( sub[0], elems ) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape( self.part_obj.Shape, ele_shape) if found_element: # also elems = found_element else: FreeCAD.Console.PrintError( "One element of the mesh boudary layer " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n" ) # print(elems) # element if elems not in self.bl_boundary_list: # fetch settings in DocumentObject, fan setting is not implemented belem_list.append(elems) self.bl_boundary_list.append(elems) else: FreeCAD.Console.PrintError( "The element " + elems + " of the mesh boundary layer " + mr_obj.Name + " has been added to another mesh boudary layer.\n" ) setting = {} setting['hwall_n'] = Units.Quantity( mr_obj.MinimumThickness).Value setting['ratio'] = mr_obj.GrowthRate setting['thickness'] = sum([ setting['hwall_n'] * setting['ratio']**i for i in range(mr_obj.NumberOfLayers) ]) setting['hwall_t'] = setting[ 'thickness'] # setting['hwall_n'] * 5 # tangential cell dimension # hfar: cell dimension outside boundary should be set later if some character length is set if self.clmax > setting[ 'thickness'] * 0.8 and self.clmax < setting[ 'thickness'] * 1.6: setting['hfar'] = self.clmax else: setting['hfar'] = setting[ 'thickness'] # set a value for safety, it may works as background mesh cell size # from face name -> face id is done in geo file write up #TODO: fan angle setup is not implemented yet if self.dimension == '2': setting['EdgesList'] = belem_list elif self.dimension == '3': setting['FacesList'] = belem_list else: FreeCAD.Console.PrintError( "boundary layer is only supported for 2D and 3D mesh" ) self.bl_setting_list.append(setting) else: FreeCAD.Console.PrintError( "The mesh boundary layer: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n" ) else: FreeCAD.Console.PrintError( "The mesh boundary layer: " + mr_obj.Name + " is not used to create the mesh because the min thickness is 0.0 mm.\n" ) print(' {}'.format(self.bl_setting_list))
def get_group_data(self): if self.analysis: print(' Group meshing.') self.group_elements = FemMeshTools.get_analysis_group_elements( self.analysis, self.part_obj) print(' {}'.format(self.group_elements)) else: print(' NO group meshing.') self.ele_length_map = {} # { 'ElementString' : element length } self.ele_node_map = {} # { 'ElementString' : [element nodes] } if not self.mesh_obj.MeshRegionList: print(' No Mesh regions.') else: print(' Mesh regions, we need to get the elements.') if self.part_obj.Shape.ShapeType == 'Compound': # see http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 and http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 err = "GMSH could return unexpected meshes for a boolean split tools Compound. It is strongly recommended to extract the shape to mesh from the Compound and use this one." FreeCAD.Console.PrintError(err + "\n") for mr_obj in self.mesh_obj.MeshRegionList: # print(mr_obj.Name) # print(mr_obj.CharacteristicLength) # print(Units.Quantity(mr_obj.CharacteristicLength).Value) if mr_obj.CharacteristicLength: if mr_obj.References: for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") # print(" But we gone try to find it in the Shape to mesh :-)") search_ele_in_shape_to_mesh = True for eles in sub[1]: # print(eles) # element if search_ele_in_shape_to_mesh: # we gone try to find the element it in the Shape to mesh and use the found element as eles ele_shape = FemMeshTools.get_element( sub[0], eles ) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape( self.part_obj.Shape, ele_shape) if found_element: eles = found_element else: FreeCAD.Console.PrintError( "One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n" ) # print(eles) # element if eles not in self.ele_length_map: self.ele_length_map[eles] = Units.Quantity( mr_obj.CharacteristicLength).Value else: FreeCAD.Console.PrintError( "The element " + eles + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n" ) else: FreeCAD.Console.PrintError( "The meshregion: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n" ) else: FreeCAD.Console.PrintError( "The meshregion: " + mr_obj.Name + " is not used to create the mesh because the CharacteristicLength is 0.0 mm.\n" ) for elel in self.ele_length_map: ele_shape = FemMeshTools.get_element( self.part_obj, elel ) # the method getElement(element) does not return Solid elements ele_vertexes = FemMeshTools.get_vertexes_by_element( self.part_obj.Shape, ele_shape) self.ele_node_map[elel] = ele_vertexes print(' {}'.format(self.ele_length_map)) print(' {}'.format(self.ele_node_map))