def testTakePage(self): p = QgsProject() l = QgsLayout(p) collection = l.pageCollection() # add some pages page = QgsLayoutItemPage(l) page.setPageSize('A4') collection.addPage(page) page2 = QgsLayoutItemPage(l) page2.setPageSize('A5') collection.addPage(page2) self.assertEqual(collection.pageCount(), 2) self.assertFalse(collection.takePage(None)) self.assertEqual(collection.takePage(page), page) self.assertFalse(sip.isdeleted(page)) self.assertEqual(collection.pageCount(), 1) self.assertEqual(collection.pages(), [page2]) self.assertEqual(collection.page(0), page2) self.assertEqual(collection.takePage(page2), page2) self.assertFalse(sip.isdeleted(page2)) self.assertEqual(collection.pageCount(), 0) self.assertEqual(collection.pages(), []) self.assertFalse(collection.page(0))
def testClear(self): """ Test clearing the collection """ p = QgsProject() l = QgsLayout(p) collection = l.pageCollection() collection.clear() # add a page page = QgsLayoutItemPage(l) page.setPageSize('A4') collection.addPage(page) # add a second page page2 = QgsLayoutItemPage(l) page2.setPageSize('A5') collection.addPage(page2) page_about_to_be_removed_spy = QSignalSpy(collection.pageAboutToBeRemoved) # clear collection.clear() self.assertEqual(collection.pageCount(), 0) self.assertEqual(len(page_about_to_be_removed_spy), 2) QCoreApplication.sendPostedEvents(None, QEvent.DeferredDelete) self.assertTrue(sip.isdeleted(page)) self.assertTrue(sip.isdeleted(page2))
def testRun(self): context = QgsProcessingContext() # try running an alg using processing.run - ownership of result layer should be transferred back to the caller res = processing.run('qgis:buffer', {'DISTANCE': 1, 'INPUT': points(), 'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT}, context=context) self.assertIn('OUTPUT', res) # output should be the layer instance itself self.assertIsInstance(res['OUTPUT'], QgsVectorLayer) # Python should have ownership self.assertTrue(sip.ispyowned(res['OUTPUT'])) del context gc.collect() self.assertFalse(sip.isdeleted(res['OUTPUT'])) # now try using processing.run with is_child_algorithm = True. Ownership should remain with the context context = QgsProcessingContext() res = processing.run('qgis:buffer', {'DISTANCE': 1, 'INPUT': points(), 'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT}, context=context, is_child_algorithm=True) self.assertIn('OUTPUT', res) # output should be a layer string reference, NOT the layer itself self.assertIsInstance(res['OUTPUT'], str) layer = context.temporaryLayerStore().mapLayer(res['OUTPUT']) self.assertIsInstance(layer, QgsVectorLayer) # context should have ownership self.assertFalse(sip.ispyowned(layer)) del context gc.collect() self.assertTrue(sip.isdeleted(layer))
def test_removeMapLayersByLayer(self): """ test removing map layers by layer""" store = QgsMapLayerStore() # test no crash with empty store store.removeMapLayers([None]) l1 = createLayer('test') l2 = createLayer('test2') l3 = createLayer('test3') store.addMapLayers([l1, l2, l3]) self.assertEqual(store.count(), 3) #remove bad layers store.removeMapLayers([None]) self.assertEqual(store.count(), 3) # remove valid layers store.removeMapLayers([l1]) self.assertEqual(store.count(), 2) # test that layer has been deleted self.assertTrue(sip.isdeleted(l1)) # remove multiple store.removeMapLayers([l2, l3]) self.assertEqual(store.count(), 0) self.assertTrue(sip.isdeleted(l2)) self.assertTrue(sip.isdeleted(l3))
def test_removeMapLayersByLayer(self): """ test removing map layers by layer""" QgsProject.instance().removeAllMapLayers() # test no crash with empty registry QgsProject.instance().removeMapLayers([None]) l1 = createLayer('test') l2 = createLayer('test2') l3 = createLayer('test3') QgsProject.instance().addMapLayers([l1, l2, l3]) self.assertEqual(QgsProject.instance().count(), 3) #remove bad layers QgsProject.instance().removeMapLayers([None]) self.assertEqual(QgsProject.instance().count(), 3) # remove valid layers QgsProject.instance().removeMapLayers([l1]) self.assertEqual(QgsProject.instance().count(), 2) # test that layer has been deleted self.assertTrue(sip.isdeleted(l1)) # remove multiple QgsProject.instance().removeMapLayers([l2, l3]) self.assertEqual(QgsProject.instance().count(), 0) self.assertTrue(sip.isdeleted(l2)) self.assertTrue(sip.isdeleted(l3))
def testDeletePages(self): """ Test deleting pages from the collection """ p = QgsProject() l = QgsLayout(p) collection = l.pageCollection() # add a page page = QgsLayoutItemPage(l) page.setPageSize('A4') collection.addPage(page) # add a second page page2 = QgsLayoutItemPage(l) page2.setPageSize('A5') collection.addPage(page2) page_about_to_be_removed_spy = QSignalSpy(collection.pageAboutToBeRemoved) # delete page collection.deletePage(None) self.assertEqual(collection.pageCount(), 2) self.assertEqual(len(page_about_to_be_removed_spy), 0) page3 = QgsLayoutItemPage(l) # try deleting a page not in collection collection.deletePage(page3) QCoreApplication.sendPostedEvents(None, QEvent.DeferredDelete) self.assertFalse(sip.isdeleted(page3)) self.assertEqual(collection.pageCount(), 2) self.assertEqual(len(page_about_to_be_removed_spy), 0) collection.deletePage(page) self.assertEqual(collection.pageCount(), 1) self.assertFalse(page in collection.pages()) QCoreApplication.sendPostedEvents(None, QEvent.DeferredDelete) self.assertTrue(sip.isdeleted(page)) self.assertEqual(len(page_about_to_be_removed_spy), 1) self.assertEqual(page_about_to_be_removed_spy[-1][0], 0) collection.deletePage(page2) self.assertEqual(collection.pageCount(), 0) self.assertFalse(collection.pages()) QCoreApplication.sendPostedEvents(None, QEvent.DeferredDelete) self.assertTrue(sip.isdeleted(page2)) self.assertEqual(len(page_about_to_be_removed_spy), 2) self.assertEqual(page_about_to_be_removed_spy[-1][0], 0)
def test_removeMapLayersById(self): """ test removing map layers by ID """ store = QgsMapLayerStore() # test no crash with empty store store.removeMapLayersById(['bad']) store.removeMapLayersById([None]) l1 = createLayer('test') l2 = createLayer('test2') l3 = createLayer('test3') store.addMapLayers([l1, l2, l3]) self.assertEqual(store.count(), 3) #remove bad layers store.removeMapLayersById(['bad']) self.assertEqual(store.count(), 3) store.removeMapLayersById([None]) self.assertEqual(store.count(), 3) # remove valid layers l1_id = l1.id() store.removeMapLayersById([l1_id]) self.assertEqual(store.count(), 2) # double remove store.removeMapLayersById([l1_id]) self.assertEqual(store.count(), 2) # test that layer has been deleted self.assertTrue(sip.isdeleted(l1)) # remove multiple store.removeMapLayersById([l2.id(), l3.id()]) self.assertEqual(store.count(), 0) self.assertTrue(sip.isdeleted(l2)) # try removing a layer not in the store l4 = createLayer('test4') store.removeMapLayersById([l4.id()]) self.assertFalse(sip.isdeleted(l4))
def test_removeMapLayersById(self): """ test removing map layers by ID """ QgsProject.instance().removeAllMapLayers() # test no crash with empty registry QgsProject.instance().removeMapLayers(['bad']) QgsProject.instance().removeMapLayers([None]) l1 = createLayer('test') l2 = createLayer('test2') l3 = createLayer('test3') QgsProject.instance().addMapLayers([l1, l2, l3]) self.assertEqual(QgsProject.instance().count(), 3) #remove bad layers QgsProject.instance().removeMapLayers(['bad']) self.assertEqual(QgsProject.instance().count(), 3) QgsProject.instance().removeMapLayers([None]) self.assertEqual(QgsProject.instance().count(), 3) # remove valid layers l1_id = l1.id() QgsProject.instance().removeMapLayers([l1_id]) self.assertEqual(QgsProject.instance().count(), 2) # double remove QgsProject.instance().removeMapLayers([l1_id]) self.assertEqual(QgsProject.instance().count(), 2) # test that layer has been deleted self.assertTrue(sip.isdeleted(l1)) # remove multiple QgsProject.instance().removeMapLayers([l2.id(), l3.id()]) self.assertEqual(QgsProject.instance().count(), 0) self.assertTrue(sip.isdeleted(l2)) # try removing a layer not in the registry l4 = createLayer('test4') QgsProject.instance().removeMapLayers([l4.id()]) self.assertFalse(sip.isdeleted(l4))
def testApplyToOtherPages(self): p = QgsProject() l = QgsLayout(p) l.initializeDefaults() page2 = QgsLayoutItemPage(l) page2.setPageSize('A6') l.pageCollection().addPage(page2) guides = l.guides() # add some guides g1 = QgsLayoutGuide(Qt.Horizontal, QgsLayoutMeasurement(5), l.pageCollection().page(0)) guides.addGuide(g1) g2 = QgsLayoutGuide(Qt.Vertical, QgsLayoutMeasurement(6), l.pageCollection().page(0)) guides.addGuide(g2) g3 = QgsLayoutGuide(Qt.Horizontal, QgsLayoutMeasurement(190), l.pageCollection().page(0)) guides.addGuide(g3) g4 = QgsLayoutGuide(Qt.Horizontal, QgsLayoutMeasurement(1), l.pageCollection().page(1)) guides.addGuide(g4) # apply guides from page 0 - should delete g4 guides.applyGuidesToAllOtherPages(0) self.assertEqual(guides.guides(Qt.Horizontal, 0), [g1, g3]) self.assertEqual(guides.guides(Qt.Vertical, 0), [g2]) self.assertTrue(sip.isdeleted(g4)) # g3 is outside of page 2 bounds - should not be copied self.assertEqual(len(guides.guides(Qt.Horizontal, 1)), 1) self.assertEqual(guides.guides(Qt.Horizontal, 1)[0].position().length(), 5) self.assertEqual(len(guides.guides(Qt.Vertical, 1)), 1) self.assertEqual(guides.guides(Qt.Vertical, 1)[0].position().length(), 6) # apply guides from page 1 to 0 guides.applyGuidesToAllOtherPages(1) self.assertTrue(sip.isdeleted(g1)) self.assertTrue(sip.isdeleted(g2)) self.assertTrue(sip.isdeleted(g3)) self.assertEqual(len(guides.guides(Qt.Horizontal, 0)), 1) self.assertEqual(guides.guides(Qt.Horizontal, 0)[0].position().length(), 5) self.assertEqual(len(guides.guides(Qt.Vertical, 0)), 1) self.assertEqual(guides.guides(Qt.Vertical, 0)[0].position().length(), 6)
def test_removeMapLayerById(self): """ test removing a map layer by ID """ store = QgsMapLayerStore() # test no crash with empty store store.removeMapLayer('bad') store.removeMapLayer(None) l1 = createLayer('test') l2 = createLayer('test2') store.addMapLayers([l1, l2]) self.assertEqual(store.count(), 2) #remove bad layers store.removeMapLayer('bad') self.assertEqual(store.count(), 2) store.removeMapLayer(None) self.assertEqual(store.count(), 2) # remove valid layers l1_id = l1.id() store.removeMapLayer(l1_id) self.assertEqual(store.count(), 1) # double remove store.removeMapLayer(l1_id) self.assertEqual(store.count(), 1) # test that layer has been deleted self.assertTrue(sip.isdeleted(l1)) # remove second layer store.removeMapLayer(l2.id()) self.assertEqual(store.count(), 0) self.assertTrue(sip.isdeleted(l2)) # try removing a layer not in the store l3 = createLayer('test3') store.removeMapLayer(l3.id()) self.assertFalse(sip.isdeleted(l3))
def testRegisteringFilters(self): l = QgsLocator() filter_a = test_filter('a') filter_b = test_filter('b') l.registerFilter(filter_a) l.registerFilter(filter_b) self.assertEqual(set(l.filters()), {filter_a, filter_b}) # ownership should be transferred to locator del l self.assertTrue(sip.isdeleted(filter_a)) self.assertTrue(sip.isdeleted(filter_b)) # try manually deregistering l = QgsLocator() filter_c = test_filter('c') filter_d = test_filter('d') l.registerFilter(filter_c) l.registerFilter(filter_d) self.assertEqual(set(l.filters()), {filter_c, filter_d}) l.deregisterFilter(filter_c) self.assertTrue(sip.isdeleted(filter_c)) self.assertFalse(sip.isdeleted(filter_d)) self.assertEqual(l.filters(), [filter_d]) del l self.assertTrue(sip.isdeleted(filter_c)) self.assertTrue(sip.isdeleted(filter_d))
def test_removeMapLayerById(self): """ test removing a map layer by ID """ QgsProject.instance().removeAllMapLayers() # test no crash with empty registry QgsProject.instance().removeMapLayer('bad') QgsProject.instance().removeMapLayer(None) l1 = createLayer('test') l2 = createLayer('test2') QgsProject.instance().addMapLayers([l1, l2]) self.assertEqual(QgsProject.instance().count(), 2) #remove bad layers QgsProject.instance().removeMapLayer('bad') self.assertEqual(QgsProject.instance().count(), 2) QgsProject.instance().removeMapLayer(None) self.assertEqual(QgsProject.instance().count(), 2) # remove valid layers l1_id = l1.id() QgsProject.instance().removeMapLayer(l1_id) self.assertEqual(QgsProject.instance().count(), 1) # double remove QgsProject.instance().removeMapLayer(l1_id) self.assertEqual(QgsProject.instance().count(), 1) # test that layer has been deleted self.assertTrue(sip.isdeleted(l1)) # remove second layer QgsProject.instance().removeMapLayer(l2.id()) self.assertEqual(QgsProject.instance().count(), 0) self.assertTrue(sip.isdeleted(l2)) # try removing a layer not in the registry l3 = createLayer('test3') QgsProject.instance().removeMapLayer(l3.id()) self.assertFalse(sip.isdeleted(l3))
def testPages(self): """ Test adding/retrieving/deleting pages from the collection """ p = QgsProject() l = QgsLayout(p) collection = l.pageCollection() self.assertEqual(collection.pageCount(), 0) self.assertFalse(collection.pages()) self.assertFalse(collection.page(-1)) self.assertFalse(collection.page(0)) self.assertFalse(collection.page(1)) # add a page page = QgsLayoutItemPage(l) page.setPageSize('A4') self.assertEqual(collection.pageNumber(page), -1) collection.addPage(page) self.assertTrue(page in l.items()) self.assertEqual(collection.pageCount(), 1) self.assertEqual(collection.pages(), [page]) self.assertFalse(collection.page(-1)) self.assertEqual(collection.page(0), page) self.assertFalse(collection.page(1)) self.assertEqual(collection.pageNumber(page), 0) # add a second page page2 = QgsLayoutItemPage(l) page2.setPageSize('A5') collection.addPage(page2) self.assertEqual(collection.pageCount(), 2) self.assertEqual(collection.pages(), [page, page2]) self.assertFalse(collection.page(-1)) self.assertEqual(collection.page(0), page) self.assertEqual(collection.page(1), page2) self.assertEqual(collection.pageNumber(page2), 1) # insert a page page3 = QgsLayoutItemPage(l) page3.setPageSize('A3') collection.insertPage(page3, 1) self.assertTrue(page3 in l.items()) self.assertEqual(collection.pageCount(), 3) self.assertEqual(collection.pages(), [page, page3, page2]) self.assertEqual(collection.page(0), page) self.assertEqual(collection.page(1), page3) self.assertEqual(collection.page(2), page2) self.assertEqual(collection.pageNumber(page3), 1) # delete page collection.deletePage(-1) self.assertEqual(collection.pageCount(), 3) self.assertEqual(collection.pages(), [page, page3, page2]) collection.deletePage(100) self.assertEqual(collection.pageCount(), 3) self.assertEqual(collection.pages(), [page, page3, page2]) collection.deletePage(1) self.assertEqual(collection.pageCount(), 2) self.assertEqual(collection.pages(), [page, page2]) # make sure page was deleted QCoreApplication.sendPostedEvents(None, QEvent.DeferredDelete) self.assertTrue(sip.isdeleted(page3)) del l QCoreApplication.sendPostedEvents(None, QEvent.DeferredDelete) self.assertTrue(sip.isdeleted(page)) self.assertTrue(sip.isdeleted(page2))
def current_layer(self) -> Optional[QgsVectorLayer]: if self._layer is not None and not sip.isdeleted(self._layer): return self._layer return None