diff --git a/src/c3nav/mapdata/render/engines/__init__.py b/src/c3nav/mapdata/render/engines/__init__.py index 36070ee1..66e4e4ad 100644 --- a/src/c3nav/mapdata/render/engines/__init__.py +++ b/src/c3nav/mapdata/render/engines/__init__.py @@ -2,6 +2,7 @@ from django.conf import settings from django.core import checks from c3nav.mapdata.render.engines.svg import SVGEngine # noqa +from c3nav.mapdata.render.engines.stl import STLEngine # noqa @checks.register() diff --git a/src/c3nav/mapdata/render/engines/base3d.py b/src/c3nav/mapdata/render/engines/base3d.py index 45a52b14..2511046d 100644 --- a/src/c3nav/mapdata/render/engines/base3d.py +++ b/src/c3nav/mapdata/render/engines/base3d.py @@ -16,6 +16,9 @@ class Base3DEngine(RenderEngine): self.np_scale = np.array((self.scale, self.scale, self.scale)) self.np_offset = np.array((-self.minx * self.scale, -self.maxy * self.scale, 0)) + def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs], **kwargs): + if fill is not None: + self.vertices.append(self._place_geometry(geometry)) def _append_to_vertices(self, vertices, append=None): if append is not None: diff --git a/src/c3nav/mapdata/render/engines/stl.py b/src/c3nav/mapdata/render/engines/stl.py new file mode 100644 index 00000000..6aab4841 --- /dev/null +++ b/src/c3nav/mapdata/render/engines/stl.py @@ -0,0 +1,24 @@ +import numpy as np + +from c3nav.mapdata.render.engines.base3d import Base3DEngine + + +class STLEngine(Base3DEngine): + facet_template = (b' facet normal %f %f %f\n' + b' outer loop\n' + b' vertex %f %f %f\n' + b' vertex %f %f %f\n' + b' vertex %f %f %f\n' + b' endloop\n' + b' endfacet') + + def _create_facet(self, facet) -> bytes: + return self.facet_template % tuple(facet.flatten()) + + def render(self) -> bytes: + facets = np.vstack(self.vertices) + facets = np.hstack((np.cross(facets[:, 1]-facets[:, 0], facets[:, 2]-facets[:, 1]).reshape((-1, 1, 3))*1e10, + facets)) + return (b'solid c3nav_export\n' + + b'\n'.join((self._create_facet(facet) for facet in facets)) + + b'\nendsolid c3nav_export\n') diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index 42cbe20d..b7143356 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -4,7 +4,7 @@ from shapely import prepared from shapely.geometry import box from c3nav.mapdata.cache import MapHistory -from c3nav.mapdata.models import MapUpdate, Level +from c3nav.mapdata.models import Level, MapUpdate from c3nav.mapdata.render.data import LevelRenderData, hybrid_union from c3nav.mapdata.render.engines.base import FillAttribs, StrokeAttribs