summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/latex/PfCEngrenagesBase.tex
blob: df5743e43994702272cd39330c978011d0497c69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
%%%
% Engrenages
%%%
\newtoks\tokPfCEngrenages%
\def\UpdatetoksEngrenages#1/#2\nil{\addtotok\tokPfCEngrenages{#1,#2,}}%

\setKVdefault[Engrenages]{Couleur=LightSteelBlue,Unite=3mm,ListeCouleurs={LightSteelBlue}}

\NewDocumentCommand\Engrenages{o m}{%
  \newtoks\toklistecouleur%
  \toklistecouleur{}%
  \tokPfCEngrenages{}
  \useKVdefault[Engrenages]%
  \setKV[Engrenages]{#1}%
  \setsepchar[*]{,*/}%
  \ignoreemptyitems
  \readlist*\ListePfCEngrenages{#2}%
  \setsepchar{,}
  \xdef\PfCFooEngrenages{}
  \foreachitem\compteur\in\ListePfCEngrenages{%
    \xdef\PfCFooEngrenages{\PfCFooEngrenages \ListePfCEngrenages[\compteurcnt,1],\ListePfCEngrenages[\compteurcnt,2],}%
  }%
  \xdef\ListeAvantCouleurs{\useKV[Engrenages]{ListeCouleurs}}%
  \readlist*\ListeCouleur{\ListeAvantCouleurs}%
  \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}%
  \BuildEngrenages{\PfCFooEngrenages}{\the\toklistecouleur}%
}%

\def\BuildEngrenagesCode#1#2{%
  u:=\useKV[Engrenages]{Unite};
  CouleurEngrenage=\useKV[Engrenages]{Couleur};
%
  vardef RecuperationCouleurs(text t)=
  color Col[];
  n:=0;
  for p_=t:
  n:=n+1;
  if color p_:
  Col[n]=p_;
  else:
  Col[n]=CouleurEngrenage;
  fi;
  endfor;
  enddef;
  %
  vardef LectureDonnees(text t)=
  n:=0;k=0;l=0;
  for p_=t:
  n:=n+1;
  if (n mod 2)=0:
  l:=l+1;
  Zz[l]=p_;
  else:
  k:=k+1;
  Mm[k]=p_;
  fi;
  endfor;
  enddef;
  %
  RecuperationCouleurs(#2);
  LectureDonnees(#1);
  %
  pair K;
  K=(0,0);
  picture EngrenageFinal;
  EngrenageFinal=image(
  if unknown Col[1]:
  else:
  CouleurEngrenage:=Col[1];
  fi;
  trace Engrenage(Mm[1],Zz[1],(0,0));
  %
  Signe=1;
  %
  for w=2 upto (n div 2):
  if unknown Col[w]:
  else:
  CouleurEngrenage:=Col[w];
  fi;
  K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0);
  AngleRot[w]:=360/(2*Zz[w]);
  if w=2:
  trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
  if (Zz[w] mod 2)=0:
  Signe:=Signe*(-1);
  fi;
  else:
  if (Zz[w] mod 2)=1:
  if Signe=-1:
  trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
  else:
  trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
  fi;
  else:
  Signe:=Signe*(-1);
  if Signe=1:
  trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
  else:
  trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
  fi;
  fi;
  fi;
  endfor;
  );
}

\NewDocumentCommand\BuildEngrenages{mm}{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    input PfCEngrenages;
    \BuildEngrenagesCode{#1}{#2}
    trace EngrenageFinal;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={input PfCEngrenages;\BuildEngrenagesCode{#1}{#2}}]
    trace EngrenageFinal;
  \end{mpost}
  \fi
}%