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