Salome HOME
1fa83ee5715acdf3678cfd57e83543b126fb08e3
[modules/shaper.git] / src / PythonAPI / model / roots.py
1 """Abstract root classes of user-defined Python features producing a Body
2 Author: Daniel Brunier-Coulin
3 Copyright (C) 2014-20xx CEA/DEN, EDF R&D
4 """
5
6 import ModelAPI
7
8 from model import tools
9
10
11 class Feature(ModelAPI.ModelAPI_Feature):
12     """Base class of user-defined Python features."""
13
14     def __init__(self):
15         """x.__init__(...) initializes x; see x.__class__.__doc__ for signature"""
16         ModelAPI.ModelAPI_Feature.__init__(self)
17
18     def addRealInput(self, inputid):
19         """F.addRealInput(str) -- add real attribute"""
20         self.data().addAttribute(inputid,
21                                  ModelAPI.ModelAPI_AttributeDouble_typeId())
22
23     def getRealInput(self, inputid):
24         """F.getRealInput(str) -- get real value of the attribute"""
25         return self.data().real(inputid).value()
26
27     def addResult(self, result):
28         """F.addResult(ModelAPI_Result) -- add ModelAPI_Result shape as a result"""
29         shape = result.shape()
30         body = self.document().createBody(self.data())
31         body.store(shape)
32         self.setResult(body)
33
34
35 class Interface():
36     """Base class of high level Python interfaces to features."""
37
38     def __init__(self, feature):
39         """x.__init__(...) initializes x; see x.__class__.__doc__ for signature"""
40         self._feature = feature
41         self._attribute_white_list = [
42             "execute",
43             "getKind", "results", "firstResult", "lastResult",
44             ]
45
46     def __getattr__(self, name):
47         """Process missing attributes.
48
49         Add get*() methods for access feature attributes.
50         Redirect some missing attributes to the feature.
51         """
52         if name.startswith("get"):
53             possible_names = [
54                 "_" + name[3:],
55                 "_" + tools.convert_to_underscore(name[3:]),
56                 ]
57             for possible_name in possible_names:
58                 if hasattr(self, possible_name):
59                     def getter():
60                         return getattr(self, possible_name)
61                     return getter
62
63         if name in self._attribute_white_list:
64             return getattr(self._feature, name)
65
66         raise AttributeError()
67
68     def feature(self):
69         """Return ModelAPI_Feature."""
70         return self._feature
71
72     def _fill_attribute(self, attribute, value):
73         """Fill ModelAPI_Attribute* with value."""
74         tools.fill_attribute(attribute, value)
75
76     def setRealInput(self, inputid, value):
77         """I.setRealInput(str, float) -- set real value to the attribute"""
78         self._feature.data().real(inputid).setValue(value)
79
80     def areInputValid(self):
81         """I.areInputValid() -> True or False validation result"""
82         validators = ModelAPI.ModelAPI_Session.get().validators()
83         return validators.validate(self._feature)
84
85     def _execute(self):
86         """I._execute() -- validate and execute the feature.
87
88         Raises RuntimeError if validation fails.
89         """
90         if self.areInputValid():
91             self._feature.execute()
92         else:
93             raise RuntimeError("Can not execute %s: %s" %
94                                (self._feature.getKind(), self._feature.error())
95                                )