function	handleAP=plotMultiAxes(AxesPrincipaux,AxesSecondaires)


%plotMultiAxes trace des graphiques à plusieurs axes x et y
%   handleAP=plotMultiAxes(AxesPrincipaux,AxesSecondaires)
%   est une fonction qui permet de tracer 
%   un vecteur AxesPrincipaux.y
%   en fonction de AxesPrincipaux.x
%   mais aussi en fonction d'autres 
%   axes : AxesSecondaires.Vecteur.
%
%   Les vecteurs AxesPrincipaux.y, 
%   AxesPrincipaux.x et AxesSecondaires(i).Vecteur
%   sont de même dimensions et
%   leurs données se correspondent.
%   
%       Exemple de 2ème axe x
%
%      ^ y                       ^
%    l |                         |
%    a |                         |
%    b |                         | h
%    e |--------------> x2       |      ^
%    l |      labelx2            |      | D/100*h
%    y |                         |      |
%      |--------------> x1       v      v
%            labelx1
%
%   L'axe secondaire (i) peut être un axe des 
%   abscisses (AxesSecondaires(i).Nature=1)
%   ou bien un axe des ordonnées 
%   (AxesSecondaires(i).Nature=2).
%
%   L'axe secondaire x (ou y) est dessiné 
%   à une certaine distance de l'axe principal x (ou y),
%   spécifiée par l'utilisateur en pourcentage 
%   de la hauteur (ou largeur) de la feuille 
%   graphique : AxesSecondaires(i).Distance. 
%   Cette valeur est comprise entre 0 et 100.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Auteur: Elodie Roux (www.elodieroux.com)
% Date  : Octobre 2001 
%%%%%%%%%%%%%%%%%%%   ENTREES : %%%%%%%%%%%%%%%%%%%%%%%%
%- Axes Principaux AP
%   Entrées obligatoires :
%       AP.x                =[Données du Vecteur x à tracer];
%       AP.y                =[Données du Vecteur y à tracer y=y(x)];
%
%   Entrées facultatives : (valeurs par défaut)
%       AP.Labelx           =' ';       % Label de l'axe des abscisses
%       AP.Labely           =' ';       % Label de l'axe des ordonnées
%       AP.Titre            =' ';       % Titre du graphique 
%       AP.Color            ='b';       % Couleur du trait de la courbe
%       AP.LineStyle        ='-';       % Style du trait de la courbe
%       AP.LineWidth        =[0.5];     % Épaisseur du trait de la courbe
%       AP.Marker           ='none';    % Marqueurs (+ . o ^ v ou bien x)
%       AP.MarkerSize       =6;         % Taille des marqueurs
%       AP.MarkerEdgeColor  ='auto';    % Couleur du contour
%       AP.MarkerFaceColor  ='none';    % Couleur de remplissage
%       AP.Axis             =[];        % Bornes du trace du graphique
%
%- Axes Secondaires AS
%   Entrées obligatoires :
%       AS.Vecteur          =[Données correspondantes à AP.x ou AP.y];
%       AS.Nature           =1 ou 2;  %axe x ou y ?
%       
%   Entrées facultatives : (valeurs par défaut)
%       AS.Distance         =15; %position axe en % de hauteur du graph
%       AS.Format           =2; %graduation? 1=linéaire, 2=automatique
%       AS.Label            =' ';
%
%%%%%%%%%%%%%%%%%%%   SORTIE : %%%%%%%%%%%%%%%%%%%%%%%%
%       La fonction renvoie le 'handle' h de 
%       h=plot(AP.x,AP.y) de manière à ce que 
%       l'utilisateur puisse modifier librement les 
%       propriétés du graphique par la suite.
%       Exemple :
%       get(h)              % Affiche les propriétés
%       set(h,'Color','r')  % Modifie la couleur (rouge) de la courbe
%
%       NB : il est conseille de ne pas changer axis
%       par la suite (sous peine d'avoir les axes
%       secondaires inadaptés). Spécifiez-le des le départ 
%       avec AP.Axis=...
%       Exemple :
%       ne pas faire : plotMultiAxes(AP,AS), axis([xmin xmax ymin ymax])
%       mais faire : AP.Axis=[xmin xmax ymin ymax], plotMultiAxes(AP,AS)
%
%       NB2 : Cela permet aussi de créer un axe secondaire 
%       non superpose a la courbe.
%       Exemple :
%       plot(x,y)
%       Les axes x et y sont adaptée a la courbe
%       t=axis;
%       ce sont les bornes des axes principaux
%       adaptées au trace de la courbe.
%       t est de la forme [xmin xmax ymin ymax]
%       Pour créer un axe secondaire x non superpose, 
%       décalez ces bornes par :
%       AP.Axis=[xmin xmax ymin-L ymax];
%       AS.Distance=Lpourcent   % avec Lpourcent/100*(ymax-(ymin-L))<L
%       plotMultiAxes(AP,AS);
%       Vous obtiendrez alors un axe x non superpose avec la courbe.
%
%%%%%%%%%%%%%%%%%%%   EXEMPLE : %%%%%%%%%%%%%%%%%%%%%%%%
%   Voici un exemple d'utilisation de la fonction :
%       clear all
%       close all
%       AP.x=[60:5:160];
%       AP.y=-0.01*(AP.x*1000/60/60-30).^2+10;
%       AP.Labelx='Vitesse : \bf V (km/h)';
%       AP.Labely='Vitesse Verticale : \bf Vz (m/s)';
%       AP.Titre='\bf Essai de la fonction plotMultiAxes';
%       AP.Axis=([60 160 7 10]);
%       AS(1).Vecteur=AP.x*1000/60/60;
%       AS(1).Nature=1;     % axe secondaire des abscisses
%       AS(1).Label='Vitesse : \bf V (m/s)';
%       AS(2).Vecteur=3000*9.81./(0.5*1.225*70*(AP.x*1000/60/60).^2);
%       AS(2).Nature=1;     % axe secondaire des abscisses
%       AS(2).Label='Coeff. de portance avion : \bf Cz_A';
%       AS(3).Vecteur=AP.y*60/0.3048;
%       AS(3).Nature=2;     % axe secondaire des ordonnées
%       AS(3).Label='Vitesse Verticale : \bf Vz (ft/min)';
%       AS(3).Distance=85;
%       plotMultiAxes(AP,AS);
%
%   See also PLOTYY

