Langages de définition de contraintes spécifiques

Lorsqu’un contrôle spécialisé est nécessaire, des scripts peuvent permettent de définir des contraintes complexes sur des jeux de données, des types d’entité ou des attributs. Par exemple, un contrôle de relations entre attributs ou un contrôle de présence d’attributs en cascade peuvent être assurés par de tels scripts.

Deux langages sont exploitables dans Qualigéo :

  • Python

  • fme_evaluate

Code Python

Un script Python est exécuté dans FME via le Transformer PythonCaller. La documentation de référence est donc celle du transformer PythonCaller et de la fonction @Python(). Pour consulter l’intégralité de la documentation de l’API, naviguez jusqu’au dossier d’installation de FME et allez à l’emplacement fmeobjects\python\apidoc\index.html.

L’accès aux attributs, géométries et systèmes de coordonnées se fait via des objets Python.

Les contraintes spécifiques sur les entités écrites en langage Python doivent être définies sous forme de fonctions.

Spécifications générales

Les fonctions Python utilisées pour spécifier des contraintes doivent implémenter deux paramètres "feature" et "params" et retourner deux variables "_error" et "_message".

Paramètres

nom type description
feature FMEFeature Classe Python décrite dans la librairie fmeobjects. $(FME_HOME)/fmeobjects/python/apidoc
params array

Facultatif. Tableau des paramètres passés par l’utilisateur.

Ce tableau peut être vide.

Résultat

nom type description
_error int [0|1] La fonction doit retourner 1 si l’entité est en erreur ou 0 dans le cas inverse.
_message string xx

Si _error=1 la variable _message doit contenir le message d’erreur qui sera associé à l’erreur dans la table "erreur" de la base de contrôle de Qualigéo.

Peut être vide.

Ecriture du code

    Le début de chaque script doit commencer par 8 lignes d’appel des librairies suivantes :

    # IMPORT LIBRAIRIES

    import fmeobjects

    import subprocess

    import time

    import sys

    import os

    import tempfile

    import re

Un encodage peut être spécifié en tout début de script :

    #coding : latin-1</span>

Il est fortement conseillé d’utiliser l’utf-8 pour pouvoir gérer les accents.

L’appel de la librairie fmeobject permet l’utilisation de la classe Python de FME donnant accès aux fonctions FME, décrites dans l’API. La fonction est ensuite nommée et décrite.

Exemple de script python

    # IMPORT LIBRAIRIES

    import fmeobjects

    import subprocess

    import time

    import sys

    import os

    import tempfile

    import re

    # CONDITION SIREN

    def verif_SIREN(feature):

    # variable SIREN correspondant a l’attribut SIREN de la table DOC_URBA

    SIREN = feature.getAttribute("SIREN")

    # variable INTERCO correspondant a l’attribut INTERCO de la table DOC_URBA

    INTERCO = feature.getAttribute("INTERCO")

    # condition non autorisee

    if (SIREN == "" and INTERCO ==’T’):

    # message d erreur si cette condition a lieue

    _error = 1

    _message = "Valeur SIREN obligatoire si l’autorité publique est une intercommunalité"

    return _error, _message

    else :

    # pas d erreur si la condition non autorisée n’a pas lieue

    _error = 0

    _message = ’’

    return _error, _message
    __

Après l’appel des bibliothèques, un nom est donnée à la fonction : "verifSIREN".

2 variables sont ensuite créées, relatives à la table DOC_URBA :

  • SIREN qui récupère l’attribut SIREN

  • INTERCO qui récupère l’attribut INTERCO

Si le code SIREN est égal à Null et si l’attribut INTERCO est égale à T, alors le message "1, Valeur SIREN obligatoire si l’autorité publique est une intercommunalité" est retourné, sinon aucun message n’est retourné.

Log

Il est possible d’écrire des informations dans le fichier de log des contrôles de Qualigéo en instanciant un objet de la classe FMELogfile de la librairie fmeobjects.

