support setting render bounds in rendermap and openscad renderer

This commit is contained in:
Laura Klünder 2018-12-06 18:30:28 +01:00
parent b266c3f391
commit 016def8178
2 changed files with 37 additions and 8 deletions

View file

@ -2,7 +2,7 @@ import argparse
import os
from django.conf import settings
from django.core.management.base import BaseCommand
from django.core.management.base import BaseCommand, CommandError
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
@ -74,9 +74,31 @@ class Command(BaseCommand):
help=_('do not center the output'))
parser.add_argument('--scale', default=1, type=self.scale_value,
help=_('scale (from 1 to 32), only relevant for image renderers'))
parser.add_argument('--minx', default=None, type=float,
help=_('minimum x coordinate, everthing left of it will be cropped'))
parser.add_argument('--miny', default=None, type=float,
help=_('minimum y coordinate, everthing below it will be cropped'))
parser.add_argument('--maxx', default=None, type=float,
help=_('maximum x coordinate, everthing right of it will be cropped'))
parser.add_argument('--maxy', default=None, type=float,
help=_('maximum y coordinate, everthing above it will be cropped'))
def handle(self, *args, **options):
(minx, miny), (maxx, maxy) = Source.max_bounds()
if options['minx'] is not None:
minx = options['minx']
if options['miny'] is not None:
miny = options['miny']
if options['maxx'] is not None:
maxx = options['maxx']
if options['maxy'] is not None:
maxy = options['maxy']
if minx >= maxx:
raise CommandError(_('minx has to be lower than maxx'))
if miny >= maxy:
raise CommandError(_('miny has to be lower than maxy'))
for level in options['levels']:
renderer = MapRenderer(level.pk, minx, miny, maxx, maxy, access_permissions=options['permissions'],
scale=options['scale'], full_levels=options['full_levels'])

View file

@ -121,10 +121,13 @@ class OpenSCADEngine(Base3DEngine):
main_building_block_diff = OpenScadBlock('difference()')
main_building_block.append(main_building_block_diff)
main_building_block_diff.append(
self._add_polygon(None, buildings, geoms.lower_bound, geoms.upper_bound)
self._add_polygon(None, buildings.intersection(self.bbox), geoms.lower_bound, geoms.upper_bound)
)
for altitudearea in sorted(geoms.altitudeareas, key=attrgetter('altitude')):
if not altitudearea.geometry.intersects(self.bbox):
continue
if altitudearea.altitude2 is not None:
name = 'Altitudearea %s-%s' % (altitudearea.altitude/1000, altitudearea.altitude2/1000)
else:
@ -142,7 +145,7 @@ class OpenSCADEngine(Base3DEngine):
areas = areas.union(geometry)
buildings = buildings.difference(geometry).buffer(0)
inside_geometry = inside_geometry.intersection(areas).buffer(0)
outside_geometry = outside_geometry.intersection(areas).buffer(0)
outside_geometry = outside_geometry.intersection(areas).buffer(0).intersection(self.bbox)
geometry_buffered = geometry_buffered.intersection(areas).buffer(0)
slopes = True
@ -165,8 +168,8 @@ class OpenSCADEngine(Base3DEngine):
)
# actual thingy
if max_slope_altitude > current_upper_bound:
polygon = self._add_polygon(None, inside_geometry,
if max_slope_altitude > current_upper_bound and inside_geometry.intersects(self.bbox):
polygon = self._add_polygon(None, inside_geometry.intersection(self.bbox),
current_upper_bound-10, max_slope_altitude+10)
slope = self._add_slope(bounds, altitudearea.altitude, altitudearea.altitude2,
altitudearea.point1, altitudearea.point2, bottom=False)
@ -182,7 +185,7 @@ class OpenSCADEngine(Base3DEngine):
)
else:
main_building_block.append(
self._add_polygon(name+' inside', inside_geometry,
self._add_polygon(name+' inside', inside_geometry.intersection(self.bbox),
min(altitudearea.altitude-700, current_upper_bound-10),
altitudearea.altitude)
)
@ -237,13 +240,15 @@ class OpenSCADEngine(Base3DEngine):
height_diff.append(height_union)
for obstacle in obstacles:
if not obstacle.geom.intersects(self.bbox):
continue
obstacle = obstacle.geom.buffer(0).buffer(0.01, join_style=JOIN_STYLE.mitre)
obstacle = obstacle.intersection(geometry_buffered)
if not obstacle.is_empty:
had_height_obstacles = True
had_obstacles = True
height_union.append(
self._add_polygon(None, obstacle,
self._add_polygon(None, obstacle.intersection(self.bbox),
min_slope_altitude-20, max_slope_altitude+height+10)
)
@ -265,8 +270,10 @@ class OpenSCADEngine(Base3DEngine):
had_obstacles = False
for height, obstacles in altitudearea.obstacles.items():
for obstacle in obstacles:
if not obstacle.geom.intersects(self.bbox):
continue
obstacle = obstacle.geom.buffer(0).buffer(0.01, join_style=JOIN_STYLE.mitre)
obstacle = obstacle.intersection(geometry_buffered)
obstacle = obstacle.intersection(geometry_buffered).intersection(self.bbox)
if not obstacle.is_empty:
had_obstacles = True
obstacles_block.append(