Source code for eradiate.scenes.shapes._filemesh
from __future__ import annotations
from pathlib import Path
import attrs
from ._core import ShapeNode
from ..core import BoundingBox
from ...attrs import documented, parse_docs
[docs]
@parse_docs
@attrs.define(eq=False, slots=False)
class FileMeshShape(ShapeNode):
"""
File based mesh shape [``file_mesh``].
This shape represents a triangulated mesh defined in a file. The OBJ and PLY
formats are supported.
Warnings
--------
Vertex coordinates are assumed to be defined in kernel units.
"""
filename: Path = documented(
attrs.field(converter=Path, kw_only=True),
type="Path",
init_type="path-like",
doc="Path to the mesh file.",
)
@filename.validator
def _filename_validator(self, attribute, value):
if value.suffix not in {".obj", ".ply"}:
raise ValueError(
f"while validating {attribute.name}:"
f"Eradiate supports mesh files only in PLY or OBJ format."
)
[docs]
def bbox(self) -> BoundingBox:
# Inherit docstring
raise NotImplementedError
@property
def template(self) -> dict:
# Inherit docstring
if self.filename.suffix == ".obj":
mi_plugin = "obj"
elif self.filename.suffix == ".ply":
mi_plugin = "ply"
else:
raise ValueError(
f"unsupported mesh file extension '{self.filename.suffix}'"
)
return {
"type": mi_plugin,
"filename": str(self.filename),
"face_normals": True,
}