1
|
|
|
from synergine.core.config.ConfigurationManager import ConfigurationManager |
2
|
|
|
from synergine.synergy.object.SynergyObject import SynergyObject |
3
|
|
|
from synergine.core.exception.NotFoundError import NotFoundError |
4
|
|
|
|
5
|
|
|
|
6
|
|
|
class ObjectVisualizer(): |
7
|
|
|
""" |
8
|
|
|
TODO: Il y a eu un ajout, notion de surface directement en plus des objets. |
9
|
|
|
Du coups c'est sale et pas DRY. A reviser. |
10
|
|
|
""" |
11
|
|
|
|
12
|
|
|
def __init__(self, config: dict, context): |
13
|
|
|
config_manager = ConfigurationManager(config) |
14
|
|
|
self._visualisation_configuration = config_manager.get('objects', {}) |
15
|
|
|
self._surface_configuration = config_manager.get('surfaces', {}) |
16
|
|
|
self._objects_class_mapped = {} |
17
|
|
|
self._context = context |
18
|
|
|
self._callback_position = config_manager.get('callbacks.position', 0) |
19
|
|
|
|
20
|
|
|
def get_visual(self, obj: SynergyObject): |
21
|
|
|
visualisation_definition = self._get_visual_definition(obj) |
22
|
|
|
if 'callbacks' in visualisation_definition: |
23
|
|
|
for callback in visualisation_definition['callbacks']: |
24
|
|
|
callback_return = callback(obj, self._context) |
25
|
|
|
# TODO: Exception au lieu de False |
26
|
|
|
if callback_return is not False: |
27
|
|
|
return self._apply_modifiers_on_visual(visualisation_definition, obj, callback_return) |
28
|
|
|
return self._apply_modifiers_on_visual(visualisation_definition, obj, visualisation_definition['default']) |
29
|
|
|
|
30
|
|
|
def _apply_modifiers_on_visual(self, visualisation_definition, obj, visual): |
31
|
|
|
new_visual = visual |
32
|
|
|
if 'modifiers' in visualisation_definition: |
33
|
|
|
for modifier in visualisation_definition['modifiers']: |
34
|
|
|
new_visual = modifier(obj, self._context, visual) |
35
|
|
|
return new_visual |
36
|
|
|
|
37
|
|
|
def get_surface(self, surface_name, parameters={}): |
38
|
|
|
surface_definition = self._get_surface_definition(surface_name) |
39
|
|
|
if 'callbacks' in surface_definition: |
40
|
|
|
for callback in surface_definition['callbacks']: |
41
|
|
|
callback_return = callback(parameters, self._context) |
42
|
|
|
# TODO: Exception au lieu de False |
43
|
|
|
if callback_return is not False: |
44
|
|
|
return callback_return.get_surface() |
45
|
|
|
return surface_definition['default'].get_surface() |
46
|
|
|
|
47
|
|
|
def get_for_position(self, position, objects): |
48
|
|
|
if self._callback_position: |
49
|
|
|
return self._callback_position(position, objects, self._context) |
50
|
|
|
return None, [] |
51
|
|
|
|
52
|
|
|
# TODO: fix bug: on doit mettre en cache dans self._objects_class_mapped le dict {default... et non pas le resultat |
53
|
|
|
def _get_visual_definition_for_class(self, class_name, obj): |
|
|
|
|
54
|
|
|
if obj.__class__ in self._visualisation_configuration: |
55
|
|
|
return self._visualisation_configuration[obj.__class__] |
56
|
|
|
for object_visualisation_class in self._visualisation_configuration: |
57
|
|
|
if isinstance(obj, object_visualisation_class): |
58
|
|
|
return self._visualisation_configuration[object_visualisation_class] |
59
|
|
|
raise NotFoundError() |
60
|
|
|
|
61
|
|
|
def _get_default_visualisation(self): |
62
|
|
|
if SynergyObject not in self._visualisation_configuration: |
63
|
|
|
raise Exception("Enable to found SynergyObject visualisation") |
64
|
|
|
return self._visualisation_configuration[SynergyObject]['default'] |
65
|
|
|
|
66
|
|
|
def _get_visual_definition(self, obj: SynergyObject): |
67
|
|
|
class_name = obj.__class__.__name__ |
68
|
|
|
if class_name not in self._objects_class_mapped: |
69
|
|
|
try: |
70
|
|
|
object_visualisation_definition = self._get_visual_definition_for_class(class_name, obj) |
71
|
|
|
except NotFoundError: |
72
|
|
|
object_visualisation_definition = self._get_default_visualisation() |
73
|
|
|
self._objects_class_mapped[class_name] = object_visualisation_definition |
74
|
|
|
|
75
|
|
|
return self._objects_class_mapped[class_name] |
76
|
|
|
|
77
|
|
|
def _get_surface_definition(self, surface_name): |
78
|
|
|
return self._surface_configuration[surface_name] |
This check looks for invalid names for a range of different identifiers.
You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.
If your project includes a Pylint configuration file, the settings contained in that file take precedence.
To find out more about Pylint, please refer to their site.