Пример #1
0
class materials(materialsUI):
    
    def __init__(self,currentFolder,iphase):
        materialsUI.__init__(self)
        self.currentFolder = currentFolder
        self.iphase = iphase
        self.loadData()
        print self.data
        self.setData()
        
        
    def loadData(self):        
        filename = '%s/constant/transportProperties'%self.currentFolder
        self.parsedData = ParsedParameterFile(filename,createZipped=False)
        keys = self.parsedData.getValueDict().keys()
        if 'phases' in keys:
            self.data = self.parsedData[self.parsedData['phases'][self.iphase]].getValueDict()
        else:
            self.data = self.parsedData.getValueDict()        
        return
        
    def setData(self):
        for key in self.data.keys():
            if hasattr(self, key):
                if key=='name':
                    self.__getattribute__(key).setText(str(self.data[key]))
                elif key in self.__dict__.keys():
                    self.__getattribute__(key).setText(str(self.data[key][-1]))
        return
        
    def toABM(self):
        w = materialsABM()
        result = w.exec_()
        if result:
            data = w.getSelectedData()
            if data:
                keys = self.parsedData.getValueDict().keys()
                if 'phases' in keys:
                    oldname = self.parsedData['phases'][self.iphase]
                    newname = data['name']
                    del self.parsedData[oldname]
                    self.parsedData['phases'][self.iphase] = newname
                    self.parsedData[newname] = data
                    self.data = self.parsedData[self.parsedData['phases'][self.iphase]].getValueDict()
                else:
                    keys = data.keys()
                    for key in keys:
                        self.parsedData[key] = data[key]
                    self.data = self.parsedData.getValueDict() 
                self.parsedData.writeFile()
                self.setData()
        return
Пример #2
0
class materials(materialsUI):
    
    def __init__(self,currentFolder,iphase):
        materialsUI.__init__(self)
        self.currentFolder = currentFolder
        self.iphase = iphase
        self.loadData()
        #print self.data
        self.setData()
        
        
    def loadData(self):        
        filename = '%s/constant/transportProperties'%self.currentFolder
        self.parsedData = ParsedParameterFile(filename,createZipped=False)
        keys = self.parsedData.getValueDict().keys()
        if 'phases' in keys:
            self.data = self.parsedData[self.parsedData['phases'][self.iphase]].getValueDict()
        else:
            self.data = self.parsedData.getValueDict()        
        return
        
    def setData(self):
        for key in self.data.keys():
            if hasattr(self, key):
                if key=='name':
                    self.__getattribute__(key).setText(str(self.data[key]))
                elif key in self.__dict__.keys():
                    self.__getattribute__(key).setText(str(self.data[key][-1]))
        return
        
    def toABM(self):
        w = materialsABM()
        result = w.exec_()
        if result:
            data = w.getSelectedData()
            if data:
                keys = self.parsedData.getValueDict().keys()
                if 'phases' in keys:
                    oldname = self.parsedData['phases'][self.iphase]
                    newname = data['name']
                    del self.parsedData[oldname]
                    self.parsedData['phases'][self.iphase] = newname
                    self.parsedData[newname] = data
                    self.data = self.parsedData[self.parsedData['phases'][self.iphase]].getValueDict()
                else:
                    keys = data.keys()
                    for key in keys:
                        self.parsedData[key] = data[key]
                    self.data = self.parsedData.getValueDict() 
                self.parsedData.writeFile()
                self.setData()
        return
Пример #3
0
    def accept(self):
        filename = '%s/system/controlDict' % (self.currentFolder)
        parsedData = ParsedParameterFile(filename, createZipped=False)
        if 'functions' not in parsedData.getValueDict().keys():
            parsedData['functions'] = {}
        if str(self.name.text()) not in parsedData['functions'].keys():
            parsedData['functions'][str(self.name.text())] = {}

        parsedData['functions'][str(self.name.text())]['type'] = 'residuals'
        parsedData['functions'][str(
            self.name.text())]['outputControl'] = 'timeStep'
        parsedData['functions'][str(
            self.name.text())]['outputInterval'] = self.spinBox.value()
        parsedData['functions'][str(
            self.name.text())]['functionObjectLibs'] = [
                '"libutilityFunctionObjects.so"'
            ]
        fields = []
        for i in range(self.listWidget.count()):
            if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
                fields.append(str(self.listWidget.item(i).text()))
        parsedData['functions'][str(self.name.text())]['fields'] = fields

        parsedData.writeFile()

        self.done(self.Accepted)
Пример #4
0
 def setData(self,data):
     
     #self.spinBox.setValue(data['nsteps']) if 'nsteps' in data.keys() else None
     #self.nop.setValue(data['nop']) if 'nop' in data.keys() else None
     self.name.setText(data['name']) if 'name' in data.keys() else None
     
     #self.comboBox.setCurrentText(data['field']) if 'field' in data.keys()  else None
     #self.comboBox.setCurrentText(data['autorefreshing']) if 'autorefreshing' in data.keys() else None
     
     self.p1_x.setText(data['p1x']) if 'p1x' in data.keys() else None
     self.p1_y.setText(data['p1y']) if 'p1y' in data.keys() else None
     self.p1_z.setText(data['p1z']) if 'p1z' in data.keys() else None
     self.p2_x.setText(data['p2x']) if 'p2x' in data.keys() else None
     self.p2_y.setText(data['p2y']) if 'p2y' in data.keys() else None
     self.p2_z.setText(data['p2z']) if 'p2z' in data.keys() else None
     
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     if 'functions' in parsedData.getValueDict().keys():
         if data['name'] in parsedData['functions'].keys():
             dicc = parsedData['functions'][data['name']]
             if dicc['type']=='sets':
                 self.name.setText(data['name'])
                 self.spinBox.setValue(dicc['outputInterval'])
     
     return data
Пример #5
0
    def accept(self):
        filename = '%s/system/controlDict'%(self.currentFolder)
        parsedData = ParsedParameterFile(filename,createZipped=False)

        if 'functions' not in parsedData.getValueDict().keys():
            parsedData['functions'] = {}
            
        #Logica para evitar que se llamen T* (como los tracers)
#        if len(str(self.name.text()))>=2 and self.name.text()[0]=='T':
#            for i in range(1,len(str(self.name.text()))):
#                if ()
            
        #Logica para evitar nombres repetidos
        for key in parsedData['functions'].keys():
            if key == str(self.name.text()):
                w = QtGui.QMessageBox(QtGui.QMessageBox.Information, "Error", "The name of the new figure and the name of the field must be different. Please select another name")
                w.exec_()
                return
            
        if str(self.name.text()) not in parsedData['functions'].keys():
            parsedData['functions'][str(self.name.text())] = {}
        
        parsedData['functions'][str(self.name.text())]['type'] = 'residuals'
        parsedData['functions'][str(self.name.text())]['outputControl'] = 'timeStep'
        parsedData['functions'][str(self.name.text())]['outputInterval'] = self.spinBox.value()
        parsedData['functions'][str(self.name.text())]['functionObjectLibs'] = ['"libutilityFunctionObjects.so"']
        fields = []        
        for i in range(self.listWidget.count()):
            if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
                fields.append(str(self.listWidget.item(i).text()))
        parsedData['functions'][str(self.name.text())]['fields'] = fields
        
        parsedData.writeFile()
        
        self.done(self.Accepted)
Пример #6
0
    def setData(self, data):

        #self.spinBox.setValue(data['nsteps']) if 'nsteps' in data.keys() else None
        #self.nop.setValue(data['nop']) if 'nop' in data.keys() else None
        self.name.setText(data['name']) if 'name' in data.keys() else None

        #self.comboBox.setCurrentText(data['field']) if 'field' in data.keys()  else None
        #self.comboBox.setCurrentText(data['autorefreshing']) if 'autorefreshing' in data.keys() else None

        self.p1_x.setText(data['p1x']) if 'p1x' in data.keys() else None
        self.p1_y.setText(data['p1y']) if 'p1y' in data.keys() else None
        self.p1_z.setText(data['p1z']) if 'p1z' in data.keys() else None
        self.p2_x.setText(data['p2x']) if 'p2x' in data.keys() else None
        self.p2_y.setText(data['p2y']) if 'p2y' in data.keys() else None
        self.p2_z.setText(data['p2z']) if 'p2z' in data.keys() else None

        filename = '%s/system/controlDict' % (self.currentFolder)
        parsedData = ParsedParameterFile(filename, createZipped=False)
        if 'functions' in parsedData.getValueDict().keys():
            if data['name'] in parsedData['functions'].keys():
                dicc = parsedData['functions'][data['name']]
                if dicc['type'] == 'sets':
                    self.name.setText(data['name'])
                    self.spinBox.setValue(dicc['outputInterval'])

        return data
Пример #7
0
 def exportData(self):
     if self.nproc > 1:
         w = QtGui.QMessageBox(
             QtGui.QMessageBox.Information, "Error", "Data only can be exported in reconstructed cases"
         )
         w.exec_()
         return
     tt = ""
     if self.time_4.currentText() == "Latest Time":
         tt = "-latestTime"
     opt = str(self.comboBox.currentText())
     filename = "%s/export.log" % self.currentFolder
     self.window().newLogTab("Export", filename)
     if opt == "VTK":
         action = "foamToVTK -case %s %s > %s &" % (self.currentFolder, tt, filename)
     elif opt == "Fluent":
         action = "foamMeshToFluent -case %s &" % (self.currentFolder)
         os.system(action)
         action = "cp %s/caseDicts/foamDataToFluentDict %s/system/foamDataToFluentDict" % (
             os.path.dirname(os.path.realpath(__file__)),
             self.currentFolder,
         )
         os.system(action)
         parsedData = ParsedParameterFile("%s/system/foamDataToFluentDict" % self.currentFolder, createZipped=False)
         ii = 10
         for ifield in self.fields:
             if ifield not in parsedData.getValueDict().keys():
                 parsedData[ifield] = ii
                 ii = ii + 1
         action = "foamDataToFluent -case %s %s > %s &" % (self.currentFolder, tt, filename)
     elif opt == "Ensight":
         action = "foamToEnsight -case %s %s > %s &" % (self.currentFolder, tt, filename)
     os.system(action)
     return
Пример #8
0
 def accept(self):
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     
     if 'functions' not in parsedData.getValueDict().keys():
         parsedData['functions'] = {}
     
     #Logica para evitar nombres repetidos
     for key in self.parsedData['functions'].keys():
         if key == str(self.name.text()):
             w = QtGui.QMessageBox(QtGui.QMessageBox.Information, "Error", "The name of the new figure and the name of the tracer must be different. Please select another name")
             w.exec_()
             return
     
     dicc['outputInterval'] = self.spinBox.value()
     fields = []
     for i in range(self.listWidget.count()):
         if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
             fields.append(str(self.listWidget.item(i).text()))
     dicc['fields'] = fields
     dicc['sourceName'] = str(self.comboBox.currentText())        
     parsedData['functions'][str(self.name.text())] = dicc
     parsedData.writeFile()
     
     self.done(self.Accepted)
Пример #9
0
 def accept(self):
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     if 'functions' not in parsedData.getValueDict().keys():
         parsedData['functions'] = {}
     if str(self.name.text()) not in parsedData['functions'].keys():
         parsedData['functions'][str(self.name.text())] = {}
     
     parsedData['functions'][str(self.name.text())]['type'] = 'sets'
     parsedData['functions'][str(self.name.text())]['outputControl'] = 'timeStep'
     parsedData['functions'][str(self.name.text())]['outputInterval'] = self.spinBox.value()
     parsedData['functions'][str(self.name.text())]['setFormat'] = 'raw'
     parsedData['functions'][str(self.name.text())]['interpolationScheme'] = 'cellPoint'
     ifield = self.comboBox.currentText()
     if ifield not in self.fields:
         #significa que es un vector
         axis = 'distance' #ifield[-1]
         ifield = ifield[0:-1]
     else:
         axis = 'distance' #por las dudas        
     parsedData['functions'][str(self.name.text())]['fields'] = [ifield]
     
     dicc = {}
     dicc['nPoints'] = self.nop.text()
     dicc['start'] = '(%s %s %s)'%(str(self.p1_x.text()),str(self.p1_y.text()),str(self.p1_z.text()))
     dicc['end'] = '(%s %s %s)'%(str(self.p2_x.text()),str(self.p2_y.text()),str(self.p2_z.text()))
     dicc['type'] = 'uniform'
     dicc['axis'] = axis
     parsedData['functions'][str(self.name.text())]['sets'] = ['data',dicc]
     
     parsedData.writeFile()
     
     self.done(self.Accepted)
