| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| __title__ = "FreeCAD Python Mesh reader and writer" |
| __author__ = "Bernd Hahnebach" |
| __url__ = "https://www.freecad.org" |
|
|
| |
| |
| |
|
|
| import FreeCAD |
|
|
| from femmesh import meshtools |
| from builtins import open as pyopen |
|
|
| |
| |
| |
| |
|
|
|
|
| |
| 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 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() |
|
|
|
|
| def write_python_mesh_to_file(femnodes_mesh, femelement_table, fem_mesh_type, f): |
|
|
| mesh_name = "femmesh" |
|
|
| |
| f.write("def create_nodes(femmesh):\n") |
| f.write(" # nodes\n") |
| for node in femnodes_mesh: |
| |
| vec = femnodes_mesh[node] |
| f.write(f" {mesh_name}.addNode({vec.x}, {vec.y}, {vec.z}, {node})\n") |
| f.write(" return True\n") |
| f.write("\n\n") |
|
|
| |
| f.write("def create_elements(femmesh):\n") |
| f.write(" # elements\n") |
| for element in femelement_table: |
| |
| if fem_mesh_type == "Solid": |
| f.write( |
| " {}.addVolume({}, {})\n".format( |
| mesh_name, list(femelement_table[element]), element |
| ) |
| ) |
| elif fem_mesh_type == "Face": |
| f.write( |
| " {}.addFace({}, {})\n".format( |
| mesh_name, list(femelement_table[element]), element |
| ) |
| ) |
| elif fem_mesh_type == "Edge": |
| f.write( |
| " {}.addEdge({}, {})\n".format( |
| mesh_name, list(femelement_table[element]), element |
| ) |
| ) |
| f.write(" return True\n") |
|
|