\documentclass[11pt,a4paper,twoside]{article} \usepackage[T1]{fontenc} % \usepackage[applemac]{inputenc} \usepackage[latin9]{inputenc} \usepackage[dvips,lmargin=2cm,rmargin=2cm,bmargin=2cm,tmargin=2.5cm]{geometry} \raggedbottom \usepackage{pst-uml} % LA SUITE NE MARCHE PAS CAR "fvrb-ex" cherche "fancyvrb", meme % si celui-ci est deja chargé ! % \usepackage{fancyvrb} % pour les environnement CenterExample... \usepackage[pstricks]{fvrb-ex} \fvset{frame=single,numbers=left,fontsize=\footnotesize} % \providecommand{\showgrid}{\psgrid[subgriddiv=0, griddots=10]} \psset{subgriddiv=0, griddots=10} \DefineShortVerb{\|} % \UndefineShortVerb{\|} % pour annuler \pagestyle{headings} \usepackage{calc} \usepackage{ifthen} \newcounter{hours}\newcounter{minutes} \newcommand{\printtime}{% \setcounter{hours}{\time/60}% \setcounter{minutes}{\time-\value{hours}*60}% \thehours h% % on veut obtenir 15h03mn et non 15h3mn... \ifthenelse{\theminutes<10}{0}{}\theminutes mn} \newcommand{\Stabilo}[1]{\colorbox[rgb]{1,1,0.2}{#1}} \newcommand{\fStabilo}[1]{\fcolorbox[rgb]{1,0,0}{1,1,0.2}{#1}} % Quelques abbreviations % Conventions g\'{e}n\'{e}rales pour les formats de pr\'{e}sentation \newcommand{\strong}[1]{\textbf{\emph{#1}}} % plus fort que \emph \newcommand{\tech}[1]{\textsf{#1}} % terme technique \newcommand{\file}[1]{\texttt{#1}} % noms de fichiers et de r\'{e}pertoires \newcommand{\menu}[1]{\fbox{#1}} % nom d'un menu/sous-menu \newcommand{\key}[1]{\fbox{\textbf{#1}}} % touche du clavier % abreviations locales a ce document : \newcommand{\uml}{\textsc{uml}} \newcommand{\pstricks}{\texttt{PSTricks}} \newcommand{\postscript}{\texttt{PostScript}} \newcommand{\pstuml}{\texttt{pst-uml}} % \newcommand{\bs}{\backslash} % Pour les noms de commande TeX % Exemple : \cs{fbox} => \fbox \DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}} \usepackage[colorlinks,linktocpage]{hyperref} % \usepackage{french} \usepackage[francais]{babel} % idem frenchb mais PAS french ! % La suite evite que Babel impose un espace devant ":" mais n'est % pas disponible sur les vielles versions de Babel (comme à l'ENSTA). \NoAutoSpaceBeforeFDP \begin{document} \title{Interface utilisateur du package \pstuml} \author{% Maurice \textsc{Diamantini}% \thanks{avec l'aide précieuse de Denis \textsc{Girou}} % (email : \texttt{diam@ensta.fr}) } \date{% modif package : 27/08/06 \\ modif doc\ \ \ : 27/08/06\\ \pageref{verylast}~pages compilées le \today{} à \printtime{}. } \maketitle \tableofcontents \section{Introduction} \subsection{Présentation} Ce document présente l'utilisation d'un certain nombre de macro destinées à faciliter le dessin de diagramme de type \uml{} (Unified Modeling Langage) en utilisant le package \pstricks{} de Van Zandt \textsc{Timothy}, dont l'usage est supposé connu. Ce package est en cours de développement et n'est diffusé pour l'instant que à titre d'information. En particulier, la \strong{stabilité} des noms de commandes proposées, leurs paramètres ainsi que leur comportement même \strong{ne sont pas garantis}. Il en est de même que le nom et la fonction des options. Dans le cas de diagrammes \uml{} complexes, on peut augmenter la lisibilité du source, et donc faciliter les modifications du diagrammes en cours d'élaboration en divisant le travail en trois phases séparées~: \begin{enumerate} \item définir graphiquement le dessin des différents éléments du schémas, en particulier pour les objets complexes (nombreux paramètres ou text important, ...) ; \item placer% \footnotemark{} % ces boites grâce à \texttt{psmatrix} ou à des \cs{rput} dans un environnement \texttt{pspicture} Les objets positionnés sont alors associé à un nom de node (au sens \pstricks). On peut également dans cette phase placer les labels ou autres dessins complémentaires liés aux graphismes des objets eux-mêmes (et non des connecteurs entre objets) ; \item router% \addtocounter{footnote}{-1}\footnotemark{} % ces boites à l'aide des différentes commandes de connexion et coller les labels ou autres fleches \uml{}. \end{enumerate} % \footnotetext[1]{désolé : déformation professionnelle !} \footnotetext{désolé : déformation professionnelle !} % \stepcounter{footnote} Les macro proposées tendent à suivre les conventions \pstricks{} et \texttt{graphicx} pour le passage des options : à savoir l'utilisation de couple de la forme \texttt{Key=value}. Cette fonctionnalité nécessite l'utilisation du package \texttt{pst-key} qui est proposée dans la distribution de \pstuml{} (en attendant une diffusion plus générale). Un des intérêts du package \texttt{pst-key} est de pouvoir rajouter des options sans changer la syntaxe de la commande de base. D'une manière générales, le nombre d'options de toutes les commandes complexes est appelé à croitre. \noindent Voici la syntaxe générale des commandes proposées : \begin{verbatim} \umlCommand[option1=value1,option2=value2,...]{param1}{param2}... \end{verbatim} La valeur par défaut de chacune de ces options peut être redéfinie par la commande |\psset{...}| (comme toutes toutes les options de \pstricks). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Dépendances } Les packages suivants sont appelés par \pstuml{} (par la commande \cs{RequirePackage}): \begin{itemize} \item \texttt{pstricks} \item \texttt{pst-node} \item \texttt{pst-tree} \item \texttt{multido} \item \texttt{calc} \item \texttt{ifthenelse} \item \texttt{pst-xkey.tex} (par \cs{input} car en \TeX{}) \end{itemize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Les macros de création d'objet} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\cs{umlClass}} \begin{description} \item[Syntaxe] \mbox{} \begin{verbatim} \umlClass[keyOptions]{title}{body} \end{verbatim} Permet de dessiner une classe. \item[Paramètres] \mbox{} % % \subsubsection*{Paramètres} \begin{description} \item[\texttt{title} :] nom de la classe, celui-ci sera centré et écrit en gras. Il peut tenir sur plusieurs lignes. \item[\texttt{body} :] corps de la classe propremment dit. En particulier contient les attributs et méthodes justifiées à gauche. Les différentes lignes sont séparées par |\\| et éventuellement des |\hline|. \end{description} \item[Options] \mbox{} \begin{description} \item[\texttt{umlDoubleRuleSep} (dim : 2mm)] : distance% \footnote{% protect car dans \item[xxx] Comme pour toutes les dimensions passées à \pstricks{}, la spécification de l'unité utilisée est facultative et vaut \texttt{cm} par défaut, contrairement à \LaTeX{} ou il est nécessaire de préciser une unité (même pour 0pt !). } % entre deux |\hline| (dans la zone |title| ou |body|). \item[\texttt{umlShadow} (boolean : true)] : si vrai, un cadre ombré de fond gris entoure la classe \\ sinon, un cadre simple sur fond blanc est utilisé. \item[\texttt{umlParameter} (string : "")] : si non vide, dessine un rectangle en pointillé contenant la valeur sur le coin supérieur droit de la classe (utilisé pour les classes paramétriques ou "Templates" en C++). \end{description} \item[Exemples 1] \mbox{} Les illustations suivantes présente une utilisation directe (i.e. sans utilisation dans une boite ou par une commande) de la commande de création d'une classe. Ces classes sont entourées par un tiret pour montrer le positionnement vertical par rapport à la ligne de base. \bigskip\noindent Exemples de classes standards \begin{SideBySideExample}[xrightmargin=6cm] --\umlClass{standard 1}{% attrib 1 \\ attrib 2 \\ attrib 3 \\ \hline meth 1 \\ meth 2 }-- \end{SideBySideExample} \bigskip\noindent \begin{SideBySideExample}[xrightmargin=6cm] --\umlClass{standard 2}{% attrib 1 \\ attrib 2 \\ attrib 3 \\ \hline \hline }-- \end{SideBySideExample} \bigskip\noindent \begin{SideBySideExample}[xrightmargin=6cm] --% \umlClass[umlShadow=false,umlParameter=\ T\ ]{% standard 3% }{% \hline meth 1 \\ meth 2 }-- \end{SideBySideExample} \bigskip\noindent \begin{SideBySideExample}[xrightmargin=6cm] --\umlClass{standard 4}{}-- \end{SideBySideExample} \bigskip\noindent \begin{SideBySideExample}[xrightmargin=6cm] --\umlClass{standard 5}{% \hline \hline }-- \end{SideBySideExample} \item[Exemples 2] \mbox{} \bigskip\noindent On peut mettre plusieurs sauts de ligne dans chaque paramètre de la commande. Pour le premier paramètre : toutes les lignes sont centrées et en gras~: \begin{SideBySideExample}[xrightmargin=7.5cm] --% \umlClass{Exemple 1 \\ avec \\ plusieurs lignes}{% Champs r\'eserv\'e aux attributs\\ \hline Champs r\'eserv\'e\\ aux m\'ethodes\\ \hline\hline Champs bidon% }-- \end{SideBySideExample} \item[Exemples 3] \mbox{} \bigskip\noindent On peut souhaiter imposer une largeur minimale à une classe, par exemple pour donner à plusieurs classes une apparance identique. On met alors le titre dans une \cs{makebox} (s'il n'y a qu'une seule ligne). \begin{SideBySideExample}[xrightmargin=6cm] --% \umlClass{\makebox[3.5cm]{Voici la classe 1}}{% Largeur mini 3.5cm \\ \hline M\'ethode1\\ M\'ethode2% }-- \vspace{10mm} --% \umlClass{\makebox[3.5cm]{Classe 2}}{% Les attributs \\ \hline M\'ethode1\\ M\'ethode2% }-- \vspace{10mm} --% \umlClass{\makebox[3.5cm]{Classe 3}}{% \hline \hline }-- \vspace{10mm} --% \umlClass{\makebox[3.5cm]{Classe 4}}{% Cela peut m\^eme d\'epasser ! \\ \hline M\'ethode1\\ M\'ethode2% }-- \end{SideBySideExample} \item[Bug] \mbox{} -- \item[\`A faire] \mbox{} -- \end{description} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{\cs{umlSaveClass} et \cs{umlUseBox}} % % \begin{description} % % \item[\`A faire] \mbox{} % % Utilisation des commandes de classes complémentaires : % \cs{umlSaveClass} s'utilise comme \cs{umlClass}, mais au lieu de % dessiner une classe, celle-ci est sauvée dans une boite (au sens % \LaTeX{}) et doit être utilisé ultérieurement. Le titre de la % classe sert pour nommer la boite. Ce titre pouvant contenir des % espaces, il n'est pas possible d'utiliser simplement un \cs{usebox} % pour utiliser cette boite : d'où l'existance de la commande % \cs{umlUseBox}. Les caractéristiques de l'objet créé sont fixées % lors de la \emph{création} de la boîte par \cs{umlSaveClass}. Ceci % est trés important pour savoir quels sont les paramètres par défaut % qui seront pris en compte. % % \strong{Attention :} Ce nom contenant des espaces, il ne peut pas être % utilisé comme nom de node (sous peine d'erreurs \postscript). % % \item[Exemples 1] \mbox{} % % % \bigskip\noindent A vérifier : Les blocs ainsi définis en \LaTeX{} % sont globales même si elle sont définie à l'intérieur d'un % environnement ou d'un bloc |{}|. % % \begin{SideBySideExample}[xrightmargin=7cm] % % On cree et m\'emorise la classe % \umlSaveClass{Classe 1 bis}{% % mes attributs \\\hline % M\'ethode 2 \\ % M\'ethode 2% % } % % On utilise la classe (en instanciant la boite % \rnode{Classe1bis}{\umlUseBox{Classe 1 bis}} % \end{SideBySideExample} % % % \item[Bug] \mbox{} % % % La boîte porte toujours le nom |#| et non pas le contenu de |#2| ou % |#1| suivant le cas. D'où l'écriture des caractères |2|  et |21| % entourant les boites placées. % % Pour les volontaires, voici le code de la commande % \cs{umlSaveClass}: % % \begin{Verbatim} % % CECI FONCTIONNE MAL (la boite cree s'appelle "#" ) % % Je n'ai pas reussi en jonglant aves les \csname et autre \@nameuse % \newcommand{\umlSaveClass}[3][]{% % \newsavebox{\#2}% % \savebox{\#2}{% % \umlClass[#1]{#2}{#3}% % }% % } % % Pas de \umlUseClass car sera aussi utilisée pour les acteurs, ... % \newcommand{\umlUseBox}[1]{\usebox{\#1}} % \end{Verbatim} % % \end{description} % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{\cs{umlDefClass} et \cs{umlRunCmd}} % % \begin{description} % % \item[\`A faire] \mbox{} % % Une autre façon de prédéfinir les classes est de créer des % commandes dont le nom correspond au titre de la classe (malgré les % espaces et sauts de ligne). Contrairement à l'utilisation de la % commande \cs{umlSaveClass}, Les caractéristiques de l'objet créé % sont fixées au moment de l'utilisation de la commande par % \cs{umlRunCmd}. % % \bigskip\noindent A vérifier : de plus, la commande définie est % local à son environnement ou à son bloc |{}|. % % \item[Bug] \mbox{} % % A FAIRE (j'appréhende les mêmes problèmes que précédement) % % \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\cs{umlActor}} \begin{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Syntaxe] \mbox{} \begin{verbatim} \umlClass[keyOptions]{title} \end{verbatim} Permet de dessiner un acteur représenté par un bonhomme avec un nom. Le titre du bonhomme est vu comme une boîte vide par \LaTeX{}, cela rend les liens dans les diagrammes des cas d'utilisation (qui sont la principale utilisation des Acteurs) plus agréable (les flèches sont positionnées par rapport au bonhomme et non pas au texte qui peut occuper plusieurs lignes. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Paramètres (un seul)] \mbox{} \begin{description} \item[\texttt{title} :] nom de l'acteur. Il peut contenir plusieurs lignes séparées par |\\| et éventuellement des \cs{hline} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Options] \mbox{} \begin{description} \item[\texttt{umlActorLineWidth} (dimension : 0.6mm )] : Epaisseur de ligne pour le dessin de l'acteur. \item[\texttt{unit} (dimension : 1 ou 1cm )] : option standard de \pstricks{} permet de modifier la taille de l'Acteur. Les options \texttt{xunit}, \texttt{yunit} sont également utilisable mais déconseillés. \end{description} D'autres option standard à \pstricks{} telle que \texttt{unit} (ainsi que xunit et yunit) peuvent être utilisées. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Bug] \mbox{} Un agrandissement par un \texttt{yunit} $> 1$, a pour effet de décaler la tête vers le haut : il faut donc utiliser la commande \cs{resizebox} pour assurer un agrandissement correct. L'utilisation de \texttt{unit} pour le changement de taille semble ne pas modifier pas la taille de la boite crée : d'ou l'encombre pour les petites taille (on compense par un |\resizebox{}[][]{}| approprié). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[\`A faire] \mbox{} Option : pour concerver la taille de la boîte correspondant au Titre de l'acteur. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 1] \mbox{} Ces commandes étant courtes, on peut les créer au moment même de placement qui se fait ici dans le corps du texte dans cet exemple (en mode LR au sens \LaTeX{}). \begin{CenterExample} \umlActor{Client}--% \umlActor[unit=0.5,umlActorLineWidth=1mm]{Minus 1}--% \umlActor[unit=0.5,umlActorLineWidth=1mm]{Minus 2}--% \umlActor[xunit=0.6,yunit=1.5, umlActorLineWidth=1pt]{Le Chef}--% \umlActor{}--% \psframebox{\umlActor{sur\\trois\\ligne}}--% \end{CenterExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 2] \mbox{} On peut séparer la création et le dessin du placement. Le placement se fait également dans le texte même. \begin{CenterExample} % Actor2 : \newcommand{\drawActorii}{% \umlActor[umlActorLineWidth=1pt]{Act2 (1pt)}} % Actor3 : \newcommand{\drawActoriii}{% \umlActor{Act3 \\ (par defaut)}} % Actor4 : \newcommand{\drawActoriv}{% \umlActor[umlActorLineWidth=1mm,unit=0.5]{Act4 (1mm)\\unit=0.5}} % Actor5 : (changement local d'une valeur par defaut) \newcommand{\drawActorv}{% \umlActor[umlActorLineWidth=2mm]{% N'importe quoi\\sur trois lignes\\Act5 (2mm)}} % % utilisation des acteurs precedements definis : --\drawActorii% --\drawActoriii% --\drawActoriv% --\drawActorv% \end{CenterExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 3] \mbox{} On peut composer les objets Class et Actor (illustation du stéréotype de l'acteur). \begin{SideBySideExample}[xrightmargin=5cm] +% \umlClass{\umlStereoType{Actor} % \umlActor[unit=0.5]{}}{% }+% \end{SideBySideExample} \begin{SideBySideExample}[xrightmargin=5cm] +% \umlClass{<> % %\raisebox{}[][]{} \raisebox{-0.3\height}[3ex][2ex]{% \umlActor[unit=0.5]{}% }% }{% }+% \end{SideBySideExample} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\cs{umlState}, \cs{umlPutStateIn} et \cs{umlPutStateOut} } \begin{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Syntaxe] \mbox{} Les commandes suivantes permettent de dessiner à l'emplacement courant respectivement un état, ou les pseudo-états d'entrée et de sortie : \begin{verbatim} \umlState[keyOptions]{title}{body} \umlStateIn \umlStateOut \end{verbatim} \`A l'usage, les commandes de dessin de pseudo-état décrites ci-dessus sont avantageusement remplacée par les deux commandes suivantes : \begin{verbatim} \umlPutStateIn{coord}{nodeName} \umlPutStateOut{coord}{nodeName} \end{verbatim} Elles permettent de dessiner et surtout de placer et connecter les pseudo-états d'entrée et de sortie. Ces pseudo-état sont mis dans un \cs{cnode} au moment de leur création, ce qui permet aux connexions de toucher ces états même si le connecteur arrive à 45 degrés ; ce qui n'est pas le cas si on met la boite (donc de forme carrée) créée par \cs{umlStateIn} à \emph{posteriori} dans un \cs{cnode} ! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Paramètres] \mbox{} \begin{description} \item[\texttt{title} :] nom de l'état, peut-être vide. Celui-ci sera centré et écrit en gras. Il peut tenir sur plusieurs lignes (toutes seront en gras. \item[\texttt{body} :] corps de l'état, peut-être vide. Il peut contenir plusieurs lignes séparées par |\\| et éventuellement des \cs{hline}. Il peut également contenir des environnements |pspicture| ou d'autres \cs{umlState}. \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[options] \mbox{} \begin{description} \item[\texttt{umlStateWidth} (dimension: 0 )]~: (NON IMPL\'EMENT\'E) largeur de l'état. La valeur 0 représente la dimension naturelle de cette boite. \item[\texttt{umlStateHeight} (dimension: 0 )]~: (NON IMPL\'EMENT\'E) hauteur du corps de l'état l'état. La valeur 0 représente la dimension naturelle de cette boite. \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Bug] \mbox{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[\`A faire] \mbox{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 1] \mbox{} Les états d'entrée et de sortie \bigskip \begin{SideBySideExample}[xrightmargin=6cm] +\umlStateIn+ : Input State +\umlStateOut+ : Output State \end{SideBySideExample} \bigskip Exemples simples avec champs vides ou non \bigskip \begin{SideBySideExample}[xrightmargin=6cm] +% \umlState{}{Body only}+% \umlState{}{}+% Vide \umlState{Title only}{}+ \end{SideBySideExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 2] \mbox{} On peut mettre titre ou corps sur plusieurs lignes. Toutes les lignes du titre sont en gras : \begin{SideBySideExample}[xrightmargin=6cm] +% \umlState{Title A\\Title B}{}+% \umlState{}{Body A \\ Body B}+% \end{SideBySideExample} \begin{SideBySideExample}[xrightmargin=6cm] +\umlState{Title A\\ Title B}{% Voici le corps de l'état \\ avec les diff\'erentes\\ lignes\\ et d'autres...% }+% \end{SideBySideExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 3] \mbox{} Il y a différents moyens pour réserver une place blanche de taille arbitraire (en attendant l'implantation d'options spécialisées pour ce besoin). \bigskip\noindent On peut rajouter un \texttt{strut} (règle invisible) pour agrandir un des champs, ainsi que pour créer un champ vide. La \cs{fbox} n'est là que pour indiquer la place qu'occupe les \texttt{struts}, de même l'épaisseur du \cs{strut} de 1 cm (au lieu de 0 cm normalement) permet de le visualiser : \begin{SideBySideExample}[xrightmargin=6cm] +% \umlState{% Utilis. de \cs{strut}\rule[-2ex]{1mm}{6ex}% }{% \fbox{\rule{0cm}{2cm}\rule{4cm}{0cm}}% }+ \end{SideBySideExample} \noindent Une commande \cs{umlEmptyBox} est proposée pour créer une boite vide (mais est-elle bien utiles ??) \begin{SideBySideExample}[xrightmargin=6cm] +% \umlState{Utilis. de \cs{umlEmptyBox}}{% \fbox{\umlEmptyBox{4cm}{2cm}}% }+ \end{SideBySideExample} \bigskip\noindent On peut spécifier une boite "paragraphe" de largeur 4 cm et optionnellement de hauteur 2 cm dans le corps. Il faut mettre un espace forcé pour que le paragraphe ne soit pas vide. \begin{SideBySideExample}[xrightmargin=6cm] +% \umlState{% etat vide par \cs{parbox}% }{% \parbox[c][2cm]{4cm}{\ }% }+ \end{SideBySideExample} \bigskip\noindent On peut utiliser \cs{hspace*} et \cs{vspace*}, c'est la solution la plus précise. \begin{SideBySideExample}[xrightmargin=6cm] +% \umlState{\cs{hspace*} et \cs{vspace*}}{% \hspace*{4cm}\vspace*{2cm}% }% + \end{SideBySideExample} On pourrait encore utiliser le saut de ligne paramétré |\\[2cm]| (moins précis, mais pratique dans les tableaux. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \iffalse \item[Exemples 4] \mbox{} Un état dans une pspicture. L'option |[shidt=0.5\psyunit]| de pspicture permet de positionner la ligne de base de la boîte \texttt{pspicture} à 50\% de la hauteur total (si on met |[]|, la ligne de base passera par l'origine (0,0)). \bigskip\noindent \begin{CenterExample} \begin{pspicture}[shift=6.5](-7,-5)(6,5)\psgrid \rput(0,3.5){\textbf{pspicture 1}} \rput(0,-0.5){\umlState{Etat interne vide}{% \rule{0cm}{5cm}\rule{6cm}{0cm}% }}% \rput(-1,-1){\umlState{Etat 1}{% Contenu 1\\contenu 2% }}% \rput(-1,1){\umlStateIn}% \rput(1,1){\umlStateOut}% \end{pspicture}+% \end{CenterExample} \fi \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\cs{umlCase} et \cs{umlCasePut}} \begin{description} \item[Syntaxe] \mbox{} \begin{verbatim} \umlCase[keyOptions]{body} \end{verbatim} Permet un bloc de texte dans un oval. Cependant la boite \LaTeX{} résultante est forcément rectangulaire (comme toute boite \LaTeX{} : il n'est plus possible alors de créer simplement un ovalnode par la suite, d'où la quasi-inutilité de cette commande. \begin{verbatim} \umlCasePut[keyOptions]{coord}{nodeName}{body} \end{verbatim} Permet un bloc de texte dans un ovalnode. Personnellement je n'ai utilisé que cette commande pour créer (et surtout connecté) des \textsf{use-case)}. \item[Paramètres] \mbox{} \begin{description} \item[\texttt{coord} :] coordonnées du centre de la boite à positionner. \item[\texttt{nodeName} :] nom du node (au sens \pstricks{}). Celui-ci sera utilsaé pour les connexions ultérieures. \item[\texttt{body} :] texte éventuellement sur plusieurs lignes séparées par des |\\| (utilisation en interne de la commande \cs{umlStack}). \end{description} \item[Options] \mbox{} : pas d'option spécifique pour l'instant \item[Bug] \mbox{} \item[\`A faire] \mbox{} \item[Exemples 1] \mbox{} Voir fichier séparé \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\cs{umlNote}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Syntaxe] \mbox{} \begin{verbatim} \umlNote[keyOptions]{noteBody} \end{verbatim} Permet de dessiner une note dans un ardre au coin corné. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Paramètres] \mbox{} \begin{description} \item[\texttt{noteBody} :] corps de la note. Il peut contenir plusieurs lignes séparées par |\\|. \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Options] \mbox{} \begin{description} \item[\texttt{umlNoteCoin} (dimension: 1.5ex )]~: (NON IMPL\'EMENT\'E) coin du petit carré replié. \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Bug] \mbox{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[\`A faire] \mbox{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 1] \mbox{} \begin{SideBySideExample}[xrightmargin=6cm] +% \umlNote{Ceci est \\ un \\ exemple de note}% + \end{SideBySideExample} \begin{SideBySideExample}[xrightmargin=6cm] +% \umlNote[linewidth=2pt,umlAlign=c]{% Ceci est \\ autre exemple \\ de note% }% + \end{SideBySideExample} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Les commandes auxiliaires de \pstuml{}} Ces commandes ne permettent pas de créer des boites au sens \uml{}, mais simplifient la vie lors du dessin des différents type de diagrammes. \subsection{\cs{umlStack}} \begin{description} \item[Syntaxe] \mbox{} \begin{verbatim} \umlStack[keyOptions]{stackBody} \end{verbatim} permet de mettre du texte sur plusieurs lignes dans un boite sans avoir d'espace supplémentaire en utilisant un environnememt \texttt{tabular}. Par rapport à la commande \LaTeX{} \cs{shortstack}, l'espacement entre ligne n'est pas nul et est régulier. \item[Paramètres (un seul)] \mbox{} \begin{description} \item[\texttt{stackBody} :] corps de la boite. Il peut contenir plusieurs lignes séparées par |\\|. \end{description} \item[Options] \mbox{} \begin{description} \item[\texttt{umlStackSep} (dim : 0)] : distance de séparation entre le contenu de la boite et le bord (pour une frame éventuelle). Cette option utilise d'une part l'option \texttt{tabcolsep} de \texttt{tabular} pour régler l'espacement sur les bords verticaux, et d'autre part des \texttt{strut} pour rajouter des espacements horizontaux avant la première ligne et après la dernière ligne. \item[\texttt{umlStackWidth} (dim : 0)] : largeur de la boite. La valeur 0 indique une largeur automatique en fonction du contenu. \item[\texttt{umlStackLinesStretch} (réel : 0.85)] : écart relatif de l'espace interligne par rapport à un tableau normal. La valeur par défaut de 0.85 permet de tasser suffisamment tout en permettant une marge pour absorber les différences de profondeur ou de hauteur des différentes lettres (x, g, j, h, t, ...) \item[\texttt{umlAlign} (l, c, r : c)] : alignement horizontal du texte à l'intérieur de la boite. \item[\texttt{umlPos} (t, c, b : c)] : alignement vertical de la boite par rapport à la ligne de base. \end{description} \item[Bug] \mbox{} \item[\`A faire] \mbox{} \item[Exemples 1 : comparaison de \cs{umlStack}, \cs{shortstack} et \texttt{tabular}] \mbox{} Dans les exemples suivants, les \cs{umlStack} utilsée sont entourée d'une \cs{fbox} ayant une \cs{fboxsep} nulle de façon à bien visualiser les limites réelles de la boite produite. \begin{SideBySideExample}[xrightmargin=6cm] +% \setlength{\fboxsep}{0pt}\fbox{% \umlStack{Ceci est \\ un \\ exemple \\ de stack}% }+% \end{SideBySideExample} \begin{SideBySideExample}[xrightmargin=6cm] +% \setlength{\fboxsep}{0pt}\fbox{% \shortstack{Ceci est \\ un \\ exemple \\ de stack}% }+% \end{SideBySideExample} \begin{SideBySideExample}[xrightmargin=6cm] +% \setlength{\fboxsep}{0pt}\fbox{% \begin{tabular}{c} Ceci est \\ un \\ exemple \\ de stack \end{tabular}% }+% \end{SideBySideExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 2 : utilisation des options] \mbox{} \begin{SideBySideExample}[xrightmargin=6cm] +\setlength{\fboxsep}{0pt}\fbox{% \umlStack[ umlStackSep=1.5ex, umlAlign=r, umlPos=t, umlStackLinesStretch=.9, ]% {Ceci est \\ un \\ autre \\ exemple \\ de stack}% }+ \end{SideBySideExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \item[Exemples 3 : bug avec alignement à droite et largeur imposée] \mbox{} \begin{SideBySideExample}[xrightmargin=6cm] +\setlength{\fboxsep}{0pt}\fbox{% \umlStack[ umlStackWidth=4, umlStackSep=1.5ex, umlAlign=r, ]% {Ceci est \\ un \\ autre \\ exemple \\ de stack}% }+ \end{SideBySideExample} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Positionnement des objets} Le placement des différents objets peut se faire selon quatre méthodes : \begin{itemize} \item soit en utilisant les positions absolues dans un environnememnt |psgraphics| à l'aide de la commande \cs{rput} pour placer les objets et \cs{rnode} pour leur affecter un nom de noeud (en vue d'une future référence pour les connexions) ; \item soit à l'aide des commandes de haut niveau fournie par \pstricks{} à savoir l'environnement |psmatrix| et la commande \cs{pstree} ; \item soit à l'aide de commandes de placement relatif fournies par \pstuml{} (Merci à Denis \textsc{Girou}) ; \item soit tout simplement dans le texte comme dans certains exemples montrés précédement (en mode LR au sens \LaTeX{}). \end{itemize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Utilisation de \texttt{psgraphics} et \cs{rput}} Il consiste à plasser les boîtes (précédemment créés ou non) dans un environnement \texttt{pspicture} à l'aide des commandes \cs{rput}. La macro \cs{psgrid} (compte tenu des options prédéfinies par le package \pstuml{}) permet de visualiser une grille de 1cm de coté. Cette grille pourra être commentée une fois la mise au point de la figure terminée. Dans cet exemple, les objets sont créés au moment du placement car il sont simples. On remarque la création (par \cs{psdot})d'un noeud ponctuel "pnode1" invisible sur le graphique, mais qui pourra être utilisé comme point de connexion intermédiaire (le petit cercle n'est là que pour sa visualisation). \begin{CenterExample} % positionnement des classes \begin{pspicture}(17,5)\psgrid \rput(3,3){\rnode{Objet1}{\umlClass{Objet 1}{}}} \pnode(16.5,4.5){pnode1}\psdot(pnode1)% pour visu \rput(9,4){\rnode{Objet2}{\umlClass{Objet 2}{}}} \rput(2,1){\rnode{Objet3}{\umlClass{Objet 3}{}}} \rput(12,1){\rnode{Objet4}{\umlClass{Objet 4}{}}} \rput(5.5,1.5){\rnode{Objet5}{\umlClass{Objet 5}{}}} % \rput(15,2.5){\rnode{Objet6}{\umlActor{Objet6}}} \end{pspicture} % \end{CenterExample} % \clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Utilisation de \texttt{psmatrix}} % % Ceci est un paragraphe avant psmatrix. % % Les boites précédemment définies peuvent être positionnées à l'aide des macros de haut niveau de \pstricks{} telles que les environnements \texttt{psmatrix} ou \texttt{psTree}. Ces macro sont plus simples à utiliser, mais sont moins souple au niveau du placement. Voici un exemple de placement utilisant l'environnement \texttt{psmatrix}. On peut remarquer l'utilisation d'une longueur négative pour la séparation des colonnes, ainsi que le changement possible de la longueur d'une seule colonne. De même, un changement d'espacement pour une ligne particulière peut se faire par \verb:\\[2cm]: ou même \verb:\\[-1cm]:. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{CenterExample} \psshadowbox[framesep=0]{ \begin{psmatrix}[rowsep=0.3,colsep=-0.5,mnode=r] % Dessin de classes predefinies [name=Chose1] Chose 1 & & & [colsep=2,name=P1] \\ & [name=Chose2] \pscirclebox{Chose 2} \\[2cm] [name=Chose3] \umlClass{Chose 3}{} & & [name=Chose4] Chose 4 \end{psmatrix} % Visualisation d'un moeud ponctuel invisible par un X : \ncput{pnode1}{$\times$} } \end{CenterExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Utilisation des commandes de placement relatif} Les lettre E, N, W et S sont utilisés à la place de Right, Left, ... pour des raisons de cohérence avec les commandes de connexion du style \cs{ncNE} vues plus loin. Les commandes de gestion du placement relatif sont les suivantes : \begin{itemize} \item affectation en absolu du point courant par rapport à l'origine (fixée à (0,0) pour l'instant) : \cs{ResetXY}, \cs{SetX}, \cs{SetY}, \cs{SetXY} en cours) ; \item accés au point courant par \cs{X} et \cs{Y} ; \item les commandes de base : \cs{incrX}, \cs{incrY} (sont utilisées par les quatre suivantes) ; \item les déplacements relatifs \cs{moveE}, \cs{moveN}, \cs{moveW}, \cs{moveS} ; \item positionnement d'un objet au point courant \cs{rputXY}. \item A FAIRE \cs{SetXY} pour l'affectation absolue du point courant à partir d'une cordonnée d'un nom de node mémorisé. Je n'ai pas trouvé la commande interne à \pstricks{} permettant de convertir les coordonnées à partir d'un nom d'un node en coordonnées X ou Y pour le point courant : (help) ; \item A FAIRE \cs{setOri} pour changer la position de l'origine. Cela affecte donc les commandes de positionnement absolues telles que \cs{resetXY}. Le but est d'affecter l'origine à un noeud précédement créé par un \cs{pnode} ou autre \cs{rnode} ; Note : vérifier si l'option \texttt{origin=\{coor\}} de \pstricks{} ne conviendrait pas ! \item A FAIRE \cs{move} (vers une direction incrémentale arbitraire pouvant utiliser les coordonnées polaires ; \end{itemize} \begin{SideBySideExample}[xrightmargin=7cm] \begin{pspicture}(-3,-3)(3,3)\psgrid \ResetXY % X and Y are rest at startup \rputXY{\pscirclebox{1}} \moveE{2} \rputXY{\pscirclebox{2}} \moveN{2} \rputXY{\pscirclebox{3}} \moveW{2} \rputXY{\pscirclebox{4}} \moveW{2} \rputXY{\pscirclebox{5}} \moveS{2} \rputXY{\pscirclebox{6}} \moveS{2} \rputXY{\pscirclebox{7}} \moveE{2} \rputXY{\pscirclebox{8}} \moveE{2} \rputXY{\pscirclebox{9}} \end{pspicture} \end{SideBySideExample} \begin{SideBySideExample}[xrightmargin=7cm] \begin{pspicture}(-3,-5)(3,5)\psgrid % \ResetXY % Don't forget ! % \rputXY{\psovalbox{1: start}} % % mixing absolute and relative coords \SetX{2}\SetY{2}\moveN{2} \rputXY{\psframebox[linewidth=2pt]{Pos2}} % % use of negative coord, and coord with % explicit units (10mm) \moveW{4}\moveS{4}\moveE{-10mm}\moveE{1} \rputXY{\Large 3} % use of current coord X and Y as params % for not using "\rputXY" % (or for calcul : to be tested) : \pscircle(\X,\Y){0.5} % % memorisation par un node \moveE{4}\moveN{2} \rputXY{\pnode{P4}} \rputXY{P4} \rputXY{\pscircle{0.5}} % % mixing absolute (SetX) and relative (moveN) \SetX{-1.5}\moveN{1.5} \rputXY{\pscirclebox{UN CERCLE}} % % use of current coord X and Y in calcul % (doesn't work yet) : \SetX{-2}\SetY{-2.5} % \pssetlength allows \X+2 insteed of \X+2cm \newlength{\tmpX}\setlength{\tmpX}{\X} \newlength{\tmpY}\setlength{\tmpY}{\Y} \psaddtolength{\tmpX}{5} \psaddtolength{\tmpY}{1} \rputXY{\pscircle{0.1}} % at curent point \rputXY{% \psframe(0,0)(\tmpX,\tmpY)% } % % acces direct to a memorised point % NOT YET DONE % \SetXY{P4} % \rputXY{\pscirclebox{UN CERCLE}} % \end{pspicture} \end{SideBySideExample} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Les connecteurs orthogonaux} En plus des divers connecteurs proposés par \pstricks{} tels que \cs{ncline}, \cs{ncbar}, \cs{ncdiag}, \cs{ncdiagg}, \cs{ncangle}, \cs{ncangles} et \cs{nccurve} ; \pstuml{} propose un certain nombre de connecteurs basés sur les précédents (par \cs{newpsobject}). Le but est de simplifier le tracé des liens en se restreingnant aux directions horizontales et verticales. Le principe est d'indiquer dans le nom même de la commande le nombre de segments à tracer et leur direction.\\ Par exemple, la première lettre (\texttt{E} dans \cs{ncEVW}) indique que le segment part vers l'Est, tourne verticalement (\texttt{V} : vers le haut ou vers le bas) puis tourne vers l'Ouest \texttt{W} pour se connecter. \begin{itemize} \item E, W, N, S pour Est, West, North, Sud, \item H, V pour Horizontal et Vertical, \item D pour diagonal, \item X pour indifférent. \end{itemize} \bigskip\noindent Les commandes suivantes sont proposées : \begin{itemize} \item un seul segment : \cs{ncE} \cs{ncW} \cs{ncN} \cs{ncS} \item deux segments : \cs{ncEN} \cs{ncES} \cs{ncWN} \cs{ncWS} \cs{ncNE} \cs{ncNW} \cs{ncSE} \cs{ncSW} \item trois segment en U : \cs{ncEVW} \cs{ncWVE} \cs{ncSHN} \cs{ncNHS} \item trois segments en Z : \cs{ncEVE} \cs{ncWVW} \cs{ncNHN} \cs{ncSHS} \item trois segments en diagonale : \cs{ncEDE} \cs{ncWDW} \cs{ncNDN} \cs{ncSDS} \item quatre segments (voir trois) : \cs{ncSXE} \cs{ncSXW} \cs{ncEXS} \cs{ncEXN} \cs{ncWXS} \cs{ncWXN} \cs{ncNXE} \cs{ncNXW} \end{itemize} \subsubsection*{Bug} La position par défaut des labels (utilisée par des \cs{naput}...) peut être affectée : dans ce cas imposer le positionnement explicitement par : |\ncE{nodeA}{nodeB}\naput[npos=0.5]{myLabel}| De même, dans les commandes à trois segments, quatre segments sont réellement dessinés : en cas de problème de positionnement des labels, il peut être utile d'imposer |armB=0| (en attendant un raffinement de ces commandes orthogonales). \subsection*{Exemples 1} A FAIRE (voir listing de dessin de classe ci-aprés) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Essais d'icones "flèches" sur des courbes} Après des tentatives infructueuses (pour l'instant) de définir de nouvelle vraie flèche au sens \pstricks{} (sans passer par postscript : en n'utilisant que des commande \TeX{}), je propose une commande \cs{ncputicon} basée sur la command \cs{ncput}. Par défaut, l'icone est positionnée en début de connecteur (cf. Bug ci-dessous) \subsection*{Bug} \subsection*{\`A faire} Je souhairais que par défaut l'icone soit positionnée en fin de connecteur en mettant par exemple |\psset{npos=5}|. Cela ne marche pas pour tous les connecteurs (les \cs{ncline} et les \cs{nccurve}). C'est pour cette raison que la position par défaut est en début de connecteur (peut-être existe-t-il une variable \pstricks\ qui indique le nombre total de segments présents dans le dernier connecteur utilisé ??). \subsection*{Exemples 1} \begin{SideBySideExample}[xrightmargin=6cm] \begin{pspicture}(0,0)(5,5)\psgrid \rput[bl]{30}(0.5,0){\rnode{Node1}{% \psframebox{\Large Node1}}} \rput[tr]{45}(4.5,4){\rnode{Node2}{% \psframebox{\Large Node2}}} \nccurve[angleA=-45,angleB=135]{Node1}{Node2} \ncput[nrot=:U,npos=0.8]{mylabel} \ncputicon{umlHerit} \nccurve[angleA=-30,angleB=-90]{Node2}{Node1} \ncputicon{umlAgreg} \nccurve[angleA=135,angleB=-135]{Node1}{Node2} \ncputicon{umlCompos} \ncputicon[nrot=:U,npos=0.7]{umlV} \end{pspicture} \end{SideBySideExample} % \subsection*{Exemples 2} % A FAIRE (voir listing de dessin de classe ci-aprés) % % \section{Principales commandes \pstricks{} utilisées (A FAIRE)} \appendix \section{Exemple de diagramme de classe} \input{diagClass.tex} \VerbatimInput[gobble=0]{diagClass.tex} % % % % % % % % % \end{document} \section{Exemple de diagramme des cas d'utilisation} \input{diagCase.tex} \VerbatimInput[gobble=0]{diagCase.tex} \section{Exemple de diagramme de séquences} \input{diagSeq.tex} \VerbatimInput[gobble=0]{diagSeq.tex} \section{Exemple de diagramme d'états} \input{diagState.tex} \VerbatimInput[gobble=0]{diagState.tex} \section{Listing du package \texttt{pst-uml.sty}} \VerbatimInput[baselinestretch=0.9,fontsize=\small, gobble=0]{pst-uml.sty}\label{verylast} %\small %\VerbatimInput{test.sty}\label{verylast} \mbox{} \end{document}