mirror of
https://github.com/Alex38Lyon/Synthese-PSM_LARRA.git
synced 2026-06-01 13:59:13 +00:00
Script pyThtoDB
This commit is contained in:
+22
-8
@@ -24,13 +24,14 @@ pyCreate_th2
|
||||
|
||||
Script to automate the creation of folders and files for a .th file
|
||||
|
||||
- Define the different variables in the config.ini file
|
||||
- Create the necessary folders based on the 'template' folder
|
||||
- Generate the required files: th, th2, -tot.th
|
||||
- Create scraps with topo stations
|
||||
|
||||
Usage: python pyCreate_th2.py
|
||||
|
||||
How to use:
|
||||
- Define the different variables in the config.ini file
|
||||
- Create the necessary folders based on the 'template' folder
|
||||
- Generate the required files: th, th2, -tot.th
|
||||
- Create scraps with topo stations
|
||||
|
||||
|
||||
pyThStat
|
||||
--------
|
||||
@@ -38,6 +39,19 @@ pyThStat
|
||||
Script to calculate statistics of joined entities from a database File (.sql) Produced by Therion
|
||||
|
||||
Usage:
|
||||
- Export the SQL file using Therion command (.thconfig) : export database -o Outputs/database.sql
|
||||
- Command : python pythStat.py ./path/to/file.sql
|
||||
- Or : python pythStat.py to open a window
|
||||
- Export the SQL file using Therion command (.thconfig) : export database -o Outputs/database.sql
|
||||
- Command : python pythStat.py ./path/to/file.sql
|
||||
- Or : python pythStat.py to open a window
|
||||
|
||||
|
||||
pyThtoBD (in process)
|
||||
--------
|
||||
|
||||
Script to export therion data base to an other like Karsteau
|
||||
|
||||
Usage:
|
||||
- Place Export_bd.ini files in each of the cave directories to be exported.
|
||||
- Run python pyThtoDB.py, then select the Therion folder to export.
|
||||
- Results for Karsteau will be in the /Outputs/Export_bd/ directory.
|
||||
- Coming soon – Import the export results into Karsteau.
|
||||
|
||||
+23
-8
@@ -27,13 +27,14 @@ pyCreate_th2
|
||||
|
||||
Script pour automatiser la création des dossiers et fichiers pour un fichier .th
|
||||
|
||||
- Définir les différentes variables dans fichier config.ini
|
||||
- Création des dossiers nécessaires d'après dossier 'template'
|
||||
- Création des fichiers nécessaires : th, th2, -tot.th
|
||||
- Création des scraps avec les stations topo
|
||||
|
||||
Usage : python pyCreate_th2.py
|
||||
|
||||
Utilisation :
|
||||
- Définir les différentes variables dans fichier config.ini
|
||||
- Création des dossiers nécessaires d'après dossier 'template'
|
||||
- Création des fichiers nécessaires : th, th2, -tot.th
|
||||
- Création des scraps avec les stations topo
|
||||
|
||||
|
||||
pyThStat
|
||||
--------
|
||||
@@ -41,6 +42,20 @@ pyThStat
|
||||
Script pour calculer les statistiques des entités jonctionnées d'un fichier database (.sql) produit par Therion
|
||||
|
||||
Utilisation:
|
||||
- Exporter le fichier sql avec therion, commande therion.thconfig : export database -o Outputs/database.sql
|
||||
- Commande : python pythStat.py ./chemin/fichier.sql
|
||||
- Ou : python pythStat.py pour ouvrir une fenêtre
|
||||
- Exporter le fichier sql avec therion, commande therion.thconfig : export database -o Outputs/database.sql
|
||||
- Commande : python pythStat.py ./chemin/fichier.sql
|
||||
- Ou : python pythStat.py pour ouvrir une fenêtre
|
||||
|
||||
|
||||
pyThtoBD (développement en cours)
|
||||
--------
|
||||
|
||||
Script pour exporter une base Therion vers une base de données type Karsteau
|
||||
|
||||
Utilisation:
|
||||
- Placer des fichiers Export_bd.ini dans chacun des dossiers des cavités à exporter
|
||||
- Lancer python pyThtoDB.py, sélectionner le dossier therion à exporter
|
||||
- Résultats pour Karsteau dans le dossier /Outputs/Export_bd/
|
||||
- A venir - Importer le résultat de l'importation dans Karsteau
|
||||
|
||||
[Détails](./pyThtoBD/README.rst)
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,68 @@
|
||||
import logging
|
||||
import sys
|
||||
import re
|
||||
|
||||
# Couleurs ANSI par niveau de log
|
||||
COLOR_CODES = {
|
||||
logging.DEBUG: "\033[94m", # Bleu
|
||||
logging.INFO: "\033[92m", # Vert
|
||||
logging.WARNING: "\033[93m", # Jaune
|
||||
logging.ERROR: "\033[91m", # Rouge
|
||||
logging.CRITICAL: "\033[1;91m", # Rouge vif
|
||||
}
|
||||
RESET = "\033[0m"
|
||||
|
||||
# Supprime les codes ANSI (pour l'écriture dans les fichiers)
|
||||
def strip_ansi_codes(text):
|
||||
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
|
||||
return ansi_escape.sub('', text)
|
||||
|
||||
# Formatter pour la console avec couleurs
|
||||
class ConsoleFormatter(logging.Formatter):
|
||||
def format(self, record):
|
||||
color = COLOR_CODES.get(record.levelno, "")
|
||||
message = super().format(record)
|
||||
return f"{color}{message}{RESET}"
|
||||
|
||||
# Formatter pour le fichier sans les couleurs
|
||||
class FileFormatter(logging.Formatter):
|
||||
def format(self, record):
|
||||
clean_msg = strip_ansi_codes(record.getMessage())
|
||||
record_copy = logging.LogRecord(
|
||||
name=record.name,
|
||||
level=record.levelno,
|
||||
pathname=record.pathname,
|
||||
lineno=record.lineno,
|
||||
msg=clean_msg,
|
||||
args=(),
|
||||
exc_info=record.exc_info,
|
||||
func=record.funcName,
|
||||
sinfo=record.stack_info
|
||||
)
|
||||
return super().format(record_copy)
|
||||
|
||||
# Fonction de configuration du logger
|
||||
def setup_logger(logfile="app.log", debug_log=False):
|
||||
logger = logging.getLogger("Logger")
|
||||
logger.setLevel(logging.DEBUG) # Toujours logger tout (filtrage par handler)
|
||||
logger.handlers.clear()
|
||||
|
||||
# Détermine le niveau de log selon la variable
|
||||
min_level = logging.DEBUG if debug_log else logging.INFO
|
||||
|
||||
# Console handler
|
||||
console_handler = logging.StreamHandler(sys.stdout)
|
||||
console_handler.setLevel(min_level)
|
||||
console_formatter = ConsoleFormatter("%(levelname)s: %(message)s")
|
||||
console_handler.setFormatter(console_formatter)
|
||||
logger.addHandler(console_handler)
|
||||
|
||||
# File handler
|
||||
file_handler = logging.FileHandler(logfile, encoding="utf-8")
|
||||
file_handler.setLevel(min_level)
|
||||
file_formatter = FileFormatter("%(asctime)s - %(levelname)s - %(message)s")
|
||||
file_handler.setFormatter(file_formatter)
|
||||
logger.addHandler(file_handler)
|
||||
|
||||
return logger
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
|
||||
matplotlib
|
||||
pandas
|
||||
Shapely
|
||||
Fiona
|
||||
pyproj
|
||||
scipy
|
||||
netCDF4
|
||||
xarray
|
||||
joblib
|
||||
geopandas
|
||||
motionless
|
||||
salem
|
||||
configparser
|
||||
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
import tempfile
|
||||
import shutil
|
||||
import os
|
||||
from os.path import join
|
||||
import subprocess
|
||||
import re
|
||||
import logging
|
||||
|
||||
log = logging.getLogger("Logger")
|
||||
|
||||
#################################################################################################
|
||||
# Codes de couleur ANSI
|
||||
class Colors:
|
||||
BLACK = '\033[90m'
|
||||
RED = '\033[91m'
|
||||
GREEN = '\033[92m'
|
||||
YELLOW = '\033[93m'
|
||||
BLUE = '\033[94m'
|
||||
MAGENTA = '\033[95m'
|
||||
CYAN = '\033[96m'
|
||||
WHITE = '\033[97m'
|
||||
|
||||
ERROR = '\033[91m'
|
||||
WARNING = '\033[95m'
|
||||
HEADER = '\033[96m'
|
||||
|
||||
ENDC = '\033[0m'
|
||||
BOLD = '\033[1m'
|
||||
UNDERLINE = '\033[4m'
|
||||
|
||||
#################################################################################################
|
||||
def compile_template(template, template_args, **kwargs):
|
||||
try:
|
||||
log = ""
|
||||
tmpdir = tempfile.mkdtemp()
|
||||
config = template.format(**template_args, tmpdir=tmpdir.replace("\\", "/"))
|
||||
|
||||
print(f"{Colors.YELLOW}{config}{Colors.ENDC}\n")
|
||||
|
||||
config_file = join(tmpdir, "config.thconfig")
|
||||
log_file = join(tmpdir, "log.log")
|
||||
therion_path = kwargs["therion_path"] if "therion_path" in kwargs else "therion"
|
||||
with open(config_file, mode="w+", encoding="utf-8") as tmp:
|
||||
with open(log_file, mode="w+") as tmp2:
|
||||
tmp.write(config)
|
||||
tmp.flush()
|
||||
subprocess.check_output('''"{}" "{}" -l "{}"'''.format(therion_path, config_file, log_file), shell=True, )
|
||||
tmp2.flush()
|
||||
log = tmp2.read()
|
||||
if kwargs["cleanup"]:
|
||||
shutil.rmtree(tmpdir)
|
||||
print("\n" )
|
||||
return log, tmpdir
|
||||
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Colors.ERROR}Error: Therion template compilation error: {Colors.ENDC}{e}")
|
||||
|
||||
#################################################################################################
|
||||
def compile_file(filename, **kwargs):
|
||||
try:
|
||||
tmpdir = os.path.dirname(filename)
|
||||
log_file = join(tmpdir, "therion.log").replace("\\", "/")
|
||||
therion_path = kwargs["therion_path"] if "therion_path" in kwargs else "therion"
|
||||
|
||||
process = subprocess.Popen(
|
||||
[therion_path, filename, "-l", log_file],
|
||||
cwd=tmpdir,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT, # fusion stdout + stderr
|
||||
universal_newlines=True, # décodage automatique en texte
|
||||
bufsize=1 # ligne par ligne
|
||||
)
|
||||
|
||||
log.info(f"Start therion compilation file : {Colors.MAGENTA}{filename}")
|
||||
# Lecture en temps réel
|
||||
for line in process.stdout:
|
||||
line = line.rstrip()
|
||||
lower_line = line.lower()
|
||||
if "error" in lower_line:
|
||||
log.error(f"\t\t{line}")
|
||||
elif "warning" in lower_line:
|
||||
log.warning(f"\t{line}")
|
||||
else:
|
||||
log.debug(f"\t\t{Colors.WHITE}{line}")
|
||||
|
||||
process.wait()
|
||||
|
||||
# Si la commande échoue, result.returncode sera non nul
|
||||
if process.returncode != 0:
|
||||
# Affichage des erreurs et de la sortie standard
|
||||
log.error(f"Error during Therion compilation")
|
||||
log.error(f"stderr: \n{Colors.MAGENTA}{process.stderr.decode()}")
|
||||
|
||||
log.info(f"Therion file : {Colors.MAGENTA}{filename} {Colors.GREEN}compilation succeeded")
|
||||
|
||||
except Exception as e:
|
||||
log.error(f"Error: Therion file {Colors.ENDC}{filename}{Colors.ERROR} compilation error: {Colors.ENDC}{e}")
|
||||
|
||||
|
||||
|
||||
|
||||
#################################################################################################
|
||||
def compile_file_th(filepath, **kwargs):
|
||||
template = """source {filepath}
|
||||
layout test
|
||||
scale 1 500
|
||||
endlayout
|
||||
"""
|
||||
template_args = {"filepath": filepath}
|
||||
logs, _ = compile_template(template, template_args, cleanup=True, **kwargs)
|
||||
return logs
|
||||
|
||||
# Attention, version avec therion en français ! à voir pour les autres langues
|
||||
lengthre = re.compile(r".*Longueur totale de la topographie = \s*(\S+)m")
|
||||
depthre = re.compile(r".*Longueur totale verticale =\s*(\S+)m")
|
||||
|
||||
#################################################################################################
|
||||
def get_stats_from_log(log):
|
||||
lenmatch = lengthre.findall(log)
|
||||
depmatch = depthre.findall(log)
|
||||
if len(lenmatch) == 1 and len(depmatch) == 1:
|
||||
return {"length": lenmatch[0], "depth": depmatch[0]}
|
||||
return {"length": 0, "depth": 0}
|
||||
|
||||
|
||||
syscoord = re.compile(r".*output coordinate system: \s*(\S+)")
|
||||
|
||||
#################################################################################################
|
||||
def get_syscoord_from_log(log):
|
||||
lenmatch = syscoord.findall(log)
|
||||
|
||||
if len(lenmatch) == 1:
|
||||
return {"syscoord": lenmatch[0]}
|
||||
return {"syscoord": 0}
|
||||
@@ -0,0 +1,77 @@
|
||||
****************************************************************************
|
||||
Export db Therion <--> db KARSTEAU
|
||||
***************************************************************************
|
||||
|
||||
Créer manuellement dans chaque dossier d'une cavité à exporter un fichier export_bd.ini
|
||||
- vide au début
|
||||
- après exécution du script contient l'ID Therion de la cavité à exporter
|
||||
|
||||
Résultats dans le dossier /Outputs/Export_bd de la db Therion :
|
||||
- Export_bd.log : log de l'export
|
||||
- Export_bd.bd : base de données de transfert
|
||||
- Export_bd.xlxs : fichier excel pour l'export vers Karsteau
|
||||
- Export_bd.zip : archive brute des données Therion
|
||||
|
||||
|
||||
==============================
|
||||
Table des données exportées :
|
||||
==============================
|
||||
|
||||
Cavité (la liste est générée automatiquement en recherchant dans les dossiers les fichiers export_bd.ini copiés manuellement)
|
||||
-----------------------------------------------------------------------------------------------------------
|
||||
CAVITE_ID : Clé interne de la cavité (unique, entier, génération par le script)
|
||||
CAVITE_NAME : Nom de la cavité (via la valeur -title de la survey du fichiet _tot.th du dossier contenant la cavité)
|
||||
CAVITE_SYNO_1 : Synonyme 1 de la cavité !!! Pas dispo dans Therion
|
||||
CAVITE_SYNO_2 : Synonyme 2 de la cavité !!! Pas dispo dans Therion
|
||||
CAVITE_SYNO_3 : Synonyme 3 de la cavité !!! Pas dispo dans Therion
|
||||
CAVITE_DEV : Développement de la cavité (via le fichier .log de la cavité)
|
||||
CAVITE_DENIV_PLUS : Dénivelé positif de la cavité, à voir définition Karsteau si plusieurs entrées ?
|
||||
CAVITE_DENIV_MOINS : Dénivelé négatif de la cavité (via le fichier .log de la cavité)
|
||||
CAVITE_PATH : Interne au script pour identifier la cavité, chemin dans la base vers le dossier contenant la cavité
|
||||
CAVITE_KEY_KARSTEAU : Retour Karsteau, clé unique d'identification de la cavité
|
||||
CAVITE_DATE_UPDATE : Date de mise à jour de la cavité (date d'execution du script)
|
||||
|
||||
Entrées (la liste des entrées est générée après l'execution du thconfig de la cavité via le fichier sql généré)
|
||||
---------------------------------------------------------------------------------------------------------------
|
||||
ENT_ID : Clé interne de l'entrée (unique, entier, génération par le script)
|
||||
ENT_ID_CAVITE : Clé interne de la cavité associée (génération par le script)
|
||||
ENT_NUM : Numéro de l'entrée (exemple CD11 pour le Réseau du Mirolda... ) !!! Pas dispo dans Therion
|
||||
ENT_NAME : Nom de l'entrée (via le fichier .sql de la cavité, valeur de -title de la survey contenant l'entrée)
|
||||
ENT_SYNO_1 : Synonyme 1 de l'entrée !!! Pas dispo dans Therion
|
||||
ENT_SYNO_2 : Synonyme 2 de l'entrée !!! Pas dispo dans Therion
|
||||
ENT_SYNO_3 : Synonyme 3 de l'entrée !!! Pas dispo dans Therion
|
||||
ENT_MARQ_1 : Marquage 1 de l'entrée !!! Pas dispo dans Therion
|
||||
ENT_MARQ_2 : Marquage 2 de l'entrée !!! Pas dispo dans Therion
|
||||
ENT_MARQ_3 : Marquage 3 de l'entrée !!! Pas dispo dans Therion
|
||||
ENT_COORD_X : Coordonnée X de l'entrée (via le fichier .sql de la cavité)
|
||||
ENT_COORD_Y : Coordonnée Y de l'entrée (via le fichier .sql de la cavité)
|
||||
ENT_COORD_Z : Coordonnée Z de l'entrée (via le fichier .sql de la cavité)
|
||||
ENT_UNIT_COORD : Unité des coordonnées (m/km), toujours 'm'
|
||||
ENT_SYS_COORD : Système de coordonnée, (exemple UTM31, via le fichier .log de la cavité)
|
||||
ENT_ZONE_COORD : Zone de Coordonnée !!! A voir comment remplir
|
||||
ENT_METHODE_COORD : Méthode d'obtention de la coordonnée !!! Pas dispo dans Therion
|
||||
ENT_SOURCE_COORD : Source de la coordonnée (toujours 'Topo Therion) !!! Pas dispo dans Therion
|
||||
ENT_DATE_COORD : Date de la coordonnée !!! A voir comment remplir !!! Pas dispo dans Therion
|
||||
ENT_ACCES_LIBRE : Accès à la donnée dans Karsteau, par défaut 'N' (accès aves mdp)
|
||||
ENT_PATH : Interne au script pour identifier l'entrée, chemin vers la station de l'entrée (exemple : 00@Cap_Coutun)
|
||||
ENT_KEY_KARSTEAU : Retour Karsteau, clé unique d'identification de l'entrée
|
||||
ENT_DATE_UPDATE : Date de mise à jour de l'entrée (date d'execution du script)
|
||||
|
||||
|
||||
Documents (Dans le dossier Outputs de la cavité, type pdf, kml et zip des données Therion)
|
||||
-----------------------------------------------------------------------------------------------------------
|
||||
DOCUMENT_x_ID : Clé interne du document (unique, entier, génération par le script)
|
||||
DOCUMENT_x_AUTEUR : Auteur du document (via exif du pdf, à voir pour les autres types)
|
||||
DOCUMENT_x_CAT : Catégorie du document suivant nomenclature Karsteau
|
||||
DOCUMENT_x_DATE : Date du document (via exif du pdf, à voir pour les autres types)
|
||||
DOCUMENT_x_DATE_UPDATE : Date de mise à jour du document (date d'execution du script)
|
||||
DOCUMENT_x_DESCRIPTION : Description du document (via exif du pdf, à voir pour les autres types)
|
||||
DOCUMENT_x_FILE : Chemin dans les dossiers pour identifier le document
|
||||
DOCUMENT_x_LIE : Cavité ou Entrée, ensemble des documents sont liés au cavités
|
||||
DOCUMENT_x_NATURE : Nature du document : pdf, kml, zip...
|
||||
DOCUMENT_x_TEXT : Text du document !!! Pas dispo dans Therion
|
||||
DOCUMENT_x_TITRE : Titre du document (via exif du pdf, à voir pour les autres types)
|
||||
DOCUMENT_x_KEY_KARSTEAU : Retour Karsteau, clé unique d'identification du document
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
|
||||
therion [-q] [-L] [-l log-file]
|
||||
[-s source-file] [-p search-path]
|
||||
[-b|--bezier]
|
||||
[-d] [-x] [cfg-file]
|
||||
|
||||
therion [-h|--help]
|
||||
[-v|--version]
|
||||
[--print-encodings]
|
||||
[--print-environment]
|
||||
[--print-init-file]
|
||||
[--print-library-src]
|
||||
[--print-symbols]
|
||||
[--print-tex-encodings]
|
||||
[--print-xtherion-src]
|
||||
[--reproducible-output]
|
||||
[--generate-output-crc]
|
||||
[--verify-output-crc]
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"cSpell.words": [
|
||||
"ACCES",
|
||||
"alexa",
|
||||
"arcname",
|
||||
"CCFF",
|
||||
"configfile",
|
||||
"cumcount",
|
||||
"DENIV",
|
||||
"dispo",
|
||||
"ENDC",
|
||||
"exif",
|
||||
"FFCC",
|
||||
"FFEA",
|
||||
"Karsteau",
|
||||
"lastrowid",
|
||||
"lenmatch",
|
||||
"MARQ",
|
||||
"METHODE",
|
||||
"nbre",
|
||||
"necessaire",
|
||||
"resultat",
|
||||
"subfolders",
|
||||
"SYNO",
|
||||
"syscoord",
|
||||
"thconfig",
|
||||
"therion",
|
||||
"trox",
|
||||
"zipf"
|
||||
]
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user