%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%	Package fast-diagram.sty
%
% Version 1.1 (27/02/13)
% Ce package est destiné à réaliser facilement des diagrammes FAST
% (voir http://fr.wikipedia.org/wiki/Function_Analysis_System_Technique ).
%
% Réalisé par Raphaël ALLAIS (Lycée G.Eiffel de Dijon),
% avec l'importante contribution de Yannick Le Bras (Lycée Montesquieu du Mans)
% et les conseils de Robert Papanicola (Lycée Jacques Amyot d'Auxerre)
% et de Xavier Pessoles (Lycée Rouvière de Toulon).
%
% Ce package est proposé en licence LPPL (LaTeX Project Public License), version 1.3c 2008-05-04.
% Cela implique que vous pouvez UTILISER ce package autant que vous le voulez,
% mais que vous ne pouvez le MODIFIER que SOUS UN AUTRE NOM (créer un dérivé).
% Toutefois, je suis totalement ouvert à toute contribution.
% Je souhaite juste être prévenu si vous souhaitez apporter votre pierre à l'édifice.
%
% Pour toute question/conseil/commentaire/reproche/menace de mort ou autre :
% allais.raphael -arobase- free.fr
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Mise à jour :
% V1.0 (25/02/13) :
%   Uplaod du package "FAST.sty"
% V1.1 (27/02/13) :
%   Renommage du package en "fast-diagram.sty"
%   ainsi que pour l'appel du package (\usepackage{fast-diagram})
%   Changement des noms des commandes (ex : \FASTFT --> \fastFT).
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Entête
%-----------------------------------------
%% Informations générales
%-----------------------------------------
\NeedsTeXFormat{LaTeX2e}[1999/01/01]
\ProvidesPackage{fast-diagram}[2013/02/27]





%% Chargement des extensions
%--------------------------------------
\RequirePackage{tikz}
\RequirePackage{ifthen}
\usetikzlibrary{calc,fit,shapes}
\RequirePackage{relsize}
\RequirePackage{xargs}

\newif\if@fastRaccourcis	\@fastRaccourcisfalse
\DeclareOption{raccourcis}	{\@fastRaccourcistrue}
\ProcessOptions



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Paramètres divers
%--------------------------
%Dimentsions
%........................

\newcommand*{\fastInterligne}		{}	%Longueur d'interligne
\newcommand*{\fastEspaceColonne}		{}	%Espace entre colonne (de coin supérieur droit à coin supérieur droit)
\newcommand*{\fastLargeurBoite}		{}	%Largeur des boites
\newcommand*{\fastHauteurBoite}		{}	%Largeur des boites
\newcommand*{\fastDecalageTrait}		{}	%Décalage des connecteur vers le bas, par rapport au sommet de la boite
\newcommand*{\fastDecalageOuVertical}	{}	%Décalage vertical du connecteur ``OU''
\newcommand*{\fastDecalageOuHorizontal}	{}	%Décalage horizontal du connecteur ``OU''

%Styles
%.........................
\newcommand*{\fastFSarrondi}		{}	%Rayon des arrondis des angles de la boite ``fonction de service'' (la 1ere boite)
\newcommand*{\fastFTarrondi}		{}	%Rayon des arrondis des angles de la boite ``fonction de technique''
\newcommand*{\fastSTarrondi}		{}	%Rayon des arrondis des angles de la boite ``solution technique''
\newcommand*{\fastFSStyle}		{}	
\newcommand*{\fastFTStyle}		{}
\newcommand*{\fastSTStyle}		{}
\newcommand*{\fastFVStyle}		{}
\newcommand*{\fastFStexteStyle}		{}	%Style du texte de la boite ``fonction de service'' (la 1ere boite)
\newcommand*{\fastFTtexteStyle}		{}	%Style du texte de la boite ``fonction de technique''
\newcommand*{\fastSTtexteStyle}		{}	%Style du texte de la boite ``solution technique''
\newcommand*{\fastFVtexteStyle}		{}	%Style du texte de la boite ``vide''
\newcommand*{\fastEpaisseurTraits}	{}	%Epaisseur des traits
%Couleurs
%.......................................
\definecolor{fastCouleurTexteFS}{rgb}{0,0,0}	%Couleur du texte de la boite ``fonction de service'' (la 1ere boite)
\definecolor{fastCouleurBorduresFS}{rgb}{0,0,0}	%Couleur de bordures de la boite ``fonction de service''  (la 1ere boite)
\definecolor{fastCouleurFondFS}{rgb}{1,1,1}	%Couleur de fond de la boite ``fonction de service''  (la 1ere boite)
\definecolor{fastCouleurTexteFT}{rgb}{0,0,0}	%Couleur du texte de la boite ``fonction de technique''
\definecolor{fastCouleurBorduresFT}{rgb}{0,0,0}	%Couleur de bordures de la boite ``fonction de technique''
\definecolor{fastCouleurFondFT}{rgb}{1,1,1}	%Couleur de fond de la boite ``fonction de technique''
\definecolor{fastCouleurTexteST}{rgb}{0,0,0}	%Couleur du texte de la boite ``fonction de service''
\definecolor{fastCouleurBorduresST}{rgb}{0,0,0}	%Couleur de bordures de la boite ``fonction de service''
\definecolor{fastCouleurFondST}{rgb}{1,1,1}	%Couleur de fond de la boite ``fonction de service''
\definecolor{fastCouleurConnecteurs}{rgb}{0,0,0}%Couleur des connecteurs
\definecolor{fastCouleurTexteFV}{rgb}{0,0,0}	%Couleur du texte de la boite ``vide''
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\newcommand*{\fastSetCouleurBordures}[2][named]		%Commande qui change les couleurs de toutes les bordures
	{\definecolor{fastCouleurBorduresFS}{#1}{#2}
	\definecolor{fastCouleurBorduresFT}{#1}{#2}
	\definecolor{fastCouleurBorduresST}{#1}{#2}}

\newcommand*{\fastSetCouleurTexte}[2][named]		%Commande qui change la couleur du texte
	{\definecolor{fastCouleurTexteFS}{#1}{#2}
	\definecolor{fastCouleurTexteFT}{#1}{#2}
	\definecolor{fastCouleurTexteST}{#1}{#2}
	\definecolor{fastCouleurTexteFV}{#1}{#2}}

\newcommand*{\fastSetCouleurFond}[2][named]		%Commande qui change la couleur de tous les fonds de boite
	{\definecolor{fastCouleurFondFS}{#1}{#2}
	\definecolor{fastCouleurFondFT}{#1}{#2}
	\definecolor{fastCouleurFondST}{#1}{#2}}

\newcommand*{\fastSetCouleurConnecteurs}[2][named]	%Commande qui change la couleur du texte
	{\definecolor{fastCouleurConnecteurs}{rgb}{#1}}

\newcommand*{\fastSetCouleurTraits}[2][named]		%Commande qui change la couleur à la fois des bordures et des connecteurs
	{\fastSetCouleurConnecteurs[#1]{#2}
	\fastSetCouleurBordures[#1]{#2}}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Commandes internes
%-----------------------------

\newcommand*{\fastReset}	%Remet tous les paramètres à zéro (utilisé une fois au début pour initialisé)
	{
		\renewcommand*{\fastInterligne}			{0.5em}
		\renewcommand*{\fastEspaceColonne}		{10em}
		\renewcommand*{\fastLargeurBoite}		{7em}
		\renewcommand*{\fastHauteurBoite}		{0}
		\renewcommand*{\fastDecalageTrait}		{-0.6em}
		\renewcommand*{\fastDecalageOuVertical}		{0.4em}
		\renewcommand*{\fastDecalageOuHorizontal}	{-0.4em}
		\renewcommand*{\fastFSarrondi}			{0em}
		\renewcommand*{\fastFTarrondi}			{0em}
		\renewcommand*{\fastSTarrondi}			{0.5em}
		\renewcommand*{\fastEpaisseurTraits}		{0.05em}

		\renewcommand*{\fastFStexteStyle}	{\scalefont{1}\selectfont\bfseries}
		\renewcommand*{\fastFTtexteStyle}	{\smaller}
		\renewcommand*{\fastSTtexteStyle}	{\smaller\itshape}
		\renewcommand*{\fastFVtexteStyle}	{}
		\renewcommand*{\fastFSStyle}		{}
		\renewcommand*{\fastFTStyle}		{}
		\renewcommand*{\fastSTStyle}		{}
		\renewcommand*{\fastFVStyle}		{}
		

		\definecolor{fastCouleurTexteFS}{rgb}{0,0,0}	%Couleur du texte de la boite ``fonction de service'' (la 1ere boite)
		\definecolor{fastCouleurBorduresFS}{rgb}{0,0,0}	%Couleur de bordures de la boite ``fonction de service''  (la 1ere boite)
		\definecolor{fastCouleurFondFS}{rgb}{1,1,1}	%Couleur de fond de la boite ``fonction de service''  (la 1ere boite)
		\definecolor{fastCouleurTexteFT}{rgb}{0,0,0}	%Couleur du texte de la boite ``fonction de technique''
		\definecolor{fastCouleurBorduresFT}{rgb}{0,0,0}	%Couleur de bordures de la boite ``fonction de technique''
		\definecolor{fastCouleurFondFT}{rgb}{1,1,1}	%Couleur de fond de la boite ``fonction de technique''
		\definecolor{fastCouleurTexteST}{rgb}{0,0,0}	%Couleur du texte de la boite ``fonction de service''
		\definecolor{fastCouleurBorduresST}{rgb}{0,0,0}	%Couleur de bordures de la boite ``fonction de service''
		\definecolor{fastCouleurFondST}{rgb}{1,1,1}	%Couleur de fond de la boite ``fonction de service''
		\definecolor{fastCouleurConnecteurs}{rgb}{0,0,0}%Couleur des connecteurs
		\definecolor{fastCouleurTexteFV}{rgb}{0,0,0}	%Couleur du texte de la boite ``vide''
	}
\fastReset	%On lance le reset une fois au chargement du package pour initialiser toutes les variables.




\newcounter{cptAbscisse} 		%Compteur d'abscisse (a quelle colonne sommes-nous ?) - Sert notamment à nommer les noeuds
\newcounter{cptAbscisseParent} 		%abscisse parent
\newcounter{cptBoite} 			%Compteur de boite (pour leur donner un nom different)
\newlength\posX
\posX=0em
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



\newcommand{\ttt}{\newcommand[1][ddd]{\lolo}{Hello !!!}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Environnement fast
%-----------------------------
\newenvironment{fast}[1]
	{	


		\newcommand*{\fastAvanceColonne}	%Avance à la colonne suivant
		{	\setcounter{cptAbscisseParent}{\thecptAbscisse}	%On enregistre le compteur actuel (qui correspond encore au parent)
			\addtocounter{cptAbscisse}{1}			%puis on décale le compteur d'une colonne
			%\advance \posX by \fastEspaceColonne		%On se décale l'abscisse géométrique d'une colonne
			%\setlength{\posX}{\posX + \fastEspaceColonne}
			\addtolength{\posX}{\fastEspaceColonne}
		}

		\newcommand*{\fastEnregistreMinimum}	% Enregistre la position minimum de la ligne en cours (pour aligner la ligne suivante)
			{	%Attention, c'est compliqué : le but est de chercher le minimum absolu des nodes de la ligne en cours, qui nous servira d'ordonnee pour la ligne suivante
				\coordinate (SudBoite) at ($(noeud \thecptAbscisse.south)+(0,-\fastInterligne)$);%Sud de la boite + interligne
				\node[inner sep=0,fit=(SudBoite) (BoiteMinimums)] (BoiteMinimumsAnnexe) {};	%On cree une boite qui contient le point minimum du node courant ainsi que le dernier minimum enregistré 
				\path let \p1=(BoiteMinimumsAnnexe.south) in coordinate (BoiteMinimums) at (0,\y1) ;	%On enregistre ce minimum dans BoiteMinimums
			}

		\newcommand*{\fastReculeColonne}
			{	%\advance \posX by -\fastEspaceColonne	%On recule l'abscisse géométrique d'une colonne
				\addtolength{\posX}{-\fastEspaceColonne}
				\addtocounter{cptAbscisse}{-1}	%On recule le compteur d'une colonne
			}

		\newcommand*{\fastTraceConnecteurs}[1][]
			{
				\ifthenelse{\equal{##1}{tempo}}	%Option ``tempo''
					{\draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits] (noeud \thecptAbscisse.north) -- ($(noeud \thecptAbscisse.north)+(0,\fastInterligne)$); }{}
		
				\ifthenelse{\equal{##1}{ou}}
					{
						\path ($(noeud \thecptAbscisse.north west)+(\fastDecalageOuHorizontal,\fastDecalageTrait)$) -- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)+(\fastDecalageOuHorizontal,-\fastDecalageOuVertical)$) coordinate[pos=.5] (milieu);	%On cherche le point milieu du connecteur
						\draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits] ($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$) -| (milieu) |- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)+(0,-\fastDecalageOuVertical)$);			%On trace le connecteur en faisant un zig	
					}
					{	\path ($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$) -- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)$) coordinate[pos=.5] (milieu);	%On cherche le point milieu du connecteur
						\draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits]($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$) -| (milieu) |- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)$);			%On trace le connecteur en faisant un zig-zag par le milieu
					}
			}



		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		%Fonction technique
		%---------------------------------------------
		\newcommand*\fastFT[3][]{%Argument 1=option, Argument 2 = contenu de la fonction, Argument 3 = descendance)
				\fastAvanceColonne
				\addtocounter{cptBoite}{1}	%//On incremente le numero de la boite
				\ifthenelse{\equal{##2}{}}%Si la fonction est vide
					{	\node[text width=\fastLargeurBoite,anchor=north west] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {}; %Un node vide (parce que les enfants vont en avoir besoin)
						\draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits]($(noeud \thecptAbscisse.north east)+(0,\fastDecalageTrait)$)--($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$);
						\fastTraceConnecteurs
					}%Si la fonction n'est pas vide
					{	\node[draw,rounded corners=\fastFTarrondi,text width=\fastLargeurBoite,minimum size=\fastHauteurBoite,text centered,anchor=north west,fastCouleurBorduresFT,fill=fastCouleurFondFT,text=fastCouleurTexteFT,line width=\fastEpaisseurTraits,\fastFTStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastFTtexteStyle ##2}; %On écrit le contenu de la fonction}
						\fastTraceConnecteurs[##1]
						\node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom
					}
				##3	%Il s'agit de la descendance passée en argument, et affichée ici.
				\fastEnregistreMinimum
				\fastReculeColonne
		}
		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		%Solution technique
		%---------------------------
		\newcommandx*\fastST[3][1=,3=]{%Argument 1 = option,Argument 2 = contenu de la solution technique)
				\fastAvanceColonne	%On avance d'une colonne
				\addtocounter{cptBoite}{1}	%//On incremente le numero de la boite
				\node[dashed,rounded corners=\fastSTarrondi,draw,text width=\fastLargeurBoite,minimum size=\fastHauteurBoite,line width=\fastEpaisseurTraits,text centered,anchor=north west,fastCouleurBorduresST,fill=fastCouleurFondST,text=fastCouleurTexteST,\fastSTStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastSTtexteStyle ##2}; %On écrit le contenu de la fonction
				\node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom
				\fastTraceConnecteurs[##1]
				##3
				\fastEnregistreMinimum
				\fastReculeColonne
				}
		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		%Boite vide
		%---------------------------
		\newcommandx*\fastVide[3][1=,3=]{%Argument 1 = option,Argument 2 = contenu de la solution technique)
				\fastAvanceColonne	%On avance d'une colonne
				\addtocounter{cptBoite}{1}	%//On incremente le numero de la boite
				\node[text width=\fastLargeurBoite,minimum size=\fastHauteurBoite,text centered,anchor=north west,text=fastCouleurTexteFV,\fastFVStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastFVtexteStyle ##2}; %On écrit le contenu de la fonction
				\node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom
				##3
				\fastEnregistreMinimum
				\fastReculeColonne
				}
		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		%Ligne droite simple
		%---------------------------
		\newcommand*\fastTrait[1]{%
				\fastAvanceColonne
				\node[text width=\fastLargeurBoite,anchor=north west] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {}; %Un node vide (parce que les enfants vont en avoir besoin)
				\draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits] ($(noeud \thecptAbscisse.north east)+(0,\fastDecalageTrait)$)--($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$);
				\fastTraceConnecteurs
				##1	%Il s'agit de la descendance passée en argument, et affichée ici.
				\fastEnregistreMinimum
				\fastReculeColonne
				}
		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

		\if@fastRaccourcis 
			\newcommand*{\FT}[3][]	{\fastFT[##1]{##2}{##3}}
			\newcommandx*{\ST}[3][1=,3=]	{\fastST[##1]{##2}[##3]}
			\newcommandx*{\FV}[3][1=,3=]	{\fastVide[##1]{##2}[##3]}
			\newcommand*{\trait}[1]	{\fastTrait{##1}}
		\fi


		\begin{tikzpicture}		%On commence le dessin
			\setcounter{cptAbscisse}{0}
			\setcounter{cptAbscisseParent}{0}
			\setcounter{cptBoite}{0}
			\posX=0em	%Abscisse des boites (0 au début)
			\coordinate (BoiteMinimums) at (0,0);	%noeud ou coordonnees, dont le south correspond au minimum de la ligne en cours (utile pour positionner la ligne suivante)
			\node[draw,rounded corners=\fastFSarrondi,minimum size=\fastHauteurBoite,line width=\fastEpaisseurTraits,text width=\fastLargeurBoite,text centered,anchor=north west,fastCouleurBorduresFS,fill=fastCouleurFondFS,text=fastCouleurTexteFS,\fastFSStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastFStexteStyle #1}; %Fonction de service que l'on va développer dans ce FAST
			\node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom
			
	}
	{	\end{tikzpicture}	%Fin du dessin

	}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%






%Fin du package
\endinput











