function IrrotSavePlot(Figurein,varargin) %IRROTSAVEPLOT enregistre une figure avec des dimensions spécifiques. % % Usage: Créez une figure avec toutes ses courbes, axes et légendes, puis % enregistrez-la aves IRROTSAVEPLOT. % % IRROTSAVEPLOT(A) Enregistre la figure A aux dimensions par défaut % (8.9x6.0 cm), avec le nom par défaut ('Figure n' ou propriété A.Name si % défini) au format par défaut (eps). Le fichier 'Figure n'.eps est créé. % % IRROTSAVEPLOT(A,NAME) Enregistre la figure au format par défaut (eps), % avec les dimensions par défaut (8.9x6 cm) avec le nom NAME. Le fichier % NAME.eps est créé. % % IRROTSAVEPLOT(A,NAME,[W H]) Enregistre la figure au format par défaut % (eps) avec les dimensions suivantes en cm: largeur W, hauteur H. Le % fichier NAME.eps est créé % % IRROTSAVEPLOT(A,NAME,[W H],'OPTION1',VALEUR1,'OPTION2',VALEUR2,...) % permet d'ajuster des paramètres additionnels pendant la création. % % Paramètres: 'Format' change le format de l'image. Les valeurs (string) % supportées 'eps', 'pdf', 'png', 'jpg', 'tiff', 'svg', 'ps'. % Format par défaut: eps. % % 'BitMapRes' change la résolution de l'image générée en % points par pouce (dpi) si le format choisi est bitmap: png, % jpg,tiff. Sans effet sur un format vectoriel. Le paramètre % entré doit nécessairement être un entier positif. % % 'Renderer' force à utiliser le moteur graphique spécifié % pour générer l'image. Les valeurs acceptées sont 'opengl', % 'painters' et 'auto' (par défaut). ATTENTION: risque % d'instabilité si le choix est forcé (CF Matlab doc). % % 'PreserveFig' détermine si la figure est préservée ou non. % 'on' ou 'off' sont acceptés ('on' par défaut). 'on' crée % une copie de la figure avant de redimensionner, 'off' % modifie la figure directement. ATTENTION: utiliser avec % précautions, les marges peuvent mal se comporter pendant le % redimensionnement inverse. % %NOTE (Version 1.0.1): La fonction ici présente a été testée de manière % extensive avec MATLAB R2014b sur MAC OS 10.10.5. Tests plus succints % sur WINDOWS 7 et LUBUNTU 12.04. Pour signaler tout bug, problème ou % incompatibilité: irrotationnels@epfl.ch %% Nicolas T. pour Les Irrotationnels, irrotationnels.epfl.ch, 2015 %Format validations Formats = {'eps','pdf','png','jpg','jpeg','tiff','svg','ps'}; OnOff = {'on','off'}; Renderers = {'painters','opengl','auto'}; %Fonctions de test validateOnOff = @(x) any(validatestring(x,OnOff)); validateFormat = @(x) any(validatestring(x,Formats)); validaterenderer = @(x) any(validatestring(x,Renderers)); validatesize = @(x) validateattributes(x,{'numeric'},{'size',[1,2],'>',0}); validateBitMapRes = @(x) validateattributes(x,{'numeric'},{'scalar',... 'integer','positive','nonnan'}); %%Defaults: switch Figurein.Name case '' DefaultName = ['Figure_' num2str(Figurein.Number)]; otherwise DefaultName = Figurein.Name; end DefaultFormat = 'eps'; DefaultSize = [8.9 6.0]; DefaultRenderer = 'auto'; DefaultBitMapRes = 300; %DPI : unité obligatoire! DefaultPreserveFig = 'on'; %Création du Parseur d'argument par = inputParser; par.FunctionName = 'IrrotSavePlot'; par.StructExpand = false; %Arguments à parser addRequired(par,'Figurein'); addOptional(par,'Name',DefaultName,@ischar); addOptional(par,'Figsize',DefaultSize,validatesize); addParameter(par,'Format',DefaultFormat,validateFormat); addParameter(par,'Renderer',DefaultRenderer,validaterenderer); addParameter(par,'BitMapRes',DefaultBitMapRes,validateBitMapRes); addParameter(par,'PreserveFig',DefaultPreserveFig,validateOnOff); %Démarrage du parsage parse(par,Figurein,varargin{:}); %Stratégie de préservation switch par.Results.PreserveFig case 'on' Figure = copy(Figurein); Figure.Visible = 'off'; case 'off' Figure = Figurein; end %Génère les méta-données liées au format [bitm, formatstr] = switchformat(par.Results.Format); Figure.Units = 'centimeters'; %Unité de la structure figure Figure.PaperUnits = 'centimeters'; %Unité de la feuille d'impression Figure.Position = [15 15 par.Results.Figsize]; %Position et taille à l'écran Figure.PaperSize = par.Results.Figsize; %Dimensions feuille d'impression Figure.PaperPosition = [0 0 par.Results.Figsize]; %Dimensions feuille d'impression Figure.PaperPositionMode = 'manual'; %Respecter Paperposition et Size switch par.Results.Renderer case 'auto' Figure.RendererMode = 'auto'; otherwise Figure.RendererMode = 'manual'; Figure.Renderer = par.Results.Renderer; end ax = Figure.CurrentAxes; %Ne pas redimensionner l'image, mais uniquement les axes. set(ax,'ActivePositionProperty','OuterPosition'); %Acquérir les données de marges utiles axout = get(ax,'OuterPosition'); axnst = get(ax,'TightInset'); %Redimensionner, calcul, The matrix trick: http://nibot-lab.livejournal.com resizeaxes = axout - axnst*[-1 0 1 0; 0 -1 0 1; 0 0 1 0; 0 0 0 1]; %Redimensionner l'image. set(ax,'Position',resizeaxes); %Imprimer dans le fichier (deux processus, bitmap ou vectoriel) if bitm==1 print(Figure,formatstr,['-r' num2str(par.Results.BitMapRes)],par.Results.Name) else print(Figure,formatstr,par.Results.Name) end if par.Results.PreserveFig=='on' close(Figure); end clear Figure; end function [bm, format] = switchformat(formatin) bm = 0; switch formatin case 'eps' format = '-depsc'; case 'pdf' format = '-dpdf'; case 'png' format = '-dpng'; bm=1; case {'jpg','jpeg'} format = '-djpeg'; bm=1; case 'tiff' format = '-dtiff'; bm=1; case 'svg' format = '-dsvg'; case 'ps' format = '-dps'; end end