Source code for subsurface.reader.mesh.surface_reader

from typing import Union, Callable

import pandas as pd

from subsurface.reader.readers_data import ReaderFilesHelper
from subsurface.utils.utils_core import get_extension
import numpy as np


__all__ = ['read_mesh_file_to_vertex', 'read_mesh_file_to_cells',
           'read_mesh_file_to_attr', 'mesh_csv_to_vertex', 'mesh_csv_to_cells',
           'mesh_csv_to_attributes', 'get_cells_from_df',
           'cells_from_delaunay', 'get_vertices_from_df', 'map_columns_names',
           'dxf_to_vertex_edges', 'dxf_to_vertex']


[docs]def read_mesh_file_to_vertex(reader_args: ReaderFilesHelper) -> np.ndarray: if reader_args.format == '.csv': vertex = mesh_csv_to_vertex(reader_args.file_or_buffer, reader_args.columns_map, **reader_args.pandas_reader_kwargs) elif reader_args.format == '.dxf': vertex = dxf_to_vertex(reader_args.file_or_buffer) else: raise ValueError(f"Subsurface is not able to read the following extension: {reader_args.format}") return vertex
[docs]def read_mesh_file_to_cells(reader_args: ReaderFilesHelper) -> np.ndarray: extension = reader_args.format if extension == '.csv': cells = mesh_csv_to_cells(reader_args.file_or_buffer, reader_args.columns_map, **reader_args.pandas_reader_kwargs) else: raise ValueError(f"Subsurface is not able to read the following extension: {extension}") return cells
[docs]def read_mesh_file_to_attr(reader_args: ReaderFilesHelper): extension = reader_args.format if extension == ".csv": attr = mesh_csv_to_attributes(reader_args.file_or_buffer, reader_args.columns_map, **reader_args.pandas_reader_kwargs) else: raise ValueError(f"Subsurface is not able to read the following extension: {extension}") return attr
[docs]def mesh_csv_to_vertex(path_to_file: str, columns_map: Union[None, Callable, dict, pd.Series] = None, **reader_kwargs) -> np.ndarray: data = pd.read_csv(path_to_file, **reader_kwargs) if columns_map is not None: map_columns_names(columns_map, data) return get_vertices_from_df(data)
[docs]def mesh_csv_to_cells(path_to_file: str, columns_map: Union[None, Callable, dict, pd.Series] = None, **reader_kwargs) -> np.ndarray: data = pd.read_csv(path_to_file, **reader_kwargs) if columns_map is not None: map_columns_names(columns_map, data) return get_cells_from_df(data)
[docs]def mesh_csv_to_attributes(path_to_file: str, columns_map: Union[None, Callable, dict, pd.Series] = None, **reader_kwargs) -> pd.DataFrame: data = pd.read_csv(path_to_file, **reader_kwargs) if columns_map is not None: map_columns_names(columns_map, data) return data
[docs]def get_cells_from_df(data): try: cells = data[['e1', 'e2', 'e3']].dropna().astype('int').values except KeyError: raise KeyError('Columns e1, e2, and e3 must be present in the data set. Use' 'columns_map to map other names') return cells
[docs]def cells_from_delaunay(vertex): import pyvista as pv a = pv.PolyData(vertex) b = a.delaunay_2d().faces cells = b.reshape(-1, 4)[:, 1:] return cells
[docs]def get_vertices_from_df(data): try: vertex = data[['x', 'y', 'z']].values except KeyError: raise KeyError('Columns x, y, and z must be present in the data set. Use' 'columns_map to map other names') return vertex
[docs]def map_columns_names(columns_map: Union[Callable, dict, pd.Series], data: pd.DataFrame): data.columns = data.columns.map(columns_map) if data.columns.isin(['x', 'y', 'z']).any() is False: raise AttributeError('At least x, y, z must be passed to `columns_map`') return data.columns
[docs]def dxf_to_vertex_edges(file_or_buffer): from scipy.spatial.qhull import Delaunay vertex = dxf_to_vertex(file_or_buffer) tri = Delaunay(vertex[:, [0, 1]]) faces = tri.simplices return faces, vertex
[docs]def dxf_to_vertex(file_or_buffer): import ezdxf dataset = ezdxf.readfile(file_or_buffer) vertex = [] entity = dataset.modelspace() for e in entity: vertex.append(e[0]) vertex.append(e[1]) vertex.append(e[2]) vertex = np.array(vertex) vertex = np.unique(vertex, axis=0) return vertex
def map_cell_attr_strings_to_integers(cell_attr): d = dict([(y,x+1) for x,y in enumerate(sorted(set(np.unique(cell_attr))))]) cell_attr_int = np.array([d[x] for x in cell_attr]) return cell_attr_int, d def dxf_to_mesh(file_or_buffer): import ezdxf dataset = ezdxf.readfile(file_or_buffer) vertex = [] cell_attr = [] entity = dataset.modelspace() for e in entity: vertex.append(e[0]) vertex.append(e[1]) vertex.append(e[2]) cell_attr.append(e.dxf.get("layer")) vertex = np.array(vertex) cells = np.arange(0, vertex.shape[0]).reshape(-1, 3) cell_attr_int, cell_attr_map = map_cell_attr_strings_to_integers(cell_attr) return vertex, cells, cell_attr_int, cell_attr_map