def test_AddPALToVectorLayer(self): """Check if we can set a label field, verify that PAL is assigned and that output is rendered correctly""" # TODO: add UTM PAL-specific shps, with 4326 as on-the-fly cross-check # setCanvasCrs(26913) myShpFile = os.path.join(TEST_DATA_DIR, 'lines.shp') myVectorLayer = QgsVectorLayer(myShpFile, 'Lines', 'ogr') self._MapRegistry.addMapLayer(myVectorLayer) myLayers = QStringList() myLayers.append(myVectorLayer.id()) self._MapRenderer.setLayerSet(myLayers) self._MapRenderer.setExtent(myVectorLayer.extent()) self._Canvas.zoomToFullExtent() # check layer labeling is PAL with customProperty access # should not be activated on layer load myPalSet = myVectorLayer.customProperty( "labeling" ).toString() myMessage = '\nExpected: Empty QString\nGot: %s' % (str(myPalSet)) assert str(myPalSet) == '', myMessage # simulate clicking checkbox, setting label field and clicking apply self._testFont.setPointSize(20) myPalLyr = QgsPalLayerSettings() myPalLyr.enabled = True myPalLyr.fieldName = 'Name' myPalLyr.placement = QgsPalLayerSettings.Line myPalLyr.placementFlags = QgsPalLayerSettings.AboveLine myPalLyr.xQuadOffset = 0 myPalLyr.yQuadOffset = 0 myPalLyr.xOffset = 0 myPalLyr.yOffset = 0 myPalLyr.angleOffset = 0 myPalLyr.centroidWhole = False myPalLyr.textFont = self._testFont myPalLyr.textNamedStyle = QString("Medium") myPalLyr.textColor = Qt.black myPalLyr.textTransp = 0 myPalLyr.previewBkgrdColor = Qt.white myPalLyr.priority = 5 myPalLyr.obstacle = True myPalLyr.dist = 0 myPalLyr.scaleMin = 0 myPalLyr.scaleMax = 0 myPalLyr.bufferSize = 1 myPalLyr.bufferColor = Qt.white myPalLyr.bufferTransp = 0 myPalLyr.bufferNoFill = False myPalLyr.bufferJoinStyle = Qt.RoundJoin myPalLyr.formatNumbers = False myPalLyr.decimals = 3 myPalLyr.plusSign = False myPalLyr.labelPerPart = False myPalLyr.displayAll = True myPalLyr.mergeLines = False myPalLyr.minFeatureSize = 0.0 myPalLyr.vectorScaleFactor = 1.0 myPalLyr.rasterCompressFactor = 1.0 myPalLyr.addDirectionSymbol = False myPalLyr.upsidedownLabels = QgsPalLayerSettings.Upright myPalLyr.fontSizeInMapUnits = False myPalLyr.bufferSizeInMapUnits = False myPalLyr.labelOffsetInMapUnits = True myPalLyr.distInMapUnits = False myPalLyr.wrapChar = "" myPalLyr.preserveRotation = True myPalLyr.writeToLayer(myVectorLayer) # check layer labeling is PAL with customProperty access myPalSet = myVectorLayer.customProperty( "labeling" ).toString() myMessage = '\nExpected: pal\nGot: %s' % (str(myPalSet)) assert str(myPalSet) == 'pal', myMessage # check layer labeling is PAL via engine interface myMessage = '\nCould not get whether PAL enabled from labelingEngine' assert self._PalEngine.willUseLayer(myVectorLayer), myMessage # myChecker = QgsRenderChecker() myChecker.setControlName("expected_pal_aboveLineLabeling") myChecker.setMapRenderer(self._MapRenderer) myResult = myChecker.runTest("pal_aboveLineLabeling_python"); myMessage = ('\nVector layer \'above line\' label engine ' 'rendering test failed') assert myResult, myMessage # compare against a straight rendering/save as from QgsMapCanvasMap # unnecessary? works a bit different than QgsRenderChecker, though # myImage = os.path.join(unicode(QDir.tempPath()), # 'render_pal_aboveLineLabeling.png') # self._Map.render() # self._Canvas.saveAsImage(myImage) # myChecker.setRenderedImage(myImage) # myResult = myChecker.compareImages("pal_aboveLineLabeling_python") # myMessage = ('\nVector layer \'above line\' label engine ' # 'comparison to QgsMapCanvasMap.render() test failed') # assert myResult, myMessage self._MapRegistry.removeMapLayer(myVectorLayer.id())
def test_line_settings(self): """ Test line settings """ settings = QgsLabelLineSettings() settings.setPlacementFlags(QgsLabeling.LinePlacementFlag.OnLine) self.assertEqual(settings.placementFlags(), QgsLabeling.LinePlacementFlag.OnLine) settings.setPlacementFlags( QgsLabeling.LinePlacementFlag.OnLine | QgsLabeling.LinePlacementFlag.MapOrientation) self.assertEqual( settings.placementFlags(), QgsLabeling.LinePlacementFlag.OnLine | QgsLabeling.LinePlacementFlag.MapOrientation) settings.setMergeLines(True) self.assertTrue(settings.mergeLines()) settings.setMergeLines(False) self.assertFalse(settings.mergeLines()) settings.setAddDirectionSymbol(True) self.assertTrue(settings.addDirectionSymbol()) settings.setAddDirectionSymbol(False) self.assertFalse(settings.addDirectionSymbol()) settings.setLeftDirectionSymbol('left') self.assertEqual(settings.leftDirectionSymbol(), 'left') settings.setRightDirectionSymbol('right') self.assertEqual(settings.rightDirectionSymbol(), 'right') settings.setReverseDirectionSymbol(True) self.assertTrue(settings.reverseDirectionSymbol()) settings.setReverseDirectionSymbol(False) self.assertFalse(settings.reverseDirectionSymbol()) settings.setDirectionSymbolPlacement( QgsLabelLineSettings.DirectionSymbolPlacement.SymbolBelow) self.assertEqual( settings.directionSymbolPlacement(), QgsLabelLineSettings.DirectionSymbolPlacement.SymbolBelow) settings.setDirectionSymbolPlacement( QgsLabelLineSettings.DirectionSymbolPlacement.SymbolAbove) self.assertEqual( settings.directionSymbolPlacement(), QgsLabelLineSettings.DirectionSymbolPlacement.SymbolAbove) settings.setOverrunDistance(5.6) self.assertEqual(settings.overrunDistance(), 5.6) settings.setOverrunDistanceUnit(QgsUnitTypes.RenderInches) self.assertEqual(settings.overrunDistanceUnit(), QgsUnitTypes.RenderInches) scale = QgsMapUnitScale(1, 2) settings.setOverrunDistanceMapUnitScale(scale) self.assertEqual(settings.overrunDistanceMapUnitScale().minScale, 1) self.assertEqual(settings.overrunDistanceMapUnitScale().maxScale, 2) settings.setLineAnchorPercent(0.3) self.assertEqual(settings.lineAnchorPercent(), 0.3) # check that compatibility code works pal_settings = QgsPalLayerSettings() pal_settings.placementFlags = QgsPalLayerSettings.OnLine | QgsPalLayerSettings.MapOrientation self.assertEqual(pal_settings.placementFlags, 9) self.assertTrue( pal_settings.lineSettings().placementFlags(), QgsLabeling.LinePlacementFlag.OnLine | QgsLabeling.LinePlacementFlag.MapOrientation) pal_settings.mergeLines = True self.assertTrue(pal_settings.mergeLines) self.assertTrue(pal_settings.lineSettings().mergeLines()) pal_settings.mergeLines = False self.assertFalse(pal_settings.mergeLines) self.assertFalse(pal_settings.lineSettings().mergeLines()) pal_settings.addDirectionSymbol = True self.assertTrue(pal_settings.addDirectionSymbol) self.assertTrue(pal_settings.lineSettings().addDirectionSymbol()) pal_settings.addDirectionSymbol = False self.assertFalse(pal_settings.addDirectionSymbol) self.assertFalse(pal_settings.lineSettings().addDirectionSymbol()) pal_settings.leftDirectionSymbol = 'l' self.assertEqual(pal_settings.leftDirectionSymbol, 'l') self.assertEqual(pal_settings.lineSettings().leftDirectionSymbol(), 'l') pal_settings.rightDirectionSymbol = 'r' self.assertEqual(pal_settings.rightDirectionSymbol, 'r') self.assertEqual(pal_settings.lineSettings().rightDirectionSymbol(), 'r') pal_settings.reverseDirectionSymbol = True self.assertTrue(pal_settings.reverseDirectionSymbol) self.assertTrue(pal_settings.lineSettings().reverseDirectionSymbol()) pal_settings.reverseDirectionSymbol = False self.assertFalse(pal_settings.reverseDirectionSymbol) self.assertFalse(pal_settings.lineSettings().reverseDirectionSymbol()) pal_settings.placeDirectionSymbol = QgsPalLayerSettings.SymbolAbove self.assertEqual(pal_settings.placeDirectionSymbol, 1) self.assertTrue( pal_settings.lineSettings().directionSymbolPlacement(), QgsLabelLineSettings.DirectionSymbolPlacement.SymbolAbove) pal_settings.overrunDistance = 4.2 self.assertEqual(pal_settings.overrunDistance, 4.2) self.assertTrue(pal_settings.lineSettings().overrunDistance(), 4.2) pal_settings.overrunDistanceUnit = QgsUnitTypes.RenderInches self.assertEqual(pal_settings.overrunDistanceUnit, QgsUnitTypes.RenderInches) self.assertTrue(pal_settings.lineSettings().overrunDistanceUnit(), QgsUnitTypes.RenderInches) pal_settings.overrunDistanceMapUnitScale = scale self.assertEqual(pal_settings.overrunDistanceMapUnitScale.minScale, 1) self.assertEqual(pal_settings.overrunDistanceMapUnitScale.maxScale, 2) self.assertTrue( pal_settings.lineSettings().overrunDistanceMapUnitScale().minScale, 1) self.assertTrue( pal_settings.lineSettings().overrunDistanceMapUnitScale().maxScale, 2)
def test_AddPALToVectorLayer(self): """Check if we can set a label field, verify that PAL is assigned and that output is rendered correctly""" # TODO: add UTM PAL-specific shps, with 4326 as on-the-fly cross-check # setCanvasCrs(26913) myShpFile = os.path.join(TEST_DATA_DIR, 'lines.shp') myVectorLayer = QgsVectorLayer(myShpFile, 'Lines', 'ogr') self._MapRegistry.addMapLayer(myVectorLayer) myLayers = QStringList() myLayers.append(myVectorLayer.id()) self._MapRenderer.setLayerSet(myLayers) self._MapRenderer.setExtent(myVectorLayer.extent()) self._Canvas.zoomToFullExtent() # check layer labeling is PAL with customProperty access # should not be activated on layer load myPalSet = myVectorLayer.customProperty("labeling").toString() myMessage = '\nExpected: Empty QString\nGot: %s' % (str(myPalSet)) assert str(myPalSet) == '', myMessage # simulate clicking checkbox, setting label field and clicking apply self._testFont.setPointSize(20) myPalLyr = QgsPalLayerSettings() myPalLyr.enabled = True myPalLyr.fieldName = 'Name' myPalLyr.placement = QgsPalLayerSettings.Line myPalLyr.placementFlags = QgsPalLayerSettings.AboveLine myPalLyr.xQuadOffset = 0 myPalLyr.yQuadOffset = 0 myPalLyr.xOffset = 0 myPalLyr.yOffset = 0 myPalLyr.angleOffset = 0 myPalLyr.centroidWhole = False myPalLyr.textFont = self._testFont myPalLyr.textNamedStyle = QString("Medium") myPalLyr.textColor = Qt.black myPalLyr.textTransp = 0 myPalLyr.previewBkgrdColor = Qt.white myPalLyr.priority = 5 myPalLyr.obstacle = True myPalLyr.dist = 0 myPalLyr.scaleMin = 0 myPalLyr.scaleMax = 0 myPalLyr.bufferSize = 1 myPalLyr.bufferColor = Qt.white myPalLyr.bufferTransp = 0 myPalLyr.bufferNoFill = False myPalLyr.bufferJoinStyle = Qt.RoundJoin myPalLyr.formatNumbers = False myPalLyr.decimals = 3 myPalLyr.plusSign = False myPalLyr.labelPerPart = False myPalLyr.displayAll = True myPalLyr.mergeLines = False myPalLyr.minFeatureSize = 0.0 myPalLyr.vectorScaleFactor = 1.0 myPalLyr.rasterCompressFactor = 1.0 myPalLyr.addDirectionSymbol = False myPalLyr.upsidedownLabels = QgsPalLayerSettings.Upright myPalLyr.fontSizeInMapUnits = False myPalLyr.bufferSizeInMapUnits = False myPalLyr.labelOffsetInMapUnits = True myPalLyr.distInMapUnits = False myPalLyr.wrapChar = "" myPalLyr.preserveRotation = True myPalLyr.writeToLayer(myVectorLayer) # check layer labeling is PAL with customProperty access myPalSet = myVectorLayer.customProperty("labeling").toString() myMessage = '\nExpected: pal\nGot: %s' % (str(myPalSet)) assert str(myPalSet) == 'pal', myMessage # check layer labeling is PAL via engine interface myMessage = '\nCould not get whether PAL enabled from labelingEngine' assert self._PalEngine.willUseLayer(myVectorLayer), myMessage # myChecker = QgsRenderChecker() myChecker.setControlName("expected_pal_aboveLineLabeling") myChecker.setMapRenderer(self._MapRenderer) myResult = myChecker.runTest("pal_aboveLineLabeling_python") myMessage = ('\nVector layer \'above line\' label engine ' 'rendering test failed') assert myResult, myMessage # compare against a straight rendering/save as from QgsMapCanvasMap # unnecessary? works a bit different than QgsRenderChecker, though # myImage = os.path.join(unicode(QDir.tempPath()), # 'render_pal_aboveLineLabeling.png') # self._Map.render() # self._Canvas.saveAsImage(myImage) # myChecker.setRenderedImage(myImage) # myResult = myChecker.compareImages("pal_aboveLineLabeling_python") # myMessage = ('\nVector layer \'above line\' label engine ' # 'comparison to QgsMapCanvasMap.render() test failed') # assert myResult, myMessage self._MapRegistry.removeMapLayer(myVectorLayer.id())