OpenSimula 0.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- opensimula/Child.py +19 -0
- opensimula/Component.py +214 -0
- opensimula/Iterative_process.py +47 -0
- opensimula/Message.py +19 -0
- opensimula/Parameter_container.py +80 -0
- opensimula/Parameters.py +755 -0
- opensimula/Project.py +674 -0
- opensimula/Simulation.py +212 -0
- opensimula/Variable.py +37 -0
- opensimula/__init__.py +8 -0
- opensimula/components/Building.py +511 -0
- opensimula/components/Building_surface.py +318 -0
- opensimula/components/Calculator.py +51 -0
- opensimula/components/Construction.py +309 -0
- opensimula/components/Day_schedule.py +64 -0
- opensimula/components/File_data.py +117 -0
- opensimula/components/File_met.py +1035 -0
- opensimula/components/Frame.py +35 -0
- opensimula/components/Glazing.py +122 -0
- opensimula/components/HVAC_DX_equipment.py +210 -0
- opensimula/components/HVAC_DX_system.py +254 -0
- opensimula/components/HVAC_MZW_system.py +554 -0
- opensimula/components/HVAC_SZW_system.py +338 -0
- opensimula/components/HVAC_coil_equipment.py +206 -0
- opensimula/components/HVAC_fan_equipment.py +44 -0
- opensimula/components/HVAC_perfect_system.py +137 -0
- opensimula/components/Material.py +14 -0
- opensimula/components/Opening.py +409 -0
- opensimula/components/Opening_type.py +90 -0
- opensimula/components/Solar_surface.py +114 -0
- opensimula/components/Space.py +388 -0
- opensimula/components/Space_type.py +81 -0
- opensimula/components/Surface.py +129 -0
- opensimula/components/Test_component.py +76 -0
- opensimula/components/Week_schedule.py +30 -0
- opensimula/components/Year_schedule.py +65 -0
- opensimula/components/__init__.py +40 -0
- opensimula/visual_3D/Environment_3D.py +257 -0
- opensimula/visual_3D/Polygon_3D.py +262 -0
- opensimula-0.5.1.dist-info/METADATA +49 -0
- opensimula-0.5.1.dist-info/RECORD +44 -0
- opensimula-0.5.1.dist-info/WHEEL +5 -0
- opensimula-0.5.1.dist-info/licenses/LICENSE +21 -0
- opensimula-0.5.1.dist-info/top_level.txt +1 -0
opensimula/Parameters.py
ADDED
|
@@ -0,0 +1,755 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import math #Needed for expressions
|
|
3
|
+
from opensimula.Child import Child
|
|
4
|
+
from opensimula.Message import Message
|
|
5
|
+
|
|
6
|
+
# ___________________ Parameter _________________________
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Parameter(Child):
|
|
10
|
+
"""Elements with key-value pair
|
|
11
|
+
|
|
12
|
+
- key
|
|
13
|
+
- value
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, key, value=0):
|
|
17
|
+
Child.__init__(self)
|
|
18
|
+
self._key_ = key
|
|
19
|
+
self._value_ = value
|
|
20
|
+
self._sim_ = None
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def key(self):
|
|
24
|
+
return self._key_
|
|
25
|
+
|
|
26
|
+
@key.setter
|
|
27
|
+
def key(self, key):
|
|
28
|
+
self._key_ = key
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def value(self):
|
|
32
|
+
return self._value_
|
|
33
|
+
|
|
34
|
+
@value.setter
|
|
35
|
+
def value(self, value):
|
|
36
|
+
self._value_ = value
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def type(self):
|
|
40
|
+
return type(self).__name__
|
|
41
|
+
|
|
42
|
+
def info(self):
|
|
43
|
+
return self.key + ": " + str(self.value)
|
|
44
|
+
|
|
45
|
+
def check(self):
|
|
46
|
+
return []
|
|
47
|
+
|
|
48
|
+
def _get_error_header_(self):
|
|
49
|
+
return f'{self.parent.parameter("name").value}->{self.key}: '
|
|
50
|
+
|
|
51
|
+
def _cast_to_bool_(self, input_value):
|
|
52
|
+
if isinstance(input_value, bool):
|
|
53
|
+
return (input_value, 'ok')
|
|
54
|
+
elif isinstance(input_value, str):
|
|
55
|
+
if (input_value == 'True'):
|
|
56
|
+
return (True, 'ok')
|
|
57
|
+
elif (input_value == 'False'):
|
|
58
|
+
return (False, 'ok')
|
|
59
|
+
else:
|
|
60
|
+
return (True, f"{input_value} cannot be converted to boolean.")
|
|
61
|
+
else:
|
|
62
|
+
return (True, f"{str(input_value)} is not boolean.")
|
|
63
|
+
|
|
64
|
+
def _cast_to_int_(self, input_value):
|
|
65
|
+
if isinstance(input_value, int):
|
|
66
|
+
return (input_value, 'ok')
|
|
67
|
+
elif isinstance(input_value, str):
|
|
68
|
+
try:
|
|
69
|
+
number = int(input_value)
|
|
70
|
+
return (number, 'ok')
|
|
71
|
+
except ValueError:
|
|
72
|
+
return (0, f"{input_value} cannot be converted to int.")
|
|
73
|
+
else:
|
|
74
|
+
return (0, f"{str(input_value)} is not int.")
|
|
75
|
+
|
|
76
|
+
def _cast_to_float_(self, input_value):
|
|
77
|
+
if isinstance(input_value, float):
|
|
78
|
+
return (input_value, 'ok')
|
|
79
|
+
elif isinstance(input_value, int):
|
|
80
|
+
return (float(input_value), 'ok')
|
|
81
|
+
elif isinstance(input_value, str):
|
|
82
|
+
try:
|
|
83
|
+
number = float(input_value)
|
|
84
|
+
return (number, 'ok')
|
|
85
|
+
except ValueError:
|
|
86
|
+
return (0.0, f"{input_value} cannot be converted to float.")
|
|
87
|
+
else:
|
|
88
|
+
return (0.0, f"{str(input_value)} is not float.")
|
|
89
|
+
|
|
90
|
+
def _cast_to_string_list_(self, input_strig):
|
|
91
|
+
if isinstance(input_strig, str):
|
|
92
|
+
line = input_strig.strip()
|
|
93
|
+
if line[0] == "[" and line[-1] == "]":
|
|
94
|
+
stripped = [s.strip() for s in line[1:-1].split(',')]
|
|
95
|
+
return (stripped, 'ok')
|
|
96
|
+
else:
|
|
97
|
+
return ([], f"{str(input_strig)} do not start with '[' or finish with ']'.")
|
|
98
|
+
else:
|
|
99
|
+
return ([], f"{str(input_strig)} is not string.")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# _____________ Parameter_boolean ___________________________
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class Parameter_boolean(Parameter):
|
|
106
|
+
def __init__(self, key, value=False):
|
|
107
|
+
Parameter.__init__(self, key, value)
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def value(self):
|
|
111
|
+
return self._value_
|
|
112
|
+
|
|
113
|
+
@value.setter
|
|
114
|
+
def value(self, value):
|
|
115
|
+
val, msg = self._cast_to_bool_(value)
|
|
116
|
+
if (msg == 'ok'):
|
|
117
|
+
self._value_ = val
|
|
118
|
+
else:
|
|
119
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
120
|
+
|
|
121
|
+
class Parameter_boolean_list(Parameter):
|
|
122
|
+
def __init__(self, key, value=[False]):
|
|
123
|
+
Parameter.__init__(self, key, value)
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def value(self):
|
|
127
|
+
return self._value_
|
|
128
|
+
|
|
129
|
+
@value.setter
|
|
130
|
+
def value(self, value):
|
|
131
|
+
if isinstance(value, bool): # Single boolean
|
|
132
|
+
value = [value]
|
|
133
|
+
if not isinstance(value, list):
|
|
134
|
+
val, msg = self._cast_to_string_list_(value)
|
|
135
|
+
if (msg == 'ok'):
|
|
136
|
+
value = val
|
|
137
|
+
else:
|
|
138
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
139
|
+
return
|
|
140
|
+
# Is a list
|
|
141
|
+
final_values = []
|
|
142
|
+
for n in value:
|
|
143
|
+
val, msg = self._cast_to_bool_(n)
|
|
144
|
+
final_values.append(val)
|
|
145
|
+
if (msg != 'ok'):
|
|
146
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
147
|
+
self._value_ = final_values
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# _____________ Parameter_string ___________________________
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class Parameter_string(Parameter):
|
|
154
|
+
def __init__(self, key, value=""):
|
|
155
|
+
Parameter.__init__(self, key, value)
|
|
156
|
+
|
|
157
|
+
@property
|
|
158
|
+
def value(self):
|
|
159
|
+
return self._value_
|
|
160
|
+
|
|
161
|
+
@value.setter
|
|
162
|
+
def value(self, value):
|
|
163
|
+
self._value_ = str(value)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class Parameter_string_list(Parameter):
|
|
167
|
+
def __init__(self, key, value=[""]):
|
|
168
|
+
Parameter.__init__(self, key, value)
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def value(self):
|
|
172
|
+
return self._value_
|
|
173
|
+
|
|
174
|
+
@value.setter
|
|
175
|
+
def value(self, value):
|
|
176
|
+
if isinstance(value, str): # Single string
|
|
177
|
+
value = [value]
|
|
178
|
+
if not isinstance(value, list):
|
|
179
|
+
val, msg = self._cast_to_string_list_(value)
|
|
180
|
+
if (msg == 'ok'):
|
|
181
|
+
self._value_ = val
|
|
182
|
+
else:
|
|
183
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
184
|
+
else:
|
|
185
|
+
for el in value:
|
|
186
|
+
el = str(el)
|
|
187
|
+
self._value_ = value
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
# _____________ Parameter_int ___________________________
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
class Parameter_int(Parameter):
|
|
194
|
+
def __init__(self, key, value=0, unit="", min=0, max=sys.maxsize):
|
|
195
|
+
Parameter.__init__(self, key, value)
|
|
196
|
+
self._unit_ = unit
|
|
197
|
+
self._min_ = min
|
|
198
|
+
self._max_ = max
|
|
199
|
+
|
|
200
|
+
@property
|
|
201
|
+
def unit(self):
|
|
202
|
+
return self._unit_
|
|
203
|
+
|
|
204
|
+
@property
|
|
205
|
+
def value(self):
|
|
206
|
+
return self._value_
|
|
207
|
+
|
|
208
|
+
@value.setter
|
|
209
|
+
def value(self, value):
|
|
210
|
+
val, msg = self._cast_to_int_(value)
|
|
211
|
+
if (msg == 'ok'):
|
|
212
|
+
self._value_ = val
|
|
213
|
+
else:
|
|
214
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
215
|
+
|
|
216
|
+
def info(self):
|
|
217
|
+
return self.key + ": " + str(self.value) + " [" + self._unit_ + "]"
|
|
218
|
+
|
|
219
|
+
def check(self):
|
|
220
|
+
if self.value < self._min_ or self.value > self._max_:
|
|
221
|
+
msg = self._get_error_header_()+f"{self.value} is not at [{self._min_},{self._max_}]"
|
|
222
|
+
return [Message(msg,"ERROR")]
|
|
223
|
+
else:
|
|
224
|
+
return []
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class Parameter_int_list(Parameter):
|
|
228
|
+
def __init__(self, key, value=[0], unit="", min=0, max=sys.maxsize):
|
|
229
|
+
Parameter.__init__(self, key, value)
|
|
230
|
+
self._unit_ = unit
|
|
231
|
+
self._min_ = min
|
|
232
|
+
self._max_ = max
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def unit(self):
|
|
236
|
+
return self._unit_
|
|
237
|
+
|
|
238
|
+
@property
|
|
239
|
+
def value(self):
|
|
240
|
+
return self._value_
|
|
241
|
+
|
|
242
|
+
@value.setter
|
|
243
|
+
def value(self, value):
|
|
244
|
+
if isinstance(value, int): # Single integer
|
|
245
|
+
value = [value]
|
|
246
|
+
if not isinstance(value, list):
|
|
247
|
+
val, msg = self._cast_to_string_list_(value)
|
|
248
|
+
if (msg == 'ok'):
|
|
249
|
+
value = val
|
|
250
|
+
else:
|
|
251
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
252
|
+
return
|
|
253
|
+
# Is a list
|
|
254
|
+
final_values = []
|
|
255
|
+
for n in value:
|
|
256
|
+
val, msg = self._cast_to_int_(n)
|
|
257
|
+
final_values.append(val)
|
|
258
|
+
if (msg != 'ok'):
|
|
259
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
260
|
+
self._value_ = final_values
|
|
261
|
+
|
|
262
|
+
def check(self):
|
|
263
|
+
errors = []
|
|
264
|
+
for n in self.value:
|
|
265
|
+
if n < self._min_ or n > self._max_:
|
|
266
|
+
msg = self._get_error_header_()+f"{n} is not at [{self._min_},{self._max_}]"
|
|
267
|
+
errors.append(Message(msg,"ERROR"))
|
|
268
|
+
return errors
|
|
269
|
+
|
|
270
|
+
def info(self):
|
|
271
|
+
return self.key + ": " + str(self.value) + " [" + self._unit_ + "]"
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
# _____________ Parameter_float ___________________________
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class Parameter_float(Parameter_int):
|
|
278
|
+
def __init__(self, key, value=0.0, unit="", min=float("-inf"), max=float("inf")):
|
|
279
|
+
Parameter_int.__init__(self, key, float(
|
|
280
|
+
value), unit, float(min), float(max))
|
|
281
|
+
|
|
282
|
+
@property
|
|
283
|
+
def value(self):
|
|
284
|
+
return self._value_
|
|
285
|
+
|
|
286
|
+
@value.setter
|
|
287
|
+
def value(self, value):
|
|
288
|
+
val, msg = self._cast_to_float_(value)
|
|
289
|
+
if (msg == 'ok'):
|
|
290
|
+
self._value_ = val
|
|
291
|
+
else:
|
|
292
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
293
|
+
|
|
294
|
+
def check(self):
|
|
295
|
+
if self.value < self._min_ or self.value > self._max_:
|
|
296
|
+
msg = self._get_error_header_()+f"{self.value} is not at [{self._min_},{self._max_}]"
|
|
297
|
+
return [Message(msg,"ERROR")]
|
|
298
|
+
else:
|
|
299
|
+
return []
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
class Parameter_float_list(Parameter_int_list):
|
|
303
|
+
def __init__(self, key, value=[0.0], unit="", min=float("-inf"), max=float("inf")):
|
|
304
|
+
Parameter_int_list.__init__(
|
|
305
|
+
self, key, value, unit, float(min), float(max))
|
|
306
|
+
|
|
307
|
+
@property
|
|
308
|
+
def value(self):
|
|
309
|
+
return self._value_
|
|
310
|
+
|
|
311
|
+
@value.setter
|
|
312
|
+
def value(self, value):
|
|
313
|
+
if isinstance(value, float): # Single float
|
|
314
|
+
value = [value]
|
|
315
|
+
if not isinstance(value, list):
|
|
316
|
+
val, msg = self._cast_to_string_list_(value)
|
|
317
|
+
if (msg == 'ok'):
|
|
318
|
+
value = val
|
|
319
|
+
else:
|
|
320
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
321
|
+
return
|
|
322
|
+
# Is a list
|
|
323
|
+
final_values = []
|
|
324
|
+
for n in value:
|
|
325
|
+
val, msg = self._cast_to_float_(n)
|
|
326
|
+
final_values.append(val)
|
|
327
|
+
if (msg != 'ok'):
|
|
328
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
329
|
+
self._value_ = final_values
|
|
330
|
+
|
|
331
|
+
def check(self):
|
|
332
|
+
errors = []
|
|
333
|
+
for n in self.value:
|
|
334
|
+
if n < self._min_ or n > self._max_:
|
|
335
|
+
msg = self._get_error_header_()+f"{n} is not at [{self._min_},{self._max_}]"
|
|
336
|
+
errors.append(Message(msg,"ERROR"))
|
|
337
|
+
return errors
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
# _____________ Parameter_options ___________________________
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
class Parameter_options(Parameter):
|
|
344
|
+
def __init__(self, key, value="", options=[]):
|
|
345
|
+
Parameter.__init__(self, key, value)
|
|
346
|
+
self._options_ = options
|
|
347
|
+
self.value = value # To check included in options
|
|
348
|
+
|
|
349
|
+
@property
|
|
350
|
+
def value(self):
|
|
351
|
+
return self._value_
|
|
352
|
+
|
|
353
|
+
@value.setter
|
|
354
|
+
def value(self, value):
|
|
355
|
+
self._value_ = str(value)
|
|
356
|
+
|
|
357
|
+
@property
|
|
358
|
+
def options(self):
|
|
359
|
+
return self._options_
|
|
360
|
+
|
|
361
|
+
def check(self):
|
|
362
|
+
if self.value not in self.options:
|
|
363
|
+
msg = self._get_error_header_()+f"{self.value} is not in options."
|
|
364
|
+
return [Message(msg,"ERROR")]
|
|
365
|
+
else:
|
|
366
|
+
return []
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
class Parameter_options_list(Parameter):
|
|
370
|
+
def __init__(self, key, value=[""], options=[]):
|
|
371
|
+
Parameter.__init__(self, key, value)
|
|
372
|
+
self._options_ = options
|
|
373
|
+
self.value = value # To check included in options
|
|
374
|
+
|
|
375
|
+
@property
|
|
376
|
+
def value(self):
|
|
377
|
+
return self._value_
|
|
378
|
+
|
|
379
|
+
@value.setter
|
|
380
|
+
def value(self, value):
|
|
381
|
+
if isinstance(value, str): # Single string
|
|
382
|
+
value = [value]
|
|
383
|
+
if not isinstance(value, list):
|
|
384
|
+
val, msg = self._cast_to_string_list_(value)
|
|
385
|
+
if (msg == 'ok'):
|
|
386
|
+
self._value_ = val
|
|
387
|
+
else:
|
|
388
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
389
|
+
else:
|
|
390
|
+
for el in value:
|
|
391
|
+
el = str(el)
|
|
392
|
+
self._value_ = value
|
|
393
|
+
|
|
394
|
+
@property
|
|
395
|
+
def options(self):
|
|
396
|
+
return self._options_
|
|
397
|
+
|
|
398
|
+
def check(self):
|
|
399
|
+
errors = []
|
|
400
|
+
for el in self.value:
|
|
401
|
+
if el not in self.options:
|
|
402
|
+
msg = self._get_error_header_()+f"{el} is not in options."
|
|
403
|
+
errors.append(Message(msg,"ERROR"))
|
|
404
|
+
return errors
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
# _____________ Parameter_component ___________________________
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
class Parameter_component(Parameter):
|
|
411
|
+
def __init__(self, key, value="not_defined", allowed_types=[]):
|
|
412
|
+
Parameter.__init__(self, key, value)
|
|
413
|
+
self.value = value
|
|
414
|
+
self._allowed_types_ = allowed_types
|
|
415
|
+
|
|
416
|
+
@property
|
|
417
|
+
def value(self):
|
|
418
|
+
return self._value_
|
|
419
|
+
|
|
420
|
+
@value.setter
|
|
421
|
+
def value(self, value):
|
|
422
|
+
self._value_ = str(value)
|
|
423
|
+
if "->" in self.value:
|
|
424
|
+
self._external_ = True
|
|
425
|
+
else:
|
|
426
|
+
self._external_ = False
|
|
427
|
+
|
|
428
|
+
@property
|
|
429
|
+
def external(self):
|
|
430
|
+
return self._external_
|
|
431
|
+
|
|
432
|
+
@property
|
|
433
|
+
def allowed_types(self):
|
|
434
|
+
return self._allowed_types_
|
|
435
|
+
|
|
436
|
+
@property
|
|
437
|
+
def component(self):
|
|
438
|
+
if self.external:
|
|
439
|
+
splits = self.value.split("->")
|
|
440
|
+
proj = self.parent.project()._sim_.project(splits[0])
|
|
441
|
+
if proj is None:
|
|
442
|
+
return None
|
|
443
|
+
else:
|
|
444
|
+
return proj.component(splits[1])
|
|
445
|
+
else:
|
|
446
|
+
if self.parent.__class__.__name__== "Project":
|
|
447
|
+
return self.parent.component(self.value)
|
|
448
|
+
else:
|
|
449
|
+
return self.parent.project().component(self.value)
|
|
450
|
+
|
|
451
|
+
def check(self):
|
|
452
|
+
errors = []
|
|
453
|
+
comp = self.component
|
|
454
|
+
if len(self.allowed_types) > 0 and self.value != "not_defined":
|
|
455
|
+
if type(comp).__name__ not in self.allowed_types:
|
|
456
|
+
msg = self._get_error_header_()+f"{self.value} component is not of one of the allowed types."
|
|
457
|
+
errors.append(Message(msg,"ERROR"))
|
|
458
|
+
if comp is None and self.value != "not_defined":
|
|
459
|
+
msg = self._get_error_header_() + f"{self.value} component not found."
|
|
460
|
+
errors.append(Message(msg,"ERROR"))
|
|
461
|
+
return errors
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
class Parameter_component_list(Parameter):
|
|
465
|
+
def __init__(self, key, value=["not_defined"], allowed_types=[]):
|
|
466
|
+
Parameter.__init__(self, key, value)
|
|
467
|
+
self.value = value
|
|
468
|
+
self._allowed_types_ = allowed_types
|
|
469
|
+
|
|
470
|
+
@property
|
|
471
|
+
def value(self):
|
|
472
|
+
return self._value_
|
|
473
|
+
|
|
474
|
+
@value.setter
|
|
475
|
+
def value(self, value):
|
|
476
|
+
if isinstance(value, str): # Single string
|
|
477
|
+
value = [value]
|
|
478
|
+
if not isinstance(value, list):
|
|
479
|
+
val, msg = self._cast_to_string_list_(value)
|
|
480
|
+
value = val
|
|
481
|
+
if (msg != 'ok'):
|
|
482
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
483
|
+
return
|
|
484
|
+
# Is a list
|
|
485
|
+
for el in value:
|
|
486
|
+
el = str(el)
|
|
487
|
+
self._value_ = value
|
|
488
|
+
|
|
489
|
+
self._external_ = []
|
|
490
|
+
for el in self.value:
|
|
491
|
+
if "->" in el:
|
|
492
|
+
self._external_.append(True)
|
|
493
|
+
else:
|
|
494
|
+
self._external_.append(False)
|
|
495
|
+
|
|
496
|
+
@property
|
|
497
|
+
def external(self):
|
|
498
|
+
return self._external_
|
|
499
|
+
|
|
500
|
+
@property
|
|
501
|
+
def allowed_types(self):
|
|
502
|
+
return self._allowed_types_
|
|
503
|
+
|
|
504
|
+
@property
|
|
505
|
+
def component(self):
|
|
506
|
+
components = []
|
|
507
|
+
for i, element in enumerate(self.value):
|
|
508
|
+
if self.external[i]:
|
|
509
|
+
splits = element.split("->")
|
|
510
|
+
proj = self.parent.project()._sim_.project(splits[0])
|
|
511
|
+
if proj is None:
|
|
512
|
+
components.append(None)
|
|
513
|
+
else:
|
|
514
|
+
components.append(proj.component(splits[1]))
|
|
515
|
+
else:
|
|
516
|
+
components.append(self.parent.project().component(element))
|
|
517
|
+
return components
|
|
518
|
+
|
|
519
|
+
def check(self):
|
|
520
|
+
errors = []
|
|
521
|
+
comps = self.component
|
|
522
|
+
for i in range(len(comps)):
|
|
523
|
+
if len(self.allowed_types) > 0 and self.value[i] != "not_defined":
|
|
524
|
+
if type(comps[i]).__name__ not in self.allowed_types:
|
|
525
|
+
msg = self._get_error_header_()+f"{self.value[i]} component is not of one of the allowed types."
|
|
526
|
+
errors.append(Message(msg,"ERROR"))
|
|
527
|
+
if comps[i] is None and self.value[i] != "not_defined":
|
|
528
|
+
msg = self._get_error_header_() + f"{self.value[i]} component not found."
|
|
529
|
+
errors.append(Message(msg,"ERROR"))
|
|
530
|
+
return errors
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
# _____________ Parameter_variable ___________________________
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
class Parameter_variable(Parameter):
|
|
537
|
+
def __init__(self, key, value="not_defined = component.variable"):
|
|
538
|
+
Parameter.__init__(self, key, value)
|
|
539
|
+
self.value = value
|
|
540
|
+
|
|
541
|
+
@property
|
|
542
|
+
def value(self):
|
|
543
|
+
return self._value_
|
|
544
|
+
|
|
545
|
+
@value.setter
|
|
546
|
+
def value(self, value):
|
|
547
|
+
format_error = False
|
|
548
|
+
self._value_ = str(value)
|
|
549
|
+
if "=" in self._value_:
|
|
550
|
+
splits = self._value_.split("=")
|
|
551
|
+
self._symbol_ = splits[0].strip()
|
|
552
|
+
if "." in splits[1]:
|
|
553
|
+
splits2 = splits[1].split(".")
|
|
554
|
+
self._component_ = splits2[0].strip()
|
|
555
|
+
self._variable_ = splits2[1].strip()
|
|
556
|
+
else:
|
|
557
|
+
format_error = True
|
|
558
|
+
else:
|
|
559
|
+
format_error = True
|
|
560
|
+
|
|
561
|
+
if "->" in self._component_:
|
|
562
|
+
self._external_ = True
|
|
563
|
+
else:
|
|
564
|
+
self._external_ = False
|
|
565
|
+
|
|
566
|
+
if format_error:
|
|
567
|
+
msg = 'Incorrect format. Expected format "symbol = component.variable"'
|
|
568
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
569
|
+
|
|
570
|
+
@property
|
|
571
|
+
def external(self):
|
|
572
|
+
return self._external_
|
|
573
|
+
|
|
574
|
+
@property
|
|
575
|
+
def symbol(self):
|
|
576
|
+
return self._symbol_
|
|
577
|
+
|
|
578
|
+
@property
|
|
579
|
+
def variable(self):
|
|
580
|
+
try:
|
|
581
|
+
if self.external:
|
|
582
|
+
splits = self._component_.split("->")
|
|
583
|
+
proj = self.parent.project()._sim_.project(
|
|
584
|
+
splits[0].strip())
|
|
585
|
+
var = proj.component(
|
|
586
|
+
splits[1].strip()).variable(self._variable_)
|
|
587
|
+
else:
|
|
588
|
+
var = self.parent.project().component(self._component_).variable(self._variable_)
|
|
589
|
+
except Exception as error:
|
|
590
|
+
var = None
|
|
591
|
+
|
|
592
|
+
return var
|
|
593
|
+
|
|
594
|
+
def check(self):
|
|
595
|
+
errors = []
|
|
596
|
+
var = self.variable
|
|
597
|
+
if var is None and self._symbol_ != "not_defined":
|
|
598
|
+
msg = self._get_error_header_() + f"{self.value} component or variable not found."
|
|
599
|
+
errors.append(Message(msg,"ERROR"))
|
|
600
|
+
return errors
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
class Parameter_variable_list(Parameter):
|
|
604
|
+
def __init__(self, key, value=["not_defined = component.variable"]):
|
|
605
|
+
Parameter.__init__(self, key, value)
|
|
606
|
+
self.value = value
|
|
607
|
+
|
|
608
|
+
@property
|
|
609
|
+
def value(self):
|
|
610
|
+
return self._value_
|
|
611
|
+
|
|
612
|
+
@value.setter
|
|
613
|
+
def value(self, value):
|
|
614
|
+
if isinstance(value, str): # Single string
|
|
615
|
+
value = [value]
|
|
616
|
+
if not isinstance(value, list):
|
|
617
|
+
val, msg = self._cast_to_string_list_(value)
|
|
618
|
+
value = val
|
|
619
|
+
if (msg != 'ok'):
|
|
620
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
621
|
+
return
|
|
622
|
+
# Is a list
|
|
623
|
+
for el in value:
|
|
624
|
+
el = str(el)
|
|
625
|
+
self._value_ = value
|
|
626
|
+
|
|
627
|
+
format_error = False
|
|
628
|
+
self._symbol_ = []
|
|
629
|
+
self._component_ = []
|
|
630
|
+
self._variable_ = []
|
|
631
|
+
self._external_ = []
|
|
632
|
+
for element in self._value_:
|
|
633
|
+
if "=" in element:
|
|
634
|
+
splits = element.split("=")
|
|
635
|
+
self._symbol_.append(splits[0].strip())
|
|
636
|
+
if "." in splits[1]:
|
|
637
|
+
splits2 = splits[1].split(".")
|
|
638
|
+
self._component_.append(splits2[0].strip())
|
|
639
|
+
self._variable_.append(splits2[1].strip())
|
|
640
|
+
else:
|
|
641
|
+
format_error = True
|
|
642
|
+
else:
|
|
643
|
+
format_error = True
|
|
644
|
+
if "->" in element:
|
|
645
|
+
self._external_.append(True)
|
|
646
|
+
else:
|
|
647
|
+
self._external_.append(False)
|
|
648
|
+
|
|
649
|
+
if format_error:
|
|
650
|
+
msg = 'Incorrect format. Expected format "symbol = component.variable"'
|
|
651
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
652
|
+
|
|
653
|
+
@property
|
|
654
|
+
def external(self):
|
|
655
|
+
return self._external_
|
|
656
|
+
|
|
657
|
+
@property
|
|
658
|
+
def symbol(self):
|
|
659
|
+
return self._symbol_
|
|
660
|
+
|
|
661
|
+
@property
|
|
662
|
+
def variable(self):
|
|
663
|
+
variables = []
|
|
664
|
+
for i in range(len(self._value_)):
|
|
665
|
+
try:
|
|
666
|
+
if self.external[i]:
|
|
667
|
+
splits = self._component_[i].split("->")
|
|
668
|
+
proj = self.parent.project()._sim_.project(
|
|
669
|
+
splits[0].strip())
|
|
670
|
+
variables.append(proj.component(
|
|
671
|
+
splits[1].strip()).variable(self._variable_[i]))
|
|
672
|
+
else:
|
|
673
|
+
variables.append(self.parent.project().component(
|
|
674
|
+
self._component_[i]).variable(self._variable_[i]))
|
|
675
|
+
except Exception as error:
|
|
676
|
+
variables.append(None)
|
|
677
|
+
|
|
678
|
+
return variables
|
|
679
|
+
|
|
680
|
+
def check(self):
|
|
681
|
+
errors = []
|
|
682
|
+
for i in range(len(self._value_)):
|
|
683
|
+
var = self.variable[i]
|
|
684
|
+
if var is None and self.symbol[i] != "not_defined":
|
|
685
|
+
msg = self._get_error_header_() + f"{self.value} component or variable not found."
|
|
686
|
+
errors.append(Message(msg,"ERROR"))
|
|
687
|
+
return errors
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
# _____________ Parameter_math_exp ___________________________
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
class Parameter_math_exp(Parameter):
|
|
694
|
+
def __init__(self, key, value="0.0", unit=""):
|
|
695
|
+
Parameter.__init__(self, key, value)
|
|
696
|
+
self._unit_ = unit
|
|
697
|
+
#self._parser_ = Parser()
|
|
698
|
+
|
|
699
|
+
@property
|
|
700
|
+
def unit(self):
|
|
701
|
+
return self._unit_
|
|
702
|
+
|
|
703
|
+
@property
|
|
704
|
+
def value(self):
|
|
705
|
+
return self._value_
|
|
706
|
+
|
|
707
|
+
@value.setter
|
|
708
|
+
def value(self, value):
|
|
709
|
+
self._value_ = str(value)
|
|
710
|
+
|
|
711
|
+
def evaluate(self, values_dic):
|
|
712
|
+
try:
|
|
713
|
+
val = eval(self.value,globals(),values_dic)
|
|
714
|
+
return val
|
|
715
|
+
except Exception as error:
|
|
716
|
+
self._sim_.message(Message(self._get_error_header_()+str(error),"ERROR"))
|
|
717
|
+
return 0
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
class Parameter_math_exp_list(Parameter):
|
|
721
|
+
def __init__(self, key, value=["0.0"], unit=""):
|
|
722
|
+
Parameter.__init__(self, key, value)
|
|
723
|
+
self._unit_ = unit
|
|
724
|
+
#self._parser_ = Parser()
|
|
725
|
+
|
|
726
|
+
@property
|
|
727
|
+
def unit(self):
|
|
728
|
+
return self._unit_
|
|
729
|
+
|
|
730
|
+
@property
|
|
731
|
+
def value(self):
|
|
732
|
+
return self._value_
|
|
733
|
+
|
|
734
|
+
@value.setter
|
|
735
|
+
def value(self, value):
|
|
736
|
+
if isinstance(value, str): # Single string
|
|
737
|
+
value = [value]
|
|
738
|
+
if not isinstance(value, list):
|
|
739
|
+
val, msg = self._cast_to_string_list_(value)
|
|
740
|
+
value = val
|
|
741
|
+
if (msg != 'ok'):
|
|
742
|
+
self._sim_.message(Message(self._get_error_header_()+msg,"ERROR"))
|
|
743
|
+
return
|
|
744
|
+
# Is a list
|
|
745
|
+
for el in value:
|
|
746
|
+
el = str(el)
|
|
747
|
+
self._value_ = value
|
|
748
|
+
|
|
749
|
+
def evaluate(self, i, values_dic):
|
|
750
|
+
try:
|
|
751
|
+
val = eval(self.value[i],globals(),values_dic)
|
|
752
|
+
return val
|
|
753
|
+
except Exception as error:
|
|
754
|
+
self._sim_.message(Message(self._get_error_header_()+str(error),"ERROR"))
|
|
755
|
+
return 0
|