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 c3nav.mapdata.utils.scad import polygon_scad
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'render the map to openscad'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
from c3nav.mapdata.models import AltitudeArea
|
||||
filename = os.path.join(settings.RENDER_ROOT, 'all.scad')
|
||||
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')
|
||||
from c3nav.mapdata.models import Level
|
||||
Level.render_scad_all()
|
||||
|
|
|
@ -35,11 +35,11 @@ class AccessRestrictionMixin(SerializableMixin, models.Model):
|
|||
return result
|
||||
|
||||
@classmethod
|
||||
def qs_for_request(cls, request):
|
||||
return cls.objects.filter(cls.q_for_request(request))
|
||||
def qs_for_request(cls, request, allow_none=False):
|
||||
return cls.objects.filter(cls.q_for_request(request, allow_none=allow_none))
|
||||
|
||||
@classmethod
|
||||
def q_for_request(cls, request, prefix=''):
|
||||
if request.user.is_authenticated and request.user.is_superuser:
|
||||
def q_for_request(cls, request, prefix='', allow_none=False):
|
||||
if (request is None and allow_none) or (request.user.is_authenticated and request.user.is_superuser):
|
||||
return Q()
|
||||
return Q(**{prefix + 'access_restriction__isnull': True})
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import os
|
||||
from itertools import chain
|
||||
|
||||
from django.conf import settings
|
||||
|
@ -8,6 +9,7 @@ from shapely.geometry import JOIN_STYLE
|
|||
from shapely.ops import cascaded_union
|
||||
|
||||
from c3nav.mapdata.models.locations import SpecificLocation
|
||||
from c3nav.mapdata.utils.scad import polygon_scad
|
||||
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)
|
||||
|
||||
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