%%%
% Vue Cubes
%%%
\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false}

\newtoks\toklisteVueCube%
\def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}%

\NewDocumentCommand\VueCubes{o m}{%
  \useKVdefault[VueCubes]%
  \setKV[VueCubes]{#1}
  \ifboolKV[VueCubes]{Solution}{%
    \BuildVueCubesSolution%
  }{%
    \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit"
      \ignoreemptyitems%
      \readlist*\PfCListeHauteursCubes{#2}%
      \reademptyitems%
      \toklisteVueCube{}%
      \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}%
      \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}%
    }{%
      \BuildVueCubes{\useKV[VueCubes]{Angle}}{}%
    }%
  }%
}%

\NewDocumentCommand\BuildVueCubes{m m}{%
  \ifluatex
  \mplibforcehmode
  \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}%
  \begin{mplibcode}[\PfCVueCubeNom]
    input PfCSolid;

    intensite:=1.5;

    Ferme[0]:=false;
    outcolor:=\useKV[VueCubes]{CouleurCube};
    incolor:=white;
    nb:=1;subh:=1;
    creux:=true;

    Profondeur:=\useKV[VueCubes]{Profondeur};
    Largeur:=\useKV[VueCubes]{Largeur};
    Hauteur:=\useKV[VueCubes]{Hauteur};
    Phi:=#1;
    Echelle:=\useKV[VueCubes]{Echelle};

    color CouleurFleche;
    CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
    
    boolean Trou,FaceVue,Creation,Grille;
    Trou:=\useKV[VueCubes]{Trou};
    FaceVue:=\useKV[VueCubes]{Face};
    Creation:=\useKV[VueCubes]{Creation};
    Grille:=\useKV[VueCubes]{Grilles};
    
    TotalObj:=0;

    vardef CreationSolide(text t)=
    PfCnbcubes:=0;
    for p_=t:
    m:=(PfCnbcubes div Profondeur);
    k:=(PfCnbcubes mod Profondeur);
    hauteurtour[m+1][k+1]:=p_;
    for l=1 upto hauteurtour[m+1][k+1]:
    TotalObj:=incr TotalObj;
    TR:=(-Echelle*k,(m+1)*Echelle,Echelle*l-Echelle/2);
    ObjetDeplacement[TotalObj](0);
    endfor;
    PfCnbcubes:=incr PfCnbcubes;
    endfor;
    enddef;

    Initialisation(2500,Phi,20,50);
    Objetcube0("a="&decimal(Echelle));
    
    if Creation:
    CreationSolide(#2);
    else:
    for k=1 upto Profondeur:%4 profondeur
    hauteurtour[0][k]:=Hauteur;%5 hauteur totale
    endfor;
    for m=1 upto Largeur:%3 largeur
    for k=1 upto Profondeur:%4 profondeur
    if Trou:
    if m>1:
    hauteurtour[m][k]:=floor(uniformdeviate(hauteurtour[m-1][k]+1));%5 hauteur totale
    else:
    hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale
    fi;
    else:
    hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale
    fi;
    for l=1 upto hauteurtour[m][k]:
    TotalObj:=incr TotalObj;
    TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);
    ObjetDeplacement[TotalObj](0);
    endfor;
    endfor;
    endfor;
    fi;

    % Pour la fleche
    path Fleche;
    color A[];
    if FaceVue:
    A0=Echelle*(1,Largeur/2,0);
    A1-A0=0.25*(2,2,0);
    A2-A1=0.25*(0,-1,0);
    A3-A2=0.25*(2,0,0);
    A4-A3=0.25*(0,-2,0);
    A5-A4=A2-A3;
    A6-A5=A2-A1;
    Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle;
    fill Fleche withcolor CouleurFleche;
    draw Fleche;
    fi;    
    
    nbobj:=TotalObj;
    DessineFusion;

    if Grille:
    % dessus
    color Ad[];
    Ad0=(0.5Echelle,0.5*Echelle,-0.5);
    Ad1-Ad0=(0,Largeur*Echelle,0);
    Ad2-Ad1=(-Profondeur*Echelle,0,0);
    Ad3-Ad2=Ad0-Ad1;
    draw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle;
    for k=1 upto Largeur-1:
    draw Projette((k/Largeur)[Ad0,Ad1])--Projette((k/Largeur)[Ad3,Ad2]);
    endfor;
    for k=1 upto Profondeur-1:
    draw Projette((k/Profondeur)[Ad0,Ad3])--Projette((k/Profondeur)[Ad1,Ad2]);
    endfor;
    % face
    color Af[];
    Af0=(-1-Profondeur*Echelle,0.5*Echelle,0);
    Af1-Af0=(0,Largeur*Echelle,0);
    Af2-Af1=(0,0,Hauteur*Echelle);
    Af3-Af2=Af0-Af1;
    draw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle;
    for k=1 upto Largeur-1:
    draw Projette((k/Largeur)[Af0,Af1])--Projette((k/Largeur)[Af3,Af2]);
    endfor;
    for k=1 upto Hauteur-1:
    draw Projette((k/Hauteur)[Af0,Af3])--Projette((k/Hauteur)[Af1,Af2]);
    endfor;
    % droite
    color Adg[];
    Adg0=(0.5Echelle,-Largeur*Echelle-1,0);
    Adg1-Adg0=(-Profondeur*Echelle,0,0);
    Adg2-Adg1=(0,0,Hauteur*Echelle);
    Adg3-Adg2=Adg0-Adg1;
    draw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle;
    for k=1 upto Profondeur-1:
    draw Projette((k/Profondeur)[Adg0,Adg1])--Projette((k/Profondeur)[Adg3,Adg2]);
    endfor;
    for k=1 upto Hauteur-1:
    draw Projette((k/Hauteur)[Adg0,Adg3])--Projette((k/Hauteur)[Adg1,Adg2]);
    endfor;
    fi;
  \end{mplibcode}
  \ifboolKV[VueCubes]{Grilles}{}{%
    \hspace*{1.5cm}
    \begin{mplibcode}[\PfCVueCubeNom]
      input PfCSolid;
      
      intensite:=1.5;
      
      Ferme[0]:=false;
      outcolor:=\useKV[VueCubes]{CouleurCube};
      incolor:=white;
      nb:=1;subh:=1;
      creux:=true;
      
      Profondeur:=\useKV[VueCubes]{Profondeur};
      Largeur:=\useKV[VueCubes]{Largeur};
      Hauteur:=\useKV[VueCubes]{Hauteur};
      Phi:=#1;
      Echelle:=\useKV[VueCubes]{Echelle};
      
      color CouleurFleche;
      CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
      
      TotalObj:=0;
      
      Initialisation(2500,Phi+90,30,50);
      Objetcube0("a="&decimal(Echelle));
      
      for m=1 upto Largeur:%3 largeur
      for k=1 upto Profondeur:%4 profondeur
      for l=1 upto hauteurtour[m][k]:
      TotalObj:=incr TotalObj;
      TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
      ObjetDeplacement[TotalObj](0);
      endfor;
      endfor;
      endfor;
      
      if Grille:
      undraw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle;
      undraw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle;
      undraw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle;
      fi;
      
      path Fleche;
      if FaceVue:
      Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle;
      fill Fleche withcolor CouleurFleche;
      draw Fleche;
      fi;
      
      nbobj:=TotalObj;
      DessineFusion;
    \end{mplibcode}
  }%
  \fi
}%

