| |
|
|
| 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) |
|
|