1
+ function obj = updateSlice(obj , dataIndex )
2
+
3
+ % -------------------------------------------------------------------------%
4
+
5
+ % -INITIALIZATIONS-%
6
+
7
+ axIndex = obj .getAxisIndex(obj .State .Plot(dataIndex ).AssociatedAxis);
8
+ plotData = get(obj .State .Plot(dataIndex ).Handle);
9
+ axisData = get(plotData .Parent );
10
+ figureData = get(obj .State .Figure .Handle );
11
+ [xSource , ~ ] = findSourceAxis(obj ,axIndex );
12
+
13
+ % -update scene-%
14
+ updateScene(obj , dataIndex )
15
+
16
+ % -get trace data-%
17
+ xData = plotData .XData ;
18
+ yData = plotData .YData ;
19
+ zData = plotData .ZData ;
20
+ cData = plotData .CData ;
21
+
22
+ xDataSurf = zeros(2 *(size(xData )-1 ));
23
+ yDataSurf = zeros(2 *(size(xData )-1 ));
24
+ zDataSurf = zeros(2 *(size(xData )-1 ));
25
+ cDataSurf = zeros(2 *(size(xData )-1 ));
26
+
27
+ for n = 1 : size(xData ,2 )-1
28
+ n2 = 2 *(n - 1 ) + 1 ;
29
+
30
+ for m = 1 : size(xData ,1 )-1
31
+ m2 = 2 *(m - 1 ) + 1 ;
32
+
33
+ xDataSurf(m2 : m2 + 1 ,n2 : n2 + 1 ) = xData(m : m + 1 ,n : n + 1 );
34
+ yDataSurf(m2 : m2 + 1 ,n2 : n2 + 1 ) = yData(m : m + 1 ,n : n + 1 );
35
+ zDataSurf(m2 : m2 + 1 ,n2 : n2 + 1 ) = zData(m : m + 1 ,n : n + 1 );
36
+
37
+ if strcmp(plotData .FaceColor , ' flat' )
38
+ cDataSurf(m2 : m2 + 1 ,n2 : n2 + 1 ) = ones(2 ,2 )*cData(m ,n );
39
+ elseif strcmp(plotData .FaceColor , ' interp' )
40
+ cDataSurf(m2 : m2 + 1 ,n2 : n2 + 1 ) = cData(m : m + 1 ,n : n + 1 );
41
+ end
42
+
43
+ end
44
+ end
45
+
46
+ % -------------------------------------------------------------------------%
47
+
48
+ % -set trace-%
49
+ obj.data{dataIndex }.type = ' surface' ;
50
+ obj.data{dataIndex }.name = plotData .DisplayName ;
51
+ obj.data{dataIndex }.visible = strcmp(plotData .Visible ,' on' );
52
+ obj.data{dataIndex }.scene = sprintf(' scene%d ' , xSource );
53
+ obj.data{dataIndex }.showscale = false ;
54
+ obj.data{dataIndex }.surfacecolor = cDataSurf ;
55
+
56
+ % -------------------------------------------------------------------------%
57
+
58
+ % -set trace data-%
59
+ obj.data{dataIndex }.x = xDataSurf ;
60
+ obj.data{dataIndex }.y = yDataSurf ;
61
+ obj.data{dataIndex }.z = zDataSurf ;
62
+
63
+ % -------------------------------------------------------------------------%
64
+
65
+ % -update face color-%
66
+ updateSurfaceFaceColor(obj , dataIndex , cDataSurf );
67
+
68
+ % -update edge color-%
69
+ if isnumeric(plotData .EdgeColor )
70
+ updateSurfaceEdgeColor(obj , dataIndex );
71
+ end
72
+
73
+ % -------------------------------------------------------------------------%
74
+ end
75
+
76
+ function updateScene(obj , dataIndex )
77
+
78
+ % -------------------------------------------------------------------------%
79
+
80
+ % -INITIALIZATIONS-%
81
+ axIndex = obj .getAxisIndex(obj .State .Plot(dataIndex ).AssociatedAxis);
82
+ plotData = get(obj .State .Plot(dataIndex ).Handle);
83
+ axisData = get(plotData .Parent );
84
+ [xSource , ~ ] = findSourceAxis(obj , axIndex );
85
+ scene = eval( sprintf(' obj.layout.scene%d ' , xSource ) );
86
+
87
+ aspectRatio = axisData .PlotBoxAspectRatio ;
88
+ cameraPosition = axisData .CameraPosition ;
89
+ dataAspectRatio = axisData .DataAspectRatio ;
90
+ cameraUpVector = axisData .CameraUpVector ;
91
+ cameraEye = cameraPosition ./ dataAspectRatio ;
92
+ normFac = 0.625 * abs(min(cameraEye ));
93
+
94
+ % -------------------------------------------------------------------------%
95
+
96
+ % -aspect ratio-%
97
+ scene.aspectratio.x = 1.15 * aspectRatio(1 );
98
+ scene.aspectratio.y = 1.0 * aspectRatio(2 );
99
+ scene.aspectratio.z = 0.9 * aspectRatio(3 );
100
+
101
+ % -camera eye-%
102
+ scene.camera.eye.x = cameraEye(1 ) / normFac ;
103
+ scene.camera.eye.y = cameraEye(2 ) / normFac ;
104
+ scene.camera.eye.z = cameraEye(3 ) / normFac ;
105
+
106
+ % -camera up-%
107
+ scene.camera.up.x = cameraUpVector(1 );
108
+ scene.camera.up.y = cameraUpVector(2 );
109
+ scene.camera.up.z = cameraUpVector(3 );
110
+
111
+ % -camera projection-%
112
+ % scene.camera.projection.type = axisData.Projection;
113
+
114
+ % -------------------------------------------------------------------------%
115
+
116
+ % -scene axis configuration-%
117
+ scene.xaxis.range = axisData .XLim ;
118
+ scene.yaxis.range = axisData .YLim ;
119
+ scene.zaxis.range = axisData .ZLim ;
120
+
121
+ scene.xaxis.zeroline = false ;
122
+ scene.yaxis.zeroline = false ;
123
+ scene.zaxis.zeroline = false ;
124
+
125
+ scene.xaxis.showline = true ;
126
+ scene.yaxis.showline = true ;
127
+ scene.zaxis.showline = true ;
128
+
129
+ scene.xaxis.ticklabelposition = ' outside' ;
130
+ scene.yaxis.ticklabelposition = ' outside' ;
131
+ scene.zaxis.ticklabelposition = ' outside' ;
132
+
133
+ scene.xaxis.title = axisData .XLabel .String ;
134
+ scene.yaxis.title = axisData .YLabel .String ;
135
+ scene.zaxis.title = axisData .ZLabel .String ;
136
+
137
+ % -tick labels-%
138
+ scene.xaxis.tickvals = axisData .XTick ;
139
+ scene.xaxis.ticktext = axisData .XTickLabel ;
140
+ scene.yaxis.tickvals = axisData .YTick ;
141
+ scene.yaxis.ticktext = axisData .YTickLabel ;
142
+ scene.zaxis.tickvals = axisData .ZTick ;
143
+ scene.zaxis.ticktext = axisData .ZTickLabel ;
144
+
145
+ scene.xaxis.tickcolor = ' rgba(0,0,0,1)' ;
146
+ scene.yaxis.tickcolor = ' rgba(0,0,0,1)' ;
147
+ scene.zaxis.tickcolor = ' rgba(0,0,0,1)' ;
148
+ scene.xaxis.tickfont.size = axisData .FontSize ;
149
+ scene.yaxis.tickfont.size = axisData .FontSize ;
150
+ scene.zaxis.tickfont.size = axisData .FontSize ;
151
+ scene.xaxis.tickfont.family = matlab2plotlyfont(axisData .FontName );
152
+ scene.yaxis.tickfont.family = matlab2plotlyfont(axisData .FontName );
153
+ scene.zaxis.tickfont.family = matlab2plotlyfont(axisData .FontName );
154
+
155
+ % -grid-%
156
+ if strcmp(axisData .XGrid , ' off' ), scene.xaxis.showgrid = false ; end
157
+ if strcmp(axisData .YGrid , ' off' ), scene.yaxis.showgrid = false ; end
158
+ if strcmp(axisData .ZGrid , ' off' ), scene.zaxis.showgrid = false ; end
159
+
160
+ % -------------------------------------------------------------------------%
161
+
162
+ % -SET SCENE TO LAYOUT-%
163
+ obj.layout = setfield(obj .layout , sprintf(' scene%d ' , xSource ), scene );
164
+
165
+ % -------------------------------------------------------------------------%
166
+ end
167
+
168
+ function updateSurfaceEdgeColor(obj , dataIndex )
169
+
170
+ % -------------------------------------------------------------------------%
171
+
172
+ % -INITIALIZATIONS-%
173
+
174
+ axIndex = obj .getAxisIndex(obj .State .Plot(dataIndex ).AssociatedAxis);
175
+ plotData = get(obj .State .Plot(dataIndex ).Handle);
176
+ axisData = get(plotData .Parent );
177
+
178
+ xData = plotData .XData ;
179
+ yData = plotData .YData ;
180
+ zData = plotData .ZData ;
181
+ cData = plotData .CData ;
182
+ edgeColor = plotData .EdgeColor ;
183
+ cData = plotData .CData ;
184
+ cLim = axisData .CLim ;
185
+ colorMap = axisData .Colormap ;
186
+
187
+ xConst = ( xData(: ) - min(xData(: )) ) <= 1e-6 ;
188
+ yConst = ( yData(: ) - min(yData(: )) ) <= 1e-6 ;
189
+
190
+ % -------------------------------------------------------------------------%
191
+
192
+ % -edge lines in x direction-%
193
+ xContourSize = mean(diff(xData(1 ,: )));
194
+ xContourStard = min(xData(1 ,: ));
195
+ xContourEnd = max(xData(1 ,: ));
196
+
197
+ obj.data{dataIndex }.contours.x.show = true ;
198
+ obj.data{dataIndex }.contours.x.start = xContourStard ;
199
+ obj.data{dataIndex }.contours.x.end = xContourEnd ;
200
+ obj.data{dataIndex }.contours.x.size = xContourSize ;
201
+
202
+ % -edge lines in y direction-%
203
+ yContourSize = mean(diff(yData(: ,1 )));
204
+ yContourStard = min(yData(: ,1 ));
205
+ yContourEnd = max(yData(: ,1 ));
206
+
207
+ obj.data{dataIndex }.contours.y.show = true ;
208
+ obj.data{dataIndex }.contours.y.start = yContourStard ;
209
+ obj.data{dataIndex }.contours.y.end = yContourEnd ;
210
+ obj.data{dataIndex }.contours.y.size = yContourSize ;
211
+
212
+ % -edge lines in z direction-%
213
+
214
+ if all(xConst ) || all(yConst )
215
+ zContourSize = mean(diff(zData(1 ,: )));
216
+ zContourStard = min(zData(1 ,: ));
217
+ zContourEnd = max(zData(1 ,: ));
218
+
219
+ obj.data{dataIndex }.contours.z.show = true ;
220
+ obj.data{dataIndex }.contours.z.start = zContourStard ;
221
+ obj.data{dataIndex }.contours.z.end = zContourEnd ;
222
+ obj.data{dataIndex }.contours.z.size = zContourSize ;
223
+ end
224
+
225
+ % -------------------------------------------------------------------------%
226
+
227
+ % -coloring-%
228
+ numColor = 255 * edgeColor ;
229
+ stringColor = getStringColor(numColor );
230
+
231
+ obj.data{dataIndex }.contours.x.color = stringColor ;
232
+ obj.data{dataIndex }.contours.y.color = stringColor ;
233
+ obj.data{dataIndex }.contours.z.color = stringColor ;
234
+
235
+ % -------------------------------------------------------------------------%
236
+ end
237
+
238
+ function updateSurfaceFaceColor(obj , dataIndex , surfaceColor )
239
+
240
+ % -------------------------------------------------------------------------%
241
+
242
+ % -INITIALIZATIONS-%
243
+
244
+ axIndex = obj .getAxisIndex(obj .State .Plot(dataIndex ).AssociatedAxis);
245
+ plotData = get(obj .State .Plot(dataIndex ).Handle);
246
+ axisData = get(plotData .Parent );
247
+
248
+ faceColor = plotData .FaceColor ;
249
+ cLim = axisData .CLim ;
250
+ colorMap = axisData .Colormap ;
251
+
252
+ obj.data{dataIndex }.cauto = false ;
253
+ obj.data{dataIndex }.autocolorscale = false ;
254
+
255
+ % -------------------------------------------------------------------------%
256
+
257
+ if isnumeric(faceColor )
258
+ numColor = 255 * faceColor ;
259
+ stringColor = getStringColor(numColor );
260
+
261
+ colorScale{1 } = {0 , stringColor };
262
+ colorScale{2 } = {1 , stringColor };
263
+ obj.data{dataIndex }.colorscale = colorScale ;
264
+
265
+ elseif ismember(faceColor , {' flat' , ' interp' })
266
+
267
+ nColors = size(colorMap , 1 );
268
+
269
+ for c = 1 : nColors
270
+ stringColor = getStringColor(255 * colorMap(c ,: ));
271
+ colorScale{c } = {(c - 1 )/(nColors - 1 ), stringColor };
272
+ end
273
+
274
+ obj.data{dataIndex }.cmin = cLim(1 );
275
+ obj.data{dataIndex }.cmax = cLim(2 );
276
+
277
+ end
278
+
279
+ obj.data{dataIndex }.surfacecolor = surfaceColor ;
280
+ obj.data{dataIndex }.colorscale = colorScale ;
281
+
282
+ % -------------------------------------------------------------------------%
283
+ end
284
+
285
+ function stringColor = getStringColor(numColor )
286
+
287
+ stringColor = sprintf(' rgb(%f ,%f ,%f )' , numColor );
288
+ end
0 commit comments