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