|
|
|
|
|
import logging |
|
from collections import UserDict |
|
from dataclasses import dataclass |
|
from typing import Iterable, Optional |
|
|
|
from ..utils import maybe_prepend_base_path |
|
|
|
|
|
@dataclass |
|
class MeshInfo: |
|
name: str |
|
data: str |
|
geodists: Optional[str] = None |
|
symmetry: Optional[str] = None |
|
texcoords: Optional[str] = None |
|
|
|
|
|
class _MeshCatalog(UserDict): |
|
def __init__(self, *args, **kwargs): |
|
super().__init__(*args, **kwargs) |
|
self.mesh_ids = {} |
|
self.mesh_names = {} |
|
self.max_mesh_id = -1 |
|
|
|
def __setitem__(self, key, value): |
|
if key in self: |
|
logger = logging.getLogger(__name__) |
|
logger.warning( |
|
f"Overwriting mesh catalog entry '{key}': old value {self[key]}" |
|
f", new value {value}" |
|
) |
|
mesh_id = self.mesh_ids[key] |
|
else: |
|
self.max_mesh_id += 1 |
|
mesh_id = self.max_mesh_id |
|
super().__setitem__(key, value) |
|
self.mesh_ids[key] = mesh_id |
|
self.mesh_names[mesh_id] = key |
|
|
|
def get_mesh_id(self, shape_name: str) -> int: |
|
return self.mesh_ids[shape_name] |
|
|
|
def get_mesh_name(self, mesh_id: int) -> str: |
|
return self.mesh_names[mesh_id] |
|
|
|
|
|
MeshCatalog = _MeshCatalog() |
|
|
|
|
|
def register_mesh(mesh_info: MeshInfo, base_path: Optional[str]) -> None: |
|
geodists, symmetry, texcoords = mesh_info.geodists, mesh_info.symmetry, mesh_info.texcoords |
|
if geodists: |
|
geodists = maybe_prepend_base_path(base_path, geodists) |
|
if symmetry: |
|
symmetry = maybe_prepend_base_path(base_path, symmetry) |
|
if texcoords: |
|
texcoords = maybe_prepend_base_path(base_path, texcoords) |
|
MeshCatalog[mesh_info.name] = MeshInfo( |
|
name=mesh_info.name, |
|
data=maybe_prepend_base_path(base_path, mesh_info.data), |
|
geodists=geodists, |
|
symmetry=symmetry, |
|
texcoords=texcoords, |
|
) |
|
|
|
|
|
def register_meshes(mesh_infos: Iterable[MeshInfo], base_path: Optional[str]) -> None: |
|
for mesh_info in mesh_infos: |
|
register_mesh(mesh_info, base_path) |
|
|