Пример #10
0
    def accept(self):
        filename = '%s/system/controlDict' % (self.currentFolder)
        parsedData = ParsedParameterFile(filename, createZipped=False)

        if 'functions' not in parsedData.getValueDict().keys():
            parsedData['functions'] = {}

        #Logica para evitar nombres repetidos
        for key in self.parsedData['functions'].keys():
            if key == str(self.name.text()):
                w = QtGui.QMessageBox(
                    QtGui.QMessageBox.Information, "Error",
                    "The name of the new figure and the name of the tracer must be different. Please select another name"
                )
                w.exec_()
                return

        dicc['outputInterval'] = self.spinBox.value()
        fields = []
        for i in range(self.listWidget.count()):
            if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
                fields.append(str(self.listWidget.item(i).text()))
        dicc['fields'] = fields
        dicc['sourceName'] = str(self.comboBox.currentText())
        parsedData['functions'][str(self.name.text())] = dicc
        parsedData.writeFile()

        self.done(self.Accepted)
 def accept(self):
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     if 'functions' not in parsedData.getValueDict().keys():
         parsedData['functions'] = {}
     if str(self.objectName()) not in parsedData['functions'].keys():
         parsedData['functions'][str(self.objectName())] = {}
     
     parsedData['functions'][str(self.objectName())]['type'] = 'snapshots'
     parsedData['functions'][str(self.objectName())]['outputControl'] = 'outputTime'
     parsedData['functions'][str(self.objectName())]['functionObjectLibs'] =  ['"libsnapshotsFunctionObjects.so"']
     
     parsedData.writeFile()
Пример #12
0
 def setData(self, data):
     #buscar en el controlDict el function object 'name'
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     if 'functions' in parsedData.getValueDict().keys():
         if data['name'] in parsedData['functions'].keys():
             dicc = parsedData['functions'][data['name']]
             if dicc['type']=='faceSource':
                 self.name.setText(data['name'])
                 self.spinBox.setValue(dicc['outputInterval'])
                 for i in range(self.listWidget.count()):
                     if self.listWidget.item(i) in dicc['fields']:
                         self.listWidget.item(i).setCheckState(QtCore.Qt.Checked)
                     else:
                         self.listWidget.item(i).setCheckState(QtCore.Qt.Unchecked)
Пример #13
0
 def setData(self, data):
     #buscar en el controlDict el function object 'name'
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     if 'functions' in parsedData.getValueDict().keys():
         if data['name'] in parsedData['functions'].keys():
             dicc = parsedData['functions'][data['name']]
             if dicc['type']=='residuals':
                 self.name.setText(data['name'])
                 self.spinBox.setValue(dicc['outputInterval'])
                 for i in range(self.listWidget.count()):
                     if self.listWidget.item(i) in dicc['fields']:
                         self.listWidget.item(i).setCheckState(QtCore.Qt.Checked)
                     else:
                         self.listWidget.item(i).setCheckState(QtCore.Qt.Unchecked)
Пример #14
0
 def from_openfoam_dict(cls, path_to_of_dict):
     graph_dict = {}
     parsed_file = ParsedParameterFile(path_to_of_dict)
     for key, value in parsed_file.getValueDict().iteritems():
         graph_dict[key] = value
     graph_dict['vertexPositions'] = [
         elem.vals for elem in graph_dict['vertexPositions']
     ]
     if 'edgePoints' in graph_dict:
         graph_dict['edgePoints'] = [
             np.array([elem.vals for elem in point_list])
             for point_list in graph_dict['edgePoints']
         ]
     # compute length
     graph_dict['length'] = graph_edge_lengths(graph_dict)
     return cls(graph_dict, convert_to_meters=False)
Пример #15
0
 def accept(self):
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     if 'functions' not in parsedData.getValueDict().keys():
         parsedData['functions'] = {}
     
     dicc['outputInterval'] = self.spinBox.value()
     fields = []        
     for i in range(self.listWidget.count()):
         if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
             fields.append(str(self.listWidget.item(i).text()))
     dicc['fields'] = fields
     dicc['sourceName'] = str(self.comboBox.currentText())        
     parsedData['functions'][str(self.name.text())] = dicc
     parsedData.writeFile()
     
     self.done(self.Accepted)
Пример #16
0
    def accept(self):
        filename = '%s/system/controlDict' % (self.currentFolder)
        parsedData = ParsedParameterFile(filename, createZipped=False)
        if 'functions' not in parsedData.getValueDict().keys():
            parsedData['functions'] = {}
        if str(self.objectName()) not in parsedData['functions'].keys():
            parsedData['functions'][str(self.objectName())] = {}

        parsedData['functions'][str(self.objectName())]['type'] = 'snapshots'
        parsedData['functions'][str(
            self.objectName())]['outputControl'] = 'outputTime'
        parsedData['functions'][str(
            self.objectName())]['functionObjectLibs'] = [
                '"libsnapshotsFunctionObjects.so"'
            ]

        parsedData.writeFile()
Пример #17
0
    def accept(self):
        filename = '%s/system/controlDict' % (self.currentFolder)
        parsedData = ParsedParameterFile(filename, createZipped=False)

        if 'functions' not in parsedData.getValueDict().keys():
            parsedData['functions'] = {}

        #Logica para evitar que se llamen T* (como los tracers)


#        if len(str(self.name.text()))>=2 and self.name.text()[0]=='T':
#            for i in range(1,len(str(self.name.text()))):
#                if ()

#Logica para evitar nombres repetidos
        for key in parsedData['functions'].keys():
            if key == str(self.name.text()):
                w = QtGui.QMessageBox(
                    QtGui.QMessageBox.Information, "Error",
                    "The name of the new figure and the name of the field must be different. Please select another name"
                )
                w.exec_()
                return

        if str(self.name.text()) not in parsedData['functions'].keys():
            parsedData['functions'][str(self.name.text())] = {}

        parsedData['functions'][str(self.name.text())]['type'] = 'residuals'
        parsedData['functions'][str(
            self.name.text())]['outputControl'] = 'timeStep'
        parsedData['functions'][str(
            self.name.text())]['outputInterval'] = self.spinBox.value()
        parsedData['functions'][str(
            self.name.text())]['functionObjectLibs'] = [
                '"libutilityFunctionObjects.so"'
            ]
        fields = []
        for i in range(self.listWidget.count()):
            if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
                fields.append(str(self.listWidget.item(i).text()))
        parsedData['functions'][str(self.name.text())]['fields'] = fields

        parsedData.writeFile()

        self.done(self.Accepted)
Пример #18
0
 def accept(self):
     filename = '%s/system/controlDict'%(self.currentFolder)
     parsedData = ParsedParameterFile(filename,createZipped=False)
     if 'functions' not in parsedData.getValueDict().keys():
         parsedData['functions'] = {}
     if str(self.name.text()) not in parsedData['functions'].keys():
         parsedData['functions'][str(self.name.text())] = {}
     
     parsedData['functions'][str(self.name.text())]['type'] = 'residuals'
     parsedData['functions'][str(self.name.text())]['outputControl'] = 'timeStep'
     parsedData['functions'][str(self.name.text())]['outputInterval'] = self.spinBox.value()
     parsedData['functions'][str(self.name.text())]['functionObjectLibs'] = ['"libutilityFunctionObjects.so"']
     fields = []        
     for i in range(self.listWidget.count()):
         if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
             fields.append(str(self.listWidget.item(i).text()))
     parsedData['functions'][str(self.name.text())]['fields'] = fields
     
     parsedData.writeFile()
     
     self.done(self.Accepted)
Пример #19
0
 def exportData(self):
     opt = str(self.comboBox.currentText())
     filename = '%s/export.log'%self.currentFolder
     self.window().newLogTab('Export',filename)
     if opt=='VTK':
         action = 'foamToVTK -case %s > %s &' %(self.currentFolder,filename)
     elif opt=='Fluent':
         action = 'foamMeshToFluent -case %s &' %(self.currentFolder)
         os.system(action)
         'cp caseDicts/foamDataToFluentDict %s/system/foamDataToFluentDict'%self.currentFolder
         os.system(action)
         parsedData = ParsedParameterFile('%s/system/foamDataToFluentDict'%self.currentFolder,createZipped=False)
         ii = 10
         for ifield in self.fields:
             if ifield not in parsedData.getValueDict().keys():
                 parsedData[ifield] = ii
                 ii = ii + 1                        
         action = 'foamDataToFluent -case %s > %s &' %(self.currentFolder,filename)
     elif opt=='Ensight':
         action = 'foamToEnsight -case %s > %s &' %(self.currentFolder,filename)
     os.system(action)
     return
Пример #20
0
 def exportData(self):
     opt = str(self.comboBox.currentText())
     filename = '%s/export.log'%self.currentFolder
     self.window().newLogTab('Export',filename)
     if opt=='VTK':
         action = 'foamToVTK -case %s > %s &' %(self.currentFolder,filename)
     elif opt=='Fluent':
         action = 'foamMeshToFluent -case %s &' %(self.currentFolder)
         os.system(action)
         'cp caseDicts/foamDataToFluentDict %s/system/foamDataToFluentDict'%self.currentFolder
         os.system(action)
         parsedData = ParsedParameterFile('%s/system/foamDataToFluentDict'%self.currentFolder,createZipped=False)
         ii = 10
         for ifield in self.fields:
             if ifield not in parsedData.getValueDict().keys():
                 parsedData[ifield] = ii
                 ii = ii + 1                        
         action = 'foamDataToFluent -case %s > %s &' %(self.currentFolder,filename)
     elif opt=='Ensight':
         action = 'foamToEnsight -case %s > %s &' %(self.currentFolder,filename)
     os.system(action)
     return
Пример #21
0
 def exportData(self):
     if self.nproc > 1:
         w = QtGui.QMessageBox(
             QtGui.QMessageBox.Information, "Error",
             "Data only can be exported in reconstructed cases")
         w.exec_()
         return
     tt = ''
     if self.time_4.currentText() == 'Latest Time':
         tt = '-latestTime'
     opt = str(self.comboBox.currentText())
     filename = '%s/export.log' % self.currentFolder
     self.window().newLogTab('Export', filename)
     if opt == 'VTK':
         action = 'foamToVTK -case %s %s > %s &' % (self.currentFolder, tt,
                                                    filename)
     elif opt == 'Fluent':
         action = 'foamMeshToFluent -case %s &' % (self.currentFolder)
         os.system(action)
         action = 'cp %s/caseDicts/foamDataToFluentDict %s/system/foamDataToFluentDict' % (
             os.path.dirname(
                 os.path.realpath(__file__)), self.currentFolder)
         os.system(action)
         parsedData = ParsedParameterFile('%s/system/foamDataToFluentDict' %
                                          self.currentFolder,
                                          createZipped=False)
         ii = 10
         for ifield in self.fields:
             if ifield not in parsedData.getValueDict().keys():
                 parsedData[ifield] = ii
                 ii = ii + 1
         action = 'foamDataToFluent -case %s %s > %s &' % (
             self.currentFolder, tt, filename)
     elif opt == 'Ensight':
         action = 'foamToEnsight -case %s %s > %s &' % (self.currentFolder,
                                                        tt, filename)
     os.system(action)
     return
Пример #22
0
    def accept(self):
        filename = '%s/system/controlDict' % (self.currentFolder)
        parsedData = ParsedParameterFile(filename, createZipped=False)
        if 'functions' not in parsedData.getValueDict().keys():
            parsedData['functions'] = {}
        if str(self.name.text()) not in parsedData['functions'].keys():
            parsedData['functions'][str(self.name.text())] = {}

        parsedData['functions'][str(self.name.text())]['type'] = 'sets'
        parsedData['functions'][str(
            self.name.text())]['outputControl'] = 'timeStep'
        parsedData['functions'][str(
            self.name.text())]['outputInterval'] = self.spinBox.value()
        parsedData['functions'][str(self.name.text())]['setFormat'] = 'raw'
        parsedData['functions'][str(
            self.name.text())]['interpolationScheme'] = 'cellPoint'
        ifield = self.comboBox.currentText()
        if ifield not in self.fields:
            #significa que es un vector
            axis = 'distance'  #ifield[-1]
            ifield = ifield[0:-1]
        else:
            axis = 'distance'  #por las dudas
        parsedData['functions'][str(self.name.text())]['fields'] = [ifield]

        dicc = {}
        dicc['nPoints'] = self.nop.text()
        dicc['start'] = '(%s %s %s)' % (str(
            self.p1_x.text()), str(self.p1_y.text()), str(self.p1_z.text()))
        dicc['end'] = '(%s %s %s)' % (str(
            self.p2_x.text()), str(self.p2_y.text()), str(self.p2_z.text()))
        dicc['type'] = 'uniform'
        dicc['axis'] = axis
        parsedData['functions'][str(self.name.text())]['sets'] = ['data', dicc]

        parsedData.writeFile()

        self.done(self.Accepted)
