8f0fcbc2c4ac4c689763dbc508992645d6cafa3c
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_data_bounds_property.c
1 /*------------------------------------------------------------------------*/
2 /* file: set_data_bounds_property.c                                       */
3 /* Copyright INRIA 2006                                                   */
4 /* Authors : Fabrice Leray, Allan Cornet, Jean-Baptiste Silvy             */
5 /* desc : function to modify in Scilab the data_bounds field of           */
6 /*        a handle                                                        */
7 /*------------------------------------------------------------------------*/
8
9 #include <string.h>
10
11 #include "setHandleProperty.h"
12 #include "SetProperty.h"
13 #include "getPropertyAssignedValue.h"
14 #include "SetPropertyStatus.h"
15 #include "GetProperty.h"
16 #include "sciprint.h"
17
18 /*------------------------------------------------------------------------*/
19 int getdDataBoundsFromStack( int  stackPointer, int nbRow, int nbCol,
20                              double * xMin, double * xMax,
21                              double * yMin, double * yMax,
22                              double * zMin, double * zMax );
23 /*------------------------------------------------------------------------*/
24 /**
25  * fill bounds (xMin, xMax, yMin,... ) from the assigned value in the stack
26  * beacause it might have several possible size.
27  */
28 int getdDataBoundsFromStack( int  stackPointer, int nbRow, int nbCol,
29                              double * xMin, double * xMax,
30                              double * yMin, double * yMax,
31                              double * zMin, double * zMax )
32 {
33   double * bounds = getDoubleMatrixFromStack( stackPointer ) ;
34   
35   /* initialize zMin and zMax to avoid checking between 2D and 3D */
36   *zMin = 1.0 ;
37   *zMax = 2.0 ;
38
39   switch ( nbRow )
40   {
41   case 1 : /* row vector */
42     if ( nbCol == 4 )
43     {
44       *xMin = bounds[0] ;
45       *xMax = bounds[1] ;
46       *yMin = bounds[2] ;
47       *yMax = bounds[3] ;
48     }
49     else if( nbCol == 6 )
50     {
51       *xMin = bounds[0] ;
52       *xMax = bounds[1] ;
53       *yMin = bounds[2] ;
54       *yMax = bounds[3] ;
55       *zMin = bounds[4] ;
56       *zMax = bounds[5] ;
57     }
58     else
59     {
60       sciprint( "Second argument should be a 2x2, 2x3, 1x4, 4x1, 1x6 or 6x1 matrix." ) ;
61       return SET_PROPERTY_ERROR ;
62     }
63     break ;
64
65   case 2 : /* 2x2 or 2x3 matrix */
66     if ( nbCol == 2 )
67     {
68       *xMin = bounds[0] ;
69       *yMin = bounds[2] ;
70       *xMax = bounds[1] ;
71       *yMax = bounds[3] ;
72     }
73     else if ( nbCol == 3 )
74     {
75       *xMin = bounds[0] ;
76       *yMin = bounds[2] ;
77       *zMin = bounds[4] ;
78       *xMax = bounds[1] ;
79       *yMax = bounds[3] ;
80       *zMax = bounds[5] ;
81     }
82     else
83     {
84       sciprint( "Second argument should be a 2x2, 2x3, 1x4, 4x1, 1x6 or 6x1 matrix." ) ;
85       return SET_PROPERTY_ERROR ;
86     }
87     break ;
88
89   case 4 : /* column vector for 2D */
90     if ( nbCol == 1 )
91     {
92       *xMin = bounds[0] ;
93       *xMax = bounds[1] ;
94       *yMin = bounds[2] ;
95       *yMax = bounds[3] ;
96     }
97     else
98     {
99       sciprint( "Second argument should be a 2x2, 2x3, 1x4, 4x1, 1x6 or 6x1 matrix." ) ;
100       return SET_PROPERTY_ERROR ;
101     }
102     break ;
103   case 6 : /* column vector for 3D */
104     if ( nbCol == 1 )
105     {
106       *xMin = bounds[0] ;
107       *xMax = bounds[1] ;
108       *yMin = bounds[2] ;
109       *yMax = bounds[3] ;
110       *zMin = bounds[4] ;
111       *zMax = bounds[5] ;
112     }
113     else
114     {
115       sciprint( "Second argument should be a 2x2, 2x3, 1x4, 4x1, 1x6 or 6x1 matrix." ) ;
116       return SET_PROPERTY_ERROR ;
117     }
118     break ;
119   default:
120     sciprint( "Second argument should be a 2x2, 2x3, 1x4, 4x1, 1x6 or 6x1 matrix." ) ;
121     return SET_PROPERTY_ERROR ;
122   }
123   return SET_PROPERTY_SUCCEED ;
124 }
125
126 /*------------------------------------------------------------------------*/
127 int set_data_bounds_property( sciPointObj * pobj, int stackPointer, int valueType, int nbRow, int nbCol )
128 {
129   if ( !isParameterDoubleMatrix( valueType ) )
130   {
131     sciprint("Incompatible type for property data_bounds.\n") ;
132     return SET_PROPERTY_ERROR ;
133   }
134
135   if (sciGetEntityType (pobj) == SCI_SUBWIN)
136   {
137
138     /* JB Silvy 09/11/05 */
139     sciSubWindow * ppSubWin = pSUBWIN_FEATURE (pobj) ;
140     double   xMin ;
141     double   xMax ;
142     double   yMin ;
143     double   yMax ;
144     double   zMin ;
145     double   zMax ;
146
147     /* get the bounds */
148     if ( getdDataBoundsFromStack( stackPointer, nbRow, nbCol, &xMin, &xMax, &yMin, &yMax, &zMin, &zMax ) == SET_PROPERTY_ERROR )
149     {
150       return SET_PROPERTY_ERROR ;
151     }
152
153     /* check if there is not an inf within the values */
154     /* since this has not any meaning */
155     if (    !finite(xMin) || !finite(xMax)
156          || !finite(yMin) || !finite(yMax)
157          || !finite(zMin) || !finite(zMax) )
158     {
159       sciprint("Error : data_bounds values must be finite.");
160       return SET_PROPERTY_ERROR ;
161     }
162
163
164     /* check if the bounds are corrects */
165     /* allows equality with bounds since it is working */
166     if ( xMin > xMax || yMin > yMax || zMin > zMax )
167     {
168       sciprint("Error : Min and Max values for one axis do not verify Min <= Max.\n");
169       return SET_PROPERTY_ERROR ;
170     }
171
172     /* check for logflags that values are greater than 0 */
173     if (   ( ppSubWin->logflags[0] == 'l' && xMin <= 0.0 )
174       || ( ppSubWin->logflags[1] == 'l' && yMin <= 0.0 )
175       || ( ppSubWin->logflags[2] == 'l' && zMin <= 0.0 ) )
176     {
177       sciprint("Error: bounds on axis must be strictly positive to use logarithmic mode\n" ) ;
178       return SET_PROPERTY_ERROR ;
179     }
180
181     /* copy the values in the axis */
182     if ( nbRow * nbCol == 4 )
183     { 
184       /* 2D */
185       ppSubWin->SRect[0] = xMin ;
186       ppSubWin->SRect[1] = xMax ;
187       ppSubWin->SRect[2] = yMin ;
188       ppSubWin->SRect[3] = yMax ;
189     }
190     else
191     {
192       /* 3D */
193       ppSubWin->SRect[0] = xMin ;
194       ppSubWin->SRect[1] = xMax ;
195       ppSubWin->SRect[2] = yMin ;
196       ppSubWin->SRect[3] = yMax ;
197       ppSubWin->SRect[4] = zMin ;
198       ppSubWin->SRect[5] = zMax ;
199     }
200
201     ppSubWin->FirstPlot = FALSE;
202
203     return SET_PROPERTY_SUCCEED ;
204   }
205   else if ( sciGetEntityType(pobj) == SCI_SURFACE )
206   {
207     if ( nbRow * nbCol != 6 )
208     {
209       sciprint( "Second argument must have 6 elements.\n" ) ;
210       return SET_PROPERTY_ERROR ;
211     }
212
213     copyDoubleVectorFromStack( stackPointer, pSURFACE_FEATURE(pobj)->ebox, 6 ) ;
214
215     return SET_PROPERTY_SUCCEED ;
216   }
217   else
218   {
219     sciprint("data_bounds property does not exist for this handle.\n") ; 
220     return SET_PROPERTY_ERROR ;
221   }
222
223   return SET_PROPERTY_ERROR ;
224 }
225 /*------------------------------------------------------------------------*/