%	Auteur	: Élodie Roux
%	Date    : octobre 2001
%	Contact	: elodie.roux@ifrance.com
%	version	: MATLAB Version 6.0.0.88 (R12) on SOL2
%	Démarche	: trace à la main le deuxième axe x2
%				  càd les traits de l'axe, les valeurs numériques...
%				  à la hauteur spécifiée par l'utilisateur.
%	Réf		: Les propriétés graphiques de Matlab (handle)
%				  (Xtick, xlabel, Ylim, ...)
%				  que l'on peut atteindre par get(handle)
%				  et modifier par set(handle,'Xtick',value)
%				  Les fonctions patch, text, ...
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%







%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Valeurs par défaut des structures
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%DefaultAP.x			=[];
%DefaultAP.y			=[];
DefaultAP.Labelx		='  ';
DefaultAP.Labely		='  ';
DefaultAP.Titre			='  ';
DefaultAP.Color			='b';
DefaultAP.LineStyle		='-';
DefaultAP.LineWidth		=[0.5];
DefaultAP.Marker		='none';
DefaultAP.MarkerSize		=6;
DefaultAP.MarkerEdgeColor	='auto';
DefaultAP.MarkerFaceColor	='none';

%DefaultAS.Vecteur		=[];
%DefaultAS.Nature		=1 ou 2;  %axe x ou y ?
DefaultAS.Distance		=15;
DefaultAS.Format		=2;  %graduation linéaire?
DefaultAS.Label			='  ';








%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%	Traitement des données Axes Principaux
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
AP.x			=AxesPrincipaux.x;
AP.y			=AxesPrincipaux.y;
AP.Labelx		=eval('AxesPrincipaux.Labelx',...
				'DefaultAP.Labelx');
AP.Labely		=eval('AxesPrincipaux.Labely',...
				'DefaultAP.Labely');
AP.Titre		=eval('AxesPrincipaux.Titre',...
				'DefaultAP.Titre');
AP.Color		=eval('AxesPrincipaux.Color',...
				'DefaultAP.Color');
