diff --git a/changelog.txt b/changelog.txt index 5005014..eeb79e7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,4 @@ +- Bugfix: Nach dem Laden des Verfahrensgebiets (ALKIS oder Shape) sprang die Karte an die falsche Stelle, wenn ein anderes Projekt-KBS als EPSG:25833 eingestellt war. Der Zoom rechnet die Ausdehnung jetzt in das KBS der Kartenansicht um (`zoom_auf_layer` aus sn_basis, setzt sn_basis mit Basis #99 voraus) (Basis #99) - Neu: Grenzpunkte aus ALKIS werden nach dem Laden im ALKIS-Stil dargestellt (styles/alkis_grenzpunkte.qml), statt ungestylt zu bleiben (#53) - Intern: Tests von TestFlurstueckAlkis an die seit längerem geänderte Ladelogik angeglichen (Mocks zeigten noch auf die alte Ein-Query-/Zwei-Knopf-Variante), bbox-Dokumentation in flurstueck_alkis.py korrigiert (bbox wird nicht mehr ausgewertet) – keine Verhaltensänderung (Test-Audit #16) - Intern: Der Button "aus gewählten Gemarkungen laden" nutzt jetzt dieselbe Ladelogik wie "Flurstücke laden" (flurstueck_alkis) statt einer eigenen, parallelen Implementierung – konsolidiert drei bisher getrennte Code-Pfade zum Flurstücke-Laden auf einen (#47) diff --git a/tests/test_working_tab.py b/tests/test_working_tab.py index 54f5524..8734ebc 100644 --- a/tests/test_working_tab.py +++ b/tests/test_working_tab.py @@ -924,6 +924,68 @@ class TestHandleVerfShape(unittest.TestCase): self.assertIn(False, busy_states, "Button muss am Ende wieder freigegeben werden") +class TestZoomImProjektKbs(unittest.TestCase): + """Zoom auf das neue Verfahrensgebiet rechnet in das KBS der Kartenansicht um (Basis #99).""" + + def _tab(self): + tab = TestWorkingTab._make_tab(TestWorkingTab()) + tab.setze_haken = lambda *_: None + tab._on_verf_layer_changed = lambda *_: None + return tab + + def _projekt(self, mock_project_instance): + proj = _DummyProject() + proj.mapLayersByName = lambda _n: [] + proj.mapLayer = lambda _lid: None + mock_project_instance.return_value = proj + + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.zoom_auf_layer") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.success") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.apply_style") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.QgsProject.instance") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.verfahrensgebiet_alkis_komplett") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.iface") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.set_verfahrensgebiet_layer_id") + def test_alkis_zoom_ueber_zoom_auf_layer(self, _set_id, mock_iface, mock_alkis, mock_projekt, + _stil, _erfolg, mock_zoom): + """Prüft, dass nach dem Laden aus ALKIS über zoom_auf_layer auf das Verfahrensgebiet gezoomt wird und nicht mit der unumgerechneten Layer-Ausdehnung.""" + tab = self._tab() + enriched = _DummyLayer(valid=True, layer_id="vg") + mock_alkis.return_value = (enriched, _DummyLayer(layer_id="flst"), None, LoadStatus.FIRST) + self._projekt(mock_projekt) + canvas = _DummyCanvas() + mock_iface.mapCanvas.return_value = canvas + + tab.handle_verf_alkis() + + mock_zoom.assert_called_once_with(enriched, canvas) + self.assertIsNone(canvas.extent) + + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.get_variable", return_value="VF-123") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.zoom_auf_layer") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.success") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.apply_style") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.QgsProject.instance") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.verfahrensgebiet_shape_komplett") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.iface") + @patch("sn_verfahrensgebiet.ui.tabs.working_tab.set_verfahrensgebiet_layer_id") + def test_shape_zoom_ueber_zoom_auf_layer(self, _set_id, mock_iface, mock_shape, mock_projekt, + _stil, _erfolg, mock_zoom, _var): + """Prüft, dass nach dem Laden aus einem Shape über zoom_auf_layer auf das Verfahrensgebiet gezoomt wird und nicht mit der unumgerechneten Layer-Ausdehnung.""" + tab = self._tab() + tab.btn_verf_shape = _DummyButton() + enriched = _DummyLayer(valid=True, layer_id="shape_vg") + mock_shape.return_value = (enriched, _DummyLayer(layer_id="flst"), None, LoadStatus.FIRST) + self._projekt(mock_projekt) + canvas = _DummyCanvas() + mock_iface.mapCanvas.return_value = canvas + + tab.handle_verf_shape() + + mock_zoom.assert_called_once_with(enriched, canvas) + self.assertIsNone(canvas.extent) + + if __name__ == "__main__": unittest.main() diff --git a/ui/tabs/working_tab.py b/ui/tabs/working_tab.py index 4f322eb..b917450 100644 --- a/ui/tabs/working_tab.py +++ b/ui/tabs/working_tab.py @@ -5,7 +5,7 @@ Verwaltet die Verfahrensgebiet-Abgrenzung und ALKIS-Integration. from sn_basis.functions.qt_wrapper import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QMessageBox from sn_basis.functions.qt_wrapper import Qt from sn_basis.functions import Qgis, QgsProject #QgsMessageLog -from sn_basis.functions.qgisui_wrapper import QgsMapLayerComboBox +from sn_basis.functions.qgisui_wrapper import QgsMapLayerComboBox, zoom_auf_layer from sn_basis.functions.qgiscore_wrapper import QgsMapLayerProxyModel from sn_basis.functions.verfahrensgebiet_manager import get_verfahrensgebiet_layer_id, set_verfahrensgebiet_layer_id from sn_basis.functions.dialog_wrapper import show_info_dialog, create_progress_dialog, ask_yes_no @@ -225,8 +225,8 @@ class WorkingTab(QWidget): if not project.mapLayer(enriched_layer.id()): project.addMapLayer(enriched_layer) apply_style(enriched_layer, "verfahrensgebiet.qml") - iface.mapCanvas().setExtent(enriched_layer.extent()) - iface.mapCanvas().refresh() + # Ausdehnung ins KBS der Kartenansicht umrechnen (Basis #99) + zoom_auf_layer(enriched_layer, iface.mapCanvas()) self.setze_haken(self.haken_verf, True) self.verf_layer_combo.setLayer(enriched_layer) @@ -282,8 +282,8 @@ class WorkingTab(QWidget): if not project.mapLayer(enriched_layer.id()): project.addMapLayer(enriched_layer) apply_style(enriched_layer, "verfahrensgebiet.qml") - iface.mapCanvas().setExtent(enriched_layer.extent()) - iface.mapCanvas().refresh() + # Ausdehnung ins KBS der Kartenansicht umrechnen (Basis #99) + zoom_auf_layer(enriched_layer, iface.mapCanvas()) self.setze_haken(self.haken_verf, True) self.verf_layer_combo.setLayer(enriched_layer)