add OpenSCAD export and rename renderstl → rendermap

This commit is contained in:
Laura Klünder 2017-11-14 13:17:27 +01:00
parent f8734da8e5
commit d2e9d26216
7 changed files with 63 additions and 6 deletions

View file

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

View file

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

View file

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

View file

@ -144,6 +144,8 @@ class OpenGLWorker(threading.Thread):
class OpenGLEngine(Base3DEngine):
filetype = 'png'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

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

View file

@ -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'

View file

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