% !TeX encoding = utf8
%  !TeX spellcheck = fr
\NeedsTeXFormat{LaTeX2e}[1999/01/01]
\ProvidesPackage{schemabloc}[version 1.9]

\RequirePackage{ifthen}
\RequirePackage{tikz}

\usetikzlibrary{shapes,arrows,positioning,fit}

%macros dessin des schéma-blocs mise à jour 11 mars 20013
% version 1.6

%initialisation des styles
\tikzset{blocstyle/.style={draw, rectangle,
   minimum height=3em, minimum width=3em,right}
   }

\tikzset{sbStyleLien/.style={->,>=latex'},
sbStyleBloc/.style={draw, rectangle},
sbStyleBlocPatate/.style={},
sbStyleSum/.style={}
}
%\tikzstyle{sbStyleLien}=[,]
%\tikzstyle{sbStyleBloc}=[draw, rectangle,]
%\tikzstyle{sbStyleBlocPatate}=[]
%\tikzstyle{sbStyleSum}=[ ]%style Sum CC
% Commandes de changement de style
\newcommand{\sbStyleLienDefaut}{
%\tikzstyle{sbStyleLien}=[->,>=latex']
\tikzset{sbStyleLien/.style={->,>=latex'}}
}
\newcommand{\sbStyleLien}[1]{
\tikzset{sbStyleLien/.style={->,>=latex',#1}}
%\tikzstyle{sbStyleLien}+=[#1]
}

\newcommand{\sbStyleBloc}[1]{
\tikzset{sbStyleBloc/.style={#1}}
%\tikzstyle{sbStyleBloc}+=[#1]
}
\newcommand{\sbStyleBlocDefaut}{
\tikzset{sbStyleBloc/.style={draw, rectangle}}
%\tikzstyle{sbStyleBloc}=[draw, rectangle,]
}

\newcommand{\sbStyleSum}[1]{
\tikzset{sbStyleSum/.style={#1}}
%\tikzstyle{sbStyleSum}+=[#1]
}

\newcommand{\sbStyleSumDefaut}{
\tikzstyle{sbStyleSum}=[draw, circle,]
}%style Sum default CC


% Commandes d'entrée et sortie
\newcommand{\sbEntree}[2][0,0]{
   \node [coordinate, name=#2] at (#1) {};
\sbDecaleNoeudx[0]{#2}{#2}
}

\newcommand{\sbEntrees}[2][0,0]{
   \node [coordinate, name=#2] at(#1) {};
\sbDecaleNoeudx[0]{#2}{#2}
}
\newcommand{\sbSortie}[3][2]{
   \node [coordinate, right of=#3droite, node distance=#1em,%
minimum size=0em,right] (#2) {};
}

\newcommand{\sbSortieL}[3][2]{
   \node [coordinate, right of=#3droite, node distance=#1em,%
minimum size=0em,right] (#2) {};
\sbRelier{#3}{#2}
}

%Commandes de Bloc
\newcommand{\sbBloc}[4][2]{
\node [blocstyle, right of = #4droite,
node distance=#1em,sbStyleBloc,right] (#2) {#3};
\coordinate (#2droite) at (#2.east);
%\coordinate (BlocdeFindroite) at (#2.east);
}

\newcommand{\sbBlocPatate}[4][2]{
\node [draw, cloud, cloud puffs=5, draw,
   minimum height=3em, minimum width=5em, right of = #4droite,
node distance=#1em,sbStyleBlocPatate,right] (#2) {#3};
\coordinate (#2droite) at (#2.east);
}

\newcommand{\sbBlocr}[4][2]{
\node [blocstyle, left of = #4gauche,
node distance=#1em, sbStyleBloc,left] (#2) {#3};
\coordinate (#2gauche) at (#2.west);
}

\newcommand{\sbBlocL}[4][2]{
\node [blocstyle, right of = #4droite,node distance=#1em%
,sbStyleBloc,right] (#2) {#3};
\coordinate (#2droite) at (#2.east);
\coordinate (BlocdeFindroite) at (#2.east);
\draw [sbStyleLien,auto] (#4) --  (#2) node[midway](#4-#2){};
}

\newcommand{\sbBlocrL}[4][2]{
\node [draw, rectangle,
   minimum height=3em, minimum width=3em, left of = #4gauche,
node distance=#1em, sbStyleBloc,left] (#2) {#3};
\node (#2gauche) at (#2.west){};
\node (BlocdeFingauche) at (#2.west){};
\draw [sbStyleLien,auto] (#4) --  (#2)node[name=#4-#2] {};
}

\newcommand{\sbBlocseul}[4][1.5]{
\sbEntree{E1}
\sbBloc[#1]{Blocseul}{#3}{E1}
\sbSortie[#1]{S1}{Blocseul}
\sbRelier[#2]{E1}{Blocseul}
\sbRelier[#4]{Blocseul}{S1}
}

%\Commande de lien
\newcommand{\sbRelier}[3][]{
\draw [sbStyleLien,auto] (#2) --
  (#3)node[pos=0.5,name=#2-#3]{#1}coordinate[pos=0.25,name=#2-#3-1]coordinate[pos=0.75,name=#2-#3-2];
}

\newcommand{\sbRelieryx}[2]{
\draw [sbStyleLien] (#1.south) --   (#1.south  |-#2) --(#2)  ;
}

\newcommand{\sbRelierxy}[3][]{
\draw [sbStyleLien] (#2)  -|    (#3) coordinate[name=#2-#3-1,pos=0.25]
node[name=#2-#3,near end,right] {#1} ;
}

\newcommand{\sbRenvoi}[4][4]{
\node [below =#1em of #2, minimum size=0em](retour#2) {};
\draw [sbStyleLien] (#2.south)--(retour#2.south)   -|    (#3)node[name=#2-#3,near end,right] {#4} ;
}

\newcommand{\sbNomLien}[3][0.4]{
\node[above of=#2, node distance=#1em] (#2nom) at (#2) {#3};
}
%Commande comparateurs et sommateurs

\newcommand*{\sbCompSum}{\@ifstar\sbCompSumNorm\sbCompSumUsuel}

\newcommand*{\sbCompSumr}{\@ifstar\sbCompSumNormr\sbCompSumUsuelr}


\newcommand{\sbCompSumUsuel}[7][4]{
   \node [draw, circle,minimum size=2em, right of=#3droite%
,sbStyleSum,node distance=#1em] (#2) {};
        \node [draw,sbStyleSum, cross out,minimum size=1.414em,
        right of=#3droite,node distance=#1em] {};
        \node [above of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#4$};
        \node [below of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#5$};
        \node [left of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#6$};
        \node [right of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#7$};
\node (#2droite) at (#2.east){};
\node (#2gauche) at (#2.west){};
}



\newcommand{\sbCompSumUsuelr}[7][4]{
   \node [draw, circle,minimum size=2em, left of=#3gauche%
,sbStyleSum,node distance=#1em] (#2) {};
        \node [draw,sbStyleSum, cross out,minimum size=1.414em,%
left of=#3gauche,node distance=#1em] {};
        \node [above of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#4$};
        \node [below of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#5$};
        \node [left of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#6$};
        \node [right of=#2,node distance=0.6em,sbStyleSum,inner sep=0] {$#7$};
\node (#2droite) at (#2.east){};
\node (#2gauche) at (#2.west){};
}

\newcommand{\sbCompSumNorm}[7][4]{
   \node [draw, circle,minimum size=1.5em, right of=#3,sbStyleSum,node distance=#1em,,sbStyleSum] (#2) {};
   \node [ fit=(#2),inner sep=0.5em] (compext)  {};
\node at( compext.75){$#4$};
\node at( compext.-75){$#5$};
\node at( compext.165){$#6$};
\node at( compext.15){$#7$};
\node (#2droite) at (#2.east){};
\node (#2gauche) at (#2.west){};
}

\newcommand{\sbCompSumNormr}[7][4]{
   \node [draw, circle,minimum size=1.5em, left of=#3%
,sbStyleSum,node distance=#1em,,sbStyleSum] (#2) {};
   \node [ fit=(#2),inner sep=0.5em] (compext)  {};
\node at( compext.75){$#4$};\node at( compext.-75){$#5$};\node at( compext.165){$#6$};\node at( compext.15){$#7$};
\node (#2droite) at (#2.east){};
\node (#2gauche) at (#2.west){};
}

\newcommand{\sbSum}[6][4]{
   \node [draw, circle,minimum size=1.5em, right of=#3,node distance=#1em,
label=175:$#4$,label=-85:$#5$,label=85:$#6$,sbStyleSum] (#2) {};
\node (#2droite) at (#2.east){};
\node (#2gauche) at (#2.west){};
}

\newcommand*{\sbComp}{\@ifstar\sbCompNorm\sbCompUsuel}
\newcommand{\sbCompUsuel}[3][4]{
\sbCompSum[#1]{#2}{#3}{}{-}{+}{}
}
\newcommand{\sbCompNorm}[3][4]{
\sbCompSum*[#1]{#2}{#3}{}{-}{+}{}
}

\newcommand*{\sbCompr}{\@ifstar\sbCompNormr\sbCompUsuelr}
\newcommand{\sbCompUsuelr}[3][4]{
\sbCompSumr[#1]{#2}{#3}{}{-}{}{+}
}
\newcommand{\sbCompNormr}[3][4]{
\sbCompSumr*[#1]{#2}{#3}{}{-}{}{+}
}

\newcommand*{\sbCompL}{\@ifstar\sbCompNormL\sbCompUsuelL}
\newcommand{\sbCompUsuelL}[3][4]{
\sbCompSum[#1]{#2}{#3}{}{-}{+}{}
\sbRelier[]{#3}{#2}
}
\newcommand{\sbCompNormL}[3][4]{
\sbCompSum*[#1]{#2}{#3}{}{-}{+}{}
\sbRelier[]{#3}{#2}
}

\newcommand*{\sbCompLr}{\@ifstar\sbCompNormLr\sbCompUsuelLr}
\newcommand{\sbCompUsuelLr}[3][4]{
\sbCompSumr[#1]{#2}{#3}{}{-}{}{+}
\sbRelier[]{#3}{#2}
}
\newcommand{\sbCompNormLr}[3][4]{
\sbCompSumr*[#1]{#2}{#3}{}{-}{}{+}
\sbRelier[]{#3}{#2}
}

\newcommand*{\sbComph}{\@ifstar\sbComphNorm\sbComphUsuel}
\newcommand{\sbComphUsuel}[3][4]{
\sbCompSum[#1]{#2}{#3}{-}{}{+}{}
}
\newcommand{\sbComphNorm}[3][4]{
\sbCompSum*[#1]{#2}{#3}{-}{}{+}{}
}

\newcommand*{\sbComphr}{\@ifstar\sbComphNormr\sbComphUsuelr}
\newcommand{\sbComphUsuelr}[3][4]{
\sbCompSumr[#1]{#2}{#3}{-}{}{}{+}
}

\newcommand{\sbComphNormr}[3][4]{
\sbCompSumr*[#1]{#2}{#3}{-}{}{}{+}
}

\newcommand*{\sbSumh}{\@ifstar\sbSumhNorm\sbSumhUsuel}
\newcommand{\sbSumhUsuel}[3][4]{
\sbCompSum[#1]{#2}{#3}{+}{}{+}{}
}
\newcommand{\sbSumhNorm}[3][4]{
\sbCompSum*[#1]{#2}{#3}{+}{}{+}{}
}

\newcommand*{\sbSumhr}{\@ifstar\sbSumhNormr\sbSumhUsuelr}
\newcommand{\sbSumhUsuelr}[3][4]{
\sbCompSumr[#1]{#2}{#3}{+}{}{}{+}
}
\newcommand{\sbSumhNormr}[3][4]{
\sbCompSumr*[#1]{#2}{#3}{+}{}{}{+}
}

\newcommand*{\sbSumb}{\@ifstar\sbSumbNorm\sbSumbUsuel}
\newcommand{\sbSumbUsuel}[3][4]{
\sbCompSum[#1]{#2}{#3}{}{+}{+}{}
}
\newcommand{\sbSumbNorm}[3][4]{
\sbCompSum*[#1]{#2}{#3}{}{+}{+}{}
}

\newcommand*{\sbSumbr}{\@ifstar\sbSumbNormr\sbSumbUsuelr}
\newcommand{\sbSumbUsuelr}[3][4]{
\sbCompSumr[#1]{#2}{#3}{}{+}{}{+}
}
\newcommand{\sbSumbNormr}[3][4]{
\sbCompSumr*[#1]{#2}{#3}{}{+}{}{+}
}


%Commandes de d�calage de noeud

\newcommand{\sbDecaleNoeudy}[3][5]{
\node [below of=#2, node distance=#1em, minimum size=0em](#3) {};
\node (#3droite) at (#3){};
\node (#3gauche) at (#3){};
}

\newcommand{\sbDecaleNoeudyZ}[3][5]{
\node [below of=#2, minimum size=0em,inner sep=0](#3) {};
\node (#3droite) at (#3){};
\node (#3gauche) at (#3){};
}
\newcommand{\sbDecaleNoeudx}[3][5]{
\node [right of=#2, node distance=#1em, minimum size=0em](#3) {};
\node (#3droite) at (#3){};
\node (#3gauche) at (#3){};
}

\newcommand{\sbDecaleNoeudxy}[4]{
\sbDecaleNoeudy[#2]{#3}{#4}
\sbDecaleNoeudx[#1]{#4}{4}
}


%==============Chaînes et Boucles===========

\newcommand{\sbChaine}[3][4]{
\foreach \x/\y [remember=\x as \lastx (initially #2)] in {#3}
{\sbBlocL[#1]{\x}{\y}{\lastx}
}
}


\newcommand{\sbChaineComp}[3][4]{
\sbDecaleNoeudx[2]{#2}{V#2}
\sbComp[#1]{Comp#2}{V#2}\sbRelier{#2}{Comp#2}
\sbChaine[#1]{Comp#2}{#3}
}

\newcommand{\sbChaineRetour}[3][4]{
\foreach \x/\y [remember=\x as \lastx (initially #2)] in {#3}
{\sbBlocrL[#1]{\x}{\y}{\lastx}
}
}


\newcommand{\sbBoucleSeule}[4][4]{
\sbDecaleNoeudx[2]{#2}{V#2}
\sbComp[#1]{Comp#2}{V#2}\sbRelier{#2}{Comp#2}
\sbChaine[#1]{Comp#2}{#3}
\sbSortie[#1]{#4}{BlocdeFin}
\draw [sbStyleLien,auto] (BlocdeFindroite.base) --
(#4) node[pos=0.5,name=FindeChaine-#4] {};
\sbRenvoi{FindeChaine-#4}{Comp#2}{}
}


\newcommand{\sbBoucle}[3][4]{
\sbComp[#1]{Comp#2}{#2}\sbRelier{#2}{Comp#2}
\sbChaine[#1]{Comp#2}{#3}
\draw [sbStyleLien,auto,-] (BlocdeFindroite.base) --++(1em,0)%
coordinate[name=FindeChaine];
\sbRenvoi{FindeChaine}{Comp#2}{}
}

\newcommand{\sbBoucleRetour}[4][4]{
\sbDecaleNoeudx[2]{#2}{V#2}
\sbComp[#1]{Comp#2}{V#2}
\sbRelier{#2}{Comp#2}
\sbChaine[#1]{Comp#2}{#3}
\draw [sbStyleLien,auto,-] (BlocdeFindroite.base) --++(1em,0)%
coordinate[name=FindeChaine];
\sbDecaleNoeudy[5]{FindeChaine}{sbDebutRetour}
\sbChaineRetour[#1]{sbDebutRetour}{#4}
\draw [sbStyleLien] (FindeChaine) |- (sbDebutRetour.west) ;
\draw [sbStyleLien] (BlocdeFingauche.base)  --   (BlocdeFingauche.base -|Comp#2) -- (Comp#2) node[name=sbNomRetour,near end,right] {};
}