ae16b85f65ccb6f51b6ed7e12afdebdedcdb672d
[scilab.git] / scilab / modules / graphics / macros / checkXYPair.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
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 [X,Y]=checkXYPair(typeOfPlot,x,y,current_figure,cur_draw_mode)
11
12     ok=%F;
13
14     if type(y)==13 // If y is a function
15         f=y;
16         if and(size(x)~=1)  // then x *must* be a vector
17             ResetFigureDDM(current_figure, cur_draw_mode)
18             error(msprintf(gettext("%s: Wrong size for input argument #%d: A vector expected.\n"),typeOfPlot, 2));
19
20             return;
21         end
22
23         t=x(:); // to ensure that t is a column vector
24
25         [nArgOut,vectInput]=check2dFun(typeOfPlot,f,t,current_figure,cur_draw_mode);
26
27         if nArgOut==1
28             X=t;
29             if vectInput
30                 Y=f(t);
31             else
32                 Y=zeros(length(t),1);
33                 for i=1:length(t)
34                     Y(i)=f(t(i));
35                 end
36             end
37         elseif nArgOut==2
38             if vectInput
39                 [X,Y]=f(t);
40             else
41                 X=zeros(length(t),1);
42                 Y=zeros(length(t),1);
43                 for i=1:length(t)
44
45                     // CANNOT DO THE SAME WITH X(i) and Y(i)
46                     // instead of xt and yt (scilab parser sees the stuff
47                     // as a comparison)
48
49                     [xt,yt]=f(t(i));
50                     X(i)=xt;Y(i)=yt;
51                 end
52             end
53         end
54
55     else // "classical" case
56
57         X=x;
58         Y=y;
59
60         if size(X,1)==1, X=X', end;  // si l'un des vecteurs est une ligne
61         if size(Y,1)==1, Y=Y', end;  // on le transpose.
62
63         if (size(X)==[0 0])
64             ok=%F
65             ResetFigureDDM(current_figure, cur_draw_mode)
66             error(msprintf(gettext("%s: Wrong size for input argument #%d: A non empty matrix expected.\n"),typeOfPlot, 2));
67             return;
68         end
69
70         if (size(Y)==[0 0])
71             ok=%F
72             ResetFigureDDM(current_figure, cur_draw_mode)
73             error(msprintf(gettext("%s: Wrong size for input argument #%d: A non empty matrix expected.\n"),typeOfPlot, 3));
74             return;
75         end
76
77         if and(size(X)==size(Y)) then
78             // same size for X and Y
79             ok=%T;
80
81             return;
82         end
83
84         if (size(X,2)==1) & (size(Y,1)==size(X,1))
85             // X is a vector
86             ok=%T;
87
88             return;
89         end
90         if (size(X,2)==1) & (size(Y,2)==size(X,1))
91             // X is a vector
92             Y=Y';
93             ok=%T;
94
95             return;
96         end
97
98         if (size(X,2) == 1) & (size(Y,2) == 1) & (size(Y,1) <> size(X,1)) ...
99             & (size(Y,1) ~= 1)  then
100             // X and Y are vectors but not of same size
101             ResetFigureDDM(current_figure, cur_draw_mode)
102             error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: Incompatible dimensions.\n"),typeOfPlot, 2, 3));
103             return;
104         end
105
106         // new case : plot(MAT4x4,[1 2 3 4]) HERE Y is a vector and X a matrix
107         // Here Y is always a column vector
108         // extend y to be a 4x4 matrix defined as [1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4]
109         if or(size(Y) == 1) then
110             if size(X,1) == size(Y,1) then
111                 y=Y;
112             elseif size(X,1) == size(Y,2) then
113                 y=Y(:);
114             elseif size(X,2) == size(Y,1) then
115                 X=X';
116                 y=Y(:);
117             elseif size(X,2) == size(Y,2) then
118                 y=Y;
119             else
120                 ResetFigureDDM(current_figure, cur_draw_mode)
121                 error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: Incompatible dimensions.\n"),typeOfPlot,2, 3));
122                 return;
123             end
124
125             // concatenante y in columns
126             Y=y(:,ones(1,size(X,2)));
127
128             ok=%T;
129             return;
130         end
131
132         if ~ok
133             ResetFigureDDM(current_figure, cur_draw_mode)
134             error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: Incompatible dimensions.\n"),typeOfPlot, 2, 3));
135             return;
136         end
137
138
139     end
140
141     // end of checkXYPair
142 endfunction
143