示例#1
0
    def subRenderer(self, color):
        lineSymbol = QgsLineSymbolV2()
        arrowSymbol = QgsArrowSymbolLayer().create()
        arrowSymbol.setArrowWidth(0.0)
        arrowSymbol.setArrowStartWidth(0.0)
        arrowSymbol.setColor(color)
        arrowSymbol.setIsCurved(False)
        arrowSymbol.setIsRepeated(False)
        renderSetting = QgsRenderContext()
        renderSetting.setFlag(QgsRenderContext.Antialiasing, False)
        renderSetting.setFlag(QgsRenderContext.DrawSymbolBounds, False)
        renderSetting.setFlag(QgsRenderContext.ForceVectorOutput, False)
        renderSetting.setFlag(QgsRenderContext.UseAdvancedEffects, False)
        renderSetting.setFlag(QgsRenderContext.UseRenderingOptimization, False)

        arrEffectStack = arrowSymbol.paintEffect()
        effList = arrEffectStack.effectList()
        for i in range(0, len(effList)):
            if type(effList[i]) == QgsDrawSourceEffect:
                effList[i].setDrawMode(1)
        arrEffectStack.setEnabled(True)

        lineSymbol.appendSymbolLayer(arrowSymbol)

        return lineSymbol
示例#2
0
 def __init__(self, iface, name, qcolor, width, attributes, layer_group=None, visible=True):
     "..."
     WGS84Layer.__init__(self, iface, name, "LineString", visible, layer_group)
     arrow_layer = QgsArrowSymbolLayer()
     arrow_layer.setColor(qcolor)
     arrow_layer.setArrowWidth(width)
     arrow_layer.setArrowStartWidth(width)
     arrow_layer.setHeadThickness(width * 2.0)
     self.layer.renderer().symbol().changeSymbolLayer(0, arrow_layer)
     WGS84Layer.refresh_legend(self)
     self.set_attributes(attributes)
示例#3
0
 def changeSymbol(self):
     """Change symbology from seleted layer"""
     if isinstance(self.lyr.renderer(),QgsSingleSymbolRenderer) == True:
         symbLyr = QgsArrowSymbolLayer()
         symbLyr.setIsCurved(False)
         symbLyr.setIsRepeated(True)
         self.lyr.renderer().symbol().changeSymbolLayer(0, symbLyr)
         self.lyr.triggerRepaint()
         self.iface.layerTreeView().refreshLayerSymbology(self.lyr.id())
     else:
         QMessageBox.warning(None,"Can't change symbology","The layer must be single symbol")
示例#4
0
    def _render_route_layer(self, _list):
        self.routeLayer = QgsVectorLayer(
            "LineString?crs=" + self.featLayer.crs().authid(),
            self.featLayer.name() + "_Route", "memory")
        routePr = self.routeLayer.dataProvider()
        self.routeLayer.startEditing()
        _symbol = QgsLineSymbol()
        _symbol.appendSymbolLayer(QgsArrowSymbolLayer())
        self.routeLayer.renderer().setSymbol(_symbol)
        for idx in range(len(_list) - 1):
            route_seg = [_list[idx], _list[idx + 1]]
            feat = QgsFeature()
            feat.setGeometry(QgsGeometry.fromPolylineXY(route_seg))
            routePr.addFeatures([feat])
        self.routeLayer.commitChanges()

        self._add_layer(self.routeLayer)
示例#5
0
    def testRingNumberVariable(self):
        # test test geometry_ring_num variable
        s3 = QgsFillSymbol()
        s3.deleteSymbolLayer(0)
        s3.appendSymbolLayer(QgsArrowSymbolLayer())
        s3.symbolLayer(0).setIsCurved(False)
        s3.symbolLayer(0).subSymbol()[0].setDataDefinedProperty(
            QgsSymbolLayer.PropertyFillColor,
            QgsProperty.fromExpression(
                'case when @geometry_ring_num=0 then \'green\' when @geometry_ring_num=1 then \'blue\' when @geometry_ring_num=2 then \'red\' end'
            ))

        g = QgsGeometry.fromWkt(
            'Polygon((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1),(8 8, 9 8, 9 9, 8 9, 8 8))'
        )
        rendered_image = self.renderGeometry(s3, g)
        assert self.imageCheck('arrow_ring_num', 'arrow_ring_num',
                               rendered_image)
    def test_subsymbol(self):
        """
        Test rendering a generator in a subsymbol of another symbol
        """
        sym = QgsLineSymbol()
        arrow = QgsArrowSymbolLayer()
        arrow.setIsRepeated(False)
        arrow.setArrowStartWidth(10)
        arrow.setArrowWidth(5)
        arrow.setHeadLength(20)
        arrow.setHeadThickness(10)

        sym.changeSymbolLayer(0, arrow)

        self.lines_layer.renderer().setSymbol(sym)

        # here "$geometry" must refer to the created ARROW shape, NOT the original feature line geometry!
        generator_layer = QgsGeometryGeneratorSymbolLayer.create(
            {'geometryModifier': 'buffer($geometry, 3)'})
        generator_layer.setSymbolType(QgsSymbol.Fill)
        generator_layer.setUnits(QgsUnitTypes.RenderMillimeters)
        self.assertIsNotNone(generator_layer.subSymbol())

        generator_layer.subSymbol().symbolLayer(0).setColor(
            QColor(255, 255, 255))
        generator_layer.subSymbol().symbolLayer(0).setStrokeColor(
            QColor(0, 0, 0))
        generator_layer.subSymbol().symbolLayer(0).setStrokeWidth(2)

        sub_symbol = QgsFillSymbol()
        sub_symbol.changeSymbolLayer(0, generator_layer)
        arrow.setSubSymbol(sub_symbol)

        rendered_layers = [self.lines_layer]
        self.mapsettings.setLayers(rendered_layers)

        renderchecker = QgsMultiRenderChecker()
        renderchecker.setMapSettings(self.mapsettings)
        renderchecker.setControlName('expected_geometrygenerator_subsymbol')
        res = renderchecker.runTest('geometrygenerator_subsymbol')
        self.report += renderchecker.report()
        self.assertTrue(res)