Structure générale des fichiers IGA
Syntaxe utilisée dans les fichiers IGA
Directives du préprocesseur IGA
Les fichiers IGA (Initial General ASCII) contiennent les données nécessaires
à la description de structures pour l'exécution de simulations
numériques. Ces fichiers peuvent être créés et modifiés
avec un programme d'édition de texte. La structure des fichiers est largement
inspirée du format IGES (1)
(1) "Initial Graphics Exchange Specification
(IGES) Version 5.1", sept. 1991, IGES/PDES Organization, National Institute
of Standards and Technology, Gaithersburg, MD 20899, USA; ce format a été conçu pour des échanges de données
entre logiciels de Conception et de Fabrication Assistées par Ordinateur
(CFAO).
Les informations du fichier IGA sont en ASCII. Le format ASCII permet la création et la modification des fichiers avec un éditeur de texte. En outre ce type de format est à l'heure actuelle le seul qui permet d'échanger des fichiers entre ordinateurs de manière fiable. Les fichiers ASCII s'opposent aux fichiers binaires qui ne sont modifiables que par des programmes et qui sont spécifiques à l'ordinateur sur lequel ils ont été créés. Les fichiers IGA garantissent ainsi une grande compatibilité entre systèmes informatiques hétérogènes.
Cette section détaille la structure et la syntaxe des fichiers IGA. Les fichiers IGA sont transformés en projets ICAB (format agb) par la commande "importer".
Les informations contenues dans un fichier IGA sont structurées pour former une base de données comprenant une collection d'entités. Les entités, sorte de fiches élémentaires, comprennent des informations disposées selon une syntaxe imposée. Les entités sont organisées en Données d'Entrée DE et en Paramètres des Données PD. Dans la suite de ce document, les abréviations DE et PD seront utilisées.
Les Données d'Entrées DE constituent un index qui permet de renseigner les informations contenues dans le fichier IGA. Une Donnée d'Entrée DE joue un rôle similaire à celui tenu par une Directory Entry de fichier IGES. Le nombre d'informations relatives aux DE sont limitées et sont semblables pour toutes les Données d'Entrées DE. Les sections DE servent d'identificateurs pour les sections Paramètres des données PD. Par exemple, une DE pour un noeud contient en particulier le numéro de ce noeud ou le nom attribué à ce noeud.
Une section PD (Parameter Data pour les fichiers IGES) est obligatoirement associée à une DE et contient des informations requises pour la définition de l'entité en question. Par exemple, les paramètres PD pour un noeud contiennent les coordonnées précisant sa position.
Chaque couple DE et PD constitue une entité. Les entités DE et PD sont regroupées en ensembles appelés ensembles de données (par exemple les noeuds, éléments, propriétés...). Avant chaque ensemble d'entités, une Identification d'Entités ET permet préciser des propriétés communes à tout un ensemble d'entités. La structure générale d'un fichier IGA est celle indiquée sur la figure ci-dessous.
{ ET1; identificateur
d'Entité ( DE1; PD1; première entité du premier ensemble ( DE2; PD1; chaque couple (DE,PD) forme une entité ( ....... ( DEN1; PDN1; dernière
entité de l'ensemble 1 qui comprend N1 entités { ............ Ensemble 3 { ............ Ensemble Nn-1 { ETNn; Identificateur
d'Entité numéro Nn |
Les informations contenues dans un fichier IGA apparaissent sous la forme de:
- chaînes de caractères,
- nombres entiers,
- de nombres réels,
- délimiteurs,
- de paramètres.
NODE(); /*
Identificateur d'Entité NOEUD */ PROPERTY(TYPE=SPRING); /*
ID 2 */ ELEMENT(TYPE=SPRING,PROP=spring1); /*
ID 4 */ ELEMENT(TYPE=MASS,PROP=mass1); /*
ID 5 */ CONSTRAINT(TYPE=KINEMATICS) /*
ID 6 */ |
Une chaîne de caractères est une suite de caractères
parmi les listes ci-dessous:
caractères minuscules a b c d e f g h i j k l m n
o p q r s t u v w x y z
caractères majuscules A B C D E F G H I J K L M N
O P Q R S T U V W X Y Z
caractères numériques 0 1 2 3 4 5 6 7 8 9
caractère de soulignement _
Une chaîne de caractères ne doit pas commencer par un caractère numérique.
exemples de chaînes de caractères: cabine cab01 Cab_le
Un nombre entier est une chaîne de caractères constituée de caractères numériques et précédée du signe moins - pour indiquer un nombre négatif, du signe plus + pour indiquer un nombre positif. Le signe plus est facultatif pour un nombre positif.
exemples de nombres entiers: 12 -382 0 +827
Un nombre réel est un nombre comportant une partie décimale. La partie décimale est identifiée par le caractère point . et doit figurer même si la partie décimale est nulle de manière à distinguer un nombre réel d'un nombre entier. Ainsi 12 est interprété comme un nombre entier et 12.0 est comme un nombre réel. Lorsque les nombres réels sont très petits ou très grands, la puissance de 10 est précisée par la lettre majuscule E. La valeur un million deux cents mille (1.2x106) peut s'écrire 1200000.0 ou 1.2E6. Un millionième (1.0x10-6) peut s'écrire 0.000001 ou 1.0E-6. Les nombres réels sont interprétés par ICAB Edit en simple précision, c'est-à-dire avec 7 à 8 chiffres significatifs (Mais les applications ICAB réalisent les calculs en double précision).
exemples de nombres réels: 12.0 -38.2 0.0 1.21233E4 +8.27E-4 -7.34E+6
La virgule sépare des chaînes de caractères, des nombres entiers ou des nombres réels.
exemple:
integer ,12 ,real ,-12.323
Le point-virgule permet de délimiter la fin de Données d'entrées DE, de Paramètres de Données PD ou d'Identificateur d'Entités ET.
exemple:
NODE() ;
1,Node1
; 1.0, 2.0, 3.0 ;
Les parenthèses sont utilisées pour délimiter les arguments définis dans les Identificateurs d'Entités ET (cf paragraphe "syntaxe ET" ci-après).
exemple ELEMENT(TYPE=SPRING );
Le signe égal est utilisé pour l'affectation de valeurs dans un identificateur de paramètre (cf paragraphe suivant).
exemple: TYPE=SPRING
Le caractère dièse ne doit être employé qu'au début d'une ligne de manière à indiquer le début d'une directive (cf section sur les directives du préprocesseur ci-après).
exemple:
#define X1 1.5 /*
cette ligne est une directive */
NODE()
1;
X1, 0.0, 0.0;
Un identificateur de paramètre permet d'affecter des valeurs à des identificateurs d'entité ET, des Données d'Entrée DE ou des Paramètres de Données PD. Un paramètre, c'est-à-dire une information élémentaire (chaîne de caractères, nombres...) n'a qu'une portée limitée à l'entité dans laquelle il se trouve. Un identificateur de paramètre comprend une chaîne de caractères suivie du signe égal =. Le nom de l'argument est une chaîne de caractères qui est interprétée en fonction du contexte. Les paramètres qui suivent le signe égal peuvent être des chaînes de caractères, des nombres entiers ou des réels.
exemple de paramètres: ELEMENT(TYPE=BEAM_LINEAR, MAT=1)
L'exemple comporte deux identificateurs de paramètre dont le premier a pour nom TYPE et pour argument une chaîne de caractères BEAM_LINEAR. Le deuxième identificateur de paramètre a pour nom MAT et son argument est un nombre entier 1.
Un identificateur d'Entité est constitué d'une chaîne de caractères et d'une suite de paramètres. Cette suite de paramètres est délimitée par des parenthèses ( ). Les parenthèses sont indispensables même si aucun paramètre n'est nécessaire. L'identificateur doit tenir sur une seule ligne.
Un identificateur ET a la forme générale suivante:
identificateur ( paramètre1, paramètre2,... )
La chaîne de caractères placée avant la parenthèse ouvrante ( est le nom de l'entité. Les paramètres indiqués entre parenthèses () permettent de préciser des propriétés qui seront communes à toutes les entités jusqu'à ce qu'un autre identificateur d'entité soit rencontré.
exemple:
NODE() /*
identificateur d'Entité sans paramètre */ ELEMENT(TYPE=SPRING,
PROP=spr1) /* avec paramètres */ |
Une Donnée d'Entrée doit appartenir à un ensemble d'Entités, c'est-à-dire un ensemble dont le type d'entité est précisé par un identificateur ET. Une DE commence en début de ligne et se termine par un point virgule ;.
Une DE peut contenir un nombre entier et/ou une chaîne de caractère. Le nombre entier sert à donner un numéro à l'entité. La chaîne de caractère est appelée pointeur dont la longueur ne doit pas excéder 8 caractères de manière à préserver la compatibilité avec le format IGES. Le pointeur permet de nommer une entité. Pour faire référence à une entité, il est possible d'indiquer son pointeur. En l'absence de pointeur dans une DE, cette DE ne peut pas être identifiée par un pointeur. Si le numéro de DE n'est pas précisé, la valeur par défaut est zéro mais pour certaines entités une numérotation automatique est activée.
Attention: même si une DE est vide, le point virgule qui marque la fin de la DE reste nécessaire dans le fichier.
exemple:
NODE() ELEMENT(TYPE=SPRING,
PROP=1) |
Les Paramètres de Données PD ne peuvent figurer qu'après une Données d'Entrée DE. Les Paramètres de Données se terminent par un point virgule ;. Ils peuvent contenir des chaînes de caractères, des nombres entiers ou réels, des paramètres. Il n'existe pas de syntaxe générale car les données dépendent du type d'entité. La description de la syntaxe des Paramètres de Données est détaillée dans le chapitre relatif à la bibliothèque des entités.
exemple:
NODE() ELEMENT(TYPE=SPRING,
PROP=1) |
L'analyse d'un fichier IGA s'effectue en deux passes:
- La première passe, qui est prise en charge par le préprocesseur IGA, consiste à éliminer les commentaires et à analyser le fichier en fonction de directives. Une directive permet de paramétrer un fichier IGA, de programmer des lectures conditionnelles et de fusionner plusieurs fichiers IGA dans le même projet.
- La deuxième passe concerne l'analyse effective des entités ET, des Données d'Entrées DE et Paramètres de Données PD.
Une directive est interprétée grâce au caractère dièse # situé au début de la ligne contenant la directive. Les lignes de directives sont analysées lors de la première passe puis sont éliminées avant la deuxième passe. L'analyse de la première passe (préprocesseur) est séquentielle ce qui implique que seules les directives qui précèdent la ligne en cours peuvent avoir un effet sur cette ligne.
Dans un fichier IGA, il est possible d'inclure des commentaires, c'est-à-dire du texte qui ne sera pas interprété mais qui permet de faire figurer des annotations utiles pour le lecteur. Les commentaires sont supprimés logiquement du fichier avant analyse.
La syntaxe employée est similaire à celle utilisée dans le langage de programmation C++. La première possibilité consiste à faire précéder le commentaire par la paire de symboles /* et à marquer la fin par les mêmes symboles tapés dans l'ordre inverse, soit */. Ce type de commentaire peut être développé sur plusieurs lignes. Les commentaires imbriqués ne sont pas permis.
La deuxième possibilité consiste à placer deux barres obliques consécutives //. La fin de la ligne après la double barre // sera analysée comme un commentaire. Le commentaire peut démarrer à n'importe quel endroit de la ligne et non nécessairement en début de ligne.
exemples:
/* ceci est un commentaire /* ceci est un commentaire sur une ligne */ // commentaire de fin de ligne après la double barre |
Les directives macros offrent un mécanisme de remplacement des éléments. La directive #define définit une macro. La syntaxe est la suivante:
Toutes les occurrences de l'identificateur de macro (chaîne de caractères) dans le fichier IGA seront remplacées par le texte défini par la séquence d'éléments (chaîne de caractères, nombre entier ou réel). Ces remplacements sont dits des développements de macro. Une séquence de macro ne doit pas elle même contenir un identificateur de macro.
Si une macro est définie deux fois, la deuxième définition est utilisée à partir de sa position dans le fichier. Il vaut mieux éviter les doubles déclarations de macros afin d'éliminer les ambiguïtés.
La définition d'une macro peut être supprimée par la directive #undef:
exemple:
#define X1 1.0 //
chaque occurrence de X1 sera remplacée par 1.0 2;
X1, 0.0, 0.0; // cette ligne
est analysée sans modification |
Les directives conditionnelles permettent d'éliminer de l'analyse une partie du contenu du fichier. Les conditions de test portent sur la définition (#ifdef) ou la non-définition (#ifndef) de macros, c'est-à-dire si une commande #define a été exécutée pour cet identificateur et si celui est encore actif.
#ifdef <identificateur de macro>
... lignes
analysées si la condition est vraie
... c'est-à-dire
si la macro est définie
#else
... lignes
analysées si la condition est fausse
#endif
#ifndef <identificateur de macro>
... lignes
analysées si la condition est vraie
... c'est-à-dire
si la macro n'est pas définie
#else
... lignes
analysées si la condition est fausse
#endif
La directive #ifdef <macro> est vraie si la macro a été définie préalablement par la directive #define. La directive #ifndef <macro> teste la condition opposée et n'est vraie que si la macro n'a pas été définie ou bien a été détruite par la directive #undef. La directive #endif doit apparaître de manière à indiquer la fin de la portée de la directive conditionnelle. La directive #else permet de fournir une alternative si la condition testée est fausse.
exemple
#define X1 1.0 #ifdef
X1 //
directive sans alternative (pas de #else) |
Attention: Dans l'application ICAB version 1.0, une macro n'est pas développée.
#define X1 1.0 //
la macro X1 est égale à '1.0'
#define
X2 X1 // la macro X2 est égale à 'X1' et non
pas à '1.0"
La directive #include permet d'insérer un fichier à l'endroit où est placée la ligne. Le nom du fichier à insérer est indiqué entre guillemets "<nom de fichier>". Le fichier à insérer doit lui-même être un fichier IGA.
exemple
#define X1 1.0 #include "test1.iga" /* le fichier "test1.iga" est inclus ici */ NODE(); |