Nadine Couture 2000 – 2002 · Fabrice Depaulis 2003 – 2004 · Guillaume Rivière 2005 – 2017

Le logo de la CCI Bayonne Pays Basque

Informatisation du Système d'Information

TP3 : Intégration d'application

BUTS PÉDAGOGIQUES

  • Utilisation de l'interpréteur PHP en ligne de commande
  • Sensibilisation à la communication inter-application
  • Analyse et génération de fichier de ressource par un script PHP

Un besoin récurrent en entreprise est de pouvoir récupérer les données issues d'un premier logiciel afin de les insérer dans un deuxième. Or, très souvent, ces logiciels n'ont pas été prévus pour échanger leurs données entre eux. Dans ce cas, une stratégie est d'écrire un petit programme qui servira de connecteur entre les deux logiciels (petit programme que dans la suite nous appellerons « moulinette ») dont le rôle sera de lire les données au format sortant du premier logiciel et de les traduire dans un format compréhensible par le second logiciel.

Principe · Animation 1 · Animation 2
Figure 0.1-a : Principe des EAI.

Dans le monde des Systèmes d'Information, vous pourrez aussi rencontrer la dénomination ETL, pour Extract-Transform-Load. C'est aussi un type d'EAI, mais le terme ETL est en général réservé lorsque les deux logiciels utilisent chacun une base de données. Le but n'est plus alors de lire et écrire dans des fichiers, mais d'extraire les données depuis la base de données du premier logiciel afin de les charger dans la base de données du second logiciel.

Figure 0.2 : Principe des ETL.

D'une manière plus générale, la pratique consistant à créer, de cette manière, un pont entre deux logiciels, porte le nom d'EAI pour Enterprise Application Integration (ou en français Intégration d'Application d'Entreprise). Ce TP propose de voir comment utiliser le langage PHP pour faire communiquer deux applications hétérogènes entre elle, en écrivant un script PHP qui lit un fichier provenant de Pro-Engineer et qui écrit un fichier à destination de MuPad (une « moulinette » donc).

Exercice 1 • Utilisation des scripts PHP en ligne de commande (30 min)

Un programme qui calcule la longueur des lignes d'un fichier.

Soit le programme suivant, inspiré de l'exemple du cours :

Code 1.1 : Un script PHP de lecture d'un fichier texte.
Question 1.1 : Commençons par tester ce programme
  1. Créez un nouveau répertoire D:\TP_PHP\
  2. Copiez ce programme dans un fichier que vous nommerez D:\TP_PHP\compter.php
  3. Ouvrez une console et tapez les commandes suivantes pour vous déplacer dans le répertoire D:\TP_PHP\
    • D:
    • cd TP_PHP
  4. Avec la commande dir vérifiez la présence du fichier compter.php
    • dir
  5. Exécutez le programme compter.php en invoquant l'interpréteur PHP (au besoin adaptez le numéro de version de PHP selon la version installée sur votre ordinateur) :
    • C:\wamp\bin\php\php5.5.12\php.exe compter.php
    Que se passe-t-il ? Pourquoi ?

    Pour éviter d'avoir à écrire entier C:\wamp\bin\php\php5.5.12\php.exe à chaque invocation de l'interpréteur PHP, il suffit de taper la ligne suivante dans votre console :
    set PATH=%PATH%;C:\wamp\bin\php\php5.5.12\
    Désormais, l'interpréteur peut-être invoqué dans votre console en écrivant simplement php.exe
    (Au besoin adaptez le numéro de version de PHP selon la version installée sur votre ordinateur)

  6. Téléchargez maintenant le fichier Le_Chant_Des_Partisans.txt et copiez-le dans le répertoire D:\TP_PHP\
  7. Avec la commande dir vérifiez la présence des 2 fichiers compter.php et Le_Chant_Des_Partisans.txt
  8. Exécutez de nouveau le programme compter.php
    Qu'affiche-t-il ?
Question 1.2 : Modifions le programme
  1. Ouvrez le fichier compter.php avec Notepad++ (clic droit sur le fichier, puis "Edit with Notepad++").
  2. À l'aide d'une nouvelle variable $i, modifiez le programme afin d'afficher aussi le numéro de chaque ligne avant d'afficher sa longueur.
  3. Plutôt que de toujours compter les lignes du même fichier, modifions le programme afin que le nom du fichier à lire soit le premier argument donné lors de l'appel du programme :
    1. Modifiez l'appel de la fonction fopen() pour que le nom du fichier ouvert soit $argv[1] plutôt que Le_Chant_Des_Partisans.txt
    2. Testez le programme : C:\wamp\bin\php\php5.5.12\php.exe compter.php Le_Chant_Des_Partisans.txt
    3. Téléchargez le fichier Chanson_dAutomne.txt et copiez-le dans le répertoire D:\TP_PHP\
    4. Testez maintenant le programme avec ce fichier : C:\wamp\bin\php\php5.5.12\php.exe compter.php Chanson_dAutomne.txt
Question 1.3 : Appeler un script en mode batch (Optionnel)

