# 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 ![](../Ressources/Images/attention.png) Un encodage peut être spécifié en tout début de script : #coding : latin-1 ![](../Ressources/Images/attention.png)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". ![](../Ressources/Images/attention.png) Attention à respecter la casse du nom de fonction._ ![](../Ressources/Images/attention.png) 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. ![](../Ressources/Images/show_analyse_982x248.png) #### 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. ![](../Ressources/Images/attention.png)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). ![](../Ressources/Images/attention.png) 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. ![](../Ressources/Images/log_fme_evaluate.png) 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.