def testClippingBackgroundFrame(self): """ Make sure frame/background are also clipped """ vl = QgsVectorLayer("Polygon?crs=epsg:4326&field=id:integer", "vl", "memory") props = { "color": "127,255,127", 'outline_style': 'solid', 'outline_width': '1', 'outline_color': '0,0,255' } fillSymbol = QgsFillSymbol.createSimple(props) renderer = QgsSingleSymbolRenderer(fillSymbol) vl.setRenderer(renderer) f = QgsFeature(vl.fields(), 1) for x in range(0, 15, 3): for y in range(0, 15, 3): f.setGeometry(QgsGeometry(QgsPoint(x, y)).buffer(1, 3)) vl.dataProvider().addFeature(f) p = QgsProject() p.addMapLayer(vl) layout = QgsLayout(p) layout.initializeDefaults() p.setCrs(QgsCoordinateReferenceSystem('EPSG:4326')) map = QgsLayoutItemMap(layout) map.attemptSetSceneRect(QRectF(10, 10, 180, 180)) map.setFrameEnabled(True) map.setFrameStrokeWidth( QgsLayoutMeasurement(2, QgsUnitTypes.LayoutMillimeters)) map.setBackgroundEnabled(True) map.setBackgroundColor(QColor(200, 255, 200)) map.zoomToExtent(vl.extent()) map.setLayers([vl]) layout.addLayoutItem(map) shape = QgsLayoutItemShape(layout) layout.addLayoutItem(shape) shape.setShapeType(QgsLayoutItemShape.Ellipse) shape.attemptSetSceneRect(QRectF(10, 10, 180, 180)) map.itemClippingSettings().setEnabled(True) map.itemClippingSettings().setSourceItem(shape) map.itemClippingSettings().setFeatureClippingType( QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) checker = QgsLayoutChecker('composermap_itemclip_background', layout) checker.setControlPathPrefix("composer_map") result, message = checker.testLayout() TestQgsLayoutMap.report += checker.report() self.assertTrue(result, message)
def testSaveRestore(self): p = QgsProject() l = QgsPrintLayout(p) p.layoutManager().addLayout(l) map = QgsLayoutItemMap(l) shape = QgsLayoutItemShape(l) l.addLayoutItem(map) l.addLayoutItem(shape) settings = map.itemClippingSettings() settings.setEnabled(True) settings.setFeatureClippingType( QgsMapClippingRegion.FeatureClippingType.NoClipping) settings.setForceLabelsInsideClipPath(True) settings.setSourceItem(shape) # save map to xml doc = QDomDocument("testdoc") elem = doc.createElement("test") self.assertTrue(map.writeXml(elem, doc, QgsReadWriteContext())) elem_shape = doc.createElement("shape") self.assertTrue(shape.writeXml(elem_shape, doc, QgsReadWriteContext())) layout2 = QgsPrintLayout(p) layout2.setName('test2') p.layoutManager().addLayout(layout2) map2 = QgsLayoutItemMap(layout2) layout2.addLayoutItem(map2) shape2 = QgsLayoutItemShape(layout2) layout2.addLayoutItem(shape2) self.assertFalse(map2.itemClippingSettings().enabled()) # restore from xml self.assertTrue( map2.readXml(elem.firstChildElement(), doc, QgsReadWriteContext())) self.assertTrue( shape2.readXml(elem_shape.firstChildElement(), doc, QgsReadWriteContext())) self.assertTrue(map2.itemClippingSettings().enabled()) self.assertEqual(map2.itemClippingSettings().featureClippingType(), QgsMapClippingRegion.FeatureClippingType.NoClipping) self.assertTrue( map2.itemClippingSettings().forceLabelsInsideClipPath()) self.assertIsNone(map2.itemClippingSettings().sourceItem()) map2.finalizeRestoreFromXml() self.assertEqual(map2.itemClippingSettings().sourceItem(), shape2)
def testClippedMapExtent(self): p = QgsProject() l = QgsPrintLayout(p) map = QgsLayoutItemMap(l) shape = QgsLayoutItemShape(l) l.addLayoutItem(map) map.attemptSetSceneRect(QRectF(10, 20, 100, 80)) map.zoomToExtent(QgsRectangle(100, 200, 50, 40)) l.addLayoutItem(shape) shape.setShapeType(QgsLayoutItemShape.Triangle) shape.attemptSetSceneRect(QRectF(20, 30, 70, 50)) settings = map.itemClippingSettings() settings.setEnabled(True) settings.setSourceItem(shape) geom = settings.clippedMapExtent() self.assertEqual(geom.asWkt(), 'Polygon ((-5 80, 135 80, 65 180, -5 80))')
def testToMapClippingRegion(self): p = QgsProject() l = QgsPrintLayout(p) p.layoutManager().addLayout(l) map = QgsLayoutItemMap(l) shape = QgsLayoutItemShape(l) l.addLayoutItem(map) map.attemptSetSceneRect(QRectF(10, 20, 100, 80)) map.zoomToExtent(QgsRectangle(100, 200, 50, 40)) l.addLayoutItem(shape) shape.setShapeType(QgsLayoutItemShape.Triangle) shape.attemptSetSceneRect(QRectF(20, 30, 70, 50)) settings = map.itemClippingSettings() settings.setEnabled(True) settings.setFeatureClippingType( QgsMapClippingRegion.FeatureClippingType.NoClipping) settings.setSourceItem(shape) region = settings.toMapClippingRegion() self.assertEqual(region.geometry().asWkt(), 'Polygon ((-5 80, 135 80, 65 180, -5 80))') self.assertEqual(region.featureClip(), QgsMapClippingRegion.FeatureClippingType.NoClipping)
def testClippingHideClipSource(self): """ When an item is set to be the clip source, it shouldn't render anything itself """ format = QgsTextFormat() format.setFont(QgsFontUtils.getStandardTestFont("Bold")) format.setSize(30) format.setNamedStyle("Bold") format.setColor(QColor(0, 0, 0)) settings = QgsPalLayerSettings() settings.setFormat(format) settings.fieldName = "'XXXX'" settings.isExpression = True settings.placement = QgsPalLayerSettings.OverPoint vl = QgsVectorLayer("Polygon?crs=epsg:4326&field=id:integer", "vl", "memory") props = { "color": "127,255,127", 'outline_style': 'solid', 'outline_width': '1', 'outline_color': '0,0,255' } fillSymbol = QgsFillSymbol.createSimple(props) renderer = QgsSingleSymbolRenderer(fillSymbol) vl.setRenderer(renderer) f = QgsFeature(vl.fields(), 1) for x in range(0, 15, 3): for y in range(0, 15, 3): f.setGeometry(QgsGeometry(QgsPoint(x, y)).buffer(1, 3)) vl.dataProvider().addFeature(f) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) vl.setLabelsEnabled(True) p = QgsProject() p.addMapLayer(vl) layout = QgsLayout(p) layout.initializeDefaults() p.setCrs(QgsCoordinateReferenceSystem('EPSG:4326')) map = QgsLayoutItemMap(layout) map.attemptSetSceneRect(QRectF(10, 10, 180, 180)) map.setFrameEnabled(False) map.zoomToExtent(vl.extent()) map.setLayers([vl]) layout.addLayoutItem(map) shape = QgsLayoutItemShape(layout) layout.addLayoutItem(shape) shape.setShapeType(QgsLayoutItemShape.Ellipse) shape.attemptSetSceneRect(QRectF(10, 10, 180, 180)) map.itemClippingSettings().setEnabled(True) map.itemClippingSettings().setSourceItem(shape) map.itemClippingSettings().setForceLabelsInsideClipPath(False) map.itemClippingSettings().setFeatureClippingType( QgsMapClippingRegion.FeatureClippingType.ClipToIntersection) checker = QgsLayoutChecker('composermap_itemclip_nodrawsource', layout) checker.setControlPathPrefix("composer_map") result, message = checker.testLayout() TestQgsLayoutMap.report += checker.report() self.assertTrue(result, message)