def __init__(self, parent=None): super(SliceView, self).__init__(parent) self.parent = parent self.pixmap = None self.roxtimer = None self.dataService = NumpyDataService() # test file is a 5 by 10424000 matrix of values between 0 and 1 # Its a picture of a pair of Chestnuts. each entry is (x,y,r,g,b) # right now its just serving as a dead simple "high dimensional" dataset # here is the mapping to the higer dimensional data self.sourceDimensionality = self.dataService.getDimensionality() # the list of dimensions in the HD space that each of the following # variables (x,y,r,g,b) is mapped to self.dim = [0, 1, 2, 3, 4] shuffle(self.dim) self.dataService.setKeyDimensions(self.dim[:2]) # the slope of the view in each of the possible source dimensions (NYI) self.slope = [1.0] * self.sourceDimensionality
class SliceView(QtGui.QWidget): """ This is the custom widget that does the slice drawing The method of drawing will be a steady approximation where the slice is resolved at a finer and finer resolution (in paralell if possible) until the there is a seperate data value for each pixel (depends on the size of the widget) """ def __init__(self, parent=None): super(SliceView, self).__init__(parent) self.parent = parent self.pixmap = None self.roxtimer = None self.dataService = NumpyDataService() # test file is a 5 by 10424000 matrix of values between 0 and 1 # Its a picture of a pair of Chestnuts. each entry is (x,y,r,g,b) # right now its just serving as a dead simple "high dimensional" dataset # here is the mapping to the higer dimensional data self.sourceDimensionality = self.dataService.getDimensionality() # the list of dimensions in the HD space that each of the following # variables (x,y,r,g,b) is mapped to self.dim = [0, 1, 2, 3, 4] shuffle(self.dim) self.dataService.setKeyDimensions(self.dim[:2]) # the slope of the view in each of the possible source dimensions (NYI) self.slope = [1.0] * self.sourceDimensionality def paintEvent(self, event): """ This should return immediately duh Draw the pixmap the worker threads have been working on. """ qp = QtGui.QPainter() qp.begin(self) if self.pixmap != None: qp.drawPixmap(0, 0, self.pixmap) qp.end() def restartRox(self): """ This method restarts the iterative refinement of the slice image It should be called whenever the slice-defining parameters change, and whenever the size of the slice view widget changes. should return immediately. """ self.roxtimer = QtCore.QTimer(self) self.connect(self.roxtimer, Qt.SIGNAL("timeout()"), self.addDetail) # init some variables needed by the iterative refinement self.timetopaint = time() self.numdp = 0 # start the code! self.roxtimer.start(0) def addDetail(self): """ This method does all the work It takes the dimensional mapping and the slope, and requests data from the data service that indicate what color to draw tiny rectangles on self.pixmap Right now it just does 20 new data points eah time it's called, but a better strategy would be to start with at least one and just work until 10ms has passed. """ w = self.size().width() h = self.size().height() qp = QtGui.QPainter() qp.begin(self.pixmap) qp.setRenderHint(qp.Antialiasing, True) # investigate new data points stopworking = time() + 0.01 while time() < stopworking: locX = random() locY = random() # set up the hypothetical data point, and fill in the values we know # (the two that are mapping to the x and y coordinates of this view dat = [None] * self.sourceDimensionality dat[self.dim[0]] = locX * self.slope[self.dim[0]] dat[self.dim[1]] = locY * self.slope[self.dim[1]] # ask the data service to fill in values for the three dimensions # that correspond to red green an blue dat = self.dataService.resolve(dat, self.dim[-3:]) # now use the retreived information to decide on the color rgb = [dat[self.dim[k]] / self.slope[self.dim[k]] * 255 for k in [2, 3, 4]] color = QtGui.QColor(*rgb) # increment number of data points for following calculation self.numdp += 1 # size of the box we will draw around this data point is equal to the area of the # widget divided by the number of total data points already drawn including this one. sqside = (float(w * h) / self.numdp) ** 0.5 # termination condition, once the size of the squares drawn is 0.25px, stop if sqside < 0.25: self.roxtimer.stop() self.repaint() # draw qp.setPen(color) qp.setBrush(color) qp.drawRect(QtCore.QRectF(locX * w - sqside * 0.5, locY * h - sqside * 0.5, sqside, sqside)) qp.end() if self.timetopaint <= time(): self.timetopaint = time() + 0.03 self.repaint() def resizeEvent(self, event): self.pixmap = QtGui.QPixmap(event.size().width(), event.size().height()) self.restartRox()