nom type description
fmeobjects. FMELogFile() FMELogFile Retourne un objet de la classe FMELogfile. Cet objet peut être utilisé pour insérer des messages dans le fichier de log du contrôle Qualigéo.
fmeobjects. FMELogfile().log(’string’)   Ecrit la chaîne string dans le fichier de log du contrôle Qualigéo.

Appel des fonctions FME

La librairie fmeobjects donne également accès aux fonctions FME de bas niveau, décrite dans le document "FME functions and factories".

Attention à respecter la casse du nom de fonction._

Les apostrophes doivent être précédées d’un \ lors de la création d’une chaîne de caractères, aussi bien dans le code python que dans la définition de la contrainte dans Qualigéo Designer._

Erreurs d’exécution/deboggage

La gestion de l’exécution du code python est robuste mais il demeure impossible de récupérer toutes les erreurs.

Erreur grave

Si le script python contient une erreur grave non récupérable, le contrôle s’arrête et son statut passe en "Erreur".

Il faut alors consulter le fichier de log /Log/control.log pour identifier l’origine du problème.

Erreur récupérable

Si l’erreur est récupérable, le script continue mais une erreur Qualigéo de type E0046 " Erreur de codage de la contrainte python sur l’entité " est inscrite dans la base des erreurs. La cause de l’erreur est décrite dans le champ message, par exemple " global name ’INSEE_DEPT’ is not defined "

==> Erreurs retournées : E0046

Lorsque le traitement arrive à son terme, le log correspondant est disponible dans la fenêtre Analyse.

Deboggage

Nous conseillons d’utiliser l’objet Logger pour inscrire des informations dans le fichier de log. Attention, ces messages sont rapidement très volumineux et il est conseillé de les passer en commentaire en phase de production.

Pour diminuer les temps de test, il peut être intéressant de créer un schéma spécifique ne servant qu’à la validation du code python. De même, il est souvent utile de travailler sur un jeu de données réduit.

Attention, à l’indentation. Python demande un respect très strict de l’indentation, un espace en trop peut générer une erreur. Nous conseillons donc d’utiliser un un éditeur Python ou un éditeur de texte avec coloration syntaxique (Notepad++, Textpad).

Il est également possible de travailler directement dans FME en utilisant le Transformer PythonCaller. C’est sans doute la solution la plus performante en phase de test car elle permet de contrôler très rapidement le code, les messages retournés tout en fournissant un éditeur de texte convivial.


fme_evaluate

Les contraintes spécifiques sur les entités écrites avec le langage fme evaluate retournent des valeurs arithmétiques ou booléennes.

Pour définir des fonctions fme, il est possible de faire appel à d’autres fonctions FME ou des fonctions arithmétiques.

Ces fonctions possèdent la même structure que la fonction FME @Evaluate.

Ecriture du code

Le code doit être entouré de parenthèses.

Les fonctions disponibles sont décrites dans le document « FME functions and factories ». Les différents opérateurs utilisables sont également décrits dans ce document dans la rubrique « @Evaluate ».

Exemple

((@Area()-(@Area()*0.1))<=@Value(SUPF)) && (@Value(SUPF)<=(@Area()+(@Area()*0.1)))

Erreur grave

Si la fonction fme contient une erreur grave non récupérable, le contrôle s’arrête et son statut passe en "Erreur".

Il faut alors consulter le fichier de log /Log/control.log pour identifier l’origine du problème.

Lorsque le traitement arrive à son terme, le log correspondant est disponible dans la fenêtre Analyse.

Il est également possible de travailler directement dans FME en utilisant le transformer FMEFunctionCaller. Il faut ensuite faire appel à la fonction @Evaluate dans laquelle on saisit le code à tester. C’est sans doute la solution la plus performante car elle permet des tests très rapides et offre un bon éditeur de texte.