a7c833d6154b4f1c3d6653edee211f9d26b8c661
[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.1-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         XScal = isscalar(X);
61         YScal = isscalar(Y);
62
63         if size(X,1)==1 & ~XScal, X=X', warning(_("Transposing row vector to get column vector")), end; // If one of the vectors is a row, transpose it,
64         if size(Y,1)==1 & ~YScal, Y=Y', warning(_("Transposing row vector to get column vector")), end; // but no need to transpose scalars.
65
66         if (size(X)==[0 0])
67             ok=%F
68             ResetFigureDDM(current_figure, cur_draw_mode)
69             error(msprintf(gettext("%s: Wrong size for input argument #%d: A non empty matrix expected.\n"),typeOfPlot, 2));
70             return;
71         end
72
73         if (size(Y)==[0 0])
74             ok=%F
75             ResetFigureDDM(current_figure, cur_draw_mode)
76             error(msprintf(gettext("%s: Wrong size for input argument #%d: A non empty matrix expected.\n"),typeOfPlot, 3));
77             return;
78         end
79
80         if and(size(X)==size(Y)) then
81             // same size for X and Y
82             ok=%T;
83
84             return;
85         end
86
87         if (size(X,2)==1) & (size(Y,1)==size(X,1))
88             // X is a vector
89             ok=%T;
90
91             return;
92         end
93
94         if (size(X,2)==1) & (size(Y,2)==size(X,1))
95             // X is a column vector and Y has as many columns as X has rows.
96             // Y cannot be a square matrix here, because it would have fallen in the previous case (above) and returned.
97             if ~YScal then
98                 warning(_("Transposing data matrix to get compatible dimensions"));
99                 Y=Y';
100             end
101             ok=%T;
102
103             return;
104         end
105
106         if (size(X,2) == 1) & (size(Y,2) == 1) & (size(Y,1) <> size(X,1)) ...
107             & (size(Y,1) ~= 1)  then
108             // X and Y are vectors but not of same size
109             ResetFigureDDM(current_figure, cur_draw_mode)
110             error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: Incompatible dimensions.\n"),typeOfPlot, 2, 3));
111             return;
112         end
113
114         // new case : plot(MAT4x4,[1 2 3 4]) HERE Y is a vector and X a matrix
115         // Here Y is always a column vector
116         // 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]
117         if or(size(Y) == 1) then
118             if size(X,1) == size(Y,1) then
119                 y=Y;
120             elseif size(X,1) == size(Y,2) & ~YScal then
121                 // Y has as many columns as X has rows. Transpose Y to fit X.
122                 warning(_("Transposing data matrix to get compatible dimensions"));
123                 y=Y(:);
124             elseif size(X,2) == size(Y,1) & ~YScal & ~XScal then
125                 // Y has as many rows as X has columns. Transpose Y to fit X.
126                 warning(_("Transposing column vector to get row vector"));
127                 X=X';
128                 y=Y(:);
129             elseif size(X,2) == size(Y,2) then
130                 y=Y;
131             else
132                 ResetFigureDDM(current_figure, cur_draw_mode)
133                 error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: Incompatible dimensions.\n"),typeOfPlot,2, 3));
134                 return;
135             end
136
137             // concatenante y in columns
138             Y=y(:,ones(1,size(X,2)));
139
140             ok=%T;
141             return;
142         end
143
144         if ~ok
145             ResetFigureDDM(current_figure, cur_draw_mode)
146             error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: Incompatible dimensions.\n"),typeOfPlot, 2, 3));
147             return;
148         end
149
150
151     end
152
153     // end of checkXYPair
154 endfunction