\NewDocumentCommand\BuildVueCubesSolution{}{%
  \ifluatex%
  \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}%
  \begin{NiceTabular}{ccc}%
    Vue de face&Vue de dessus&Vue de gauche\\
    {\begin{mplibcode}[\PfCVueCubeNom]
        input PfCSolid;
        
        intensite:=1.5;
        
        Ferme[0]:=false;
        outcolor:=\useKV[VueCubes]{CouleurCube};
        incolor:=white;
        nb:=1;subh:=1;
        creux:=true;
        
        Profondeur:=\useKV[VueCubes]{Profondeur};
        Largeur:=\useKV[VueCubes]{Largeur};
        Hauteur:=\useKV[VueCubes]{Hauteur};
        Phi:=0;
        Echelle:=\useKV[VueCubes]{Echelle};

        color CouleurFleche;
        CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
        
        TotalObj:=0;
        
        Initialisation(2500,Phi,0,50);
        Objetcube0("a="&decimal(Echelle));
        
        for m=1 upto Largeur:%3 largeur
        for k=1 upto Profondeur:%4 profondeur
        for l=1 upto hauteurtour[m][k]:
        TotalObj:=incr TotalObj;
        TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
        ObjetDeplacement[TotalObj](0);
        endfor;
        endfor;
        endfor;
        
        nbobj:=TotalObj;
        DessineFusion;
      \end{mplibcode}}&
    {\begin{mplibcode}[\PfCVueCubeNom]
    input PfCSolid;
    
    intensite:=1.5;
    
    Ferme[0]:=false;
    outcolor:=\useKV[VueCubes]{CouleurCube};
    incolor:=white;
    nb:=1;subh:=1;
    creux:=true;
    
    Profondeur:=\useKV[VueCubes]{Profondeur};
    Largeur:=\useKV[VueCubes]{Largeur};
    Hauteur:=\useKV[VueCubes]{Hauteur};
    Phi:=0;
    Echelle:=\useKV[VueCubes]{Echelle};

    color CouleurFleche;
    CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
    
    TotalObj:=0;
    
    Initialisation(2500,Phi,90,50);
    Objetcube0("a="&decimal(Echelle));
    
    for m=1 upto Largeur:%3 largeur
    for k=1 upto Profondeur:%4 profondeur
    for l=1 upto hauteurtour[m][k]:
    TotalObj:=incr TotalObj;
    TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
    ObjetDeplacement[TotalObj](0);
    endfor;
    endfor;
    endfor;

    nbobj:=TotalObj;
    DessineFusion;
  \end{mplibcode}}&{\begin{mplibcode}[\PfCVueCubeNom]
    input PfCSolid;
    
    intensite:=1.5;
    
    Ferme[0]:=false;
    outcolor:=\useKV[VueCubes]{CouleurCube};
    incolor:=white;
    nb:=1;subh:=1;
    creux:=true;
    
    Profondeur:=\useKV[VueCubes]{Profondeur};
    Largeur:=\useKV[VueCubes]{Largeur};
    Hauteur:=\useKV[VueCubes]{Hauteur};
    Phi:=-90;
    Echelle:=\useKV[VueCubes]{Echelle};

    color CouleurFleche;
    CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
    
    TotalObj:=0;
    
    Initialisation(2500,Phi,0,50);
    Objetcube0("a="&decimal(Echelle));
    
    for m=1 upto Largeur:%3 largeur
    for k=1 upto Profondeur:%4 profondeur
    for l=1 upto hauteurtour[m][k]:
    TotalObj:=incr TotalObj;
    TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
    ObjetDeplacement[TotalObj](0);
    endfor;
    endfor;
    endfor;

    nbobj:=TotalObj;
    DessineFusion;
  \end{mplibcode}}\\
  \end{NiceTabular}%
  \fi%
}%