Correction d'une faute d'orthographe
[memoirecycle.git] / project.py
blob0f74128e598425c23d26c6e330abbeb7f4cf5739
1 import wx
2 import GUI3
3 import notif
4 import minigui
5 import element
6 import os # NEW
7 import logging
8 import collections
9 import fluid
11 logger = logging.getLogger()
13 class MyApp(wx.App,object):
14 ''' Application that contains all object specific to our programm '''
15 def OnInit(self):
16 self.__name = 'UCycLe'
17 self.__project = Project(self)
18 self.__hasRefprop = True
19 self.__fluidList = {'':fluid.Fluid(self.__project,''),'XSteam Water':fluid.FluidXSteam(self.__project,'XSteam Water')}
20 self.getRefpropFluid()
21 self.__fluidListName = self.__fluidList.keys()
22 self.__fluidListName.sort()
24 self.id2type = {}
25 self.type2id = {}
26 for i in element.allElem:
27 self.id2type[i[0]]=i[1]
28 self.type2id[i[1]]=i[0]
30 self.__gui = GUI3.MyFrame(self)
31 self.__gui.Show()
32 self.Bind(wx.EVT_IDLE, self.OnIdle)
33 return True
35 @property
36 def name(self):
37 return self.__name
39 @property
40 def fluidList(self):
41 return self.__fluidList
43 @property
44 def fluidListName(self):
45 return self.__fluidListName
47 @property
48 def gui(self):
49 return self.__gui
51 @property
52 def project(self):
53 return self.__project
55 def OnIdle(self,event):
56 ''' Event that occur when process is not busy'''
57 if self.project.todoList != set() :
58 a = self.project.todoList.pop()
59 a.update()
60 self.project.doNotify()
62 def getRefpropFluid(self, refpropPath = 'REFPROP/fluids'):
63 if self.__hasRefprop == True:
64 List = os.listdir(refpropPath)
65 List.sort()
66 fluidList = {}
67 for x in List:
68 if x.endswith('.PPF'):continue
69 if x.endswith('.BNC'):continue
70 fluidList[str(x).replace('.FLD','')]= fluid.FluidREFPROP(self.__project,str(x).replace('.FLD',''))
71 self.__fluidList.update(fluidList)
73 def loadRefFluid(self,name):
74 for x in self.__fluidList:
75 if name == x :
76 return self.__fluidList[x]
78 class Project(notif.Notifier):
79 '''Project contains all element specific to a cycle'''
80 def __init__(self, app):
81 notif.Notifier.__init__(self)
82 self.__app = app
83 self.__elemList = {} # [name : elem]
84 self.__nameList = {} # [elem : name]
85 self.__currentElem = None
86 self.todoList = set() # dans la todoList, il y a des property.wantNotif = ELEMENT (= des set)
87 self.__saveVersion = 'UCycLe saveVersion 1.1'
88 self.__saveName = 'Untitled'
89 self.__dirName = ''
91 @property
92 def saveName(self):
93 return self.__saveName
95 @property
96 def dirName(self):
97 return self.__dirName
98 @property
99 def saveVersion(self):
100 return self.__saveVersion
102 @property
103 def app(self):
104 return self.__app
106 @property
107 def elemList(self):
108 return self.__elemList
110 @property
111 def nameList(self):
112 return self.__nameList
114 @property
115 def currentElem(self):
116 return self.__currentElem
118 @currentElem.setter
119 def currentElem(self,elem):
120 self.__currentElem = elem
122 @saveName.setter
123 def saveName(self, name):
124 self.__saveName = str(name)
126 @dirName.setter
127 def dirName(self, name):
128 self.__dirName = str(name)
130 def createElem(self, kind, pos):
131 # DOC : kind = element.Transfo for example
132 assert kind in self.app.type2id
133 assert type(pos) == tuple
134 elem = kind(self,pos)
135 name = elem.generateName()
136 self.__elemList[name]=elem
137 self.__nameList[elem]=name
138 self.doNotify()
139 return elem
141 def removeElem(self, name):
142 if self.__currentElem == self.__elemList[name]:
143 self.__currentElem = None
144 self.__elemList[name].detachFromAll()
145 del self.__nameList[self.__elemList[name]]
146 del self.__elemList[name]
147 self.doNotify()
149 def removeSelectedElem(self):
150 #Delete all selected object
151 tempList = dict(self.__elemList)
152 for z in tempList:
153 if tempList[z].selected == True :
154 self.removeElem(z)
156 def clear(self):
157 # empty the project
158 for x in self.__nameList:
159 x.detachFromAll()
160 x.clear()
161 self.__elemList={}
162 self.__nameList={}
163 self.__currentElem = None
164 self.doNotify()
166 def isZoneClick(self,point):
167 ''' method that check if point is inside an element '''
168 for z in self.__nameList:
169 clickedElem = z.clicked(point)
170 if clickedElem != None:
171 return clickedElem
173 def saveProject(self, fname, dirName):
174 if not fname.endswith('.cyc') :
175 fname = fname+'.cyc'
176 self.__saveName = fname
177 fname = str(fname)
178 f = open(os.path.join(dirName,fname),'w') # 'w' = overwrite
179 # v: -> version
180 f.write('v:'+self.saveVersion +'\n')
182 # s: -> Project name
183 f.write('s:'+self.saveName +'\n')
185 # n: -> total number of element
186 f.write('n:'+str(len(self.elemList))+'\n')
188 for x in self.elemList:
190 # e: -> name in nameList / genericName / (x,y)
191 f.write('e:'+x+'/'+str(self.elemList[x].genericName())+'/'+str(self.elemList[x].pos[0])+'/'+str(self.elemList[x].pos[1])+'\n')
192 for p in self.elemList[x].properties:
193 if self.elemList[x].properties[p].isImposed :
195 # p: -> elem name / prop label / prop value
196 if p != 'fluid':
197 f.write('p:'+ x+ '/' + \
198 str(self.elemList[x].properties[p].label) +'/'+ \
199 str(self.elemList[x].properties[p].value)+'\n')
200 else: #for fluid we save name of the fluid
201 f.write('p:'+ x+ '/' + \
202 str(self.elemList[x].properties[p].label) +'/'+ \
203 str(self.elemList[x].properties[p].value.name)+'\n')
205 for x in self.elemList:
206 for c in self.elemList[x].connection:
208 # c: -> name1 in nameList / conn1 name / name2 in nameList / conn2 name if connected
209 # c: -> name1 in nameList / conn1 name / None if not connected
210 f.write('c:'+str(x)+'/')
211 f.write(c +'/')
212 if self.elemList[x].connection[c].link == None:
213 f.write('None'+'\n')
214 else:
215 connElem = self.elemList[x].connection[c].link.elem
216 a = self.nameList[connElem]
217 f.write(str(a)+'/')
218 for conn in connElem.connection:
219 if connElem.connection[conn].link != None:
220 if connElem.connection[conn].link.elem == self.elemList[x]:
221 l = conn
222 f.write(str(l)+'\n')
223 f.close() # DO NOT FORGET
224 logger.info('Save project as %s',fname)
227 def openProject(self, fname, dirname):
228 assert fname.endswith('.cyc')
229 logger.info('Start loading project : %s',fname)
230 reminderDict = {} # former elemList name [str] : ...
231 f=open(dirname+'/'+fname, 'r') # 'r' = read only
232 assert f.readline().rstrip() == 'v:'+self.saveVersion.rstrip()
233 while 1:
234 line=f.readline().rstrip()
235 if not line:
236 break
237 else:
238 z =line[0]+line[1]
239 data = line.split(z)[1]
240 if z == 'v:':
241 assert data == self.saveVersion.rstrip()
242 elif z == 'n:':
243 self.saveName = data
244 elif z == 's':
245 pass
246 elif z == 'e:':
247 (elem, genericName, posX, posY) = data.split('/')
248 a = self.createElem(self.app.id2type[genericName], (float(posX), float(posY)))
249 reminderDict[elem] = self.nameList[a]
250 elif z == 'p:':
251 (elem, label, value) = data.split('/')
252 value = data.split(label)[1].lstrip('/')
253 if label != 'fluid':
254 self.elemList[reminderDict[elem]].properties[label].impose(value)
255 else:
256 fluidLoaded = self.__app.loadRefFluid(value)
257 self.elemList[reminderDict[elem]].properties[label].impose(fluidLoaded)
258 elif z == 'c:':
259 tup = data.split('/')
260 if len(tup) == 3:
261 pass
262 if len(tup) ==4:
263 (elem1, conn1, elem2, conn2)=data.split('/')
264 self.elemList[reminderDict[elem1]].connect(self.elemList[reminderDict[elem1]].connection[conn1], self.elemList[reminderDict[elem2]].connection[conn2])
265 f.close() # ATTENTION pas oublier
266 logger.info('Loading project completed')
268 def newProject(self): ###
269 self.clear()
270 self.saveName = 'Untitled'
271 self.doNotify()
272 logger.info('New project')
274 def numState(self):
275 #returns the number of state present in project
276 numberState = 0
277 for x in self.__nameList:
278 if x.genericName() == 'state':
279 numberState +=1
280 return numberState
282 def exportData(self):
283 #fname = self.__saveName.rstrip('.cyc')+str('.txt')
284 fname = 'data.txt'
285 f = open(os.path.join(self.__dirName,fname),'w')
286 for x in self.elemList:
287 name = self.elemList[x].properties['name'].value
288 line = str()
289 for xi in range(len(name)+2):
290 line += '-'
291 f.write(line+'\n')
292 f.write('-'+name+'-'+'\n')
293 f.write(line+'\n')
294 sortedPropList = GUI3.sortBykey(self.elemList[x].properties)
295 for p in sortedPropList:
296 if self.elemList[x].properties[p].value != None:
297 if p == 'fluid':
298 f.write(self.elemList[x].properties[p].label+':'+self.elemList[x].properties[p].value.name+'\n')
299 elif p == 'name':
300 pass
301 else :
302 value = str('%0.3f'%float(self.elemList[x].properties[p].value))
303 f.write(self.elemList[x].properties[p].label+':'+str(value)+'\n')
304 f.close()
305 logger.info('Print done')
309 if __name__ == '__main__':
310 myApp = MyApp()
311 myApp.MainLoop()