move renderscad into Level model
This commit is contained in:
parent
7b141aa87b
commit
756c3976d0
3 changed files with 36 additions and 14 deletions
|
@ -1,17 +1,9 @@
|
||||||
import os
|
|
||||||
from django.conf import settings
|
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
from c3nav.mapdata.utils.scad import polygon_scad
|
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = 'render the map to openscad'
|
help = 'render the map to openscad'
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
from c3nav.mapdata.models import AltitudeArea
|
from c3nav.mapdata.models import Level
|
||||||
filename = os.path.join(settings.RENDER_ROOT, 'all.scad')
|
Level.render_scad_all()
|
||||||
with open(filename, 'w') as f:
|
|
||||||
for area in AltitudeArea.objects.all():
|
|
||||||
f.write('translate([0, 0, %.2f]) ' % area.altitude)
|
|
||||||
f.write(polygon_scad(area.geometry)+';\n')
|
|
||||||
|
|
|
@ -35,11 +35,11 @@ class AccessRestrictionMixin(SerializableMixin, models.Model):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def qs_for_request(cls, request):
|
def qs_for_request(cls, request, allow_none=False):
|
||||||
return cls.objects.filter(cls.q_for_request(request))
|
return cls.objects.filter(cls.q_for_request(request, allow_none=allow_none))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def q_for_request(cls, request, prefix=''):
|
def q_for_request(cls, request, prefix='', allow_none=False):
|
||||||
if request.user.is_authenticated and request.user.is_superuser:
|
if (request is None and allow_none) or (request.user.is_authenticated and request.user.is_superuser):
|
||||||
return Q()
|
return Q()
|
||||||
return Q(**{prefix + 'access_restriction__isnull': True})
|
return Q(**{prefix + 'access_restriction__isnull': True})
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import os
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -8,6 +9,7 @@ from shapely.geometry import JOIN_STYLE
|
||||||
from shapely.ops import cascaded_union
|
from shapely.ops import cascaded_union
|
||||||
|
|
||||||
from c3nav.mapdata.models.locations import SpecificLocation
|
from c3nav.mapdata.models.locations import SpecificLocation
|
||||||
|
from c3nav.mapdata.utils.scad import polygon_scad
|
||||||
from c3nav.mapdata.utils.svg import SVGImage
|
from c3nav.mapdata.utils.svg import SVGImage
|
||||||
|
|
||||||
|
|
||||||
|
@ -158,3 +160,31 @@ class Level(SpecificLocation, models.Model):
|
||||||
svg.add_geometry(door_geometries, fill_color='#ffffff', stroke_color='#929292', stroke_width=0.05)
|
svg.add_geometry(door_geometries, fill_color='#ffffff', stroke_color='#929292', stroke_width=0.05)
|
||||||
|
|
||||||
return svg.get_xml()
|
return svg.get_xml()
|
||||||
|
|
||||||
|
def render_scad(self, f, spaces=None, request=None):
|
||||||
|
if spaces is None:
|
||||||
|
from c3nav.mapdata.models import Area, Space
|
||||||
|
spaces = self.spaces.filter(Space.q_for_request(request, allow_none=True)).prefetch_related(
|
||||||
|
Prefetch('areas', Area.qs_for_request(request, allow_none=True)),
|
||||||
|
'groups', 'columns', 'holes', 'areas__groups',
|
||||||
|
'stairs', 'obstacles', 'lineobstacles'
|
||||||
|
)
|
||||||
|
for area in self.altitudeareas.all():
|
||||||
|
f.write('translate([0, 0, %.2f]) ' % area.altitude)
|
||||||
|
f.write(polygon_scad(area.geometry) + ';\n')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def render_scad_all(cls, request=None):
|
||||||
|
from c3nav.mapdata.models import Level, Area, Space
|
||||||
|
spaces = Space.objects.filter(Space.q_for_request(request, allow_none=True)).prefetch_related(
|
||||||
|
Prefetch('areas', Area.qs_for_request(request, allow_none=True)),
|
||||||
|
'groups', 'columns', 'holes', 'areas__groups',
|
||||||
|
'stairs', 'obstacles', 'lineobstacles'
|
||||||
|
)
|
||||||
|
level_spaces = {}
|
||||||
|
for space in spaces:
|
||||||
|
level_spaces.setdefault(space.level_id, []).append(space)
|
||||||
|
filename = os.path.join(settings.RENDER_ROOT, 'all.scad')
|
||||||
|
with open(filename, 'w') as f:
|
||||||
|
for level in Level.objects.prefetch_related('altitudeareas'):
|
||||||
|
level.render_scad(f, spaces=level_spaces.get(level.pk, []))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue