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