##// END OF EJS Templates
Miguel Valdez -
r221:f16b19555d02
parent child
Show More
@@ -1,694 +1,698
1 1 '''
2 2 Created on September , 2012
3 3 @author:
4 4 '''
5 5 from xml.etree.ElementTree import Element, SubElement, ElementTree
6 6 from xml.etree import ElementTree as ET
7 7 from xml.dom import minidom
8 8
9 9 import sys
10 10 import datetime
11 11 from model.jrodataIO import *
12 12 from model.jroprocessing import *
13 13 from model.jroplot import *
14 14
15 15 def prettify(elem):
16 16 """Return a pretty-printed XML string for the Element.
17 17 """
18 18 rough_string = ET.tostring(elem, 'utf-8')
19 19 reparsed = minidom.parseString(rough_string)
20 20 return reparsed.toprettyxml(indent=" ")
21 21
22 22 class ParameterConf():
23 23
24 24 id = None
25 25 name = None
26 26 value = None
27 27 format = None
28 28
29 29 ELEMENTNAME = 'Parameter'
30 30
31 31 def __init__(self):
32 32
33 33 self.format = 'str'
34 34
35 35 def getElementName(self):
36 36
37 37 return self.ELEMENTNAME
38 38
39 39 def getValue(self):
40 40
41 41 if self.format == 'list':
42 42 strList = self.value.split(',')
43 43 return strList
44 44
45 45 if self.format == 'intlist':
46 46 strList = self.value.split(',')
47 47 intList = [int(x) for x in strList]
48 48 return intList
49 49
50 50 if self.format == 'floatlist':
51 51 strList = self.value.split(',')
52 52 floatList = [float(x) for x in strList]
53 53 return floatList
54 54
55 55 if self.format == 'date':
56 56 strList = self.value.split('/')
57 57 intList = [int(x) for x in strList]
58 58 date = datetime.date(intList[0], intList[1], intList[2])
59 59 return date
60 60
61 61 if self.format == 'time':
62 62 strList = self.value.split(':')
63 63 intList = [int(x) for x in strList]
64 64 time = datetime.time(intList[0], intList[1], intList[2])
65 65 return time
66 66
67 67 func = eval(self.format)
68 68
69 69 return func(self.value)
70 70
71 71 def setup(self, id, name, value, format='str'):
72 72
73 73 self.id = id
74 74 self.name = name
75 75 self.value = str(value)
76 76 self.format = format
77 77
78 78 def makeXml(self, opElement):
79 79
80 80 parmElement = SubElement(opElement, self.ELEMENTNAME)
81 81 parmElement.set('id', str(self.id))
82 82 parmElement.set('name', self.name)
83 83 parmElement.set('value', self.value)
84 84 parmElement.set('format', self.format)
85 85
86 86 def readXml(self, parmElement):
87 87
88 88 self.id = parmElement.get('id')
89 89 self.name = parmElement.get('name')
90 90 self.value = parmElement.get('value')
91 91 self.format = parmElement.get('format')
92 92
93 93 def printattr(self):
94 94
95 95 print "Parameter[%s]: name = %s, value = %s, format = %s" %(self.id, self.name, self.value, self.format)
96 96
97 97 class OperationConf():
98 98
99 99 id = None
100 100 name = None
101 101 priority = None
102 102 type = None
103 103
104 104 parmConfObjList = []
105 105
106 106 ELEMENTNAME = 'Operation'
107 107
108 108 def __init__(self):
109 109
110 110 id = 0
111 111 name = None
112 112 priority = None
113 113 type = 'self'
114 114
115 115
116 116 def __getNewId(self):
117 117
118 118 return int(self.id)*10 + len(self.parmConfObjList) + 1
119 119
120 120 def getElementName(self):
121 121
122 122 return self.ELEMENTNAME
123 123
124 124 def getParameterObjList(self):
125 125
126 126 return self.parmConfObjList
127 127
128 128 def setup(self, id, name, priority, type):
129 129
130 130 self.id = id
131 131 self.name = name
132 132 self.type = type
133 133 self.priority = priority
134 134
135 135 self.parmConfObjList = []
136 136
137 137 def addParameter(self, name, value, format='str'):
138 138
139 139 id = self.__getNewId()
140 140
141 141 parmConfObj = ParameterConf()
142 142 parmConfObj.setup(id, name, value, format)
143 143
144 144 self.parmConfObjList.append(parmConfObj)
145 145
146 146 return parmConfObj
147 147
148 148 def makeXml(self, upElement):
149 149
150 150 opElement = SubElement(upElement, self.ELEMENTNAME)
151 151 opElement.set('id', str(self.id))
152 152 opElement.set('name', self.name)
153 153 opElement.set('type', self.type)
154 154 opElement.set('priority', str(self.priority))
155 155
156 156 for parmConfObj in self.parmConfObjList:
157 157 parmConfObj.makeXml(opElement)
158 158
159 159 def readXml(self, opElement):
160 160
161 161 self.id = opElement.get('id')
162 162 self.name = opElement.get('name')
163 163 self.type = opElement.get('type')
164 164 self.priority = opElement.get('priority')
165 165
166 166 self.parmConfObjList = []
167 167
168 168 parmElementList = opElement.getiterator(ParameterConf().getElementName())
169 169
170 170 for parmElement in parmElementList:
171 171 parmConfObj = ParameterConf()
172 172 parmConfObj.readXml(parmElement)
173 173 self.parmConfObjList.append(parmConfObj)
174 174
175 175 def printattr(self):
176 176
177 177 print "%s[%s]: name = %s, type = %s, priority = %s" %(self.ELEMENTNAME,
178 178 self.id,
179 179 self.name,
180 180 self.type,
181 181 self.priority)
182 182
183 183 for parmConfObj in self.parmConfObjList:
184 184 parmConfObj.printattr()
185 185
186 186 def createObject(self):
187 187
188 188 if self.type == 'self':
189 189 raise ValueError, "This operation type cannot be created"
190 190
191 191 if self.type == 'other':
192 192 className = eval(self.name)
193 193 opObj = className()
194 194
195 195 return opObj
196 196
197 197 class ProcUnitConf():
198 198
199 199 id = None
200 200 name = None
201 201 datatype = None
202 202 inputId = None
203 203
204 204 opConfObjList = []
205 205
206 206 procUnitObj = None
207 207 opObjList = []
208 208
209 209 ELEMENTNAME = 'ProcUnit'
210 210
211 211 def __init__(self):
212 212
213 213 self.id = None
214 214 self.datatype = None
215 215 self.name = None
216 216 self.inputId = None
217 217
218 218 self.opConfObjList = []
219 219
220 220 self.procUnitObj = None
221 221 self.opObjDict = {}
222 222
223 223 def __getPriority(self):
224 224
225 225 return len(self.opConfObjList)+1
226 226
227 227 def __getNewId(self):
228 228
229 229 return int(self.id)*10 + len(self.opConfObjList) + 1
230 230
231 231 def getElementName(self):
232 232
233 233 return self.ELEMENTNAME
234 234
235 235 def getId(self):
236 236
237 237 return str(self.id)
238 238
239 239 def getInputId(self):
240 240
241 241 return str(self.inputId)
242 242
243 243 def getOperationObjList(self):
244 244
245 245 return self.opConfObjList
246 246
247 247 def getProcUnitObj(self):
248 248
249 249 return self.procUnitObj
250 250
251 251 def setup(self, id, name, datatype, inputId):
252 252
253 253 self.id = id
254 254 self.name = name
255 255 self.datatype = datatype
256 256 self.inputId = inputId
257 257
258 258 self.opConfObjList = []
259 259
260 260 self.addOperation(name='init', optype='self')
261 261
262 262 def addParameter(self, **kwargs):
263 263
264 264 opObj = self.opConfObjList[0]
265 265
266 266 opObj.addParameter(**kwargs)
267 267
268 268 return opObj
269 269
270 270 def addOperation(self, name, optype='self'):
271 271
272 272 id = self.__getNewId()
273 273 priority = self.__getPriority()
274 274
275 275 opConfObj = OperationConf()
276 276 opConfObj.setup(id, name=name, priority=priority, type=optype)
277 277
278 278 self.opConfObjList.append(opConfObj)
279 279
280 280 return opConfObj
281 281
282 282 def makeXml(self, procUnitElement):
283 283
284 284 upElement = SubElement(procUnitElement, self.ELEMENTNAME)
285 285 upElement.set('id', str(self.id))
286 286 upElement.set('name', self.name)
287 287 upElement.set('datatype', self.datatype)
288 288 upElement.set('inputId', str(self.inputId))
289 289
290 290 for opConfObj in self.opConfObjList:
291 291 opConfObj.makeXml(upElement)
292 292
293 293 def readXml(self, upElement):
294 294
295 295 self.id = upElement.get('id')
296 296 self.name = upElement.get('name')
297 297 self.datatype = upElement.get('datatype')
298 298 self.inputId = upElement.get('inputId')
299 299
300 300 self.opConfObjList = []
301 301
302 302 opElementList = upElement.getiterator(OperationConf().getElementName())
303 303
304 304 for opElement in opElementList:
305 305 opConfObj = OperationConf()
306 306 opConfObj.readXml(opElement)
307 307 self.opConfObjList.append(opConfObj)
308 308
309 309 def printattr(self):
310 310
311 311 print "%s[%s]: name = %s, datatype = %s, inputId = %s" %(self.ELEMENTNAME,
312 312 self.id,
313 313 self.name,
314 314 self.datatype,
315 315 self.inputId)
316 316
317 317 for opConfObj in self.opConfObjList:
318 318 opConfObj.printattr()
319 319
320 320 def createObjects(self):
321 321
322 322 className = eval(self.name)
323 323 procUnitObj = className()
324 324
325 325 for opConfObj in self.opConfObjList:
326 326
327 327 if opConfObj.type == 'self':
328 328 continue
329 329
330 330 opObj = opConfObj.createObject()
331 331
332 332 self.opObjDict[opConfObj.id] = opObj
333 333 procUnitObj.addOperation(opObj, opConfObj.id)
334 334
335 335 self.procUnitObj = procUnitObj
336 336
337 337 return procUnitObj
338 338
339 339 def run(self):
340 340
341 341 finalSts = False
342 342
343 343 for opConfObj in self.opConfObjList:
344 344
345 345 kwargs = {}
346 346 for parmConfObj in opConfObj.getParameterObjList():
347 347 kwargs[parmConfObj.name] = parmConfObj.getValue()
348 348
349 349 #print "\tRunning the '%s' operation with %s" %(opConfObj.name, opConfObj.id)
350 350 sts = self.procUnitObj.call(opConfObj, **kwargs)
351 351 finalSts = finalSts or sts
352 352
353 353 return finalSts
354 354
355 355 class ReadUnitConf(ProcUnitConf):
356 356
357 357 path = None
358 358 startDate = None
359 359 endDate = None
360 360 startTime = None
361 361 endTime = None
362 362 online = None
363 363 expLabel = None
364 364 delay = None
365 365
366 366 ELEMENTNAME = 'ReadUnit'
367 367
368 368 def __init__(self):
369 369
370 370 self.id = None
371 371 self.datatype = None
372 372 self.name = None
373 373 self.inputId = 0
374 374
375 375 self.opConfObjList = []
376 376 self.opObjList = []
377 377
378 378 def getElementName(self):
379 379
380 380 return self.ELEMENTNAME
381 381
382 382 def setup(self, id, name, datatype, path, startDate, endDate, startTime, endTime, online=0, expLabel='', delay=60):
383 383
384 384 self.id = id
385 385 self.name = name
386 386 self.datatype = datatype
387 387
388 388 self.path = path
389 389 self.startDate = startDate
390 390 self.endDate = endDate
391 391 self.startTime = startTime
392 392 self.endTime = endTime
393 393 self.online = online
394 394 self.expLabel = expLabel
395 395 self.delay = delay
396 396
397 397 self.addRunOperation()
398 398
399 399 def addRunOperation(self):
400 400
401 401 opObj = self.addOperation(name = 'run', optype = 'self')
402 402
403 403 opObj.addParameter(name='path' , value=self.path, format='str')
404 404 opObj.addParameter(name='startDate' , value=self.startDate, format='date')
405 405 opObj.addParameter(name='endDate' , value=self.endDate, format='date')
406 406 opObj.addParameter(name='startTime' , value=self.startTime, format='time')
407 407 opObj.addParameter(name='endTime' , value=self.endTime, format='time')
408 408 opObj.addParameter(name='expLabel' , value=self.expLabel, format='str')
409 409 opObj.addParameter(name='online' , value=self.online, format='int')
410 410 opObj.addParameter(name='delay' , value=self.delay, format='float')
411 411
412 412 return opObj
413 413
414 414
415 415 class Controller():
416 416
417 417 id = None
418 418 name = None
419 419 description = None
420 420 # readUnitConfObjList = None
421 421 procUnitConfObjDict = None
422 422
423 423 ELEMENTNAME = 'Controller'
424 424
425 425 def __init__(self):
426 426
427 427 self.id = None
428 428 self.name = None
429 429 self.description = None
430 430
431 431 # self.readUnitConfObjList = []
432 432 self.procUnitConfObjDict = {}
433 433
434 434 def __getNewId(self):
435 435
436 436 id = int(self.id)*10 + len(self.procUnitConfObjDict) + 1
437 437
438 438 return str(id)
439 439
440 440 def getElementName(self):
441 441
442 442 return self.ELEMENTNAME
443 443
444 444 def setup(self, id, name, description):
445 445
446 446 self.id = id
447 447 self.name = name
448 448 self.description = description
449 449
450 450 def addReadUnit(self, datatype, path, startDate='', endDate='', startTime='', endTime='', online=0, expLabel='', delay=60):
451 451
452 452 id = self.__getNewId()
453 453 name = '%sReader' %(datatype)
454 454
455 455 readUnitConfObj = ReadUnitConf()
456 456 readUnitConfObj.setup(id, name, datatype, path, startDate, endDate, startTime, endTime, online, expLabel, delay)
457 457
458 458 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
459 459
460 460 return readUnitConfObj
461 461
462 462 def addProcUnit(self, datatype, inputId):
463 463
464 464 id = self.__getNewId()
465 465 name = '%sProc' %(datatype)
466 466
467 467 procUnitConfObj = ProcUnitConf()
468 468 procUnitConfObj.setup(id, name, datatype, inputId)
469 469
470 470 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
471 471
472 472 return procUnitConfObj
473 473
474 474 def makeXml(self):
475 475
476 476 projectElement = Element('Controller')
477 477 projectElement.set('id', str(self.id))
478 478 projectElement.set('name', self.name)
479 479 projectElement.set('description', self.description)
480 480
481 481 # for readUnitConfObj in self.readUnitConfObjList:
482 482 # readUnitConfObj.makeXml(projectElement)
483 483
484 484 for procUnitConfObj in self.procUnitConfObjDict.values():
485 485 procUnitConfObj.makeXml(projectElement)
486 486
487 487 self.projectElement = projectElement
488 488
489 489 def writeXml(self, filename):
490 490
491 491 self.makeXml()
492 492
493 493 print prettify(self.projectElement)
494 494
495 495 ElementTree(self.projectElement).write(filename, method='xml')
496 496
497 497 def readXml(self, filename):
498 498
499 499 #tree = ET.parse(filename)
500 500 self.projectElement = None
501 501 # self.readUnitConfObjList = []
502 502 self.procUnitConfObjDict = {}
503 503
504 504 self.projectElement = ElementTree().parse(filename)
505 505
506 506 self.project = self.projectElement.tag
507 507
508 508 self.id = self.projectElement.get('id')
509 509 self.name = self.projectElement.get('name')
510 510 self.description = self.projectElement.get('description')
511 511
512 512 readUnitElementList = self.projectElement.getiterator(ReadUnitConf().getElementName())
513 513
514 514 for readUnitElement in readUnitElementList:
515 515 readUnitConfObj = ReadUnitConf()
516 516 readUnitConfObj.readXml(readUnitElement)
517 517
518 518 self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj
519 519
520 520 procUnitElementList = self.projectElement.getiterator(ProcUnitConf().getElementName())
521 521
522 522 for procUnitElement in procUnitElementList:
523 523 procUnitConfObj = ProcUnitConf()
524 524 procUnitConfObj.readXml(procUnitElement)
525 525
526 526 self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj
527 527
528 528 def printattr(self):
529 529
530 530 print "Controller[%s]: name = %s, description = %s" %(self.id,
531 531 self.name,
532 532 self.description)
533 533
534 534 # for readUnitConfObj in self.readUnitConfObjList:
535 535 # readUnitConfObj.printattr()
536 536
537 537 for procUnitConfObj in self.procUnitConfObjDict.values():
538 538 procUnitConfObj.printattr()
539 539
540 540 def createObjects(self):
541 541
542 542 # for readUnitConfObj in self.readUnitConfObjList:
543 543 # readUnitConfObj.createObjects()
544 544
545 545 for procUnitConfObj in self.procUnitConfObjDict.values():
546 546 procUnitConfObj.createObjects()
547 547
548 548 def __connect(self, objIN, obj):
549 549
550 550 obj.setInput(objIN.getOutput())
551 551
552 552 def connectObjects(self):
553 553
554 554 for puConfObj in self.procUnitConfObjDict.values():
555 555
556 556 inputId = puConfObj.getInputId()
557 557
558 558 if int(inputId) == 0:
559 559 continue
560 560
561 561 puConfINObj = self.procUnitConfObjDict[inputId]
562 562
563 563 puObj = puConfObj.getProcUnitObj()
564 564 puINObj = puConfINObj.getProcUnitObj()
565 565
566 566 self.__connect(puINObj, puObj)
567 567
568 568 def run(self):
569 569
570 570 # for readUnitConfObj in self.readUnitConfObjList:
571 571 # readUnitConfObj.run()
572 572
573 573 while(True):
574 574
575 575 finalSts = False
576 576
577 577 for procUnitConfObj in self.procUnitConfObjDict.values():
578 578 #print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id)
579 579 sts = procUnitConfObj.run()
580 580 finalSts = finalSts or sts
581 581
582 582 #If every process unit finished so end process
583 583 if not(finalSts):
584 584 print "Every process units have finished"
585 585 break
586 586
587 587 if __name__ == '__main__':
588 588
589 589 desc = "Segundo Test"
590 590 filename = "schain.xml"
591 591
592 592 controllerObj = Controller()
593 593
594 594 controllerObj.setup(id = '191', name='test01', description=desc)
595 595
596 596 readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage',
597 597 path='data/rawdata/',
598 598 startDate='2011/01/01',
599 599 endDate='2012/12/31',
600 600 startTime='00:00:00',
601 601 endTime='23:59:59',
602 602 online=0)
603 603
604 opObj00 = readUnitConfObj.addOperation(name='printTotalBlocks')
604 # opObj00 = readUnitConfObj.addOperation(name='printInfo')
605 605
606 606 procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId())
607 607
608 608 opObj10 = procUnitConfObj0.addOperation(name='selectChannels')
609 609 opObj10.addParameter(name='channelList', value='3,4,5', format='intlist')
610 610
611 611 opObj10 = procUnitConfObj0.addOperation(name='selectHeights')
612 612 opObj10.addParameter(name='minHei', value='90', format='float')
613 opObj10.addParameter(name='maxHei', value='180', format='float')
613 opObj10.addParameter(name='maxHei', value='300', format='float')
614 614
615 615 opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
616 616 opObj12.addParameter(name='n', value='10', format='int')
617 617
618 opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='other')
619 opObj12.addParameter(name='n', value='2', format='int')
620 opObj12.addParameter(name='overlapping', value='1', format='int')
621
618 622 procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId())
619 procUnitConfObj1.addParameter(name='nFFTPoints', value='16', format='int')
623 procUnitConfObj1.addParameter(name='nFFTPoints', value='32', format='int')
620 624
621 625 opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
622 626 opObj11.addParameter(name='idfigure', value='1', format='int')
623 627 opObj11.addParameter(name='wintitle', value='SpectraPlot', format='str')
624 628 opObj11.addParameter(name='zmin', value='40', format='int')
625 opObj11.addParameter(name='zmax', value='80', format='int')
629 opObj11.addParameter(name='zmax', value='90', format='int')
626 630 opObj11.addParameter(name='showprofile', value='1', format='int')
627 631
628 632 opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other')
629 633 opObj11.addParameter(name='idfigure', value='10', format='int')
630 634 opObj11.addParameter(name='wintitle', value='RTI', format='str')
631 635 # opObj11.addParameter(name='xmin', value='21', format='float')
632 636 # opObj11.addParameter(name='xmax', value='22', format='float')
633 637 opObj11.addParameter(name='zmin', value='40', format='int')
634 opObj11.addParameter(name='zmax', value='80', format='int')
638 opObj11.addParameter(name='zmax', value='90', format='int')
635 639 opObj11.addParameter(name='showprofile', value='1', format='int')
636 opObj11.addParameter(name='timerange', value=str(20), format='int')
640 opObj11.addParameter(name='timerange', value=str(60), format='int')
637 641
638 642 # opObj10 = procUnitConfObj1.addOperation(name='selectChannels')
639 643 # opObj10.addParameter(name='channelList', value='0,2,4,6', format='intlist')
640 644 #
641 645 # opObj12 = procUnitConfObj1.addOperation(name='IncohInt', optype='other')
642 646 # opObj12.addParameter(name='n', value='2', format='int')
643 647 #
644 648 # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
645 649 # opObj11.addParameter(name='idfigure', value='2', format='int')
646 650 # opObj11.addParameter(name='wintitle', value='SpectraPlot10', format='str')
647 651 # opObj11.addParameter(name='zmin', value='70', format='int')
648 652 # opObj11.addParameter(name='zmax', value='90', format='int')
649 653 #
650 654 # opObj10 = procUnitConfObj1.addOperation(name='selectChannels')
651 655 # opObj10.addParameter(name='channelList', value='2,6', format='intlist')
652 656 #
653 657 # opObj12 = procUnitConfObj1.addOperation(name='IncohInt', optype='other')
654 658 # opObj12.addParameter(name='n', value='2', format='int')
655 659 #
656 660 # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
657 661 # opObj11.addParameter(name='idfigure', value='3', format='int')
658 662 # opObj11.addParameter(name='wintitle', value='SpectraPlot10', format='str')
659 663 # opObj11.addParameter(name='zmin', value='70', format='int')
660 664 # opObj11.addParameter(name='zmax', value='90', format='int')
661 665
662 666
663 667 # opObj12 = procUnitConfObj1.addOperation(name='decoder')
664 668 # opObj12.addParameter(name='ncode', value='2', format='int')
665 669 # opObj12.addParameter(name='nbauds', value='8', format='int')
666 670 # opObj12.addParameter(name='code0', value='001110011', format='int')
667 671 # opObj12.addParameter(name='code1', value='001110011', format='int')
668 672
669 673
670 674
671 675 # procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj1.getId())
672 676 #
673 677 # opObj21 = procUnitConfObj2.addOperation(name='IncohInt', optype='other')
674 678 # opObj21.addParameter(name='n', value='2', format='int')
675 679 #
676 680 # opObj11 = procUnitConfObj2.addOperation(name='SpectraPlot', optype='other')
677 681 # opObj11.addParameter(name='idfigure', value='4', format='int')
678 682 # opObj11.addParameter(name='wintitle', value='SpectraPlot OBJ 2', format='str')
679 683 # opObj11.addParameter(name='zmin', value='70', format='int')
680 684 # opObj11.addParameter(name='zmax', value='90', format='int')
681 685
682 686 print "Escribiendo el archivo XML"
683 687
684 688 controllerObj.writeXml(filename)
685 689
686 690 print "Leyendo el archivo XML"
687 691 controllerObj.readXml(filename)
688 692 #controllerObj.printattr()
689 693
690 694 controllerObj.createObjects()
691 695 controllerObj.connectObjects()
692 696 controllerObj.run()
693 697
694 698 No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now