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 = meshtools.get_femelement_table(obj.FemMesh) if meshtools.is_solid_femmesh(obj.FemMesh): fem_mesh_type = "Solid" elif meshtools.is_face_femmesh(obj.FemMesh): fem_mesh_type = "Face" elif meshtools.is_edge_femmesh(obj.FemMesh): fem_mesh_type = "Edge" else: FreeCAD.Console.PrintError( "Export of this FEM mesh to Python not supported.\n") return f = pyopen(filename, "w") write_python_mesh_to_file(femnodes_mesh, femelement_table, fem_mesh_type, f) f.close()
def get_z88_element_type(femmesh, femelement_table=None): if not femmesh: Console.PrintError("Error: No femmesh.\n") if not femelement_table: Console.PrintError("The femelement_table need to be calculated.\n") femelement_table = meshtools.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]) Console.PrintLog( "Node count of first element: {}\n".format(elem_length)) break # break after the first elem if meshtools.is_solid_femmesh(femmesh): if femmesh.TetraCount == femmesh.VolumeCount: if elem_length == 4: return 17 elif elem_length == 10: return 16 else: Console.PrintMessage("Tetra with neither 4 nor 10 nodes.\n") elif femmesh.HexaCount == femmesh.VolumeCount: if elem_length == 8: return 1 elif elem_length == 20: return 10 else: Console.PrintError("Hexa with neither 8 nor 20 nodes.\n") return 0 else: Console.PrintError("no tetra, no hexa or Mixed Volume Elements.\n") elif meshtools.is_face_femmesh(femmesh): if femmesh.TriangleCount == femmesh.FaceCount: if elem_length == 3: Console.PrintError("tria3mesh, not supported by Z88.\n") return 0 elif elem_length == 6: return 24 else: Console.PrintError("Tria with neither 3 nor 6 nodes.\n") return 0 elif femmesh.QuadrangleCount == femmesh.FaceCount: if elem_length == 4: Console.PrintError("quad4mesh, not supported by Z88.\n") return 0 elif elem_length == 8: return 23 else: Console.PrintError("Quad with neither 4 nor 8 nodes.\n") return 0 else: Console.PrintError("no tria, no quad\n") return 0 elif meshtools.is_edge_femmesh(femmesh): Console.PrintMessage( "Edge femmesh will be exported as 3D truss element nr 4.\n") return 4 else: Console.PrintError("Neither edge nor face nor solid femmesh.\n") return 0 return 0
def write_z88_elements_properties(self): element_properties_file_path = self.file_name + 'elp.txt' elements_data = [] if FemMeshTools.is_edge_femmesh(self.femmesh): if len(self.beamsection_objects) == 1: beam_obj = self.beamsection_objects[0]['Object'] width = beam_obj.RectWidth.getValueAs('mm') height = beam_obj.RectHeight.getValueAs('mm') area = str(width * height) elements_data.append('1 ' + str(self.element_count) + ' ' + area + ' 0 0 0 0 0 0 ') print("Be aware, only trusses are supported for edge meshes!") else: print("Multiple beamsections for Z88 not yet supported!") elif FemMeshTools.is_face_femmesh(self.femmesh): if len(self.shellthickness_objects) == 1: thick_obj = self.shellthickness_objects[0]['Object'] thickness = str(thick_obj.Thickness.getValueAs('mm')) elements_data.append('1 ' + str(self.element_count) + ' ' + thickness + ' 0 0 0 0 0 0 ') else: print("Multiple thicknesses for Z88 not yet supported!") elif FemMeshTools.is_solid_femmesh(self.femmesh): elements_data.append('1 ' + str(self.element_count) + ' 0 0 0 0 0 0 0') else: print("Error!") f = open(element_properties_file_path, 'w') f.write(str(len(elements_data)) + '\n') for e in elements_data: f.write(e) f.write('\n') f.close()
def get_z88_element_type(femmesh, femelement_table=None): import femmesh.meshtools as 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]) FreeCAD.Console.PrintLog('node count of first element: ' + str(elem_length) + '\n') 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 neither 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 neither 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 nor face nor solid femmesh') return 0 return 0
def write_z88_elements_properties(self): element_properties_file_path = self.file_name + "elp.txt" elements_data = [] if meshtools.is_edge_femmesh(self.femmesh): beam_obj = self.member.geos_beamsection[0]["Object"] area = 0 if beam_obj.SectionType == "Rectangular": width = beam_obj.RectWidth.getValueAs("mm").Value height = beam_obj.RectHeight.getValueAs("mm").Value area = width * height elif beam_obj.SectionType == "Circular": diameter = beam_obj.CircDiameter.getValueAs("mm").Value from math import pi area = 0.25 * pi * diameter * diameter else: FreeCAD.Console.PrintError( "Cross section type {} not supported, " "cross section area will be 0 in solver input.\n" .format(beam_obj.SectionType) ) # TODO make the check in prechecks and delete it here # no extensive errorhandling in writer # this way the solver will fail and an exception is raised somehow elements_data.append( "1 {} {} 0 0 0 0 0 0 " .format(self.element_count, area) ) FreeCAD.Console.PrintWarning( "Be aware, only trusses are supported for edge meshes!\n" ) elif meshtools.is_face_femmesh(self.femmesh): thick_obj = self.member.geos_shellthickness[0]["Object"] thickness = thick_obj.Thickness.getValueAs("mm").Value elements_data.append( "1 {} {} 0 0 0 0 0 0 " .format(self.element_count, thickness) ) elif meshtools.is_solid_femmesh(self.femmesh): elements_data.append( "1 {} 0 0 0 0 0 0 0" .format(self.element_count) ) else: FreeCAD.Console.PrintError("Error!\n") f = open(element_properties_file_path, "w") f.write(str(len(elements_data)) + "\n") for e in elements_data: f.write(e) f.write("\n") f.close()
def write_z88_elements_properties(self): element_properties_file_path = self.file_name + "elp.txt" elements_data = [] if meshtools.is_edge_femmesh(self.femmesh): if len(self.beamsection_objects) == 1: beam_obj = self.beamsection_objects[0]["Object"] width = beam_obj.RectWidth.getValueAs("mm") height = beam_obj.RectHeight.getValueAs("mm") area = str(width * height) elements_data.append( "1 " + str(self.element_count) + " " + area + " 0 0 0 0 0 0 " ) FreeCAD.Console.PrintMessage( "Be aware, only trusses are supported for edge meshes!\n" ) else: FreeCAD.Console.PrintError("Multiple beamsections for Z88 not yet supported!\n") elif meshtools.is_face_femmesh(self.femmesh): if len(self.shellthickness_objects) == 1: thick_obj = self.shellthickness_objects[0]["Object"] thickness = str(thick_obj.Thickness.getValueAs("mm")) elements_data.append( "1 " + str(self.element_count) + " " + thickness + " 0 0 0 0 0 0 " ) else: FreeCAD.Console.PrintError( "Multiple thicknesses for Z88 not yet supported!\n" ) elif meshtools.is_solid_femmesh(self.femmesh): elements_data.append("1 " + str(self.element_count) + " 0 0 0 0 0 0 0") else: FreeCAD.Console.PrintError("Error!\n") f = open(element_properties_file_path, "w") f.write(str(len(elements_data)) + "\n") for e in elements_data: f.write(e) f.write("\n") f.close()
def write(fem_mesh, filename): """directly write a FemMesh to a Python mesh file fem_mesh: a FemMesh""" if not fem_mesh.isDerivedFrom("Fem::FemMesh"): FreeCAD.Console.PrintError("Not a FemMesh was given as parameter.\n") return femnodes_mesh = fem_mesh.Nodes femelement_table = meshtools.get_femelement_table(fem_mesh) if meshtools.is_solid_femmesh(fem_mesh): fem_mesh_type = "Solid" elif meshtools.is_face_femmesh(fem_mesh): fem_mesh_type = "Face" elif meshtools.is_edge_femmesh(fem_mesh): fem_mesh_type = "Edge" else: FreeCAD.Console.PrintError( "Export of this FEM mesh to Python not supported.\n") return f = pyopen(filename, "w") write_python_mesh_to_file(femnodes_mesh, femelement_table, fem_mesh_type, f) f.close()