Пример #1
0
    def make_svg_node_sym_renderer(self, vlay, icon_name, size):

        current_dir = os.path.dirname(__file__)

        svg_style = dict()
        svg_style['name'] = os.path.join(current_dir, icon_name)
        svg_style['size'] = str(size)
        symbol_layer = QgsSvgMarkerSymbolLayerV2.create(svg_style)
        symbol = QgsSymbolV2.defaultSymbol(vlay.geometryType())
        symbol.changeSymbolLayer(0, symbol_layer)
        renderer = QgsSingleSymbolRendererV2(symbol)

        return renderer
Пример #2
0
    def __init__(self,
                 iface,
                 layer_name,
                 svg_size,
                 attributes,
                 svg_resource,
                 group=None,
                 visible=True):
        "..."
        self.svg_path = os.path.dirname(__file__) + "/icons/"
        WGS84Layer.__init__(self, iface, layer_name, "Point", visible, group)

        props = self.layer.rendererV2().symbol().symbolLayer(0).properties()
        svgStyle = {}
        svgStyle['name'] = self.svg_path + svg_resource
        svgStyle['outline'] = '#00000'
        svgStyle['outline-width'] = '0'
        svgStyle['size'] = svg_size
        symbol_layer = QgsSvgMarkerSymbolLayerV2.create(svgStyle)

        # Rotate the svg to reflect the orientation of a landmark
        # admap uses a counter-clockwise orientation with radians, qgis a clockwise and degrees
        dataDefinedAngle = QgsDataDefined(
            True, True, '(-("Orientation" * 180 / pi()) - 90) % 360')
        symbol_layer.setDataDefinedProperty('angle', dataDefinedAngle)

        # Make the SVG size scalable with the zoom level of the map
        # i.e. less zoom, smaller SVG
        dataDefinedSize = QgsDataDefined(
            True, True,
            'CASE WHEN @map_scale < 500 THEN 1000 / @map_scale ELSE 2 END')
        symbol_layer.setDataDefinedProperty('size', dataDefinedSize)
        self.layer.rendererV2().symbols()[0].changeSymbolLayer(0, symbol_layer)

        WGS84Layer.refresh_legend(self)
        self.set_attributes(attributes)
