11 logger
= logging
.getLogger()
13 class MyApp(wx
.App
,object):
14 ''' Application that contains all object specific to our programm '''
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()
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
)
32 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
41 return self
.__fluidList
44 def fluidListName(self
):
45 return self
.__fluidListName
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()
60 self
.project
.doNotify()
62 def getRefpropFluid(self
, refpropPath
= 'REFPROP/fluids'):
63 if self
.__hasRefprop
== True:
64 List
= os
.listdir(refpropPath
)
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
:
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
)
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'
93 return self
.__saveName
99 def saveVersion(self
):
100 return self
.__saveVersion
108 return self
.__elemList
112 return self
.__nameList
115 def currentElem(self
):
116 return self
.__currentElem
119 def currentElem(self
,elem
):
120 self
.__currentElem
= elem
123 def saveName(self
, name
):
124 self
.__saveName
= str(name
)
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
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
]
149 def removeSelectedElem(self
):
150 #Delete all selected object
151 tempList
= dict(self
.__elemList
)
153 if tempList
[z
].selected
== True :
158 for x
in self
.__nameList
:
163 self
.__currentElem
= None
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:
173 def saveProject(self
, fname
, dirName
):
174 if not fname
.endswith('.cyc') :
176 self
.__saveName
= fname
178 f
= open(os
.path
.join(dirName
,fname
),'w') # 'w' = overwrite
180 f
.write('v:'+self
.saveVersion
+'\n')
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
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
)+'/')
212 if self
.elemList
[x
].connection
[c
].link
== None:
215 connElem
= self
.elemList
[x
].connection
[c
].link
.elem
216 a
= self
.nameList
[connElem
]
218 for conn
in connElem
.connection
:
219 if connElem
.connection
[conn
].link
!= None:
220 if connElem
.connection
[conn
].link
.elem
== self
.elemList
[x
]:
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()
234 line
=f
.readline().rstrip()
239 data
= line
.split(z
)[1]
241 assert data
== self
.saveVersion
.rstrip()
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
]
251 (elem
, label
, value
) = data
.split('/')
252 value
= data
.split(label
)[1].lstrip('/')
254 self
.elemList
[reminderDict
[elem
]].properties
[label
].impose(value
)
256 fluidLoaded
= self
.__app
.loadRefFluid(value
)
257 self
.elemList
[reminderDict
[elem
]].properties
[label
].impose(fluidLoaded
)
259 tup
= data
.split('/')
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
): ###
270 self
.saveName
= 'Untitled'
272 logger
.info('New project')
275 #returns the number of state present in project
277 for x
in self
.__nameList
:
278 if x
.genericName() == 'state':
282 def exportData(self
):
283 #fname = self.__saveName.rstrip('.cyc')+str('.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
289 for xi
in range(len(name
)+2):
292 f
.write('-'+name
+'-'+'\n')
294 sortedPropList
= GUI3
.sortBykey(self
.elemList
[x
].properties
)
295 for p
in sortedPropList
:
296 if self
.elemList
[x
].properties
[p
].value
!= None:
298 f
.write(self
.elemList
[x
].properties
[p
].label
+':'+self
.elemList
[x
].properties
[p
].value
.name
+'\n')
302 value
= str('%0.3f'%float
(self
.elemList
[x
].properties
[p
].value
))
303 f
.write(self
.elemList
[x
].properties
[p
].label
+':'+str(value
)+'\n')
305 logger
.info('Print done')
309 if __name__
== '__main__':