BOUML, an UML tool box   version English   version Français

 

Questions fréquentes (FAQ)

Génération de code

C++

Java

Plug-out

Autre

Une classe est définie avec ses opérations, attributs ... mais le générateur C++/Java/Php/Python/Idl ne produit rien

Si aucun message ne s'affiche dans la fenêtre de trace lors de la génération cela signifie que le Plug-out de génération de code n'a pas pu démarrer, peut être que votre firewall le bloque, voir le Plug-out ne fait rien.

Sinon, la classe n'a pas d'artifact associé, ou la classe/artifact n'est pas défini pour le langage cible.

Comment référencer des éléments issus d'une autre librairie ?

En fait cela dé du niveau d'utilisation de la librairie.

  1. Supposons que vous vouliez utiliser les classes de la stl comme par exemple string, il est à priori inutile d'avoir sa définition et donc d'avoir cette classe présente dans le modèle.
    Dans ce cas une classe peut avoir un attribut de type string, mais pas une relation de ce type car les relations sont définies entre classes connues de Bouml. Pour en faciliter l'utilisation et éviter l'ajout manuel d'#include <string> et peut être using namespace std; dans la définition de l'artifact, le mieux est de définir string comme un type externe via l'onglet C++ [5] du dialogue d'édition des generation settings.
  2. Si vous voulez que string soit défini via une classe dans le modèle par exemple pour définir l'attribut d'une classe via une relation, mais sans informations supplémentaires concernant string, et sans voir un artifact associé à string parce que vous ne voulez évidemment pas générer son code : le mieux est de définir string comme une classe externe.
    Pour cela : créez la classe string, éditez la et dans l'onglet C++ cocher external, appuyez sur le bouton default definition et si besoin changer la définition produite. La première ligne indique comment la classe sera nommée à la génération (par défaut il s'agit du nom UML),les lignes suivantes permettent de définir le code qui sera automatiquement produit dans les fichiers qui référencent string (par exemple pour ajouter un using namespace std;). La définition des classes externes se fait via l'onglet C++ [5] du dialogue d'édition des generation settings.
  3. La dernière possibilité est de réellement définir la classe string sous Bouml, et donc pas exemple dans le cas d'une classe template comme vector d'avoir la liste de ses paramètres formels, ou une définition plus complète suivant ce vous voulez avoir. La définition des classes de la stl peut être (partiellement) obtenu via un reverse, mais de part l'utilisation du pré-processeur Bouml perdra quelques informations suite à des erreurs de syntaxe. Pour ne pas avoir ces problèmes le mieux est d'écrire un petit fichier source contenant les #include <?> souhaités, de le pré-processer (g++ -E) en plaçant le résultat dans un autre fichier que vous reverserez avec Bouml. Cependant la stl est très verbeuse, le simple reverse de string produit environ 600 classes/types et je ne suis pas certain que vous serez intéressé par toutes ces définitions :).
    Note : quelque soit le moyen utiliser pour définir ces classes, vous devrez leur associer un artifact car elles ne sont pas externes, et ne pas lancer la génération de code sur ceux-ci ou utiliser un répertoire de génération poubelle (/tmp or c:\temp etc ...) car il est bien évident que le code généré ne devra pas être utilisé.

Bien évidemment les solutions ci-dessus peuvent être utilisées dans le cas de n'importe qu'elle librairie, éventuellement personnelles.

Dans les cas (2) et (3) le mieux est de faire le travail dans un projet dédié à la définition de ces classes, ce projet devenant une librairie au sens Bouml. Ce faisant vous pourrez importer ce projet en tant que librairie dans n'importe quel autre et bénéficier des définitions qu'il contient.

Le reverse signale des erreurs de syntaxe alors que le code est valide

Des erreurs de syntaxe peuvent être détectées lors d'un reverse pour plusieurs raisons :

