def __init__(self, meshFileName): QgsPluginLayer.__init__(self, CrayfishViewerPluginLayer.LAYER_TYPE, "Crayfish Viewer plugin layer") self.provider = CrayfishViewer(meshFileName) if self.provider.loadedOk(): self.setValid(True) else: self.setValid(False) self.dock = None self.twoDMFileName = '' self.dataSetIdx = 0 self.timeIdx = 0 self.rs = CrayfishViewerRenderSettings()
class CrayfishViewerPluginLayer(QgsPluginLayer): LAYER_TYPE="crayfish_viewer" def __init__(self, meshFileName): QgsPluginLayer.__init__(self, CrayfishViewerPluginLayer.LAYER_TYPE, "Crayfish Viewer plugin layer") self.provider = CrayfishViewer(meshFileName) if self.provider.loadedOk(): self.setValid(True) else: self.setValid(False) self.dock = None self.twoDMFileName = '' self.dataSetIdx = 0 self.timeIdx = 0 self.rs = CrayfishViewerRenderSettings() def set2DMFileName(self, fName): self.twoDMFileName = fName def setDock(self, dock): self.dock = dock def setRenderSettings(self, dataSetIdx, timeIdx): self.dataSetIdx = dataSetIdx self.timeIdx = timeIdx def draw(self, rendererContext): """ The provider (CrayfishViewer) provides the following draw function: QImage* draw( int canvasWidth, int canvasHeight, double llX, double llY, double pixelSize) """ debug = False mapToPixel = rendererContext.mapToPixel() pixelSize = mapToPixel.mapUnitsPerPixel() extent = rendererContext.extent() topleft = mapToPixel.transform(extent.xMinimum(), extent.yMaximum()) bottomright = mapToPixel.transform(extent.xMaximum(), extent.yMinimum()) width = (bottomright.x() - topleft.x()) height = (bottomright.y() - topleft.y()) if debug: print '\n' print 'About to render with the following parameters:' print '\tWidth:\t' + str(width) + '\n' print '\tHeight:\t' + str(height) + '\n' print '\tXMin:\t' + str(extent.xMinimum()) + '\n' print '\tYMin:\t' + str(extent.yMinimum()) + '\n' print '\tPixSz:\t' + str(pixelSize) + '\n' if self.dock is not None: timeIndex = self.dock.listWidget_2.currentRow() else: timeIndex = 0 if self.dock is None: autoContour = True contMin = 0.0 contMax = 0.0 else: autoContour, contMin, contMax = self.dock.getRenderOptions() img = self.provider.draw( self.rs.renderContours, # Whether to render contours self.rs.renderVectors, # Whether to render vectors width, # The width of the QImage to return in px height, # The height of the QImage to return in px extent.xMinimum(), # x coordinate of the XLL corner extent.yMinimum(), # y coordinate of the XLL corner pixelSize, # Size of pixels in map units self.dataSetIdx, # Dataset index (0=2dm) self.timeIdx, # Output index # Contour options autoContour, # Can't remember what this is contMin, # Minimum contour value contMax, # Maximum contour value # Vector options self.rs.shaftLength, # Method used to scale the shaft (sounds rude doesn't it) self.rs.shaftLengthMin, # Minimum shaft length self.rs.shaftLengthMax, # Maximum shaft length self.rs.shaftLengthScale, # Scale for scaling vector to magnitude self.rs.shaftLengthFixedLength, # Fixed vector length self.rs.lineWidth, # Line width to use for rendering self.rs.headWidth, # Vector head width (%) self.rs.headLength # Vector head length (%) ) # img now contains the render of the crayfish layer, merge it painter = rendererContext.painter() rasterScaleFactor = rendererContext.rasterScaleFactor() invRasterScaleFactor = 1.0/rasterScaleFactor painter.save() painter.scale(invRasterScaleFactor, invRasterScaleFactor) painter.drawImage(0, 0, img) painter.restore() return True def identify(self, pt): """ Returns a QString representing the value of the layer at the given QgsPoint, pt This function calls valueAtCoord in the C++ provider double valueAtCoord(int dataSetIdx, int timeIndex, double xCoord, double yCoord); """ x = pt.x() y = pt.y() # Determine what scalar data is currently being displayed dataSetIdx = self.dock.listWidget.currentRow() timeIndex = self.dock.listWidget_2.currentRow() value = self.provider.valueAtCoord( dataSetIdx, timeIndex, x, y) v = None if value == -9999.0: # Outide extent v = QString('out of extent') else: v = QString(str(value)) d = dict() d[ QString('Band 1') ] = v return (True, d) def bandCount(self): return 1 def rasterUnitsPerPixel(self): # Only required so far for the profile tool # There's probably a better way of doing this return float(0.5)