Пример #23
0
class tracers(tracersUI):
    def __init__(self, currentFolder):
        tracersUI.__init__(self)
        self.currentFolder = currentFolder
        [self.timedir, fields, self.currtime] = utils.currentFields(str(self.currentFolder))

        self.patches = []
        self.emptys = []
        self.colors = ["r", "b", "k", "g", "y", "c"]
        self.firstPlot = True

        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()

    def loadCaseData(self):
        filename = "%s/system/controlDict" % self.currentFolder
        self.parsedData = ParsedParameterFile(filename, createZipped=False)
        self.tracersData = []
        if "functions" in self.parsedData.getValueDict().keys():
            for key in self.parsedData["functions"].keys():
                if self.parsedData["functions"][key]["type"] == "scalarTransport":
                    tracer = {}
                    tracer["name"] = key
                    tracer["patchName"] = self.parsedData["functions"][key]["patchName"]
                    tracer["startTime"] = self.parsedData["functions"][key]["fvOptions"]["S"]["timeStart"]
                    self.tracersData.append(tracer)

        if self.patches == []:
            filename = "%s/U" % (self.timedir)
            UData = ParsedParameterFile(filename, createZipped=False)
            self.patches = UData["boundaryField"].keys()
            for ipatch in self.patches:
                if UData["boundaryField"][ipatch]["type"] == "empty":
                    self.emptys.append(ipatch)

    def refreshTable(self):
        for ii in range(self.tableWidget.rowCount() - 1, -1, -1):
            self.tableWidget.removeRow(ii)

        for i in range(len(self.tracersData)):
            self.tableWidget.insertRow(i)
            item1 = QtGui.QTableWidgetItem()
            item2 = QtGui.QTableWidgetItem()
            wdg1 = QtGui.QLineEdit()
            wdg2 = QtGui.QComboBox()
            wdg2.addItems(list(set(self.patches) - set(self.emptys)))

            wdg1.setText(str(self.tracersData[i]["startTime"]))
            wdg2.setCurrentIndex(wdg2.findText(self.tracersData[i]["patchName"]))

            self.tableWidget.setItem(i, 0, item1)
            self.tableWidget.setCellWidget(i, 0, wdg1)
            self.tableWidget.setItem(i, 1, item2)
            self.tableWidget.setCellWidget(i, 1, wdg2)

    def refreshTimeline(self):
        if not self.firstPlot:
            self.figureLayout.removeWidget(self.canvas)

        self.firstPlot = False
        fig = Figure((2.0, 1.5), dpi=100)
        self.canvas = FigureCanvas(fig)
        self.canvas.setParent(self)

        self.ax = fig.add_subplot(111)
        self.ax.clear()

        # levantar el controlDict y ver los tracers

        Tf = float(self.parsedData["endTime"])
        T = float(self.currtime)
        dT = float(self.parsedData["deltaT"])
        self.ax.set_ylim(0, 1.1)
        self.ax.set_xlim(-10 * dT, Tf)
        self.ax.plot([0, T - dT, T, T + dT, Tf], [0, 0, 1, 0, 0], "k", marker="o", label="Current Time")
        i = 0
        for itracer in self.tracersData:
            Tini = float(itracer["startTime"])
            if float(itracer["startTime"]) < T:
                Tini = T
            self.ax.plot([0, Tini, Tini + dT, Tf], [0, 0, 1, 1], self.colors[i % 6], label=itracer["name"])
            i = i + 1
        self.ax.set_title("Timeline")
        self.ax.set_xlabel("Time [s]")
        self.ax.set_ylabel("Event")
        self.ax.legend(loc=0, fontsize="small")

        self.figureLayout.addWidget(self.canvas)

    def newTracer(self):
        i = self.tableWidget.rowCount()
        self.tableWidget.insertRow(i)
        item1 = QtGui.QTableWidgetItem()
        item2 = QtGui.QTableWidgetItem()
        wdg1 = QtGui.QLineEdit()
        wdg2 = QtGui.QComboBox()
        wdg2.addItems(list(set(self.patches) - set(self.emptys)))
        wdg1.setText("0")
        self.tableWidget.setItem(i, 0, item1)
        self.tableWidget.setCellWidget(i, 0, wdg1)
        self.tableWidget.setItem(i, 1, item2)
        self.tableWidget.setCellWidget(i, 1, wdg2)

    def removeTracer(self):
        ii = self.tableWidget.currentRow()
        self.tableWidget.removeRow(ii)
        return

    def saveCaseData(self, doTopoSet=False):

        for dd in self.tracersData:
            del self.parsedData["functions"][dd["name"]]

        if "functions" not in self.parsedData.getValueDict().keys():
            self.parsedData["functions"] = {}

        patches = []
        for i in range(self.tableWidget.rowCount()):
            patchName = str(self.tableWidget.cellWidget(i, 1).currentText())
            newkey = "T%s" % str(i)
            tracer = copy.deepcopy(dicc)
            cellsetname = "%s_c" % patchName

            tracer["fvOptions"]["S"]["timeStart"] = str(self.tableWidget.cellWidget(i, 0).text())
            tracer["fvOptions"]["S"]["cellSet"] = cellsetname
            tracer["patchName"] = patchName
            del tracer["fvOptions"]["S"]["scalarExplicitSetValueCoeffs"]["injectionRate"]["T0"]
            tracer["fvOptions"]["S"]["scalarExplicitSetValueCoeffs"]["injectionRate"][newkey] = "1"
            self.parsedData["functions"][newkey] = tracer
            patches.append(patchName)
        self.parsedData.writeFile()
        # self.parsedData.closeFile()

        if doTopoSet:
            spatches = set(patches)
            ii = 0
            cmd = "cp caseDicts/topoSetDict %s/system/." % self.currentFolder
            os.system(cmd)

            filename = "%s/system/topoSetDict" % self.currentFolder
            topoSetData = ParsedParameterFile(filename, createZipped=False)

            # armo el topoSet de manera de generar los cellSet deseados
            for ipatch in spatches:
                cellsetname = "%s_c" % ipatch
                facesetname = "%s_f" % ipatch
                if not os.path.isfile("%s/constant/polyMesh/sets/%s" % (self.currentFolder, cellsetname)):
                    if ii > 0:
                        topoSetData["actions"].append(topoSetData["actions"][0])
                        topoSetData["actions"].append(topoSetData["actions"][1])
                    topoSetData["actions"][ii]["name"] = facesetname
                    topoSetData["actions"][ii]["sourceInfo"]["name"] = ipatch
                    topoSetData["actions"][ii + 1]["name"] = cellsetname
                    topoSetData["actions"][ii + 1]["sourceInfo"]["set"] = facesetname
                    ii = ii + 2
            topoSetData.writeFile()

            cmd = "topoSet -case %s > run_topoSet.log &" % self.currentFolder
            os.system(cmd)
        else:
            self.loadCaseData()
            self.refreshTable()
            self.refreshTimeline()
        return
