]> rtime.felk.cvut.cz Git - eurobot/public.git/blobdiff - src/timing/plot2svg.m
timing: clean-up of clock_gettime ipoint, mutex added
[eurobot/public.git] / src / timing / plot2svg.m
diff --git a/src/timing/plot2svg.m b/src/timing/plot2svg.m
new file mode 100644 (file)
index 0000000..3e1a101
--- /dev/null
@@ -0,0 +1,1762 @@
+function varargout=plot2svg(param1,id,pixelfiletype)\r
+%  Matlab to SVG converter\r
+%  Prelinary version supporting 3D plots as well\r
+%\r
+%  Usage: plot2svg(filename,graphic handle,pixelfiletype)\r
+%                  optional     optional     optional\r
+%         or\r
+%\r
+%         plot2svg(figuresize,graphic handle,pixelfiletype)\r
+%                   optional     optional      optional\r
+%\r
+%         pixelfiletype = 'png' (default), 'jpg'\r
+%\r
+%  Juerg Schwizer 23-Oct-2005\r
+%\r
+%  07.06.2005 - Bugfix axxindex (Index exceeds matrix dimensions)\r
+%  19.09.2005 - Added possibility to select output format of pixel graphics\r
+%  23.10.2005 - Bugfix cell array strings (added by Bill)\r
+%               Handling of 'hggroups' and improved grouping of objects\r
+%               Improved handling of pixel images (indexed and true color pictures)\r
+%  23.10.2005 - Switched default pixelfromat to 'png'\r
+%  07.11.2005 - Added handling of hidden axes for annotations (added by Bill)\r
+%  03.12.2005 - Bugfix of viewBox to make Firefox 1.5 working\r
+%  04.12.2005 - Improved handling of exponent values for log-plots\r
+%               Improved markers\r
+%  09.12.2005 - Bugfix '<' '>' '?' '"'\r
+%  22.12.2005 - Implementation of preliminary 3D version\r
+%               Clipping\r
+%               Minor tick marks\r
+%  22.01.2005 - Removed unused 'end'\r
+%\r
+global PLOT2SVG_globals\r
+global colorname\r
+global fixcolorptr\r
+progversion='22-Jan-2006';\r
+PLOT2SVG_globals.runningIdNumber = 0;\r
+if nargout==1\r
+    varargout={0};\r
+end\r
+disp(['   Matlab to SVG converter version ' progversion ', Juerg Schwizer (converter@juergschwizer.de).'])\r
+matversion=version;\r
+if str2num(matversion(1))<6 % Check for matlab version and print warning if matlab version lower than version 6.0 (R.12)\r
+    disp('   Warning: Future versions may no more support older versions than MATLAB R12.')\r
+end\r
+if nargout > 1\r
+    error('Function returns only one return value.')\r
+end\r
+if nargin<2 % Check if handle was included into function call, otherwise take current figure\r
+    id=gcf;\r
+end\r
+if nargin==0\r
+    [filename, pathname] = uiputfile( {'*.svg', 'SVG File (*.svg)'},'Save Figure as SVG File');\r
+    if ~( isequal( filename, 0) | isequal( pathname, 0))    \r
+        % yes. add backslash to path (if not already there)\r
+        pathname = addBackSlash( pathname); \r
+        % check, if extension is allrigth\r
+        if ( ~strcmpi( getFileExtension( filename), '.svg'))\r
+            filename = [ filename, '.svg'];\r
+        end\r
+        finalname=[pathname filename];\r
+    else\r
+        disp('   Cancel button was pressed.')\r
+        return\r
+    end\r
+else\r
+    if isnumeric(param1)\r
+        [filename, pathname] = uiputfile( {'*.svg', 'SVG File (*.svg)'},'Save Figure as SVG File');  \r
+        if ~( isequal( filename, 0) | isequal( pathname, 0))    \r
+            % yes. add backslash to path (if not already there)\r
+            pathname = addBackSlash( pathname); \r
+            % check, if ectension is allrigth\r
+            if ( ~strcmpi( getFileExtension( filename), '.svg'))\r
+                filename = [ filename, '.svg'];\r
+            end\r
+            finalname=[pathname filename];\r
+        else\r
+            disp('   Cancel button was pressed.')\r
+            return\r
+        end     \r
+    else\r
+        finalname=param1;   \r
+    end\r
+end\r
+% needed to see annotation axes\r
+originalShowHiddenHandles = get(0, 'ShowHiddenHandles');\r
+set(0, 'ShowHiddenHandles', 'on');\r
+originalFigureUnits=get(id,'Units');\r
+set(id,'Units','pixels');   % All data in the svg-file is saved in pixels\r
+paperpos=get(id,'Position');\r
+if ( nargin > 0)\r
+    if isnumeric(param1)\r
+        paperpos(3)=param1(1);\r
+        paperpos(4)=param1(2);\r
+    end\r
+end\r
+if (nargin < 3)\r
+    PLOT2SVG_globals.pixelfiletype = 'png';\r
+else\r
+    PLOT2SVG_globals.pixelfiletype = pixelfiletype;\r
+end\r
+cmap=get(id,'Colormap');\r
+colorname='';\r
+for i=1:size(cmap,1)\r
+    colorname(i,:)=sprintf('%02x%02x%02x',fix(cmap(i,1)*255),fix(cmap(i,2)*255),fix(cmap(i,3)*255));\r
+end\r
+\r
+% Open SVG-file\r
+[pathstr,name,ext,versn] = fileparts(finalname);\r
+%PLOT2SVG_globals.basefilename = fullfile(pathstr,name);\r
+PLOT2SVG_globals.basefilepath = pathstr;\r
+PLOT2SVG_globals.basefilename = name;\r
+PLOT2SVG_globals.figurenumber = 1;\r
+fid=fopen(finalname,'wt');   % Create a new text file\r
+fprintf(fid,'<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n');    % Insert file header\r
+fprintf(fid,'<svg preserveAspectRatio="xMinYMin meet" width="100%%" height="100%%" viewBox="0 0 %0.3f %0.3f" ',paperpos(3),paperpos(4));\r
+fprintf(fid,'  version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\n');\r
+fprintf(fid,'  <desc>Matlab Figure Converted by PLOT2SVG written by Juerg Schwizer</desc>\n');\r
+group=1;\r
+groups=[];\r
+axfound=0;\r
+% Frame of figure\r
+figcolor = searchcolor(id,get(id, 'Color'));\r
+if (~ strcmp(figcolor, 'none'))\r
+    % Draw rectangle in the background of the graphic frame to cover all\r
+    % other graphic elements\r
+    if strcmp(get(id,'InvertHardcopy'),'on')\r
+        fprintf(fid,'  <rect x="0" y="0" width="%0.3f" height="%0.3f" fill="#ffffff" stroke="none" />\n',paperpos(3),paperpos(4));\r
+    else\r
+        fprintf(fid,'  <rect x="0" y="0" width="%0.3f" height="%0.3f" fill="%s" stroke="none" />\n',paperpos(3),paperpos(4),figcolor);\r
+    end\r
+end\r
+% Search all axes\r
+ax=get(id,'Children');\r
+for j=length(ax):-1:1\r
+    currenttype = get(ax(j),'Type');\r
+    if strcmp(currenttype,'axes')\r
+        group=group+1;\r
+        groups=[groups group];\r
+        group=axes2svg(fid,id,ax(j),group,paperpos);\r
+        axfound=1;\r
+    elseif strcmp(currenttype,'uicontrol')\r
+        if strcmp(get(ax(j),'Visible'),'on')\r
+            control2svg(fid,id,ax(j),group,paperpos);\r
+            axfound=1;\r
+        end\r
+    elseif strcmp(currenttype, 'uicontextmenu') || ...\r
+            strcmp(currenttype, 'uimenu') || ...\r
+            strcmp(currenttype, 'hgjavacomponent') || ...\r
+            strcmp(currenttype, 'uitoolbar')\r
+        % ignore these types\r
+    else\r
+        disp(['   Warning: Unhandled main figure child type: ' currenttype]);\r
+    end\r
+end\r
+fprintf(fid,'</svg>\n');\r
+fclose(fid);    % close text file\r
+if nargout==1\r
+    varargout={0};\r
+end\r
+set(id,'Units',originalFigureUnits);\r
+set(0, 'ShowHiddenHandles', originalShowHiddenHandles);\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SUBFUNCTIONS %%%%%\r
+% Create axis frame and insert all children of this axis frame\r
+function group=axes2svg(fid,id,ax,group,paperpos)\r
+global fixcolorptr\r
+global colorname\r
+global PLOT2SVG_globals\r
+originalAxesUnits=get(ax,'Units');\r
+set(ax,'Units','normalized');\r
+axpos=get(ax,'Position');\r
+faces =    [1 2 4 3; 2 4 8 6; 3 4 8 7; 1 2 6 5; 1 5 7 3; 5 6 8 7];\r
+%           x-y    ; y-z    ; x-z    ; y-z    ; x-z    ; x-y\r
+corners(:,:,1) = [1 1 2 3 4; 2 1 3 2 4];\r
+corners(:,:,2) = [2 2 4 6 8; 3 2 6 4 8];\r
+corners(:,:,3) = [1 3 4 7 8; 3 3 7 4 8];\r
+corners(:,:,4) = [1 1 2 5 6; 3 1 5 2 6];\r
+corners(:,:,5) = [2 1 3 5 7; 3 1 5 3 7];\r
+corners(:,:,6) = [1 5 6 7 8; 2 5 7 6 8];\r
+edge_neighbours = [2 3 5; 1 4 6; 4 1 7; 3 2 8; 6 7 1; 5 8 2; 8 5 3; 7 6 4];\r
+edge_opposite = [8 7 6 5 4 3 2 1];\r
+%x = [0 1 0 1 0 1 0 1];\r
+%y = [0 0 1 1 0 0 1 1];\r
+%z = [0 0 0 0 1 1 1 1];\r
+[projection,edges] = get_projection(ax,id);\r
+x = (edges(1,:)*axpos(3)+axpos(1))*paperpos(3);\r
+y = (1-(edges(2,:)*axpos(4)+axpos(2)))*paperpos(4);    \r
+% Depth Sort of view box edges \r
+[edge_z,edge_index]=sort(edges(3,:));\r
+most_back_edge_index = edge_index(1);\r
+% Back faces are plot box faces that are behind the plot (as seen by the\r
+% view point)\r
+back_faces = find(any(faces == most_back_edge_index,2));\r
+front_faces = find(all(faces ~= most_back_edge_index,2));\r
+groupax=group;\r
+axlimx=get(ax,'XLim');\r
+axlimy=get(ax,'YLim');\r
+axlimz=get(ax,'ZLim');\r
+axlimxori=axlimx;\r
+axlimyori=axlimy;\r
+axlimzori=axlimz;\r
+if strcmp(get(ax,'XScale'),'log')\r
+    axlimx=log10(axlimx);\r
+    axlimx(find(isinf(axlimx)))=0;\r
+end\r
+if strcmp(get(ax,'YScale'),'log')\r
+    axlimy=log10(axlimy);\r
+    axlimy(find(isinf(axlimy)))=0;\r
+end\r
+if strcmp(get(ax,'ZScale'),'log')\r
+    axlimz=log10(axlimz);\r
+    axlimz(find(isinf(axlimz)))=0;\r
+end\r
+if strcmp(get(ax,'XDir'),'reverse')\r
+    axlimx = fliplr(axlimx);\r
+end\r
+if strcmp(get(ax,'YDir'),'reverse')\r
+    axlimy = fliplr(axlimy);\r
+end\r
+if strcmp(get(ax,'ZDir'),'reverse')\r
+    axlimz = fliplr(axlimz);\r
+end\r
+axlimori = [axlimxori(1) axlimyori(1) axlimzori(1) axlimxori(2)-axlimxori(1) axlimyori(2)-axlimyori(1) axlimzori(2)-axlimzori(1)];\r
+fprintf(fid,'  <g>\n');\r
+axIdString = createId;\r
+fprintf(fid,'  <clipPath id="%s">\n',axIdString);\r
+fprintf(fid,'    <rect x="%0.3f" y="%0.3f" width="%0.3f" height="%0.3f"/>\n',...\r
+    min(x), min(y), max(x)-min(x), max(y)-min(y));\r
+fprintf(fid,'  </clipPath>\n');\r
+if strcmp(get(ax,'Visible'),'on')\r
+    group=group+1;\r
+    grouplabel=group;\r
+    axxtick=get(ax,'XTick');\r
+    axytick=get(ax,'YTick');\r
+    axztick=get(ax,'ZTick');\r
+    axlabelx=get(ax,'XTickLabel');\r
+    axlabely=get(ax,'YTickLabel');\r
+    axlabelz=get(ax,'ZTickLabel');\r
+    gridlinestyle=get(ax,'GridLineStyle');\r
+    minor_gridlinestyle=get(ax,'MinorGridLineStyle');\r
+    both_ticklength = get(ax,'TickLength');\r
+    if projection.xyplane\r
+        ticklength = both_ticklength(1);\r
+        xy_ratio = axpos(3)*paperpos(3)/ (axpos(4)*paperpos(4));\r
+        if xy_ratio < 1\r
+            tick_ratio = [1 1/xy_ratio 1];\r
+        else\r
+            tick_ratio = [xy_ratio 1 1];\r
+        end\r
+        if strcmp(get(ax,'TickDir'),'out')\r
+            label_distance = -(0.02 + ticklength);\r
+        else\r
+            label_distance = -0.02;\r
+        end\r
+    else\r
+        ticklength = both_ticklength(2);\r
+        label_distance = -2*abs(ticklength);\r
+        tick_ratio = [1 1 1];\r
+    end\r
+    linewidth = get(ax,'LineWidth');\r
+    axxindex=find((axxtick >= axlimori(1)) & (axxtick <= (axlimori(1)+axlimori(4))));\r
+    axyindex=find((axytick >= axlimori(2)) & (axytick <= (axlimori(2)+axlimori(5))));\r
+    axzindex=find((axztick >= axlimori(3)) & (axztick <= (axlimori(3)+axlimori(6))));\r
+    % remove sticks outside of the axes (-1 of legends)\r
+    axxtick=axxtick(axxindex); \r
+    axytick=axytick(axyindex);\r
+    axztick=axztick(axzindex);\r
+    if length(axxtick) > 1\r
+        minor_lin_sticks = (0.2:0.2:0.8)*(axxtick(2)-axxtick(1));\r
+        minor_axxtick = [];\r
+        for stick = [2*axxtick(1)-axxtick(2) axxtick]\r
+            minor_axxtick = [minor_axxtick minor_lin_sticks + stick]; \r
+        end\r
+        minor_axxtick = minor_axxtick(find(minor_axxtick > min(axlimx) & minor_axxtick < max(axlimx)));\r
+    else\r
+        minor_axxtick = [];\r
+    end\r
+    if length(axytick) > 1\r
+        minor_lin_sticks = (0.2:0.2:0.8)*(axytick(2)-axytick(1));\r
+        minor_axytick = [];\r
+        for stick = [2*axytick(1)-axytick(2) axytick]\r
+            minor_axytick = [minor_axytick minor_lin_sticks + stick]; \r
+        end\r
+        minor_axytick = minor_axytick(find(minor_axytick > min(axlimy) & minor_axytick < max(axlimy)));\r
+    else\r
+        minor_axytick = [];\r
+    end\r
+    if length(axztick) > 1\r
+        minor_lin_sticks = (0.2:0.2:0.8)*(axztick(2)-axztick(1));\r
+        minor_axztick = [];\r
+        for stick = [2*axztick(1)-axztick(2) axztick]\r
+            minor_axztick = [minor_axztick minor_lin_sticks + stick]; \r
+        end\r
+        minor_axztick = minor_axztick(find(minor_axztick > min(axlimz) & minor_axztick < max(axlimz)));\r
+    else\r
+        minor_axztick = [];\r
+    end\r
+    axxindex_inner = find((axxtick > axlimori(1)) & (axxtick < (axlimori(1)+axlimori(4))));\r
+    axyindex_inner = find((axytick > axlimori(2)) & (axytick < (axlimori(2)+axlimori(5))));\r
+    axzindex_inner = find((axztick > axlimori(3)) & (axztick < (axlimori(3)+axlimori(6))));\r
+    minor_log_sticks = log10(0.2:0.1:0.9);\r
+    if strcmp(get(ax,'TickDir'),'out')\r
+        ticklength=-ticklength;\r
+        valid_xsticks = 1:length(axxindex);\r
+        valid_ysticks = 1:length(axyindex);\r
+        valid_zsticks = 1:length(axzindex);\r
+    else\r
+        valid_xsticks = axxindex_inner;\r
+        valid_ysticks = axyindex_inner;\r
+        valid_zsticks = axzindex_inner;\r
+    end\r
+    if strcmp(get(ax,'XScale'),'log')\r
+        axxtick = log10(get(ax,'XTick'));\r
+        minor_axxtick = [];\r
+        for stick = axxtick\r
+            minor_axxtick = [minor_axxtick minor_log_sticks + stick]; \r
+        end\r
+        minor_axxtick = minor_axxtick(find(minor_axxtick > min(axlimx) & minor_axxtick < max(axlimx)));\r
+    end\r
+    if strcmp(get(ax,'YScale'),'log')\r
+        axytick=log10(get(ax,'YTick'));\r
+        minor_axytick = [];\r
+        for stick = axytick\r
+            minor_axytick = [minor_axytick minor_log_sticks + stick]; \r
+        end\r
+        minor_axytick = minor_axytick(find(minor_axytick > min(axlimy) & minor_axytick < max(axlimy)));\r
+    end\r
+    if strcmp(get(ax,'ZScale'),'log')\r
+        axztick=log10(get(ax,'ZTick'));\r
+        minor_axztick = [];\r
+        for stick = axztick\r
+            minor_axztick = [minor_axztick minor_log_sticks + stick]; \r
+        end\r
+        minor_axztick = minor_axztick(find(minor_axztick > min(axlimz) & minor_axztick < max(axlimz)));\r
+    end\r
+    % Draw back faces \r
+    linewidth=get(ax,'LineWidth');\r
+    if ~strcmp(get(ax,'Color'),'none')\r
+        background_color = searchcolor(id,get(ax,'Color'));\r
+        background_opacity = 1;\r
+    else\r
+        background_color = '#000000';\r
+        background_opacity = 0;\r
+    end\r
+    for p=1:size(back_faces)\r
+        patch2svg(fid, group, axpos, x(faces(back_faces(p),:)), y(faces(back_faces(p),:)), background_color, '-', linewidth, 'none', background_opacity, 1.0)\r
+    end\r
+    for p=1:size(back_faces)\r
+        for k = 1:size(corners,1)\r
+            switch corners(k,1,p)\r
+                case 1 % x\r
+                    % Draw x-grid\r
+                    scolorname=searchcolor(id,get(ax,'XColor'));\r
+                    if strcmp(get(ax,'XGrid'),'on')\r
+                        if axlimx(1)~=axlimx(2)\r
+                            xg_line_start = interp1([axlimx(1) axlimx(2)],[x(corners(k,2,p)) x(corners(k,3,p))],axxtick);\r
+                            yg_line_start = interp1([axlimx(1) axlimx(2)],[y(corners(k,2,p)) y(corners(k,3,p))],axxtick);\r
+                            xg_line_end = interp1([axlimx(1) axlimx(2)],[x(corners(k,4,p)) x(corners(k,5,p))],axxtick);\r
+                            yg_line_end = interp1([axlimx(1) axlimx(2)],[y(corners(k,4,p)) y(corners(k,5,p))],axxtick);\r
+                            for i = axxindex_inner\r
+                                line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,gridlinestyle,linewidth)\r
+                            end\r
+                            if strcmp(get(ax,'XTickMode'),'auto') && strcmp(get(ax,'XMinorGrid'),'on') && ~isempty(minor_axxtick)\r
+                                xg_line_start = interp1([axlimx(1) axlimx(2)],[x(corners(k,2,p)) x(corners(k,3,p))],minor_axxtick);\r
+                                yg_line_start = interp1([axlimx(1) axlimx(2)],[y(corners(k,2,p)) y(corners(k,3,p))],minor_axxtick);\r
+                                xg_line_end = interp1([axlimx(1) axlimx(2)],[x(corners(k,4,p)) x(corners(k,5,p))],minor_axxtick);\r
+                                yg_line_end = interp1([axlimx(1) axlimx(2)],[y(corners(k,4,p)) y(corners(k,5,p))],minor_axxtick);\r
+                                for i = 1:length(xg_line_start)\r
+                                    line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,minor_gridlinestyle,linewidth)\r
+                                end  \r
+                            end\r
+                        end\r
+                    end\r
+                    if projection.xyplane == false\r
+                        if strcmp(get(ax,'Box'),'on')\r
+                            line2svg(fid,grouplabel,axpos,[x(corners(k,2,p)) x(corners(k,3,p))],[y(corners(k,2,p)) y(corners(k,3,p))],scolorname,'-',linewidth);\r
+                            line2svg(fid,grouplabel,axpos,[x(corners(k,4,p)) x(corners(k,5,p))],[y(corners(k,4,p)) y(corners(k,5,p))],scolorname,'-',linewidth);\r
+                        else\r
+                            if strcmp(get(ax,'XGrid'),'on')\r
+                                line2svg(fid,grouplabel,axpos,[x(corners(k,2,p)) x(corners(k,3,p))],[y(corners(k,2,p)) y(corners(k,3,p))],scolorname,gridlinestyle,linewidth);\r
+                                line2svg(fid,grouplabel,axpos,[x(corners(k,4,p)) x(corners(k,5,p))],[y(corners(k,4,p)) y(corners(k,5,p))],scolorname,gridlinestyle,linewidth);\r
+                            end\r
+                        end\r
+                    end\r
+                case 2 % y\r
+                    % Draw y-grid\r
+                    scolorname=searchcolor(id,get(ax,'YColor'));\r
+                    if strcmp(get(ax,'YGrid'),'on')\r
+                        if axlimy(1)~=axlimy(2)\r
+                            xg_line_start = interp1([axlimy(1) axlimy(2)],[x(corners(k,2,p)) x(corners(k,3,p))],axytick);\r
+                            yg_line_start = interp1([axlimy(1) axlimy(2)],[y(corners(k,2,p)) y(corners(k,3,p))],axytick);\r
+                            xg_line_end = interp1([axlimy(1) axlimy(2)],[x(corners(k,4,p)) x(corners(k,5,p))],axytick);\r
+                            yg_line_end = interp1([axlimy(1) axlimy(2)],[y(corners(k,4,p)) y(corners(k,5,p))],axytick);\r
+                            for i = axyindex_inner\r
+                                line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,gridlinestyle,linewidth)\r
+                            end\r
+                            if strcmp(get(ax,'YTickMode'),'auto') && strcmp(get(ax,'YMinorGrid'),'on') && ~isempty(minor_axytick)\r
+                                xg_line_start = interp1([axlimy(1) axlimy(2)],[x(corners(k,2,p)) x(corners(k,3,p))],minor_axytick);\r
+                                yg_line_start = interp1([axlimy(1) axlimy(2)],[y(corners(k,2,p)) y(corners(k,3,p))],minor_axytick);\r
+                                xg_line_end = interp1([axlimy(1) axlimy(2)],[x(corners(k,4,p)) x(corners(k,5,p))],minor_axytick);\r
+                                yg_line_end = interp1([axlimy(1) axlimy(2)],[y(corners(k,4,p)) y(corners(k,5,p))],minor_axytick);\r
+                                for i = 1:length(xg_line_start)\r
+                                    line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,minor_gridlinestyle,linewidth)\r
+                                end  \r
+                            end\r
+                        end\r
+                    end\r
+                    if projection.xyplane == false\r
+                        if strcmp(get(ax,'Box'),'on')\r
+                            line2svg(fid,grouplabel,axpos,[x(corners(k,2,p)) x(corners(k,3,p))],[y(corners(k,2,p)) y(corners(k,3,p))],scolorname,'-',linewidth);\r
+                            line2svg(fid,grouplabel,axpos,[x(corners(k,4,p)) x(corners(k,5,p))],[y(corners(k,4,p)) y(corners(k,5,p))],scolorname,'-',linewidth);\r
+                        else\r
+                            if strcmp(get(ax,'YGrid'),'on')\r
+                                line2svg(fid,grouplabel,axpos,[x(corners(k,2,p)) x(corners(k,3,p))],[y(corners(k,2,p)) y(corners(k,3,p))],scolorname,gridlinestyle,linewidth);\r
+                                line2svg(fid,grouplabel,axpos,[x(corners(k,4,p)) x(corners(k,5,p))],[y(corners(k,4,p)) y(corners(k,5,p))],scolorname,gridlinestyle,linewidth);\r
+                            end\r
+                        end\r
+                    end\r
+                case 3 % z\r
+                    % Draw z-grid\r
+                    scolorname=searchcolor(id,get(ax,'ZColor'));\r
+                    if strcmp(get(ax,'ZGrid'),'on')\r
+                        if axlimz(1)~=axlimz(2)\r
+                            xg_line_start = interp1([axlimz(1) axlimz(2)],[x(corners(k,2,p)) x(corners(k,3,p))],axztick);\r
+                            yg_line_start = interp1([axlimz(1) axlimz(2)],[y(corners(k,2,p)) y(corners(k,3,p))],axztick);\r
+                            xg_line_end = interp1([axlimz(1) axlimz(2)],[x(corners(k,4,p)) x(corners(k,5,p))],axztick);\r
+                            yg_line_end = interp1([axlimz(1) axlimz(2)],[y(corners(k,4,p)) y(corners(k,5,p))],axztick);\r
+                            for i = axzindex_inner\r
+                                line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,gridlinestyle,linewidth);\r
+                            end\r
+                            if strcmp(get(ax,'ZTickMode'),'auto') && strcmp(get(ax,'ZMinorGrid'),'on') && ~isempty(minor_axztick)\r
+                                xg_line_start = interp1([axlimz(1) axlimz(2)],[x(corners(k,2,p)) x(corners(k,3,p))],minor_axztick);\r
+                                yg_line_start = interp1([axlimz(1) axlimz(2)],[y(corners(k,2,p)) y(corners(k,3,p))],minor_axztick);\r
+                                xg_line_end = interp1([axlimz(1) axlimz(2)],[x(corners(k,4,p)) x(corners(k,5,p))],minor_axztick);\r
+                                yg_line_end = interp1([axlimz(1) axlimz(2)],[y(corners(k,4,p)) y(corners(k,5,p))],minor_axztick);\r
+                                for i = 1:length(xg_line_start)\r
+                                    line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,minor_gridlinestyle,linewidth)\r
+                                end  \r
+                            end\r
+                        end\r
+                    end\r
+                    if projection.xyplane == false\r
+                        if strcmp(get(ax,'Box'),'on')\r
+                            line2svg(fid,grouplabel,axpos,[x(corners(k,2,p)) x(corners(k,3,p))],[y(corners(k,2,p)) y(corners(k,3,p))],scolorname,'-',linewidth);\r
+                            line2svg(fid,grouplabel,axpos,[x(corners(k,4,p)) x(corners(k,5,p))],[y(corners(k,4,p)) y(corners(k,5,p))],scolorname,'-',linewidth);\r
+                        else\r
+                            if strcmp(get(ax,'ZGrid'),'on')\r
+                                line2svg(fid,grouplabel,axpos,[x(corners(k,2,p)) x(corners(k,3,p))],[y(corners(k,2,p)) y(corners(k,3,p))],scolorname,gridlinestyle,linewidth);\r
+                                line2svg(fid,grouplabel,axpos,[x(corners(k,4,p)) x(corners(k,5,p))],[y(corners(k,4,p)) y(corners(k,5,p))],scolorname,gridlinestyle,linewidth);\r
+                            end\r
+                        end\r
+                    end\r
+            end\r
+        end\r
+    end\r
+end\r
+fprintf(fid,'    <g>\n');\r
+axchild=get(ax,'Child');\r
+group = axchild2svg(fid,id,axIdString,ax,group,paperpos,axchild,axpos,groupax,projection);\r
+fprintf(fid,'    </g>\n');\r
+if strcmp(get(ax,'Visible'),'on')\r
+    fprintf(fid,'    <g>\n');\r
+    % Search axis for labeling\r
+    if projection.xyplane\r
+        [x_axis_point_value, x_axis_point_index_top] = min(y);\r
+        [x_axis_point_value, x_axis_point_index_bottom] = max(y);\r
+        if strcmp(get(ax,'Box'),'on')\r
+            if strcmp(get(ax,'XAxisLocation'),'top')\r
+                x_axis_point_index = [x_axis_point_index_top x_axis_point_index_bottom];\r
+            else\r
+                x_axis_point_index = [x_axis_point_index_bottom x_axis_point_index_top];\r
+            end\r
+        else\r
+            if strcmp(get(ax,'XAxisLocation'),'top')\r
+                x_axis_point_index = x_axis_point_index_top;\r
+            else\r
+                x_axis_point_index = x_axis_point_index_bottom;\r
+            end\r
+        end\r
+        [y_axis_point_value, y_axis_point_index_left] = min(x);\r
+        [y_axis_point_value, y_axis_point_index_right] = max(x);\r
+        if strcmp(get(ax,'Box'),'on')\r
+            if strcmp(get(ax,'YAxisLocation'),'right')\r
+                y_axis_point_index = [y_axis_point_index_right y_axis_point_index_left];\r
+            else\r
+                y_axis_point_index = [y_axis_point_index_left y_axis_point_index_right];\r
+            end\r
+        else\r
+            if strcmp(get(ax,'YAxisLocation'),'right')\r
+                y_axis_point_index = y_axis_point_index_right;\r
+            else\r
+                y_axis_point_index = y_axis_point_index_left;\r
+            end\r
+        end\r
+        [z_axis_point_value, z_axis_point_index] = min(x);   \r
+    else\r
+        [x_axis_point_value, x_axis_point_index] = max(y);\r
+        [y_axis_value, y_axis_point_index] = max(y);\r
+        [z_axis_point_value, z_axis_point_index] = min(x);   \r
+    end\r
+    scolorname=searchcolor(id,get(ax,'XColor'));\r
+    % Draw 'box' of x-axis\r
+    if projection.xyplane == false\r
+        if strcmp(get(ax,'Box'),'on')\r
+            edge_line_index = [edge_opposite(most_back_edge_index) edge_neighbours(edge_opposite(most_back_edge_index),1)];\r
+            line2svg(fid,grouplabel,axpos,x(edge_line_index),y(edge_line_index),scolorname,'-',linewidth)\r
+        end\r
+    end\r
+    % Draw x-tick labels\r
+    if (strcmp(get(ax,'XTickLabelMode'),'auto') && strcmp(get(ax,'XScale'),'log'))\r
+        exponent = 1;\r
+    else\r
+        exponent = 0;\r
+    end\r
+    % Draw x-tick marks\r
+    if (ticklength(1) ~= 0)\r
+        if axlimx(1)~=axlimx(2)\r
+            x_label_end1 = interp1([0 1],[x(x_axis_point_index(1)) x(edge_neighbours(x_axis_point_index(1),2))],label_distance,'linear','extrap');\r
+            y_label_end1 = interp1([0 1],[y(x_axis_point_index(1)) y(edge_neighbours(x_axis_point_index(1),2))],label_distance,'linear','extrap');\r
+            x_label_end2 = interp1([0 1],[x(edge_neighbours(x_axis_point_index(1),1)) x(edge_neighbours(edge_neighbours(x_axis_point_index(1),1),2))],label_distance,'linear','extrap');\r
+            y_label_end2 = interp1([0 1],[y(edge_neighbours(x_axis_point_index(1),1)) y(edge_neighbours(edge_neighbours(x_axis_point_index(1),1),2))],label_distance,'linear','extrap');\r
+            xg_label_end = interp1([axlimx(1) axlimx(2)],[x_label_end1 x_label_end2],axxtick);\r
+            yg_label_end = interp1([axlimx(1) axlimx(2)],[y_label_end1 y_label_end2],axxtick);            \r
+            for k = 1:length(x_axis_point_index)\r
+                x_tick_end1 = interp1([0 1],[x(x_axis_point_index(k)) x(edge_neighbours(x_axis_point_index(k),2))],ticklength*tick_ratio(1),'linear','extrap');\r
+                y_tick_end1 = interp1([0 1],[y(x_axis_point_index(k)) y(edge_neighbours(x_axis_point_index(k),2))],ticklength*tick_ratio(1),'linear','extrap');\r
+                x_tick_end2 = interp1([0 1],[x(edge_neighbours(x_axis_point_index(k),1)) x(edge_neighbours(edge_neighbours(x_axis_point_index(k),1),2))],ticklength*tick_ratio(1),'linear','extrap');\r
+                y_tick_end2 = interp1([0 1],[y(edge_neighbours(x_axis_point_index(k),1)) y(edge_neighbours(edge_neighbours(x_axis_point_index(k),1),2))],ticklength*tick_ratio(1),'linear','extrap');\r
+                xg_line_start = interp1([axlimx(1) axlimx(2)],[x(x_axis_point_index(k)) x(edge_neighbours(x_axis_point_index(k),1))],axxtick);\r
+                yg_line_start = interp1([axlimx(1) axlimx(2)],[y(x_axis_point_index(k)) y(edge_neighbours(x_axis_point_index(k),1))],axxtick);\r
+                xg_line_end = interp1([axlimx(1) axlimx(2)],[x_tick_end1 x_tick_end2],axxtick);\r
+                yg_line_end = interp1([axlimx(1) axlimx(2)],[y_tick_end1 y_tick_end2],axxtick);\r
+                for i = valid_xsticks\r
+                    line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,'-',linewidth)\r
+                end\r
+                line2svg(fid,grouplabel,axpos,[x(x_axis_point_index(k)) x(edge_neighbours(x_axis_point_index(k),1))],[y(x_axis_point_index(k)) y(edge_neighbours(x_axis_point_index(k),1))],scolorname,'-',linewidth)\r
+            end\r
+            if ~isempty(axlabelx)\r
+                if strcmp(get(ax,'XAxisLocation'),'top')\r
+                    for i = axxindex\r
+                        label2svg(fid,grouplabel,axpos,ax,xg_label_end(i),yg_label_end(i),convertString(axlabelx(i,:)),'Center',0,'bottom',1,paperpos,scolorname,exponent);\r
+                    end\r
+                else\r
+                    for i = axxindex\r
+                        label2svg(fid,grouplabel,axpos,ax,xg_label_end(i),yg_label_end(i),convertString(axlabelx(i,:)),'Center',0,'top',1,paperpos,scolorname,exponent);\r
+                    end\r
+                end\r
+            end\r
+            \r
+        end\r
+    end\r
+    scolorname=searchcolor(id,get(ax,'YColor'));\r
+    % Draw 'box' of y-axis\r
+    if projection.xyplane == false\r
+        if strcmp(get(ax,'Box'),'on')\r
+            edge_line_index = [edge_opposite(most_back_edge_index) edge_neighbours(edge_opposite(most_back_edge_index),2)];\r
+            line2svg(fid,grouplabel,axpos,x(edge_line_index),y(edge_line_index),scolorname,'-',linewidth)\r
+        end\r
+    end\r
+    % Draw y-tick labels\r
+    if (strcmp(get(ax,'YTickLabelMode'),'auto') && strcmp(get(ax,'YScale'),'log'))\r
+        exponent = 1;\r
+    else\r
+        exponent = 0;\r
+    end\r
+    % Draw y-tick marks\r
+    if (ticklength(1) ~= 0)\r
+        if axlimy(1)~=axlimy(2)\r
+            x_label_end1 = interp1([0 1],[x(y_axis_point_index(1)) x(edge_neighbours(y_axis_point_index(1),1))],label_distance,'linear','extrap');\r
+            y_label_end1 = interp1([0 1],[y(y_axis_point_index(1)) y(edge_neighbours(y_axis_point_index(1),1))],label_distance,'linear','extrap');\r
+            x_label_end2 = interp1([0 1],[x(edge_neighbours(y_axis_point_index(1),2)) x(edge_neighbours(edge_neighbours(y_axis_point_index(1),2),1))],label_distance,'linear','extrap');\r
+            y_label_end2 = interp1([0 1],[y(edge_neighbours(y_axis_point_index(1),2)) y(edge_neighbours(edge_neighbours(y_axis_point_index(1),2),1))],label_distance,'linear','extrap');\r
+            xg_label_end = interp1([axlimy(1) axlimy(2)],[x_label_end1 x_label_end2],axytick);\r
+            yg_label_end = interp1([axlimy(1) axlimy(2)],[y_label_end1 y_label_end2],axytick);            \r
+            for k = 1:length(y_axis_point_index)\r
+                x_tick_end1 = interp1([0 1],[x(y_axis_point_index(k)) x(edge_neighbours(y_axis_point_index(k),1))],ticklength*tick_ratio(2),'linear','extrap');\r
+                y_tick_end1 = interp1([0 1],[y(y_axis_point_index(k)) y(edge_neighbours(y_axis_point_index(k),1))],ticklength*tick_ratio(2),'linear','extrap');\r
+                x_tick_end2 = interp1([0 1],[x(edge_neighbours(y_axis_point_index(k),2)) x(edge_neighbours(edge_neighbours(y_axis_point_index(k),2),1))],ticklength*tick_ratio(2),'linear','extrap');\r
+                y_tick_end2 = interp1([0 1],[y(edge_neighbours(y_axis_point_index(k),2)) y(edge_neighbours(edge_neighbours(y_axis_point_index(k),2),1))],ticklength*tick_ratio(2),'linear','extrap');\r
+                xg_line_start = interp1([axlimy(1) axlimy(2)],[x(y_axis_point_index(k)) x(edge_neighbours(y_axis_point_index(k),2))],axytick);\r
+                yg_line_start = interp1([axlimy(1) axlimy(2)],[y(y_axis_point_index(k)) y(edge_neighbours(y_axis_point_index(k),2))],axytick);\r
+                xg_line_end = interp1([axlimy(1) axlimy(2)],[x_tick_end1 x_tick_end2],axytick);\r
+                yg_line_end = interp1([axlimy(1) axlimy(2)],[y_tick_end1 y_tick_end2],axytick);\r
+                for i = valid_ysticks\r
+                    line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,'-',linewidth)\r
+                end\r
+                line2svg(fid,grouplabel,axpos,[x(y_axis_point_index(k)) x(edge_neighbours(y_axis_point_index(k),2))],[y(y_axis_point_index(k)) y(edge_neighbours(y_axis_point_index(k),2))],scolorname,'-',linewidth)\r
+            end\r
+            if ~isempty(axlabely)\r
+                if strcmp(get(ax,'YAxisLocation'),'right')\r
+                    for i = axyindex\r
+                        label2svg(fid,grouplabel,axpos,ax,xg_label_end(i),yg_label_end(i),convertString(axlabely(i,:)),'Left',0,'middle',1,paperpos,scolorname,exponent);\r
+                    end\r
+                else\r
+                    for i = axyindex\r
+                        label2svg(fid,grouplabel,axpos,ax,xg_label_end(i),yg_label_end(i),convertString(axlabely(i,:)),'Right',0,'middle',1,paperpos,scolorname,exponent);\r
+                    end\r
+                end\r
+            end\r
+        end\r
+    end\r
+    scolorname=searchcolor(id,get(ax,'ZColor'));\r
+    % Draw 'box' of z-axis\r
+    if projection.xyplane == false\r
+        if strcmp(get(ax,'Box'),'on')\r
+            edge_line_index = [edge_opposite(most_back_edge_index) edge_neighbours(edge_opposite(most_back_edge_index),3)];\r
+            line2svg(fid,grouplabel,axpos,x(edge_line_index),y(edge_line_index),scolorname,'-',linewidth)\r
+        end\r
+    end\r
+    if (strcmp(get(ax,'ZTickLabelMode'),'auto') && strcmp(get(ax,'ZScale'),'log'))\r
+        exponent = 1;\r
+    else\r
+        exponent = 0;\r
+    end\r
+    % Draw z-tick marks\r
+    if (ticklength(1) ~= 0)\r
+        if axlimz(1)~=axlimz(2)\r
+            x_tick_end1 = interp1([0 1],[x(z_axis_point_index) x(edge_neighbours(z_axis_point_index,2))],ticklength*tick_ratio(3),'linear','extrap');\r
+            y_tick_end1 = interp1([0 1],[y(z_axis_point_index) y(edge_neighbours(z_axis_point_index,2))],ticklength*tick_ratio(3),'linear','extrap');\r
+            x_tick_end2 = interp1([0 1],[x(edge_neighbours(z_axis_point_index,3)) x(edge_neighbours(edge_neighbours(z_axis_point_index,3),2))],ticklength*tick_ratio(3),'linear','extrap');\r
+            y_tick_end2 = interp1([0 1],[y(edge_neighbours(z_axis_point_index,3)) y(edge_neighbours(edge_neighbours(z_axis_point_index,3),2))],ticklength*tick_ratio(3),'linear','extrap');\r
+            x_label_end1 = interp1([0 1],[x(z_axis_point_index) x(edge_neighbours(z_axis_point_index,2))],label_distance,'linear','extrap');\r
+            y_label_end1 = interp1([0 1],[y(z_axis_point_index) y(edge_neighbours(z_axis_point_index,2))],label_distance,'linear','extrap');\r
+            x_label_end2 = interp1([0 1],[x(edge_neighbours(z_axis_point_index,3)) x(edge_neighbours(edge_neighbours(z_axis_point_index,3),2))],label_distance,'linear','extrap');\r
+            y_label_end2 = interp1([0 1],[y(edge_neighbours(z_axis_point_index,3)) y(edge_neighbours(edge_neighbours(z_axis_point_index,3),2))],label_distance,'linear','extrap');\r
+            xg_line_start = interp1([axlimz(1) axlimz(2)],[x(z_axis_point_index) x(edge_neighbours(z_axis_point_index,3))],axztick);\r
+            yg_line_start = interp1([axlimz(1) axlimz(2)],[y(z_axis_point_index) y(edge_neighbours(z_axis_point_index,3))],axztick);\r
+            xg_line_end = interp1([axlimz(1) axlimz(2)],[x_tick_end1 x_tick_end2],axztick);\r
+            yg_line_end = interp1([axlimz(1) axlimz(2)],[y_tick_end1 y_tick_end2],axztick);\r
+            xg_label_end = interp1([axlimz(1) axlimz(2)],[x_label_end1 x_label_end2],axztick);\r
+            yg_label_end = interp1([axlimz(1) axlimz(2)],[y_label_end1 y_label_end2],axztick);            \r
+            for i = valid_zsticks\r
+                line2svg(fid,grouplabel,axpos,[xg_line_start(i) xg_line_end(i)],[yg_line_start(i) yg_line_end(i)],scolorname,'-',linewidth)\r
+            end\r
+            line2svg(fid,grouplabel,axpos,[x(z_axis_point_index) x(edge_neighbours(z_axis_point_index,3))],[y(z_axis_point_index) y(edge_neighbours(z_axis_point_index,3))],scolorname,'-',linewidth)\r
+            if ~isempty(axlabelz)\r
+                for i = axzindex\r
+                    label2svg(fid,grouplabel,axpos,ax,xg_label_end(i),yg_label_end(i),convertString(axlabelz(i,:)),'Right',0,'middle',1,paperpos,scolorname,exponent);\r
+                end\r
+            end\r
+        end\r
+    end\r
+    exponent2svg(fid,groupax,axpos,paperpos,ax)\r
+    fprintf(fid,'    </g>\n');\r
+end\r
+fprintf(fid,'  </g>\n');\r
+set(ax,'Units',originalAxesUnits);\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% take any axis children and create objects for them\r
+function group=axchild2svg(fid,id,axIdString,ax,group,paperpos,axchild,axpos,groupax,projection)\r
+global fixcolorptr\r
+global colorname\r
+global PLOT2SVG_globals\r
+for i=length(axchild):-1:1\r
+    if strcmp(get(axchild(i), 'Visible'), 'off')\r
+        % do nothing\r
+    elseif strcmp(get(axchild(i),'Type'),'line')\r
+        scolorname=searchcolor(id,get(axchild(i),'Color'));\r
+        linestyle=get(axchild(i),'LineStyle');\r
+        linewidth=get(axchild(i),'LineWidth');\r
+        marker=get(axchild(i),'Marker');\r
+        markeredgecolor=get(axchild(i),'MarkerEdgeColor');\r
+        if ischar(markeredgecolor)\r
+            switch markeredgecolor\r
+                case 'none',markeredgecolorname='none';\r
+                otherwise,markeredgecolorname=scolorname;  % if markeredgecolorname is 'auto' or something else set the markeredgecolorname to the line color\r
+            end    \r
+        else    \r
+            markeredgecolorname=searchcolor(id,markeredgecolor);\r
+        end\r
+        markerfacecolor=get(axchild(i),'MarkerFaceColor');\r
+        if ischar(markerfacecolor)\r
+            switch markerfacecolor\r
+                case 'none',markerfacecolorname='none';\r
+                otherwise,markerfacecolorname=scolorname;  % if markerfacecolorname is 'auto' or something else set the markerfacecolorname to the line color\r
+            end\r
+        else\r
+            markerfacecolorname=searchcolor(id,markerfacecolor);\r
+        end\r
+        markersize=get(axchild(i),'MarkerSize')/1.5;\r
+        linex=get(axchild(i),'XData');\r
+        if strcmp(get(ax,'XScale'),'log')\r
+            linex(find(linex<=0)) = NaN;\r
+            linex=log10(linex);\r
+        end\r
+        liney=get(axchild(i),'YData');\r
+        if strcmp(get(ax,'YScale'),'log')\r
+            liney(find(liney<=0)) = NaN;\r
+            liney=log10(liney);\r
+        end\r
+        linez=get(axchild(i),'ZData');\r
+        if isempty(linez)\r
+            linez = zeros(size(linex));    \r
+        end\r
+        if strcmp(get(ax,'ZScale'),'log')\r
+            linez(find(linez<=0)) = NaN;\r
+            linez=log10(linez);\r
+        end\r
+        % put a line into a group with its markers\r
+        if strcmp(get(axchild(i),'Clipping'),'on')\r
+            fprintf(fid,'<g clip-path="url(#%s)">\n',axIdString);\r
+        else\r
+            fprintf(fid,'<g>\n');\r
+        end\r
+        [x,y,z] = project(linex,liney,linez,projection);\r
+        x = (x*axpos(3)+axpos(1))*paperpos(3);\r
+        y = (1-(y*axpos(4)+axpos(2)))*paperpos(4);\r
+        line2svg(fid,groupax,axpos,x,y,scolorname,linestyle,linewidth)\r
+        % put the markers into a subgroup of the lines\r
+        fprintf(fid,'<g>\n');\r
+        switch marker\r
+            case 'none';\r
+            case '.',group=group+1;,circle2svg(fid,group,axpos,x,y,markersize*0.25,'none',markeredgecolorname,linewidth);\r
+            case 'o',group=group+1;,circle2svg(fid,group,axpos,x,y,markersize*0.75,markeredgecolorname,markerfacecolorname,linewidth);\r
+            case '+',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,5)+ones(length(linex),1)*[-1 1 NaN 0 0]*markersize,y'*ones(1,5)+ones(length(liney),1)*[0 0 NaN -1 1]*markersize,markeredgecolorname,'-',linewidth,markeredgecolorname, 1, 1);   \r
+            case '*',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,11)+ones(length(linex),1)*[-1 1 NaN 0 0 NaN -0.7 0.7 NaN -0.7 0.7]*markersize,y'*ones(1,11)+ones(length(liney),1)*[0 0 NaN -1 1 NaN 0.7 -0.7 NaN -0.7 0.7]*markersize,markeredgecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case 'x',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,5)+ones(length(linex),1)*[-0.7 0.7 NaN -0.7 0.7]*markersize,y'*ones(1,5)+ones(length(liney),1)*[0.7 -0.7 NaN -0.7 0.7]*markersize,markeredgecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case 'square',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,5)+ones(length(linex),1)*[-1 -1 1 1 -1]*markersize,y'*ones(1,5)+ones(length(liney),1)*[-1 1 1 -1 -1]*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case 'diamond',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,5)+ones(length(linex),1)*[-0.7071 0 0.7071 0 -0.7071]*markersize,y'*ones(1,5)+ones(length(liney),1)*[0 1 0 -1 0]*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case 'pentagram',group=group+1;,patch2svg(fid,group,axpos,...\r
+                    x'*ones(1,11)+ones(length(linex),1)*[0 0.1180 0.5 0.1910 0.3090 0 -0.3090 -0.1910 -0.5 -0.1180 0]*1.3*markersize,...\r
+                    y'*ones(1,11)+ones(length(liney),1)*[-0.5257 -0.1625 -0.1625 0.0621 0.4253 0.2008 0.4253 0.0621 -0.1625 -0.1625 -0.5257]*1.3*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case 'hexagram',group=group+1;,patch2svg(fid,group,axpos,...\r
+                    x'*ones(1,13)+ones(length(linex),1)*[0 0.2309 0.6928 0.4619 0.6928 0.2309 0 -0.2309 -0.6928 -0.4619 -0.6928 -0.2309 0]*1*markersize,...\r
+                    y'*ones(1,13)+ones(length(liney),1)*[0.8 0.4 0.4 0 -0.4 -0.4 -0.8 -0.4 -0.4 0 0.4 0.4 0.8]*1*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);    \r
+            case '^',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,4)+ones(length(linex),1)*[-1 1 0 -1]*markersize,y'*ones(1,4)+ones(length(liney),1)*[0.577 0.577 -0.837 0.577]*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case 'v',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,4)+ones(length(linex),1)*[-1 1 0 -1]*markersize,y'*ones(1,4)+ones(length(liney),1)*[-0.577 -0.577 0.837 -0.577]*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case '<',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,4)+ones(length(linex),1)*[0.577 0.577 -0.837 0.577]*markersize,y'*ones(1,4)+ones(length(liney),1)*[-1 1 0 -1]*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+            case '>',group=group+1;,patch2svg(fid,group,axpos,x'*ones(1,4)+ones(length(linex),1)*[-0.577 -0.577 0.837 -0.577]*markersize,y'*ones(1,4)+ones(length(liney),1)*[-1 1 0 -1]*markersize,markerfacecolorname,'-',linewidth,markeredgecolorname, 1, 1);\r
+        end\r
+        % close the marker group\r
+        fprintf(fid,'</g>\n');\r
+        % close the line group\r
+        fprintf(fid,'</g>\n');\r
+    elseif strcmp(get(axchild(i),'Type'),'patch')\r
+        flat_shading = 1;\r
+        cmap=get(id,'Colormap');\r
+        pointc=get(axchild(i),'FaceVertexCData');\r
+        %pointc=get(axchild(i),'CData');\r
+        % Scale color if scaled color mapping is turned on\r
+        if strcmp(get(axchild(i),'CDataMapping'),'scaled')\r
+            clim=get(ax,'CLim');\r
+            pointc=(pointc-clim(1))/(clim(2)-clim(1))*(size(cmap,1)-1)+1;\r
+        end\r
+        % Limit index to smallest or biggest color index\r
+        pointc=max(pointc,1);\r
+        pointc=min(pointc,size(cmap,1));\r
+        if ~ischar(get(axchild(i),'FaceAlpha'))\r
+            face_opacity = get(axchild(i),'FaceAlpha');\r
+        else\r
+            face_opacity = 1.0;\r
+        end\r
+        if ~ischar(get(axchild(i),'EdgeAlpha'))\r
+            edge_opacity = get(axchild(i),'EdgeAlpha');\r
+        else\r
+            edge_opacity = 1.0;\r
+        end\r
+        linestyle=get(axchild(i),'LineStyle');\r
+        linewidth=get(axchild(i),'LineWidth');\r
+        points=get(axchild(i),'Vertices')';\r
+        if strcmp(get(ax,'XScale'),'log')\r
+            points(1,:)=log10(points(1,:));\r
+        end\r
+        if strcmp(get(ax,'YScale'),'log')\r
+            points(2,:)=log10(points(2,:));\r
+        end\r
+        % TODO LogZ\r
+        if size(points,1)==2\r
+            [x,y,z] = project(points(1,:),points(2,:),zeros(size(points(1,:))),projection);    \r
+        else\r
+            [x,y,z] = project(points(1,:),points(2,:),points(3,:),projection);\r
+        end\r
+        x = (x*axpos(3)+axpos(1))*paperpos(3);\r
+        y = (1-(y*axpos(4)+axpos(2)))*paperpos(4);\r
+        faces = get(axchild(i),'Faces');\r
+        if size(points,1)==3;\r
+            [z,index]=sort(z(faces(:,1)));\r
+            faces=faces(index,:);\r
+        end\r
+        if strcmp(get(axchild(i),'Clipping'),'on')\r
+            fprintf(fid,'<g clip-path="url(#%s)">\n',axIdString);\r
+        else\r
+            fprintf(fid,'<g>\n');\r
+        end\r
+        for p=1:size(faces,1)\r
+            if ischar(get(axchild(i),'FaceColor'))\r
+                if strcmp(get(axchild(i),'FaceColor'),'texturemap')\r
+                    facecolorname='none';   % TO DO: texture map\r
+                elseif strcmp(get(axchild(i),'FaceColor'),'none')\r
+                    facecolorname='none';\r
+                else\r
+                    if size(pointc,1)==1\r
+                        facecolor = pointc;    \r
+                    elseif size(pointc,1)==size(faces,1)\r
+                        if strcmp(get(axchild(i),'FaceColor'),'flat')\r
+                            facecolor = pointc(p,:);\r
+                        else\r
+                            facecolor = pointc(p,:);\r
+                            cdata = pointc(p,:);     % TO DO: color interpolation\r
+                            flat_shading = 0;\r
+                        end\r
+                    elseif size(pointc,1)==size(points,2)\r
+                        if strcmp(get(axchild(i),'FaceColor'),'flat')\r
+                            facecolor = pointc(faces(p,1));\r
+                        else\r
+                            facecolor = pointc(faces(p,1));\r
+                            cdata = pointc(faces(p,:));\r
+                            flat_shading = 0;\r
+                        end\r
+                    else\r
+                        error('Unsupported color handling for patches.');    \r
+                    end\r
+                    if ~isnan(facecolor)\r
+                        if size(facecolor,2)==1\r
+                            facecolorname = ['#' colorname(ceil(facecolor),:)];\r
+                        else\r
+                            facecolorname = searchcolor(id,facecolor);    \r
+                        end\r
+                    else\r
+                        facecolorname='none';\r
+                    end\r
+                end\r
+            else\r
+                facecolorname = searchcolor(id,get(axchild(i),'FaceColor'));       \r
+            end\r
+            if ischar(get(axchild(i),'EdgeColor'))\r
+                if strcmp(get(axchild(i),'EdgeColor'),'none')\r
+                    edgecolorname = 'none';\r
+                else\r
+                    if size(pointc,1)==1\r
+                        edgecolor = pointc;    \r
+                    elseif size(pointc,1)==size(faces,1)\r
+                        edgecolor = pointc(p,:);\r
+                    elseif size(pointc,1)==size(points,2)\r
+                        if strcmp(get(axchild(i),'EdgeColor'),'flat')\r
+                            edgecolor = pointc(faces(p,1));\r
+                        else\r
+                            edgecolor = pointc(faces(p,1));     % TO DO: color interpolation\r
+                        end\r
+                    else\r
+                        error('Unsupported color handling for patches.');    \r
+                    end\r
+                    if ~isnan(edgecolor)\r
+                        if size(edgecolor,2)==1\r
+                            edgecolorname = ['#' colorname(ceil(edgecolor),:)];\r
+                        else\r
+                            edgecolorname = searchcolor(id,edgecolor);    \r
+                        end\r
+                    else\r
+                        edgecolorname = 'none';\r
+                    end\r
+                end\r
+            else\r
+                edgecolorname = searchcolor(id,get(axchild(i),'EdgeColor'));       \r
+            end\r
+            if flat_shading\r
+                patch2svg(fid, group, axpos, x(faces(p,:)), y(faces(p,:)), facecolorname, linestyle, linewidth, edgecolorname, face_opacity, edge_opacity)\r
+            else\r
+                %patch2svg(fid, group, axpos, x(faces(p,:)), y(faces(p,:)), facecolorname, linestyle, linewidth, edgecolorname, face_opacity, edge_opacity)\r
+                gouraud_patch2svg(fid, group, axpos, x(faces(p,:)), y(faces(p,:)), cdata, linestyle, linewidth, edgecolorname, face_opacity, edge_opacity,id)\r
+            end\r
+        end\r
+        fprintf(fid,'</g>\n');\r
+    elseif strcmp(get(axchild(i),'Type'),'surface')\r
+        flat_shading = 1;\r
+        cmap=get(id,'Colormap');\r
+        [faces,points,pointc]=surf2patch(axchild(i));\r
+        points=points';\r
+        % Scale color if scaled color mapping is turned on\r
+        if strcmp(get(axchild(i),'CDataMapping'),'scaled')\r
+            clim=get(ax,'CLim');\r
+            pointc=(pointc-clim(1))/(clim(2)-clim(1))*(size(cmap,1)-1)+1;\r
+        end\r
+        % Limit index to smallest or biggest color index\r
+        pointc=max(pointc,1);\r
+        if ~ischar(get(axchild(i),'FaceAlpha'))\r
+            face_opacity = get(axchild(i),'FaceAlpha');\r
+        else\r
+            face_opacity = 1.0;\r
+        end\r
+        if ~ischar(get(axchild(i),'EdgeAlpha'))\r
+            edge_opacity = get(axchild(i),'EdgeAlpha');\r
+        else\r
+            edge_opacity = 1.0;\r
+        end\r
+        pointc=min(pointc,size(cmap,1));\r
+        linestyle=get(axchild(i),'LineStyle');\r
+        linewidth=get(axchild(i),'LineWidth');\r
+        if strcmp(get(ax,'XScale'),'log')\r
+            points(1,:)=log10(points(1,:));\r
+        end\r
+        if strcmp(get(ax,'YScale'),'log')\r
+            points(2,:)=log10(points(2,:));\r
+        end\r
+        if size(points,1)==3\r
+            if strcmp(get(ax,'ZScale'),'log')\r
+                points(3,:)=log10(points(3,:));\r
+            end   \r
+        end\r
+        if size(points,1)==3\r
+            [x,y,z] = project(points(1,:),points(2,:),points(3,:),projection); \r
+        else\r
+            [x,y,z] = project(points(1,:),points(2,:),zeros(size(points(1,:))),projection); \r
+        end\r
+        x = (x*axpos(3)+axpos(1))*paperpos(3);\r
+        y = (1-(y*axpos(4)+axpos(2)))*paperpos(4);\r
+        if size(points,1)==3;\r
+            [z,index]=sort(z(faces(:,1)));\r
+            faces=faces(index,:);\r
+        end\r
+        if strcmp(get(axchild(i),'Clipping'),'on')\r
+            fprintf(fid,'<g clip-path="url(#%s)">\n',axIdString);\r
+        else\r
+            fprintf(fid,'<g>\n');\r
+        end\r
+        for p=1:size(faces,1)\r
+            if ischar(get(axchild(i),'FaceColor'))\r
+                if strcmp(get(axchild(i),'FaceColor'),'texturemap')\r
+                    facecolorname='none';   % TO DO: texture map\r
+                elseif strcmp(get(axchild(i),'FaceColor'),'none')\r
+                    facecolorname='none';\r
+                else\r
+                    if size(pointc,1)==1\r
+                        facecolor = pointc;    \r
+                    elseif size(pointc,1)==size(faces,1)\r
+                        facecolor = pointc(p,:);\r
+                    elseif size(pointc,1)==size(points,2)\r
+                        if strcmp(get(axchild(i),'FaceColor'),'flat')\r
+                            facecolor = pointc(faces(p,1));\r
+                        else\r
+                            facecolor = pointc(faces(p,1));\r
+                            cdata = pointc(faces(p,:));\r
+                            flat_shading = 0;\r
+                        end\r
+                    else\r
+                        error('Unsupported color handling for patches.');    \r
+                    end\r
+                    if ~isnan(facecolor)\r
+                        if size(facecolor,2)==1\r
+                            facecolorname = ['#' colorname(ceil(facecolor),:)];\r
+                        else\r
+                            facecolorname = searchcolor(id,facecolor);    \r
+                        end\r
+                    else\r
+                        facecolorname='none';\r
+                    end\r
+                end\r
+            else\r
+                facecolorname = searchcolor(id,get(axchild(i),'FaceColor'));       \r
+            end\r
+            if ischar(get(axchild(i),'EdgeColor'))\r
+                if strcmp(get(axchild(i),'EdgeColor'),'none')\r
+                    edgecolorname = 'none';\r
+                else\r
+                    if size(pointc,1)==1\r
+                        edgecolor = pointc;    \r
+                    elseif size(pointc,1)==size(faces,1)\r
+                        edgecolor = pointc(p,:);\r
+                    elseif size(pointc,1)==size(points,2)\r
+                        if strcmp(get(axchild(i),'EdgeColor'),'flat')\r
+                            edgecolor = pointc(faces(p,1));\r
+                        else\r
+                            edgecolor = pointc(faces(p,1));     % TO DO: color interpolation\r
+                        end\r
+                    else\r
+                        error('Unsupported color handling for patches.');    \r
+                    end\r
+                    if ~isnan(edgecolor)\r
+                        if size(edgecolor,2)==1\r
+                            edgecolorname = ['#' colorname(ceil(edgecolor),:)];\r
+                        else\r
+                            edgecolorname = searchcolor(id,edgecolor);    \r
+                        end\r
+                    else\r
+                        edgecolorname = 'none';\r
+                    end\r
+                end\r
+            else\r
+                edgecolorname = searchcolor(id,get(axchild(i),'EdgeColor'));       \r
+            end\r
+            if flat_shading\r
+                patch2svg(fid, group, axpos, x(faces(p,:)), y(faces(p,:)), facecolorname, linestyle, linewidth, edgecolorname,  face_opacity, edge_opacity)\r
+            else\r
+                %patch2svg(fid, group, axpos, x(faces(p,:)), y(faces(p,:)), facecolorname, linestyle, linewidth, edgecolorname, face_opacity, edge_opacity)\r
+                gouraud_patch2svg(fid, group, axpos, x(faces(p,:)), y(faces(p,:)), cdata, linestyle, linewidth, edgecolorname, face_opacity, edge_opacity,id)\r
+            end\r
+        end\r
+        fprintf(fid,'</g>\n');\r
+    elseif strcmp(get(axchild(i),'Type'),'text')\r
+        if strcmp(get(axchild(i),'Clipping'),'on')\r
+            fprintf(fid,'<g clip-path="url(#%s)">\n',axIdString);\r
+            text2svg(fid,1,axpos,paperpos,axchild(i),ax,projection)\r
+            fprintf(fid,'</g>\n');\r
+        else\r
+            text2svg(fid,1,axpos,paperpos,axchild(i),ax,projection)\r
+        end\r
+    elseif strcmp(get(axchild(i),'Type'),'image')\r
+        cmap=get(id,'Colormap');\r
+        pointx=get(axchild(i),'XData');\r
+        pointy=get(axchild(i),'YData');\r
+        [x,y,z] = project(pointx,pointy,zeros(size(pointx)),projection); \r
+        pointc=get(axchild(i),'CData');\r
+        if strcmp(get(axchild(i),'CDataMapping'),'scaled')\r
+            clim=get(ax,'CLim');\r
+            pointc=(pointc-clim(1))/(clim(2)-clim(1))*size(cmap,1);\r
+        end\r
+        data_aspect_ratio = get(ax,'DataAspectRatio');\r
+        if length(x)==2\r
+            if size(pointc,2)==1\r
+                halfwidthx = abs(x(2) - x(1)) * data_aspect_ratio(1);\r
+            else\r
+                halfwidthx = abs(x(2)-x(1))/(size(pointc,2)-1);   \r
+            end\r
+        else\r
+            halfwidthx = data_aspect_ratio(1);\r
+        end\r
+        if length(y)==2\r
+            if size(pointc,1)==1\r
+                halfwidthy = abs(y(2)-y(1)) * data_aspect_ratio(2);\r
+            else\r
+                halfwidthy = abs(y(2)-y(1))/(size(pointc,1)-1);   \r
+            end\r
+        else\r
+            halfwidthy = data_aspect_ratio(2);\r
+        end\r
+        %         if length(pointx)==2\r
+        %             if size(pointc,2)==1\r
+        %                 halfwidthx = (pointx(2) - pointx(1)) * data_aspect_ratio(1);\r
+        %             else\r
+        %                 halfwidthx = (pointx(2)-pointx(1))/(size(pointc,2)-1);   \r
+        %             end\r
+        %         else\r
+        %             halfwidthx = data_aspect_ratio(1);\r
+        %         end\r
+        %         if length(pointy)==2\r
+        %             if size(pointc,1)==1\r
+        %                 halfwidthy = (pointy(2)-pointy(1)) * data_aspect_ratio(2);\r
+        %             else\r
+        %                 halfwidthy = (pointy(2)-pointy(1))/(size(pointc,1)-1);   \r
+        %             end\r
+        %         else\r
+        %             halfwidthy = data_aspect_ratio(2);\r
+        %         end\r
+        if strcmp(get(ax,'XDir'),'reverse')\r
+            if ndims(pointc) < 3\r
+                pointc=fliplr(pointc);\r
+            elseif ndims(pointc) == 3\r
+                for j = size(pointc,3)\r
+                    pointc(:,:,j)=fliplr(pointc(:,:,j));\r
+                end\r
+            else\r
+                error('Invalid number of dimensions of data.');\r
+            end\r
+        end\r
+        if strcmp(get(ax,'YDir'),'reverse')\r
+            if ndims(pointc) < 3\r
+                pointc=flipud(pointc);\r
+            elseif ndims(pointc) == 3\r
+                for j = size(pointc,3)\r
+                    pointc(:,:,j)=flipud(pointc(:,:,j));\r
+                end\r
+            else\r
+                error('Invalid number of dimensions of data.');\r
+            end\r
+        end\r
+        if ndims(pointc) ~= 3\r
+            pointc = max(min(round(double(pointc)),size(cmap,1)),1);\r
+        end\r
+        CameraUpVector=get(ax,'CameraUpVector');\r
+        filename = [PLOT2SVG_globals.basefilename sprintf('%03d',PLOT2SVG_globals.figurenumber) '.' PLOT2SVG_globals.pixelfiletype];\r
+        PLOT2SVG_globals.figurenumber = PLOT2SVG_globals.figurenumber + 1;\r
+        if exist(filename,'file')\r
+            lastwarn('');\r
+            delete(filename);\r
+            if strcmp(lastwarn,'File not found or permission denied.')\r
+                error('Cannot write image file. Make sure that no image is opened in an other program.')    \r
+            end\r
+        end\r
+        if ndims(pointc) < 3\r
+            pointc = flipud(pointc);\r
+        elseif ndims(pointc) == 3\r
+            for j = size(pointc,3)\r
+                pointc(:,:,j)=flipud(pointc(:,:,j));\r
+            end\r
+        else\r
+            error('Invalid number of dimensions of data.');\r
+        end\r
+        if ndims(pointc) == 3\r
+            %pointc is not indexed\r
+            imwrite(pointc,fullfile(PLOT2SVG_globals.basefilepath,filename),PLOT2SVG_globals.pixelfiletype);\r
+        else\r
+            %pointc is probably indexed\r
+            imwrite(pointc,cmap,fullfile(PLOT2SVG_globals.basefilepath,filename),PLOT2SVG_globals.pixelfiletype);\r
+        end\r
+        lx=(size(pointc,2)*halfwidthx)*axpos(3)*paperpos(3);\r
+        ly=(size(pointc,1)*halfwidthy)*axpos(4)*paperpos(4);\r
+        if strcmp(get(ax,'DataAspectRatioMode'),'manual')\r
+            pointsx=(min(x)*axpos(3)+axpos(1))*paperpos(3);\r
+            pointsy=(1-(max(y)*axpos(4)+axpos(2)))*paperpos(4);\r
+        else\r
+            pointsx=axpos(1)*paperpos(3);\r
+            pointsy=(1-(axpos(4)+axpos(2)))*paperpos(4);\r
+        end\r
+        if strcmp(get(axchild(i),'Clipping'),'on')\r
+            fprintf(fid,'<g clip-path="url(#%s)">\n',axIdString);\r
+            fprintf(fid,'<image x="%0.3f" y="%0.3f" width="%0.3f" height="%0.3f" image-rendering="optimizeSpeed" preserveAspectRatio="none" xlink:href="%s" />\n', pointsx, pointsy, lx, ly, filename);\r
+            fprintf(fid,'</g>\n');\r
+        else\r
+            fprintf(fid,'<image x="%0.3f" y="%0.3f" width="%0.3f" height="%0.3f" image-rendering="optimizeSpeed" preserveAspectRatio="none" xlink:href="%s" />\n', pointsx, pointsy, lx, ly, filename);\r
+        end\r
+    elseif strcmp(get(axchild(i),'Type'), 'hggroup')\r
+        % handle group types (like error bars)\r
+        % FIXME: they are not yet perfectly handled, there are more options\r
+        % that are not used\r
+        if strcmp(get(axchild(i),'Clipping'),'on')\r
+            fprintf(fid,'<g clip-path="url(#%s)">\n',axIdString);\r
+        else\r
+            fprintf(fid, '<g>');\r
+        end\r
+        group=axchild2svg(fid,id,axIdString,ax,group,paperpos,get(axchild(i), 'Children'),axpos,groupax);\r
+        fprintf(fid, '</g>');\r
+    elseif strcmp(get(axchild(i),'Type'), 'hgtransform')\r
+        if strcmpi(get(axchild(i), 'Visible'), 'on')\r
+            if strcmp(get(axchild(i),'Clipping'),'on')\r
+                fprintf(fid,'<g clip-path="url(#%s)">\n',axIdString);\r
+            else\r
+                fprintf(fid, '<g>');\r
+            end\r
+            group=axchild2svg(fid,id,axIdString,ax,group,paperpos,get(axchild(i), 'Children'),axpos,groupax);\r
+            fprintf(fid, '</g>');\r
+        end\r
+    else\r
+        disp(['   Warning: Unhandled child type: ' get(axchild(i),'Type')]);\r
+    end\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% create a patch (filled area)\r
+function patch2svg(fid,group,axpos,xtot,ytot,scolorname,style,width, edgecolorname, face_opacity, edge_opacity)\r
+for i=1:size(xtot,1)\r
+    x=xtot(i,:);\r
+    y=ytot(i,:);\r
+    switch style\r
+        case '--',pattern = 'stroke-dasharray="100pt,25pt"';\r
+        case ':',pattern = 'stroke-dasharray="25pt,25pt"';\r
+        case '-.',pattern = 'stroke-dasharray="100pt,25pt,25pt,25pt,"';\r
+        case 'none',pattern = 'stroke-dasharray="none"'; edge_opacity = 0.0;\r
+        otherwise,pattern='stroke-dasharray="none"';   \r
+    end \r
+    if (isnan(x)==zeros(size(x))&isnan(y)==zeros(size(y)))\r
+        for j=1:20000:length(x)\r
+            xx=x(j:min(length(x),j+19999));\r
+            yy=y(j:min(length(y),j+19999));\r
+            if ~strcmp(edgecolorname,'none') || ~strcmp(scolorname,'none')\r
+                fprintf(fid,'      <polyline fill="%s" fill-opacity="%0.2f" stroke="%s" stroke-width="%0.1fpt" stroke-opacity="%0.2f" %s points="',...\r
+                    scolorname, face_opacity, edgecolorname, width, edge_opacity, pattern);\r
+                fprintf(fid,'%0.3f,%0.3f ',[xx;yy]);\r
+                fprintf(fid,'"/>\n');        \r
+            end\r
+        end\r
+    else\r
+        parts=find(isnan(x)+isnan(y));\r
+        if parts(1)~=1\r
+            parts=[0 parts];\r
+        end\r
+        if parts(length(parts))~=length(x)\r
+            parts=[parts length(x)+1];\r
+        end\r
+        for j=1:(length(parts)-1)\r
+            xx=x((parts(j)+1):(parts(j+1)-1));\r
+            yy=y((parts(j)+1):(parts(j+1)-1));\r
+            if ~strcmp(edgecolorname,'none') || ~strcmp(scolorname,'none')\r
+                if length(xx)~=0\r
+                    fprintf(fid,'      <polyline fill="%s" fill-opacity="%0.2f" stroke="%s" stroke-width="%0.1fpt" stroke-opacity="%0.2f" %s points="',...\r
+                        scolorname, face_opacity, edgecolorname, width, edge_opacity, pattern);\r
+                    fprintf(fid,'%0.3f,%0.3f ',[xx;yy]);\r
+                    fprintf(fid,'"/>\n');        \r
+                end\r
+            end\r
+        end\r
+    end\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% create a patch (filled area)\r
+function gouraud_patch2svg(fid,group,axpos,xtot,ytot,cdata,style,width, edgecolorname, face_opacity, edge_opacity,id)\r
+global colorname\r
+for i=1:size(xtot,1)\r
+    x=xtot(i,:);\r
+    y=ytot(i,:);\r
+    switch style\r
+        case '--',pattern = 'stroke-dasharray="100pt,25pt"';\r
+        case ':',pattern = 'stroke-dasharray="25pt,25pt"';\r
+        case '-.',pattern = 'stroke-dasharray="100pt,25pt,25pt,25pt,"';\r
+        case 'none',pattern = 'stroke-dasharray="none"'; edge_opacity = 0.0;\r
+        otherwise,pattern='stroke-dasharray="none"';   \r
+    end \r
+    if (any(isnan(x)) || any(isnan(y)))\r
+        fprintf('Warning: Found NaN in Gouraud patch.\n')\r
+    else\r
+        % If there are more than 2 edges always 3 edges are taken togehter\r
+        % to form a triangle\r
+        if length(x) > 2\r
+            for j = 3:length(x)\r
+                coord = [x([1 j-1 j]);y([1 j-1 j])];\r
+                face_color = cdata(1,:);\r
+                face_color2 = cdata(j-1,:);\r
+                face_color3 = cdata(j,:);\r
+                delta = coord(:,3)-coord(:,2);\r
+                if det([delta (coord(:,1)-coord(:,2))]) ~= 0\r
+                    if ~isnan(face_color)\r
+                        IDstring1 = createId;\r
+                        IDstring2 = createId;\r
+                        if size(face_color2,2)==1\r
+                            face_color_name2 = ['#' colorname(ceil(face_color2),:)];\r
+                        else\r
+                            face_color_name2 = searchcolor(id,face_color2);    \r
+                        end\r
+                        if size(face_color3,2)==1\r
+                            face_color_name3 = ['#' colorname(ceil(face_color3),:)];\r
+                        else\r
+                            face_color_name3 = searchcolor(id,face_color3);    \r
+                        end\r
+                        grad_end=(delta)*(delta'*(coord(:,1)-coord(:,2)))/(delta'*delta) + coord(:,2);\r
+                        if size(face_color,2)==1\r
+                            face_color_name = ['#' colorname(ceil(face_color),:)];\r
+                        else\r
+                            face_color_name = searchcolor(id,face_color);    \r
+                        end\r
+                        fprintf(fid,'<defs>\n');\r
+                        fprintf(fid,'<linearGradient id="%s" gradientUnits="userSpaceOnUse" x1="%0.3f" y1="%0.3f" x2="%0.3f" y2="%0.3f">\n',...\r
+                            IDstring1, coord(1,2), coord(2,2), coord(1,3), coord(2,3));\r
+                        fprintf(fid,'<stop offset="0" stop-color="%s" stop-opacity="1"/>\n',face_color_name2);\r
+                        fprintf(fid,'<stop offset="1" stop-color="%s" stop-opacity="1"/>\n',face_color_name3);\r
+                        fprintf(fid,'</linearGradient>\n');\r
+                        fprintf(fid,'<linearGradient id="%s" gradientUnits="userSpaceOnUse" x1="%0.3f" y1="%0.3f" x2="%0.3f" y2="%0.3f">\n',...\r
+                            IDstring2, coord(1,1), coord(2,1), grad_end(1), grad_end(2));\r
+                        fprintf(fid,'<stop offset="0" stop-color="%s" stop-opacity="1"/>\n',face_color_name);\r
+                        fprintf(fid,'<stop offset="1" stop-color="%s" stop-opacity="0"/>\n',face_color_name);\r
+                        fprintf(fid,'</linearGradient>\n');\r
+                        fprintf(fid,'</defs>\n');    \r
+                        % Open group\r
+                        temp_string = sprintf('%0.3f,%0.3f ',coord);\r
+                        fprintf(fid,'<g opacity="%0.2f">\n',face_opacity);\r
+                        fprintf(fid,'<polyline fill="url(#%s)" stroke="none" points="%s"/>\n',IDstring1,temp_string);\r
+                        fprintf(fid,'<polyline fill="url(#%s)" stroke="none" points="%s"/>\n',IDstring2,temp_string);\r
+                        % Close group\r
+                        fprintf(fid,'</g>\n');\r
+                    end\r
+                end\r
+            end\r
+        end\r
+        % Last we draw the line around the patch\r
+        if ~strcmp(edgecolorname,'none')\r
+            fprintf(fid,'<polygon fill="none" stroke="%s" stroke-width="%0.1fpt" stroke-opacity="%0.2f" %s points="',...\r
+                edgecolorname, width, edge_opacity, pattern);\r
+            fprintf(fid,'%0.3f,%0.3f ',[x;y]);\r
+            fprintf(fid,'"/>\n');        \r
+        end\r
+    end\r
+end\r
+\r
+\r
+\r
+\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% create a line segment\r
+% this algorthm was optimized for large segement counts\r
+function line2svg(fid,group,axpos,x,y,scolorname,style,width)\r
+if ~strcmp(style,'none')\r
+    switch style\r
+        case '--',pattern='stroke-dasharray="8pt,2pt"';\r
+        case ':',pattern='stroke-dasharray="2pt,2pt"';\r
+        case '-.',pattern='stroke-dasharray="8pt,2pt,2pt,2pt,"';\r
+        otherwise,pattern='stroke-dasharray="none"';   \r
+    end\r
+    if (isnan(x)==zeros(size(x))&isnan(y)==zeros(size(y)))\r
+        for j=1:20000:length(x)\r
+            xx=x(j:min(length(x),j+19999));\r
+            yy=y(j:min(length(y),j+19999));\r
+            fprintf(fid,'      <polyline fill="none" stroke="%s" stroke-width="%0.1fpt" %s points="',scolorname, width, pattern);\r
+            fprintf(fid,'%0.3f,%0.3f ',[xx;yy]);\r
+            fprintf(fid,'"/>\n');\r
+        end\r
+    else\r
+        parts=find(isnan(x)+isnan(y));\r
+        if parts(1)~=1\r
+            parts=[0 parts];\r
+        end\r
+        if parts(length(parts))~=length(x)\r
+            parts=[parts length(x)+1];\r
+        end\r
+        for j=1:(length(parts)-1)\r
+            xx=x((parts(j)+1):(parts(j+1)-1));\r
+            yy=y((parts(j)+1):(parts(j+1)-1));\r
+            if length(xx)~=0\r
+                fprintf(fid,'      <polyline fill="none" stroke="%s" stroke-width="%0.1fpt" %s points="',scolorname, width, pattern);\r
+                fprintf(fid,'%0.3f,%0.3f ',[xx;yy]);\r
+                fprintf(fid,'"/>\n');\r
+            end\r
+        end\r
+    end\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% create a circle\r
+function circle2svg(fid,group,axpos,x,y,radius,markeredgecolorname,markerfacecolorname,width)\r
+for j=1:length(x)\r
+    if ~(isnan(x(j)) | isnan(y(j)))\r
+        if ~strcmp(markeredgecolorname,'none') || ~strcmp(markerfacecolorname,'none')\r
+            fprintf(fid,'<circle cx="%0.3f" cy="%0.3f" r="%0.3f" fill="%s" stroke="%s" stroke-width="%0.1fpt" />\n',x(j),y(j),radius,markerfacecolorname,markeredgecolorname,width);\r
+        end\r
+    end\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function control2svg(fid,id,ax,group,paperpos)\r
+global PLOT2SVG_globals\r
+set(ax,'Units','pixels');\r
+pos=get(ax,'Position');\r
+pict=getframe(id,pos);\r
+if isempty(pict.colormap)\r
+    pict.colormap=colormap;\r
+end\r
+filename = [PLOT2SVG_globals.basefilename sprintf('%03d',PLOT2SVG_globals.figurenumber) '.' PLOT2SVG_globals.pixelfiletype];\r
+PLOT2SVG_globals.figurenumber = PLOT2SVG_globals.figurenumber + 1;\r
+if exist(filename,'file')\r
+    lastwarn('');\r
+    delete(filename);\r
+    if strcmp(lastwarn,'File not found or permission denied.')\r
+        error('Cannot write image file. Make sure that no image is opened in an other program.')    \r
+    end\r
+end\r
+imwrite(pict.cdata,fullfile(PLOT2SVG_globals.basefilepath,filename),PLOT2SVG_globals.pixelfiletype);\r
+set(ax,'Units','normalized');\r
+posNorm=get(ax,'Position');\r
+posInches(1)=posNorm(1)*paperpos(3);\r
+posInches(2)=posNorm(2)*paperpos(4);\r
+posInches(3)=posNorm(3)*paperpos(3);\r
+posInches(4)=posNorm(4)*paperpos(4);\r
+lx = posInches(3);\r
+ly = posInches(4);\r
+pointsx = posInches(1);\r
+pointsy = paperpos(4)-posInches(2)-posInches(4);\r
+fprintf(fid,'<image x="%0.3f" y="%0.3f" width="%0.3f" height="%0.3f" image-rendering="optimizeSpeed" xlink:href="%s" />\n', pointsx, pointsy, lx, ly, filename);\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% create a text in the axis frame\r
+% the position of the text has to be adapted to the axis scaling\r
+function text2svg(fid,group,axpos,paperpos,id,ax,projection)\r
+originalTextUnits=get(id,'Units');\r
+set(id,'Units','Data');\r
+textpos=get(id,'Position');\r
+set(id,'FontUnits','points');\r
+textfontsize=get(id,'FontSize');\r
+fontsize=convertunit(get(id,'FontSize'),get(id,'FontUnit'),'points');   % convert fontsize to inches\r
+paperposOriginal=get(gcf,'Position');\r
+fontsize=fontsize*paperpos(4)/paperposOriginal(4);\r
+font_color=searchcolor(id,get(id,'Color'));\r
+if strcmp(get(ax,'XScale'),'log')\r
+    textpos(1)=log10(textpos(1));\r
+end\r
+if strcmp(get(ax,'YScale'),'log')\r
+    textpos(2)=log10(textpos(2));\r
+end\r
+if strcmp(get(ax,'ZScale'),'log')\r
+    textpos(3)=log10(textpos(3));\r
+end\r
+[x,y,z] = project(textpos(1),textpos(2),textpos(3),projection);\r
+x = (x*axpos(3)+axpos(1))*paperpos(3);\r
+y = (1-(y*axpos(4)+axpos(2)))*paperpos(4);\r
+textvalign=get(id,'VerticalAlignment');\r
+textalign=get(id,'HorizontalAlignment');\r
+texttext=get(id,'String');\r
+textrot=get(id,'Rotation');\r
+lines=max(size(get(id,'String'),1),1);\r
+if size(texttext,2)~=0\r
+    j=1;\r
+    for i=0:1:(lines-1)\r
+        if iscell(texttext)\r
+            label2svg(fid,group,axpos,id,x,y+i*(fontsize*1.11),convertString(texttext{j}),textalign,textrot,textvalign,lines,paperpos,font_color,0)\r
+        else\r
+            label2svg(fid,group,axpos,id,x,y+i*(fontsize*1.11),convertString(texttext(j,:)),textalign,textrot,textvalign,lines,paperpos,font_color,0)\r
+        end\r
+        j=j+1;   \r
+    end\r
+else\r
+    label2svg(fid,group,axpos,id,x,y,'',textalign,textrot,textvalign,lines,paperpos,font_color,0)\r
+end\r
+set(id,'Units',originalTextUnits);\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% adds the exponents to the axis thickmarks if needed\r
+% MATLAB itself offers no information about this exponent scaling\r
+% the exponent have therefore to be extracted from the thickmarks\r
+function exponent2svg(fid,group,axpos,paperpos,ax)\r
+if strcmp(get(ax,'XTickLabelMode'),'auto') & strcmp(get(ax,'XScale'),'linear')\r
+    fontsize=convertunit(get(ax,'FontSize'),get(ax,'FontUnit'),'points');   % convert fontsize to inches\r
+    font_color=searchcolor(ax,get(ax,'XColor'));\r
+    numlabels=str2num(get(ax,'XTickLabel'));\r
+    labelpos=get(ax,'XTick');\r
+    numlabels=numlabels(:);\r
+    labelpos=labelpos(:);\r
+    indexnz=find(labelpos ~= 0);\r
+    if (~isempty(indexnz) && ~isempty(numlabels))\r
+        ratio=numlabels(indexnz)./labelpos(indexnz);\r
+        if round(log10(ratio(1))) ~= 0\r
+            exptext=sprintf('&#215; 10<tspan font-size="%0.1fpt" dy="%0.1fpt">%g</tspan>',0.6*fontsize,-0.6*fontsize,-log10(ratio(1)));\r
+            label2svg(fid,group,axpos,ax,(axpos(1)+axpos(3))*paperpos(3),(1-axpos(2))*paperpos(4)+3*fontsize,exptext,'right',0,'top',1,paperpos,font_color,0)           \r
+        end\r
+    end\r
+end\r
+if strcmp(get(ax,'YTickLabelMode'),'auto') & strcmp(get(ax,'YScale'),'linear')\r
+    fontsize=convertunit(get(ax,'FontSize'),get(ax,'FontUnit'),'points');\r
+    font_color=searchcolor(ax,get(ax,'YColor'));\r
+    numlabels=str2num(get(ax,'YTickLabel'));\r
+    labelpos=get(ax,'YTick');\r
+    numlabels=numlabels(:);\r
+    labelpos=labelpos(:);\r
+    indexnz=find(labelpos ~= 0);\r
+    if (~isempty(indexnz) && ~isempty(numlabels))\r
+        ratio=numlabels(indexnz)./labelpos(indexnz);\r
+        if round(log10(ratio(1))) ~= 0\r
+            exptext=sprintf('&#215; 10<tspan font-size="%0.1fpt" dy="%0.1fpt">%g</tspan>',0.6*fontsize,-0.6*fontsize,-log10(ratio(1)));\r
+            label2svg(fid,group,axpos,ax,axpos(1)*paperpos(3),(1-(axpos(2)+axpos(4)))*paperpos(4)-0.5*fontsize,exptext,'left',0,'bottom',1,paperpos,font_color,0)           \r
+        end\r
+    end\r
+end\r
+if strcmp(get(ax,'ZTickLabelMode'),'auto') & strcmp(get(ax,'ZScale'),'linear')\r
+    fontsize=convertunit(get(ax,'FontSize'),get(ax,'FontUnit'),'points');\r
+    font_color=searchcolor(ax,get(ax,'ZColor'));\r
+    numlabels=str2num(get(ax,'ZTickLabel'));\r
+    labelpos=get(ax,'ZTick');\r
+    numlabels=numlabels(:);\r
+    labelpos=labelpos(:);\r
+    indexnz=find(labelpos ~= 0);\r
+    if (~isempty(indexnz) && ~isempty(numlabels))\r
+        ratio=numlabels(indexnz)./labelpos(indexnz);\r
+        if round(log10(ratio(1))) ~= 0\r
+            exptext=sprintf('&#215; 10<tspan font-size="%0.1fpt" dy="%0.1fpt">%g</tspan>',0.6*fontsize,-0.6*fontsize,-log10(ratio(1)));\r
+            label2svg(fid,group,axpos,ax,axpos(1)*paperpos(3),(1-(axpos(2)+axpos(4)))*paperpos(4)-0.5*fontsize,exptext,'left',0,'top',1,paperpos,font_color,0)           \r
+        end\r
+    end\r
+end\r
+\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% create a label in the figure\r
+% former versions of FrameMaker supported the commands FDY and FDX to shift the text\r
+% this commands were replaced by a shift parameter that is normed by the font size\r
+function label2svg(fid,group,axpos,id,x,y,tex,align,angle,valign,lines,paperpos,font_color,exponent)\r
+if isempty(tex)\r
+    return;\r
+end\r
+textfontname=get(id,'FontName');\r
+set(id,'FontUnits','points');\r
+textfontsize=get(id,'FontSize');\r
+if isfield(get(id),'Interpreter')\r
+    if strcmp(get(id,'Interpreter'),'tex')\r
+        latex=1;\r
+    else\r
+        latex=0;\r
+    end\r
+else\r
+    latex=1;\r
+end\r
+fontsize=convertunit(get(id,'FontSize'),get(id,'FontUnit'),'points');   % convert fontsize to inches\r
+paperposOriginal=get(gcf,'Position');\r
+fontsize=fontsize*paperpos(4)/paperposOriginal(4);\r
+textfontsize=textfontsize*paperpos(4)/paperposOriginal(4);\r
+switch lower(valign)\r
+    case 'top',shift=fontsize*0.8;\r
+    case 'cap',shift=fontsize*0.7;\r
+    case 'middle',shift=-((lines-1)/2*fontsize*1.11)+fontsize*0.3;\r
+    case 'bottom',shift=-((lines-1)*fontsize*1.11)+fontsize*-0.04;\r
+    otherwise,shift=0;\r
+end\r
+switch lower(align)\r
+    case 'right', anchor = 'end'; \r
+    case 'center',anchor = 'middle';\r
+    otherwise,anchor = 'start';\r
+end\r
+if iscellstr(tex)\r
+    tex = strvcat(tex);\r
+elseif ~ ischar(tex)\r
+    error('Invalid character type');\r
+end    \r
+if latex==1 \r
+    tex=strrep(tex,'\alpha','&#945;');\r
+    tex=strrep(tex,'\beta','&#946;');\r
+    tex=strrep(tex,'\gamma','&#947;');\r
+    tex=strrep(tex,'\delta','&#948;');\r
+    tex=strrep(tex,'\epsilon','&#949;');\r
+    tex=strrep(tex,'\zeta','&#950;');\r
+    tex=strrep(tex,'\eta','&#951;');\r
+    tex=strrep(tex,'\theta','&#952;');\r
+    tex=strrep(tex,'\vartheta','&#977;');\r
+    tex=strrep(tex,'\iota','&#953;');\r
+    tex=strrep(tex,'\kappa','&#954;');\r
+    tex=strrep(tex,'\lambda','&#955;');\r
+    tex=strrep(tex,'\mu','&#181;');\r
+    tex=strrep(tex,'\nu','&#957;');\r
+    tex=strrep(tex,'\xi','&#958;');\r
+    tex=strrep(tex,'\pi','&#960;');\r
+    tex=strrep(tex,'\roh','&#961;');\r
+    tex=strrep(tex,'\sigma','&#963;');\r
+    tex=strrep(tex,'\varsigma','&#962;');\r
+    tex=strrep(tex,'\tau','&#964;');\r
+    tex=strrep(tex,'\upsilon','&#965;');\r
+    tex=strrep(tex,'\phi','&#966;');\r
+    tex=strrep(tex,'\chi','&#967;');\r
+    tex=strrep(tex,'\psi','&#968;');\r
+    tex=strrep(tex,'\omega','&#969;');\r
+    tex=strrep(tex,'\Gamma','&#915;');\r
+    tex=strrep(tex,'\Delta','&#916;');\r
+    tex=strrep(tex,'\Theta','&#920;');\r
+    tex=strrep(tex,'\Lambda','&#923;');\r
+    tex=strrep(tex,'\Xi','&#926;');\r
+    tex=strrep(tex,'\Pi','&#928;');\r
+    tex=strrep(tex,'\Sigma','&#931;');\r
+    tex=strrep(tex,'\Tau','&#932;');\r
+    tex=strrep(tex,'\Upsilon','&#933;');\r
+    tex=strrep(tex,'\Phi','&#934;');\r
+    tex=strrep(tex,'\Psi','&#936;');\r
+    tex=strrep(tex,'\Omega','&#937;');\r
+    tex=strrep(tex,'\infty','&#8734;');\r
+    tex=strrep(tex,'\pm','&#177;');\r
+    tex=strrep(tex,'\Im','&#8465;');\r
+    tex=strrep(tex,'\Re','&#8476;');\r
+    tex=strrep(tex,'\approx','&#8773;');\r
+    tex=strrep(tex,'\leq','&#8804;');\r
+    tex=strrep(tex,'\geq','&#8805;');\r
+    tex=strrep(tex,'\times','&#215;');\r
+    tex=strrep(tex,'\leftrightarrow','&#8596;');\r
+    tex=strrep(tex,'\leftarrow','&#8592;');\r
+    tex=strrep(tex,'\uparrow','&#8593;');\r
+    tex=strrep(tex,'\rightarrow','&#8594;');\r
+    tex=strrep(tex,'\downarrow','&#8595;');\r
+    tex=strrep(tex,'\circ','&#186;');\r
+    tex=strrep(tex,'\propto','&#8733;');\r
+    tex=strrep(tex,'\partial','&#8706;');\r
+    tex=strrep(tex,'\bullet','&#8226;');\r
+    tex=strrep(tex,'\div','&#247;');\r
+    tex=latex2svg(tex,textfontname,textfontsize,'FNormal');\r
+end\r
+if isempty(tex)\r
+    return;\r
+end\r
+if exponent\r
+    tex=sprintf('10<tspan font-size="%0.1fpt" dy="%0.1fpt">%s</tspan>',0.6*textfontsize,-0.6*textfontsize,tex);\r
+    shift = shift + 0.4*fontsize;   % Small correction to make it look nicer\r
+end\r
+fprintf(fid,'  <g transform="translate(%0.3f,%0.3f)">\n',x,y+shift);\r
+fprintf(fid,'    <g transform="rotate(%0.1f)">\n',-angle);\r
+fprintf(fid,'      <text x="%0.3f" y="%0.3f" font-family="%s" text-anchor="%s" font-size="%0.1fpt" fill="%s" >', 0, 0, textfontname, anchor, textfontsize, font_color);\r
+fprintf(fid,'%s',tex);\r
+fprintf(fid,'</text>\n'); \r
+fprintf(fid,'    </g>\n');\r
+fprintf(fid,'  </g>\n');\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+% converts LATEX strings into Framemaker strings\r
+function returnvalue=latex2svg(StringText,font,size,style)\r
+if isempty(StringText)\r
+    returnvalue='';\r
+else\r
+    leftbracket=0;\r
+    rightbracket=0;\r
+    bracketcounter=0;\r
+    leftbracketpos=[];\r
+    rightbracketpos=[];\r
+    returnvalue=[];\r
+    for i=1:length(StringText)\r
+        if rightbracket==leftbracket\r
+            returnvalue=[returnvalue StringText(i)];    \r
+        end\r
+        if StringText(i)=='{'\r
+            leftbracket=leftbracket+1;\r
+            bracketcounter=bracketcounter+1;\r
+            leftbracketpos=[leftbracketpos i];\r
+        end\r
+        if StringText(i)=='}'\r
+            rightbracket=rightbracket+1;\r
+            rightbracketpos=[rightbracketpos i];\r
+            if rightbracket==leftbracket\r
+                fontnew=font;\r
+                sizenew=size;\r
+                stylenew=style;\r
+                if leftbracketpos(leftbracket-bracketcounter+1)~=1\r
+                    switch StringText(leftbracketpos(leftbracket-bracketcounter+1)-1)   \r
+                        case '^'\r
+                            stylenew='super';\r
+                            returnvalue=returnvalue(1:(end-1));\r
+                        case '_'\r
+                            stylenew='sub';\r
+                            returnvalue=returnvalue(1:(end-1));\r
+                    end\r
+                end\r
+                if strcmp(style,stylenew)\r
+                    format=[];\r
+                    formatend=[];\r
+                else\r
+                    format=['<tspan baseline-shift="' stylenew '">'];\r
+                    formatend=['</tspan>'];\r
+                end\r
+                textinbrackets=StringText((leftbracketpos(leftbracket-bracketcounter+1)+1):(rightbracketpos(rightbracket)-1));\r
+                foundpos=findstr(textinbrackets,'\bf');\r
+                if ~isempty(foundpos)\r
+                    textinbrackets=strrep(textinbrackets,'\bf','<tspan font-weight="bold">');\r
+                    textinbrackets=[textinbrackets '</tspan>'];\r
+                end\r
+                foundpos=findstr(textinbrackets,'\it');\r
+                if ~isempty(foundpos)\r
+                    textinbrackets=strrep(textinbrackets,'\it','<tspan font-style="italic">');\r
+                    textinbrackets=[textinbrackets '</tspan>'];\r
+                end\r
+                returnvalue=[returnvalue(1:(end-1)) format latex2svg(textinbrackets,fontnew,sizenew,stylenew) formatend];\r
+                bracketcounter=0;\r
+            end\r
+        end\r
+    end\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function name=searchcolor(id,value)\r
+if ischar(value)\r
+    name = value;\r
+else\r
+    name=sprintf('#%02x%02x%02x',fix(value(1)*255),fix(value(2)*255),fix(value(3)*255));\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function rvalue=convertunit(value,from,to)\r
+switch lower(from)  % convert from input unit to points\r
+    case 'points', rvalue=value;\r
+    case 'centimeters', rvalue=value/2.54*72;\r
+    case 'inches', rvalue=value*72; % 72 points = 1 inch\r
+    otherwise, error(['Unknown unit ' from '.']);\r
+end\r
+switch lower(to)    % convert from points to specified unit\r
+    case 'points', rvalue=rvalue;\r
+    case 'centimeters', rvalue=rvalue*2.54/72;\r
+    case 'inches', rvalue=rvalue/72;    % 72 points = 1 inch\r
+    otherwise, error(['Unknown unit ' to '.']);\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function strString=addBackSlash( strSlash)\r
+% adds a backslash at the last position of the string (if not already there)\r
+if ( strSlash(end) ~= '\')\r
+    strString = [ strSlash '\'];\r
+else\r
+    strString = strSlash;\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function strExt=getFileExtension( strFileName)\r
+% returns the file extension of a filename\r
+[path, name, strExt] = fileparts( strFileName);\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function StringText=convertString(StringText)\r
+if ~isempty(StringText)\r
+    StringText=strrep(StringText,'&','&amp;');  % Do not change sequence !!\r
+    StringText=strrep(StringText,'\\','\');\r
+    StringText=strrep(StringText,'<','&lt;');\r
+    StringText=strrep(StringText,'>','&gt;');\r
+    StringText=strrep(StringText,'"','&quot;');\r
+    StringText=deblank(StringText);\r
+end\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function IdString = createId\r
+global PLOT2SVG_globals\r
+IdString = ['ID' sprintf('%06d',PLOT2SVG_globals.runningIdNumber)];\r
+PLOT2SVG_globals.runningIdNumber = PLOT2SVG_globals.runningIdNumber + 1;\r
+\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function [projection, edges] = get_projection(ax,id)\r
+xc = get(ax,'CameraTarget');\r
+phi = get(ax,'CameraViewAngle');\r
+vi = get(ax,'View');\r
+xi = get(ax,'XLim');\r
+yi = get(ax,'YLim');\r
+zi = get(ax,'ZLim');\r
+if strcmp(get(ax,'XScale'),'log')\r
+    xi=log10(get(ax,'XLim'));\r
+end\r
+if strcmp(get(ax,'YScale'),'log')\r
+    yi=log10(get(ax,'YLim'));\r
+end\r
+if strcmp(get(ax,'ZScale'),'log')\r
+    zi=log10(get(ax,'ZLim'));\r
+end\r
+projection.xi = xi;\r
+projection.yi = yi;\r
+projection.zi = zi;\r
+projection.aspect_scaling = get(ax,'DataAspectRatio');\r
+xc(1) = (xc(1) - xi(1))/(xi(2)-xi(1));\r
+xc(2) = (xc(2) - yi(1))/(yi(2)-yi(1));\r
+xc(3) = (xc(3) - zi(1))/(zi(2)-zi(1));\r
+x = [xi(1) xi(2) xi(1) xi(2) xi(1) xi(2) xi(1) xi(2)]/projection.aspect_scaling(1);\r
+y = [yi(1) yi(1) yi(2) yi(2) yi(1) yi(1) yi(2) yi(2)]/projection.aspect_scaling(2);\r
+z = [zi(1) zi(1) zi(1) zi(1) zi(2) zi(2) zi(2) zi(2)]/projection.aspect_scaling(3);\r
+if strcmp(get(ax,'Projection'),'orthographic')\r
+    projection.A = viewmtx(vi(1),vi(2));\r
+else\r
+    projection.A = viewmtx(vi(1),vi(2),phi,xc);\r
+end\r
+if (vi(1) == 0) && (mod(vi(2),90) == 0)\r
+    projection.xyplane = true;\r
+else\r
+    projection.xyplane = false;\r
+end\r
+axpos = get(ax,'Position');\r
+figpos = get(id,'Position');\r
+[m,n] = size(x);\r
+x4d = [x(:),y(:),z(:),ones(m*n,1)]';\r
+x2d = projection.A*x4d;\r
+x2 = zeros(m,n); y2 = zeros(m,n); z2 = zeros(m,n);\r
+x2(:) = x2d(1,:)./x2d(4,:);\r
+y2(:) = x2d(2,:)./x2d(4,:);\r
+projection.ax = ax;\r
+projection.xrange = max(x2) - min(x2);\r
+projection.yrange = max(y2) - min(y2);\r
+projection.xoffset = (max(x2) + min(x2))/2;\r
+projection.yoffset = (max(y2) + min(y2))/2;\r
+if (strcmp(get(ax,'PlotBoxAspectRatioMode'),'manual') || strcmp(get(ax,'DataAspectRatioMode'),'manual'))\r
+    if (projection.xrange*axpos(4)*figpos(4) < projection.yrange*axpos(3)*figpos(3))\r
+        projection.xrange = projection.yrange*axpos(3)*figpos(3)/axpos(4)/figpos(4);\r
+    else\r
+        projection.yrange = projection.xrange*axpos(4)*figpos(4)/axpos(3)/figpos(3);\r
+    end\r
+end\r
+x2(:) = (x2d(1,:)./x2d(4,:) - projection.xoffset)/projection.xrange + 0.5;\r
+y2(:) = (x2d(2,:)./x2d(4,:) - projection.yoffset)/projection.yrange + 0.5;\r
+z2(:) =  x2d(3,:);\r
+edges = [x2; y2; z2];\r
+\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
+function [x2,y2,z2] = project(x,y,z,projection)\r
+[m,n] = size(x);\r
+if strcmp(get(projection.ax,'XDir'),'reverse')\r
+    xi = projection.xi;\r
+    x = (1 - (x - xi(1)) / (xi(2) - xi(1))) * (xi(2) - xi(1)) + xi(1);\r
+end\r
+if strcmp(get(projection.ax,'YDir'),'reverse')\r
+    yi = projection.yi;\r
+    y = (1 - (y - yi(1)) / (yi(2) - yi(1))) * (yi(2) - yi(1)) + yi(1);\r
+end\r
+x4d = [x(:)/projection.aspect_scaling(1), y(:)/projection.aspect_scaling(2), z(:)/projection.aspect_scaling(3), ones(m*n,1)]';\r
+x2d = projection.A*x4d;\r
+x2 = zeros(m,n); y2 = zeros(m,n); z2 = zeros(m,n);\r
+x2(:) = (x2d(1,:)./x2d(4,:) - projection.xoffset)/projection.xrange + 0.5;\r
+y2(:) = (x2d(2,:)./x2d(4,:) - projection.yoffset)/projection.yrange + 0.5;\r
+z2(:) =  x2d(3,:);\r
+%x = [0 1 0 1 0 1 0 1];\r
+%y = [0 0 1 1 0 0 1 1];\r
+%z = [0 0 0 0 1 1 1 1];\r