diff --git a/README.mkdn b/README.mkdn index 5ed0f166..32894415 100755 --- a/README.mkdn +++ b/README.mkdn @@ -2,7 +2,7 @@ > MATLAB Online Toolbox - Create interactive charts in your web browser with MATLAB and Plotly -Version: 2.2.8 +Version: 2.2.9 ## Install diff --git a/plotly/plotly_aux/plotly_version.m b/plotly/plotly_aux/plotly_version.m index 296b0b3e..f5767b8d 100644 --- a/plotly/plotly_aux/plotly_version.m +++ b/plotly/plotly_aux/plotly_version.m @@ -1,3 +1,3 @@ function version = plotly_version() - version = '2.2.8'; + version = '2.2.9'; end diff --git a/plotly/plotlyfig.m b/plotly/plotlyfig.m index 451b356b..b00135fb 100644 --- a/plotly/plotlyfig.m +++ b/plotly/plotlyfig.m @@ -58,6 +58,7 @@ obj.PlotOptions.OpenURL = true; obj.PlotOptions.Strip = true; obj.PlotOptions.Visible = 'on'; + obj.PlotOptions.TriangulatePatch = false; % offline options obj.PlotOptions.Offline = false; diff --git a/plotly/plotlyfig_aux/handlegraphics/updatePatch.m b/plotly/plotlyfig_aux/handlegraphics/updatePatch.m index 6d52fbdb..b89fffa2 100644 --- a/plotly/plotlyfig_aux/handlegraphics/updatePatch.m +++ b/plotly/plotlyfig_aux/handlegraphics/updatePatch.m @@ -70,119 +70,155 @@ %-patch type-% if any(nonzeros(patch_data.ZData)) - obj.data{patchIndex}.type = 'scatter3d'; + if obj.PlotOptions.TriangulatePatch + obj.data{patchIndex}.type = 'mesh3d'; + + % update the patch data using reducepatch + patch_data_red = reducepatch(obj.State.Plot(patchIndex).Handle, 1); + + else + obj.data{patchIndex}.type = 'scatter3d'; + end else obj.data{patchIndex}.type = 'scatter'; end %-------------------------------------------------------------------------% -%-patch x-% -xdata = patch_data.XData; -if isvector(xdata) - obj.data{patchIndex}.x = [xdata' xdata(1)]; -else - xtemp = reshape(xdata,[],1); - xnew = []; - for n = 1:size(xdata,2) - xnew = [xnew ; xdata(:,n) ; xdata(1,n); NaN]; +if ~strcmp(obj.data{patchIndex}.type, 'mesh3d') + %-patch x-% + xdata = patch_data.XData; + if isvector(xdata) + obj.data{patchIndex}.x = [xdata' xdata(1)]; + else + xtemp = reshape(xdata,[],1); + xnew = []; + for n = 1:size(xdata,2) + xnew = [xnew ; xdata(:,n) ; xdata(1,n); NaN]; + end + obj.data{patchIndex}.x = xnew; end - obj.data{patchIndex}.x = xnew; -end -%-------------------------------------------------------------------------% + %---------------------------------------------------------------------% -%-patch y-% -ydata = patch_data.YData; -if isvector(ydata) - obj.data{patchIndex}.y = [ydata' ydata(1)]; -else - ytemp = reshape(ydata,[],1); - ynew = []; - for n = 1:size(ydata,2) - ynew = [ynew ; ydata(:,n) ; ydata(1,n); NaN]; + %-patch y-% + ydata = patch_data.YData; + if isvector(ydata) + obj.data{patchIndex}.y = [ydata' ydata(1)]; + else + ytemp = reshape(ydata,[],1); + ynew = []; + for n = 1:size(ydata,2) + ynew = [ynew ; ydata(:,n) ; ydata(1,n); NaN]; + end + obj.data{patchIndex}.y = ynew; end - obj.data{patchIndex}.y = ynew; -end -%-------------------------------------------------------------------------% + %---------------------------------------------------------------------% + + %-patch z-% + if any(nonzeros(patch_data.ZData)) + zdata = patch_data.ZData; + + if isvector(ydata) + obj.data{patchIndex}.z = [zdata' zdata(1)]; + else + ztemp = reshape(zdata,[],1); + znew = []; + for n = 1:size(zdata,2) + znew = [znew ; zdata(:,n) ; zdata(1,n); NaN]; + end + obj.data{patchIndex}.z = znew; + end + end -%-patch z-% -if any(nonzeros(patch_data.ZData)) - zdata = patch_data.ZData; - - if isvector(ydata) - obj.data{patchIndex}.z = [zdata' zdata(1)]; + %---------------------------------------------------------------------% + + %-patch name-% + if ~isempty(patch_data.DisplayName); + obj.data{patchIndex}.name = patch_data.DisplayName; else - ztemp = reshape(zdata,[],1); - znew = []; - for n = 1:size(zdata,2) - znew = [znew ; zdata(:,n) ; zdata(1,n); NaN]; - end - obj.data{patchIndex}.z = znew; + obj.data{patchIndex}.name = patch_data.DisplayName; end -end -%-------------------------------------------------------------------------% + %---------------------------------------------------------------------% -%-patch name-% -if ~isempty(patch_data.DisplayName); - obj.data{patchIndex}.name = patch_data.DisplayName; -else - obj.data{patchIndex}.name = patch_data.DisplayName; -end + %-patch visible-% + obj.data{patchIndex}.visible = strcmp(patch_data.Visible,'on'); -%-------------------------------------------------------------------------% + %---------------------------------------------------------------------% -%-patch visible-% -obj.data{patchIndex}.visible = strcmp(patch_data.Visible,'on'); + %-patch fill-% + obj.data{patchIndex}.fill = 'tozeroy'; -%-------------------------------------------------------------------------% + %-PATCH MODE-% + if ~strcmpi('none', patch_data.Marker) && ~strcmpi('none', patch_data.LineStyle) + mode = 'lines+markers'; + elseif ~strcmpi('none', patch_data.Marker) + mode = 'markers'; + elseif ~strcmpi('none', patch_data.LineStyle) + mode = 'lines'; + else + mode = 'none'; + end -%-patch fill-% -obj.data{patchIndex}.fill = 'tozeroy'; + obj.data{patchIndex}.mode = mode; -%-PATCH MODE-% -if ~strcmpi('none', patch_data.Marker) && ~strcmpi('none', patch_data.LineStyle) - mode = 'lines+markers'; -elseif ~strcmpi('none', patch_data.Marker) - mode = 'markers'; -elseif ~strcmpi('none', patch_data.LineStyle) - mode = 'lines'; -else - mode = 'none'; -end + %---------------------------------------------------------------------% -obj.data{patchIndex}.mode = mode; + %-patch marker-% + obj.data{patchIndex}.marker = extractPatchMarker(patch_data); -%-------------------------------------------------------------------------% + %---------------------------------------------------------------------% -%-patch marker-% -obj.data{patchIndex}.marker = extractPatchMarker(patch_data); + %-patch line-% + obj.data{patchIndex}.line = extractPatchLine(patch_data); -%-------------------------------------------------------------------------% + %---------------------------------------------------------------------% -%-patch line-% -obj.data{patchIndex}.line = extractPatchLine(patch_data); + %-patch fillcolor-% + fill = extractPatchFace(patch_data); -%-------------------------------------------------------------------------% + if strcmp(obj.data{patchIndex}.type,'scatter'); + obj.data{patchIndex}.fillcolor = fill.color; + else + obj.data{patchIndex}.surfacecolor = fill.color; + end -%-patch fillcolor-% -fill = extractPatchFace(patch_data); + %---------------------------------------------------------------------% -if strcmp(obj.data{patchIndex}.type,'scatter'); - obj.data{patchIndex}.fillcolor = fill.color; + %-surfaceaxis-% + if strcmp(obj.data{patchIndex}.type,'scatter3d'); + minstd = min([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)]); + ind = find([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)] == minstd)-1; + obj.data{patchIndex}.surfaceaxis = ind; + end else - obj.data{patchIndex}.surfacecolor = fill.color; -end - -%-------------------------------------------------------------------------% + + % handle vertices + x_data = patch_data_red.vertices(:,1); + y_data = patch_data_red.vertices(:,2); + z_data = patch_data_red.vertices(:,3); + + % specify how vertices connect to form the faces + i_data = patch_data_red.faces(:,1)-1; + j_data = patch_data_red.faces(:,2)-1; + k_data = patch_data_red.faces(:,3)-1; + + %-patch x/y/z-% + obj.data{patchIndex}.x = x_data; + obj.data{patchIndex}.y = y_data; + obj.data{patchIndex}.z = z_data; + + %-patch i/j/k-% + obj.data{patchIndex}.i = i_data; + obj.data{patchIndex}.j = j_data; + obj.data{patchIndex}.k = k_data; + + %-patch fillcolor-% + fill = extractPatchFace(patch_data); + obj.data{patchIndex}.color = fill.color; -%-surfaceaxis-% -if strcmp(obj.data{patchIndex}.type,'scatter3d'); - minstd = min([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)]); - ind = find([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)] == minstd)-1; - obj.data{patchIndex}.surfaceaxis = ind; end %-------------------------------------------------------------------------%