|
28 | 28 | QgsMapSettings, |
29 | 29 | QgsProject, |
30 | 30 | QgsMultiBandColorRenderer, |
31 | | - QgsCoordinateReferenceSystem |
32 | | - ) |
| 31 | + QgsCoordinateReferenceSystem, |
| 32 | + QgsTextFormat, |
| 33 | + QgsFontUtils, |
| 34 | + QgsPalLayerSettings, |
| 35 | + QgsNullSymbolRenderer, |
| 36 | + QgsPoint, |
| 37 | + QgsFeature, |
| 38 | + QgsVectorLayerSimpleLabeling, |
| 39 | + QgsLabelingEngineSettings, |
| 40 | + QgsLayoutMeasurement, |
| 41 | + QgsUnitTypes) |
33 | 42 |
|
34 | 43 | from qgis.testing import start_app, unittest |
35 | 44 | from utilities import unitTestDataPath |
@@ -244,6 +253,79 @@ def testRasterization(self): |
244 | 253 |
|
245 | 254 | self.vector_layer.setBlendMode(QPainter.CompositionMode_SourceOver) |
246 | 255 |
|
| 256 | + def testLabelMargin(self): |
| 257 | + """ |
| 258 | + Test rendering map item with a label margin set |
| 259 | + """ |
| 260 | + format = QgsTextFormat() |
| 261 | + format.setFont(QgsFontUtils.getStandardTestFont("Bold")) |
| 262 | + format.setSize(20) |
| 263 | + format.setNamedStyle("Bold") |
| 264 | + format.setColor(QColor(0, 0, 0)) |
| 265 | + settings = QgsPalLayerSettings() |
| 266 | + settings.setFormat(format) |
| 267 | + settings.fieldName = "'X'" |
| 268 | + settings.isExpression = True |
| 269 | + settings.placement = QgsPalLayerSettings.OverPoint |
| 270 | + |
| 271 | + vl = QgsVectorLayer("Point?crs=epsg:4326&field=id:integer", "vl", "memory") |
| 272 | + vl.setRenderer(QgsNullSymbolRenderer()) |
| 273 | + f = QgsFeature(vl.fields(), 1) |
| 274 | + for x in range(15): |
| 275 | + for y in range(15): |
| 276 | + f.setGeometry(QgsPoint(x, y)) |
| 277 | + vl.dataProvider().addFeature(f) |
| 278 | + |
| 279 | + vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) |
| 280 | + vl.setLabelsEnabled(True) |
| 281 | + |
| 282 | + p = QgsProject() |
| 283 | + |
| 284 | + engine_settings = QgsLabelingEngineSettings() |
| 285 | + engine_settings.setFlag(QgsLabelingEngineSettings.UsePartialCandidates, False) |
| 286 | + engine_settings.setFlag(QgsLabelingEngineSettings.DrawLabelRectOnly, True) |
| 287 | + p.setLabelingEngineSettings(engine_settings) |
| 288 | + |
| 289 | + p.addMapLayer(vl) |
| 290 | + layout = QgsLayout(p) |
| 291 | + layout.initializeDefaults() |
| 292 | + p.setCrs(QgsCoordinateReferenceSystem('EPSG:4326')) |
| 293 | + map = QgsLayoutItemMap(layout) |
| 294 | + map.attemptSetSceneRect(QRectF(10, 10, 180, 180)) |
| 295 | + map.setFrameEnabled(True) |
| 296 | + map.zoomToExtent(vl.extent()) |
| 297 | + map.setLayers([vl]) |
| 298 | + layout.addLayoutItem(map) |
| 299 | + |
| 300 | + checker = QgsLayoutChecker('composermap_label_nomargin', layout) |
| 301 | + checker.setControlPathPrefix("composer_map") |
| 302 | + result, message = checker.testLayout() |
| 303 | + self.report += checker.report() |
| 304 | + self.assertTrue(result, message) |
| 305 | + |
| 306 | + map.setLabelMargin(QgsLayoutMeasurement(15, QgsUnitTypes.LayoutMillimeters)) |
| 307 | + checker = QgsLayoutChecker('composermap_label_margin', layout) |
| 308 | + checker.setControlPathPrefix("composer_map") |
| 309 | + result, message = checker.testLayout() |
| 310 | + self.report += checker.report() |
| 311 | + self.assertTrue(result, message) |
| 312 | + |
| 313 | + map.setLabelMargin(QgsLayoutMeasurement(3, QgsUnitTypes.LayoutCentimeters)) |
| 314 | + checker = QgsLayoutChecker('composermap_label_cm_margin', layout) |
| 315 | + checker.setControlPathPrefix("composer_map") |
| 316 | + result, message = checker.testLayout() |
| 317 | + self.report += checker.report() |
| 318 | + self.assertTrue(result, message) |
| 319 | + |
| 320 | + map.setMapRotation(45) |
| 321 | + map.zoomToExtent(vl.extent()) |
| 322 | + map.setScale(map.scale() * 1.2) |
| 323 | + checker = QgsLayoutChecker('composermap_rotated_label_margin', layout) |
| 324 | + checker.setControlPathPrefix("composer_map") |
| 325 | + result, message = checker.testLayout() |
| 326 | + self.report += checker.report() |
| 327 | + self.assertTrue(result, message) |
| 328 | + |
247 | 329 |
|
248 | 330 | if __name__ == '__main__': |
249 | 331 | unittest.main() |
0 commit comments