AP.LineStyle		=eval('AxesPrincipaux.LineStyle',...
				'DefaultAP.LineStyle');
AP.LineWidth		=eval('AxesPrincipaux.LineWidth',...
				'DefaultAP.LineWidth');
AP.Marker		=eval('AxesPrincipaux.Marker',...
				'DefaultAP.Marker');
AP.MarkerSize		=eval('AxesPrincipaux.MarkerSize',...
				'DefaultAP.MarkerSize');
AP.MarkerEdgeColor	=eval('AxesPrincipaux.MarkerEdgeColor',...
				'DefaultAP.MarkerEdgeColor');
AP.MarkerFaceColor	=eval('AxesPrincipaux.MarkerFaceColor',...
				'DefaultAP.MarkerFaceColor');

% tracé de la courbe :
%---------------------
   gcf;
   hold on,
   handleAP=plot(AP.x,AP.y,...
   	'Color',AP.Color,...
   	'LineStyle',AP.LineStyle,...
   	'LineWidth',AP.LineWidth,...
   	'Marker',AP.Marker,...
   	'MarkerSize',AP.MarkerSize,...
   	'MarkerEdgeColor',AP.MarkerEdgeColor,...
   	'MarkerFaceColor',AP.MarkerFaceColor);
   handleAPGraph=get(handleAP,'Parent');
   LimitesAxesDefaut=[axis];
   LimitesAxes=[eval('AxesPrincipaux.Axis','LimitesAxesDefaut')];
   xmin=LimitesAxes(1);
   xmax=LimitesAxes(2);
   ymin=LimitesAxes(3);
   ymax=LimitesAxes(4);
   axis(LimitesAxes)

   % Récupération des valeurs de 
   % Ytick et Xtick de l'axe principal
   YtickAP=get(handleAPGraph,'YTick');
   XtickAP=get(handleAPGraph,'XTick');


			
				
				
NombreAS=size(AxesSecondaires,2);
NombreASx=0;
NombreASy=0;

for(i=1:NombreAS)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%	Traitement des données Axes Secondaires
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Données obligatoire : 
AS(i).Vecteur = AxesSecondaires(i).Vecteur;
AS(i).Nature = AxesSecondaires(i).Nature;
if(AS(i).Nature==1)	%axe abscisse
	NombreASx=NombreASx+1;
	n=NombreASx;
elseif(AS(i).Nature==2)	%axe ordonnées
	NombreASy=NombreASy+1;
	n=NombreASy;
else	% erreur
	disp('  ')
	disp(['AxesSecondaires(' num2str(i) ').Nature doit être égal à :'])
	disp(['   1 si c''est un axe des abscisses'])
	disp(['   2 si c''est un axe des ordonnées'])
	error(['Erreur dans la structure d''entrée des Axes Secondaires'])
end
    
% Si les entrées suivantes sont non existante ou singleton vide []
% alors c'est la valeur par défaut de la structure qui est 
% considérée.
% Pourquoi singleton vide [] ?
% et bien lors de la création d'une structure AxeSecondaire par 
% l'utilisateur, matlab affecte automatiquement le singleton vide []
% aux valeurs non définies de cette structure.
% Et ce [] n'est pas la valeur à considérer.
% Par exemple l'utilisateur tape :
%   AxeSecondaire(1).Vecteur=[0:1:10];
%   AxeSecondaire(1).Nature=1;
%   AxeSecondaire(1).Label='Label du user';
%   AxeSecondaire(2).Vecteur=[0:50:900];
% A ce moment la Matlab crée automatiquement :
%   AxeSecondaire(2).Nature et AxeSecondaire(2).Label
% et leur affecte la valeur de singleton vide.


if(isempty(eval('AxesSecondaires(i).Distance','[]'))==1)
    AS(i).Distance = DefaultAS.Distance*n;
else
    AS(i).Distance = AxesSecondaires(i).Distance;
end
    if(AS(i).Distance>100 | AS(i).Distance<0)==1     % erreur
        disp('  ')
        disp(['AxesSecondaires(' num2str(i) ').Distance doit'])
        disp(['être compris entre 0 et 100'])
        disp(['Vous avez peut-etre aussi considere trop d''axes'])
        disp(['sans en preciser leur distance.'])
        error(['Erreur dans la structure d''entrée des Axes Secondaires'])
    end
            