Pour faire des substitutions dans les fichiers lus : editez the package dans lequel le reverse C++ est lancé (peut être le projet lui-même), ajouter une propriété utilisateur (via l'onglet Properties) ayant #file comme clef et dont la valeur est le chemin absolu d'un fichier de définition. Chaque ligne du fichier de définition doit contenir :

Attention : les lignes ne doivent pas contenir d'espaces ou tabulations (sauf bien-sûr dans une chaîne de caractères représentant la valeur).

Comment produire des commentaires compatibles avec Doxygen

Par défaut les définitions des éléments générés utilisent le mot clef ${comment}, ce mot clef produit la description de l'élément précédée de //.

Si vous voulez totalement définir le contenu du code généré pour les commentaires vous devez remplacer ${comment} par ${description} et le générateur de code produira les descriptions sans aucun changement. A priori ce changement doit alors être fait dans les generation settings pour les artifacts, classes, attributs, relations et opérations !

Le code généré pour initialiser un attribut statique de classe ne contient pas de "=".

Ceci est dut au fait que l'initialisation d'une variable ne comporte pas toujours de "=", si le type de la variable est une classe la forme doit être du type Type Class::Var(param1, ... paramn).

Vous avez donc deux solutions :

Comment ajouter des #include dans le code généré ?

Editez l'artifact et ajoutez les #include requis dans la définition du header ou du source, avant ou après ${includes}.

Vous pouvez également utiliser les dépendances entre classes.

Comment ajouter des import dans le code généré ?

Editez l'artifact et ajoutez les import requis.

Mon plug-out ne fait rien

Les échanges entre le modeleur et les plug-out sont supportés par un socket TCP/IP. Quand vous demandez l'exécution d'un plug-out, Bouml cherche un port libre de numéro supérieur ou égal à 1024 vers localhost (127.0.0.1). Le port trouvé est donné en paramètre au plug-out appelé. Si vous avez un firewall il peut être nécessaire de le configurer pour autoriser BOUML et les plug-outs à utiliser des sockets. C'est entre autre le cas avec McAfee.

Une modification de modèle faite par un plug-out n'est pas vu par un autre plug-out actif au même moment

Pour réduire les échanges entre le modeleur et les plug-out (dans un but de performances d'exécution), les informations associées à un élément sont envoyées en un paquet par le modeleur et mémorisées par les plug-outs. Ceci est réalisé par les classes système dés qu'une information concernant l' élément correspondant est demandée (avec les restrictions liées à WITHCPP, WITHJAVA, WITHPHP, WITHPYTHON et WITHIDL). Ceci est totalement transparent sauf si au moins deux plug-outs sont actifs en même temps, l'un modifiant des données et l'autre les ayant déjà lues. Pour voir les nouvelles valeurs le second plug-out doit appeler l'opération unload (une opération définie sur UmlBaseItem) sur l'élément correspondant, puis demander l'information voulue sur l'élément.

Lorsque je compile mon plug-out en Java j'ai des erreurs

Quelques fichiers implémentant l'API contiennent plusieurs classes, ce qui produit des erreurs si vous compilez les fichiers un à un. Pour compiler un plug-out, compilez tous les fichiers en même temps faisant javac *.java dans le répertoire où les fichiers Java ont été générés.

Message d'erreur cannot write in 'H:/.boumlrc' (H peut être une autre lettre)

Certains fichiers comme '.boumlrc' sont créés dans votre home directory, ce message d'erreur s'affiche lorsque vous n'avez pas les droits d'écriture dans ce directory (ici H), ce qui n'a pas de sens. Mettez votre home directory en écriture ou changer de home directory.

Dans une configuration multi-écrans tout s'affiche à cheval sur les écrans

Il n'est pas possible de savoir si vous disposez d'une configuration multi écrans, mais ce cas est géré par Bouml : vous avez juste à définir l'écran devant être utilisé par défaut via l'entrée set environment du menu miscellaneous.

Ces limites ne sont utilisées que le calcul de la position et de la taille initiale de la fenêtre de BOUML et des boites de dialogue. Vous pouvez tout à fait aller en dehors de ces limites, et déplacer le modeleur dans un autre écran afin d'avoir un écran pour le modeleur et un autre pour les boites de dialogue.

Il est recommendé de placer le modeleur dans la fenêtre de droite sinon l'affichage de menus de type popup risque de déborder dans une fenêtre plus à droite.

Problème de police de caractères

Après l'édition de la description au autre partie certains caractères sont remplacés par des espaces

Durant les éditions par Qt les caractères sont encodés sur 16 bits, mais en dehors des dialogues d'édition seuls 8 bits sont utilisés.

Lorsque vous utilisez des caractères non ISO_8859-1 (latin1) vous devez spécifier quel charset utiliser (la liste proposdée par Bouml dépend de la version de Qt utilisés Qt), pour cela utilisez l'entrée set environment du menu miscellaneous.

Attention : même lorsque l'ensemble est indiqué il n'est pas possible d'utiliser des caractères non ISO_8859-1 partout. Par exemple ce n'est pas possible pour nommer les éléments du browser, lire la documentation.

Le copy/paste d'un diagramme de Bouml dans Word sous Windows donne une image floue

Word et PPoint sont responsables de ce problème, pas Bouml : si vous faites le paste par exemple dans paint vous obtiendrez l'image initiale. Pour ne pas voir ce problème avec Word and PPoint n'utilisez pas le copy/paste mais sauver le diagramme dans un fichier PNG. Sous Word vous pouvez aussi essayer Edit - Paste Special... et choisir As bitmap.

Après modification des generation settings la génération de code est inchangée

La modification des generation settings n'a aucun impact sur les définitions et déclarations existantes. Supposez par exemple que vous avez en C++ un attribut de type pointeur (sa définition contient donc ${type} * ${name}); Lorsque vous modifiez les generation settings, la définition de l'attribut est heureusement inchangée sinon vous ne seriez pas content de perdre l '*' a cause de la nouvelle définition !

Pour propager des modifications sur les définitions existantes, utilisez le plug-out Global change.

Le reverse ne créé pas de diagrammes

Ne rêvons pas, un bon diagramme ne peut être généré automatiquement par un outil car un bon diagramme de classes par exemple n'est pas que l'affichage d'une liste de classes placées dans un dessin.

Cependant, faire un diagramme est très facile : créez et ouvrez le et par exemple via des drag & drop placez les éléments voulu du browser dans le diagramme. Par défaut les relations entre éléments sont dessinées automatiquement (voir les drawing settings).

Vous pouvez aussi placer toutes les classes d'une vue de classes dans un diagramme : créez et ouvrez le diagramme si ce n'est pas déjà fait, sélectionnez la vue de classes dans le browser, faites un clic droit dans le diagramme et demandez add classes from the selected class view. Note : peut être deviez-vous d'abord modifier les drawing settings par exemple pour cacher les opérations et/ou attributs etc ...

Utilisation de BOUML en multi-utilisateurs sur un même projet

Merci de lire la documentation chapitres multi users considerations et probablement project synchro, project control ou file control.

Comment changer le nom des opérations getter et setter

Si vous avez une relation ou un attribut nommé foo, par défaut les getter et setter sont nommés get_foo et set_foo.

Si vous voulez avoir getFoo, éditez l'opération, allez dans l'onglet du langage voulut et remplacez get_${name} par get${Name}. De même pour le setter.

Si vous voulez avoir get_FOO, remplacez get_${name} par get_${NAME}. De même pour le setter.

Bien-sûr ces modifications peuvent être demandée au niveau des generation settings.

Problème avec Xft et les grosses polices de caractères

Au moins dans le cas du système pkgsrc, QT3 dépend de Xft2.

Quand QT3 ouvre une police de caractères, sa taille est mauvaise, et le message couldn't open fontconfigs chosen font with Xft est écrit dans la console. Pour résoudre ce problème vous devez recompiler QT3 avec l'option -no-xft.

Comment avoir un objet ayant plusieurs états dans un diagramme d'activité ?

En fait, quand vous ajoutez un activity object vous ajoutez une utilisation de cet objet, et en l'éditant vous pouvez modifier l'état dans lequel il est.

Aussi, pour montrer le même objet dans différents états dans un diagramme d'activité, vous devez dupliquer l'objet et positionner l'état dans chacun.

Est-il possible d'exporter la documentation et/ou les diagrammes au format PDF/EPS ?

Pas directement. Pour produire un PDF vous devez utiliser pas exemple Pdf Creator à partir d'un export HTML. Pour produire une image au format EPS le mieux est de partir d'un diagramme exporté au format SVG.

Contenu du site | Auteur et liens | Mentions légales   Valid XHTML 1.0 Transitional Valid CSS!