+ def update_shapes(self):
+ if self._old_poly_cache:
+ self._space.remove(*self._old_poly_cache)
+ new_polys = self._old_poly_cache = self.polys()
+ self._space.add(*new_polys)
+
+ @property
+ def position(self):
+ return self._position
+
+ @property
+ def max_radius(self):
+ return self._max_radius
+
+ @max_radius.setter
+ def max_radius(self, value):
+ self._max_radius = value or 0.0
+
+ @property
+ def min_radius(self):
+ return self._min_radius
+
+ @min_radius.setter
+ def min_radius(self, value):
+ self._min_radius = value or 0.0
+
+ def reaches(self, position):
+ distance = self.position.get_distance(position)
+ return (self._min_radius <= distance <= self._max_radius)
+
+ def _set_radius_limits(self, radius_limits):
+ if radius_limits is None or not radius_limits[0]:
+ self._min_radius = 0
+ else:
+ self._min_radius = radius_limits[0]
+ if radius_limits is None or not radius_limits[1]:
+ self._max_radius = 50.0
+ else:
+ self._max_radius = radius_limits[1]
+
+ def rotatable(self):
+ return self._direction is not None
+
+ @property
+ def direction(self):
+ if self._direction is None:
+ return 0
+ return self._direction.angle_degrees
+
+ @direction.setter
+ def direction(self, degrees):
+ spread = self._direction.get_angle_between(self._start)
+ self._direction.angle_degrees = degrees
+ self._start = self._direction.rotated(spread)
+ self._end = self._direction.rotated(-spread)
+ self._poly_cache = None
+
+ @property
+ def spread(self):
+ if not self._direction:
+ return 2 * math.pi
+ return math.fabs(self._start.get_angle_between(self._end))
+
+ def _set_angle_limits(self, direction, spread):
+ if direction is None or spread is None:
+ self._direction = None