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
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
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)
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
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)
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
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
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.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)
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()
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 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)
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)
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)
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()
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)
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)
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
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
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
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)
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
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)
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)
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
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)
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
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)
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)