Пример #24
0
class particleTracking(particleTrackingUI):
    def __init__(self, currentFolder, nproc):
        particleTrackingUI.__init__(self)
        self.currentFolder = currentFolder
        self.nproc = nproc
        [self.timedir, fields,
         self.currtime] = utils.currentFields(str(self.currentFolder),
                                              nproc=self.nproc)

        self.patches = []
        self.emptys = []
        self.colors = ['r', 'b', 'k', 'g', 'y', 'c']
        self.firstPlot = True

        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()

        self.pushButton_3.setEnabled(False)

    def loadCaseData(self):
        filename = '%s/system/controlDict' % self.currentFolder
        self.parsedData = ParsedParameterFile(filename, createZipped=False)
        self.trackingData = []
        if 'functions' in self.parsedData.getValueDict().keys():
            for key in self.parsedData['functions'].keys():
                if self.parsedData['functions'][key][
                        'type'] == 'particleTracking':
                    D = self.parsedData['functions'][key]
                    track = {}
                    track['name'] = key
                    track['tInjStart'] = D['tInjStart'] if D.__contains__(
                        'tInjStart') else dicc['tInjStart']
                    track['tInjEnd'] = D['tInjEnd'] if D.__contains__(
                        'tInjEnd') else dicc['tInjEnd']
                    track['npByDt'] = D['npByDt'] if D.__contains__(
                        'npByDt') else dicc['npByDt']
                    track['center'] = D['center'] if D.__contains__(
                        'center') else dicc['center']
                    track['r0'] = D['r0'] if D.__contains__(
                        'r0') else dicc['r0']
                    track['rho'] = D['rho'] if D.__contains__(
                        'rho') else dicc['rho']
                    track['d'] = D['d'] if D.__contains__('d') else dicc['d']
                    track['rhop'] = D['rhop'] if D.__contains__(
                        'rhop') else dicc['rhop']
                    track['mu'] = D['mu'] if D.__contains__(
                        'mu') else dicc['mu']
                    track['e'] = D['e'] if D.__contains__('e') else dicc['e']
                    track['outputControl'] = D[
                        'outputControl'] if D.__contains__(
                            'outputControl') else dicc['outputControl']
                    track['outputInterval'] = D[
                        'outputInterval'] if D.__contains__(
                            'outputInterval') else dicc['outputInterval']

                    self.trackingData.append(track)

        self.pushButton_3.setEnabled(True)

    def refreshTable(self):
        for ii in range(self.tableWidget.columnCount() - 1, -1, -1):
            self.tableWidget.removeColumn(ii)

        for i in range(len(self.trackingData)):
            self.tableWidget.insertColumn(i)
            N = 13
            items = [QtGui.QTableWidgetItem() for irow in range(N)]
            wdgs = [QtGui.QLineEdit() for irow in range(N - 2)]

            wdgs[0].setText(str(self.trackingData[i]['name']))
            wdgs[0].setEnabled(False)
            wdgs[1].setText(str(self.trackingData[i]['tInjStart']))
            wdgs[2].setText(str(self.trackingData[i]['tInjEnd']))
            wdgs[3].setText(str(self.trackingData[i]['npByDt']))
            wdgs[4].setText(str(self.trackingData[i]['center']))
            wdgs[5].setText(str(self.trackingData[i]['r0']))
            wdgs[6].setText(str(self.trackingData[i]['rho']))
            wdgs[7].setText(str(self.trackingData[i]['d']))
            wdgs[8].setText(str(self.trackingData[i]['rhop']))
            wdgs[9].setText(str(self.trackingData[i]['mu']))
            wdgs[10].setText(str(self.trackingData[i]['e']))

            wdgs.append(QtGui.QComboBox())
            wdgs[11].addItems(outputControlData)
            wdgs[11].setObjectName(str(i))
            wdgs[11].setCurrentIndex(wdgs[11].findText(
                self.trackingData[i]['outputControl']))

            wdgs.append(QtGui.QSpinBox())
            wdgs[12].setMinimum(1)
            wdgs[12].setMaximum(1000)
            wdgs[12].setValue(self.trackingData[i]['outputInterval'])
            wdgs[12].setEnabled(False) if self.trackingData[i][
                'outputControl'] != 'timeStep' else wdgs[12].setEnabled(True)

            for irow in range(N):
                if irow in doubleData:
                    wdgs[irow].setValidator(QtGui.QDoubleValidator())
                if irow in intData:
                    wdgs[irow].setValidator(QtGui.QIntValidator())
                if irow in vecData:
                    wdgs[irow].setValidator(
                        QtGui.QRegExpValidator(
                            QtCore.QRegExp(
                                "\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}"
                            )))
                if irow in lineEdit:
                    QtCore.QObject.connect(
                        wdgs[irow],
                        QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
                        self.checkAccept)
                if irow in spin:
                    QtCore.QObject.connect(
                        wdgs[irow],
                        QtCore.SIGNAL(_fromUtf8("valueChanged(QString)")),
                        self.checkAccept)
                if irow in comboBox:
                    QtCore.QObject.connect(
                        wdgs[irow],
                        QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
                        self.checkAccept)
                    QtCore.QObject.connect(
                        wdgs[irow],
                        QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
                        self.change_combobox)

                self.tableWidget.setItem(irow, i, items[irow])
                self.tableWidget.setCellWidget(irow, i, wdgs[irow])

        self.pushButton_3.setEnabled(True)

    def refreshTimeline(self):
        if not self.firstPlot:
            self.figureLayout.removeWidget(self.canvas)
            self.canvas.destroy()
            self.canvas.close()

        self.firstPlot = False
        fig = Figure((2.0, 1.5), dpi=100)
        self.canvas = FigureCanvas(fig)
        self.canvas.setParent(self)

        self.ax = fig.add_subplot(111)
        self.ax.clear()

        #levantar el controlDict y ver los tracers

        Tf = float(self.parsedData['endTime'])
        T = float(self.currtime)
        dT = float(self.parsedData['deltaT'])
        self.ax.set_ylim(0, 1.1)
        self.ax.set_xlim(-10 * dT, Tf)
        self.ax.plot([0, T - dT, T, T + dT, Tf], [0, 0, 1, 0, 0],
                     'k',
                     marker='o',
                     label='Current Time')
        i = 0
        for itrack in self.trackingData:
            Tini = float(itrack['tInjStart'])
            Tend = float(itrack['tInjEnd'])
            if Tini < T:
                Tini = T
            if Tend > Tf:
                Tend = Tf
            self.ax.plot([0, Tini - dT / 10, Tini, Tend, Tend + dT / 10, Tf],
                         [0, 0, 1, 1, 0, 0],
                         self.colors[i % 6],
                         label=itrack['name'])
            i = i + 1
        self.ax.set_title('Timeline')
        self.ax.set_xlabel('Time [s]')
        self.ax.set_ylabel('Event')
        self.ax.legend(loc=0, fontsize='small')

        self.figureLayout.addWidget(self.canvas)

        self.pushButton_3.setEnabled(True)

    def change_combobox(self):
        name = str(self.sender().objectName())
        c = self.tableWidget.cellWidget(12, int(name))

        if self.sender().currentText() == 'timeStep':
            c.setEnabled(True)
        else:
            c.setEnabled(False)

        print 'done'
        return

    def newTracer(self):
        i = self.tableWidget.columnCount()
        self.tableWidget.insertColumn(i)

        N = 13
        items = [QtGui.QTableWidgetItem() for irow in range(N)]
        wdgs = [QtGui.QLineEdit() for irow in range(N - 2)]

        wdgs[0].setText(str('newCloud'))
        wdgs[1].setText(str(dicc['tInjStart']))
        wdgs[2].setText(str(dicc['tInjEnd']))
        wdgs[3].setText(str(dicc['npByDt']))
        wdgs[4].setText(str(dicc['center']))
        wdgs[5].setText(str(dicc['r0']))
        wdgs[6].setText(str(dicc['rho']))
        wdgs[7].setText(str(dicc['d']))
        wdgs[8].setText(str(dicc['rhop']))
        wdgs[9].setText(str(dicc['mu']))
        wdgs[10].setText(str(dicc['e']))

        wdgs.append(QtGui.QComboBox())
        wdgs[11].addItems(outputControlData)
        wdgs[11].setObjectName(str(i))

        wdgs.append(QtGui.QSpinBox())
        wdgs[12].setMinimum(1)
        wdgs[12].setMaximum(1000)

        for irow in range(N):
            if irow in doubleData:
                wdgs[irow].setValidator(QtGui.QDoubleValidator())
            if irow in intData:
                wdgs[irow].setValidator(QtGui.QIntValidator())
            if irow in vecData:
                wdgs[irow].setValidator(
                    QtGui.QRegExpValidator(
                        QtCore.QRegExp(
                            "\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}"
                        )))
            if irow in lineEdit:
                QtCore.QObject.connect(
                    wdgs[irow],
                    QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
                    self.checkAccept)
            if irow in spin:
                QtCore.QObject.connect(
                    wdgs[irow],
                    QtCore.SIGNAL(_fromUtf8("valueChanged(QString)")),
                    self.checkAccept)
            if irow in comboBox:
                QtCore.QObject.connect(
                    wdgs[irow],
                    QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
                    self.checkAccept)
                QtCore.QObject.connect(
                    wdgs[irow],
                    QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
                    self.change_combobox)

            self.tableWidget.setItem(irow, i, items[irow])
            self.tableWidget.setCellWidget(irow, i, wdgs[irow])

        self.pushButton_3.setEnabled(True)

    def removeTracer(self):
        ii = self.tableWidget.currentColumn()
        if ii == -1:
            QtGui.QMessageBox.about(self, "ERROR", "None cloud selected")
            return
        w = QtGui.QMessageBox(
            QtGui.QMessageBox.Information, "Removing",
            "Do you want to remove all particle cloud data?",
            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        ret = w.exec_()
        if (QtGui.QMessageBox.Yes == ret):
            self.tableWidget.removeColumn(ii)
            self.drawTracers()
            self.pushButton_3.setEnabled(False)
        return

    def saveCaseData(self):
        saved = self.drawTracers()
        if saved:
            self.pushButton_3.setEnabled(False)

    def drawTracers(self):

        for i in range(self.tableWidget.columnCount()):
            ct = str(self.tableWidget.cellWidget(4, i).text())
            r0 = str(self.tableWidget.cellWidget(5, i).text())
            if ct[-1] != ')' or r0[-1] != ')':
                QtGui.QMessageBox.about(
                    self, "Error", "Wrong regular expression in vector type")
                return False

            tini = float(self.tableWidget.cellWidget(1, i).text())
            tend = float(self.tableWidget.cellWidget(2, i).text())

            if tend < tini:
                QtGui.QMessageBox.about(self, "ERROR",
                                        "Wrong seeding interval")
                return False

        for dd in self.trackingData:
            del self.parsedData['functions'][dd['name']]

        if 'functions' not in self.parsedData.getValueDict().keys():
            self.parsedData['functions'] = {}

        for i in range(self.tableWidget.columnCount()):
            track = copy.deepcopy(dicc)

            keyname = str(self.tableWidget.cellWidget(0, i).text())
            track['tInjStart'] = str(self.tableWidget.cellWidget(1, i).text())
            track['tInjEnd'] = str(self.tableWidget.cellWidget(2, i).text())
            track['npByDt'] = str(self.tableWidget.cellWidget(3, i).text())
            track['center'] = str(self.tableWidget.cellWidget(4, i).text())
            track['r0'] = str(self.tableWidget.cellWidget(5, i).text())
            track['rho'] = str(self.tableWidget.cellWidget(6, i).text())
            track['d'] = str(self.tableWidget.cellWidget(7, i).text())
            track['rhop'] = str(self.tableWidget.cellWidget(8, i).text())
            track['mu'] = str(self.tableWidget.cellWidget(9, i).text())
            track['e'] = str(self.tableWidget.cellWidget(10, i).text())
            track['outputControl'] = str(
                self.tableWidget.cellWidget(
                    11, i).currentText())  #TODO: ver aca que va
            track['outputInterval'] = str(
                self.tableWidget.cellWidget(12, i).value())

            while keyname in self.parsedData['functions'].keys():
                keyname = keyname + '1'
            self.parsedData['functions'][keyname] = track

        self.parsedData.writeFile()

        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()

        return True

    def checkAccept(self):

        ready = True
        edits = self.findChildren(QtGui.QLineEdit)
        for E in edits:
            if E.isEnabled():
                if not E.text():
                    ready = False
        if ready:
            self.pushButton_3.setEnabled(True)
        else:
            self.pushButton_3.setEnabled(False)
Пример #25
0
class particleTracking(particleTrackingUI):

    def __init__(self, currentFolder,nproc):
        particleTrackingUI.__init__(self)
        self.currentFolder = currentFolder
        self.nproc = nproc
        [self.timedir,fields,self.currtime] = utils.currentFields(str(self.currentFolder),nproc=self.nproc)
        
        self.patches = []
        self.emptys = []
        self.colors = ['r', 'b', 'k', 'g', 'y', 'c']
        self.firstPlot = True
                
        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()
        
        self.pushButton_3.setEnabled(False)

    def loadCaseData(self):
        filename = '%s/system/controlDict'%self.currentFolder
        self.parsedData = ParsedParameterFile(filename,createZipped=False)
        self.trackingData = []
        if 'functions' in self.parsedData.getValueDict().keys():
            for key in self.parsedData['functions'].keys():
                if self.parsedData['functions'][key]['type'] == 'particleTracking':
                    D = self.parsedData['functions'][key]
                    track = {}
                    track['name'] = key
                    track['tInjStart'] = D['tInjStart'] if D.__contains__('tInjStart') else dicc['tInjStart']  
                    track['tInjEnd'] = D['tInjEnd'] if D.__contains__('tInjEnd') else dicc['tInjEnd']  
                    track['npByDt'] = D['npByDt'] if D.__contains__('npByDt') else dicc['npByDt']  
                    track['center'] = D['center'] if D.__contains__('center') else dicc['center']  
                    track['r0'] = D['r0'] if D.__contains__('r0') else dicc['r0']  
                    track['rho'] = D['rho'] if D.__contains__('rho') else dicc['rho']  
                    track['d'] = D['d'] if D.__contains__('d') else dicc['d']  
                    track['rhop'] = D['rhop'] if D.__contains__('rhop') else dicc['rhop']  
                    track['mu'] = D['mu'] if D.__contains__('mu') else dicc['mu']  
                    track['e'] = D['e'] if D.__contains__('e') else dicc['e']
                    track['outputControl'] = D['outputControl'] if D.__contains__('outputControl') else dicc['outputControl']
                    track['outputInterval'] = D['outputInterval'] if D.__contains__('outputInterval') else dicc['outputInterval']
                    
                    self.trackingData.append(track)
                        
        self.pushButton_3.setEnabled(True)
        

    def refreshTable(self):
        for ii in range(self.tableWidget.columnCount()-1,-1,-1):
            self.tableWidget.removeColumn(ii)
        
        for i in range(len(self.trackingData)):
            self.tableWidget.insertColumn(i)
            N = 13
            items = [QtGui.QTableWidgetItem() for irow in range(N)]
            wdgs = [QtGui.QLineEdit() for irow in range(N-2)]
            
            wdgs[0].setText(str(self.trackingData[i]['name']))
            wdgs[0].setEnabled(False)
            wdgs[1].setText(str(self.trackingData[i]['tInjStart']))
            wdgs[2].setText(str(self.trackingData[i]['tInjEnd']))
            wdgs[3].setText(str(self.trackingData[i]['npByDt']))
            wdgs[4].setText(str(self.trackingData[i]['center']))
            wdgs[5].setText(str(self.trackingData[i]['r0']))
            wdgs[6].setText(str(self.trackingData[i]['rho']))
            wdgs[7].setText(str(self.trackingData[i]['d']))
            wdgs[8].setText(str(self.trackingData[i]['rhop']))
            wdgs[9].setText(str(self.trackingData[i]['mu']))
            wdgs[10].setText(str(self.trackingData[i]['e']))
            
            wdgs.append(QtGui.QComboBox())
            wdgs[11].addItems(outputControlData)
            wdgs[11].setObjectName(str(i))
            wdgs[11].setCurrentIndex(wdgs[11].findText(self.trackingData[i]['outputControl']))

            wdgs.append(QtGui.QSpinBox())
            wdgs[12].setMinimum(1)
            wdgs[12].setMaximum(1000)
            wdgs[12].setValue(self.trackingData[i]['outputInterval'])
            wdgs[12].setEnabled(False) if self.trackingData[i]['outputControl']!='timeStep' else wdgs[12].setEnabled(True)
        
            for irow in range(N):
                if irow in doubleData:
                    wdgs[irow].setValidator(QtGui.QDoubleValidator())
                if irow in intData:
                    wdgs[irow].setValidator(QtGui.QIntValidator())
                if irow in vecData:
                    wdgs[irow].setValidator(QtGui.QRegExpValidator(QtCore.QRegExp("\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}")))
                if irow in lineEdit:
                    QtCore.QObject.connect(wdgs[irow],QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
                if irow in spin:
                    QtCore.QObject.connect(wdgs[irow],QtCore.SIGNAL(_fromUtf8("valueChanged(QString)")), self.checkAccept)
                if irow in comboBox:
                    QtCore.QObject.connect(wdgs[irow], QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.checkAccept)
                    QtCore.QObject.connect(wdgs[irow], QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.change_combobox)
                
                self.tableWidget.setItem(irow,i,items[irow])
                self.tableWidget.setCellWidget(irow,i,wdgs[irow]) 
                
            
        self.pushButton_3.setEnabled(True)

    def refreshTimeline(self):
        if not self.firstPlot:
            self.figureLayout.removeWidget(self.canvas)
            self.canvas.destroy()
            self.canvas.close()

        self.firstPlot = False
        fig = Figure((2.0, 1.5), dpi=100)
        self.canvas = FigureCanvas(fig)
        self.canvas.setParent(self)
        
        self.ax = fig.add_subplot(111)
        self.ax.clear()
        
        #levantar el controlDict y ver los tracers
        
        Tf = float(self.parsedData['endTime'])
        T = float(self.currtime)
        dT = float(self.parsedData['deltaT'])
        self.ax.set_ylim(0,1.1)
        self.ax.set_xlim(-10*dT,Tf)
        self.ax.plot([0,T-dT,T,T+dT,Tf],[0,0,1,0,0], 'k', marker='o', label='Current Time')
        i = 0
        for itrack in self.trackingData:
            Tini = float(itrack['tInjStart']) 
            Tend = float(itrack['tInjEnd']) 
            if Tini<T:
                Tini = T
            if Tend>Tf:
                Tend = Tf
            self.ax.plot([0,Tini-dT/10,Tini,Tend,Tend+dT/10,Tf],[0,0,1,1,0,0], self.colors[i%6], label=itrack['name'])
            i = i+1
        self.ax.set_title('Timeline')
        self.ax.set_xlabel('Time [s]')
        self.ax.set_ylabel('Event')
        self.ax.legend(loc=0, fontsize = 'small')       
        
        self.figureLayout.addWidget(self.canvas)
        
        self.pushButton_3.setEnabled(True)
        
    def change_combobox(self):
        name = str(self.sender().objectName())
        c=self.tableWidget.cellWidget(12,int(name))
        
        if self.sender().currentText()=='timeStep':
            c.setEnabled(True)
        else:
            c.setEnabled(False)
        
        print 'done'
        return

    def newTracer(self):
        i = self.tableWidget.columnCount()
        self.tableWidget.insertColumn(i)
        
        N = 13
        items = [QtGui.QTableWidgetItem() for irow in range(N)]
        wdgs = [QtGui.QLineEdit() for irow in range(N-2)]
        
        wdgs[0].setText(str('newCloud'))
        wdgs[1].setText(str(dicc['tInjStart']))
        wdgs[2].setText(str(dicc['tInjEnd']))
        wdgs[3].setText(str(dicc['npByDt']))
        wdgs[4].setText(str(dicc['center']))
        wdgs[5].setText(str(dicc['r0']))
        wdgs[6].setText(str(dicc['rho']))
        wdgs[7].setText(str(dicc['d']))
        wdgs[8].setText(str(dicc['rhop']))
        wdgs[9].setText(str(dicc['mu']))
        wdgs[10].setText(str(dicc['e']))
        
        wdgs.append(QtGui.QComboBox())
        wdgs[11].addItems(outputControlData)
        wdgs[11].setObjectName(str(i))

        wdgs.append(QtGui.QSpinBox())
        wdgs[12].setMinimum(1)
        wdgs[12].setMaximum(1000)
            
        for irow in range(N):
            if irow in doubleData:
                wdgs[irow].setValidator(QtGui.QDoubleValidator())
            if irow in intData:
                wdgs[irow].setValidator(QtGui.QIntValidator())
            if irow in vecData:
                wdgs[irow].setValidator(QtGui.QRegExpValidator(QtCore.QRegExp("\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}")))
            if irow in lineEdit:
                QtCore.QObject.connect(wdgs[irow],QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
            if irow in spin:
                QtCore.QObject.connect(wdgs[irow],QtCore.SIGNAL(_fromUtf8("valueChanged(QString)")), self.checkAccept)
            if irow in comboBox:
                QtCore.QObject.connect(wdgs[irow], QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.checkAccept)
                QtCore.QObject.connect(wdgs[irow], QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.change_combobox)
            
            self.tableWidget.setItem(irow,i,items[irow])
            self.tableWidget.setCellWidget(irow,i,wdgs[irow]) 
                
        self.pushButton_3.setEnabled(True)
                

    def removeTracer(self):
        ii = self.tableWidget.currentColumn()
        if ii==-1:
            QtGui.QMessageBox.about(self, "ERROR", "None cloud selected")
            return
        w = QtGui.QMessageBox(QtGui.QMessageBox.Information, "Removing", "Do you want to remove all particle cloud data?", QtGui.QMessageBox.Yes|QtGui.QMessageBox.No)
        ret = w.exec_()
        if(QtGui.QMessageBox.Yes == ret):
            self.tableWidget.removeColumn(ii)
            self.drawTracers()
            self.pushButton_3.setEnabled(False)
        return
        
    def saveCaseData(self):
        saved = self.drawTracers()
        if saved:
            self.pushButton_3.setEnabled(False)
        
    def drawTracers(self):

        for i in range(self.tableWidget.columnCount()):
            ct = str(self.tableWidget.cellWidget(4,i).text())
            r0 = str(self.tableWidget.cellWidget(5,i).text())            
            if ct[-1]!=')' or  r0[-1]!=')':
                QtGui.QMessageBox.about(self, "Error", "Wrong regular expression in vector type")
                return False
                
            tini = float(self.tableWidget.cellWidget(1,i).text())
            tend = float(self.tableWidget.cellWidget(2,i).text())
            
            if tend<tini:
                QtGui.QMessageBox.about(self, "ERROR", "Wrong seeding interval")
                return False                

        for dd in self.trackingData:
            del self.parsedData['functions'][dd['name']]
        
        if 'functions' not in self.parsedData.getValueDict().keys():
            self.parsedData['functions'] = {}
            
        for i in range(self.tableWidget.columnCount()):
            track = copy.deepcopy(dicc)
            
            keyname =  str(self.tableWidget.cellWidget(0,i).text())
            track['tInjStart'] = str(self.tableWidget.cellWidget(1,i).text())
            track['tInjEnd'] = str(self.tableWidget.cellWidget(2,i).text())
            track['npByDt'] = str(self.tableWidget.cellWidget(3,i).text())
            track['center'] = str(self.tableWidget.cellWidget(4,i).text())
            track['r0'] = str(self.tableWidget.cellWidget(5,i).text())
            track['rho'] = str(self.tableWidget.cellWidget(6,i).text())
            track['d'] = str(self.tableWidget.cellWidget(7,i).text())
            track['rhop'] = str(self.tableWidget.cellWidget(8,i).text())
            track['mu'] = str(self.tableWidget.cellWidget(9,i).text())
            track['e'] = str(self.tableWidget.cellWidget(10,i).text())
            track['outputControl'] = str(self.tableWidget.cellWidget(11,i).currentText()) #TODO: ver aca que va
            track['outputInterval'] = str(self.tableWidget.cellWidget(12,i).value())
            
            while keyname in self.parsedData['functions'].keys():
                keyname = keyname+'1'                
            self.parsedData['functions'][keyname] = track
            
        self.parsedData.writeFile()

        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()
        
        return True
        
    def checkAccept(self):
        
        ready = True
        edits = self.findChildren(QtGui.QLineEdit)
        for E in edits:
            if E.isEnabled():
                if not E.text():
                        ready = False
        if ready:
            self.pushButton_3.setEnabled(True)
        else:
            self.pushButton_3.setEnabled(False)
Пример #26
0
class tracers(tracersUI):

    def __init__(self, currentFolder):
        tracersUI.__init__(self)
        self.currentFolder = currentFolder
        [self.timedir,fields,self.currtime] = utils.currentFields(str(self.currentFolder))
        
        self.patches = []
        self.emptys = []
        self.colors = ['r', 'b', 'k', 'g', 'y', 'c']
        self.firstPlot = True
                
        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()

    def loadCaseData(self):
        filename = '%s/system/controlDict'%self.currentFolder
        self.parsedData = ParsedParameterFile(filename,createZipped=False)
        self.tracersData = []
        if 'functions' in self.parsedData.getValueDict().keys():
            for key in self.parsedData['functions'].keys():
                if self.parsedData['functions'][key]['type'] == 'scalarTransport':
                    tracer = {}
                    tracer['name'] = key
                    tracer['patchName'] = self.parsedData['functions'][key]['patchName']
                    tracer['startTime'] = self.parsedData['functions'][key]['fvOptions']['S']['timeStart']
                    self.tracersData.append(tracer)
                        
        if self.patches==[]:
            filename = '%s/U'%(self.timedir)
            UData = ParsedParameterFile(filename,createZipped=False)
            self.patches = UData['boundaryField'].keys()
            for ipatch in self.patches:
                if UData['boundaryField'][ipatch]['type']=='empty':
                    self.emptys.append(ipatch)
        

    def refreshTable(self):
        for ii in range(self.tableWidget.rowCount()-1,-1,-1):
            self.tableWidget.removeRow(ii)
        
        for i in range(len(self.tracersData)):
            self.tableWidget.insertRow(i)
            item1 = QtGui.QTableWidgetItem()
            item2 = QtGui.QTableWidgetItem()
            wdg1 = QtGui.QLineEdit()
            wdg2 = QtGui.QComboBox()
            wdg2.addItems(list(set(self.patches)-set(self.emptys)))
            
            wdg1.setText(str(self.tracersData[i]['startTime']))
            wdg2.setCurrentIndex(wdg2.findText(self.tracersData[i]['patchName']))
                
            self.tableWidget.setItem(i,0,item1)
            self.tableWidget.setCellWidget(i,0,wdg1) 
            self.tableWidget.setItem(i,1,item2)
            self.tableWidget.setCellWidget(i,1,wdg2)

    def refreshTimeline(self):
        if not self.firstPlot:
            self.figureLayout.removeWidget(self.canvas)

        self.firstPlot = False
        fig = Figure((2.0, 1.5), dpi=100)
        self.canvas = FigureCanvas(fig)
        self.canvas.setParent(self)
        
        self.ax = fig.add_subplot(111)
        self.ax.clear()
        
        #levantar el controlDict y ver los tracers
        
        Tf = float(self.parsedData['endTime'])
        T = float(self.currtime)
        dT = float(self.parsedData['deltaT'])
        self.ax.set_ylim(0,1.1)
        self.ax.set_xlim(-10*dT,Tf)
        self.ax.plot([0,T-dT,T,T+dT,Tf],[0,0,1,0,0], 'k', marker='o', label='Current Time')
        i = 0
        for itracer in self.tracersData:
            Tini = float(itracer['startTime']) 
            if float(itracer['startTime'])<T:
                Tini = T
            self.ax.plot([0,Tini,Tini+dT,Tf],[0,0,1,1], self.colors[i%6], label=itracer['name'])
            i = i+1
        self.ax.set_title('Timeline')
        self.ax.set_xlabel('Time [s]')
        self.ax.set_ylabel('Event')
        self.ax.legend(loc=0, fontsize = 'small')       
        
        self.figureLayout.addWidget(self.canvas)

    def newTracer(self):
        i = self.tableWidget.rowCount()
        self.tableWidget.insertRow(i)
        item1 = QtGui.QTableWidgetItem()
        item2 = QtGui.QTableWidgetItem()
        wdg1 = QtGui.QLineEdit()
        wdg2 = QtGui.QComboBox()
        wdg2.addItems(list(set(self.patches)-set(self.emptys)))
        wdg1.setText('0')
        self.tableWidget.setItem(i,0,item1)
        self.tableWidget.setCellWidget(i,0,wdg1) 
        self.tableWidget.setItem(i,1,item2)
        self.tableWidget.setCellWidget(i,1,wdg2)
                

    def removeTracer(self):
        ii = self.tableWidget.currentRow()
        self.tableWidget.removeRow(ii)
        return
        
    def saveCaseData(self, doTopoSet=False):

        for dd in self.tracersData:
            del self.parsedData['functions'][dd['name']]
        
        if 'functions' not in self.parsedData.getValueDict().keys():
            self.parsedData['functions'] = {}
            
        patches = []
        for i in range(self.tableWidget.rowCount()):
            patchName = str(self.tableWidget.cellWidget(i,1).currentText())
            newkey = 'T%s'%str(i)
            tracer = copy.deepcopy(dicc)
            cellsetname = '%s_c'%patchName
            
            tracer['fvOptions']['S']['timeStart'] = str(self.tableWidget.cellWidget(i,0).text())
            tracer['fvOptions']['S']['cellSet'] = cellsetname
            tracer['patchName'] = patchName
            del tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs']['injectionRate']['T0']
            tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs']['injectionRate'][newkey] = '1'            
            self.parsedData['functions'][newkey] = tracer
            patches.append(patchName)
        self.parsedData.writeFile()
        #self.parsedData.closeFile()
        
        if doTopoSet:
            spatches = set(patches)
            ii = 0
            cmd = 'cp %s/caseDicts/topoSetDict %s/system/.'%(os.path.dirname(__file__),self.currentFolder)
            os.system(cmd)
            
            filename = '%s/system/topoSetDict'%self.currentFolder
            topoSetData = ParsedParameterFile(filename,createZipped=False)        
            
            #armo el topoSet de manera de generar los cellSet deseados
            for ipatch in spatches:
                cellsetname = '%s_c'%ipatch
                facesetname = '%s_f'%ipatch
                if not os.path.isfile('%s/constant/polyMesh/sets/%s'%(self.currentFolder,cellsetname)):
                    if ii>0:
                        topoSetData['actions'].append(topoSetData['actions'][0])
                        topoSetData['actions'].append(topoSetData['actions'][1])
                    topoSetData['actions'][ii]['name'] = facesetname
                    topoSetData['actions'][ii]['sourceInfo']['name'] = ipatch
                    topoSetData['actions'][ii+1]['name'] = cellsetname
                    topoSetData['actions'][ii+1]['sourceInfo']['set'] = facesetname                
                    ii = ii+2
            topoSetData.writeFile()
                        
            cmd = 'topoSet -case %s > run_topoSet.log &'%self.currentFolder
            os.system(cmd)
        else:
            self.loadCaseData()
            self.refreshTable()
            self.refreshTimeline()
        return
Пример #27
0
class figureTracers(figureTracersUI):

    def __init__(self, currentFolder):
        figureTracersUI.__init__(self)
        self.currentFolder = currentFolder
        self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False)
        
        [self.timedir,self.fields,bas] = currentFields(self.currentFolder)
        
        filename = '%s/system/controlDict'%self.currentFolder
        self.parsedData = ParsedParameterFile(filename,createZipped=False)
        
        self.tracersData = []
        if 'functions' in self.parsedData.getValueDict().keys():
            for key in self.parsedData['functions'].keys():
                if self.parsedData['functions'][key]['type'] == 'scalarTransport':
                    tracer = {}
                    tracer['name'] = key
                    tracer['patchName'] = self.parsedData['functions'][key]['patchName']
                    tracer['startTime'] = self.parsedData['functions'][key]['fvOptions']['S']['timeStart']
                    self.tracersData.append(tracer)

        for tracer in self.tracersData:
            item = QtGui.QListWidgetItem()
            item.setCheckState(QtCore.Qt.Unchecked)
            item.setText(tracer['name'])
            self.listWidget.addItem(item)
            
        from PyFoam.RunDictionary.BoundaryDict import BoundaryDict
        boundaries = BoundaryDict(str(self.currentFolder))
        for ipatch in boundaries.getValueDict():
            if boundaries[ipatch]['type']  != 'empty':
                self.comboBox.addItem(ipatch)
        
    def getData(self):
        data = {}
        data['name'] = str(self.name.text())
        data['nsteps'] = self.spinBox.value()        
        data['fields'] = []
        for i in range(self.listWidget.count()):
            if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
                data['fields'].append(self.listWidget.item(i).text())
        
        return data
        
    def setData(self, data):
        #buscar en el controlDict el function object 'name'
        filename = '%s/system/controlDict'%(self.currentFolder)
        parsedData = ParsedParameterFile(filename,createZipped=False)
        if 'functions' in parsedData.getValueDict().keys():
            if data['name'] in parsedData['functions'].keys():
                dicc = parsedData['functions'][data['name']]
                if dicc['type']=='faceSource':
                    self.name.setText(data['name'])
                    self.spinBox.setValue(dicc['outputInterval'])
                    for i in range(self.listWidget.count()):
                        if self.listWidget.item(i) in dicc['fields']:
                            self.listWidget.item(i).setCheckState(QtCore.Qt.Checked)
                        else:
                            self.listWidget.item(i).setCheckState(QtCore.Qt.Unchecked)
        
    def ckeckAccept(self, evnt):

        allow = False
        for i in range(self.listWidget.count()):
            if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
                allow = True
                break
        if allow:
            self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True)
        else:
            self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False)
            
    def accept(self):
        filename = '%s/system/controlDict'%(self.currentFolder)
        parsedData = ParsedParameterFile(filename,createZipped=False)
        if 'functions' not in parsedData.getValueDict().keys():
            parsedData['functions'] = {}
        
        dicc['outputInterval'] = self.spinBox.value()
        fields = []        
        for i in range(self.listWidget.count()):
            if self.listWidget.item(i).checkState() == QtCore.Qt.Checked:
                fields.append(str(self.listWidget.item(i).text()))
        dicc['fields'] = fields
        dicc['sourceName'] = str(self.comboBox.currentText())        
        parsedData['functions'][str(self.name.text())] = dicc
        parsedData.writeFile()
        
        self.done(self.Accepted)
