Salome HOME
Issue #1440 Crash when edit box with parameter: temporary undoes previous modificatio...
[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
42     def __getattr__(self, name):
43         """Process missing attributes.
44
45         Add get*() methods for access feature attributes.
46         """
47         if name.startswith("get"):
48             possible_names = [
49                 "_" + name[3:],
50                 "_" + tools.convert_to_underscore(name[3:]),
51                 ]
52             for possible_name in possible_names:
53                 if hasattr(self, possible_name):
54                     def getter():
55                         return getattr(self, possible_name)
56                     return getter
57
58         raise AttributeError()
59
60     def _fillAttribute(self, attribute, value):
61         """Fill ModelAPI_Attribute* with value."""
62         tools.fill_attribute(attribute, value)
63
64     def feature(self):
65         """Return ModelAPI_Feature."""
66         return self._feature
67
68     def getKind(self):
69         """Return the unique kind of the feature"""
70         return self._feature.getKind()
71
72     def results(self):
73         """Return current results of the feature"""
74         return self._feature.results()
75
76     def firstResult(self):
77         """Return the first result in the list of results"""
78         return self._feature.firstResult()
79
80     def lastResult(self):
81         """Return the last result in the list of results"""
82         return self._feature.lastResult()
83
84     def setRealInput(self, inputid, value):
85         """I.setRealInput(str, float) -- set real value to the attribute"""
86         self._feature.data().real(inputid).setValue(value)
87
88     def areInputValid(self):
89         """I.areInputValid() -> True or False validation result"""
90         validators = ModelAPI.ModelAPI_Session.get().validators()
91         return validators.validate(self._feature)
92
93     def execute(self):
94         """I.execute() -- validate and execute the feature.
95
96         Raises RuntimeError if validation fails.
97         """
98         if self.areInputValid():
99             self._feature.execute()
100         else:
101             raise RuntimeError("Can not execute %s: %s" %
102                                (self._feature.getKind(), self._feature.error())
103                                )