Spaces:
Running
Running
| import string | |
| import json | |
| import os | |
| from mesh_model.mesh_struct.mesh import Mesh | |
| def getMeshFiles(d): | |
| l = [] | |
| for sdp, Lsd, Lnf in os.walk(d): | |
| for f in Lnf: | |
| if (f.endswith(".msh")): | |
| l.append(f) | |
| l.sort() | |
| return l | |
| def getFiles(d): | |
| l = [] | |
| for sdp, Lsd, Lnf in os.walk(d): | |
| for f in Lnf: | |
| l.append(f) | |
| l.sort() | |
| return l | |
| def read_medit(filename: string) -> Mesh: | |
| """ | |
| Create a mesh read from a Medit .mesh file. | |
| :param filename: name of the file | |
| :return: a mesh | |
| """ | |
| f = open(filename, 'r') | |
| nodes = [] | |
| faces = [] | |
| while True: | |
| line = f.readline() | |
| if not line: | |
| break | |
| if "Vertices" == line.strip(): | |
| line = f.readline() | |
| nb_vertices = line.strip() | |
| for _ in range(int(nb_vertices)): | |
| line = f.readline() | |
| ls = line.split() | |
| x = float(ls[0]) | |
| y = float(ls[1]) | |
| nodes.append([x, y]) | |
| if "Triangles" == line.strip(): | |
| line = f.readline() | |
| nb_faces = line.strip() | |
| for _ in range(int(nb_faces)): | |
| line = f.readline() | |
| ls = line.split() | |
| n0 = int(ls[0]) | |
| n1 = int(ls[1]) | |
| n2 = int(ls[2]) | |
| faces.append([n0 - 1, n1 - 1, n2 - 1]) | |
| f.close() | |
| mesh = Mesh(nodes, faces) | |
| return mesh | |
| def read_gmsh(filename: string) -> Mesh: | |
| """ | |
| Create a mesh read from a gmsh .msh file. | |
| :param filename: name of the file | |
| :return: a mesh | |
| """ | |
| f = open(filename, 'r') | |
| nodes = [] | |
| faces = [] | |
| while True: | |
| line = f.readline() | |
| if not line: | |
| break | |
| if "$Nodes" == line.strip(): | |
| line = f.readline() | |
| ls = line.split() | |
| nb_blocs = int(ls[0]) | |
| for _ in range(nb_blocs): | |
| line = f.readline() | |
| ls = line.split() | |
| nb_nodes_b = int(ls[3]) | |
| # skip the tags | |
| for _ in range(nb_nodes_b): | |
| line = f.readline() | |
| for _ in range(nb_nodes_b): | |
| line = f.readline() | |
| ls = line.split() | |
| x = float(ls[0]) | |
| y = float(ls[1]) | |
| z = float(ls[2]) | |
| nodes.append([x, y, z]) | |
| if "$Elements" == line.strip(): | |
| line = f.readline() | |
| ls = line.split() | |
| nb_blocs = int(ls[0]) | |
| for _ in range(nb_blocs): | |
| line = f.readline() | |
| ls = line.split() | |
| elem_type = int(ls[2]) | |
| nb_elems_b = int(ls[3]) | |
| for _ in range(nb_elems_b): | |
| line = f.readline() | |
| ls = line.split() | |
| if elem_type == 2: | |
| n0 = int(ls[1]) | |
| n1 = int(ls[2]) | |
| n2 = int(ls[3]) | |
| faces.append([n0 - 1, n1 - 1, n2 - 1]) | |
| elif elem_type == 3: | |
| n0 = int(ls[1]) | |
| n1 = int(ls[2]) | |
| n2 = int(ls[3]) | |
| n3 = int(ls[4]) | |
| faces.append([n0 - 1, n1 - 1, n2 - 1, n3 - 1]) | |
| elif elem_type == 1: # skip 2-node line elements | |
| continue | |
| elif elem_type == 15: # skip 1-node point elements | |
| continue | |
| else: | |
| print("element_type " + str(elem_type) + " not handled") | |
| exit(1) | |
| f.close() | |
| mesh = Mesh(nodes, faces) | |
| return mesh | |
| def read_json(filename) -> Mesh: | |
| with open(filename, 'r') as f: | |
| json_mesh = json.load(f) | |
| mesh = Mesh(json_mesh['nodes'], json_mesh['faces']) | |
| return mesh | |
| def read_dataset(dataset_dir) -> list[Mesh]: | |
| mesh_dataset = [] | |
| for f in getFiles(dataset_dir): | |
| if (f.endswith(".msh")): | |
| msh_f = dataset_dir + "/" + f | |
| cmap = read_gmsh(msh_f) | |
| mesh_dataset.append(cmap) | |
| elif (f.endswith(".json")): | |
| json_f = dataset_dir + "/" + f | |
| cmap = read_json(json_f) | |
| mesh_dataset.append(cmap) | |
| return mesh_dataset |