add OpenSCAD export and rename renderstl → rendermap
This commit is contained in:
parent
f8734da8e5
commit
d2e9d26216
7 changed files with 63 additions and 6 deletions
|
@ -8,11 +8,11 @@ from django.utils.translation import ungettext_lazy
|
|||
|
||||
from c3nav.mapdata.models import AccessRestriction, Level, Source
|
||||
from c3nav.mapdata.render import MapRenderer
|
||||
from c3nav.mapdata.render.engines import STLEngine
|
||||
from c3nav.mapdata.render.engines import get_engine, get_engine_filetypes
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'render the map to stl files'
|
||||
help = 'render the map'
|
||||
|
||||
@staticmethod
|
||||
def levels_value(value):
|
||||
|
@ -50,6 +50,8 @@ class Command(BaseCommand):
|
|||
return permissions
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('filetype', type=str, choices=get_engine_filetypes(),
|
||||
help=_('filetype to render'))
|
||||
parser.add_argument('--levels', default='*', type=self.levels_value,
|
||||
help=_('levels to render, e.g. 0,1,2 or * for all levels (default)'))
|
||||
parser.add_argument('--permissions', default='0', type=self.permissions_value,
|
||||
|
@ -63,9 +65,10 @@ class Command(BaseCommand):
|
|||
renderer = MapRenderer(level.pk, minx, miny, maxx, maxy, access_permissions=options['permissions'],
|
||||
full_levels=options['full_levels'])
|
||||
|
||||
stl = renderer.render(STLEngine)
|
||||
stl = renderer.render(get_engine(options['filetype']))
|
||||
data = stl.render()
|
||||
filename = os.path.join(settings.RENDER_ROOT,
|
||||
'level_%s_%s.stl' % (level.short_label,
|
||||
renderer.access_cache_key.replace('_', '-')))
|
||||
'level_%s_%s.%s' % (level.short_label,
|
||||
renderer.access_cache_key.replace('_', '-'),
|
||||
options['filetype']))
|
||||
open(filename, 'wb').write(data)
|
|
@ -1,8 +1,10 @@
|
|||
from django.conf import settings
|
||||
from django.core import checks
|
||||
|
||||
from c3nav.mapdata.render.engines.svg import SVGEngine # noqa
|
||||
from c3nav.mapdata.render.engines.base import register_engine, get_engine, get_engine_filetypes # noqa
|
||||
from c3nav.mapdata.render.engines.openscad import OpenSCADEngine # noqa
|
||||
from c3nav.mapdata.render.engines.stl import STLEngine # noqa
|
||||
from c3nav.mapdata.render.engines.svg import SVGEngine # noqa
|
||||
|
||||
|
||||
@checks.register()
|
||||
|
@ -23,3 +25,5 @@ if settings.IMAGE_RENDERER == 'opengl':
|
|||
from c3nav.mapdata.render.engines.opengl import OpenGLEngine as ImageRenderEngine # noqa
|
||||
else:
|
||||
from c3nav.mapdata.render.engines.svg import SVGEngine as ImageRenderEngine # noqa
|
||||
|
||||
register_engine(ImageRenderEngine)
|
||||
|
|
|
@ -26,6 +26,7 @@ class StrokeAttribs:
|
|||
|
||||
class RenderEngine(ABC):
|
||||
is_3d = False
|
||||
filetype = 'dat'
|
||||
|
||||
# draw an svg image. supports pseudo-3D shadow-rendering
|
||||
def __init__(self, width: int, height: int, xoff=0, yoff=0, scale=1, buffer=0, background='#FFFFFF'):
|
||||
|
@ -85,3 +86,19 @@ class RenderEngine(ABC):
|
|||
|
||||
def set_mesh_lookup_data(self, data):
|
||||
pass
|
||||
|
||||
|
||||
engines_by_filetype = {}
|
||||
|
||||
|
||||
def register_engine(engine=None):
|
||||
engines_by_filetype[engine.filetype] = engine
|
||||
return engine
|
||||
|
||||
|
||||
def get_engine(filetype):
|
||||
return engines_by_filetype[filetype]
|
||||
|
||||
|
||||
def get_engine_filetypes():
|
||||
return tuple(engines_by_filetype.keys())
|
||||
|
|
|
@ -144,6 +144,8 @@ class OpenGLWorker(threading.Thread):
|
|||
|
||||
|
||||
class OpenGLEngine(Base3DEngine):
|
||||
filetype = 'png'
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
|
|
25
src/c3nav/mapdata/render/engines/openscad.py
Normal file
25
src/c3nav/mapdata/render/engines/openscad.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
import numpy as np
|
||||
|
||||
from c3nav.mapdata.render.engines import register_engine
|
||||
from c3nav.mapdata.render.engines.base3d import Base3DEngine
|
||||
|
||||
|
||||
@register_engine
|
||||
class OpenSCADEngine(Base3DEngine):
|
||||
filetype = 'scad'
|
||||
|
||||
def render(self) -> bytes:
|
||||
facets = np.vstack(self.vertices)
|
||||
vertices = tuple(set(tuple(vertex) for vertex in facets.reshape((-1, 3))))
|
||||
lookup = {vertex: i for i, vertex in enumerate(vertices)}
|
||||
|
||||
return (b'polyhedron(\n' +
|
||||
b' points = [\n' +
|
||||
b'\n'.join((b' [%.3f, %.3f, %.3f],' % tuple(vertex)) for vertex in vertices) + b'\n' +
|
||||
b' ],\n' +
|
||||
b' faces = [\n' +
|
||||
b'\n'.join((b' [%d, %d, %d],' % (lookup[tuple(a)], lookup[tuple(b)], lookup[tuple(c)]))
|
||||
for a, b, c in facets) +
|
||||
b' ],\n' +
|
||||
b' convexity = 10\n' +
|
||||
b');\n')
|
|
@ -1,9 +1,13 @@
|
|||
import numpy as np
|
||||
|
||||
from c3nav.mapdata.render.engines import register_engine
|
||||
from c3nav.mapdata.render.engines.base3d import Base3DEngine
|
||||
|
||||
|
||||
@register_engine
|
||||
class STLEngine(Base3DEngine):
|
||||
filetype = 'stl'
|
||||
|
||||
facet_template = (b' facet normal %f %f %f\n'
|
||||
b' outer loop\n'
|
||||
b' vertex %.3f %.3f %.3f\n'
|
||||
|
|
|
@ -38,6 +38,8 @@ def check_svg_renderer(app_configs, **kwargs):
|
|||
|
||||
|
||||
class SVGEngine(RenderEngine):
|
||||
filetype = 'png'
|
||||
|
||||
# draw an svg image. supports pseudo-3D shadow-rendering
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue