pretraitement_dory/script_pre_traitement_dory.py
David Castex dfd0c8850c Ajout environnement de travail
- ajout de l'algorithme, terminé
- ajout du script, en construction
- ajout d'un dossier de test
2025-02-28 10:41:34 +01:00

288 lines
11 KiB
Python

# ~~ Script DORY Digitanie ~~
# Voir algorithme.txt pour plus de détails et commentaires
import os # getcwd(),
# - une liste des extensions nécessaires
NECESSAIRES = ["cpg", "dbf", "prj", "shp", "shx"]
# - une liste des extentions auxiliaires
AUXILIAIRES = ["qix", "qmd", "qml"]
# - la configuration de la feuille Excel
CONFIG = {"NOM" : "A5",
"TYPE" : "B5",
"NB_FICHIERS" : "C5",
"ENCODAGE" : "D5",
"PROJECTION" : "E5",
"VALIDITE" : "F5"}
# REPRESENTATION DES DONNEES
class _Fichier:
def __init__(self,
nom_original="Pas de nom original",
chemin="Pas de chemin",
extension="Pas d'extension",
nom= "Pas de nom",
implication="Non-conforme"):
self.nom_original = nom_original # - son nom original - string
self.chemin = chemin # - son chemin - string
self.extension = extension # - son extension - string
self.nom = nom # - son nom formaté - string
self.implication = implication # - son implication - enum
# {"Nécessaire",
# "Auxiliaire",
# "Non-conforme",
# "A-ignorer"}
def afficher(self):
print("nom : ".center(16), self.nom)
print("nom orig : ".center(16), self.nom_original)
print("ext : ".center(16), self.extension)
print("chemin : ".center(16), self.chemin)
print("implication :".center(16), self.implication)
class _Catalogue:
def __init__(self,
necessaires="Pas de dico",
auxiliaires="Pas de dico",
non_conformes="Pas de dico"):
self.necessaires = necessaires # - son dictionnaire de fichiers nécessaires avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
self.auxiliaires = auxiliaires # - son dictionnaire de fichiers auxiliaires avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
self.non_conformes = non_conformes # - son dictionnaire de fichiers non-conformes avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
class _Projet:
def __init__(self,
nom="Pas de nom",
catalogue="Pas de catalogue",
nb_fichiers=0,
conformite=False,
projection="Pas de projection",
encodage="Pas d'encodage"):
self.nom = nom # - son nom - string
self.catalogue = catalogue # - son catalogue - _Catalogue
self.nb_fichiers = nb_fichiers # - son nombre de fichiers - entier
self.conformite = conformite # - sa conformité - bool
self.projection = projection # - sa projection géodésique - string // ou énumération --> voir Constantes
self.encodage = encodage # - son type d'encodage prévu dans QGIS string
# /* pour ce script, ce devrait être forcement "UTF8" */
# DEFINITIONS DE FONCTIONS
def formatter(chaine):
"""Formate selon nomenclature.
Formate la chaine de caractères passée en paramètre :
Enlève tous les accents français. Enlève la cédille du C.
Remplace les espaces ' ' et les traits d'union '-' par
des tirets bas '_'.
Ne traite pas pour le moment le AE et OE ligaturé.
"""
#TODO : gérer les accents sur majuscules
#TODO : amélioration ou exercice, utiliser la méthode str.translate() et maketrans
resultat = ""
for c in chaine:
match c:
case "à" | "â" | "ä":
resultat+= "a"
case "é" | "è" | "ê" | "ë":
resultat+= "e"
case "î" | "ï":
resultat+= "i"
case "ô" | "ö":
resultat+= "o"
case "ù" | "û" | "ü":
resultat+= "u"
case "ÿ":
resultat+= "y"
case "ç":
resultat+= "c"
case " " | "-":
resultat+= "_"
case _:
resultat+= c
return resultat
def impliquer(fichier):
"""Définir l'implication d'un fichier
Les fichiers nécessaires sont indispensables sinon l'importation
de la couche échoue.
Les fichiers optionels (ou auxiliaires) contiennent des données
supplémentaires lors de l'importation.
Les fichiers non conformes pourraient être importer dans QGIS. Mais,
ne sont pas conformes au cahier des charges.
Les fichiers ignorés ne fonctionnent pas dans QGIS.
L'implication est définie en fonction de l'extension du fichier.
"""
resultat = fichier
match fichier.extension:
case "dbf" | "cpg" | "prj" | "shx" | "shp":
resultat.implication = "Necessaire"
case "qix" | "qmd" | "qml":
resultat.implication = "Auxiliaire"
case "qpkg" | "sqlite":
resultat.implication = "Non-conforme"
case _:
resultat.implication = "A-ignorer"
return resultat
# DEBUT DU PROGRAMME
liste = [] # - une liste des fichiers list _Fichier
dico = {} # - un dictionnaire des projets avec pour clé le nom de chaque projet
# dico de paire string : Entité Projet
racine = os.getcwd() # - un chemin absolue vers le repertoire racine à traiter string
print(racine)
# --recupérer le chemin du dossier à traiter
# Si il y a PAS un dossier de traitement dans le working directory Alors
pas_de_dossier = True
for a in os.scandir("./"):
if a.is_dir():
#il y a un dossier
pas_de_dossier = False
if pas_de_dossier:
print("Pas de dossier trouvé...\nFin de programme\n")
os.system("pause")
# fin du programme
exit()
else:
print(f"Dossier à Traiter trouvé : {a.name}")
racine = a
# --analyser le dossier
# initialiser une liste de _Fichiers
liste = []
# Pour Chaque fichier des dossiers et sous dossiers à explorer Faire
for dossier_courant, list_dossiers, list_fichiers in os.walk(racine):
for fichier_courant in list_fichiers:
# --lire, analyser chaque fichier et peupler la liste
# initialiser un _Fichier
ce_Fichier = _Fichier()
# lire son chemin
ce_Fichier.chemin = fichier_courant
# déterminer son nom original et son extension
# lire le nom original
# lire son extension
ce_Fichier.nom_original, ce_Fichier.extension = ce_Fichier.chemin.split(".")
# formatter et écrire le nom
ce_Fichier.nom = formatter(ce_Fichier.nom_original)
# déterminer son implication
ce_Fichier = impliquer(ce_Fichier) # TODO impliquer(), A VOIR si je peux passer juste l'implicatin et non l'ojbet en entier
# ajouter le _Fichier à la liste
liste.append(ce_Fichier)
# Fin Pour
# /* Ici la liste des _Fichiers doit être correctement remplie */
#TEST affichage de la liste de fichier
for a in liste:
a.afficher()
print("\n\n")
os.system("pause")
# initialiser un dictionnaire de _Projets avec comme clé leurs noms respectifs
# Pour Chaque fichier de la liste Faire
# --associer le fichier courant à un projet du dictionnaire
# /* Vérifier que le projet existe déjà dans le dico */
# Si le nom du fichier courant n'est pas dans le dico Alors
# initialiser un _Projet
# ajouter le nom comme clé dans le dictionnaire
# associer le projet à cette clé
# Fin Si
# cataloguer le fichier dans le projet concerné
# il y a un fichier de plus au projet
# Fin Pour
# Pour Chaque projet du dictionnaire Faire
# --analyser et completer les infos du projet courant
# /* conformité, projection, encodage etc */
# lire la projection du projet courant
# lire l'encodage du projet courant
# Si tous les fichiers nécessaires sont présents ET
# la projection est correcte ET
# l'encodage est correct Alors
# passer le projet à conforme
# Fin Si
# Fin Pour
# /* Ici le dictionnaire des _Projets doit être correctement remplie */
# --produire le rapport
# créer un classeur Excel
# /* Note : peut être utiliser un modèle pré-config */
# --mettre en page la première feuille du classeur
# inserer une image
# écrire les nom des colonnes
# écrire les formules de colorations auto des colonnes
# Pour chaque projet du dictionnaire Faire
# --completer la feuille avec les infos du projet courant
# /* Note : Chaque ligne de la feuille correspond à un projet */
# /* Utiliser la config fournie en Constante */
# écrire le nom du projet
# écrire le type d'extention
# /* Note : ce sera "SHP" pour les projets conformes et le type
# natif pour les non-conformes */
# écrire le nombre de fichiers du projet
# écrire l'encodage
# écrire la projection
# écrire la validité (conformité)
# encadrer le "tout" pour délimiter le tableau de la feuille
# Fin Pour
# /* Ici le rapport doit être correctement produit et remplie */
# --produire le dossier de mise à disposition
# créer un dossier "Travail" et un dossier "Livraison"
# --créer l'arborescence du dossier "Travail"
# le dossier Travail devient le working directory
# créer un dossier "00-Cadastre"
# créer un dossier "01-Donnees_Valides"
# créer un dossier "02-Donnees_Invalides
# créer un dossier "03-Production"
# créer un dossier "04-Verif_Geometrie"
# --peupler le dossier "Travail"
# Pour Chaque projet du dictionnaire Faire
# copier les fichiers des projets conforme dans le dossier "01"
# copier les fichiers des projets non-conformes dans le dossier "02"
# Fin Pour
# /* Ici les dossiers doivent être correctement produit et remplie */
# ARRET DU PROGRAMME
# /* TODO Controler qu'il y a bien les 5 necessaires par projet sinon FAIL
# --> a faire dans le controle de conformité de chaque projet */
# /* TODO S'assurer que les GPKG et autres non conformes peuplent correctement
# les infos dans les projets --> géré si l'initialisation des
# projets est correctement fait */