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)
Exemple #2
0
    def testBoundingRectForStrokeSizeOnRestore(self):
        """
        Test that item bounding rect correctly accounts for stroke size on item restore
        """
        pr = QgsProject()
        l = QgsLayout(pr)
        shape = QgsLayoutItemShape(l)

        shape.setShapeType(QgsLayoutItemShape.Rectangle)
        shape.attemptSetSceneRect(QRectF(30, 10, 100, 200))
        self.assertEqual(shape.boundingRect(),
                         QRectF(-0.15, -0.15, 100.3, 200.3))

        # set a symbol with very wide stroke
        s = QgsFillSymbol.createSimple({
            'outline_color': '#ff0000',
            'outline_width': '40',
            'color': '#ff5588'
        })
        shape.setSymbol(s)
        # bounding rect for item should include stroke
        self.assertEqual(shape.boundingRect(),
                         QRectF(-20.0, -20.0, 140.0, 240.0))

        # save the shape and restore
        doc = QDomDocument("testdoc")
        parent_elem = doc.createElement("test")
        doc.appendChild(parent_elem)
        self.assertTrue(shape.writeXml(parent_elem, doc,
                                       QgsReadWriteContext()))

        item_elem = parent_elem.firstChildElement("LayoutItem")
        self.assertFalse(item_elem.isNull())

        # restore
        shape2 = QgsLayoutItemShape(l)

        self.assertTrue(shape2.readXml(item_elem, doc, QgsReadWriteContext()))

        # bounding rect for item should include stroke
        self.assertEqual(shape2.boundingRect(),
                         QRectF(-20.0, -20.0, 140.0, 240.0))