Skip to content

Commit

Permalink
Update support
Browse files Browse the repository at this point in the history
  • Loading branch information
Gustry committed Dec 5, 2024
1 parent 48ebfb9 commit 363fce5
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 40 deletions.
2 changes: 1 addition & 1 deletion docs/expression.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ On va désormais **parser** le fichier JSON que l'on obtient avec la libraire `j

## Mémo

Pour lire un fichier à l'aide d'un "contexte Python" qui va ouvrir et ferme le fichier :
Pour lire un fichier à l'aide d'un "contexte Python" qui va ouvrir et fermer le fichier :

```python
import json
Expand Down
20 changes: 10 additions & 10 deletions docs/extension-generique.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,25 @@ Pour créer une extension dans QGIS, il existe deux façons de démarrer :
* Très léger
* Besoin de **tout** refaire depuis zéro

Nous pouvons suivre une des deux méthodes, mais dans le cadre de la formation, faisons la méthode minimale.
Dans les deux cas, le résultat doit être dans le dossier `python/plugins` du profil courant.
[![Télécharger le ZIP](https://img.shields.io/badge/Télécharger-ZIP-green)](https://raw.githubusercontent.com/Gustry/qgis_minimal_plugin/refs/heads/master/minimal_plugin.zip)

!!! tip
Pour trouver le profil courant, dans QGIS, `Préférences` -> `Profils Utilisateurs` -> `Ouvrir le dossier du profil actif`.
1. Télécharger le ZIP
2. Installer le depuis le gestionnaire des extensions, à l'aide du ZIP

!!! tip
Pour installer le Minimal Plugin, vous pouvez utiliser le gestionnaire des extensions pour installer
depuis un zip.

Exemple d'utilisation d'un panneau qui présentent les algorithmes "Processing" :

![RAEPA](./media/gobs.png)
Pour trouver le profil courant, dans QGIS, `Préférences` -> `Profils Utilisateurs` -> `Ouvrir le dossier du profil actif`.

### Le fichier `metadata.txt`

[Liste des valeurs possibles](https://docs.qgis.org/3.34/en/docs/pyqgis_developer_cookbook/plugins/plugins.html#metadata-txt)
dans un fichier `metadata.txt`

### Exemple d'une extension Processing et graphique

Exemple d'utilisation d'un panneau qui présentent les algorithmes "Processing" :

![RAEPA](./media/gobs.png)

## Extensions utiles

### Plugin reloader
Expand Down
20 changes: 19 additions & 1 deletion docs/fonctions-scripts.md
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,10 @@ Idéalement, il faut vérifier le résultat de l'enregistrement du fichier. Les
retournent systématiquement un tuple avec un code d'erreur et un message si nécessaire, voir la
[documentation](https://api.qgis.org/api/classQgsVectorFileWriter.html#a3a4405a59d8f8ac147878cae5bd9bade).

Pour s'en rendre compte, on peut inclure un `print()` autour du `QgsVectorFileWriter.writeAsVectorFormatV3()`.
Pour s'en rendre compte, on peut ajouter une variable `result = QgsVectorFileWriter.writeAsVectorFormatV3(...)`.
Puis de faire un `print(result)` pour s'en rendre compte. On peut tenir compte donc ce tuple :

* `QgsVectorFileWriter.WriterError.NoError``0`

**De plus**, en cas de succès, il est pratique d'avertir l'utilisateur. On peut aussi fournir un lien pour ouvrir
l'explorateur de fichier :
Expand All @@ -555,3 +558,18 @@ iface.messageBar().pushSuccess(
).format(output_file.parent, output_file)
)
```

??? note "Pour ajouter le support du message d'erreur"
```þython
if result[0] != QgsVectorFileWriter.WriterError.NoError:
print(f"Erreur : {result[1]}")
else:
# Affichage d'un message à l'utilisateur
iface.messageBar().pushSuccess(
"Export OK des couches 👍",
(
"Le fichier CSV a été enregistré dans "
"<a href=\"{}\">{}</a>"
).format(output_file.parent, output_file)
)
```
19 changes: 8 additions & 11 deletions docs/script-processing.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,20 +183,17 @@ On peut compléter l'action avec un `processing.run` en utilisant uniquement l'e

## Introduction aux décorateurs

Comme mentionné au début de ce chapitre, il est possible de ne pas utiliser la POO pour écrire un Script
Processing mais plutôt les décorateurs. Reprenons l'exemple de la documentation.
Comme mentionné au début de ce chapitre, il est possible de ne pas utiliser la [POO](./ecriture-classe-poo.md) pour
écrire un "Script Processing" mais plutôt l'écriture à l'aide des **décorateurs**.

Le code suivant utilise le décorateur `@alg` pour :
Dans la documentation QGIS, on trouve :

* utiliser une couche vectorielle comme entrée
* compter le nombre d'entités
* faire une opération buffer
* créer une couche raster à partir du résultat de l’opération de tampon
* renvoyer la couche tampon, la couche raster et le nombre d’entités