Пример #28
0
class tracers(tracersUI):
    def __init__(self, currentFolder):
        tracersUI.__init__(self)
        self.currentFolder = currentFolder
        [self.timedir, fields,
         self.currtime] = utils.currentFields(str(self.currentFolder))

        self.patches = []
        self.emptys = []
        self.colors = ['r', 'b', 'k', 'g', 'y', 'c']
        self.firstPlot = True

        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()

    def loadCaseData(self):
        filename = '%s/system/controlDict' % self.currentFolder
        self.parsedData = ParsedParameterFile(filename, createZipped=False)
        self.tracersData = []
        if 'functions' in self.parsedData.getValueDict().keys():
            for key in self.parsedData['functions'].keys():
                if self.parsedData['functions'][key][
                        'type'] == 'scalarTransport':
                    tracer = {}
                    tracer['name'] = key
                    tracer['patchName'] = self.parsedData['functions'][key][
                        'patchName']
                    tracer['startTime'] = self.parsedData['functions'][key][
                        'fvOptions']['S']['timeStart']
                    self.tracersData.append(tracer)

        if self.patches == []:
            filename = '%s/U' % (self.timedir)
            UData = ParsedParameterFile(filename, createZipped=False)
            self.patches = UData['boundaryField'].keys()
            for ipatch in self.patches:
                if UData['boundaryField'][ipatch]['type'] == 'empty':
                    self.emptys.append(ipatch)

    def refreshTable(self):
        for ii in range(self.tableWidget.rowCount() - 1, -1, -1):
            self.tableWidget.removeRow(ii)

        for i in range(len(self.tracersData)):
            self.tableWidget.insertRow(i)
            item1 = QtGui.QTableWidgetItem()
            item2 = QtGui.QTableWidgetItem()
            wdg1 = QtGui.QLineEdit()
            wdg2 = QtGui.QComboBox()
            wdg2.addItems(list(set(self.patches) - set(self.emptys)))

            wdg1.setText(str(self.tracersData[i]['startTime']))
            wdg2.setCurrentIndex(
                wdg2.findText(self.tracersData[i]['patchName']))

            self.tableWidget.setItem(i, 0, item1)
            self.tableWidget.setCellWidget(i, 0, wdg1)
            self.tableWidget.setItem(i, 1, item2)
            self.tableWidget.setCellWidget(i, 1, wdg2)

    def refreshTimeline(self):
        if not self.firstPlot:
            self.figureLayout.removeWidget(self.canvas)

        self.firstPlot = False
        fig = Figure((2.0, 1.5), dpi=100)
        self.canvas = FigureCanvas(fig)
        self.canvas.setParent(self)

        self.ax = fig.add_subplot(111)
        self.ax.clear()

        #levantar el controlDict y ver los tracers

        Tf = float(self.parsedData['endTime'])
        T = float(self.currtime)
        dT = float(self.parsedData['deltaT'])
        self.ax.set_ylim(0, 1.1)
        self.ax.set_xlim(-10 * dT, Tf)
        self.ax.plot([0, T - dT, T, T + dT, Tf], [0, 0, 1, 0, 0],
                     'k',
                     marker='o',
                     label='Current Time')
        i = 0
        for itracer in self.tracersData:
            Tini = float(itracer['startTime'])
            if float(itracer['startTime']) < T:
                Tini = T
            self.ax.plot([0, Tini, Tini + dT, Tf], [0, 0, 1, 1],
                         self.colors[i % 6],
                         label=itracer['name'])
            i = i + 1
        self.ax.set_title('Timeline')
        self.ax.set_xlabel('Time [s]')
        self.ax.set_ylabel('Event')
        self.ax.legend(loc=0, fontsize='small')

        self.figureLayout.addWidget(self.canvas)

    def newTracer(self):
        i = self.tableWidget.rowCount()
        self.tableWidget.insertRow(i)
        item1 = QtGui.QTableWidgetItem()
        item2 = QtGui.QTableWidgetItem()
        wdg1 = QtGui.QLineEdit()
        wdg2 = QtGui.QComboBox()
        wdg2.addItems(list(set(self.patches) - set(self.emptys)))
        wdg1.setText('0')
        self.tableWidget.setItem(i, 0, item1)
        self.tableWidget.setCellWidget(i, 0, wdg1)
        self.tableWidget.setItem(i, 1, item2)
        self.tableWidget.setCellWidget(i, 1, wdg2)

    def removeTracer(self):
        ii = self.tableWidget.currentRow()
        self.tableWidget.removeRow(ii)
        return

    def saveCaseData(self, doTopoSet=False):

        for dd in self.tracersData:
            del self.parsedData['functions'][dd['name']]

        if 'functions' not in self.parsedData.getValueDict().keys():
            self.parsedData['functions'] = {}

        patches = []
        for i in range(self.tableWidget.rowCount()):
            patchName = str(self.tableWidget.cellWidget(i, 1).currentText())
            newkey = 'T%s' % str(i)
            tracer = copy.deepcopy(dicc)
            cellsetname = '%s_c' % patchName

            tracer['fvOptions']['S']['timeStart'] = str(
                self.tableWidget.cellWidget(i, 0).text())
            tracer['fvOptions']['S']['cellSet'] = cellsetname
            tracer['patchName'] = patchName
            del tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs'][
                'injectionRate']['T0']
            tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs'][
                'injectionRate'][newkey] = '1'
            self.parsedData['functions'][newkey] = tracer
            patches.append(patchName)
        self.parsedData.writeFile()
        #self.parsedData.closeFile()

        if doTopoSet:
            spatches = set(patches)
            ii = 0
            cmd = 'cp caseDicts/topoSetDict %s/system/.' % self.currentFolder
            os.system(cmd)

            filename = '%s/system/topoSetDict' % self.currentFolder
            topoSetData = ParsedParameterFile(filename, createZipped=False)

            #armo el topoSet de manera de generar los cellSet deseados
            for ipatch in spatches:
                cellsetname = '%s_c' % ipatch
                facesetname = '%s_f' % ipatch
                if not os.path.isfile('%s/constant/polyMesh/sets/%s' %
                                      (self.currentFolder, cellsetname)):
                    if ii > 0:
                        topoSetData['actions'].append(
                            topoSetData['actions'][0])
                        topoSetData['actions'].append(
                            topoSetData['actions'][1])
                    topoSetData['actions'][ii]['name'] = facesetname
                    topoSetData['actions'][ii]['sourceInfo']['name'] = ipatch
                    topoSetData['actions'][ii + 1]['name'] = cellsetname
                    topoSetData['actions'][
                        ii + 1]['sourceInfo']['set'] = facesetname
                    ii = ii + 2
            topoSetData.writeFile()

            cmd = 'topoSet -case %s > run_topoSet.log &' % self.currentFolder
            os.system(cmd)
        else:
            self.loadCaseData()
            self.refreshTable()
            self.refreshTimeline()
        return
