%%%
% Balance
%%%
\def\filedateBalance{2025/05/28}%
\def\fileversionBalance{0.1c}%
\message{-- \filedateBalance\space v\fileversionBalance}%
%
\newtoks\tokPlateauGauche%
\newtoks\tokPlateauDroit%
\def\UpdatetoksPlateauGauche#1\nil{\addtotok\tokPlateauGauche{#1,}}%
\def\UpdatetoksPlateauDroit#1\nil{\addtotok\tokPlateauDroit{#1,}}%
%
\setKVdefault[Balance]{Inf=false,Sup=false,Masse=false,Traces={},Ecarth=0,Echelle=false,Unite=1cm,Vraisemblance={}}%
%
\NewDocumentCommand\Balance{omm}{%
  \tokPlateauGauche{}%
  \tokPlateauDroit{}%
  \useKVdefault[Balance]%
  \setKV[Balance]{#1}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\ListePlateauGauche{#2}%
  \readlist*\ListePlateauDroit{#3}%
  \reademptyitems%
  \foreachitem\compteur\in\ListePlateauGauche{%
    \expandafter\UpdatetoksPlateauGauche\compteur\nil
  }%
  \foreachitem\compteur\in\ListePlateauDroit{%
    \expandafter\UpdatetoksPlateauDroit\compteur\nil
  }%
  \BuildBalance{\the\tokPlateauGauche}{\the\tokPlateauDroit}%
}%

\NewDocumentCommand\BuildBalance{mm}{%
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[Balance]{Unite};
    ecarth=\useKV[Balance]{Ecarth};
    \ifemptyKV[Balance]{Traces}{}{\useKV[Balance]{Traces};}
    % 
    vardef Poids=
      save poids;
      picture poids;
      poids=image(
        path poidsext;
        poidsext=(0,0)--u*(0.4,0){dir90}..{dir180}(u*(0.2,0.4))..{dir-90}cycle;
        fill poidsext withcolor NavyBlue;
        trace cercles(u*(0.2,0.425),0.1u) withcolor NavyBlue;
      );
      poids
    enddef;

    vardef PoidsM(expr nb)=
      save poids;
      picture poids;
      poids=image(
        path poidsext;
        \ifemptyKV[Balance]{Vraisemblance}{simili:=1+0.5*(nb div 5);}{simili:=\useKV[Balance]{Vraisemblance};}
        poidsext=((0,0)--u*(0.4,0){dir90}..{dir180}(u*(0.2,0.4))..{dir-90}cycle) xscaled simili yscaled simili;
        fill poidsext withcolor NavyBlue;
        trace cercles(simili*u*(0.2,0.425),0.1u) withcolor NavyBlue;
        drawoptions(withcolor white);
        label.top(TEX("\noexpand\tiny\Masse{"&decimal(nb)&"}"),iso((0,0),u*(simili*0.4,0)));
        drawoptions();
      );
      poids
    enddef;

    boolean Sup,Inf,Masse;
    Sup=\useKV[Balance]{Sup};
    Inf=\useKV[Balance]{Inf};
    Masse=\useKV[Balance]{Masse};
    pair O,A,B,M[],N[];
    O=(0,0);
    A=u*(-0.5,0);
    B=u*(0.5,0);
    
    path pathgauche,pathdroite,plateau;
    
    if Inf:
      M1=A+u*(0,0.25);
      N1=B+u*(0,0.75);
    elseif Sup:
      M1=A+u*(0,0.75);
      N1=B+u*(0,0.25);
    else:
      M1=A+u*(0,0.5);
      N1=B+u*(0,0.5);
    fi;

    longgauche=0;
    longdroit=0;
    nbimggauche=0;
    nbimgdroit=0;
    picture Imgg[],Imgd[];
      
    for p_=#1:
      if numeric p_:
        if Masse:
          \ifemptyKV[Balance]{Vraisemblance}{simili:=1+0.5*(p_ div 5);}{simili:=\useKV[Balance]{Vraisemblance};}
          longgauche:=longgauche+u*((simili)*0.4+0.2);
        else:
          longgauche:=longgauche+p_*0.6u;
        fi;
      elseif string p_:
        nbimggauche:=nbimggauche+1;
        Imgg[nbimggauche]=image(%
          label(TEX(p_),(0,0));
        );
        longgauche:=longgauche+abs(lrcorner Imgg[nbimggauche]-llcorner Imgg[nbimggauche])+0.2u;
      else:
        longgauche:=longgauche+abs(lrcorner p_-llcorner p_)+0.2u;
      fi;
    endfor;
    for p_=#2:
      if numeric p_:
        if Masse:
          \ifemptyKV[Balance]{Vraisemblance}{simili:=1+0.5*(p_ div 5);}{simili:=\useKV[Balance]{Vraisemblance};}
          longdroit:=longdroit+u*((simili)*0.4+0.2);
        else:
          longdroit:=longdroit+p_*0.6u;
        fi;
      elseif string p_:
        nbimgdroit:=nbimgdroit+1;
        Imgd[nbimgdroit]=image(%
          label(TEX(p_),(0,0));
        );
        longdroit:=longdroit+abs(lrcorner Imgd[nbimgdroit]-llcorner Imgd[nbimgdroit])+0.2u;
      else:
        longdroit:=longdroit+abs(lrcorner p_-llcorner p_)+0.2u;
      fi;
    endfor;
    pair decalageg,decalaged;
    if longgauche>longdroit:
      M2=M1+(-longgauche,0);
      N2=N1+(longgauche,0);
      decalageg=u*(0.1,0);
      decalaged=u*(0.1,0)+(0.5*abs(longdroit-longgauche),0);
    else:
      M2=M1+(-longdroit,0);
      N2=N1+(longdroit,0);
      decalaged=u*(0.1,0);
      decalageg=u*(0.1,0)+(0.5*abs(longdroit-longgauche),0);%
    fi;
    M0=iso(M1,M2)+u*(0,-0.5);
    M3=iso(M1,M2);
    N0=symetrie(M0,O);
    N3=iso(N1,N2);
    trace N2--N1--N3--N0--O--M0--M3--M1--M2 withpen pencircle scaled 1.1;
    fill cercles(O,1.5mm);
    % Affichage des "masses"
    nbimggauche:=0;
    for p_=#1:
      if numeric p_:
        if Masse:
          trace PoidsM(p_) shifted(M1-lrcorner PoidsM(p_)-decalageg);
          \ifemptyKV[Balance]{Vraisemblance}{simili:=1+0.5*(p_ div 5);}{simili:=\useKV[Balance]{Vraisemblance};}
          decalageg:=decalageg+u*((simili)*0.4+0.2,0);
        else:
          for k=1 upto p_:
            trace Poids shifted(M1-lrcorner Poids-decalageg);
            decalageg:=decalageg+u*(0.6,0);
          endfor;
        fi;
      elseif string p_:
        nbimggauche:=nbimggauche+1;
        trace Imgg[nbimggauche] shifted(M1-decalageg-lrcorner Imgg[nbimggauche]);
        decalageg:=decalageg+(abs(llcorner Imgg[nbimggauche]-lrcorner Imgg[nbimggauche]),0)+u*(0.2,0);
      else:
        draw p_ shifted(M1-decalageg-lrcorner p_);
        decalageg:=decalageg+(abs(llcorner p_-lrcorner p_),0)+u*(0.2,0);
      fi;
    endfor;
    % 
    nbimgdroit:=0;
    for p_=#2:
      if numeric p_:
        if Masse:
          trace PoidsM(p_) shifted(N1-llcorner PoidsM(p_)+decalaged);
          \ifemptyKV[Balance]{Vraisemblance}{simili:=1+0.5*(p_ div 5);}{simili:=\useKV[Balance]{Vraisemblance};}
          decalaged:=decalaged+u*((simili)*0.4+0.2,0);
        else:
          for k=1 upto p_:
            trace Poids shifted(N1-llcorner Poids+decalaged);
            decalaged:=decalaged+u*(0.6,0);
          endfor;
        fi;
      elseif string p_:
        nbimgdroit:=nbimgdroit+1;
        trace Imgd[nbimgdroit] shifted(N1+decalaged-llcorner Imgd[nbimgdroit]);
        decalaged:=decalaged+(abs(llcorner Imgd[nbimgdroit]-lrcorner Imgd[nbimgdroit]),0)+u*(0.2,0);
      else:
        draw p_ shifted(N1+decalaged-llcorner p_);
        decalaged:=decalaged+(abs(llcorner p_-lrcorner p_),0)+u*(0.2,0);
      fi;
    endfor;
    \ifPfCDeuxColonnes\relax%
      Echelle=\mpdim{\linewidth};
      picture Retiens;
      Retiens=currentpicture;
      if Echelle<abs(lrcorner Retiens - llcorner Retiens):
        currentpicture:=nullpicture;
        draw Retiens scaled (Echelle/abs(lrcorner Retiens - llcorner Retiens));
      fi;
    \fi
  \end{mplibcode}%
}%

\makeatletter
\NewDocumentCommand\BalanceElec{omm}{%
  \tokPlateauGauche{}%
  \tokPlateauDroit{}%
  \useKVdefault[Balance]%
  \setKV[Balance]{#1}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListePlateauGauche{#2}%
  \readlist*\PfC@ListePlateauDroit{#3}%
  \reademptyitems%
  \foreachitem\compteur\in\PfC@ListePlateauGauche{%
    \expandafter\UpdatetoksPlateauGauche\compteur\nil
  }%
  \foreachitem\compteur\in\PfC@ListePlateauDroit{%
    \expandafter\UpdatetoksPlateauDroit\compteur\nil
  }%
  \PfC@BuildBalanceElec{\the\tokPlateauGauche}{\the\tokPlateauDroit}%
}%

\NewDocumentCommand\PfC@BuildBalanceElec{mm}{%
  \mplibforcehmode%
  \begin{mplibcode}
    u:=\useKV[Balance]{Unite};
    \ifemptyKV[Balance]{Traces}{}{\useKV[Balance]{Traces};}
    pair O,A,B,M[],N[];
    O=(0,0);
    A=u*(-0.5,0);
    B=u*(0.5,0);
    M1=O;
    
    path pathhaut,plateau,afficheur;
    longhaut=0;
    nbimghaut=0;
    picture Imgh[];

    for p_=#1:
      if string p_:
        nbimghaut:=nbimghaut+1;
        Imgh[nbimghaut]=image(%
          label(TEX(p_),(0,0));
        );
        longhaut:=longhaut+abs(lrcorner Imgh[nbimghaut]-llcorner Imgh[nbimghaut])+0.2u;
      else:
        longhaut:=longhaut+abs(lrcorner p_-llcorner p_)+0.2u;
      fi;
    endfor;

    % Affichage du contenu du plateau
    pair decalageh;
    decalageh=(0,0);
    nbimghaut:=0;
    
    for p_=#1:
      if string p_:
        nbimghaut:=nbimghaut+1;
        trace Imgh[nbimghaut] shifted(M1-decalageh-lrcorner Imgh[nbimghaut]);
        decalageh:=decalageh+(abs(llcorner Imgh[nbimghaut]-lrcorner Imgh[nbimghaut]),0)+u*(0.2,0);
      else:
        draw p_ shifted(M1-decalageh-lrcorner p_);
        decalageh:=decalageh+(abs(llcorner p_-lrcorner p_),0)+u*(0.2,0);
      fi;
    endfor;
    M2=M1-decalageh;
    M1:=M1+u*(0.2,0);
    A:=iso(M1,M2);
    B:=A+u*(0,-0.25);
    trace (M1--M2) withpen pencircle scaled 1.1;
    trace A--B;
    N1-B=u*(1,0);
    N2=rotation(B,N1,90);
    N4=symetrie(N1,B);
    N3-N2=N4-N1;
    trace polygone(N1,N2,N3,N4);
    afficheur=homothetie(polygone(N1,N2,N3,N4),iso(N1,N2,N3,N4),0.7);
    trace afficheur;
    %
    label(TEX("\Masse{#2}"),center afficheur);
    Echelle=\mpdim{\linewidth};
    picture Retiens;
    Retiens=currentpicture;
    if Echelle<abs(lrcorner Retiens - llcorner Retiens):
      currentpicture:=nullpicture;
      draw Retiens scaled (Echelle/abs(lrcorner Retiens - llcorner Retiens));
    fi;
  \end{mplibcode}%
}
\makeatother