Dans la documentation QGIS, on trouve
* le [tableau de correspondance](https://docs.qgis.org/3.34/fr/docs/user_manual/processing/parameters.html#processing-algs-input-output)
entre la notation dans le décorateur et pour les types des paramètres
* un [exemple avec décorateur](https://docs.qgis.org/3.34/fr/docs/user_manual/processing/scripts.html#the-alg-decorator)
[la correspondance](https://docs.qgis.org/latest/fr/docs/user_manual/processing/scripts.html#input-types)
des décorateurs avec la classe Processing.

Le code suivant utilise le décorateur `@alg` :

```python

Expand Down
49 changes: 32 additions & 17 deletions docs/selection-parcours-entites.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ from qgis.utils import iface
layer = iface.activeLayer()
layer.removeSelection()
layer.selectByExpression(f"\"INSEE_COM\" LIKE '77%'")
# layer.selectByExpression(f'"INSEE_COM" LIKE \'77%\'') # Résultat identique
layer.invertSelection()
layer.removeSelection()
```
Expand Down Expand Up @@ -62,7 +63,7 @@ donc une liste de couches. Il convient alors de regarder si la liste est vide ou
from qgis.core import QgsProject

projet = QgsProject.instance()
communes = projet.mapLayersByName('communes')[0]
communes = projet.mapLayersByName('communes')

if len(communes) == 0:
print("Pas de couches dans la légende qui se nomme 'communes'")
Expand Down Expand Up @@ -101,7 +102,7 @@ for dept in depts:
options
)
print(result)
if result[0] == QgsVectorFileWriter.NoError:
if result[0] == QgsVectorFileWriter.WriterError.NoError:
print(" → OK")
```

Expand Down Expand Up @@ -259,8 +260,8 @@ dans beaucoup de languages.

Dans le langage informatique, une exception peut-être :

* levée ("raise" en anglais) pour déclencher une erreur
* attrapée ("catch" en anglais, ou plutôt "except" en Python) pour traiter l'erreur
* levée ("`raise`" en anglais) pour déclencher une erreur
* attrapée ("catch" en anglais, ou plutôt "`except`" en Python) pour traiter l'erreur

Essayons dans la **console** de faire une opération 10 / 2 :

Expand All @@ -277,7 +278,7 @@ Passons cette fois-ci dans un **script** pour que cela soit plus simple, et voir

```python
print('Début')
print(10 / 0)
print(10 / 2)
print('Fin')
```

Expand Down Expand Up @@ -306,7 +307,7 @@ et de traiter l'erreur si besoin.
def function_3():
print("Début fonction 3")
a = 10
b = 0
b = 2
print(f"{a} / {b} = {a/b}")
print("Fin fonction 3")

Expand All @@ -323,10 +324,14 @@ def function_1():
function_1()
```

try:
function_2()
except ZeroDivisionError:
print("Fin de l'exception")
Testons désormais d'attraper l'erreur dans la fonction 1 :

```python
try:
function_2()
except ZeroDivisionError:
print("Fin de l'exception")
```

On voit que Python, quand il peut, nous indique la "stacktrace" ou encore "traceback",
c'est-à-dire une sorte de fil d'ariane.
Expand All @@ -338,7 +343,11 @@ recommandé, car il masque d'autres erreurs :

```python
try:
print(10 / 2)
a = 10 / 5

mois = ['janvier', 'février']
b = mois[0]

except Exception:
print('Erreur inconnue')
```
Expand All @@ -347,10 +356,10 @@ On peut par contre "enchaîner" les exceptions, afin de filtrer progressivement

```python
try:
a = "0"
print(10 / int(a))
a = "Bonjour"
print(10 / int(a))
a = 10 / 5
# a = 10 / 0
# a = 10 / int("NC")
# a = 10 / "NC"
except ZeroDivisionError:
print('Erreur, division par 0')
except ValueError:
Expand All @@ -375,6 +384,7 @@ int('10')
int('NC')
```

<!-- TODO AJOUTER EXEMPLE CALCUL VIA EXPRESSION -->
Correction possible de l'exercice :

```python
Expand All @@ -390,9 +400,14 @@ for feature in layer.getFeatures(request):
area = feature.geometry().area() / 1000000
try:
population = int(feature['POPULATION'])
# Par exemple, pour nettoyer une chaîne de caractère en Python des espaces avant/après : " Bonjour ".strip()
# "rstrip"/"lstrip" existent également
except ValueError:
population = 0
print('{commune} : {densite} habitants/km²'.format(commune=feature['NOM'], densite=population/area))

densite = population/area

print(f"{feature['NOM']} : {densite} habitants/km²")
```

Nous souhaitons enregistrer ces informations dans une vraie table avec un nouveau champ `densite_population`.
Expand Down Expand Up @@ -429,7 +444,7 @@ for feature in layer.getFeatures(request):

# Cette ligne n'aura aucun effet
# La variable "feature" est une copie, comme un peu le résultat du SELECT * FROM ma_table LIMIT 5
# un SELECT est en lecture seul. Pour expliquer rapidement
# un SELECT est en lecture seule. Pour expliquer rapidement ce qu'il se passe.
feature['densite'] = densite

# Uniquement l'appel à "changeAttributeValue" fonctionne
Expand Down

0 comments on commit 363fce5

Please sign in to comment.