if(isempty(eval('AxesSecondaires(i).Format','[]'))==1)
    AS(i).Format = DefaultAS.Format;
else
    AS(i).Format = AxesSecondaires(i).Format;
    if(AS(i).Format==1 | AS(i).Format==2)~=1
        disp('  ')
        disp(['AxesSecondaires(' num2str(i) ').Format doit être = à :'])
        disp([' 1 : graduation linéaire (correspond à l''axe principal)'])
        disp([' 2 : graduation automatique (adaptée)'])
        error(['Erreur dans la structure d''entrée des Axes Secondaires'])
    end
end
        
if(isempty(eval('AxesSecondaires(i).Label','[]'))==1)
    AS(i).Label = DefaultAS.Label;
else
    AS(i).Label = AxesSecondaires(i).Label;
end

            
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%	Réalisation des Axes secondaires
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if(AS(i).Nature==1)		%axe abscise
	%______ Tracé de l'axe secondaire (trait) ______
	D=(ymax-ymin)*AS(i).Distance/100;
	patch([xmin xmax],[ymin+D ymin+D],'k');
	
	%_________ Label de l'axe secondaire AS ________
	% Calcul de la position du label de l'AS
	% On laisse faire à matlab le calcul
	% de la position idéale 
	% (centrage du texte,...).
	% Il n'y aura plus qu'à rectifier le
	% positionnement en y
	tampon=xlabel(AS(i).Label);
	tampon2=get(tampon,'Position');
   	text(tampon2(1),tampon2(2)+D,AS(i).Label,...
      		'HorizontalAlignment','center',...
      		'VerticalAlignment','top')
	clear tampon

	%_________ Graduation de l'axe secondaire ______
	%Valeurs et position des Xtick:
	%------------------------------
	% Valeurs : 	Chiffres qui seront écrits
	%		sur l'axe secondaire
	% 		Valeurs -> XtickASLabel
	% Position :	Où écrire les Valeurs
	%		càd les abscisses x
	%		dans la base Axe Principaux
	%		où les Valeurs des XtickAS
	%		devront être écrites.
	%		Position -> XtickAS
	if(AS(i).Format==1)	% graduation linéaire
		% Calcul des Xtick de l'axe secondaire AS
		XtickASLabel=interp1(AP.x,AS(i).Vecteur,XtickAP);
		XtickAS=XtickAP;
	end	% end de "if(AS(i).Format==1)"
	if(AS(i).Format==2)	% graduation automatique
		% Calcul automatique de Matlab
		% des valeurs XtickAS idéaux (labels)
		% lors du tracé y en fonction de l'AS
		figure(2)
		tampon=plot(AS(i).Vecteur,AP.y);
		tamponParent=get(tampon,'Parent');
		% Récupération des labels (valeurs)
		% idéaux de ces XtickAS
		XtickASLabel=get(tamponParent,'XTick');
		close 2
		% Calcul des XtickAS (position)
		% càd position en x (base Axe Principaux)
		% des labels des XtickAS
		XtickAS=interp1(AS(i).Vecteur,AP.x,XtickASLabel);
	end % end de "if(AS(i).Format==2)"
	
	
	%______ Tracé des traits des XtickAS _______
	gcf;
   	text(XtickAS,repmat(ymin+D,size(XtickAS)),'l',...
  		'HorizontalAlignment','left',...
		'VerticalAlignment','middle')

	%______ Écriture des valeur des XtickAS _____
	decalage=abs(tampon2(2)-ymin)/4;
 	text(XtickAS,repmat(ymin+D-decalage,size(XtickAS)),...
		[num2str(XtickASLabel','%0.3g')],...
		'HorizontalAlignment','center',...
		'VerticalAlignment','top')
	
	%_____ Fin du tracé de l'axe secondaire_____
	
	
elseif(AS(i).Nature==2)		%axe ordonnées
	%____ Tracé de l'axe secondaire (trait) ____
	D=(xmax-xmin)*AS(i).Distance/100;
	patch([xmin+D xmin+D],[ymin ymax],'k');
	
	%_______ Label de l'axe secondaire AS ______
	% Calcul de la position du label de l'AS.
	% On laisse faire à matlab le calcul
	% de la position idéale 
	% (centrage du texte,...)
	% il n'y aura plus qu'à rectifier le
	% positionnement en x
	tampon=ylabel(AS(i).Label);
	tampon2=get(tampon,'Position');
   	hlabelAS=text(tampon2(1)+D,tampon2(2),AS(i).Label,...
	   	'Rotation',90,...
      		'HorizontalAlignment','center',...
      		'VerticalAlignment','bottom');
	clear tampon

	%_________ Graduation de l'axe secondaire ______
	%Valeurs et position des Ytick:
	%------------------------------
	% Valeurs : 	Chiffres qui seront écrits
	%		sur l'axe secondaire
	% 		Valeurs -> YtickASLabel
	% Position :	Où écrire les Valeurs
	%		càd les ordonnées y
	%		dans la base Axe Principaux
	%		où les Valeurs des YtickAS
	%		devront être écrites.
	%		Position -> YtickAS
	if(AS(i).Format==1)	% graduation linéaire
      % Calcul des Ytick de l'axe secondaire AS
      %YtickASLabel=interp1(AP.y,AS(i).Vecteur,YtickAP);
      % Un tri par ordre croissant de varx 
      % s'impose pour utiliser la fonction matlab :
      % Yàinterpoler=interp1(varx,vary,Xconnus)
      [varx,I]=sort(AP.y);
      vary=AS(i).Vecteur(I);
      YtickASLabel=interp1(varx,vary,YtickAP);
		YtickAS=YtickAP;
	end	% end de "if(AS(i).Format==1)"
	if(AS(i).Format==2)	% graduation automatique
		% Calcul automatique de Matlab
		% des valeurs YtickAS idéaux (labels)
		% lors du tracé y en fonction de l'AS
		figure(2)
		tampon=plot(AP.x,AS(i).Vecteur);
		tamponParent=get(tampon,'Parent');
		% Récupération des labels (valeurs)
		% idéaux de ces YtickAS
		YtickASLabel=get(tamponParent,'YTick');
		close 2
		% Calcul des YtickAS (position)
		% càd position en y (base Axe Principaux)
      % des labels des YtickAS
      %YtickAS=interp1(AS(i).Vecteur,AP.y,YtickASLabel);
      % Un tri par ordre croissant de varx 
      % s'impose pour utiliser la fonction matlab :
      % Yàinterpoler=interp1(varx,vary,Xconnus)
      [varx,I]=sort(AS(i).Vecteur);
      vary=AP.y(I);
      YtickAS=interp1(varx,vary,YtickASLabel);
	end % end de "if(AS(i).Format==2)"
	
	
	%______ Tracé des traits des YtickAS _______
	gcf;
   	text(repmat(xmin+D,size(YtickAS)),YtickAS,'-',...
  		'HorizontalAlignment','left',...
		'VerticalAlignment','middle')

	%______ Écriture des valeur des YtickAS _____
	decalage=abs(tampon2(1)-xmin)/4;
 	r=text(repmat(xmin+D-decalage,size(YtickAS)),YtickAS,...
		[num2str(YtickASLabel','%0.3g')],...
		'HorizontalAlignment','right',...
		'VerticalAlignment','middle');
	ExtentionLabel=get(r,'Extent');
	ExtentionLabel=cat(1,ExtentionLabel{:});
	Labelmax=max(ExtentionLabel(:,3));
	%if(D-xmin<Labelmax)	% ylabel se superpose avec les chiffres
		pos=get(hlabelAS,'Position');
		pos(1)=xmin+D-decalage-Labelmax;
		set(hlabelAS,'Position',pos);
    %end	% end de 'if(D<Labelmax)'
	
	
	%_____ Fin du tracé de l'axe secondaire_____


end	% en de "if(AS(i).Nature==...)"




end	% end de "for(i=1:NombreAS)"




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%	Labels, titre, ...des axes principaux
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	%______ Label de l'axe Principal x _______
	xlabel(AP.Labelx);
	
	%______ Label de l'axe Principal y _______
	ylabel(AP.Labely);

	%______Titre du graphique_____
	title(AP.Titre)







