|
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
|
|
|
|
|
9
|
|
|
|
|
10
|
|
|
class PutableEvent(NearEvent): |
|
11
|
|
|
""" |
|
12
|
|
|
TODO: Refactorise with TakableEvent |
|
13
|
|
|
""" |
|
14
|
|
|
|
|
15
|
|
|
PARAM_PUT = 'put' |
|
16
|
|
|
PARAM_PUT_TO = 'put_to' |
|
17
|
|
|
PARAM_HOME_FAIL = 'home_fail' |
|
18
|
|
|
_mechanism = AroundMechanism |
|
19
|
|
|
_concern = COL_TRANSPORTER_CARRYING |
|
20
|
|
|
_near_name = 'objects_ids_putable' |
|
21
|
|
|
_near_map = lambda self, near_object_id, context: context.metas.states.have(near_object_id, TRANSPORTABLE) |
|
22
|
|
|
|
|
23
|
|
|
def _prepare(self, object_id, context, parameters={}): |
|
24
|
|
|
if not self._can_put(object_id, context): |
|
25
|
|
|
raise NotConcernedEvent() |
|
26
|
|
|
|
|
27
|
|
|
try: |
|
28
|
|
|
self.map(context, parameters, stop_at_first=False) |
|
29
|
|
|
except NearNothingFound: |
|
30
|
|
|
raise NotConcernedEvent() |
|
31
|
|
|
|
|
32
|
|
|
brain_part = get_brain_part(context, object_id, BRAIN_PART_PUT) |
|
33
|
|
|
parameters[self.PARAM_PUT] = [] |
|
34
|
|
|
parameters[self.PARAM_PUT_TO] = [] |
|
35
|
|
|
parameters[self.PARAM_HOME_FAIL] = False |
|
36
|
|
|
|
|
37
|
|
|
for object_near_id in parameters[self._near_name]: |
|
38
|
|
|
if brain_part.can_put(context, object_id, object_near_id): |
|
39
|
|
|
try: |
|
40
|
|
|
put_position = brain_part.get_put_position(context, object_id, object_near_id) |
|
41
|
|
|
parameters[self.PARAM_PUT].append(object_near_id) |
|
42
|
|
|
parameters[self.PARAM_PUT_TO].append(put_position) |
|
43
|
|
|
return parameters # Si a terme on veut tous les calculer a l'avance, ne pas retourner ici |
|
44
|
|
|
except CantFindWhereToPut: |
|
45
|
|
|
pass # On continu la booucle |
|
46
|
|
|
|
|
47
|
|
|
# Si a terme on veut tous les calculer a l'avance, raise que si rien trouve |
|
48
|
|
|
if AntMoveBrainPart._on_home_smell(context, object_id): # TODO: Reanger code (._ acces protege) |
|
49
|
|
|
parameters[self.PARAM_HOME_FAIL] = True |
|
50
|
|
|
return parameters |
|
51
|
|
|
|
|
52
|
|
|
@staticmethod |
|
53
|
|
|
def _can_put(object_id, context): |
|
54
|
|
|
return not context.metas.value.get(CANT_PUT_STILL, object_id, allow_empty=True) |
|
55
|
|
|
|
|
56
|
|
|
@classmethod |
|
57
|
|
|
def _object_can_put(cls, object_id, context, object_to_put_id): |
|
58
|
|
|
object_take_brain_part = get_brain_part(context, object_id, BRAIN_PART_PUT) |
|
59
|
|
|
return object_take_brain_part.can_put(context, object_id, object_to_put_id) |
|
60
|
|
|
|