Correction d'une faute d'orthographe
[memoirecycle.git] / prop.py
blob85ac4a3693635a70898620e0b6f749a96d589cc3
1 import notif
2 import wx.propgrid
3 import logging
4 import fluid
5 import math
6 import equa
8 logger = logging.getLogger()
10 def qualityKind(prop):
11 #Check if the fluid is subcooled,superheated or supercritic, and return it
12 for x in prop.project.elemList:
13 if x[:5] == 'state':
14 for y in prop.project.elemList[x].properties:
15 if prop == prop.project.elemList[x].properties[y]:
16 elem = prop.project.elemList[x]
17 fluid = elem.properties['fluid'].value
18 temperature = elem.properties['temperature'].value
19 pressure = elem.properties['pressure'].value
20 tcrit = fluid.Tcrit()
21 tsat = fluid.Tsat_p(pressure)
22 if temperature < tcrit:
23 if temperature < tsat :
24 return 'subcooled'
25 elif temperature > tsat :
26 return 'superheated'
27 else:
28 return 'supercritic'
32 class Property(notif.Notifier):
33 ''' Property has a value and a label. Element contains Property in its properties dictionnary.'''
34 def __init__(self,project,label,value = None):
35 notif.Notifier.__init__(self)
36 self._isImposed = False
37 self._isTell = False
38 self._label = label
39 self._labelKey = None
40 self._theyDependOnMe = set()
41 self._value = value
42 self._wantNotif = set() #Take element which want to be notify when these property change, and wich have an update() method
43 self.__project = project
45 @property
46 def isImposed(self):
47 return self._isImposed
49 @isImposed.setter
50 def isImposed(self, val):
51 self._isImposed = val
53 @property
54 def isTell(self):
55 return self._isTell
56 @property
57 def label(self):
58 return self._label
59 @property
60 def labelKey(self):
61 return self._labelKey
63 @labelKey.setter
64 def labelKey(self, val):
65 self._labelKey = val
67 @property
68 def project(self):
69 return self.__project
70 @property
71 def value(self):
72 return self._value
73 @value.setter
74 def value(self,val):
75 self._value = val
76 @property
77 def wantNotif(self):
78 return self._wantNotif
80 def relax(self):
81 pass
83 def colour(self):
84 if self._isImposed == True:
85 return 'BLUE'
86 elif self._isTell == True:
87 return 'GREEN'
88 else:
89 return 'BLACK'
91 class Variable(Property):
92 ''' Variable are Property that can be tell (only)'''
93 def __init__(self,project,label,value=None):
94 Property.__init__(self,project,label,value)
95 self._iDependOnThem = set()
97 def addDependence(self, on):
98 self._iDependOnThem |= on
99 for x in on :
100 x._theyDependOnMe.add(self)
102 def clearDependence(self):
103 for x in self._iDependOnThem:
104 assert self in x._theyDependOnMe
105 x._theyDependOnMe.remove(self)#Remove from the dependance so nobody else depend on me
106 self._iDependOnThem.clear() # Clear my dependance so I depend on nobody
108 def relax(self):
109 """ Empty the value and do notification"""
110 ''' You have to check if it's not impose '''
111 if self._isImposed:
112 return True
113 self._value = None
114 self._isTell = False
115 theydependedOnMe=self._theyDependOnMe.copy()
116 self.clearDependence() # first
117 for x in theydependedOnMe: # second : order important
118 x.relax()
119 assert self._iDependOnThem == set()
120 assert self._theyDependOnMe == set()
121 self.project.todoList |= self.wantNotif
124 def impose(self, val):
125 ''' Impose a value and do notification '''
126 assert val!=None
127 assert self._isTell == False
128 self._isImposed = False
129 self.relax()
130 if val == '': # relax
131 self._isImposed = False
132 self.relax() #force the value out
133 logger.info('relax %s',self.label)
134 elif val == u'NaN':
135 self._isImposed = True
136 self._value = float('NaN')
137 logger.info('impose %s with a value of %s',self.label,self._value)
138 else:
139 self._isImposed = True
140 self._value = val
141 logger.info('impose %s with a value of %s',self.label,self._value)
142 self.project.doNotify()
144 def tell(self, val, becauseOf):
145 ''' Property can tell another property. It spreads the value troughout the cycle.
146 Creates dependance and notification '''
147 if val == None:
148 return True
149 if val == self._value:
150 if not self._isImposed:
151 self.addDependence(becauseOf)
152 pass
153 else:
154 assert self._iDependOnThem == set()
155 return True
156 elif self._value == None :
157 assert self._iDependOnThem == set()
158 assert self._theyDependOnMe == set()
159 self.relax() #Just for notifications
160 self._value=val
161 self.addDependence(becauseOf)
162 self._isTell = True
163 if type(self) != FluidProperty:
164 logger.info('tell %s with a value of %s',self.label,val)
165 else:
166 logger.info('tell %s with a value of %s',self.label,val.name)
167 return True
168 else:
169 logger.info('tell %s with a value of %s \n but already have %s',self.label,val,self._value)
170 return False # Property was told or impose and someone try to impose another value
172 class FloatVariableProperty(Variable):
173 ''' Variable who's value is a float'''
174 def __init__(self,project,label,value=None):
175 Variable.__init__(self,project,label,value)
176 self._display = None
178 @property
179 def value(self):
180 if self._value != None:
181 return float(self._value)
182 else:
183 return None
184 @property
185 def display(self):
186 if self._value == None :
187 self._display = wx.propgrid.StringProperty(self.label)
188 return self._display
189 else:
190 self._display = wx.propgrid.StringProperty(self.label,value = str('%0.2f'%float(self._value)))
191 return self._display
193 class StringVariableProperty(Variable):
194 ''' Variable who's value is a string'''
195 def __init__(self,project,label,value=None):
196 Variable.__init__(self,project,label,value)
197 self._display = None
199 @property
200 def display(self):
201 if self._value == None :
202 self._display = wx.propgrid.StringProperty(self.label)
203 return self._display
204 else:
205 self._display = wx.propgrid.StringProperty(self.label,value = str(self._value))
206 return self._display
209 class FixedProperty(Property):
210 ''' Properties that can not be tell by the programm '''
211 def __init__(self,project,label):
212 Property.__init__(self,project,label)
214 def impose(self, val):
215 self.isImposed = True
216 self.value = val
217 self.project.doNotify()
220 class FloatFixedProperty(FixedProperty):
221 ''' Float properties that can not be tell '''
222 def __init__(self,project,label):
223 FixedProperty.__init__(self,project,label)
224 self._display = None
225 @property
226 def value(self):
227 if self._value != None:
228 return float(self._value)
229 else:
230 return None
231 @property
232 def display(self):
233 if self._value == None :
234 self._display = wx.propgrid.StringProperty(self.label)
235 return self._display
236 else:
237 self._display = wx.propgrid.StringProperty(self.label,value = str(self._value))
238 return self._display
241 class StringFixedProperty(FixedProperty):
242 ''' String properties that can not be tell'''
243 def __init__(self,project,label):
244 FixedProperty.__init__(self,project,label)
245 self._display = None
246 @property
247 def value(self):
248 if self._value != None:
249 return str(self._value)
250 else:
251 return None
252 @value.setter
253 def value(self,val):
254 self._value = val
256 @property
257 def display(self):
258 if self._value == None :
259 self._display = wx.propgrid.StringProperty(self.label)
260 return self._display
261 else:
262 self._display = wx.propgrid.StringProperty(self.label,value = str(self._value))
263 return self._display
266 class TellProperty(Variable):
267 ''' All the properties that only can be tell but can't be imposed'''
268 def __init__(self,project,label,value = None):
269 Variable.__init__(self,project,label,value)
271 def impose(self, val):
272 return False
274 class FloatTellProperty(TellProperty):
275 ''' Float properties that can be tell '''
276 def __init__(self,project,label,value=None):
277 TellProperty.__init__(self,project,label,value)
278 self._display = None
280 @property
281 def display(self):
282 if self._value == None :
283 self._display = wx.propgrid.StringProperty(self.label)
284 return self._display
285 else:
286 self._display = wx.propgrid.StringProperty(self.label,value = str('%0.5f'%float(self._value)))
287 return self._display
290 class BoolProperty(Variable):
291 ''' Boolean properties '''
292 def __init__(self,project,label,value=None):
293 Variable.__init__(self,project,label,value)
294 self._value = None
295 self._display = None
296 @property
297 def value(self):
298 return self._value
299 @value.setter
300 def value(self,val):
301 self._value = val
303 @property
304 def display(self):
305 if self._value != None :
306 return wx.propgrid.BoolProperty(self.label,value = self.value)
307 else:
308 return wx.propgrid.BoolProperty(self.label)
311 class FluidProperty(Variable):
312 ''' Fluid properties '''
313 def __init__(self,project,label,value=None):
314 Variable.__init__(self,project,label,value=fluid.Fluid(project,''))
315 self._display = None
316 @property
317 def value(self):
318 return self._value
320 @property
321 def display(self):
322 arrayId = range(len(self.project.app.fluidList))
323 fluidname = self.value.name
324 num = self.project.app.fluidListName.index(fluidname)
325 return wx.propgrid.EnumProperty('fluid','fluid',self.project.app.fluidListName,arrayId,num)
327 def relax(self):
328 if self._isImposed:
329 return True
330 self._value = self.project.app.fluidList['']
331 self._isTell = False
332 theydependedOnMe=self._theyDependOnMe.copy()
333 self.clearDependence() # first
334 for x in theydependedOnMe: # second : order important
335 x.relax()
336 assert self._iDependOnThem == set()
337 assert self._theyDependOnMe == set()
338 self.project.todoList |= self.wantNotif
341 def impose(self, val):
342 assert val!=None
343 assert self._isTell == False
344 self.relax()
345 if type(val) == fluid.Fluid: # relax
346 self._value = val
347 self._isImposed = False
348 self.relax()
349 logger.info('relax %s',self.label)
350 else:
351 self._isImposed = False
352 self.relax()
353 self._isImposed = True
354 self._value = val
355 logger.info('impose %s with a value of %s',self.label,self._value.name)
356 self.project.doNotify()
358 def tell(self, val, becauseOf):
359 if val == None :
360 return True
361 if val == self._value:
362 if not self._isImposed:
363 self.addDependence(becauseOf)
364 pass
365 else:
366 assert self._iDependOnThem == set()
367 return True
368 elif type(self._value) == fluid.Fluid:
369 assert self._iDependOnThem == set()
370 assert self._theyDependOnMe == set()
371 self.relax() #Just for notifications
372 self._value=val
373 self.addDependence(becauseOf)
374 self._isTell = True
375 logger.info('tell %s with a value of %s',self.label,val.name)
376 return True
377 else:
378 logger.info('tell %s with a value of %s \n but already have %s',self.label,val.name,self._value.name)
379 return False # Property was told or impose and someone try to impose another value
383 class QualityProperty(Variable):
384 ''' Quality properties '''
385 def __init__(self,project,label,value = None):
386 Variable.__init__(self,project,label,value)
387 self._display = None
388 @property
389 def value(self):
390 if self._value != None:
391 return float(self._value)
392 else:
393 return None
395 @property
396 def display(self):
397 if self._value == None :
398 self._display = wx.propgrid.StringProperty(self.label)
399 elif not math.isnan(float(self._value)):
400 self._display = wx.propgrid.StringProperty(self.label,value = str(self._value))
401 elif math.isnan(float(self._value)):
402 labelVal = qualityKind(self)
403 self._display = wx.propgrid.StringProperty(self.label,value = labelVal)
404 return self._display
407 def tell(self, val, becauseOf):
408 ''' Property can tell another property. It spreads the value troughout the cycle.
409 Creates dependance and notification '''
410 if val == None:
411 return True
412 if val == self._value:
413 if not self._isImposed:
414 self.addDependence(becauseOf)
415 pass
416 else:
417 assert self._iDependOnThem == set()
418 return True
419 elif self._value == None :
420 assert self._iDependOnThem == set()
421 assert self._theyDependOnMe == set()
422 self.relax() #Just for notifications
423 self._value=val
424 self.addDependence(becauseOf)
425 self._isTell = True
426 logger.info('tell %s with a value of %s',self.label,val)
427 return True
428 elif val != None and self._value != None:
429 if math.isnan(float(val)) and math.isnan(float(self._value)):
430 if not self._isImposed:
431 self.addDependence(becauseOf)
432 pass
433 else:
434 assert self._iDependOnThem == set()
435 return True
436 else:
437 logger.info('tell %s with a value of %s \n but already have %s',self.label,val,self._value)
438 return False # Property was told or impose and someone try to impose another value