Le langage Ocelet possède une grammaire et des mots clés qui permettent de décrire les éléments d'un modèle et les enchaînements d'opérations lors d'une simulation. Pour enrichir le langage un certain nombre de fonctions prédéfinies sont disponibles, il ne s'agit pas à proprement parler de mot clés du langage, ce sont des fonctions qui permettent d'effectuer des opérations qu'il serait fastidieux de programmer soi-même en Ocelet. La liste des fonctions disponibles pourra s'enrichir indépendamment du langage lui même.
Parmi ces fonctions usuelles on trouvera des fonctions mathématiques (sin(), cos(), etc.), des fonctions pour écrire des messages textuels à l'écran ou dans un fichier, ou encore des fonctions pour faciliter la gestion de séries de couleurs.
Ocelet étant traduit en langage Java, certaines de ces fonctions usuelles font directement appel aux bibliothèques de fonction de Java (c'est le cas par exemple des fonctions mathématiques). D'autres groupes de fonctions ont été spécifiquement développés pour Ocelet (comme les fonctions de gestion de couleurs par exemple).
Lors de l'écriture d'un modèle on peut faire appel à ces fonctions usuelles directement, dans un scénario, une fonction d'interaction, ou un service d'entité.
Fonction permettant de préciser le format d'affichage de valeurs numériques. C'est par exemple à l'aide de cette fonction que l'on peut choisir le nombre de décimales à afficher après la virgule.
Syntaxe :
String format(Number n, String motif)
Le type Number utilisé dans cette syntaxe représente l'un des types numériques (Integer, Double, Float, etc).
Le motif est une série de symboles qui permet de spécifier le format d'affichage. Les symboles utilisés dans ce motif sont les suivants :
Exemples :
let n=PI
println("PI ="+n)
println("PI ="+format(n,"#.##"))
println("PI ="+format(n,"00.###"))
println("PI ="+format(n,"00.###E0"))
let m=1.0/4.0
println("m vaut "+format(m,"#.###%"))
affichera :
PI =3.141592653589793
PI =3.14
PI =03.142
PI =31.416E-01
m vaut 25%
Syntaxe de localisation :
String format(Number n, String motif, String pays)
Cette seconde forme de la fonction format(...) permet de spécifier que l'on désire respecter les conventions d'affichage d'une langue particulière. La langue est indiquée à l'aide de deux lettres, il s'agit du code ISO 630-1. Par défaut ce sont les conventions anglophones qui sont appliquées.
Exemple :
let prix=1250000
println("Prix :"+format(prix,"###,###,###.00 €","fr"))
println("Price :"+format(prix,"$ ###,###,###.00","en"))
affichera :
Prix :1 250 000,00 €
Price :$ 1,250,000.00
Affiche un texte à l'écran (dans la partie Console de l'OMP) et reste sur la même ligne
Syntaxe :
String print(String text)
Exemple :
print("Simulation en cours ... ")
print("terminé.")
va afficher le texte :
Simulation en cours ... terminé.
Affiche un texte à l'écran (dans la partie Console de l'OMP) puis passe à la ligne suivante
Syntaxe :
String println(String text)
Exemple :
println("Simulation en cours ... ")
println("terminé.")
va afficher le texte :
Simulation en cours ...
terminé.
Pour afficher le contenu d'une variable on peut utiliser l'opérateur +
de concaténation de texte :
let temp = 20
println("La température est de "+temp+"°C")
Qui affichera : La température est de 20°C
Enregistre une ligne de texte dans un fichier. Chaque appel à cette fonction ajoute une ligne à la fin du fichier indiqué. Si le fichier n'existe pas il est créé.
Syntaxe :
printToFile(String nomDeFichier, String ligneDeTexte)
Avec Ocelet, la création de fichiers est principalement effectuée à travers l'usage de datafacers. Certains datafacers proposent aussi des fonctions pour supprimer des fichiers. Les fonctions décrites dans cette sections sont donc un complément : ce sont des fonctions de base permettant la création et la suppression de dossiers ainsi que la suppression de fichiers, indépendamment des datafacers.
Fonction permettant d'ajouter un nouveau dossier à l'endroit indiqué. Si le chemin fourni contient plusieurs sous-dossiers qui n'existent pas encore, ils seront tous créés. Selon la configuration du système utilisé, il est possible que la suppression soit refusée si vous ne disposez pas des droits nécessaires.
Syntaxe :
Boolean createDir(String chemin_et_nom)
Crée un dossier au chemin et avec le nom spécifié. Cette fonction retourne true
(vrai) si le dossier a bien été créé, et false
(faux) sinon.
Exemple :
createDir("output/indicateurs")
printToFile("output/indicateurs/resultats.txt","Temperature"+temp)
Ces deux instructions vont ajouter le dossier indicateurs au dossier output du projet, puis créer un fichier resultats.txt dans ce dossier.
Supprime un dossier, et tout son contenu.
Attention cette fonction ne demande pas de confirmation avant d'effectuer la supression et il est impossible de revenir en arrière, il faut donc être prudent avec le chemin qu'on lui indique. Selon la configuration du système utilisé, il est possible que la suppression soit refusée si vous ne disposez pas des droits nécessaires.
Syntaxe :
removeDir(String chemin_et_nom)
Exemple :
removeDir("output/indicateurs")
Cette instruction supprime le dossier indicateurs qui se trouve dans le dossier output. Le contenu du dossier indicateurs a été supprimé aussi.
Supprime le fichier indiqué.
Attention cette fonction ne demande pas de confirmation avant d'effectuer la suppression et il est impossible de revenir en arrière, il faut donc être prudent avec le fichier qu'on lui indique. Selon la configuration du système utilisé, il est possible que la suppression soit refusée si vous ne disposez pas des droits nécessaires.
Syntaxe :
removeFile(String chemin_et_nom)
Exemple
removeFile("output/indicateurs/resultats.txt")
Cette instruction supprime de fichier resultats.txt qui se trouve dans le dossier output/indicateurs.
La fonction fileExists(String nom_de_fichier)
permet de savoir si un nom de fichier correspond à un fichier qui existe déjà ou non. Cette fonction renvoie true
si le nom fourni correspond à un fichier existant, mais aussi si c'est un nom de dossier existant.
On peut aussi utiliser isDir(String nom_de_fichier)
ou isFile(String nom_de_fichier)
pour savoir si le nom fourni correspond à un dossier ou à un fichier.
La grande majorité des fonctions mathématiques disponibles proviennent du langage Java (du package java.lang.Math pour être précis).
On peut les utiliser directement dans les instructions d'un scenario, d'un service d'entité ou d'une fonction d'interaction.
Exemple :
let rayon = 12.5
let angle = 170 // degres
let distance_x = rayon * cos(toRadians(angle))
let distance_y = rayon * sin(toRadians(angle))
A chaque fois qu'une fonction peut s'appliquer indifféremment avec les types numériques Double, Float, Integer, et Long, nous avons remplacé l'indication du type par Number.
Number abs(Number a)
: Retourne la valeur absolue de la valeur fournie. La valeur retournée est de même type que celle qui a été passée en argument.Double acos(Double a)
: Retourne un angle compris entre 0.0 et PI qui correspond à l'arc cosinus du nombre fourni.Double asin(Double a)
: Retourne un angle compris entre -PI/2 et PI/2 qui correspond à l'arc sinus du nombre fourni.Double atan(Double a)
: Retourne un angle compris entre -PI/2 et PI/2 qui correspond à l'arc tangente du nombre fourni.Double atan2(Double y, Double x)
: Retourne l'angle theta résultant de la conversion des coordonnées rectangulaires (x,y) en coordonnées polaires (r,theta)
Double cbrt(Double a)
: Retourne la racine cubique du nombre fourni.Double ceil(Double a)
: Retourne la valeur la plus proche d'un entier supérieur ou égal à l'argument.Double copySign(Double magnitude, Double sign)
: Retourne la première valeur avec le signe de la seconde.Double cos(Double a)
: Retourne le cosinus de l'angle (en radians) fourni.Double cosh(Double x)
: Retourne le cosinus hyperbolique de l'angle (en radians) fourni.Double exp(Double a)
: Retourne l'exponentielle de la valeur a fournie, c'est à dire E élevé à la puissance de a.Double floor(Double a)
: Retourne la valeur la plus proche d'un entier inférieur ou égal à l'argument.Double hypot(Double x, Double y)
: Retourne l'hypothénuse d'un triangle rectangle de côtés x et y. C'est à dire sqrt(x²+y²)Double log(Double a)
: Retourne le logarithme népérien de la valeur fournie.Double log10(Double a)
: Retourne le logarithme décimal de la valeur fournie.Number max(Number a, Number b)
: Retourne la plus grande des deux valeurs fournies.Number min(Number a, Number b)
: Retourne la plus petite des deux valeurs fournies.Double pow(Double a, Double b)
: Retourne valeur du premier nombre élevé à la puissance du second.Double random()
: Retourne un nombre aléatoire compris dans l'intervalle [0.0 .. 1.0[ .Long round(Double a)
: Retourne l'arrondi de la valeur fournie à l'entier long supérieur le plus proche.Integer round(Float a)
: Retourne l'arrondi de la valeur fournie à l'entier supérieur le plus proche.Double signum(Double d)
: Retourne -1.0 si la valeur fournie et négative, 0 si elle est nulle et 1.0 si elle est positive.Float signum(Float f)
: Retourne -1.0 si la valeur fournie et négative, 0 si elle est nulle et 1.0 si elle est positive.Double sin(Double a)
: Retourne le sinus de l'angle (en radians) fourni.Double sinh(Double x)
: Retourne le sinus hyperbolique de l'angle (en radians) fourni.Double sqrt(Double a)
: Retourne la racine carré de la valeur fournie.Double tan(Double a)
: Retourne la tangente de l'angle (en radians) fourni.Double tanh(Double x)
: Retourne la tangente hyperbolique de l'angle (en radians) fourni.Double toDegrees(Double angrad)
: Retourne la valeur de l'angle (en radians) fourni convertie en degrés.Double toRadians(Double angdeg)
: Retourne la valeur de l'angle (en degrés) fourni convertie en radians.En plus des fonctions, on peut utiliser directement les constantes (prédéfinies) suivantes dans les calculs :
E
: Double qui représente la valeur de base des logarithmes népériens, sa valeur approchée est : 2.718281828459045
PI
: Double qui représente la valeur du nombre π, sa valeur approchée est : 3.141592653589793Ces fonctions permettent d'obtenir rapidement une liste de couleurs.
Liste de couleurs à partir d'un dégradé
Principe : il s'agit d'obtenir une liste de couleurs, en spécifiant le nombre de couleurs voulu et un dégradé de couleurs.
Trois syntaxes sont disponibles, elles diffèrent dans la façon de spécifier le dégradé de couleurs.
Syntaxe 1 :
List<Color> colorRange(Integer nombre_de_couleurs , String col1, String col2)
Le gradient de couleur est spécifié par les deux couleurs à partir desquelles il est interpolé. Pour la définition de couleurs les formes acceptées sont les suivantes :
"rgb(rouge,vert,bleu)"
où rouge, vert et bleu représentent les composantes de la couleur exprimées avec des nombres entiers compris entre 0 et 255."rgba(rouge,vert,bleu,opacité)"
où rouge, vert, bleu et opacité représentent les composantes de la couleur exprimées avec des nombres entiers compris entre 0 et 255."#RRVVBB"
où RR, VV et BB sont les composantes rouge, vert et bleu exprimées en hexadécimal."#RRVVBBAA"
où RR, VV, BB et AA sont les composantes rouge, verte, bleu et d'opacité exprimées en hexadécimal.Exemples : les définitions suivantes sont équivalentes, elles produisent une liste de 5 couleurs représentant un dégradé entre un rouge et un jaune et placent le résultat dans une variable. Les variables lc1 et lc2 vont contenir le même résultat.
let lc1 = colorRange(5,"rgb(250,20,20)","rgba(250,250,20,255)")
let lc2 = colorRange(5,"#FA1414","#FAFA14FF")
Syntaxe 2 :
List<Color> colorRange(Integer nombre_de_couleurs , String nom)
Un fichier nommé gradients.ocg (dans le dossier config de votre projet) contient une série de définitions de dégradés de couleurs. Chacun de ces dégradés possède un nom. Cette fonction permet d'utiliser ces dégradés directement à partir de leur nom. Le dégradé est lu de gauche à droite, c'est à dire tel qu'il est défini dans le fichier.
Exemple :
let lc3 = colorRange(5,"dem")
Syntaxe 3 :
List<Color> colorRange(Integer nombre_de_couleurs , String nom, Boolean backward)
Cette syntaxe est identique à la Syntaxe 2 mais on peut spécifier si l'on souhaite lire le gradient de couleur de gauche à droite (tel qu'il est défini dans le fichier) ou de droite à gauche.
Exemples :
let lc4 = colorRange(5,"dem",false) // lit le dégradé de gauche à droite
let lc5 = colorRange(5,"dem",true) // lit le dégradé de droite à gauche