Пример #29
0
class tracers(tracersUI):
    def __init__(self, currentFolder, nproc):
        tracersUI.__init__(self)
        self.currentFolder = currentFolder
        self.nproc = nproc
        [self.timedir, fields,
         self.currtime] = utils.currentFields(str(self.currentFolder),
                                              nproc=self.nproc)

        self.patches = []
        self.emptys = []
        self.colors = ['r', 'b', 'k', 'g', 'y', 'c']
        self.firstPlot = True

        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()

        self.pushButton_3.setEnabled(False)

    def loadCaseData(self):
        filename = '%s/system/controlDict' % self.currentFolder
        backupFile(filename)
        self.parsedData = ParsedParameterFile(filename, createZipped=False)
        self.tracersData = []
        if 'functions' in self.parsedData.getValueDict().keys():
            for key in self.parsedData['functions'].keys():
                if self.parsedData['functions'][key][
                        'type'] == 'scalarTransport':
                    tracer = {}
                    tracer['name'] = key
                    tracer['patchName'] = self.parsedData['functions'][key][
                        'patchName']
                    tracer['startTime'] = self.parsedData['functions'][key][
                        'fvOptions']['S']['timeStart']
                    #TODO: cargar aca
                    if tracer['patchName'] == 'box':
                        tracer['p0'] = self.parsedData['functions'][key][
                            'fvOptions']['S']['p0']
                        tracer['p1'] = self.parsedData['functions'][key][
                            'fvOptions']['S']['p1']
                    self.tracersData.append(tracer)

        if self.patches == []:
            boundaries = BoundaryDict(str(self.currentFolder))
            self.patches = boundaries.patches()
            for ipatch in self.patches:
                if boundaries[ipatch]['type'] == 'empty':
                    self.emptys.append(ipatch)

        self.pushButton_3.setEnabled(True)

    def refreshTable(self):
        for ii in range(self.tableWidget.rowCount() - 1, -1, -1):
            self.tableWidget.removeRow(ii)

        for i in range(len(self.tracersData)):
            self.tableWidget.insertRow(i)
            item1 = QtGui.QTableWidgetItem()
            item2 = QtGui.QTableWidgetItem()
            item3 = QtGui.QTableWidgetItem()
            item4 = QtGui.QTableWidgetItem()
            wdg1 = QtGui.QLineEdit()
            wdg2 = QtGui.QComboBox()
            wdg3 = QtGui.QLineEdit()
            wdg4 = QtGui.QLineEdit()
            wdg2.addItems(list(set(self.patches) - set(self.emptys)))
            wdg2.addItem('box')
            wdg2.setObjectName(str(i))

            wdg1.setText(str(self.tracersData[i]['startTime']))
            wdg2.setCurrentIndex(
                wdg2.findText(self.tracersData[i]['patchName']))
            #TODO: Hay que ver como cagarlo del archivo, preguntar a juan
            wdg3.setText(str(self.tracersData[i]['p0'])) if self.tracersData[
                i]['patchName'] == 'box' else wdg3.setText("(0 0 0)")
            wdg4.setText(str(self.tracersData[i]['p1'])) if self.tracersData[
                i]['patchName'] == 'box' else wdg4.setText("(0 0 0)")

            wdg3.setEnabled(False) if self.tracersData[i][
                'patchName'] != 'box' else wdg3.setEnabled(True)
            wdg4.setEnabled(False) if self.tracersData[i][
                'patchName'] != 'box' else wdg4.setEnabled(True)
            QtCore.QObject.connect(
                wdg2, QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
                self.change_combobox)
            wdg3.setValidator(
                QtGui.QRegExpValidator(
                    QtCore.QRegExp(
                        "\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}"
                    )))
            wdg4.setValidator(
                QtGui.QRegExpValidator(
                    QtCore.QRegExp(
                        "\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}"
                    )))
            QtCore.QObject.connect(
                wdg1, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
                self.checkAccept)
            QtCore.QObject.connect(
                wdg2, QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
                self.checkAccept)
            QtCore.QObject.connect(
                wdg3, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
                self.checkAccept)
            QtCore.QObject.connect(
                wdg4, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
                self.checkAccept)

            self.tableWidget.setItem(i, 0, item1)
            self.tableWidget.setCellWidget(i, 0, wdg1)
            self.tableWidget.setItem(i, 1, item2)
            self.tableWidget.setCellWidget(i, 1, wdg2)
            self.tableWidget.setItem(i, 2, item3)
            self.tableWidget.setCellWidget(i, 2, wdg3)
            self.tableWidget.setItem(i, 3, item4)
            self.tableWidget.setCellWidget(i, 3, wdg4)

        self.pushButton_3.setEnabled(True)

    def refreshTimeline(self):
        if not self.firstPlot:
            self.figureLayout.removeWidget(self.canvas)
            self.canvas.destroy()
            self.canvas.close()

        self.firstPlot = False
        fig = Figure((2.0, 1.5), dpi=100)
        self.canvas = FigureCanvas(fig)
        #self.canvas.setParent(self)

        self.ax = fig.add_subplot(111)
        self.ax.clear()

        #levantar el controlDict y ver los tracers

        Tf = float(self.parsedData['endTime'])
        T = float(self.currtime)
        dT = float(self.parsedData['deltaT'])
        self.ax.set_ylim(0, 1.1)
        self.ax.set_xlim(-10 * dT, Tf)
        self.ax.plot([0, T - dT, T, T + dT, Tf], [0, 0, 1, 0, 0],
                     'k',
                     marker='o',
                     label='Current Time')
        i = 0
        for itracer in self.tracersData:
            Tini = float(itracer['startTime'])
            if float(itracer['startTime']) < T:
                Tini = T
            self.ax.plot([0, Tini, Tini + dT, Tf], [0, 0, 1, 1],
                         self.colors[i % 6],
                         label=itracer['name'])
            i = i + 1
        self.ax.set_title('Timeline')
        self.ax.set_xlabel('Time [s]')
        self.ax.set_ylabel('Event')
        self.ax.legend(loc=0, fontsize='small')

        self.figureLayout.addWidget(self.canvas)

        self.pushButton_3.setEnabled(True)
        return

    def change_combobox(self):
        name = str(self.sender().objectName())
        c1 = self.tableWidget.cellWidget(int(name), 2)
        c2 = self.tableWidget.cellWidget(int(name), 3)

        if self.sender().currentText() == 'box':
            c1.setEnabled(True)
            c2.setEnabled(True)
        else:
            c1.setEnabled(False)
            c2.setEnabled(False)

        print 'done'
        return

    def newTracer(self):
        i = self.tableWidget.rowCount()
        self.tableWidget.insertRow(i)
        item1 = QtGui.QTableWidgetItem()
        item2 = QtGui.QTableWidgetItem()
        item3 = QtGui.QTableWidgetItem()
        item4 = QtGui.QTableWidgetItem()
        wdg1 = QtGui.QLineEdit()
        wdg2 = QtGui.QComboBox()
        wdg3 = QtGui.QLineEdit()
        wdg4 = QtGui.QLineEdit()
        wdg2.addItems(list(set(self.patches) - set(self.emptys)))
        wdg2.addItem('box')
        wdg2.setObjectName(str(i))
        wdg3.setEnabled(False)
        wdg4.setEnabled(False)
        wdg1.setText('0')
        wdg3.setText('(0 0 0)')
        wdg4.setText('(0 0 0)')
        QtCore.QObject.connect(
            wdg2, QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
            self.change_combobox)
        wdg3.setValidator(
            QtGui.QRegExpValidator(
                QtCore.QRegExp(
                    "\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}"
                )))
        wdg4.setValidator(
            QtGui.QRegExpValidator(
                QtCore.QRegExp(
                    "\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}"
                )))
        QtCore.QObject.connect(
            wdg1, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
            self.checkAccept)
        QtCore.QObject.connect(
            wdg2, QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")),
            self.checkAccept)
        QtCore.QObject.connect(
            wdg3, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
            self.checkAccept)
        QtCore.QObject.connect(
            wdg4, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")),
            self.checkAccept)
        self.tableWidget.setItem(i, 0, item1)
        self.tableWidget.setCellWidget(i, 0, wdg1)
        self.tableWidget.setItem(i, 1, item2)
        self.tableWidget.setCellWidget(i, 1, wdg2)
        self.tableWidget.setItem(i, 2, item3)
        self.tableWidget.setCellWidget(i, 2, wdg3)
        self.tableWidget.setItem(i, 3, item4)
        self.tableWidget.setCellWidget(i, 3, wdg4)

        self.pushButton_3.setEnabled(True)

    def removeTracer(self):
        ii = self.tableWidget.currentRow()
        if ii == -1:
            QtGui.QMessageBox.about(self, "ERROR", "No tracer selected")
            return
        w = QtGui.QMessageBox(QtGui.QMessageBox.Information, "Removing",
                              "Do you want to remove tracer data?",
                              QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        ret = w.exec_()
        if (QtGui.QMessageBox.Yes == ret):
            self.tableWidget.removeRow(ii)
            self.drawTracers()
            self.pushButton_3.setEnabled(False)
        return

    def saveCaseData(self):
        saved = self.drawTracers(True)
        if saved:
            self.pushButton_3.setEnabled(False)

    def drawTracers(self, doTopoSet=False):

        #Estoy obligado a hacer esto antes porque si lo hago durante la escritura
        #de datos, me pueden quedar datos a mitad de escritura y corruptos
        for i in range(self.tableWidget.rowCount()):
            patchName = str(self.tableWidget.cellWidget(i, 1).currentText())
            if patchName == 'box':
                if str(self.tableWidget.cellWidget(
                        i, 2).text())[-1] != ')' or str(
                            self.tableWidget.cellWidget(i,
                                                        3).text())[-1] != ')':
                    tracer = 'T%s' % str(i)
                    QtGui.QMessageBox.about(
                        self, "Error",
                        "Wrong regular expression in " + tracer + "!")
                    return False

        for dd in self.tracersData:
            del self.parsedData['functions'][dd['name']]

        if 'functions' not in self.parsedData.getValueDict().keys():
            self.parsedData['functions'] = {}

        patches = []
        for i in range(self.tableWidget.rowCount()):
            patchName = str(self.tableWidget.cellWidget(i, 1).currentText())
            newkey = 'T%s' % str(i)
            cellsetname = '%s_c' % newkey
            tracer = copy.deepcopy(dicc)

            tracer['fvOptions']['S']['timeStart'] = str(
                self.tableWidget.cellWidget(i, 0).text())
            tracer['fvOptions']['S']['cellSet'] = cellsetname
            tracer['patchName'] = patchName
            if patchName == 'box':
                tracer['fvOptions']['S']['p0'] = {} if 'p0' not in tracer[
                    'fvOptions']['S'].keys() else None
                tracer['fvOptions']['S']['p1'] = {} if 'p1' not in tracer[
                    'fvOptions']['S'].keys() else None
                #TODO: Verificar que sea correcto el punto

                tracer['fvOptions']['S']['p0'] = str(
                    self.tableWidget.cellWidget(i, 2).text())
                tracer['fvOptions']['S']['p1'] = str(
                    self.tableWidget.cellWidget(i, 3).text())

            del tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs'][
                'injectionRate']['T0']
            tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs'][
                'injectionRate'][newkey] = '1'
            self.parsedData['functions'][newkey] = tracer
            patches.append(patchName)
        self.parsedData.writeFile()

        if doTopoSet:
            ii = 0
            cmd = 'cp %s/caseDicts/topoSetDict %s/system/.' % (os.path.dirname(
                os.path.realpath(__file__)), self.currentFolder)
            os.system(cmd)

            filename = '%s/system/topoSetDict' % self.currentFolder
            topoSetData = ParsedParameterFile(filename, createZipped=False)

            #armo el topoSet de manera de generar los cellSet deseados
            for i in range(self.tableWidget.rowCount()):
                newkey = 'T%s' % str(i)
                patchName = str(
                    self.tableWidget.cellWidget(i, 1).currentText())
                cellsetname = '%s_c' % newkey
                facesetname = '%s_f' % newkey
                if patchName != 'box':
                    topoSetData['actions'].append(dic_patchToFace)
                    topoSetData['actions'].append(dic_faceToCell)
                    topoSetData['actions'][ii]['name'] = facesetname
                    topoSetData['actions'][ii]['sourceInfo'][
                        'name'] = patchName
                    topoSetData['actions'][ii + 1]['name'] = cellsetname
                    topoSetData['actions'][
                        ii + 1]['sourceInfo']['set'] = facesetname
                    ii = ii + 2
                else:
                    p0 = str(self.tableWidget.cellWidget(i, 2).text())
                    p1 = str(self.tableWidget.cellWidget(i, 3).text())
                    topoSetData['actions'].append(copy.deepcopy(dic_boxToCell))
                    topoSetData['actions'][ii]['name'] = cellsetname
                    topoSetData['actions'][ii]['sourceInfo'][
                        'box'] = p0 + ' ' + p1
                    ii = ii + 1
            topoSetData.writeFile()

            cmd = 'topoSet -case %s > %s/run_topoSet.log &' % (
                self.currentFolder, self.currentFolder)
            self.threadtopoSet = ExampleThread(cmd)
            self.connect(self.threadtopoSet, QtCore.SIGNAL("finished()"),
                         self.verifyCells)
            self.connect(self.threadtopoSet, QtCore.SIGNAL("finished()"),
                         self.threadtopoSet.terminate)
            self.threadtopoSet.start()

        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()

        return True

    def verifyCells(self):
        from os import listdir
        from os.path import isfile, join
        folder = '%s/constant/polyMesh/sets' % self.currentFolder
        files = [f for f in listdir(folder) if isfile(join(folder, f))]
        empties = []
        for ifile in files:
            if '_c' in ifile:
                filename = folder + '/' + ifile
                cmd = "grep -in '(' %s" % filename
                proc = subprocess.Popen([cmd],
                                        stdout=subprocess.PIPE,
                                        shell=True)
                (out, err) = proc.communicate()
                out = out.replace(":(", "").replace("\n", "")
                out = int(out) - 1
                cmd = "awk \"NR==%s\" %s" % (str(out), filename)
                proc = subprocess.Popen([cmd],
                                        stdout=subprocess.PIPE,
                                        shell=True)
                (out, err) = proc.communicate()
                out = out.replace("\n", "")
                if int(out) == 0:
                    empties.append(ifile.replace("_c", ""))

        if empties != []:
            strempties = ' '.join(empties)
            w = QtGui.QMessageBox(
                QtGui.QMessageBox.Warning, "Warning",
                "The tracer(s) " + strempties + " generated 0 cells!")
            w.exec_()

        return

    def checkAccept(self):

        ready = True
        edits = self.findChildren(QtGui.QLineEdit)
        for E in edits:
            if E.isEnabled():
                if not E.text():
                    ready = False
        if ready:
            self.pushButton_3.setEnabled(True)
        else:
            self.pushButton_3.setEnabled(False)
