def append_CartographicLineSymbolLayer(symbol, layer): """ Appends a CartographicLineSymbolLayer to a symbol """ color = symbol_color_to_qcolor(layer.color) out = QgsSimpleLineSymbolLayer(color) out.setEnabled(layer.enabled) out.setLocked(layer.locked) out.setWidth(points_to_mm(layer.width)) out.setPenJoinStyle(symbol_pen_to_qpenjoinstyle(layer.join)) out.setPenCapStyle(symbol_pen_to_qpencapstyle(layer.cap)) if layer.pattern_parts: interval = layer.pattern_interval dash_vector = [] for part in layer.pattern_parts: dash_vector.append(points_to_mm(part[0] * interval)) dash_vector.append(points_to_mm(part[1] * interval)) out.setCustomDashVector(dash_vector) out.setUseCustomDashPattern(True) # better matching of null stroke color to QGIS symbology if out.color().alpha() == 0: out.setPenStyle(Qt.NoPen) if layer.marker_positions or layer.marker: raise NotImplementedException( 'Cartographic line start/end markers are not yet supported') # todo - change to new symbol layer if outline offset set symbol.appendSymbolLayer(out)
def testSimpleLineUnitDefault(self): symbol = QgsSimpleLineSymbolLayer(QColor("black"), 1) symbol.setCustomDashVector([10, 10]) symbol.setUseCustomDashPattern(True) symbol.setOffset(5) dom, root = self.symbolToSld(symbol) # print ("Simple line px: \n" + dom.toString()) self.assertStrokeWidth(root, 1, 4) self.assertDashPattern(root, 4, '36 36') self.assertStaticPerpendicularOffset(root, '18')
def testSimpleLineUnitDefault(self): symbol = QgsSimpleLineSymbolLayer(QColor("black"), 1) symbol.setCustomDashVector([10, 10]) symbol.setUseCustomDashPattern(True) symbol.setOffset(5) dom, root = self.symbolToSld(symbol) # print ("Simple line px: \n" + dom.toString()) self.assertStrokeWidth(root, 1, 4) self.assertDashPattern(root, 4, '36 36') self.assertStaticPerpendicularOffset(root, '18')
def testSimpleLineUnitPixel(self): symbol = QgsSimpleLineSymbolLayer(QColor("black"), 1) symbol.setCustomDashVector([10, 10]) symbol.setUseCustomDashPattern(True) symbol.setOffset(5) symbol.setOutputUnit(QgsUnitTypes.RenderPixels) dom, root = self.symbolToSld(symbol) # print ("Simple line px: \n" + dom.toString()) self.assertStrokeWidth(root, 1, 1) self.assertDashPattern(root, 4, '10 10') self.assertStaticPerpendicularOffset(root, '5')
def testSimpleLineUnitPixel(self): symbol = QgsSimpleLineSymbolLayer(QColor("black"), 1) symbol.setCustomDashVector([10, 10]) symbol.setUseCustomDashPattern(True) symbol.setOffset(5) symbol.setOutputUnit(QgsUnitTypes.RenderPixels) dom, root = self.symbolToSld(symbol) # print ("Simple line px: \n" + dom.toString()) self.assertStrokeWidth(root, 1, 1) self.assertDashPattern(root, 4, '10 10') self.assertStaticPerpendicularOffset(root, '5')
def testSimpleLineWithCustomDashPatternHairline(self): """ test that rendering a simple line symbol with custom dash pattern""" layer = QgsSimpleLineSymbolLayer(QColor(0, 0, 0)) layer.setWidth(0) layer.setCustomDashVector([3, 3, 2, 2]) layer.setUseCustomDashPattern(True) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() geom = QgsGeometry.fromWkt('LineString (0 0, 10 0, 10 10, 0 10, 0 0)') f = QgsFeature() f.setGeometry(geom) extent = geom.constGet().boundingBox() # buffer extent by 10% extent = extent.buffered((extent.height() + extent.width()) / 20.0) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) image.fill(QColor(255, 255, 255)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) painter.end() self.assertTrue( self.imageCheck( 'symbol_layer_simpleline_customdashpattern_hairline', 'simpleline_customdashpattern_hairline', image))
def testSimpleLineWithCustomDashPattern(self): """ test that rendering a simple line symbol with custom dash pattern""" layer = QgsSimpleLineSymbolLayer(QColor(0, 0, 0)) layer.setWidth(0.5) layer.setCustomDashVector([2, 5]) layer.setUseCustomDashPattern(True) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() geom = QgsGeometry.fromWkt('LineString (0 0, 10 0, 10 10, 0 10, 0 0)') f = QgsFeature() f.setGeometry(geom) extent = geom.constGet().boundingBox() # buffer extent by 10% extent = extent.buffered((extent.height() + extent.width()) / 20.0) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) image.fill(QColor(255, 255, 255)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) painter.end() self.assertTrue(self.imageCheck('symbol_layer_simpleline_customdashpattern', 'simpleline_customdashpattern', image))