Schilder setzen wie im Browser: Palette und zwei Kartenwerkzeuge

Bisher konnte man die Zeichen in QGIS nur sehen und ihre Attribute von Hand tippen. Jetzt
gibt es dieselbe Bedienung wie im Web (Erik, 21.09.2026; Nutzerkreis sind TG-Mitarbeiter
und der Landkreis):

* Neues Modul zeichen_werkzeug.py mit der Palette (Suchfeld nach Nummer oder Name,
  Kategorie, Kacheln aus den lokal abgelegten Vorschaubildern, Deckel bei 96 wie im
  Browser) und zwei Kartenwerkzeugen: "Schild setzen" (erster Klick Standort, zweiter
  Klick Blickrichtung; unter 0,5 m bleibt die Drehung 0) und "Zusatzzeichen" (Klick auf ein
  vorhandenes Schild haengt es darunter, kein Doppel, hoechstens zwei).
* Die Rechenregeln sind Zwillinge von vz_geom.js (vzRichtungGrad, vzNormGrad,
  vzZusatzErgaenzen) -- dieselben Werte, hier in Python, mit denselben Pruefpunkten.
* Zeichen am Weg eines Blattes brauchen ein Blatt: die Auswahl fuellt sich aus den
  geladenen Blatt-Layern, eine eigene Abfrage braucht es nicht. In der Verfahrenskarte
  bleibt sie leer.
* Seitenleiste: neue Gruppe "Verkehrszeichen setzen". Der Katalog kommt beim Start und nach
  dem Anmelden in die Palette (oeffentlich, faellt auf die lokale Ablage zurueck).

Neuer Test tools/headless_zeichen_test.py (QGIS 4.2 offscreen, ohne Zugangsschluessel):
30 Pruefungen gruen -- Rechenregeln, zusatz aus Text, Katalog, lokale Ablage, Umschreiben
des Stils, Palette mit Suche und Deckel. tools/headless_panel_test.py bleibt gruen; die
Leiste ist jetzt 1372 px hoch und rollt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
KAI
2026-09-21 11:34:48 +02:00
co-authored by Claude Opus 5
parent d79dff1093
commit 9c2c1c57af
4 changed files with 568 additions and 1 deletions
+65 -1
View File
@@ -69,6 +69,7 @@ class VlnPanel(QDockWidget):
aussen.addWidget(self._bau_anmeldung())
aussen.addWidget(self._bau_verfahren())
aussen.addWidget(self._bau_layer())
aussen.addWidget(self._bau_zeichen())
aussen.addWidget(self._bau_dienste())
aussen.addWidget(self._bau_darstellung())
aussen.addStretch(1)
@@ -150,7 +151,7 @@ class VlnPanel(QDockWidget):
("Vorerhebung", "Vorerhebung"),
("Maßnahmenblätter", "Maßnahmenblätter (mit Zeichen am Weg)"),
("Widmungen & Verkehrszeichen",
"Widmungen & Verkehrszeichen")):
"Widmungen && Verkehrszeichen")):
haken = QCheckBox(beschriftung)
haken.setChecked(True)
lage.addWidget(haken)
@@ -173,6 +174,68 @@ class VlnPanel(QDockWidget):
"jede Änderung sofort zurück.")))
return kasten
def _bau_zeichen(self):
"""Verkehrszeichen setzen — Palette, Blattwahl, zwei Werkzeuge.
Die Bedienung ist dieselbe wie im Browser: erst ein Schild waehlen, dann in der Karte
zwei Klicks (Standort, Blickrichtung). Das Blatt braucht nur, wer Zeichen am Weg eines
Massnahmenblatts setzt — in der Verfahrenskarte bleibt die Auswahl leer.
"""
from .zeichen_werkzeug import ZeichenPalette
kasten = QGroupBox("Verkehrszeichen setzen")
lage = QVBoxLayout(kasten)
lage.setSpacing(6)
lage.addWidget(_klein(QLabel("Schild waehlen, dann in der Karte: erster Klick Standort, "
"zweiter Klick Blickrichtung.")))
self.palette = ZeichenPalette()
lage.addWidget(self.palette)
lage.addWidget(_klein(QLabel("Blatt (nur fuer Zeichen am Weg):")))
self.blatt_combo = QComboBox()
self.blatt_combo.setToolTip("An welches Massnahmenblatt das Zeichen gehoert")
self.blatt_combo.addItem("— kein Blatt (Verfahrenskarte) —", None)
lage.addWidget(self.blatt_combo)
zeile = QHBoxLayout()
self.schild_knopf = QPushButton("Schild setzen")
self.schild_knopf.setCheckable(True)
self.schild_knopf.setToolTip("Zwei Klicks in der Karte: Standort, dann Blickrichtung")
self.schild_knopf.clicked.connect(lambda: self._ruf("zeichen_setzen"))
self.zusatz_knopf = QPushButton("Zusatzzeichen")
self.zusatz_knopf.setCheckable(True)
self.zusatz_knopf.setToolTip("Gewaehltes Zusatzzeichen an ein vorhandenes Schild haengen")
self.zusatz_knopf.clicked.connect(lambda: self._ruf("zusatz_anhaengen"))
zeile.addWidget(self.schild_knopf)
zeile.addWidget(self.zusatz_knopf)
lage.addLayout(zeile)
return kasten
def setze_blaetter(self, blaetter):
"""Die Auswahl der Blaetter fuellen — ``[(Beschriftung, uuid)]``."""
vorher = self.blatt_combo.currentData()
self.blatt_combo.blockSignals(True)
self.blatt_combo.clear()
self.blatt_combo.addItem("— kein Blatt (Verfahrenskarte) —", None)
for text, uuid_ in blaetter or []:
self.blatt_combo.addItem(text, uuid_)
if vorher:
i = self.blatt_combo.findData(vorher)
if i >= 0:
self.blatt_combo.setCurrentIndex(i)
self.blatt_combo.blockSignals(False)
def aktuelles_blatt(self):
return self.blatt_combo.currentData()
def aktueller_zeichencode(self):
return str((self.palette.aktueller_eintrag() or {}).get("code") or "")
def werkzeug_zuruecksetzen(self):
"""Beide Werkzeugknoepfe ausrasten (wenn QGIS das Werkzeug wechselt)."""
for knopf in (self.schild_knopf, self.zusatz_knopf):
knopf.blockSignals(True)
knopf.setChecked(False)
knopf.blockSignals(False)
def _bau_dienste(self):
"""Die Linkliste des gewählten Verfahrens — vierstufig gepflegt, hier nur geladen.
@@ -267,6 +330,7 @@ class VlnPanel(QDockWidget):
self.login_knopf.setVisible(not angemeldet)
self.logout_knopf.setVisible(angemeldet)
for widget in (self.filter_feld, self.combo, self.ogc_knopf, self.speichern_knopf,
self.schild_knopf, self.zusatz_knopf, self.palette, self.blatt_combo,
self.stil_knopf, self.vorlage_haken, self.dienste_holen_knopf,
self.dienste_laden_knopf, self.dienste_alle, self.dienste_liste,
*self.gruppen_haken.values()):