* Bug #12348 fixed - surf() disable lines(n) if there is no input variable.
[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         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 arguments ''%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 arguments ''%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 arguments ''%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 arguments ''%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 arguments ''%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 arguments ''%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 arguments ''%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 arguments ''%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