4b66fe46f84b9f5a0c03ad9323618ff45e0a2d88
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_data_bounds_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Allan Cornet
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
6  * Copyright (C) 2009 - DIGITEO - Pierre Lando
7  * Copyright (C) 2010 - DIGITEO - Manuel Juliachs
8  *
9  * This file must be used under the terms of the CeCILL.
10  * This source file is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution.  The terms
12  * are also available at
13  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
14  *
15  */
16
17 /*------------------------------------------------------------------------*/
18 /* file: set_data_bounds_property.c                                       */
19 /* desc : function to modify in Scilab the data_bounds field of           */
20 /*        a handle                                                        */
21 /*------------------------------------------------------------------------*/
22
23 #include "setHandleProperty.h"
24 #include "SetProperty.h"
25 #include "getPropertyAssignedValue.h"
26 #include "SetPropertyStatus.h"
27 #include "Scierror.h"
28 #include "localization.h"
29 #include "axesScale.h"
30
31 #include "getGraphicObjectProperty.h"
32 #include "setGraphicObjectProperty.h"
33 #include "graphicObjectProperties.h"
34
35 /*------------------------------------------------------------------------*/
36 int getdDataBoundsFromStack( size_t  stackPointer, int nbRow, int nbCol,
37                              double * xMin, double * xMax,
38                              double * yMin, double * yMax,
39                              double * zMin, double * zMax );
40 /*------------------------------------------------------------------------*/
41 /**
42  * fill bounds (xMin, xMax, yMin,... ) from the assigned value in the stack
43  * beacause it might have several possible size.
44  */
45 int getdDataBoundsFromStack( size_t  stackPointer, int nbRow, int nbCol,
46                              double * xMin, double * xMax,
47                              double * yMin, double * yMax,
48                              double * zMin, double * zMax )
49 {
50   double * bounds = getDoubleMatrixFromStack( stackPointer ) ;
51
52   /* initialize zMin and zMax to avoid checking between 2D and 3D */
53   *zMin = 1.0 ;
54   *zMax = 2.0 ;
55
56   if( nbRow==3 )  /* Remove the 3x2 case */
57   {
58       Scierror(999, _("Wrong size for '%s' property: Must be in the set {%s}.\n"), "data_bounds", "1x4, 1x6, 2x2, 2x3, 4x1, 6x1");
59       return SET_PROPERTY_ERROR ;
60   }
61
62   switch ( nbRow*nbCol )
63   {
64   case 4 : /* 2D case */
65       *xMin = bounds[0] ;
66       *xMax = bounds[1] ;
67       *yMin = bounds[2] ;
68       *yMax = bounds[3] ;
69       break;
70
71   case 6 : /* 3D case */
72       *xMin = bounds[0] ;
73       *xMax = bounds[1] ;
74       *yMin = bounds[2] ;
75       *yMax = bounds[3] ;
76       *zMin = bounds[4] ;
77       *zMax = bounds[5] ;
78       break ;
79   default:
80       Scierror(999, _("Wrong size for '%s' property: Must be in the set {%s}.\n"), "data_bounds", "1x4, 1x6, 2x2, 2x3, 4x1, 6x1");
81       return SET_PROPERTY_ERROR ;
82   }
83   return SET_PROPERTY_SUCCEED ;
84 }
85
86 /*------------------------------------------------------------------------*/
87 int set_data_bounds_property(void* _pvCtx, char* pobjUID, size_t stackPointer, int valueType, int nbRow, int nbCol )
88 {
89     BOOL status = FALSE;
90
91     /* JB Silvy 09/11/05 */
92     double   xMin = 0. ;
93     double   xMax = 0. ;
94     double   yMin = 0. ;
95     double   yMax = 0. ;
96     double   zMin = 0. ;
97     double   zMax = 0. ;
98     int firstPlot = 0;
99
100     if ( !isParameterDoubleMatrix( valueType ) )
101     {
102         Scierror(999, _("Wrong type for '%s' property: Real matrix expected.\n"), "data_bounds");
103         return SET_PROPERTY_ERROR;
104     }
105
106     /* get the bounds */
107     if ( getdDataBoundsFromStack( stackPointer, nbRow, nbCol, &xMin, &xMax, &yMin, &yMax, &zMin, &zMax ) == SET_PROPERTY_ERROR )
108     {
109       return SET_PROPERTY_ERROR ;
110     }
111
112     /* To be implemented within the MVC */
113     if (!checkDataBounds(pobjUID, xMin, xMax, yMin, yMax, zMin, zMax))
114     {
115         return SET_PROPERTY_ERROR;
116     }
117
118     /* copy the values in the axis */
119     if ( nbRow * nbCol == 4 )
120     {
121         /* 2D */
122         double bounds[6];
123         double* tmpBounds;
124
125         /* To get the Z coordinates */
126         getGraphicObjectProperty(pobjUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&tmpBounds);
127
128         if (tmpBounds == NULL)
129         {
130             Scierror(999, _("'%s' property does not exist for this handle.\n"),"data_bounds");
131             return SET_PROPERTY_ERROR;
132         }
133
134         bounds[0] = xMin;
135         bounds[1] = xMax;
136         bounds[2] = yMin;
137         bounds[3] = yMax;
138         bounds[4] = tmpBounds[4];
139         bounds[5] = tmpBounds[5];
140
141         status = setGraphicObjectProperty(pobjUID, __GO_DATA_BOUNDS__, bounds, jni_double_vector, 6);
142     }
143     else
144     {
145         /* 3D */
146         double bounds[6] = {xMin, xMax, yMin, yMax, zMin, zMax} ;
147
148         status = setGraphicObjectProperty(pobjUID, __GO_DATA_BOUNDS__, bounds, jni_double_vector, 6);
149     }
150
151     setGraphicObjectProperty(pobjUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
152
153     if (status == TRUE)
154     {
155         return SET_PROPERTY_SUCCEED;
156     }
157     else
158     {
159         Scierror(999, _("'%s' property does not exist for this handle.\n"),"data_bounds");
160         return SET_PROPERTY_ERROR;
161     }
162 }
163 /*------------------------------------------------------------------------*/