Plutôt que d'ouvrir une console, utilisons un fichier batch pour appeler notre script :

Exercice 2 • Une moulinette entre Pro-Engineer et MuPad (1 h 30)

Idée originale : N. Couture

Pro-Engineer et MuPad sont deux logiciels qui ne sont pas prévus pour communiquer ensemble. Aucune connexion ne peut être établie entre ceux deux logiciels. Aucun de ces deux logiciels n'est capable de lire les formats de fichier de l'autre.

Seulement, les ingénieurs de votre bureau d'étude dessinent des pièces avec Pro-Engineer et font régulièrement (plusieurs fois par jour) des calculs complexes sur ces pièces avec MuPad.

Afin de gagner beaucoup de temps (et d'éviter les erreurs de saisies), une moulinette permettant de traduire les fichiers Pro-Engineer en fichiers compatibles MuPad doit être mise en place. Vous allez écrire un script PHP qui permettra de faire ce travail.

Le cas d'étude choisi, pour illustrer la nécessité de savoir intégrer des applications, coexistantes dans l'entreprise est le suivant :

Le logiciel Pro-Engineer permet de représenter une pièce mécanique dans l'espace. Supposons que nous voulions optimiser le stockage de pièces creuses. Deux calculs sont nécessaires ! Tout d'abord si nous voulons les empiler, il faut connaître l'encombrement de n pièces empilées. Ensuite, il faut calculer n tel qu'il n'y ait pas de déformation dommageable des pièces. Il est alors utile d'utiliser un logiciel de calcul. Par exemple : MuPad.

Dans cet exercice, nous allons étudier un cas simple en 2D. Il s'agira de lire un cercle dessiné avec Pro-Engineer et de récupérer ses données pour effectuer des calculs dessus (périmètre, diamètre, aire). Important : le fonctionnement serait le même si nous avions affaire à des pièces complexes, modélisées en 3D.

Question 2.1 : Analyser un fichier IGES (provenant de Pro-Engineer)

Nous avons dessiné un cercle avec une mise en plan 2D dans Pro-Engineer, puis enregistré le résultat dans un fichier au format standard IGES (Initial Graphics Exchange Specification) : drw0001.igs

Pour mieux comprendre le fichier obtenu, les lettres de l'avant-dernière colonne de chaque ligne désignent respectivement :
S : start
G : global
T : terminal
D : directory
P : parameter data (Geometry and Math)

Ce qui nous intéresse pour MuPad, ce sont les paramètres. Dans les différentes lignes du fichier repérées par la lettre P, nous distinguons celles commençant par :
404/406/410 : Ce sont les données décrivant les lignes du plan
110 : Ce sont des données concernant les lignes du cadre de l'espace de travail
100 : C'est un 7-uplet décrivant un cercle : (plan z, x_centre, y_centre, x_depart, y_depart, x_arrivee, y_arrivee)

Remarque : les coordonnées des points de départ et d'arrivée du cercle sont identiques car il s'agit d'un arc de cercle de 360°.

drw0001.igs
 PTC IGES file: drw0001.igs                                             S      1
1H,,1H;,7HDRW0001,11Hdrw0001.igs,                                       G      1
49HPro/ENGINEER by Parametric Technology Corporation,7H2003170,32,38,7, G      2
38,15,7HDRW0001,1.,1,4HINCH,32768,0.5,13H040213.153401, 0.0022,         G      3
     22.,8Hfdepauli,7HUnknown,10,0,13H040213.153401;                    G      4
     110       1       0       1       0       0       0       000000000D      1
     110       0       8       1       0                               0D      2
     110       2       0       1       0       0       0       000000000D      3
     110       0       8       1       0                               0D      4
     106       3       0       1       0       0       0       000000000D      5
     106       0       8       2      11                               0D      6
     106       5       0       1       0       0       0       000000000D      7
     106       0       8       3      11                               0D      8
     106       8       0       1       0       0       0       000000000D      9
     106       0       8       3      11                               0D     10
     106      11       0       1       0       0       0       000000000D     11
     106       0       8       3      11                               0D     12
     106      14       0       1       0       0       0       000000000D     13
     106       0       8       3      11                               0D     14
     110      17       0       1       0       0       0       000000000D     15
     110       0       8       1       0                               0D     16
     110      18       0       1       0       0       0       000000000D     17
     110       0       8       1       0                               0D     18
     100      19       0       1       0       0       0       000000000D     19
     100       0       8       2       0                               0D     20
     410      21       0       0       1       0       0       000020100D     21
     410       0       0       1       0                               0D     22
     406      22       0       0       1       0       0       000010300D     23
     406       0       0       1      15                               0D     24
     406      23       0       0       1       0       0       000010300D     25
     406       0       0       1      16                               0D     26
     406      24       0       0       1       0       0       000010300D     27
     406       0       0       1      17                               0D     28
     404      25       0       0       1       0       0       000000100D     29
     404       0       0       1       0                               0D     30
110,0D0,0D0,0D0,0D0,1.7D1,0D0;                                         1P      1
110,0D0,0D0,0D0,2.2D1,0D0,0D0;                                         3P      2
106,1,5,0D0,8.224213D0,8.8926D0,8.114213D0,8.8926D0,8.114213D0,        5P      3
9.0026D0,8.224213D0,9.0026D0,8.224213D0,8.8926D0;                      5P      4
106,1,5,0D0,1.1266625D1,1.1935012D1,1.1156625D1,1.1935012D1,           7P      5
1.1156625D1,1.2045012D1,1.1266625D1,1.2045012D1,1.1266625D1,           7P      6
1.1935012D1;                                                           7P      7
106,1,5,0D0,8.224213D0,1.1935012D1,8.114213D0,1.1935012D1,             9P      8
8.114213D0,1.2045012D1,8.224213D0,1.2045012D1,8.224213D0,              9P      9
1.1935012D1;                                                           9P     10
106,1,5,0D0,5.181801D0,1.1935012D1,5.071801D0,1.1935012D1,            11P     11
5.071801D0,1.2045012D1,5.181801D0,1.2045012D1,5.181801D0,             11P     12
1.1935012D1;                                                          11P     13
106,1,5,0D0,8.224213D0,1.4977424D1,8.114213D0,1.4977424D1,            13P     14
8.114213D0,1.5087424D1,8.224213D0,1.5087424D1,8.224213D0,             13P     15
1.4977424D1;                                                          13P     16
110,0D0,1.7D1,0D0,2.2D1,1.7D1,0D0;                                    15P     17
110,2.2D1,0D0,0D0,2.2D1,1.7D1,0D0;                                    17P     18
100,0D0,8.169213D0,1.1990012D1,8.169213D0,1.5032424D1,                19P     19
8.169213D0,1.5032424D1;                                               19P     20
410,1,1D0,0,0,0,0,0,0;                                                21P     21
406,1,7HDRW0001;                                                      23P     22
406,2,2.2D1,1.7D1;                                                    25P     23
406,2,1,4HINCH;                                                       27P     24
404,1,21,0D0,0D0,0,0,3,23,25,27;                                      29P     25

S      1G      4D     30P     25                                        T      1
  1. Faîtes une copie du script compter.php et nommez ce nouveau fichier moulinette.php
  2. Modifiez le code pour ne plus que le programme compte les lignes, mais qu'il affiche (uniquement) la ligne décrivant notre cercle, c'est-à-dire la ligne dont les 3 premiers caractères sont 100.
    Pour ce faire, aidez-vous de la fonction substr() pour extraire une sous-chaîne des 3 premiers caractères.
    (voir explication de substr() dans le cours ou dans la documentation)
  3. Modifiez encore le programme pour qu'il n'affiche plus que le y_centre et le y_depart du cercle.
    Pour extraire ces 2 valeurs de la ligne, aidez-vous de la fonction explode(), en l'utilisant avec le séparateur qui conviendra.
    (voir explication de explode() dans la documentation)
Question 2.2 : Génération d'un fichier MuPad

1. Modifiez encore le programme précédent, pour qu'il affiche maintenant le code MuPad qui suit, mais où les valeurs de y_IGES_depart et y_IGES_centre seront bien entendu les valeurs lues dans le fichier provenant de Pro-Engineer.

Attention : remarquez que les nombres du fichier IGES sont écrits en notation scientifique ! Il va donc falloir recalculer le nombre pour qu'il soit reconnu par MuPad.
Par exemple, 1.4990233D1 devient 1.4990233 x 101 = 14.990233
Pour ce faire, aidez-vous des fonctions explode() et pow().

Rayon := proc(y_depart, y_centre) # suffisant car les 2 points ont la même abscisse #
begin
   return(y_depart - y_centre);
end_proc;

Perimetre := proc (rayon)
begin
   return(2*PI*rayon);
end_proc;

Aire := proc (rayon)
begin
   return(PI*rayon*rayon);
end_proc;

print ("Les fonctions de calcul du cercle sont chargées.");

R := Rayon (y_IGES_depart, y_IGES_centre);
P := Perimetre (R);
A := Aire (R);

print("Les appels de fonction sont définis");

y_IGES_depart := 14.990233;
y_IGES_centre := 7.420599;

print("Les données de Pro-Engineer sont chargées");

R; A; P;
Code 2.2.1 : Les fonctions et les appels de fonction de MuPad.

2. Lancez MuPad, faîtes un copier-coller du code et exécutez-le ! Voilà, MuPad vient donc de faire ses calculs à partir des données provenant de Pro-Engineer !

Question 2.3 : Générer un fichier pour MuPad
  1. Plutôt que d'afficher le code MuPad à l'écran, faîtes en sorte qu'il soit maintenant écrit dans un fichier calcul.mu
    • Pour l'écriture dans un fichier, voir la fonction fputs()
  2. Exécutez votre nouvelle moulinette pour que le fichier calcul.mu soit généré.
  3. Ensuite, dans MuPad, vous n'avez ainsi plus qu'à charger le fichier en faisant :
    read("D:\\TP_PHP\\calcul.mu");