def testSnapPoint(self): p = QgsProject() l = QgsLayout(p) page = QgsLayoutItemPage(l) page.setPageSize('A4') l.pageCollection().addPage(page) s = QgsLayoutSnapper(l) guides = l.guides() # first test snapping to grid l.gridSettings().setResolution(QgsLayoutMeasurement(5, QgsUnitTypes.LayoutMillimeters)) s.setSnapToGrid(True) s.setSnapTolerance(1) point, snapped = s.snapPoint(QPointF(1, 1), 1) self.assertTrue(snapped) self.assertEqual(point, QPointF(0, 0)) s.setSnapToGrid(False) point, snapped = s.snapPoint(QPointF(1, 1), 1) self.assertFalse(snapped) self.assertEqual(point, QPointF(1, 1)) # test that guide takes precedence s.setSnapToGrid(True) s.setSnapToGuides(True) guides.addGuide(QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(0.5), page)) point, snapped = s.snapPoint(QPointF(1, 1), 1) self.assertTrue(snapped) self.assertEqual(point, QPointF(0, 0.5))
def testSnapRect(self): p = QgsProject() l = QgsLayout(p) page = QgsLayoutItemPage(l) page.setPageSize('A4') l.pageCollection().addPage(page) s = QgsLayoutSnapper(l) guides = l.guides() # first test snapping to grid l.gridSettings().setResolution(QgsLayoutMeasurement(5, QgsUnitTypes.LayoutMillimeters)) s.setSnapToItems(False) s.setSnapToGrid(True) s.setSnapTolerance(1) rect, snapped = s.snapRect(QRectF(1, 1, 2, 1), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0, 0, 2, 1)) rect, snapped = s.snapRect(QRectF(1, 1, 3.5, 3.5), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(1.5, 1.5, 3.5, 3.5)) s.setSnapToItems(False) s.setSnapToGrid(False) rect, snapped = s.snapRect(QRectF(1, 1, 3.5, 3.5), 1) self.assertFalse(snapped) self.assertEqual(rect, QRectF(1, 1, 3.5, 3.5)) # test that guide takes precedence s.setSnapToGrid(True) s.setSnapToGuides(True) guides.addGuide(QgsLayoutGuide(Qt.Horizontal, QgsLayoutMeasurement(0.5), page)) rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 0.5, 2.0, 3.0)) # add an item item1 = QgsLayoutItemMap(l) item1.attemptMove(QgsLayoutPoint(121, 1.1, QgsUnitTypes.LayoutMillimeters)) l.addItem(item1) # test that guide takes precedence over item s.setSnapToGrid(True) s.setSnapToGuides(True) s.setSnapToItems(True) rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 0.5, 2.0, 3.0)) # but items take precedence over grid s.setSnapToGuides(False) rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 1.1, 2.0, 3.0)) # ... unless item is ignored! rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1, None, None, [item1]) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 0.0, 2.0, 3.0))
def testSnapPointsToGrid(self): p = QgsProject() l = QgsLayout(p) # need a page to snap to grid page = QgsLayoutItemPage(l) page.setPageSize('A4') l.pageCollection().addPage(page) s = QgsLayoutSnapper(l) l.gridSettings().setResolution(QgsLayoutMeasurement(5, QgsUnitTypes.LayoutMillimeters)) s.setSnapToGrid(True) s.setSnapTolerance(1) delta, snappedX, snappedY = s.snapPointsToGrid([QPointF(1, 0.5)], 1) self.assertTrue(snappedX) self.assertTrue(snappedY) self.assertEqual(delta, QPointF(-1, -0.5)) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(9, 2), QPointF(12, 6)], 1) self.assertTrue(snappedX) self.assertTrue(snappedY) self.assertEqual(point, QPointF(1, -1)) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(9, 2), QPointF(12, 7)], 1) self.assertTrue(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(1, 0)) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(8, 2), QPointF(12, 6)], 1) self.assertFalse(snappedX) self.assertTrue(snappedY) self.assertEqual(point, QPointF(0, -1)) # grid disabled s.setSnapToGrid(False) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(1, 1)], 1) self.assertFalse(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(0, 0)) s.setSnapToGrid(True) # with different pixel scale point, snappedX, snappedY = s.snapPointsToGrid([QPointF(0.5, 0.5)], 1) self.assertTrue(snappedX) self.assertTrue(snappedY) self.assertEqual(point, QPointF(-.5, -.5)) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(0.5, 0.5)], 3) self.assertFalse(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(0, 0)) # with offset grid l.gridSettings().setOffset(QgsLayoutPoint(2, 0)) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(13, 23)], 1) self.assertTrue(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(-1, 0))
def testReadWriteXml(self): p = QgsProject() l = QgsLayout(p) l.setName('my layout') l.setUnits(QgsUnitTypes.LayoutInches) collection = l.pageCollection() # add a page page = QgsLayoutItemPage(l) page.setPageSize('A6') collection.addPage(page) grid = l.gridSettings() grid.setResolution(QgsLayoutMeasurement(5, QgsUnitTypes.LayoutPoints)) g1 = QgsLayoutGuide(Qt.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0)) l.guides().addGuide(g1) snapper = l.snapper() snapper.setSnapTolerance(7) # add some items item1 = QgsLayoutItemMap(l) item1.setId('xxyyxx') l.addItem(item1) item2 = QgsLayoutItemMap(l) item2.setId('zzyyzz') l.addItem(item2) doc = QDomDocument("testdoc") elem = l.writeXml(doc, QgsReadWriteContext()) l2 = QgsLayout(p) self.assertTrue(l2.readXml(elem, doc, QgsReadWriteContext())) self.assertEqual(l2.name(), 'my layout') self.assertEqual(l2.units(), QgsUnitTypes.LayoutInches) collection2 = l2.pageCollection() self.assertEqual(collection2.pageCount(), 1) self.assertAlmostEqual(collection2.page(0).pageSize().width(), 105, 4) self.assertEqual(collection2.page(0).pageSize().height(), 148) self.assertEqual(l2.gridSettings().resolution().length(), 5.0) self.assertEqual(l2.gridSettings().resolution().units(), QgsUnitTypes.LayoutPoints) self.assertEqual(l2.guides().guidesOnPage(0)[0].orientation(), Qt.Horizontal) self.assertEqual(l2.guides().guidesOnPage(0)[0].position().length(), 5.0) self.assertEqual(l2.guides().guidesOnPage(0)[0].position().units(), QgsUnitTypes.LayoutCentimeters) self.assertEqual(l2.snapper().snapTolerance(), 7) # check restored items new_item1 = l2.itemByUuid(item1.uuid()) self.assertTrue(new_item1) self.assertEqual(new_item1.id(), 'xxyyxx') new_item2 = l2.itemByUuid(item2.uuid()) self.assertTrue(new_item2) self.assertEqual(new_item2.id(), 'zzyyzz')
def testUndoRedo(self): p = QgsProject() l = QgsLayout(p) g = l.gridSettings() g.setResolution(QgsLayoutMeasurement(15, QgsUnitTypes.LayoutPoints)) # these two commands should be 'collapsed' g.setOffset(QgsLayoutPoint(555, 10, QgsUnitTypes.LayoutPoints)) g.setOffset(QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutPoints)) # these two commands should be 'collapsed' g.setResolution(QgsLayoutMeasurement(45, QgsUnitTypes.LayoutInches)) g.setResolution(QgsLayoutMeasurement(35, QgsUnitTypes.LayoutInches)) self.assertEqual(g.offset().x(), 5.0) self.assertEqual(g.offset().y(), 10.0) self.assertEqual(g.offset().units(), QgsUnitTypes.LayoutPoints) self.assertEqual(g.resolution().length(), 35.0) self.assertEqual(g.resolution().units(), QgsUnitTypes.LayoutInches) l.undoStack().stack().undo() self.assertEqual(g.offset().x(), 5.0) self.assertEqual(g.offset().y(), 10.0) self.assertEqual(g.offset().units(), QgsUnitTypes.LayoutPoints) self.assertEqual(g.resolution().length(), 15.0) self.assertEqual(g.resolution().units(), QgsUnitTypes.LayoutPoints) l.undoStack().stack().undo() self.assertEqual(g.offset().x(), 0.0) self.assertEqual(g.offset().y(), 0.0) self.assertEqual(g.offset().units(), QgsUnitTypes.LayoutMillimeters) self.assertEqual(g.resolution().length(), 15.0) self.assertEqual(g.resolution().units(), QgsUnitTypes.LayoutPoints) l.undoStack().stack().redo() self.assertEqual(g.offset().x(), 5.0) self.assertEqual(g.offset().y(), 10.0) self.assertEqual(g.offset().units(), QgsUnitTypes.LayoutPoints) self.assertEqual(g.resolution().length(), 15.0) self.assertEqual(g.resolution().units(), QgsUnitTypes.LayoutPoints) l.undoStack().stack().redo() self.assertEqual(g.offset().x(), 5.0) self.assertEqual(g.offset().y(), 10.0) self.assertEqual(g.offset().units(), QgsUnitTypes.LayoutPoints) self.assertEqual(g.resolution().length(), 35.0) self.assertEqual(g.resolution().units(), QgsUnitTypes.LayoutInches)
def testSnapPointsToGrid(self): p = QgsProject() l = QgsLayout(p) # need a page to snap to grid page = QgsLayoutItemPage(l) page.setPageSize('A4') l.pageCollection().addPage(page) s = QgsLayoutSnapper(l) l.gridSettings().setResolution( QgsLayoutMeasurement(5, QgsUnitTypes.LayoutMillimeters)) s.setSnapToGrid(True) s.setSnapTolerance(1) delta, snappedX, snappedY = s.snapPointsToGrid([QPointF(1, 0.5)], 1) self.assertTrue(snappedX) self.assertTrue(snappedY) self.assertEqual(delta, QPointF(-1, -0.5)) point, snappedX, snappedY = s.snapPointsToGrid( [QPointF(9, 2), QPointF(12, 6)], 1) self.assertTrue(snappedX) self.assertTrue(snappedY) self.assertEqual(point, QPointF(1, -1)) point, snappedX, snappedY = s.snapPointsToGrid( [QPointF(9, 2), QPointF(12, 7)], 1) self.assertTrue(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(1, 0)) point, snappedX, snappedY = s.snapPointsToGrid( [QPointF(8, 2), QPointF(12, 6)], 1) self.assertFalse(snappedX) self.assertTrue(snappedY) self.assertEqual(point, QPointF(0, -1)) # grid disabled s.setSnapToGrid(False) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(1, 1)], 1) self.assertFalse(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(0, 0)) s.setSnapToGrid(True) # with different pixel scale point, snappedX, snappedY = s.snapPointsToGrid([QPointF(0.5, 0.5)], 1) self.assertTrue(snappedX) self.assertTrue(snappedY) self.assertEqual(point, QPointF(-.5, -.5)) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(0.5, 0.5)], 3) self.assertFalse(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(0, 0)) # with offset grid l.gridSettings().setOffset(QgsLayoutPoint(2, 0)) point, snappedX, snappedY = s.snapPointsToGrid([QPointF(13, 23)], 1) self.assertTrue(snappedX) self.assertFalse(snappedY) self.assertEqual(point, QPointF(-1, 0))
def testSnapRect(self): p = QgsProject() l = QgsLayout(p) page = QgsLayoutItemPage(l) page.setPageSize('A4') l.pageCollection().addPage(page) s = QgsLayoutSnapper(l) guides = l.guides() # first test snapping to grid l.gridSettings().setResolution( QgsLayoutMeasurement(5, QgsUnitTypes.LayoutMillimeters)) s.setSnapToItems(False) s.setSnapToGrid(True) s.setSnapTolerance(1) rect, snapped = s.snapRect(QRectF(1, 1, 2, 1), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0, 0, 2, 1)) rect, snapped = s.snapRect(QRectF(1, 1, 3.5, 3.5), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(1.5, 1.5, 3.5, 3.5)) s.setSnapToItems(False) s.setSnapToGrid(False) rect, snapped = s.snapRect(QRectF(1, 1, 3.5, 3.5), 1) self.assertFalse(snapped) self.assertEqual(rect, QRectF(1, 1, 3.5, 3.5)) # test that guide takes precedence s.setSnapToGrid(True) s.setSnapToGuides(True) guides.addGuide( QgsLayoutGuide(Qt.Horizontal, QgsLayoutMeasurement(0.5), page)) rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 0.5, 2.0, 3.0)) # add an item item1 = QgsLayoutItemMap(l) item1.attemptMove( QgsLayoutPoint(121, 1.1, QgsUnitTypes.LayoutMillimeters)) l.addItem(item1) # test that guide takes precedence over item s.setSnapToGrid(True) s.setSnapToGuides(True) s.setSnapToItems(True) rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 0.5, 2.0, 3.0)) # but items take precedence over grid s.setSnapToGuides(False) rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 1.1, 2.0, 3.0)) # ... unless item is ignored! rect, snapped = s.snapRect(QRectF(1, 1, 2, 3), 1, None, None, [item1]) self.assertTrue(snapped) self.assertEqual(rect, QRectF(0.0, 0.0, 2.0, 3.0))
def testReadWriteXml(self): p = QgsProject() l = QgsLayout(p) l.setName('my layout') l.setUnits(QgsUnitTypes.LayoutInches) collection = l.pageCollection() # add a page page = QgsLayoutItemPage(l) page.setPageSize('A6') collection.addPage(page) grid = l.gridSettings() grid.setResolution(QgsLayoutMeasurement(5, QgsUnitTypes.LayoutPoints)) g1 = QgsLayoutGuide( Qt.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0)) l.guides().addGuide(g1) snapper = l.snapper() snapper.setSnapTolerance(7) # add some items item1 = QgsLayoutItemMap(l) item1.setId('xxyyxx') l.addItem(item1) item2 = QgsLayoutItemMap(l) item2.setId('zzyyzz') l.addItem(item2) doc = QDomDocument("testdoc") elem = l.writeXml(doc, QgsReadWriteContext()) l2 = QgsLayout(p) self.assertTrue(l2.readXml(elem, doc, QgsReadWriteContext())) self.assertEqual(l2.name(), 'my layout') self.assertEqual(l2.units(), QgsUnitTypes.LayoutInches) collection2 = l2.pageCollection() self.assertEqual(collection2.pageCount(), 1) self.assertAlmostEqual(collection2.page(0).pageSize().width(), 105, 4) self.assertEqual(collection2.page(0).pageSize().height(), 148) self.assertEqual(l2.gridSettings().resolution().length(), 5.0) self.assertEqual(l2.gridSettings().resolution().units(), QgsUnitTypes.LayoutPoints) self.assertEqual(l2.guides().guidesOnPage(0)[0].orientation(), Qt.Horizontal) self.assertEqual(l2.guides().guidesOnPage(0)[0].position().length(), 5.0) self.assertEqual(l2.guides().guidesOnPage(0)[0].position().units(), QgsUnitTypes.LayoutCentimeters) self.assertEqual(l2.snapper().snapTolerance(), 7) # check restored items new_item1 = l2.itemByUuid(item1.uuid()) self.assertTrue(new_item1) self.assertEqual(new_item1.id(), 'xxyyxx') new_item2 = l2.itemByUuid(item2.uuid()) self.assertTrue(new_item2) self.assertEqual(new_item2.id(), 'zzyyzz')