Skip to content

Commit c54dff9

Browse files
Merge pull request #413 from plotly/adding_isosurface_functionality_to_matlab_plotly
adding isosurface functionality to matlab_plotly
2 parents 97a3250 + 00e40a9 commit c54dff9

File tree

2 files changed

+192
-0
lines changed

2 files changed

+192
-0
lines changed

plotly/plotlyfig_aux/core/updateData.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
updateTernaryPlotPro(obj, dataIndex);
9696
elseif ismember('ternpcolor', lower(obj.PlotOptions.TreatAs))
9797
updateTernaryPlotPro(obj, dataIndex);
98+
elseif ismember('isosurface', lower(obj.PlotOptions.TreatAs))
99+
updateIsosurface(obj, dataIndex);
98100
else
99101
updatePatch(obj, dataIndex);
100102
end
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
function obj = updateIsosurface(obj, isoIndex)
2+
3+
%-------------------------------------------------------------------------%
4+
5+
%-INITIALIZATIONS-%
6+
7+
axIndex = obj.getAxisIndex(obj.State.Plot(isoIndex).AssociatedAxis);
8+
plotData = get(obj.State.Plot(isoIndex).Handle);
9+
axisData = get(plotData.Parent);
10+
[xSource, ySource] = findSourceAxis(obj, axIndex);
11+
12+
%-update scene-%
13+
updateScene(obj, isoIndex)
14+
15+
%-get mesh data-%
16+
xData = plotData.Vertices(:, 1);
17+
yData = plotData.Vertices(:, 2);
18+
zData = plotData.Vertices(:, 3);
19+
20+
iData = plotData.Faces(:, 1) - 1;
21+
jData = plotData.Faces(:, 2) - 1;
22+
kData = plotData.Faces(:, 3) - 1;
23+
24+
%-------------------------------------------------------------------------%
25+
26+
%-get trace-%
27+
obj.data{isoIndex}.type = 'mesh3d';
28+
obj.data{isoIndex}.name = plotData.DisplayName;
29+
obj.data{isoIndex}.showscale = false;
30+
31+
%-------------------------------------------------------------------------%
32+
33+
%-set mesh data-%
34+
obj.data{isoIndex}.x = xData;
35+
obj.data{isoIndex}.y = yData;
36+
obj.data{isoIndex}.z = zData;
37+
38+
obj.data{isoIndex}.i = iData;
39+
obj.data{isoIndex}.j = jData;
40+
obj.data{isoIndex}.k = kData;
41+
42+
%-------------------------------------------------------------------------%
43+
44+
%-mesh coloring-%
45+
faceColor = getFaceColor(plotData, axisData);
46+
47+
if iscell(faceColor)
48+
obj.data{isoIndex}.facecolor = faceColor;
49+
else
50+
obj.data{isoIndex}.color = faceColor;
51+
end
52+
53+
%-------------------------------------------------------------------------%
54+
55+
%-lighting settings-%
56+
if ~strcmp(plotData.FaceLighting, 'flat')
57+
obj.data{isoIndex}.lighting.diffuse = plotData.DiffuseStrength;
58+
obj.data{isoIndex}.lighting.ambient = plotData.AmbientStrength;
59+
obj.data{isoIndex}.lighting.specular = plotData.SpecularStrength;
60+
obj.data{isoIndex}.lighting.roughness = 0.2;
61+
obj.data{isoIndex}.lighting.fresnel = 0.5;
62+
obj.data{isoIndex}.lighting.vertexnormalsepsilon = 1e-12;
63+
obj.data{isoIndex}.lighting.facenormalsepsilon = 1e-6;
64+
end
65+
66+
%-------------------------------------------------------------------------%
67+
68+
%-associate scene to trace-%
69+
obj.data{isoIndex}.scene = sprintf('scene%d', xSource);
70+
71+
%-------------------------------------------------------------------------%
72+
end
73+
74+
function updateScene(obj, isoIndex)
75+
76+
%-INITIALIZATIONS-%
77+
axIndex = obj.getAxisIndex(obj.State.Plot(isoIndex).AssociatedAxis);
78+
plotData = get(obj.State.Plot(isoIndex).Handle);
79+
axisData = get(plotData.Parent);
80+
[xSource, ySource] = findSourceAxis(obj, axIndex);
81+
scene = eval( sprintf('obj.layout.scene%d', xSource) );
82+
83+
aspectRatio = axisData.PlotBoxAspectRatio;
84+
cameraPosition = axisData.CameraPosition;
85+
dataAspectRatio = axisData.DataAspectRatio;
86+
cameraUpVector = axisData.CameraUpVector;
87+
cameraEye = cameraPosition./dataAspectRatio;
88+
normFac = 0.5*abs(min(cameraEye));
89+
90+
%-aspect ratio-%
91+
scene.aspectratio.x = aspectRatio(1);
92+
scene.aspectratio.y = aspectRatio(2);
93+
scene.aspectratio.z = aspectRatio(3);
94+
95+
%-camera eye-%
96+
scene.camera.eye.x = cameraEye(1) / normFac;
97+
scene.camera.eye.y = cameraEye(2) / normFac;
98+
scene.camera.eye.z = cameraEye(3) / normFac;
99+
100+
%-camera up-%
101+
scene.camera.up.x = cameraUpVector(1);
102+
scene.camera.up.y = cameraUpVector(2);
103+
scene.camera.up.z = cameraUpVector(3);
104+
105+
%-camera projection-%
106+
% scene.camera.projection.type = axisData.Projection;
107+
108+
%-scene axis configuration-%
109+
scene.xaxis.range = axisData.XLim;
110+
scene.yaxis.range = axisData.YLim;
111+
scene.zaxis.range = axisData.ZLim;
112+
113+
scene.xaxis.zeroline = false;
114+
scene.yaxis.zeroline = false;
115+
scene.zaxis.zeroline = false;
116+
117+
scene.xaxis.showline = true;
118+
scene.yaxis.showline = true;
119+
scene.zaxis.showline = true;
120+
121+
scene.xaxis.ticklabelposition = 'outside';
122+
scene.yaxis.ticklabelposition = 'outside';
123+
scene.zaxis.ticklabelposition = 'outside';
124+
125+
scene.xaxis.title = axisData.XLabel.String;
126+
scene.yaxis.title = axisData.YLabel.String;
127+
scene.zaxis.title = axisData.ZLabel.String;
128+
129+
%-tick labels-%
130+
scene.xaxis.tickvals = axisData.XTick;
131+
scene.xaxis.ticktext = axisData.XTickLabel;
132+
scene.yaxis.tickvals = axisData.YTick;
133+
scene.yaxis.ticktext = axisData.YTickLabel;
134+
scene.zaxis.tickvals = axisData.ZTick;
135+
scene.zaxis.ticktext = axisData.ZTickLabel;
136+
137+
scene.xaxis.tickcolor = 'rgba(0,0,0,1)';
138+
scene.yaxis.tickcolor = 'rgba(0,0,0,1)';
139+
scene.zaxis.tickcolor = 'rgba(0,0,0,1)';
140+
scene.xaxis.tickfont.size = axisData.FontSize;
141+
scene.yaxis.tickfont.size = axisData.FontSize;
142+
scene.zaxis.tickfont.size = axisData.FontSize;
143+
scene.xaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
144+
scene.yaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
145+
scene.zaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
146+
147+
%-grid-%
148+
if strcmp(axisData.XGrid, 'off'), scene.xaxis.showgrid = false; end
149+
if strcmp(axisData.YGrid, 'off'), scene.yaxis.showgrid = false; end
150+
if strcmp(axisData.ZGrid, 'off'), scene.zaxis.showgrid = false; end
151+
152+
%-SET SCENE TO LAYOUT-%
153+
obj.layout = setfield(obj.layout, sprintf('scene%d', xSource), scene);
154+
end
155+
156+
function fillColor = getFaceColor(plotData, axisData)
157+
158+
%-initializations-%
159+
faceColor = plotData.FaceColor;
160+
cData = plotData.CData;
161+
cLim = axisData.CLim;
162+
colorMap = axisData.Colormap;
163+
164+
%-get face color depending of faceColor attribute
165+
if isnumeric(faceColor)
166+
numColor = 255 * faceColor;
167+
fillColor = sprintf('rgb(%f,%f,%f)', numColor);
168+
169+
elseif strcmpi(faceColor, 'flat')
170+
fillColor = getStringColor(cData, colorMap, cLim);
171+
172+
elseif strcmpi(faceColor, 'interp')
173+
if size(cData, 1) ~= 1
174+
for n = 1:size(cData, 2)
175+
fillColor{n} = getStringColor(mean(cData(:, n)), colorMap, cLim);
176+
end
177+
else
178+
% TODO
179+
end
180+
end
181+
end
182+
183+
function stringColor = getStringColor(cData, colorMap, cLim)
184+
nColors = size(colorMap, 1);
185+
cIndex = max( min( cData, cLim(2) ), cLim(1) );
186+
scaleColor = (cIndex - cLim(1)) / diff(cLim);
187+
cIndex = 1 + floor(scaleColor*(nColors-1));
188+
numColor = 255 * colorMap(cIndex, :);
189+
stringColor = sprintf('rgb(%f,%f,%f)', numColor);
190+
end

0 commit comments

Comments
 (0)