def testPartNum(self): # test geometry_part_num variable s = QgsLineSymbol() s.deleteSymbolLayer(0) sym_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'segments_to_lines($geometry)'}) sym_layer.setSymbolType(QgsSymbol.Line) s.appendSymbolLayer(sym_layer) marker_line = QgsMarkerLineSymbolLayer(False) marker_line.setPlacement(QgsMarkerLineSymbolLayer.FirstVertex) f = QgsFontUtils.getStandardTestFont('Bold', 24) marker = QgsFontMarkerSymbolLayer(f.family(), 'x', 24, QColor(255, 255, 0)) marker.setDataDefinedProperty(QgsSymbolLayer.PropertyCharacter, QgsProperty.fromExpression('@geometry_part_num')) marker_symbol = QgsMarkerSymbol() marker_symbol.changeSymbolLayer(0, marker) marker_line.setSubSymbol(marker_symbol) marker_line.setAverageAngleLength(0) line_symbol = QgsLineSymbol() line_symbol.changeSymbolLayer(0, marker_line) sym_layer.setSubSymbol(line_symbol) # rendering test g = QgsGeometry.fromWkt('LineString(0 0, 10 0, 10 10, 0 10)') rendered_image = self.renderGeometry(s, g, buffer=4) assert self.imageCheck('part_num_variable', 'part_num_variable', rendered_image) marker.setDataDefinedProperty(QgsSymbolLayer.PropertyCharacter, QgsProperty.fromExpression('@geometry_part_count')) # rendering test g = QgsGeometry.fromWkt('LineString(0 0, 10 0, 10 10, 0 10)') rendered_image = self.renderGeometry(s, g, buffer=4) assert self.imageCheck('part_count_variable', 'part_count_variable', rendered_image)
def testFontMarkerUnitDefault(self): symbol = QgsFontMarkerSymbolLayer('sans', ',', 10, QColor('black'), 45) symbol.setOffset(QPointF(5, 10)) dom, root = self.symbolToSld(symbol) # print("Font marker unit mm: " + dom.toString()) # Check the size has been rescaled self.assertStaticSize(root, '36') self.assertStaticRotation(root, '45') self.assertStaticDisplacement(root, 18, 36)
def testFontMarkerUnitPixel(self): symbol = QgsFontMarkerSymbolLayer('sans', ',', 10, QColor('black'), 45) symbol.setOffset(QPointF(5, 10)) symbol.setOutputUnit(QgsUnitTypes.RenderPixels) dom, root = self.symbolToSld(symbol) # print ("Font marker unit mm: " + dom.toString()) # Check the size has been rescaled self.assertStaticSize(root, '10') self.assertStaticRotation(root, '45') self.assertStaticDisplacement(root, 5, 10)
def testQgsFontMarkerSymbolLayer(self): """ Create a new style from a .sld file and match test """ mTestName = 'QgsFontMarkerSymbolLayer' mFilePath = QDir.toNativeSeparators('%s/symbol_layer/%s.sld' % (unitTestDataPath(), mTestName)) mDoc = QDomDocument(mTestName) mFile = QFile(mFilePath) mFile.open(QIODevice.ReadOnly) mDoc.setContent(mFile, True) mFile.close() mSymbolLayer = QgsFontMarkerSymbolLayer.createFromSld( mDoc.elementsByTagName('PointSymbolizer').item(0).toElement()) mExpectedValue = type(QgsFontMarkerSymbolLayer()) mValue = type(mSymbolLayer) mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = 'Arial' mValue = mSymbolLayer.fontFamily() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = "M" mValue = mSymbolLayer.character() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = 6.23 mValue = mSymbolLayer.size() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = 3 mValue = mSymbolLayer.angle() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage
def test_feature_geometry(self): """ The geometry($currentfeature) expression used in a subsymbol should refer to the original FEATURE geometry """ points = QgsVectorLayer('Point?crs=epsg:4326', 'Points', 'memory') self.assertTrue(points.isValid()) f = QgsFeature() f.setGeometry(QgsGeometry.fromWkt('Point(1 2)')) points.dataProvider().addFeature(f) font = QgsFontUtils.getStandardTestFont('Bold') font_marker = QgsFontMarkerSymbolLayer(font.family(), 'x', 16) font_marker.setDataDefinedProperty( QgsSymbolLayer.PropertyCharacter, QgsProperty.fromExpression( 'geom_to_wkt(geometry($currentfeature))')) subsymbol = QgsMarkerSymbol() subsymbol.changeSymbolLayer(0, font_marker) parent_generator = QgsGeometryGeneratorSymbolLayer.create( {'geometryModifier': 'translate($geometry, 1, 2)'}) parent_generator.setSymbolType(QgsSymbol.Marker) parent_generator.setSubSymbol(subsymbol) geom_symbol = QgsMarkerSymbol() geom_symbol.changeSymbolLayer(0, parent_generator) points.renderer().setSymbol(geom_symbol) mapsettings = QgsMapSettings(self.mapsettings) mapsettings.setExtent(QgsRectangle(0, 0, 5, 5)) mapsettings.setLayers([points]) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlName( 'expected_geometrygenerator_feature_geometry') res = renderchecker.runTest('geometrygenerator_feature_geometry') self.report += renderchecker.report() self.assertTrue(res)
def testPartNumPolygon(self): # test geometry_part_num variable s = QgsFillSymbol() marker_line = QgsMarkerLineSymbolLayer(False) marker_line.setPlacement(QgsMarkerLineSymbolLayer.FirstVertex) f = QgsFontUtils.getStandardTestFont('Bold', 24) marker = QgsFontMarkerSymbolLayer(f.family(), 'x', 24, QColor(255, 255, 0)) marker.setDataDefinedProperty( QgsSymbolLayer.PropertyCharacter, QgsProperty.fromExpression('@geometry_part_num')) marker_symbol = QgsMarkerSymbol() marker_symbol.changeSymbolLayer(0, marker) marker_line.setSubSymbol(marker_symbol) marker_line.setAverageAngleLength(0) s.changeSymbolLayer(0, marker_line) # rendering test - a polygon with a smaller part first g = QgsGeometry.fromWkt( 'MultiPolygon(((0 0, 2 0, 2 2, 0 0)),((10 0, 10 10, 0 10, 10 0)))') rendered_image = self.renderGeometry(s, g, buffer=4) assert self.imageCheck('poly_part_num_variable', 'poly_part_num_variable', rendered_image)
def testQgsFontMarkerSymbolLayer(self): """ Create a new style from a .sld file and match test """ mTestName = "QgsFontMarkerSymbolLayer" mFilePath = QDir.toNativeSeparators("%s/symbol_layer/%s.sld" % (unitTestDataPath(), mTestName)) mDoc = QDomDocument(mTestName) mFile = QFile(mFilePath) mFile.open(QIODevice.ReadOnly) mDoc.setContent(mFile, True) mFile.close() mSymbolLayer = QgsFontMarkerSymbolLayer.createFromSld( mDoc.elementsByTagName("PointSymbolizer").item(0).toElement() ) mExpectedValue = type(QgsFontMarkerSymbolLayer()) mValue = type(mSymbolLayer) mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = "Arial" mValue = mSymbolLayer.fontFamily() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = "M" mValue = mSymbolLayer.character() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = 6.23 mValue = mSymbolLayer.size() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage mExpectedValue = 3 mValue = mSymbolLayer.angle() mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue) assert mExpectedValue == mValue, mMessage
def append_CharacterMarkerSymbolLayer(symbol, layer): """ Appends a CharacterMarkerSymbolLayer to a symbol """ font_family = layer.font character = chr(layer.unicode) size = points_to_mm(layer.size) color = symbol_color_to_qcolor(layer.color) angle = 360 - layer.angle out = QgsFontMarkerSymbolLayer(font_family, character, size, color, angle) # TODO # out.setEnabled(layer.enabled) out.setLocked(layer.locked) out.setOffset( QPointF(points_to_mm(layer.x_offset), points_to_mm(layer.y_offset))) symbol.appendSymbolLayer(out)
def append_CharacterMarkerSymbolLayer(symbol, layer): """ Appends a CharacterMarkerSymbolLayer to a symbol """ font_family = layer.font character = chr(layer.unicode) color = symbol_color_to_qcolor(layer.color) angle = convert_angle(layer.angle) out = QgsFontMarkerSymbolLayer(font_family, character, layer.size, color, angle) out.setSizeUnit(QgsUnitTypes.RenderPoints) out.setEnabled(layer.enabled) out.setLocked(layer.locked) # TODO ArcGIS does not have the same offset/rotation linkages as QGIS does! out.setOffset(QPointF(layer.x_offset, layer.y_offset)) out.setOffsetUnit(QgsUnitTypes.RenderPoints) symbol.appendSymbolLayer(out)
def append_CharacterMarkerSymbolLayerAsFont(symbol, layer, context: Context): """ Appends a CharacterMarkerSymbolLayer to a symbol, using QGIS font marker symbols """ font_family = layer.font character = chr(layer.unicode) color = symbol_color_to_qcolor(layer.color) angle = convert_angle(layer.angle) out = QgsFontMarkerSymbolLayer(font_family, character, context.convert_size(layer.size), color, angle) out.setSizeUnit(context.units) out.setEnabled(layer.enabled) out.setLocked(layer.locked) out.setOffset( adjust_offset_for_rotation( QPointF(context.convert_size(layer.x_offset), -context.convert_size(layer.y_offset)), layer.angle)) out.setOffsetUnit(context.units) symbol.appendSymbolLayer(out)