3984efd289a232dc2935c9f96f4e9be6cca1a8c1
[scilab.git] / scilab / modules / graphics / macros / surf.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2004-2006 - INRIA - Fabrice Leray
3 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at    
7 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
8
9
10 function surf(varargin)
11
12 [lhs,rhs]=argn(0);
13
14 if ~rhs
15         Z= [  0.0001    0.0013    0.0053   -0.0299   -0.1809   -0.2465   -0.1100   -0.0168   -0.0008   -0.0000; ..
16           0.0005    0.0089    0.0259   -0.3673   -1.8670   -2.4736   -1.0866   -0.1602   -0.0067    0.0000; ..
17           0.0004    0.0214    0.1739   -0.3147   -4.0919   -6.4101   -2.7589   -0.2779    0.0131    0.0020; ..
18          -0.0088   -0.0871    0.0364    1.8559    1.4995   -2.2171   -0.2729    0.8368    0.2016    0.0130; ..
19          -0.0308   -0.4313   -1.7334   -0.1148    3.0731    0.4444    2.6145    2.4410    0.4877    0.0301; ..
20          -0.0336   -0.4990   -2.3552   -2.1722    0.8856   -0.0531    2.6416    2.4064    0.4771    0.0294; ..
21          -0.0137   -0.1967   -0.8083    0.2289    3.3983    3.1955    2.4338    1.2129    0.2108    0.0125; ..
22          -0.0014   -0.0017    0.3189    2.7414    7.1622    7.1361    3.1242    0.6633    0.0674    0.0030; ..
23           0.0002    0.0104    0.1733    1.0852    2.6741    2.6725    1.1119    0.1973    0.0152    0.0005; ..
24           0.0000    0.0012    0.0183    0.1099    0.2684    0.2683    0.1107    0.0190    0.0014    0.0000];
25         lines(0);
26         f=gcf();
27         f.color_map = jetcolormap(64);
28         surf(Z,"edgeco","b","marker","d","markersiz",9,"markeredg","red","markerfac","k");
29         return;
30 end
31
32 X=[];
33 Y=[];
34 Z=[];
35 C=[];
36
37 CurColor = 0; // current color used if no color specified via LineSpec
38 // nor PropertyName
39
40 ListArg = varargin;
41
42 //detect and set the current axes now:
43 if type(ListArg(1)) == 9
44   hdle = ListArg(1);
45   if (hdle.type == "Axes")
46     sca(ListArg(1));
47     ListArg(1) = null(); // remove this parameter from the list
48   else
49     error(msprintf(gettext("%s: Wrong type for input argument #%d: An ''Axes'' handle expected.\n"), "surf", 1));
50     return;
51   end
52 end
53
54
55 nv = size(ListArg)
56
57
58 T=[];
59 d=[];
60
61 typeOfPlot = 'surf';
62 //given_data = 2;
63
64 for k=1:nv
65   T(k,1) = type(ListArg(k))
66 end
67
68 given_data = 0;
69 P1 = 0;
70
71 for i=1:nv
72   if T(i) == 1
73     given_data = given_data +1;
74   else
75     P1 = i;  // Position of the first PropertyName field
76     break;
77   end
78 end
79
80
81 // delay the drawing commands
82 // smart drawlater
83 current_figure=gcf();
84 cur_draw_mode = current_figure.immediate_drawing;
85 current_figure.immediate_drawing = 'off';
86
87 colormap_size = size(current_figure.color_map,1);
88
89 if given_data == 1 //surf(Z) with Z giving us data + color info.
90   // ---------------------------------------------------------- //
91   
92   if or(size(ListArg(1))==1)
93     ResetFigureDDM(current_figure, cur_draw_mode);
94     error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1,  2, 2));
95     return;
96   end
97   
98   X = 1:size(ListArg(1),2);
99   Y = 1:size(ListArg(1),1);
100   Z = ListArg(1)'; // here a transposition is needed
101   C = Z;
102   
103   [XX,YY,ZZ] = genfac3d(X,Y,Z);
104   CC = ZZ; // Add a color matrix based on Z values
105
106 elseif given_data == 2 //surf(Z,COLOR)
107   // ---------------------------------------------------------- //
108   if or(size(ListArg(1))==1)
109     ResetFigureDDM(current_figure, cur_draw_mode);
110     error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1,  2, 2));
111     return;
112   end
113   
114   if ((size(ListArg(1)) <> size(ListArg(2))) & (size(ListArg(1))-1 <> size(ListArg(2))))
115     ResetFigureDDM(current_figure, cur_draw_mode);
116     error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),..
117                        "surf", 2, size(ListArg(1),1), size(ListArg(1),2), size(ListArg(1),1) - 1, size(ListArg(1),2) -1 ));
118     return;
119   end
120   
121   X = 1:size(ListArg(1),2);
122   Y = 1:size(ListArg(1),1);
123   Z = ListArg(1)'; // here a transposition is needed
124   C = ListArg(2)';
125   
126   [XX,YY,ZZ] = genfac3d(X,Y,Z);
127   
128   if (size(ListArg(2)) == size(ListArg(1))) // color number == zdata number
129     [XX,YY,CC] = genfac3d(X,Y,C);     // CC must be a color matrix of size nf x n
130   elseif ((size(ListArg(2))) == size(ListArg(1))-1) // color number -1 == zdata number => ONLY flat mode can be enabled
131     Ctmp=[];
132     Ctmp = [C [C(:,$)]] ;
133     Ctmp = [Ctmp; Ctmp($,:)];
134     [XX,YY,CC] = genfac3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
135   end
136   
137 elseif given_data == 3 //surf(X,Y,Z) with Z giving us data + color info.
138   // ---------------------------------------------------------- //
139   
140   X = ListArg(1)
141   Y = ListArg(2);
142   Z = ListArg(3);
143                   
144   // check if the call is OK
145   err = execstr('[XX,YY,ZZ,CC] = CreateFacetsFromXYZ(X,Y,Z,current_figure, cur_draw_mode)','errcatch','n');
146   
147   if (err <> 0) then
148     // reset data
149     processSurfError(current_figure, cur_draw_mode);
150   end
151   
152 elseif given_data == 4 //surf(X,Y,Z,COLOR)
153   // ---------------------------------------------------------- //
154   if ((size(ListArg(3)) <> size(ListArg(4))) & (size(ListArg(3))-1 <> size(ListArg(4))))
155     ResetFigureDDM(current_figure, cur_draw_mode);
156     error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),..
157                        "surf", 4, size(ListArg(3),1), size(ListArg(3),2), size(ListArg(3),1) - 1, size(ListArg(3),2) -1 ));
158     return;
159   end
160   
161   X = ListArg(1)
162   Y = ListArg(2);
163   Z = ListArg(3);
164   C = ListArg(4);
165   
166   // check if the call is OK
167   err = execstr('[XX,YY,ZZ,CC] = CreateFacetsFromXYZColor(X,Y,Z,C,current_figure, cur_draw_mode)','errcatch','n');
168   if (err <> 0) then
169     // reset data
170     processSurfError(current_figure, cur_draw_mode);
171   end
172 end
173
174
175
176
177 // P1 is the position of the first PropertyName field.
178 Property = P1;
179
180 while ((Property <> 0) & (Property <= nv-1))
181   PropertyName  = ListArg(Property);
182   PropertyValue = ListArg(Property+1);
183   
184   // Xdata
185   PName = getSurfPropertyName(PropertyName);
186   if (PName == 'xdata')
187     
188     if (type(PropertyValue)<>1)
189           ResetFigureDDM(current_figure, cur_draw_mode);
190           error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", 'xdata'));
191       return;
192     end
193     
194     X = PropertyValue;
195     [XX,tmp2,tmp3] = CreateFacetsFromXYZ(PropertyValue,Y,Z,current_figure, cur_draw_mode);
196         
197     // Ydata
198   elseif (PName == 'ydata')
199     
200     if (type(PropertyValue)<>1)
201           ResetFigureDDM(current_figure, cur_draw_mode);
202       error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", 'ydata'));
203       return;
204     end
205     
206     Y = PropertyValue;
207     [tmp1,YY,tmp3] = CreateFacetsFromXYZ(X,PropertyValue,Z,current_figure, cur_draw_mode);
208         
209     // Zdata
210   elseif (PName == 'zdata')
211     
212     if (type(PropertyValue)<>1) then
213           ResetFigureDDM(current_figure, cur_draw_mode);
214           error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", 'zdata'));
215       return;
216         end
217         if (or(size(PropertyValue)==1)) then
218           ResetFigureDDM(current_figure, cur_draw_mode);
219       error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A matrix of size greater than %d-by-%d expected.\n"), "surf", 'zdata',  2, 2));
220       return;
221     end
222     
223     Z = PropertyValue;
224     [tmp1,tmp2,ZZ] = CreateFacetsFromXYZ(X,Y,PropertyValue,current_figure, cur_draw_mode);
225   
226   end
227   
228   Property = Property+2;
229 end
230
231
232
233
234
235
236 // surf is made now !
237 // with default option to simulate the Matlab mode
238
239 err = execstr('plot3d(XX,YY,list(ZZ,CC))','errcatch','n');
240
241 if err <> 0
242    processSurfError(current_figure, cur_draw_mode);
243 end
244
245 a=gca();
246 a.cube_scaling = 'on';
247 a.rotation_angles = [51 -125];
248 e=gce();
249 e.hiddencolor=0; // to avoid painting the hidden facets
250 e.color_flag=4; // Matlab special flat mode by default (different from mode 2)
251 e.cdata_mapping = 'scaled'
252
253
254
255
256
257
258
259
260 // F.Leray
261 // Today: 17.03.05
262 // XYZ-DataMode under Matlab seems really bugged (see following samples and read Matlab doc.):
263 //
264 // surf(X,Y,Z,'XDataMode','auto')
265 // surf(X,Y,Z,'XDataMode','auto')
266 // surf(X+20,Y,Z,'XDataMode','auto')
267 // surf(X+20,Y,Z,'XDataMode','man')
268 // surf(X+20,Y,Z,'XDataMode','auto')
269 // surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','auto')
270 // surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','man')
271 // surf(X+20,Y,Z,'XData',X-100,'XDataMode','auto')
272 // surf(X+20,Y,Z,'XData',X-100,'XDataMode','man')
273 // surf(Z,'XData',X-100,'XDataMode','man')
274 // surf(Z,'XData',X-100,'XDataMode','auto')
275 // surf(X+20,Y,Z,'XDataMode','man')
276 // surf(X+20,Y,Z,'XDataMode','auto')
277 // 
278 // That is why I do not support those properties.
279 // Below and in comment is the code we could add to treat those properties.
280 // by giving  XYZ-DataModeVal to setSurfProperty (to better treat XYZ-Data input).
281 //
282 //
283 //XdataModeVal=1;
284 //YdataModeVal=1;
285 //ZdataModeVal=1;
286 //
287 //if Property <> 0
288 //  XdataMode = getIndexInStringTable('xdatam',ListArg([Property nv]))
289 //  if XdataMode <> []
290 //    XdataModeVal = getIndexInStringTable(ListArg(XdataMode+1),['auto','manual'])
291 //    if size(XdataModeVal,'*') <> 1
292 //      disp("Error: Bad XdataMode selected");
293 //      return;
294 //    end
295 //  end  
296 //  
297 //  YdataMode = getIndexInStringTable('ydatam',ListArg([Property nv]))
298 //  if YdataMode <> []
299 //    YdataModeVal = getIndexInStringTable(ListArg(YdataMode+1),['auto','manual'])
300 //    if size(YdataModeVal,'*') <> 1
301 //      disp("Error: Bad YdataMode selected");
302 //      return;
303 //    end
304 //  end 
305 //  
306 //  ZdataMode = getIndexInStringTable('zdatam',ListArg([Property nv]))
307 //  if ZdataMode <> []
308 //    ZdataModeVal = getIndexInStringTable(ListArg(ZdataMode+1),['auto','manual'])
309 //    if size(ZdataModeVal,'*') <> 1
310 //      disp("Error: Bad ZdataMode selected");
311 //      return;
312 //   end
313 //  end
314 //end
315 //
316
317
318 ///////////////////////////////////
319 //Global Property treatment      //
320 //PropertyName and PropertyValue //
321 ///////////////////////////////////
322
323
324 // P1 is the position of the first PropertyName field.
325 Property = P1;
326
327 current_surface = gce(); // get the newly created fac3d
328 current_surface.mark_size_unit='point';
329
330
331
332 while ((Property <> 0) & (Property <= nv-1))
333   setSurfProperty(ListArg(Property),ListArg(Property+1),current_surface,X,Y,Z,C,current_figure,cur_draw_mode)
334   
335   Property = Property+2;
336 end
337
338
339 //postponed drawings are done now !
340 // smart drawnow
341 ResetFigureDDM(current_figure, cur_draw_mode);
342
343 endfunction
344
345
346
347 //
348 //function [C] = build_interp_color(C,colormap_size)
349 //// C is considered as a data value in Matlab
350 //MIN = min(C);
351 //MAX = max(C);
352 //NCOLMIN = 1;
353 //NCOLMAX = colormap_size;
354 //
355 //if MIN <> MAX
356 //  C = (NCOLMIN-NCOLMAX)/(MIN-MAX) * C + (MIN*NCOLMAX - NCOLMIN*MAX)/(MIN-MAX);
357 //  C = round(C);
358 //else
359 //  C = ones(C) * (NCOLMIN+NCOLMAX)/2;
360 //end
361 //endfunction 
362 //
363 //
364
365
366 function k=getIndexInStringTable(pattern,table)
367
368 str =  convstr(pattern);
369 k=find(part(table,1:length(str))==str);
370
371 endfunction
372
373
374
375
376
377
378
379
380 function [XX,YY,ZZ,CC] = CreateFacetsFromXYZ(X,Y,Z,current_figure, cur_draw_mode)
381
382 if or(size(X)==1) & or(size(Y)==1) // X and Y are vector
383     
384   tmp = X;
385   X = Y;
386   Y = tmp;
387   
388   if size(X,'*') ~= size(Z,1) then
389     ResetFigureDDM(current_figure, cur_draw_mode);
390     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,1)));
391     return;
392   end
393   
394   if size(Y,'*') ~= size(Z,2) then
395         ResetFigureDDM(current_figure, cur_draw_mode);
396     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,2)));
397     return;
398   end 
399
400   [XX,YY,ZZ] = genfac3d(Y,X,Z');
401
402   // COLOR treatment
403   CC = ZZ;
404   
405 elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrix
406   
407   if or(size(X) ~= size(Y)) then
408     ResetFigureDDM(current_figure, cur_draw_mode);
409     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Y'));
410     return;
411   end
412   
413   if or(size(X) ~= size(Z)) then
414     ResetFigureDDM(current_figure, cur_draw_mode);
415     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
416     return;
417   end 
418   
419   [XX,YY,ZZ] = nf3d(X,Y,Z);
420   
421   // COLOR treatment
422   CC = ZZ;
423   
424 elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix
425   
426   if size(X,'*') ~= size(Z,2) then
427     ResetFigureDDM(current_figure, cur_draw_mode);
428     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,2)));
429     return;
430   end
431   
432   if or(size(Y) ~= size(Z)) then
433     ResetFigureDDM(current_figure, cur_draw_mode);
434     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'Y', 'Z'));
435     return;
436   end 
437   
438   // X vector
439   // Y matrix
440   // Z matrix
441   
442   X=X(:)'; // X is forced to be a row vector
443   XMAT=[];
444   
445   for i=1:size(Z,2)
446     XMAT=[XMAT;X];
447   end
448   
449   [XX,YY,ZZ] = nf3d(XMAT,Y,Z);
450   
451   // COLOR treatment
452   CC = ZZ;
453   
454 elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix
455   
456   if or(size(X) ~= size(Z)) then
457     ResetFigureDDM(current_figure, cur_draw_mode);
458     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
459     return;
460   end 
461   
462   if size(Y,'*') ~= size(Z,2) then
463     ResetFigureDDM(current_figure, cur_draw_mode);
464     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,2)));
465     return;
466   end
467   
468   // Y vector
469   // X matrix
470   // Z matrix
471   
472   Y=Y(:); // Y is forced to be a column vector
473   YMAT=[];
474   
475   for i=1:size(Z,1)
476     YMAT=[YMAT,Y];
477   end
478   
479   [XX,YY,ZZ] = nf3d(X,YMAT,Z);
480   
481   // COLOR treatment
482   CC = ZZ;
483   
484 else
485   ResetFigureDDM(current_figure, cur_draw_mode);
486   error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Same size expected.\n"), "surf", 'X', 'Y'));
487   return;
488 end
489
490 endfunction
491
492
493
494
495
496 function [XX,YY,ZZ,CC] = CreateFacetsFromXYZColor(X,Y,Z,C,current_figure, cur_draw_mode)
497
498 if or(size(X)==1) & or(size(Y)==1) // X and Y are vector
499   
500   Z = Z'; // here a transposition is needed
501   C = C'; // here a transposition is needed
502   
503   if size(X,'*') ~= size(Z,1) then
504     ResetFigureDDM(current_figure, cur_draw_mode);
505     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,1)));
506     return;
507   end
508   
509   if size(Y,'*') ~= size(Z,2) then
510         ResetFigureDDM(current_figure, cur_draw_mode);
511     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,2)));
512     return;
513   end
514   
515   [XX,YY,ZZ] = genfac3d(X,Y,Z);
516   
517   // COLOR treatment
518   if (size(C) == size(Z)) // color number == zdata number
519     [XX,YY,CC] = genfac3d(X,Y,C);     // CC must be a color matrix of size nf x n
520   elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
521     Ctmp=[];
522     Ctmp = [C [C(:,$)]] ;
523     Ctmp = [Ctmp; Ctmp($,:)];
524     [XX,YY,CC] = genfac3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
525   end
526   
527 elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrices
528   
529   if or(size(X) ~= size(Y)) then
530     ResetFigureDDM(current_figure, cur_draw_mode);
531     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Y'));
532     return;
533   end
534   
535   if or(size(X) ~= size(Z)) then
536     ResetFigureDDM(current_figure, cur_draw_mode);
537     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
538     return;
539   end 
540   
541   [XX,YY,ZZ] = nf3d(X,Y,Z);
542   
543   // COLOR treatment
544   if (size(C) == size(Z)) // color number == zdata number
545     [XX,YY,CC] = nf3d(X,Y,C);     // CC must be a color matrix of size nf x n
546   elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
547     Ctmp=[];
548     Ctmp = [C [C(:,$)]] ;
549     Ctmp = [Ctmp; Ctmp($,:)];
550     [XX,YY,CC] = nf3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
551   end
552   
553 elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix
554   
555   if size(X,'*') ~= size(Z,2) then
556     ResetFigureDDM(current_figure, cur_draw_mode);
557     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,2)));
558     return;
559   end
560   
561   if or(size(Y) ~= size(Z)) then
562     ResetFigureDDM(current_figure, cur_draw_mode);
563     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'Y', 'Z'));
564     return;
565   end 
566   
567   // X vector
568   // Y matrix
569   // Z matrix
570   
571   X=X(:)'; // X is forced to be a row vector
572   XMAT=[];
573   
574   for i=1:size(Z,2)
575     XMAT=[XMAT;X];
576   end
577
578   
579   
580   [XX,YY,ZZ] = nf3d(XMAT,Y,Z);
581   
582   // COLOR treatment
583   if (size(C) == size(Z)) // color number == zdata number
584     [XX,YY,CC] = nf3d(XMAT,Y,C);     // CC must be a color matrix of size nf x n
585   elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
586     Ctmp=[];
587     Ctmp = [C [C(:,$)]] ;
588     Ctmp = [Ctmp; Ctmp($,:)];
589     [XX,YY,CC] = nf3d(XMAT,Y,Ctmp);     // CC must be a color matrix of size nf x n
590   end
591   
592 elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix
593   
594   if or(size(X) ~= size(Z)) then
595     ResetFigureDDM(current_figure, cur_draw_mode);
596     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
597     return;
598   end 
599   
600   if size(Y,'*') ~= size(Z,2) then
601     ResetFigureDDM(current_figure, cur_draw_mode);
602     error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,2)));
603     return;
604   end
605   
606   
607   // Y vector
608   // X matrix
609   // Z matrix
610   
611   Y=Y(:); // Y is forced to be a column vector
612   YMAT=[];
613   
614   for i=1:size(Z,1)
615     YMAT=[YMAT,Y];
616   end
617   
618   [XX,YY,ZZ] = nf3d(X,YMAT,Z);
619   
620   // COLOR treatment
621   if (size(C) == size(Z)) // color number == zdata number
622     [XX,YY,CC] = nf3d(X,YMAT,C);     // CC must be a color matrix of size nf x n
623   elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
624     Ctmp=[];
625     Ctmp = [C [C(:,$)]] ;
626     Ctmp = [Ctmp; Ctmp($,:)];
627     [XX,YY,CC] = nf3d(X,YMAT,Ctmp);     // CC must be a color matrix of size nf x n
628   end
629   
630 else
631   ResetFigureDDM(current_figure, cur_draw_mode);
632   error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Y'));
633   return;
634 end
635
636 endfunction
637
638
639 // If an error occurs in the surf code, we need to catch it
640 // order to reset some default values
641 function processSurfError(cur_figure, cur_draw_mode)
642   // reset data
643     ResetFigureDDM(current_figure, cur_draw_mode);
644
645     // get the error
646     [err_message, err_number, err_line, err_func] = lasterror(%t);
647                 
648         // rethrow it
649         
650         // for now error can only have a single string as input.
651         // If there are several lines we need to concatane them.
652         err_message_nbLines = size(err_message, '*');
653         if (err_message_nbLines > 1) then
654           // put a \n betwee, each string
655           err_message(1) = strcat(err_message, "\n");
656         end
657         error(err_message(1), err_number);
658 endfunction