PutableEvent.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from intelligine.core.exceptions import NearNothingFound, CantFindWhereToPut
  2. from intelligine.shorcut.brain import get_brain_part
  3. from intelligine.simulation.object.brain.part.move.AntMoveBrainPart import AntMoveBrainPart
  4. from intelligine.synergy.event.src.NearEvent import NearEvent
  5. from synergine.core.exceptions import NotConcernedEvent
  6. from intelligine.cst import CANT_PUT_STILL, COL_TRANSPORTER_CARRYING, TRANSPORTABLE, BRAIN_SCHEMA, BRAIN_PART_PUT
  7. from synergine_xyz.mechanism.AroundMechanism import AroundMechanism
  8. class PutableEvent(NearEvent):
  9. """
  10. TODO: Refactorise with TakableEvent
  11. """
  12. PARAM_PUT = 'put'
  13. PARAM_PUT_TO = 'put_to'
  14. PARAM_HOME_FAIL = 'home_fail'
  15. _mechanism = AroundMechanism
  16. _concern = COL_TRANSPORTER_CARRYING
  17. _near_name = 'objects_ids_putable'
  18. _near_map = lambda self, near_object_id, context: context.metas.states.have(near_object_id, TRANSPORTABLE)
  19. def _prepare(self, object_id, context, parameters={}):
  20. if not self._can_put(object_id, context):
  21. raise NotConcernedEvent()
  22. try:
  23. self.map(context, parameters, stop_at_first=False)
  24. except NearNothingFound:
  25. raise NotConcernedEvent()
  26. brain_part = get_brain_part(context, object_id, BRAIN_PART_PUT)
  27. parameters[self.PARAM_PUT] = []
  28. parameters[self.PARAM_PUT_TO] = []
  29. parameters[self.PARAM_HOME_FAIL] = False
  30. for object_near_id in parameters[self._near_name]:
  31. if brain_part.can_put(context, object_id, object_near_id):
  32. try:
  33. put_position = brain_part.get_put_position(context, object_id, object_near_id)
  34. parameters[self.PARAM_PUT].append(object_near_id)
  35. parameters[self.PARAM_PUT_TO].append(put_position)
  36. return parameters # Si a terme on veut tous les calculer a l'avance, ne pas retourner ici
  37. except CantFindWhereToPut:
  38. pass # On continu la booucle
  39. # Si a terme on veut tous les calculer a l'avance, raise que si rien trouve
  40. if AntMoveBrainPart._on_home_smell(context, object_id): # TODO: Reanger code (._ acces protege)
  41. parameters[self.PARAM_HOME_FAIL] = True
  42. return parameters
  43. @staticmethod
  44. def _can_put(object_id, context):
  45. return not context.metas.value.get(CANT_PUT_STILL, object_id, allow_empty=True)
  46. @classmethod
  47. def _object_can_put(cls, object_id, context, object_to_put_id):
  48. object_take_brain_part = get_brain_part(context, object_id, BRAIN_PART_PUT)
  49. return object_take_brain_part.can_put(context, object_id, object_to_put_id)