Source code for OpenPisco.QtApp.RenderZone2D

# -*- coding: utf-8 -*-
#
# This file is subject to the terms and conditions defined in
# file 'LICENSE', which is part of this source code package.
#

import numpy as np

import Muscat.Helpers.ParserHelper as PH

# QT imp must be imported before pyqtgraph
import OpenPisco.QtApp.QtImplementation as QT
import pyqtgraph as pg

from OpenPisco.QtApp.res import ResourcePath

pg.setConfigOptions(antialias=True)
[docs]class PlotData(object): #update2D = QT.Signal() def __init__(self,size=0): super(PlotData,self).__init__() self.values = [np.nan]*size
[docs]class RenderZone2D(QT.QWidget): def __init__(self, father, **kwargs): super(RenderZone2D,self).__init__(father) self.firstAxiscolor = "#00ff00" self.secondAxiscolor = "#ff0000" self.yDims = 2 self.onlyOnePlotArea = False PH.ReadProperties(kwargs,kwargs,self) self.gridlayout = QT.QGridLayout(self) self.gridlayout.setContentsMargins(0, 0, 0, 0) self.comboBoxs = [] self.comboNames = [] self.comboBoxs.append(QT.QComboBox()) self.comboNames.append("x:") for i in range(self.yDims): self.comboBoxs.append(QT.QComboBox()) self.comboNames.append("y"+str(1+i)+":") cpt = 0 for i in range(self.yDims+1): label = QT.QLabel(self.comboNames[i]) label.setAlignment(QT.Qt.AlignRight | QT.Qt.AlignVCenter) self.gridlayout.setColumnStretch(cpt, 0) self.gridlayout.addWidget(label, 0, cpt, 1, 1); cpt +=1 self.gridlayout.setColumnStretch(cpt, 1) self.gridlayout.addWidget(self.comboBoxs[i], 0, cpt, 1, 1); cpt +=1 self.comboBoxs[i].currentIndexChanged['QString'].connect(self.Update) cleanbutton = QT.QPushButton('Clean 2D Data') cleanbutton.clicked.connect(self.ClearData) self.gridlayout.addWidget(cleanbutton, 0,cpt, 1, 1) cpt +=1 self.pyqtgraphWidget = pg.PlotWidget() self.gridlayout.addWidget(self.pyqtgraphWidget, 1, 0, 1, cpt) self.data = {} self.writeCpt = 0 self.curves = [] self.curves.append(self.pyqtgraphWidget.plot(x=[], y=[],symbolPen='w', pen=pg.mkPen(color=self.firstAxiscolor),fill=pg.mkPen(color=self.firstAxiscolor),connect="finite")) self.pyqtgraphWidget.getAxis('left').setPen(pg.mkPen(color=self.firstAxiscolor, width=3)) self.pyqtgraphWidget.getAxis('bottom').setPen(pg.mkPen(color='#ffffff', width=3)) if self.yDims == 2: if self.onlyOnePlotArea: self.p2 = pg.ViewBox() self.curves.append(self.pyqtgraphWidget.plot(x=[], y=[],symbolPen='w', pen=pg.mkPen(color=self.secondAxiscolor,fill=pg.mkPen(color=self.secondAxiscolor)),connect="finite")) self.pyqtgraphWidget.getAxis('right').setPen(pg.mkPen(color=self.secondAxiscolor, width=3)) self.pyqtgraphWidget.scene().addItem(self.p2) self.pyqtgraphWidget.getAxis('right').linkToView(self.p2) self.p2.setXLink(self.pyqtgraphWidget) self.p2.addItem(self.curves[-1]) self.pyqtgraphWidget.getAxis('right').setPen(pg.mkPen(color=self.secondAxiscolor, width=3),fill=pg.mkPen(color=self.secondAxiscolor) ) else: self.pyqtgraphWidget2 = pg.PlotWidget() self.gridlayout.addWidget(self.pyqtgraphWidget2, 2, 0, 1, cpt) self.curves.append(self.pyqtgraphWidget2.plot(x=[], y=[],symbolPen='w', pen=pg.mkPen(color=self.secondAxiscolor,fill=pg.mkPen(color=self.secondAxiscolor)),connect="finite")) self.pyqtgraphWidget2.getAxis('left').setPen(pg.mkPen(color=self.secondAxiscolor, width=3)) self.pyqtgraphWidget2.getAxis('bottom').setPen(pg.mkPen(color='#ffffff', width=3)) self.gridlayout.setRowStretch(1, 1) self.gridlayout.setRowStretch(2, 1) self.pyqtgraphWidget2.sigRangeChanged.connect(self.updateViews) self.pyqtgraphWidget.sigRangeChanged.connect(self.updateViews) self.updateViews(self.pyqtgraphWidget) # self.pyqtgraphWidget.getAxis('left').setPen(pg.mkPen(color=self.firstAxiscolor, width=3))
[docs] def updateViews(self,r): w1 = self.pyqtgraphWidget w1.sigRangeChanged.disconnect(self.updateViews) if self.yDims == 2: if self.onlyOnePlotArea : pass #self.p2.linkedViewChanged(self.pyqtgraphWidget.getViewBox(), self.p2.XAxis) self.p2.setGeometry(self.pyqtgraphWidget.getViewBox().sceneBoundingRect()) else: w2 = self.pyqtgraphWidget2 w2.sigRangeChanged.disconnect(self.updateViews) xRange = r.getAxis('bottom').range if w1 == r: w2.setRange(xRange=xRange, padding=0) elif w2 == r: w1.setRange(xRange=xRange, padding=0) w2.sigRangeChanged.connect(self.updateViews) w1.sigRangeChanged.connect(self.updateViews)
[docs] def Write(self,datas): firstTime = len(self.data)>0 keys = set(self.data.keys()) for key,data in datas.items(): d = self.data.get(key,PlotData(self.writeCpt)) d.values.append(data) self.data[key] = d keys.discard(key) # we add none to keep all the data with the same size for key in keys: self.data[key].values.append(np.nan) self.writeCpt += 1 #get active name for box in self.comboBoxs: if box.count() == 0: cname = None else: cname = box.itemData(box.currentIndex()) box.blockSignals(True) box.clear() cpt = 0 for key in self.data: name = str(key) box.insertItem(cpt,name,name) cpt += 1 if cname: idx = box.findText(cname) if idx != -1: box.setCurrentIndex(idx) box.blockSignals(False) if self.writeCpt == 1: # first time we set the x to cpt, and the y1 and y2 to the variables not # in the list notToPlot = ["run", "step","iter","cpt", "OK", "time"] keys = set(self.data.keys()) toPlot = list(keys.difference(notToPlot)) toPlot.insert(0,"cpt") for box,name in zip(self.comboBoxs,toPlot): box.blockSignals(True) idx = box.findText(name) if idx != -1: box.setCurrentIndex(idx) box.blockSignals(False)
[docs] def Reset(self): self.ClearData()
[docs] def ClearData(self): self.data = {} self.writeCpt = 0 for box in self.comboBoxs: box.blockSignals(True) box.clear() box.blockSignals(False) for i in range(self.yDims): self.curves[i].setData(x=[0],y=[0]) self.pyqtgraphWidget.setLabel('bottom', '', **{'font-size':'20pt'}) self.pyqtgraphWidget.setLabel('left', '', **{'font-size':'20pt'}) if self.yDims == 2: if self.onlyOnePlotArea : self.pyqtgraphWidget.setLabel('right', '', **{'font-size':'20pt'}) else: self.pyqtgraphWidget2.setLabel('bottom', '', **{'font-size':'20pt'}) self.pyqtgraphWidget2.setLabel('left', '', **{'font-size':'20pt'})
[docs] def Update(self): names = [] datas = [] for box in self.comboBoxs: name = box.itemData(box.currentIndex()) names.append(name) datas.append(self.data.get(name,None)) self.pyqtgraphWidget.setLabel('bottom', names[0], **{'font-size':'20pt'}) self.pyqtgraphWidget.getAxis('bottom').setPen(pg.mkPen(color='#ffffff', width=3)) self.pyqtgraphWidget.setLabel('left', names[1], **{'font-size':'20pt'}) self.pyqtgraphWidget.getAxis('left').setPen(pg.mkPen(color=self.firstAxiscolor, width=3)) if self.yDims == 2: if self.onlyOnePlotArea: self.pyqtgraphWidget.setLabel('right', names[2], **{'font-size':'20pt'}) self.pyqtgraphWidget.getAxis('right').setPen(pg.mkPen(color=self.secondAxiscolor, width=3)) else: self.pyqtgraphWidget2.setLabel('left', names[2], **{'font-size':'20pt'}) self.pyqtgraphWidget2.getAxis('left').setPen(pg.mkPen(color=self.secondAxiscolor, width=3)) self.pyqtgraphWidget2.setLabel('bottom', names[0], **{'font-size':'20pt'}) self.pyqtgraphWidget2.getAxis('bottom').setPen(pg.mkPen(color='#ffffff', width=3)) for i in range(self.yDims): if datas[i+1] is None : continue if datas[0] is None: self.curves[i].setData(x=list(range(len(datas[i+1].values))),y=datas[i+1].values) else: self.curves[i].setData(x=datas[0].values,y=datas[i+1].values)
[docs]def CheckIntegrity(GUI = False): if GUI == False: print("Cant test this class without GUI") return 'OK' import sys class MainWindow(QT.QMainWindow): def __init__(self, parent=None): QT.QMainWindow.__init__(self, parent) self.frame = QT.QFrame() self.widgets= [] self.vl = QT.QHBoxLayout() self.widgets.append(RenderZone2D(self,yDims=1)) self.vl.addWidget(self.widgets[0]) self.widgets.append(RenderZone2D(self,yDims=2)) self.vl.addWidget(self.widgets[1]) self.widgets.append(RenderZone2D(self,yDims=2,onlyOnePlotArea=True)) self.vl.addWidget(self.widgets[2]) self.frame.setLayout(self.vl) self.setCentralWidget(self.frame) self.show() app = QT.GetQApplication(sys.argv) window = MainWindow() for w in window.widgets: w.Write({"time":0,"fx":0}) w.Write({"time":1,"fx":1,"fy":1e-14}) w.Write({"time":2,"fx":4,"fy":1.414e-14}) w.Write({"time":3,"fx":8,"fy":1.732e-14}) w.Write({"time":4,"fx":16}) w.Update() for k,data in window.widgets[0].data.items(): print(k + " : " + str(data.values)) sys.exit(app.exec_()) return "OK"
if __name__ == '__main__': print(CheckIntegrity(True))