Source code for scenic.core.workspaces

"""Workspaces."""

from scenic.core.distributions import needsSampling
from scenic.core.regions import Region, everywhere
from scenic.core.geometry import findMinMax
from scenic.core.utils import RuntimeParseError

[docs]class Workspace(Region): """A workspace describing the fixed world of a scenario""" def __init__(self, region=everywhere): if needsSampling(region): raise RuntimeParseError('workspace region must be fixed') super().__init__('workspace', orientation=region.orientation) self.region = region
[docs] def show(self, plt): """Render a schematic of the workspace for debugging""" try: aabb = self.region.getAABB() except NotImplementedError: # unbounded Regions don't support this return ((xmin, ymin), (xmax, ymax)) = aabb plt.xlim(xmin, xmax) plt.ylim(ymin, ymax) plt.gca().set_aspect('equal')
[docs] def zoomAround(self, plt, objects, expansion=2): """Zoom the schematic around the specified objects""" positions = (self.scenicToSchematicCoords(obj.position) for obj in objects) x, y = zip(*positions) minx, maxx = findMinMax(x) miny, maxy = findMinMax(y) sx = expansion * (maxx - minx) sy = expansion * (maxy - miny) s = max(sx, sy, self.minimumZoomSize) / 2.0 s += max(max(obj.width, obj.height) for obj in objects) # TODO improve cx = (maxx + minx) / 2.0 cy = (maxy + miny) / 2.0 plt.xlim(cx - s, cx + s) plt.ylim(cy - s, cy + s)
@property def minimumZoomSize(self): return 0
[docs] def scenicToSchematicCoords(self, coords): """Convert Scenic coordinates to those used for schematic rendering.""" return coords
def uniformPointInner(self): return self.region.uniformPointInner() def intersect(self, other, triedReversed=False): return self.region.intersect(other, triedReversed) def containsPoint(self, point): return self.region.containsPoint(point) def containsObject(self, obj): return self.region.containsObject(obj) def getAABB(self): return self.region.getAABB() def __str__(self): return f'<Workspace on {self.region}>' def __eq__(self, other): if type(other) is not Workspace: return NotImplemented return other.region == self.region def __hash__(self): return hash(self.region)