Пример #3
0
    def run(self):
        """Run method that performs all the real work"""

        #field_expression_widget.show()
        self.dlg.show()
        #set in combobox layer to active layer
        try:
            QgsMessageLog.logMessage("changing layer to selected in legend",
                                     tag="SvgBubble")
            selectedLayer = self.iface.activeLayer(
            )  #iface.legendInterface().selectedLayers()
            self.dlg.lyrCombobox.setLayer(selectedLayer)
        except:
            QgsMessageLog.logMessage("cant set selected layer",
                                     tag="SvgBubble")

        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
            QgsMessageLog.logMessage("Start calculate values", tag="SvgBubble")
            layer = self.dlg.lyrCombobox.currentLayer()
            self.iface.setActiveLayer(layer)
            LAYER_NAME = layer.id()  #.name()
            PROJECT_PATH = QgsProject.instance().readPath("./")
            QgsMessageLog.logMessage("Folder={} Layer={}".format(
                PROJECT_PATH, LAYER_NAME),
                                     tag="SvgBubble")
            provider = layer.dataProvider()
            #QMessageBox.information(None, "Layer info", ",".join(map(lambda x:x.currentText(),exprs)))
            # Add new column to layer
            idx = provider.fieldNameIndex(C_SVG_NAME)
            if idx == -1:
                QgsMessageLog.logMessage("Create field={}".format(C_SVG_NAME),
                                         tag="SvgBubble")
                provider.addAttributes([QgsField(C_SVG_NAME, QVariant.String)])
            idx = provider.fieldNameIndex(C_SVG_RADIUS)
            if idx == -1:
                QgsMessageLog.logMessage(
                    "Create field={}".format(C_SVG_RADIUS), tag="SvgBubble")
                provider.addAttributes(
                    [QgsField(C_SVG_RADIUS, QVariant.Double, 'double', 20, 2)])
            layer.updateFields()
            ##############  UPDATE VIRTUAL FIELD
            QgsMessageLog.logMessage("Create field={}".format(C_SVG_PATH),
                                     tag="SvgBubble")
            caps_string = layer.dataProvider().capabilitiesString()
            QgsMessageLog.logMessage(
                "Layer capabilities={}".format(caps_string), tag="SvgBubble")

            isExpPresent = False
            field = QgsField(C_SVG_PATH, QVariant.String)
            field_exp = "eval('@project_folder')+'/{}/'+ \"{}\"".format(
                LAYER_NAME, C_SVG_NAME)
            for _idx, atr in enumerate(layer.pendingFields()):
                QgsMessageLog.logMessage("All fields=[{}]{}".format(
                    str(_idx), str(atr.name())),
                                         tag="SvgBubble")
                if atr.name() == C_SVG_PATH:
                    QgsMessageLog.logMessage("Old layer idx={}".format(
                        str(_idx)),
                                             tag="SvgBubble")
                    #layer.removeExpressionField(_idx) #not work
                    #layer.deleteAttribute(_idx)       #not work on expression
                    layer.updateExpressionField(_idx, field_exp)
                    isExpPresent = True
                    QgsMessageLog.logMessage(
                        "Field {} updated".format(C_SVG_PATH), tag="SvgBubble")
                    break
            if not isExpPresent:
                layer.addExpressionField(field_exp, field)
                QgsMessageLog.logMessage("Field {} created".format(C_SVG_PATH),
                                         tag="SvgBubble")
            QgsMessageLog.logMessage("Field func={}".format(field_exp),
                                     tag="SvgBubble")
            layer.updateFields()
            #############   start edit layer feature
            layer.startEditing()
            # Set new column value
            QgsMessageLog.logMessage("Start updating table data",
                                     tag="SvgBubble")
            preset_rows = self.dlg.preset_rows
            svg_drawer = SvgDrawer("{}/{}".format(PROJECT_PATH, LAYER_NAME))
            for f in layer.getFeatures():
                #well_idx = layer.fieldNameIndex('well_id')
                #QgsMessageLog.logMessage(str(f.attributes()[well_idx]), tag="SvgBubble")
                #values=map(lambda x:x.evaluate(f),exp_lst)#exp.evaluate(f)
                #QMessageBox.information(None, "Layer info",str(values))  #!!!!!DEBUG
                preset_rows.setFeature(f)
                bubles = {}
                for key, presets in preset_rows.asDict().items():
                    bubl_parts = []
                    for preset in presets:
                        QgsMessageLog.logMessage(str(preset.exp_txt),
                                                 tag="SvgBubble",
                                                 level=3)
                        val = preset.execute()
                        QgsMessageLog.logMessage(str(val),
                                                 tag="SvgBubble",
                                                 level=3)
                        color = preset.color_hex
                        if val is None: continue
                        else: bubl_parts.append([color, val])
                        #QMessageBox.information(None, "execute info","{}:{}".format(key,str(bubl_parts)))  #!!!!!DEBUG
                    if len(bubl_parts) > 0:
                        bubles[key] = bubl_parts
                    else:
                        pass
                QgsMessageLog.logMessage(str(bubles), tag="SvgBubble", level=3)
                svg_name, svg_size = svg_drawer.to_multibubl_svg(bubles)
                QgsMessageLog.logMessage(str(svg_name),
                                         tag="SvgBubble",
                                         level=2)
                #QMessageBox.information(None, "Execute result saved to",str(res_path))  #!!!!!DEBUG
                if not svg_name is None:
                    layer.changeAttributeValue(
                        f.id(), layer.fieldNameIndex(C_SVG_NAME), svg_name)
                    layer.changeAttributeValue(
                        f.id(), layer.fieldNameIndex(C_SVG_RADIUS), svg_size)
            QgsMessageLog.logMessage("End feature iterator", tag="SvgBubble")
            layer.commitChanges()
            # create a new rule-based renderer
            # get the "root" rule
            svgStyle = {}
            svgStyle['name'] = '"bubbl"'
            svgStyle["name_dd_active"] = "1"
            svgStyle["name_dd_expression"] = ""
            svgStyle['name_dd_field'] = C_SVG_PATH
            svgStyle['name_dd_useexpr'] = "0"
            svgStyle["offset"] = "0.0"
            svgStyle["scale_method"] = "diameter"
            svgStyle["size"] = "1"
            svgStyle["size_dd_active"] = "1"
            svgStyle["size_dd_expression"] = '"{}"/1000'.format(C_SVG_RADIUS)
            svgStyle['size_dd_field'] = ''
            svgStyle['size_dd_useexpr'] = "1"
            svgStyle['idx'] = "bubbl_layer"
            symbol_layer = QgsSvgMarkerSymbolLayerV2.create(svgStyle)
            symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())

            renderer = QgsSingleSymbolRendererV2(symbol)
            QgsMessageLog.logMessage("set renderer", tag="SvgBubble")
            # assign the created renderer to the layer
            isSvgVisible = False
            for _idx_sym, preset_sym in enumerate(
                    layer.rendererV2().symbols()):
                for _idx_symlyr, preset_symlyr in enumerate(
                        preset_sym.symbolLayers()):
                    lyr_type = preset_symlyr.layerType()
                    lyr_prop = preset_symlyr.properties()
                    if lyr_type == "SvgMarker" and lyr_prop[
                            "name_dd_field"] == C_SVG_PATH:
                        QgsMessageLog.logMessage("symbollayer properties=" +
                                                 str(lyr_prop),
                                                 tag="SvgBubble")
                        QgsMessageLog.logMessage("symbollayer type=" +
                                                 str(lyr_type),
                                                 tag="SvgBubble")
                        #renderer.symbols()[_idx_sym].changeSymbolLayer(_idx_symlyr, symbol_layer)
                        isSvgVisible = True
                        break
            if not isSvgVisible:
                #layer.rendererV2().symbols()[0].appendSymbolLayer(symbol_layer)
                layer.rendererV2().symbols()[0].insertSymbolLayer(
                    0, symbol_layer)

                #renderer.symbols()[0].changeSymbolLayer(0, symbol_layer)
            #if renderer is not None:   layer.setRendererV2(renderer)
            #layer.setRendererV2(renderer)
            QgsMessageLog.logMessage("repaint", tag="SvgBubble")
            layer.triggerRepaint()
            QgsMessageLog.logMessage("Finished", tag="SvgBubble")

            pass