Пример #30
0
class tracers(tracersUI):

    def __init__(self, currentFolder, nproc):
        tracersUI.__init__(self)
        self.currentFolder = currentFolder
        self.nproc = nproc
        [self.timedir,fields,self.currtime] = utils.currentFields(str(self.currentFolder),nproc=self.nproc)
        
        self.patches = []
        self.emptys = []
        self.colors = ['r', 'b', 'k', 'g', 'y', 'c']
        self.firstPlot = True
                
        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()
        
        self.pushButton_3.setEnabled(False)

    def loadCaseData(self):
        filename = '%s/system/controlDict'%self.currentFolder
        backupFile(filename)
        self.parsedData = ParsedParameterFile(filename,createZipped=False)
        self.tracersData = []
        if 'functions' in self.parsedData.getValueDict().keys():
            for key in self.parsedData['functions'].keys():
                if self.parsedData['functions'][key]['type'] == 'scalarTransport':
                    tracer = {}
                    tracer['name'] = key
                    tracer['patchName'] = self.parsedData['functions'][key]['patchName']
                    tracer['startTime'] = self.parsedData['functions'][key]['fvOptions']['S']['timeStart']
                    #TODO: cargar aca
                    if tracer['patchName']=='box':
                        tracer['p0'] = self.parsedData['functions'][key]['fvOptions']['S']['p0']
                        tracer['p1']     = self.parsedData['functions'][key]['fvOptions']['S']['p1']
                    self.tracersData.append(tracer)
                        
        if self.patches==[]:
            boundaries = BoundaryDict(str(self.currentFolder))
            self.patches = boundaries.patches()
            for ipatch in self.patches:
                if boundaries[ipatch]['type']=='empty':
                    self.emptys.append(ipatch)
                    
        self.pushButton_3.setEnabled(True)
        

    def refreshTable(self):
        for ii in range(self.tableWidget.rowCount()-1,-1,-1):
            self.tableWidget.removeRow(ii)
        
        for i in range(len(self.tracersData)):
            self.tableWidget.insertRow(i)
            item1 = QtGui.QTableWidgetItem()
            item2 = QtGui.QTableWidgetItem()
            item3 = QtGui.QTableWidgetItem()
            item4 = QtGui.QTableWidgetItem()
            wdg1 = QtGui.QLineEdit()
            wdg2 = QtGui.QComboBox()
            wdg3 = QtGui.QLineEdit()
            wdg4 = QtGui.QLineEdit()
            wdg2.addItems(list(set(self.patches)-set(self.emptys)))
            wdg2.addItem('box')
            wdg2.setObjectName(str(i))
            
            wdg1.setText(str(self.tracersData[i]['startTime']))
            wdg2.setCurrentIndex(wdg2.findText(self.tracersData[i]['patchName']))
            #TODO: Hay que ver como cagarlo del archivo, preguntar a juan
            wdg3.setText(str(self.tracersData[i]['p0'])) if self.tracersData[i]['patchName']=='box' else wdg3.setText("(0 0 0)")
            wdg4.setText(str(self.tracersData[i]['p1'])) if self.tracersData[i]['patchName']=='box' else wdg4.setText("(0 0 0)")
            
            wdg3.setEnabled(False) if self.tracersData[i]['patchName']!='box' else wdg3.setEnabled(True)
            wdg4.setEnabled(False) if self.tracersData[i]['patchName']!='box' else wdg4.setEnabled(True)
            QtCore.QObject.connect(wdg2, QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.change_combobox)
            wdg3.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp("\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}")))
            wdg4.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp("\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}")))
            QtCore.QObject.connect(wdg1,QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
            QtCore.QObject.connect(wdg2,QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.checkAccept)
            QtCore.QObject.connect(wdg3,QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
            QtCore.QObject.connect(wdg4,QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
            
            self.tableWidget.setItem(i,0,item1)
            self.tableWidget.setCellWidget(i,0,wdg1)
            self.tableWidget.setItem(i,1,item2)
            self.tableWidget.setCellWidget(i,1,wdg2)
            self.tableWidget.setItem(i,2,item3)
            self.tableWidget.setCellWidget(i,2,wdg3)
            self.tableWidget.setItem(i,3,item4)
            self.tableWidget.setCellWidget(i,3,wdg4)
            
        self.pushButton_3.setEnabled(True)

    def refreshTimeline(self):
        if not self.firstPlot:
            self.figureLayout.removeWidget(self.canvas)
            self.canvas.destroy()
            self.canvas.close()

        self.firstPlot = False
        fig = Figure((2.0, 1.5), dpi=100)
        self.canvas = FigureCanvas(fig)
        #self.canvas.setParent(self)
        
        self.ax = fig.add_subplot(111)
        self.ax.clear()
        
        #levantar el controlDict y ver los tracers
        
        Tf = float(self.parsedData['endTime'])
        T = float(self.currtime)
        dT = float(self.parsedData['deltaT'])
        self.ax.set_ylim(0,1.1)
        self.ax.set_xlim(-10*dT,Tf)
        self.ax.plot([0,T-dT,T,T+dT,Tf],[0,0,1,0,0], 'k', marker='o', label='Current Time')
        i = 0
        for itracer in self.tracersData:
            Tini = float(itracer['startTime']) 
            if float(itracer['startTime'])<T:
                Tini = T
            self.ax.plot([0,Tini,Tini+dT,Tf],[0,0,1,1], self.colors[i%6], label=itracer['name'])
            i = i+1
        self.ax.set_title('Timeline')
        self.ax.set_xlabel('Time [s]')
        self.ax.set_ylabel('Event')
        self.ax.legend(loc=0, fontsize = 'small')       
        
        self.figureLayout.addWidget(self.canvas)
        
        self.pushButton_3.setEnabled(True)
        return
        
    def change_combobox(self):
        name = str(self.sender().objectName())
        c1=self.tableWidget.cellWidget(int(name),2)
        c2=self.tableWidget.cellWidget(int(name),3)
        
        if self.sender().currentText()=='box':
            c1.setEnabled(True)
            c2.setEnabled(True)
        else:
            c1.setEnabled(False)
            c2.setEnabled(False)
        
        print 'done'
        return

    def newTracer(self):
        i = self.tableWidget.rowCount()
        self.tableWidget.insertRow(i)
        item1 = QtGui.QTableWidgetItem()
        item2 = QtGui.QTableWidgetItem()
        item3 = QtGui.QTableWidgetItem()
        item4 = QtGui.QTableWidgetItem()
        wdg1 = QtGui.QLineEdit()
        wdg2 = QtGui.QComboBox()
        wdg3 = QtGui.QLineEdit()
        wdg4 = QtGui.QLineEdit()
        wdg2.addItems(list(set(self.patches)-set(self.emptys)))
        wdg2.addItem('box')
        wdg2.setObjectName(str(i))
        wdg3.setEnabled(False)
        wdg4.setEnabled(False)
        wdg1.setText('0')
        wdg3.setText('(0 0 0)')
        wdg4.setText('(0 0 0)')
        QtCore.QObject.connect(wdg2, QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.change_combobox)
        wdg3.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp("\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}")))
        wdg4.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp("\({1}-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\s-?\d+\.?\d*(e-?\d)?\){1}")))
        QtCore.QObject.connect(wdg1,QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
        QtCore.QObject.connect(wdg2,QtCore.SIGNAL(_fromUtf8("currentIndexChanged(int)")), self.checkAccept)
        QtCore.QObject.connect(wdg3,QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
        QtCore.QObject.connect(wdg4,QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.checkAccept)
        self.tableWidget.setItem(i,0,item1)
        self.tableWidget.setCellWidget(i,0,wdg1) 
        self.tableWidget.setItem(i,1,item2)
        self.tableWidget.setCellWidget(i,1,wdg2)
        self.tableWidget.setItem(i,2,item3)
        self.tableWidget.setCellWidget(i,2,wdg3)
        self.tableWidget.setItem(i,3,item4)
        self.tableWidget.setCellWidget(i,3,wdg4)
        
        
        self.pushButton_3.setEnabled(True)
                
    def removeTracer(self):
        ii = self.tableWidget.currentRow()
        if ii==-1:
            QtGui.QMessageBox.about(self, "ERROR", "No tracer selected")
            return
        w = QtGui.QMessageBox(QtGui.QMessageBox.Information, "Removing", "Do you want to remove tracer data?", QtGui.QMessageBox.Yes|QtGui.QMessageBox.No)
        ret = w.exec_()
        if(QtGui.QMessageBox.Yes == ret):
            self.tableWidget.removeRow(ii)
            self.drawTracers()
            self.pushButton_3.setEnabled(False)
        return        
        
    def saveCaseData(self):
        saved = self.drawTracers(True)
        if saved:
            self.pushButton_3.setEnabled(False)

    def drawTracers(self, doTopoSet=False):
        
        #Estoy obligado a hacer esto antes porque si lo hago durante la escritura
        #de datos, me pueden quedar datos a mitad de escritura y corruptos
        for i in range(self.tableWidget.rowCount()):
            patchName = str(self.tableWidget.cellWidget(i,1).currentText())
            if patchName=='box':
                if str(self.tableWidget.cellWidget(i,2).text())[-1]!=')' or str(self.tableWidget.cellWidget(i,3).text())[-1]!=')':
                    tracer = 'T%s'%str(i)
                    QtGui.QMessageBox.about(self, "Error", "Wrong regular expression in "+tracer+"!")
                    return False

        for dd in self.tracersData:
            del self.parsedData['functions'][dd['name']]
        
        if 'functions' not in self.parsedData.getValueDict().keys():
            self.parsedData['functions'] = {}
            
        patches = []
        for i in range(self.tableWidget.rowCount()):
            patchName = str(self.tableWidget.cellWidget(i,1).currentText())
            newkey = 'T%s'%str(i)
            cellsetname = '%s_c'%newkey
            tracer = copy.deepcopy(dicc)
            
            tracer['fvOptions']['S']['timeStart'] = str(self.tableWidget.cellWidget(i,0).text())
            tracer['fvOptions']['S']['cellSet'] = cellsetname
            tracer['patchName'] = patchName
            if patchName=='box':
                tracer['fvOptions']['S']['p0'] = {} if 'p0' not in tracer['fvOptions']['S'].keys() else None
                tracer['fvOptions']['S']['p1'] = {} if 'p1' not in tracer['fvOptions']['S'].keys() else None
                #TODO: Verificar que sea correcto el punto
                
                tracer['fvOptions']['S']['p0'] = str(self.tableWidget.cellWidget(i,2).text())
                tracer['fvOptions']['S']['p1'] = str(self.tableWidget.cellWidget(i,3).text())
                
            del tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs']['injectionRate']['T0']
            tracer['fvOptions']['S']['scalarExplicitSetValueCoeffs']['injectionRate'][newkey] = '1'            
            self.parsedData['functions'][newkey] = tracer
            patches.append(patchName)
        self.parsedData.writeFile()
        
        if doTopoSet:
            ii = 0
            cmd = 'cp %s/caseDicts/topoSetDict %s/system/.'%(os.path.dirname(os.path.realpath(__file__)),self.currentFolder)
            os.system(cmd)

            filename = '%s/system/topoSetDict'%self.currentFolder
            topoSetData = ParsedParameterFile(filename,createZipped=False)
            
            #armo el topoSet de manera de generar los cellSet deseados
            for i in range(self.tableWidget.rowCount()):
                newkey = 'T%s'%str(i)
                patchName = str(self.tableWidget.cellWidget(i,1).currentText())
                cellsetname = '%s_c'%newkey
                facesetname = '%s_f'%newkey
                if patchName != 'box':
                    topoSetData['actions'].append(dic_patchToFace)
                    topoSetData['actions'].append(dic_faceToCell)
                    topoSetData['actions'][ii]['name'] = facesetname
                    topoSetData['actions'][ii]['sourceInfo']['name'] = patchName
                    topoSetData['actions'][ii+1]['name'] = cellsetname
                    topoSetData['actions'][ii+1]['sourceInfo']['set'] = facesetname
                    ii = ii+2
                else:
                    p0 = str(self.tableWidget.cellWidget(i,2).text())
                    p1 = str(self.tableWidget.cellWidget(i,3).text())
                    topoSetData['actions'].append(copy.deepcopy(dic_boxToCell))
                    topoSetData['actions'][ii]['name'] = cellsetname
                    topoSetData['actions'][ii]['sourceInfo']['box'] = p0+' '+p1
                    ii = ii+1
            topoSetData.writeFile()
                        
            cmd = 'topoSet -case %s > %s/run_topoSet.log &'%(self.currentFolder,self.currentFolder)
            self.threadtopoSet = ExampleThread(cmd)
            self.connect(self.threadtopoSet, QtCore.SIGNAL("finished()"), self.verifyCells)
            self.connect(self.threadtopoSet, QtCore.SIGNAL("finished()"), self.threadtopoSet.terminate)
            self.threadtopoSet.start()
        
        self.loadCaseData()
        self.refreshTable()
        self.refreshTimeline()
        
        return True
        
    def verifyCells(self):
        from os import listdir
        from os.path import isfile, join
        folder = '%s/constant/polyMesh/sets'%self.currentFolder
        files = [f for f in listdir(folder) if isfile(join(folder, f))]
        empties = []
        for ifile in files:
            if '_c' in ifile:
                filename = folder+'/'+ifile
                cmd="grep -in '(' %s"%filename
                proc = subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True)
                (out, err) = proc.communicate()
                out=out.replace(":(","").replace("\n","")
                out = int(out)-1
                cmd="awk \"NR==%s\" %s"%(str(out),filename)
                proc = subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True)
                (out, err) = proc.communicate()
                out=out.replace("\n","")
                if int(out)==0:
                    empties.append(ifile.replace("_c",""))
                    
        if empties!=[]:
            strempties=' '.join(empties)
            w = QtGui.QMessageBox(QtGui.QMessageBox.Warning, "Warning", "The tracer(s) "+strempties+" generated 0 cells!")
            w.exec_()
                
        return
        
        
    def checkAccept(self):
        
        ready = True
        edits = self.findChildren(QtGui.QLineEdit)
        for E in edits:
            if E.isEnabled():
                if not E.text():
                        ready = False
        if ready:
            self.pushButton_3.setEnabled(True)
        else:
            self.pushButton_3.setEnabled(False)