Пример #1
0
    def test_clipping(self):
        vectorFileInfo = QFileInfo(unitTestDataPath() + "/france_parts.shp")
        vectorLayer = QgsVectorLayer(vectorFileInfo.filePath(),
                                     vectorFileInfo.completeBaseName(), "ogr")

        p = QgsProject()
        p.addMapLayers([vectorLayer])

        # create layout with layout map

        # select epsg:2154
        crs = QgsCoordinateReferenceSystem('epsg:2154')
        p.setCrs(crs)

        layout = QgsPrintLayout(p)
        layout.initializeDefaults()

        # fix the renderer, fill with green
        props = {"color": "0,127,0", 'outline_style': 'no'}
        fillSymbol = QgsFillSymbol.createSimple(props)
        renderer = QgsSingleSymbolRenderer(fillSymbol)
        vectorLayer.setRenderer(renderer)

        # the atlas map
        atlas_map = QgsLayoutItemMap(layout)
        atlas_map.attemptSetSceneRect(QRectF(20, 20, 130, 130))
        atlas_map.setFrameEnabled(False)
        atlas_map.setLayers([vectorLayer])
        layout.addLayoutItem(atlas_map)

        # the atlas
        atlas = layout.atlas()
        atlas.setCoverageLayer(vectorLayer)
        atlas.setEnabled(True)

        atlas_map.setExtent(
            QgsRectangle(332719.06221504929, 6765214.5887386119,
                         560957.85090677091, 6993453.3774303338))

        atlas_map.setAtlasDriven(True)
        atlas_map.setAtlasScalingMode(QgsLayoutItemMap.Auto)
        atlas_map.setAtlasMargin(0.10)

        atlas_map.atlasClippingSettings().setEnabled(True)

        atlas.beginRender()

        for i in range(0, 2):
            atlas.seekTo(i)

            checker = QgsLayoutChecker('atlas_clipping%d' % (i + 1), layout)
            checker.setControlPathPrefix("atlas")
            myTestResult, myMessage = checker.testLayout(0, 200)
            self.report += checker.report()

            self.assertTrue(myTestResult, myMessage)
        atlas.endRender()
    def testSaveRestore(self):
        p = QgsProject()
        l1 = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer",
                            "addfeat", "memory")
        l2 = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer",
                            "addfeat", "memory")
        p.addMapLayers([l1, l2])

        l = QgsLayout(p)
        map = QgsLayoutItemMap(l)

        settings = map.atlasClippingSettings()
        settings.setEnabled(True)
        settings.setFeatureClippingType(
            QgsMapClippingRegion.FeatureClippingType.NoClipping)
        settings.setForceLabelsInsideFeature(True)
        settings.setRestrictToLayers(True)
        settings.setLayersToClip([l2])

        # save map to xml
        doc = QDomDocument("testdoc")
        elem = doc.createElement("test")
        self.assertTrue(map.writeXml(elem, doc, QgsReadWriteContext()))

        layout2 = QgsLayout(p)
        map2 = QgsLayoutItemMap(layout2)
        self.assertFalse(map2.atlasClippingSettings().enabled())

        # restore from xml
        self.assertTrue(
            map2.readXml(elem.firstChildElement(), doc, QgsReadWriteContext()))

        self.assertTrue(map2.atlasClippingSettings().enabled())
        self.assertEqual(map2.atlasClippingSettings().featureClippingType(),
                         QgsMapClippingRegion.FeatureClippingType.NoClipping)
        self.assertTrue(
            map2.atlasClippingSettings().forceLabelsInsideFeature())
        self.assertEqual(map2.atlasClippingSettings().layersToClip(), [l2])
        self.assertTrue(map2.atlasClippingSettings().restrictToLayers())