def drawKeySymbol(self, number, painter, x, y, width, height): """Draw the plot symbol and/or line.""" painter.save() s = self.settings painter.setPen( s.Line.makeQPenWHide(painter) ) painter.setBrush( s.get('Fill').makeQBrushWHide() ) utils.plotLineArrow(painter, x+width, y+height*0.5, width, 180, height*0.25, arrowleft=s.arrowfront, arrowright=s.arrowback) painter.restore()
def drawKeySymbol(self, number, painter, x, y, width, height): """Draw the plot symbol and/or line.""" painter.save() s = self.settings painter.setPen(s.Line.makeQPenWHide(painter)) painter.setBrush(s.get('Fill').makeQBrushWHide()) utils.plotLineArrow(painter, x + width, y + height * 0.5, width, 180, height * 0.25, arrowleft=s.arrowfront, arrowright=s.arrowback) painter.restore()
def dataDraw(self, painter, axes, posn, cliprect): """Draw the widget.""" s = self.settings d = self.document # ignore non existing datasets try: data1 = d.data[s.data1] data2 = d.data[s.data2] except KeyError: return # require 2d datasets if data1.dimensions != 2 or data2.dimensions != 2: return # get base length (ensure > 0) baselength = max(s.get('baselength').convert(painter), 1e-6) # try to be nice if the datasets don't match data1st, data2nd = data1.data, data2.data xw = min(data1st.shape[1], data2nd.shape[1]) yw = min(data1st.shape[0], data2nd.shape[0]) # construct indices into datasets yvals, xvals = N.mgrid[0:yw, 0:xw] # convert using 1st dataset to axes values xdsvals, ydsvals = data1.indexToPoint(xvals.ravel(), yvals.ravel()) # convert using axes to plotter values xplotter = axes[0].dataToPlotterCoords(posn, xdsvals) yplotter = axes[1].dataToPlotterCoords(posn, ydsvals) pen = s.Line.makeQPenWHide(painter) painter.setPen(pen) if s.mode == 'cartesian': dx = (data1st[:yw, :xw] * baselength).ravel() dy = (data2nd[:yw, :xw] * baselength).ravel() elif s.mode == 'polar': r = data1st[:yw, :xw].ravel() * baselength theta = data2nd[:yw, :xw].ravel() dx = r * N.cos(theta) dy = r * N.sin(theta) x1, x2 = xplotter-dx, xplotter+dx y1, y2 = yplotter+dy, yplotter-dy if s.arrowfront == 'none' and s.arrowback == 'none': utils.plotLinesToPainter(painter, x1, y1, x2, y2, cliprect) else: arrowsize = s.get('arrowsize').convert(painter) painter.setBrush( s.get('Fill').makeQBrushWHide() ) # this is backward - have to convert from dx, dy to angle, length angles = 180 - N.arctan2(dy, dx) * (180./N.pi) lengths = N.sqrt(dx**2+dy**2) * 2 # scale arrow heads by arrow length if requested if s.scalearrow: arrowsizes = (arrowsize/baselength/2) * lengths else: arrowsizes = N.zeros(lengths.shape) + arrowsize for x, y, l, a, asize in itertools.izip(x2, y2, lengths, angles, arrowsizes): if l != 0.: utils.plotLineArrow(painter, x, y, l, a, asize, arrowleft=s.arrowfront, arrowright=s.arrowback)
def draw(self, posn, phelper, outerbounds = None): """Plot the key on a plotter.""" s = self.settings d = self.document if s.hide: return # if a dataset is used, we can't use control items isnotdataset = ( not s.get('xPos').isDataset(d) and not s.get('yPos').isDataset(d) ) if s.mode == 'length-angle': isnotdataset = ( isnotdataset and not s.get('length').isDataset(d) and not s.get('angle').isDataset(d) ) else: isnotdataset = ( isnotdataset and not s.get('xPos2').isDataset(d) and not s.get('yPos2').isDataset(d) ) # now do the drawing clip = None if s.clip: clip = qt4.QRectF( qt4.QPointF(posn[0], posn[1]), qt4.QPointF(posn[2], posn[3]) ) painter = phelper.painter(self, posn, clip=clip) # adjustable positions for the lines arrowsize = s.get('arrowSize').convert(painter) # drawing settings for line if not s.Line.hide: painter.setPen( s.get('Line').makeQPen(painter) ) else: painter.setPen( qt4.QPen(qt4.Qt.NoPen) ) # settings for fill if not s.Fill.hide: painter.setBrush( s.get('Fill').makeQBrush() ) else: painter.setBrush( qt4.QBrush() ) # iterate over positions scaling = posn[2]-posn[0] if s.mode == 'length-angle': lines = self._computeLinesLengthAngle(posn, scaling) else: lines = self._computeLinesPointToPoint(posn) controlgraphitems = [] for index, (x, y, l, a) in enumerate(lines): utils.plotLineArrow(painter, x, y, l, a, arrowsize=arrowsize, arrowleft=s.arrowleft, arrowright=s.arrowright) if isnotdataset: cgi = controlgraph.ControlLine( self, x, y, x + l*math.cos(a/180.*math.pi), y + l*math.sin(a/180.*math.pi)) cgi.index = index cgi.widgetposn = posn controlgraphitems.append(cgi) phelper.setControlGraph(self, controlgraphitems)
def draw(self, posn, phelper, outerbounds = None): """Plot the key on a plotter.""" s = self.settings d = self.document if s.hide: return # if a dataset is used, we can't use control items isnotdataset = ( not s.get('xPos').isDataset(d) and not s.get('yPos').isDataset(d) ) if s.mode == 'length-angle': isnotdataset = ( isnotdataset and not s.get('length').isDataset(d) and not s.get('angle').isDataset(d) ) else: isnotdataset = ( isnotdataset and not s.get('xPos2').isDataset(d) and not s.get('yPos2').isDataset(d) ) # now do the drawing clip = None if s.clip: clip = qt4.QRectF( qt4.QPointF(posn[0], posn[1]), qt4.QPointF(posn[2], posn[3]) ) painter = phelper.painter(self, posn, clip=clip) # adjustable positions for the lines arrowsize = s.get('arrowSize').convert(painter) # drawing settings for line if not s.Line.hide: painter.setPen( s.get('Line').makeQPen(painter) ) else: painter.setPen( qt4.QPen(qt4.Qt.NoPen) ) # settings for fill if not s.Fill.hide: painter.setBrush( s.get('Fill').makeQBrush() ) else: painter.setBrush( qt4.QBrush() ) # iterate over positions scaling = posn[2]-posn[0] if s.mode == 'length-angle': lines = self._computeLinesLengthAngle(posn, scaling) else: lines = self._computeLinesPointToPoint(posn) if lines is None: return controlgraphitems = [] for index, (x, y, l, a) in enumerate(lines): utils.plotLineArrow(painter, x, y, l, a, arrowsize=arrowsize, arrowleft=s.arrowleft, arrowright=s.arrowright) if isnotdataset: cgi = controlgraph.ControlLine( self, x, y, x + l*math.cos(a/180.*math.pi), y + l*math.sin(a/180.*math.pi)) cgi.index = index cgi.widgetposn = posn controlgraphitems.append(cgi) phelper.setControlGraph(self, controlgraphitems)
def draw(self, posn, phelper, outerbounds = None): """Plot the key on a plotter.""" s = self.settings d = self.document if s.hide: return # get lengths and angles of lines length = s.get('length').getFloatArray(d) angle = s.get('angle').getFloatArray(d) if length is None or angle is None: return # translate coordinates from axes or relative values xpos, ypos = self._getPlotterCoords(posn) if xpos is None or ypos is None: # we can't calculate coordinates return # if a dataset is used, we can't use control items isnotdataset = ( not s.get('xPos').isDataset(d) and not s.get('yPos').isDataset(d) and not s.get('length').isDataset(d) and not s.get('angle').isDataset(d) ) # now do the drawing painter = phelper.painter(self, posn) # adjustable positions for the lines controlgraphitems = [] arrowsize = s.get('arrowSize').convert(painter) # drawing settings for line if not s.Line.hide: painter.setPen( s.get('Line').makeQPen(painter) ) else: painter.setPen( qt4.QPen(qt4.Qt.NoPen) ) # settings for fill if not s.Fill.hide: painter.setBrush( s.get('Fill').makeQBrush() ) else: painter.setBrush( qt4.QBrush() ) # iterate over positions index = 0 dx, dy = posn[2]-posn[0], posn[3]-posn[1] for x, y, l, a in itertools.izip(xpos, ypos, itertools.cycle(length), itertools.cycle(angle)): if N.isfinite(x) and N.isfinite(y) and N.isfinite(a): utils.plotLineArrow(painter, x, y, l*dx, a, arrowsize=arrowsize, arrowleft=s.arrowleft, arrowright=s.arrowright) if isnotdataset: cgi = controlgraph.ControlLine( self, x, y, x + l*dx*math.cos(a/180.*math.pi), y + l*dx*math.sin(a/180.*math.pi)) cgi.index = index cgi.widgetposn = posn index += 1 controlgraphitems.append(cgi) phelper.setControlGraph(self, controlgraphitems)
def draw(self, parentposn, phelper, outerbounds=None): """Draw the widget.""" posn = plotters.GenericPlotter.draw(self, parentposn, phelper, outerbounds=outerbounds) x1, y1, x2, y2 = posn s = self.settings d = self.document # hide if hidden! if s.hide: return # get axes widgets axes = self.parent.getAxes((s.xAxis, s.yAxis)) # return if there's no proper axes if (None in axes or axes[0].settings.direction != 'horizontal' or axes[1].settings.direction != 'vertical'): return # ignore non existing datasets try: data1 = d.data[s.data1] data2 = d.data[s.data2] except KeyError: return # require 2d datasets if data1.dimensions != 2 or data2.dimensions != 2: return # clip data within bounds of plotter cliprect = self.clipAxesBounds(axes, posn) painter = phelper.painter(self, posn, clip=cliprect) # get base length (ensure > 0) baselength = max(s.get('baselength').convert(painter), 1e-6) # try to be nice if the datasets don't match data1st, data2nd = data1.data, data2.data xw = min(data1st.shape[1], data2nd.shape[1]) yw = min(data1st.shape[0], data2nd.shape[0]) # construct indices into datasets yvals, xvals = N.mgrid[0:yw, 0:xw] # convert using 1st dataset to axes values xdsvals, ydsvals = data1.indexToPoint(xvals.ravel(), yvals.ravel()) # convert using axes to plotter values xplotter = axes[0].dataToPlotterCoords(posn, xdsvals) yplotter = axes[1].dataToPlotterCoords(posn, ydsvals) pen = s.Line.makeQPenWHide(painter) painter.setPen(pen) if s.mode == 'cartesian': dx = (data1st[:yw, :xw] * baselength).ravel() dy = (data2nd[:yw, :xw] * baselength).ravel() elif s.mode == 'polar': r = data1st[:yw, :xw].ravel() * baselength theta = data2nd[:yw, :xw].ravel() dx = r * N.cos(theta) dy = r * N.sin(theta) x1, x2 = xplotter - dx, xplotter + dx y1, y2 = yplotter + dy, yplotter - dy if s.arrowfront == 'none' and s.arrowback == 'none': utils.plotLinesToPainter(painter, x1, y1, x2, y2, cliprect) else: arrowsize = s.get('arrowsize').convert(painter) painter.setBrush(s.get('Fill').makeQBrushWHide()) # this is backward - have to convert from dx, dy to angle, length angles = 180 - N.arctan2(dy, dx) * (180. / N.pi) lengths = N.sqrt(dx**2 + dy**2) * 2 # scale arrow heads by arrow length if requested if s.scalearrow: arrowsizes = (arrowsize / baselength / 2) * lengths else: arrowsizes = N.zeros(lengths.shape) + arrowsize for x, y, l, a, asize in itertools.izip(x2, y2, lengths, angles, arrowsizes): if l != 0.: utils.plotLineArrow(painter, x, y, l, a, asize, arrowleft=s.arrowfront, arrowright=s.arrowback)
def draw(self, parentposn, phelper, outerbounds = None): """Draw the widget.""" posn = plotters.GenericPlotter.draw(self, parentposn, phelper, outerbounds = outerbounds) x1, y1, x2, y2 = posn s = self.settings d = self.document # hide if hidden! if s.hide: return # get axes widgets axes = self.parent.getAxes( (s.xAxis, s.yAxis) ) # return if there's no proper axes if ( None in axes or axes[0].settings.direction != 'horizontal' or axes[1].settings.direction != 'vertical' ): return # ignore non existing datasets try: data1 = d.data[s.data1] data2 = d.data[s.data2] except KeyError: return # require 2d datasets if data1.dimensions != 2 or data2.dimensions != 2: return # clip data within bounds of plotter cliprect = self.clipAxesBounds(axes, posn) painter = phelper.painter(self, posn, clip=cliprect) baselength = s.get('baselength').convert(painter) # try to be nice if the datasets don't match data1st, data2nd = data1.data, data2.data xw = min(data1st.shape[1], data2nd.shape[1]) yw = min(data1st.shape[0], data2nd.shape[0]) # construct indices into datasets yvals, xvals = N.mgrid[0:yw, 0:xw] # convert using 1st dataset to axes values xdsvals, ydsvals = data1.indexToPoint(xvals.ravel(), yvals.ravel()) # convert using axes to plotter values xplotter = axes[0].dataToPlotterCoords(posn, xdsvals) yplotter = axes[1].dataToPlotterCoords(posn, ydsvals) pen = s.Line.makeQPenWHide(painter) painter.setPen(pen) if s.mode == 'cartesian': dx = (data1st[:yw, :xw] * baselength).ravel() dy = (data2nd[:yw, :xw] * baselength).ravel() elif s.mode == 'polar': r = data1st[:yw, :xw].ravel() * baselength theta = data2nd[:yw, :xw].ravel() dx = r * N.cos(theta) dy = r * N.sin(theta) x1, x2 = xplotter-dx, xplotter+dx y1, y2 = yplotter+dy, yplotter-dy if s.arrowfront == 'none' and s.arrowback == 'none': utils.plotLinesToPainter(painter, x1, y1, x2, y2, cliprect) else: arrowsize = s.get('arrowsize').convert(painter) painter.setBrush( s.get('Fill').makeQBrushWHide() ) # this is backward - have to convert from dx, dy to angle, length angles = 180 - N.arctan2(dy, dx) * (180./N.pi) lengths = N.sqrt(dx**2+dy**2) * 2 # scale arrow heads by arrow length if requested if s.scalearrow: arrowsizes = (arrowsize/baselength/2) * lengths else: arrowsizes = N.zeros(lengths.shape) + arrowsize for x, y, l, a, asize in itertools.izip(x2, y2, lengths, angles, arrowsizes): utils.plotLineArrow(painter, x, y, l, a, asize, arrowleft=s.arrowfront, arrowright=s.arrowback)