obstacles and everything in the new openscad renderer
This commit is contained in:
parent
e092375e20
commit
b8fd1e747a
1 changed files with 69 additions and 16 deletions
|
@ -132,10 +132,14 @@ class OpenSCADNewEngine(Base3DEngine):
|
||||||
)
|
)
|
||||||
|
|
||||||
for altitudearea in sorted(geoms.altitudeareas, key=attrgetter('altitude')):
|
for altitudearea in sorted(geoms.altitudeareas, key=attrgetter('altitude')):
|
||||||
name = 'Level %s Altitudearea %s' % (geoms.short_label, altitudearea.altitude)
|
if altitudearea.altitude2 is not None:
|
||||||
|
name = 'Altitudearea %s-%s' % (altitudearea.altitude/1000, altitudearea.altitude2/1000)
|
||||||
|
else:
|
||||||
|
name = 'Altitudearea %s' % (altitudearea.altitude / 1000)
|
||||||
|
|
||||||
geometry = altitudearea.geometry.buffer(0)
|
geometry = altitudearea.geometry.buffer(0)
|
||||||
inside_geometry = geometry.intersection(buildings).buffer(0).buffer(0.004, join_style=JOIN_STYLE.mitre)
|
inside_geometry = geometry.intersection(buildings).buffer(0).buffer(0.07, join_style=JOIN_STYLE.mitre)
|
||||||
outside_geometry = geometry.difference(buildings).buffer(0).buffer(0.004, join_style=JOIN_STYLE.mitre)
|
outside_geometry = geometry.difference(buildings).buffer(0).buffer(0.07, join_style=JOIN_STYLE.mitre)
|
||||||
|
|
||||||
slopes = True
|
slopes = True
|
||||||
|
|
||||||
|
@ -153,7 +157,7 @@ class OpenSCADNewEngine(Base3DEngine):
|
||||||
altitudearea.point1, altitudearea.point2, bottom=True)
|
altitudearea.point1, altitudearea.point2, bottom=True)
|
||||||
if slopes:
|
if slopes:
|
||||||
main_building_block_diff.append(
|
main_building_block_diff.append(
|
||||||
OpenScadBlock('difference()', children=[polygon, slope], comment='slope')
|
OpenScadBlock('difference()', children=[polygon, slope], comment=name+' inside cut')
|
||||||
)
|
)
|
||||||
|
|
||||||
# actual thingy
|
# actual thingy
|
||||||
|
@ -163,19 +167,19 @@ class OpenSCADNewEngine(Base3DEngine):
|
||||||
altitudearea.point1, altitudearea.point2)
|
altitudearea.point1, altitudearea.point2)
|
||||||
if slopes:
|
if slopes:
|
||||||
main_building_block.append(
|
main_building_block.append(
|
||||||
OpenScadBlock('difference()', children=[polygon, slope], comment='slope')
|
OpenScadBlock('difference()', children=[polygon, slope], comment=name+' inside')
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
if altitudearea.altitude < current_upper_bound:
|
if altitudearea.altitude < current_upper_bound:
|
||||||
main_building_block_diff.append(
|
main_building_block_diff.append(
|
||||||
self._add_polygon(name, inside_geometry,
|
self._add_polygon(name+' inside cut', inside_geometry,
|
||||||
altitudearea.altitude, current_upper_bound+1000)
|
altitudearea.altitude, current_upper_bound+1000)
|
||||||
)
|
)
|
||||||
else:
|
main_building_block.append(
|
||||||
main_building_block.append(
|
self._add_polygon(name+' inside', inside_geometry,
|
||||||
self._add_polygon(name, inside_geometry,
|
min(altitudearea.altitude-700, current_upper_bound),
|
||||||
altitudearea.altitude-700, altitudearea.altitude)
|
altitudearea.altitude)
|
||||||
)
|
)
|
||||||
|
|
||||||
if not outside_geometry.is_empty:
|
if not outside_geometry.is_empty:
|
||||||
if altitudearea.altitude2 is not None:
|
if altitudearea.altitude2 is not None:
|
||||||
|
@ -192,16 +196,65 @@ class OpenSCADNewEngine(Base3DEngine):
|
||||||
altitudearea.point1, altitudearea.point2, bottom=True)
|
altitudearea.point1, altitudearea.point2, bottom=True)
|
||||||
if slopes:
|
if slopes:
|
||||||
main_building_block.append(
|
main_building_block.append(
|
||||||
OpenScadBlock('difference()', children=[polygon, slope1, slope2], comment='slope')
|
OpenScadBlock('difference()',
|
||||||
|
children=[polygon, slope1, slope2], comment=name+'outside')
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
lower = altitudearea.altitude-700
|
if geoms.on_top_of_id is None:
|
||||||
if lower == current_upper_bound:
|
lower = geoms.lower_bound
|
||||||
lower -= 10
|
else:
|
||||||
|
lower = altitudearea.altitude-700
|
||||||
|
if lower == current_upper_bound:
|
||||||
|
lower -= 10
|
||||||
main_building_block.append(
|
main_building_block.append(
|
||||||
self._add_polygon(name, outside_geometry, lower, altitudearea.altitude)
|
self._add_polygon(name+' outside', outside_geometry, lower, altitudearea.altitude)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# obstacles
|
||||||
|
if altitudearea.altitude2 is not None:
|
||||||
|
obstacles_diff_block = OpenScadBlock('difference()', comment=name + ' obstacles')
|
||||||
|
main_building_block.append(obstacles_diff_block)
|
||||||
|
|
||||||
|
obstacles_block = OpenScadBlock('union()')
|
||||||
|
obstacles_diff_block.append(obstacles_block)
|
||||||
|
|
||||||
|
min_slope_altitude = min(altitudearea.altitude, altitudearea.altitude2)
|
||||||
|
max_slope_altitude = max(altitudearea.altitude, altitudearea.altitude2)
|
||||||
|
bounds = geometry.bounds
|
||||||
|
|
||||||
|
for height, obstacles in altitudearea.obstacles.items():
|
||||||
|
height_diff = OpenScadBlock('difference()')
|
||||||
|
obstacles_block.append(height_diff)
|
||||||
|
|
||||||
|
height_union = OpenScadBlock('union()')
|
||||||
|
height_diff.append(height_union)
|
||||||
|
|
||||||
|
for obstacle in obstacles:
|
||||||
|
obstacle = obstacle.geom.buffer(0).intersection(geometry)
|
||||||
|
height_union.append(
|
||||||
|
self._add_polygon(None, obstacle,
|
||||||
|
min_slope_altitude-10, max_slope_altitude+height+10)
|
||||||
|
)
|
||||||
|
height_diff.append(
|
||||||
|
self._add_slope(bounds, altitudearea.altitude+height, altitudearea.altitude2+height,
|
||||||
|
altitudearea.point1, altitudearea.point2, bottom=False)
|
||||||
|
)
|
||||||
|
|
||||||
|
obstacles_diff_block.append(
|
||||||
|
self._add_slope(bounds, altitudearea.altitude-1, altitudearea.altitude2-1,
|
||||||
|
altitudearea.point1, altitudearea.point2, bottom=True)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
obstacles_block = OpenScadBlock('union()', comment=name + ' obstacles')
|
||||||
|
main_building_block.append(obstacles_block)
|
||||||
|
for height, obstacles in altitudearea.obstacles.items():
|
||||||
|
for obstacle in obstacles:
|
||||||
|
obstacle = obstacle.geom.buffer(0).intersection(geometry)
|
||||||
|
obstacles_block.append(
|
||||||
|
self._add_polygon(None, obstacle,
|
||||||
|
altitudearea.altitude-1, altitudearea.altitude+height)
|
||||||
|
)
|
||||||
|
|
||||||
def _add_polygon(self, name, geometry, minz, maxz):
|
def _add_polygon(self, name, geometry, minz, maxz):
|
||||||
geometry = geometry.buffer(0)
|
geometry = geometry.buffer(0)
|
||||||
polygons = []
|
polygons = []
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue