QGIS startup-routine met Python maken?

Goedemiddag allen,

Vanuit mijn AutoCAD specialisme op het gebied van automatisering, ben ik mij op dit moment ook aan het verdiepen in de mogelijkheden om QGIS gestandaardiseerd te installeren binnen de organisatie.

Na diverse afwegingen is op dit moment de keuze gevallen om op al onze laptops de standaard versie van QGIS te installeren. Daarnaast hebben we een centrale omgeving waar vanuit wij standaard templates en layout files willen ontsluiten.
Het doel wat ik op dit moment zoek is redelijk ‘simpel’:
Ik heb een snelkoppeling gemaakt met de --profile optie om op te starten met een bedrijfsprofiel en de --code optie om bij het opstarten van QGIS een Pythonscript te starten.
Wat ik graag in de python wil regelen:

  • Bij het opstarten van QGIS controleren of het bedrijfsprofiel aanwezig is, zoniet moet deze worden aangemaakt en en actief worden gemaakt.
  • In dit profiel moet de pathverwijziging naar ‘layouts’ en ‘sjabonen’ worden gewijzigd naar een pathlocatie welke ik in het python script wilt zetten.

Nu is het gelukt om het grootste deel in een python script te programmeren… alleen het werkt niet…
Waar ik achter ben gekomen is dat de --code functie wordt uitgevoerd tijdens het opstarten van QGIS en het instellen van de pathlocaties allemaal nog niet kan.

Het gaat dus ergens mis in de timing van het uitvoeren van het script.

Om een lang verhaal kort te maken:
Wat is in de QGIS wereld dé manier om bovenstaande te kunnen bereiken?
Het idee is dat ik met het pythonscript ook ‘later’ aanpassingen kan doen, die bij het opstarten worden doorgevoerd. Hiermee kan de gebruiker zijn eigen profiel maatwerk maken, maar tóch worden voorzien van standaard configuratie.
De standaard import/export van de profiles ben ik zodoende geen voorstander van.

Ik hoop dat jullie mij op weg kunnen helpen in deze, voor mij volledig nieuwe wereld! :slight_smile:

2 likes

Ik heb er te weinig kennis van, maar ergens in mijn achterhoofd herinner ik me dat er een debug mogelijkheid zit in QGIS? Misschien is dat nog te gebruiken om te zien waar iets mis gaat :slight_smile:

Wij pakken het iets anders aan. Naast dat QGis bij ons een Citrix applicatie is, maken wij een standaard profiel aan. Bij elke installatie en elke update word dat profiel van een centrale lokatie naar iedere gebruiker gekopieerd, zodat in beginsel iedereen dezelfde instellingen en standaard plugins (die wij ook aanbieden, onder andere om gegevens uit databases te kunnen ophalen). Naast het QGis icoontje bieden we dan ook nog een icoontje aan dat naar een batch-filetje verwijst, waarmee het profiel van de gebruiker overschreven word met het standaard profiel.
Dit heeft als voordeel dat gebruikers wel zelf ook dingen kunnen aanpassen naar hun eigen wensen, maar standaard toch de kaart-opmaak-sjablonen en dergelijke kunnen vinden en dat soort zaken. En als het misgaat, is het voor de gebruiker ook weer eenvoudig om zelf alles te herstellen. Waarschijnlijk is dat een beetje eenvoudiger dan met Python-scriptjes te gaan werken, voor ons werkt het in ieder geval goed (zo’n 2- tot 300 QGis gebruikers, verdeeld over 25 locaties door het hele land).

@Anton : View->Panels->Debugging/Development Tools. Vooral de opstart-tijden zijn heel erg waardevol als mensen klagen over dat het zo lang duurt voordat QGis opgestart is (terwijl ze dan 350 verschillende kaartlagen tegelijk willen zien :wink:)
Of bedoel je View->Panels->Log Messages? Daarin staan ook Python meldingen, da’s in dit geval misschien handiger.

Natuurlijk kunnen we dat! :wink: Je bent hier in ieder geval welkom, en op 1 van de goede plekken om vragen te stellen (de andere is misschien de QGIS Gebruikersgroep Nederland).

1 like

Een paar jaar geleden wees @rduivenvoorde n.a.v. een soortgelijke vraag (QGIS global settings file (.ini)) op een Duitse pagina met heel veel nuttige info hierover: site:deployment:zentral_en [QGIS-DE e.V.]

Voor layouts kun je meerdere folders opgeven (via settings/options/layouts → layout paths).
Voor project templates kun je denk ik maar één folder opgeven (via settings/options/general → project files → template folder.

2 likes

Goedenavond sbjager, dank voor je uitgebreide antwoord!
De methode die je omschrijf heb ik inderdaad ook als optie op de lijst staan.
Waar ik mij dan zorgen om maak (en dat is mogelijk mijn AutoCAD/handicap)…

Stel… je wilt de pathlocatie van bijvoorbeeld de sjablonen veranderen en één standaard instelling uitschakelen.
Moet iedereen dan weer met een ‘schone installatie’ beginnen vanuit het gekopieerde profiel, of dan je dit soort wijzigingen op de achtergrond doorvoeren, zonder dat de eindgebruiker er eigenlijk iets van merkt?

ik heb e.e.a. werkend gekregen!
Voor de liefhebber:

  • een eigen profiel aanmaken
  • layouts path locatie instellen
  • sjablonen path locatie instellen.
    Dit script aanroepen vanuit een snelkoppeling met de --code toevoeging en voila! :slight_smile:
from qgis.utils import iface
from qgis.core import QgsApplication
from PyQt5.QtCore import QSettings
import os

# Display the welcome message when QGIS starts
iface.messageBar().pushMessage("<BEDRIJFSNAAM>", "QGIS geladen met de '<BEDRIJFSNAAM>' configuratie!", duration=10)

# Define the paths you want to add
new_template_dir = "C:/DEMO"
new_sjabloonmap_dir = "C:/DEMO2"

# Get the active profile using the provided snippet
active_profile = os.path.basename(os.path.normpath(QgsApplication.qgisSettingsDirPath()))

if active_profile == "<BEDRIJFSNAAM>":
    # Access the existing layout template paths using QgsApplication
    app = QgsApplication.instance()
    existing_paths = app.layoutTemplatePaths()

    # Check if the new layout template path is already in the existing paths list
    if new_template_dir not in existing_paths:
        # Access QGIS settings using QSettings for the layout templates path
        params = QSettings(app.qgisSettingsDirPath() + "QGIS/QGIS3.ini", QSettings.IniFormat)
        params.beginGroup("/core/Layout")

        # Retrieve the current directories
        existing_dir = params.value("searchPathsForTemplates")

        # Append the new layout template path to the list, if necessary
        if existing_dir is None:
            existing_dir = [new_template_dir]
        elif isinstance(existing_dir, str):
            if new_template_dir != existing_dir:
                existing_dir = [existing_dir, new_template_dir]
        else:  # if it's already a list
            if new_template_dir not in existing_dir:
                existing_dir.append(new_template_dir)

        # Set the updated list of directories for layout templates
        params.setValue("searchPathsForTemplates", existing_dir)
        params.sync()  # Force saving the changes
        
        # Notify the user that the layout template path was added
        iface.messageBar().pushMessage("<BEDRIJFSNAAM>", f"Lay-outs locatie succesvol ingesteld op: {new_template_dir}", duration=5)
    else:
        # Notify the user that the layout template path is already present
        iface.messageBar().pushMessage("<BEDRIJFSNAAM>", f"Lay-outs locatie is reeds ingesteld op: {new_template_dir}", duration=5)

    # Now set the 'Sjabloonmap' path under the correct '[qgis]' section
    params = QSettings(app.qgisSettingsDirPath() + "QGIS/QGIS3.ini", QSettings.IniFormat)
    params.beginGroup("/qgis")  # Ensure we're working in the correct section

    # Set the 'Sjabloonmap' path to the new folder if it's not already set
    existing_sjabloonmap = params.value("projectTemplateDir")
    if existing_sjabloonmap != new_sjabloonmap_dir:
        params.setValue("projectTemplateDir", new_sjabloonmap_dir)
        params.sync()  # Force saving the changes
        iface.messageBar().pushMessage("<BEDRIJFSNAAM>", f"Sjablonen locatie succesvol ingesteld op: {new_sjabloonmap_dir}", duration=5)
    else:
        iface.messageBar().pushMessage("<BEDRIJFSNAAM>", f"Sjablonen locatie is reeds ingesteld op: {new_sjabloonmap_dir}", duration=5)
else:
    # Notify the user that the profile is not '<BEDRIJFSNAAM>', and no changes were made
    iface.messageBar().pushMessage("<BEDRIJFSNAAM>", f"Geen wijzigingen doorgevoerd omdat het actieve profiel '{active_profile}' is.", duration=5)

4 likes

Dan moet iedereen inderdaad het standaard-profiel opnieuw over z’n eigen profiel heen zetten inderdaad. En daar merkt de eindgebruiker best wel wat van, de lijst recente projecten bijvoorbeeld verdwijnt. Maar als je goed nadenkt over wat je waar neerzet: hoe vaak gebeurt het dan dat je de locatie van sjablonen veranderd? Nieuwe sjablonen ja, aangepaste ook, maar de locatie? Ik werk hier nu 7.5 jaar, en in die tijd zijn die locaties nooit aangepast. De sjablonen zelf wel, ivm een nieuw adres voor het hoofdkantoor bijvoorbeeld, en een ander logootje.
En het vernieuwen van het profiel is iets wat onze eindgebruikers toch al met enige regelmaat doen, omdat dat vaak ook dingen oplost als plugins die niet (meer) kunnen worden geladen. Dus de impact die het heeft is minimaal, en men is er aan gewend, ook omdat wij 9 van de 10 keer problemen vanaf afstand moeten oplossen (ivm 25 kantoren door het hele land - wij kunnen niet overal tegelijk zijn :smile:)
Maar: als je organisatie gebruik maakt van roaming profiles voor het OS, dan zou je sjablonen en dergelijke ook daarin kunnen opnemen, en QGis naar die directory laten kijken.

Dat alles gezegd hebbende: Ik vind je opstart-python scriptje wel interessant, ik ga waarschijnlijk wel eens kijken of dat voor ons nuttig zou kunnen zijn :slight_smile:

1 like

Hi sbjager,

Bekende scenario’s inderdaad zoals je omschrijft.
Vanuit de ‘AutoCAD’ wereld heb ik enorm gewend dat ik vanuit een centraal script wat aanpassingen kan doen. Soms pathlocaties, standaard plugin installeren of een instelling aanpassen, vinkje uitzetten e.d. Allemaal dynamisch zonder dat de gebruikers het merken.

Binnen QGIS heb ik nog totaal geen ervaring met de frequentie waarmee dit voorkomt.
Misschien is dit wel een ‘over-de-top’ oplossing voor een probleem dat sporadisch gaat voorkomen.

Afijn, ik ben benieuwd of het script je kan helpen.
Ik laad deze dus direct in met de --code functie vanuit een maatwerk snelkoppeling.
Deze snelkoppeling installeer ik weer automatisch middels een Intune protocol van Microsoft. :slight_smile:

Dank voor het meedenken en de toelichtingen

Geen dank, graag gedaan. Bovendien heel interessant om hier weer eens naar te kijken. Want omdat we het altijd zo hebben gedaan, en het tot nu toe goed gewerkt heeft, betekent niet dat het niet beter zou kunnen. En ik ben vanuit mijn functie altijd op zoek om het werk voor mijn collega’s te vergemakkelijken en verbeteren, dus dit soort dingen vind ik enorm interessant. Misschien gaan we wel een combinatie van beide methodes toepassen, of gaan we overstappen op de script-methode, dat weet ik nog niet. Maar ik ga het zeker onderzoeken, dus dank voor het hier ter sprake brengen :smiley:

1 like