42 lines
2.9 KiB
Markdown
42 lines
2.9 KiB
Markdown
---
|
||||
|
|
name: sn-neues-fachplugin
|
|||
|
|
description: Neues sn_*-Fachplugin oder neuen Tab nach dem Integrationsvertrag von sn_basis anlegen (Registrierung in Menü/Toolbar, DockManager, BaseDockWidget, Tabs, Services, Release-Dateien). Verwenden bei "neues Plugin", "Plugin anlegen", "FLT/Topografie/Widmung ausbauen", "neuen Tab hinzufügen".
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Neues Fachplugin anlegen
|
|||
|
|
|
|||
|
|
Vertrag: `docs/architektur/schnittstellen.md` Abschnitte 1–2. Minimalmuster: `Plugin_SN_Widmung/`. Vollständiges Muster mit Services: `Plugin_SN_Verfahrensgebiet/main.py` und `ui/dockwidget.py`.
|
|||
|
|
|
|||
|
|
## Dateien (Paketname `sn_<name>`, Repo `Plugin_SN_<Name>`)
|
|||
|
|
```
|
|||
|
|
__init__.py classFactory(iface) → Klasse aus main.py
|
|||
|
|
main.py Klasse <Name>: __init__(iface), initGui(), unload(), run()
|
|||
|
|
ui/dockwidget.py class DockWidget(BaseDockWidget): tabs = [ArbeitsTab, PrintTab, SettingsTab]
|
|||
|
|
ui/tabs/<tab>.py class <Tab>(QWidget): tab_title = "…"; optional set_services(...), cleanup()
|
|||
|
|
functions/… Fachfunktionen (keine Qt-Importe außer über Wrapper)
|
|||
|
|
tests/__init__.py, tests/test_main.py Mock-Modus (Muster: Plugin_SN_Verfahrensgebiet/tests/test_main.py)
|
|||
|
|
changelog.txt, README.md, .gitignore
|
|||
|
|
.gitea/workflows/release.yaml Kopie aus einem bestehenden Plugin (unverändert)
|
|||
|
|
.gitea/templates/metadata.template Name, Beschreibung, Homepage/Tracker/Repository-URLs dieses Repos, qgisMinimumVersion=3.40, supportsQt6=true
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## main.py – Pflichtverhalten
|
|||
|
|
- `initGui()`: `basis = plugins.get("sn_basis")`; ohne `basis.ui` **nichts tun** (Basis ruft später nach). Sonst
|
|||
|
|
`self.action = basis.ui.add_action(self.plugin_name, self.run, tooltip=…, priority=<frei, 10/20/30 sind vergeben>)`, dann `basis.ui.finalize_menu_and_toolbar()`.
|
|||
|
|
- `run()`: Dock erzeugen, `setObjectName("sn_dock_<name klein>")`, `dock.action = self.action`, `DockManager.show(dock)`, `basis.ui.set_active_plugin(self.action)`.
|
|||
|
|
- `unload()`: `iface.removeDockWidget`, `deleteLater`, `basis.ui.remove_action(self.action)`.
|
|||
|
|
- Services: `Pruefmanager(ui_modus="qgis")` und `DataGrabber(pruefmanager=…)` in `__init__` anlegen und an das Dock geben, wenn Prüfungen/Datenabruf gebraucht werden.
|
|||
|
|
|
|||
|
|
## Imports
|
|||
|
|
Nur `from qgis.utils import plugins` (main.py) und `sn_basis.functions.*`/`sn_basis.modules.*`/`sn_basis.ui.*`. Kein `qgis.core`, kein `PyQt*`.
|
|||
|
|
|
|||
|
|
## Registrieren im Workspace
|
|||
|
|
- `workspace.toml`: Eintrag `[[repos]]` mit `paket`, `rolle`, `tests`.
|
|||
|
|
- `docs/architektur/modulkarte.md` und `schnittstellen.md` (Priorität) ergänzen.
|
|||
|
|
- Repo-`AGENTS.md`/`CLAUDE.md` aus `docs/vorlagen/AGENTS.repo.md` und `CLAUDE.repo.md`.
|
|||
|
|
- Gitea: Repo-Variable `ZIP_FOLDER=sn_<name>` und Secret/Variablen wie bei den anderen Plugins (Maintainer).
|
|||
|
|
|
|||
|
|
## Abnahme
|
|||
|
|
- `python scripts/run_tests.py sn_<name>` grün (mindestens `test_main.py`).
|
|||
|
|
- In QGIS: Plugin erscheint in Menü/Toolbar „LNO Sachsen“, Dock öffnet, andere Docks schließen, Unload hinterlässt keine Reste.
|