- Auswahl über GET /tgen/auswahl (Manager seit 06.10.2026): oben die eigenen Landkreise
(„… — Linkliste des Landkreises“), dann die Verfahren; als oFB die Verfahren des Landkreises
mit „(nur lesen)“. Älterer Server ohne die Route: Rückfall auf /tgen.
- Landkreis gewählt: „Liste holen“ lädt die Linkliste des ganzen Landkreises; „Layer laden“
erklärt, dass es für einen Landkreis keine Verfahrenslayer gibt.
- 401 und 403 getrennt: nur 401 (AuthError) meldet ab, 403 (KeinZugriff) zeigt eine Meldung.
Bis 0.6.0 verwarf jedes 403 den gespeicherten API-Key.
- OGC-Sammlungen mit vln:schreibbar: false werden schreibgeschützt geladen; Meldungen für Stil
und Verkehrszeichen nennen „nur lesen“ als Grund.
- Linkliste: Gruppe › Untergruppe › Layer im Ebenenbaum (linkliste.zielgruppe), Untergruppe
auch in der Dienstliste.
- README: Abschnitt „Geodienste aus der Linkliste“; Tests ohne Netz:
tools/headless_linkliste_test.py (neu), tools/headless_panel_test.py erweitert — beide grün
mit QGIS 4.2 offscreen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Der Server liefert seit heute die Sammlung widmung-<vkz>-punkt|-linie mit einem Stil, der
die Schilder selbst malt, dazu blattzeichen-<vkz> mit den neuen Zeichen am Weg. Das Plugin
kannte beides nicht -- die Gruppenzuordnung fiel auf "Weitere", und die Seitenleiste
filterte das heraus.
* GRUPPEN kennt jetzt widmung ("Widmungen & Verkehrszeichen", eigener Haken in der
Seitenleiste) und blattzeichen (laeuft in der Gruppe der Maßnahmenblaetter mit).
* Neues Modul zeichen_katalog.py: holt /v2/zeichen/katalog.json (oeffentlich, wird neben den
Grafiken abgelegt, damit die Palette auch ohne Netz oeffnet), laedt fehlende Schilder nach
<Profil>/svg/vln/<code>.svg, traegt den Ordner in die SVG-Suchpfade ein und schreibt im
Stil das Adressen-Praefix auf "vln/" um. Fehlt eine Datei, bleibt die Serveradresse stehen
-- so zeichnet QGIS sie weiter aus dem Netz, im Druck und offline stimmt es trotzdem.
* Beim Laden eines Zeichen-Layers werden die Grafiken bereitgestellt, BEVOR der Stil greift;
sonst zeigt der Ausdruck auf eine Datei, die es lokal noch nicht gibt.
* api_client.roh() holt eine Datei roh und ohne Anmeldung; Fehler geben b"" zurueck, ein
fehlendes Schild darf nichts abbrechen.
Headless gemessen (QGIS 4.2, offscreen): Katalog 890 Zeichen, drei Grafiken geholt, ein
unbekannter Code sauber als fehlend gemeldet, Suchpfad eingetragen, Stil lokalisiert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Erik, 11.09.2026: "als angemeldeter Nutzer TG-spezifisch die Dienste aus der
Linkliste einbinden".
- vln_karten/linkliste.py (neu): holt GET /v2/linkliste?vkz=…, baut je Anbieter
den passenden Layer (wms, wfs, rest/ArcGIS, geojson/ogr), wendet den beim
Eintrag hinterlegten QML-Stil an und haengt alles schrittweise in die Gruppe
"Geodienste <VKZ> <Name>" mit Untergruppen je Listengruppe.
- Seitenleiste: neuer Block "Geodienste (Linkliste)" mit Liste holen, Haken je
Dienst (Name, Gruppe, Herkunft, Stil-Hinweis), alle an/aus und Ausgewaehlte
laden.
- Die Liste kommt fertig aufgeloest vom Server; das Plugin rechnet nichts nach.
Zwei Dinge, die der Test gezeigt hat (tools/headless_dienste_test.py, QGIS 4.2
ohne Fenster gegen die Live-Schnittstelle):
* Die Adressform muss schlicht "url=<Adresse>" sein, wie in
Plugin_SN_Basis/modules/LayerLoader.py. Mit einem selbst gebauten
QgsDataSourceUri (crs, format) kam der ArcGIS-Layer erst nach 60 s und
ungueltig zurueck; jetzt 0,4 s und 4457 Objekte.
* Ein 404 auf style.qml erreicht QgsBlockingNetworkRequest als Transportfehler.
Erst den Statuscode ansehen, sonst meldet das Plugin einen Fehler, wo schlicht
kein Stil hinterlegt ist.
Testlauf 11.09.2026: 44 Dienste in 0,8 s, Layer gueltig, Stil angewendet,
"kein Stil hinterlegt" sauber gemeldet — 0 Fehler.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Erik, 08.09.2026: "in die GUI das Speichern via OGC einbauen, GeoJSON nicht mehr
verwenden."
- Seitenleiste hat jetzt zwei Bloecke: "Layer" (Auswahl, laden, Aenderungen
speichern) und "Darstellung" (Stil, Vorlage-Haken).
- Neuer Knopf "Aenderungen speichern" -> VlnKartenPlugin.run_save_edits():
schliesst die offenen Bearbeitungssitzungen ALLER geladenen OAPIF-Layer auf
einmal; ohne offene Bearbeitung kommt ein Hinweis statt einer Aktion.
Zurueckgeschrieben wird ohnehin je Feature (Part 4), der Knopf beendet nur die
Sitzung.
- Der GeoJSON-Weg ist raus: die vier Datensatz-Knoepfe, "Aktiven Layer
hochladen", DATASETS, run_load_dataset, run_upload_active_layer,
_confirm_replace_existing, vln_karten/layer_manager.py sowie
KartenApiClient.load_layer_complete/save_feature_collection.
- Stil-Hinweise angepasst: den Stil des eigenen Verfahrens darf jeder speichern,
die Vorlage nur die Gruppe MODUL_KARTENSTIL (Server-PR #565).
Geprueft headless mit QGIS 4.2 gegen die Live-API (TG Test 27998): ohne
Bearbeitung Hinweis, mit Aenderung Sitzung geschlossen, API zaehlt +1, Feature
sichtbar, danach wieder aufgeraeumt. Panel-Test deckt die neuen Knoepfe ab.
metadata.txt 0.5.0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Der OAPIF-Provider fragt je Sammlung nacheinander Sammlung, Schema, Stil,
OPTIONS und die erste Seite ab — bei 27 Sammlungen dauert das Anlegen 20,5 s
(gemessen 08.09.2026, Berbisdorf).
- ogc_layers.vorwaermen(): holt Landing, OpenAPI, Conformance, Sammlung, Schema
und Stil vorab und gleichzeitig ueber Qts Ereignisschleife (unter 1,5 s fuer
84 Antworten). layer_hinzufuegen ruft es vor dem ersten Layer auf. Ergebnis
14,2 s statt 20,5 s, und die Zeit schwankt deutlich weniger.
- Seitenleiste: drei Haken (Verfahren / Vorerhebung / Massnahmenblaetter) waehlen
aus, was geladen wird. Nur Verfahren 11,1 s (21 Layer), nur Vorerhebung oder
nur Massnahmenblaetter je 1,6 s (3 Layer).
Bewusst NICHT parallel: ein in einem Python-Thread gebauter OAPIF-Layer laesst
sich zwar in 0,9 s erzeugen, stuerzt aber beim ersten getFeatures() ab
(Segfault, gemessen) — der Provider gehoert dem Thread, der ihn gebaut hat.
tools/headless_panel_test.py prueft die neue Auswahl mit. metadata.txt 0.4.0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Erik, 08.09.2026: "ich will keine Toolbar, sondern so eine Seitenleiste auf der
rechten Seite."
- vln_karten/panel.py (neu): andockbares QDockWidget, rechts angedockt, mit den
Abschnitten Anmeldung, Verfahren, OGC API und Klassisch (GeoJSON) sowie einer
Statuszeile. Reine Oberflaeche; Klicks gehen als Rueckrufe ans Plugin.
- Verfahrensliste bekommt ein Suchfeld (Hausregel: Auswahllisten immer mit
Filter). Die Auswahl bleibt beim Filtern erhalten, "kein Treffer" liefert
kein VKZ.
- Der Stil-Knopf hat jetzt ein Haekchen "als Vorlage fuer alle Verfahren"; die
Umschalttaste wirkt weiterhin.
- Abmelden ist ein eigener Knopf (verwirft den gespeicherten API-Key).
- Menue Web -> VLN Karten -> "Seitenleiste anzeigen" blendet sie wieder ein.
- tools/headless_panel_test.py: prueft Zustaende, Filter, Rueckrufe und rendert
das Layout als PNG (QGIS 4.2 offscreen). Lauf am 08.09.2026: 17 Pruefungen,
0 Fehler, 285 Verfahren in der Liste.
- README und metadata.txt (0.3.0) nachgezogen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- ogc_layers.stil_anwenden(): GET …/style.qml, in eine Temp-Datei, loadNamedStyle; scheitert
der Abruf, bleibt die QGIS-Zufallsfarbe (kein Abbruch des Ladens).
- ogc_layers.stil_speichern(): saveNamedStyle -> PUT; 403 meldet die fehlende Gruppe im Klartext.
- plugin.run_save_style(): Knopf 'Stil des aktiven Layers speichern'; mit Umschalttaste als
Vorlage der Art (gilt fuer alle Verfahren, z. B. Karte alter Stand).
- README: Abschnitt Stile samt Routen und Berechtigung.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Erik (07.09.2026): "zuerst soll ein Loginfenster kommen und nach dem Login soll der Apikey
gespeichert werden."
- plugin.py: ohne gespeicherten Key zeigt initGui 1,5 s nach dem QGIS-Start den
Anmeldedialog (singleShot, damit der Dialog den Start nicht blockiert); mit Key wie
bisher direkt die Verfahrensliste.
- Nach erfolgreichem Login werden api_key (userauth) UND mail in QSettings gemerkt, die
Meldung nennt den angemeldeten Nutzer und die Dauerhaftigkeit. Das Passwort wird nie
gespeichert.
- README: Login-Verhalten; Abschnitt zum PAC-Proxy, der jede QGIS-Anfrage ~10 s kostet
(gemessen 07.09.2026: Server antwortet in 0,35 s, alle Antworten 200/204).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Seit dem 07.09.2026 bietet die API OGC API Features (Part 1/2/3/4) unter /v2/ogc. Neu:
- vln_karten/ogc_layers.py: Auth-Konfiguration "APIHeader" (X-API-Key aus dem Login,
kein Passwort in QGIS), GET /ogc/collections?vkz=, je Sammlung ein QgsVectorLayer(...,
"OAPIF") in Gruppen (Vorerhebung / Massnahmenblaetter / Verfahren); Speicher-CRS je
Sammlung (EPSG:25833 bzw. CRS84).
- plugin.py: Toolbar-Aktion "Alle Layer (OGC API) laden" (run_load_ogc).
- README: Weg ohne Plugin (Datenquellenverwaltung, Basic oder API-Header), Sammlungs-IDs,
Schreibregeln (in place, Vorerhebung nur "bearbeitung", Massnahmenblatt blatt_*),
Routenuebersicht; klassischer GeoJSON-Weg bleibt als zweiter Abschnitt.
- metadata: 0.2.0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lädt Verfahrensgebiet, Plan 41, Karte alter Stand (KAS) und Wertermittlung
(WE) je VKZ vollständig aus KARTE_OBJEKT (Listen-Endpunkt mit Paging) und
schreibt sie per PUT zurück. Einmaliger Login (mail/password -> userauth),
API-Key persistiert in QSettings; Verfahrens-Auswahl in der Toolbar wird
je QGIS-Projekt gemerkt. Gemischte Geometrietypen werden beim Laden in
Punkte-/Linien-/Flächen-Layer gesplittet und beim Hochladen wieder
vereint. Qt5/Qt6-kompatibel (QGIS 3.22+ und QGIS 4).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>