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