def __init__(self, iface): # Save reference to the QGIS interface self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(QFile.decodeName(__file__)) # initialize locale settings = QSettings() locale = settings.value("locale/userLocale", "")[0:2] localePath = os.path.join(self.plugin_dir, 'i18n', '{0}.qm'.format(locale)) if os.path.exists(localePath): self.translator = QTranslator() self.translator.load(localePath) if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator) self.pluginName = self.tr("TileLayerPlugin") self.downloadTimeout = int( settings.value("/TileLayerPlugin/timeout", 30, type=int)) self.navigationMessagesEnabled = int( settings.value("/TileLayerPlugin/naviMsg", Qt.Checked, type=int)) self.crs3857 = None self.layers = {} # register plugin layer type self.tileLayerType = TileLayerType(self) QgsPluginLayerRegistry.instance().addPluginLayerType( self.tileLayerType) # connect signal-slot QgsMapLayerRegistry.instance().layerRemoved.connect(self.layerRemoved)
def reloadPlugins(self): self.modules = [] self.plugins = [] if self.allPlugins: plugin_dir = QDir( os.path.join(os.path.dirname(QFile.decodeName(__file__)), "plugins")) plugins = plugin_dir.entryList(QDir.Dirs | QDir.NoSymLinks | QDir.NoDotAndDotDot) else: p = QSettings().value("/PhyloGeoRec/plugins", "", type=unicode) plugins = p.split(",") if p else [] import importlib for name in plugins: try: modname = "PhyloGeoRec.plugins." + str(name) module = reload( sys.modules[modname] ) if modname in sys.modules else importlib.import_module( modname) self.modules.append(module) self.plugins.append(getattr(module, "plugin_class")) except ImportError: logMessage("Failed to load plugin: " + str(name))
def __init__(self, iface): # Save reference to the QGIS interface self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(QFile.decodeName(__file__)) # initialize locale settings = QSettings() locale = settings.value("locale/userLocale", "")[0:2] localePath = os.path.join(self.plugin_dir, 'i18n', '{0}.qm'.format(locale)) if os.path.exists(localePath): self.translator = QTranslator() self.translator.load(localePath) if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator) self.pluginName = self.tr("TileLayerPlugin") self.downloadTimeout = int(settings.value("/TileLayerPlugin/timeout", 30, type=int)) self.navigationMessagesEnabled = int(settings.value("/TileLayerPlugin/naviMsg", Qt.Checked, type=int)) self.crs3857 = None self.layers = {} # register plugin layer type self.tileLayerType = TileLayerType(self) QgsPluginLayerRegistry.instance().addPluginLayerType(self.tileLayerType) # connect signal-slot QgsMapLayerRegistry.instance().layerRemoved.connect(self.layerRemoved)
def data (self, modelIndex, role): # TODO: allow to enter to edit mode in filepath but don't save any changes # so we can copy the path, that is... if modelIndex.isValid () and modelIndex.row ()<self.collaggr.count: song= self.collaggr.songForIndex (modelIndex.row ()) if role==Qt.DisplayRole or role==Qt.EditRole: attr= self.attrNames [modelIndex.column ()] rawData= song[attr] if attr=='filepath': # filenames as they are rawData= QFile.decodeName (rawData) elif attr=='title' and role!=Qt.EditRole: # don't (even try to) add the [#] to the title try: queueIndex= self.playlist.indexQueue.index (modelIndex.row ()) # make it show as starting in 1, otherwise it's confusing rawData= "[%d] %s" % (queueIndex+1, rawData) except ValueError: pass data= QVariant (rawData) elif role==Qt.SizeHintRole: size= self.fontMetrics.size (Qt.TextSingleLine, self.columnWidths[modelIndex.column ()]) data= QVariant (size) elif role==Qt.BackgroundRole and self.view_.modelIndex is not None: if modelIndex.row ()==self.view_.modelIndex.row (): # highlight the current song # must return a QBrush data= QVariant (QApplication.palette ().dark ()) else: try: queueIndex= self.playlist.indexQueue.index (modelIndex.row ()) data= QVariant (QApplication.palette ().mid ()) except ValueError: data= QVariant () elif role==Qt.ForegroundRole and self.view_.modelIndex is not None: if modelIndex.row ()==self.view_.modelIndex.row (): # highlight the current song # must return a QBrush data= QVariant (QApplication.palette ().brightText ()) else: data= QVariant () else: data= QVariant () else: data= QVariant () return data
def __init__(self, parent): QDialog.__init__(self, parent) # Set up the user interface from Designer. self.ui = ui = Ui_SettingsDialog() ui.setupUi(self) ui.lineEdit_BrowserPath.setPlaceholderText( "Leave this empty to use your default browser") ui.toolButton_Browse.clicked.connect(self.browseClicked) # load settings settings = QSettings() ui.lineEdit_BrowserPath.setText( settings.value("/Qgis2threejs/browser", "", type=unicode)) enabled_plugins = QSettings().value("/Qgis2threejs/plugins", "", type=unicode).split(",") # initialize plugin table widget plugin_dir = QDir( os.path.join(os.path.dirname(QFile.decodeName(__file__)), "plugins")) plugins = plugin_dir.entryList(QDir.Dirs | QDir.NoSymLinks | QDir.NoDotAndDotDot) tableWidget = ui.tableWidget_Plugins tableWidget.setRowCount(len(plugins)) tableWidget.setColumnCount(1) tableWidget.setHorizontalHeaderLabels(["Name"]) tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) headerView = tableWidget.horizontalHeader() headerView.setResizeMode(0, QHeaderView.Stretch) self.plugin_metadata = [] for i, name in enumerate(plugins): parser = ConfigParser.SafeConfigParser() with codecs.open( os.path.join(plugin_dir.absoluteFilePath(name), "metadata.txt"), "r", "UTF-8") as f: parser.readfp(f) metadata = dict(parser.items("general")) self.plugin_metadata.append(metadata) item = QTableWidgetItem(metadata.get("name", name)) item.setCheckState(Qt.Checked if name in enabled_plugins else Qt.Unchecked) tableWidget.setItem(i, 0, item) tableWidget.selectionModel().currentRowChanged.connect( self.pluginSelectionChanged)
def __init__(self, pds=None, debug=False, forceCache=False): self.iconSizes = (128, 64, 48, 32, 22, 16) if not pds: pds = Pds(debug=debug) self.pds = pds self._forceCache = forceCache # Get possible Data Directories dataDirs = QFile.decodeName(getenv('XDG_DATA_DIRS')) if dataDirs.isEmpty(): dataDirs = QString('/usr/local/share/:/usr/share/') dataDirs.prepend(QDir.homePath() + ":") dataDirs.prepend(str(self.pds.config_path) + 'share:') if self.pds.session.ExtraDirs: dirs = QFile.decodeName(getenv( self.pds.session.ExtraDirs)).split(':') for dirName in dirs: dataDirs.append(':' + dirName + '/share') self.themeName = self.pds.settings(self.pds.session.IconKey, \ self.pds.session.DefaultIconTheme) # Define icon directories self.iconDirs = filter( lambda x: path.exists(x), map(lambda x: path.join(unicode(x), 'icons'), dataDirs.split(':'))) self.iconDirs = list(set(self.iconDirs)) logging.debug('Icon Dirs : %s' % ','.join(self.iconDirs)) self.themeIndex = self.readThemeIndex(self.themeName) self.extraIcons = ['/usr/share/pixmaps'] self.updateAvailableIcons()
def __init__(self, pds = None, debug = False, forceCache = False): self.iconSizes = (128, 64, 48, 32, 22, 16) if not pds: pds = Pds(debug = debug) self.pds = pds self._forceCache = forceCache # Get possible Data Directories dataDirs = QFile.decodeName(getenv('XDG_DATA_DIRS')) if dataDirs.isEmpty(): dataDirs = QString('/usr/local/share/:/usr/share/') dataDirs.prepend(QDir.homePath() + ":") dataDirs.prepend(str(self.pds.config_path) + 'share:') if self.pds.session.ExtraDirs: dirs = QFile.decodeName( getenv(self.pds.session.ExtraDirs)).split(':') for dirName in dirs: dataDirs.append(':' + dirName + '/share') self.themeName = self.pds.settings(self.pds.session.IconKey, \ self.pds.session.DefaultIconTheme) # Define icon directories self.iconDirs = filter(lambda x: path.exists(x), map(lambda x: path.join(unicode(x), 'icons'), dataDirs.split(':'))) self.iconDirs = list(set(self.iconDirs)) logging.debug('Icon Dirs : %s' % ','.join(self.iconDirs)) self.themeIndex = self.readThemeIndex(self.themeName) self.extraIcons = ['/usr/share/pixmaps'] self.updateAvailableIcons()
def __init__(self, iface): # Save reference to the QGIS interface self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(QFile.decodeName(__file__)) # initialize locale locale = QSettings().value('locale/userLocale')[0:2] locale_path = os.path.join(self.plugin_dir, 'i18n', 'QGISTester_{}.qm'.format(locale)) if os.path.exists(locale_path): self.translator = QTranslator() self.translator.load(locale_path) if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator) # Declare instance attributes self.menu = self.tr("&QGIS Tester")
def reloadPlugins(self): self.modules = [] self.plugins = [] allPlugins = False if allPlugins: plugin_dir = QDir(os.path.join(os.path.dirname(QFile.decodeName(__file__)), "plugins")) plugins = plugin_dir.entryList(QDir.Dirs | QDir.NoSymLinks | QDir.NoDotAndDotDot) else: p = QSettings().value("/Qgis2threejs/plugins", "", type=unicode) plugins = p.split(",") if p else [] import importlib for name in plugins: try: modname = "Qgis2threejs.plugins." + str(name) module = reload(sys.modules[modname]) if modname in sys.modules else importlib.import_module(modname) self.modules.append(module) self.plugins.append(getattr(module, "plugin_class")) except ImportError: logMessage("Failed to load plugin: " + str(name))
def __init__(self, parent): QDialog.__init__(self, parent) # Set up the user interface from Designer. self.ui = ui = Ui_SettingsDialog() ui.setupUi(self) ui.lineEdit_BrowserPath.setPlaceholderText("Leave this empty to use your default browser") ui.toolButton_Browse.clicked.connect(self.browseClicked) # load settings settings = QSettings() ui.lineEdit_BrowserPath.setText(settings.value("/Qgis2threejs/browser", "", type=unicode)) enabled_plugins = QSettings().value("/Qgis2threejs/plugins", "", type=unicode).split(",") # initialize plugin table widget plugin_dir = QDir(os.path.join(os.path.dirname(QFile.decodeName(__file__)), "plugins")) plugins = plugin_dir.entryList(QDir.Dirs | QDir.NoSymLinks | QDir.NoDotAndDotDot) tableWidget = ui.tableWidget_Plugins tableWidget.setRowCount(len(plugins)) tableWidget.setColumnCount(1) tableWidget.setHorizontalHeaderLabels(["Name"]) tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) headerView = tableWidget.horizontalHeader() headerView.setResizeMode(0, QHeaderView.Stretch) self.plugin_metadata = [] for i, name in enumerate(plugins): parser = ConfigParser.SafeConfigParser() with codecs.open(os.path.join(plugin_dir.absoluteFilePath(name), "metadata.txt"), "r", "UTF-8") as f: parser.readfp(f) metadata = dict(parser.items("general")) self.plugin_metadata.append(metadata) item = QTableWidgetItem(metadata.get("name", name)) item.setCheckState(Qt.Checked if name in enabled_plugins else Qt.Unchecked) tableWidget.setItem(i, 0, item) tableWidget.selectionModel().currentRowChanged.connect(self.pluginSelectionChanged)
def setupTreeView(self): # tree view header labels headers = [self.tr("Title"), self.tr("Attribution"), self.tr("Url"), self.tr("Zoom"), self.tr("Extent"), self.tr("yOrigin")] + ["index"] self.indexColumn = len(headers) - 1 self.model = QStandardItemModel(0, len(headers)) self.model.setHorizontalHeaderLabels(headers) self.serviceInfoList = [] # import layer definitions from external layer definition directory, and append it into the tree extDir = QSettings().value("/TileLayerPlugin/extDir", "", type=unicode) if extDir: self.importFromDirectory(extDir) # import layer definitions from TileLayerPlugin/layers directory, and append it into the tree pluginDir = os.path.dirname(QFile.decodeName(__file__)) self.importFromDirectory(os.path.join(pluginDir, "layers")) # model and style settings self.ui.treeView.setModel(self.model) self.ui.treeView.header().setResizeMode(QHeaderView.ResizeToContents) self.ui.treeView.expandAll()
def __init__(self, iface): # Save reference to the QGIS interface self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(QFile.decodeName(__file__)) # initialize locale #locale = QSettings().value("locale/userLocale")[0:2] #localePath = os.path.join(self.plugin_dir, 'i18n', 'qgis2threejs_{0}.qm'.format(locale)) # if os.path.exists(localePath): # self.translator = QTranslator() # self.translator.load(localePath) # if qVersion() > '4.3.3': # QCoreApplication.installTranslator(self.translator) self.objectTypeManager = None self.pluginManager = None self.exportSettings = {} self.lastTreeItemData = None self.settingsFilePath = None
def __init__(self, iface): # Save reference to the QGIS interface self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(QFile.decodeName(__file__)) # initialize locale #locale = QSettings().value("locale/userLocale")[0:2] #localePath = os.path.join(self.plugin_dir, 'i18n', 'qgis2threejs_{0}.qm'.format(locale)) #if os.path.exists(localePath): # self.translator = QTranslator() # self.translator.load(localePath) # if qVersion() > '4.3.3': # QCoreApplication.installTranslator(self.translator) self.objectTypeManager = None self.pluginManager = None self.exportSettings = {} self.lastTreeItemData = None self.settingsFilePath = None
def pluginDir(): return os.path.dirname(QFile.decodeName(__file__))
def draw(self, renderContext): #import pydevd #pydevd.settrace('localhost', port=9921, stdoutToServer=True, stderrToServer=True, suspend=False) self.renderContext = renderContext extent = renderContext.extent() if extent.isEmpty() or extent.width() == float("inf"): qDebug("Drawing is skipped because map extent is empty or inf.") return True mapSettings = self.iface.mapCanvas().mapSettings() painter = renderContext.painter() isDpiEqualToCanvas = painter.device().logicalDpiX( ) == mapSettings.outputDpi() if isDpiEqualToCanvas or not self.useLastZoomForPrint: # calculate zoom level tile_mpp1 = self.layerDef.TSIZE1 / self.layerDef.TILE_SIZE viewport_mpp = extent.width() / painter.viewport().width() lg = math.log(float(tile_mpp1) / float(viewport_mpp), 2) zoom = int(math.modf( lg)[1]) + 1 * (math.modf(lg)[0] > self.CHANGE_SCALE_VALUE) + 1 zoom = max(0, min(zoom, self.layerDef.zmax)) # zoom = max(self.layerDef.zmin, zoom) else: # for print composer output image, use last zoom level of map item on print composer (or map canvas) zoom = self.canvasLastZoom # zoom limit if zoom < self.layerDef.zmin: if self.plugin.navigationMessagesEnabled: msg = self.tr( "Current zoom level ({0}) is smaller than zmin ({1}): {2}" ).format(zoom, self.layerDef.zmin, self.layerDef.title) self.showBarMessage(msg, QgsMessageBar.INFO, 2) return True while True: # calculate tile range (yOrigin is top) size = self.layerDef.TSIZE1 / 2**(zoom - 1) matrixSize = 2**zoom ulx = max(0, int( (extent.xMinimum() + self.layerDef.TSIZE1) / size)) uly = max(0, int( (self.layerDef.TSIZE1 - extent.yMaximum()) / size)) lrx = min(int((extent.xMaximum() + self.layerDef.TSIZE1) / size), matrixSize - 1) lry = min(int((self.layerDef.TSIZE1 - extent.yMinimum()) / size), matrixSize - 1) # bounding box limit if self.layerDef.bbox: trange = self.layerDef.bboxDegreesToTileRange( zoom, self.layerDef.bbox) ulx = max(ulx, trange.xmin) uly = max(uly, trange.ymin) lrx = min(lrx, trange.xmax) lry = min(lry, trange.ymax) if lrx < ulx or lry < uly: # tile range is out of the bounding box return True # tile count limit tileCount = (lrx - ulx + 1) * (lry - uly + 1) if tileCount > self.MAX_TILE_COUNT: # as tile count is over the limit, decrease zoom level zoom -= 1 # if the zoom level is less than the minimum, do not draw if zoom < self.layerDef.zmin: msg = self.tr( "Tile count is over limit ({0}, max={1})").format( tileCount, self.MAX_TILE_COUNT) self.showBarMessage(msg, QgsMessageBar.WARNING, 4) return True continue # zoom level has been determined break # frame isn't drawn not in web mercator isWebMercator = self.isProjectCrsWebMercator() if not isWebMercator and self.layerDef.serviceUrl[0] == ":": if "frame" in self.layerDef.serviceUrl: # or "number" in self.layerDef.serviceUrl: msg = self.tr("Frame layer is drawn only in EPSG:3857") self.showBarMessage(msg, QgsMessageBar.INFO, 2) return True self.logT("TileLayer.draw: {0} {1} {2} {3} {4}".format( zoom, ulx, uly, lrx, lry)) # save painter state painter.save() # set pen and font painter.setPen(Qt.black) font = QFont(painter.font()) font.setPointSize(10) painter.setFont(font) if self.layerDef.serviceUrl[0] == ":": painter.setBrush(QBrush(Qt.NoBrush)) self.drawDebugInfo(renderContext, zoom, ulx, uly, lrx, lry) else: # create Tiles class object and throw url into it tiles = Tiles(zoom, ulx, uly, lrx, lry, self.layerDef) urls = [] cacheHits = 0 for ty in range(uly, lry + 1): for tx in range(ulx, lrx + 1): data = None url = self.layerDef.tileUrl(zoom, tx, ty) if self.tiles and zoom == self.tiles.zoom and url in self.tiles.tiles: data = self.tiles.tiles[url].data tiles.addTile(url, Tile(zoom, tx, ty, data)) if data is None: urls.append(url) elif data: # memory cache exists cacheHits += 1 # else: # tile was not found (Downloader.NOT_FOUND=0) self.tiles = tiles if len(urls) > 0: # fetch tile data files = self.fetchFiles(urls) for url in files.keys(): self.tiles.setImageData(url, files[url]) if self.iface: cacheHits += self.downloader.cacheHits downloadedCount = self.downloader.fetchSuccesses - self.downloader.cacheHits msg = self.tr( "{0} files downloaded. {1} caches hit.").format( downloadedCount, cacheHits) barmsg = None if self.downloader.errorStatus != Downloader.NO_ERROR: if self.downloader.errorStatus == Downloader.TIMEOUT_ERROR: barmsg = self.tr("Download Timeout - {}").format( self.name()) else: msg += self.tr(" {} files failed.").format( self.downloader.fetchErrors) if self.downloader.fetchSuccesses == 0: barmsg = self.tr( "Failed to download all {0} files. - {1}" ).format(self.downloader.fetchErrors, self.name()) self.showStatusMessage(msg, 5000) if barmsg: self.showBarMessage(barmsg, QgsMessageBar.WARNING, 4) # apply layer style oldOpacity = painter.opacity() painter.setOpacity(0.01 * (100 - self.transparency)) oldSmoothRenderHint = painter.testRenderHint( QPainter.SmoothPixmapTransform) if self.smoothRender: painter.setRenderHint(QPainter.SmoothPixmapTransform) # draw tiles if isWebMercator: # no need to reproject tiles self.drawTiles(renderContext, self.tiles) # self.drawTilesDirectly(renderContext, self.tiles) else: # reproject tiles self.drawTilesOnTheFly(renderContext, self.tiles) # restore layer style painter.setOpacity(oldOpacity) if self.smoothRender: painter.setRenderHint(QPainter.SmoothPixmapTransform, oldSmoothRenderHint) # draw credit on the bottom right corner if self.creditVisibility and self.layerDef.credit: margin, paddingH, paddingV = (3, 4, 3) # scale scaleX, scaleY = self.getScaleToVisibleExtent(renderContext) scale = max(scaleX, scaleY) painter.scale(scale, scale) visibleSWidth = painter.viewport().width() * scaleX / scale visibleSHeight = painter.viewport().height() * scaleY / scale rect = QRect(0, 0, visibleSWidth - margin, visibleSHeight - margin) textRect = painter.boundingRect(rect, Qt.AlignBottom | Qt.AlignRight, self.layerDef.credit) bgRect = QRect(textRect.left() - paddingH, textRect.top() - paddingV, textRect.width() + 2 * paddingH, textRect.height() + 2 * paddingV) painter.fillRect(bgRect, QColor(240, 240, 240, 150)) # 197, 234, 243, 150)) painter.drawText(rect, Qt.AlignBottom | Qt.AlignRight, self.layerDef.credit) if 0: # debug_mode: # draw plugin icon image = QImage( os.path.join(os.path.dirname(QFile.decodeName(__file__)), "icon_old.png")) painter.drawImage(5, 5, image) self.logT("TileLayer.draw() ends") # restore painter state painter.restore() if isDpiEqualToCanvas: # save zoom level for printing (output with different dpi from map canvas) self.canvasLastZoom = zoom return True
def draw(self, renderContext): #import pydevd #pydevd.settrace('localhost', port=9921, stdoutToServer=True, stderrToServer=True, suspend=False) self.renderContext = renderContext extent = renderContext.extent() if extent.isEmpty() or extent.width() == float("inf"): qDebug("Drawing is skipped because map extent is empty or inf.") return True mapSettings = self.iface.mapCanvas().mapSettings() painter = renderContext.painter() isDpiEqualToCanvas = painter.device().logicalDpiX() == mapSettings.outputDpi() if isDpiEqualToCanvas or not self.useLastZoomForPrint: # calculate zoom level tile_mpp1 = self.layerDef.TSIZE1 / self.layerDef.TILE_SIZE viewport_mpp = extent.width() / painter.viewport().width() lg = math.log(float(tile_mpp1) / float(viewport_mpp), 2) zoom = int(math.modf(lg)[1]) + 1*(math.modf(lg)[0] > self.CHANGE_SCALE_VALUE) + 1 zoom = max(0, min(zoom, self.layerDef.zmax)) # zoom = max(self.layerDef.zmin, zoom) else: # for print composer output image, use last zoom level of map item on print composer (or map canvas) zoom = self.canvasLastZoom # zoom limit if zoom < self.layerDef.zmin: if self.plugin.navigationMessagesEnabled: msg = self.tr("Current zoom level ({0}) is smaller than zmin ({1}): {2}").format(zoom, self.layerDef.zmin, self.layerDef.title) self.showBarMessage(msg, QgsMessageBar.INFO, 2) return True while True: # calculate tile range (yOrigin is top) size = self.layerDef.TSIZE1 / 2 ** (zoom - 1) matrixSize = 2 ** zoom ulx = max(0, int((extent.xMinimum() + self.layerDef.TSIZE1) / size)) uly = max(0, int((self.layerDef.TSIZE1 - extent.yMaximum()) / size)) lrx = min(int((extent.xMaximum() + self.layerDef.TSIZE1) / size), matrixSize - 1) lry = min(int((self.layerDef.TSIZE1 - extent.yMinimum()) / size), matrixSize - 1) # bounding box limit if self.layerDef.bbox: trange = self.layerDef.bboxDegreesToTileRange(zoom, self.layerDef.bbox) ulx = max(ulx, trange.xmin) uly = max(uly, trange.ymin) lrx = min(lrx, trange.xmax) lry = min(lry, trange.ymax) if lrx < ulx or lry < uly: # tile range is out of the bounding box return True # tile count limit tileCount = (lrx - ulx + 1) * (lry - uly + 1) if tileCount > self.MAX_TILE_COUNT: # as tile count is over the limit, decrease zoom level zoom -= 1 # if the zoom level is less than the minimum, do not draw if zoom < self.layerDef.zmin: msg = self.tr("Tile count is over limit ({0}, max={1})").format(tileCount, self.MAX_TILE_COUNT) self.showBarMessage(msg, QgsMessageBar.WARNING, 4) return True continue # zoom level has been determined break # frame isn't drawn not in web mercator isWebMercator = self.isProjectCrsWebMercator() if not isWebMercator and self.layerDef.serviceUrl[0] == ":": if "frame" in self.layerDef.serviceUrl: # or "number" in self.layerDef.serviceUrl: msg = self.tr("Frame layer is drawn only in EPSG:3857") self.showBarMessage(msg, QgsMessageBar.INFO, 2) return True self.logT("TileLayer.draw: {0} {1} {2} {3} {4}".format(zoom, ulx, uly, lrx, lry)) # save painter state painter.save() # set pen and font painter.setPen(Qt.black) font = QFont(painter.font()) font.setPointSize(10) painter.setFont(font) if self.layerDef.serviceUrl[0] == ":": painter.setBrush(QBrush(Qt.NoBrush)) self.drawDebugInfo(renderContext, zoom, ulx, uly, lrx, lry) else: # create Tiles class object and throw url into it tiles = Tiles(zoom, ulx, uly, lrx, lry, self.layerDef) urls = [] cacheHits = 0 for ty in range(uly, lry + 1): for tx in range(ulx, lrx + 1): data = None url = self.layerDef.tileUrl(zoom, tx, ty) if self.tiles and zoom == self.tiles.zoom and url in self.tiles.tiles: data = self.tiles.tiles[url].data tiles.addTile(url, Tile(zoom, tx, ty, data)) if data is None: urls.append(url) elif data: # memory cache exists cacheHits += 1 # else: # tile was not found (Downloader.NOT_FOUND=0) self.tiles = tiles if len(urls) > 0: # fetch tile data files = self.fetchFiles(urls) for url in files.keys(): self.tiles.setImageData(url, files[url]) if self.iface: cacheHits += self.downloader.cacheHits downloadedCount = self.downloader.fetchSuccesses - self.downloader.cacheHits msg = self.tr("{0} files downloaded. {1} caches hit.").format(downloadedCount, cacheHits) barmsg = None if self.downloader.errorStatus != Downloader.NO_ERROR: if self.downloader.errorStatus == Downloader.TIMEOUT_ERROR: barmsg = self.tr("Download Timeout - {}").format(self.name()) else: msg += self.tr(" {} files failed.").format(self.downloader.fetchErrors) if self.downloader.fetchSuccesses == 0: barmsg = self.tr("Failed to download all {0} files. - {1}").format( self.downloader.fetchErrors, self.name()) self.showStatusMessage(msg, 5000) if barmsg: self.showBarMessage(barmsg, QgsMessageBar.WARNING, 4) # apply layer style oldOpacity = painter.opacity() painter.setOpacity(0.01 * (100 - self.transparency)) oldSmoothRenderHint = painter.testRenderHint(QPainter.SmoothPixmapTransform) if self.smoothRender: painter.setRenderHint(QPainter.SmoothPixmapTransform) # draw tiles if isWebMercator: # no need to reproject tiles self.drawTiles(renderContext, self.tiles) # self.drawTilesDirectly(renderContext, self.tiles) else: # reproject tiles self.drawTilesOnTheFly(renderContext, self.tiles) # restore layer style painter.setOpacity(oldOpacity) if self.smoothRender: painter.setRenderHint(QPainter.SmoothPixmapTransform, oldSmoothRenderHint) # draw credit on the bottom right corner if self.creditVisibility and self.layerDef.credit: margin, paddingH, paddingV = (3, 4, 3) # scale scaleX, scaleY = self.getScaleToVisibleExtent(renderContext) scale = max(scaleX, scaleY) painter.scale(scale, scale) visibleSWidth = painter.viewport().width() * scaleX / scale visibleSHeight = painter.viewport().height() * scaleY / scale rect = QRect(0, 0, visibleSWidth - margin, visibleSHeight - margin) textRect = painter.boundingRect(rect, Qt.AlignBottom | Qt.AlignRight, self.layerDef.credit) bgRect = QRect(textRect.left() - paddingH, textRect.top() - paddingV, textRect.width() + 2 * paddingH, textRect.height() + 2 * paddingV) painter.fillRect(bgRect, QColor(240, 240, 240, 150)) # 197, 234, 243, 150)) painter.drawText(rect, Qt.AlignBottom | Qt.AlignRight, self.layerDef.credit) if 0: # debug_mode: # draw plugin icon image = QImage(os.path.join(os.path.dirname(QFile.decodeName(__file__)), "icon_old.png")) painter.drawImage(5, 5, image) self.logT("TileLayer.draw() ends") # restore painter state painter.restore() if isDpiEqualToCanvas: # save zoom level for printing (output with different dpi from map canvas) self.canvasLastZoom = zoom return True