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.
Files changed (44) hide show
  1. opensimula/Child.py +19 -0
  2. opensimula/Component.py +214 -0
  3. opensimula/Iterative_process.py +47 -0
  4. opensimula/Message.py +19 -0
  5. opensimula/Parameter_container.py +80 -0
  6. opensimula/Parameters.py +755 -0
  7. opensimula/Project.py +674 -0
  8. opensimula/Simulation.py +212 -0
  9. opensimula/Variable.py +37 -0
  10. opensimula/__init__.py +8 -0
  11. opensimula/components/Building.py +511 -0
  12. opensimula/components/Building_surface.py +318 -0
  13. opensimula/components/Calculator.py +51 -0
  14. opensimula/components/Construction.py +309 -0
  15. opensimula/components/Day_schedule.py +64 -0
  16. opensimula/components/File_data.py +117 -0
  17. opensimula/components/File_met.py +1035 -0
  18. opensimula/components/Frame.py +35 -0
  19. opensimula/components/Glazing.py +122 -0
  20. opensimula/components/HVAC_DX_equipment.py +210 -0
  21. opensimula/components/HVAC_DX_system.py +254 -0
  22. opensimula/components/HVAC_MZW_system.py +554 -0
  23. opensimula/components/HVAC_SZW_system.py +338 -0
  24. opensimula/components/HVAC_coil_equipment.py +206 -0
  25. opensimula/components/HVAC_fan_equipment.py +44 -0
  26. opensimula/components/HVAC_perfect_system.py +137 -0
  27. opensimula/components/Material.py +14 -0
  28. opensimula/components/Opening.py +409 -0
  29. opensimula/components/Opening_type.py +90 -0
  30. opensimula/components/Solar_surface.py +114 -0
  31. opensimula/components/Space.py +388 -0
  32. opensimula/components/Space_type.py +81 -0
  33. opensimula/components/Surface.py +129 -0
  34. opensimula/components/Test_component.py +76 -0
  35. opensimula/components/Week_schedule.py +30 -0
  36. opensimula/components/Year_schedule.py +65 -0
  37. opensimula/components/__init__.py +40 -0
  38. opensimula/visual_3D/Environment_3D.py +257 -0
  39. opensimula/visual_3D/Polygon_3D.py +262 -0
  40. opensimula-0.5.1.dist-info/METADATA +49 -0
  41. opensimula-0.5.1.dist-info/RECORD +44 -0
  42. opensimula-0.5.1.dist-info/WHEEL +5 -0
  43. opensimula-0.5.1.dist-info/licenses/LICENSE +21 -0
  44. opensimula-0.5.1.dist-info/top_level.txt +1 -0
@@ -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