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
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)
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")
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)
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)