20a0d0360a4ad86152d1ee2221d163595ae5c64f
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_data_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2002-2004 - INRIA - Djalel Abdemouche
4  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
5  * Copyright (C) 2006 - INRIA - Allan Cornet
6  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
7  * Copyright (C) 2010 - DIGITEO - Bruno JOFRET
8  * Copyright (C) 2010-2011 - DIGITEO - Manuel Juliachs
9  *
10  * This file must be used under the terms of the CeCILL.
11  * This source file is licensed as described in the file COPYING, which
12  * you should have received as part of this distribution.  The terms
13  * are also available at
14  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
15  *
16  */
17
18 /*------------------------------------------------------------------------*/
19 /* file: set_data_property.c                                              */
20 /* desc : function to modify in Scilab the data field of                  */
21 /*        a handle                                                        */
22 /*------------------------------------------------------------------------*/
23
24 #include <string.h>
25
26 #include "setHandleProperty.h"
27 #include "SetProperty.h"
28 #include "GetProperty.h"
29 #include "getPropertyAssignedValue.h"
30 #include "Scierror.h"
31 #include "localization.h"
32 #include "SetPropertyStatus.h"
33 #include "BasicAlgos.h"
34 #include "set_data_property.h"
35 #include "MALLOC.h"
36
37 #include "graphicObjectProperties.h"
38 #include "setGraphicObjectProperty.h"
39
40 #include "getGraphicObjectProperty.h"
41
42 /*--------------------------------------------------------------------------*/
43 /* F.Leray 29.04.05 */
44 /* the champ data is now set as a tlist (like for surface objects) */
45 /* setchampdata(pobj,cstk(l2), &l3, &numrow3, &numcol3, fname) */
46 int setchampdata(void* _pvCtx, char* pobjUID, AssignedList * tlist )
47 {
48     int nbRow[4];
49     int nbCol[4];
50
51     int numberArrows = 0;
52     int dimensions[2];
53
54     double * vx  = NULL;
55     double * vy  = NULL;
56     double * vfx = NULL;
57     double * vfy = NULL;
58
59     /* get parameters */
60     vx  = getCurrentDoubleMatrixFromList( tlist, &nbRow[0], &nbCol[0] );
61     vy  = getCurrentDoubleMatrixFromList( tlist, &nbRow[1], &nbCol[1] );
62     vfx = getCurrentDoubleMatrixFromList( tlist, &nbRow[2], &nbCol[2] );
63     vfy = getCurrentDoubleMatrixFromList( tlist, &nbRow[3], &nbCol[3] );
64
65     /* check dim */
66     if ( nbCol[0] != 1 || nbCol[1] != 1 )
67     {
68         Scierror(999, _("%s: Wrong type for argument #%d: Columns vectors expected.\n"),"Tlist",1);
69         return SET_PROPERTY_ERROR;
70     }
71
72     numberArrows = nbRow[0]*nbRow[1];
73     dimensions[0] = nbRow[0];
74     dimensions[1] = nbRow[1];
75
76     if ( nbRow[2] != nbRow[0] || nbCol[2] != nbRow[1] || nbRow[3] != nbRow[2] || nbCol[3] != nbCol[2] )
77     {
78         Scierror(999, _("%s: Wrong size for arguments #%d and #%d: Incompatible length.\n"),"Tlist",3,4);
79         return SET_PROPERTY_ERROR;
80     }
81
82     if ( nbRow[0] * nbCol[0] == 0 || nbRow[1] * nbCol[1] == 0 || nbRow[2] * nbCol[2] == 0 || nbRow[3] * nbCol[3] == 0 )
83     {
84         return sciReturnEmptyMatrix(_pvCtx);
85     }
86
87     /* Update the champ's number of arrows and dimensions then set the coordinates */
88     setGraphicObjectProperty(pobjUID, __GO_NUMBER_ARROWS__, &numberArrows, jni_int, 1);
89     setGraphicObjectProperty(pobjUID, __GO_CHAMP_DIMENSIONS__, dimensions, jni_int_vector, 2);
90
91     setGraphicObjectProperty(pobjUID, __GO_BASE_X__, vx, jni_double_vector, dimensions[0]);
92     setGraphicObjectProperty(pobjUID, __GO_BASE_Y__, vy, jni_double_vector, dimensions[1]);
93     setGraphicObjectProperty(pobjUID, __GO_DIRECTION_X__, vfx, jni_double_vector, dimensions[0]*dimensions[1]);
94     setGraphicObjectProperty(pobjUID, __GO_DIRECTION_Y__, vfy, jni_double_vector, dimensions[0]*dimensions[1]);
95
96     return SET_PROPERTY_SUCCEED;
97 }
98
99 /*--------------------------------------------------------------------------*/
100 /* F.Leray 29.04.05 */
101 /* the grayplot data is now set as a tlist (like for surface and champ objects) */
102 /* setgrayplot(pobj,cstk(l2), &l3, &numrow3, &numcol3, fname) */
103 int setgrayplotdata(void* _pvCtx, char* pobjUID, AssignedList * tlist )
104 {
105     BOOL result;
106
107     int nbRow[3];
108     int nbCol[3];
109     int gridSize[4];
110
111     double * pvecx = NULL;
112     double * pvecy = NULL;
113     double * pvecz = NULL;
114
115     pvecx = getDoubleMatrixFromList(tlist, 2, &nbRow[0], &nbCol[0]);
116     pvecy = getDoubleMatrixFromList(tlist, 3, &nbRow[1], &nbCol[1]);
117     pvecz = getDoubleMatrixFromList(tlist, 4, &nbRow[2], &nbCol[2]);
118
119     if ( nbCol[0] != 1 || nbCol[1] != 1 )
120     {
121         Scierror(999, _("%s: Wrong type for argument #%d: Columns vectors expected.\n"),"Tlist",1);
122         return SET_PROPERTY_ERROR;
123     }
124
125     if ( nbRow[2] != nbRow[0] || nbCol[2] != nbRow[1] )
126     {
127         Scierror(999, _("%s: Wrong size for arguments #%d: Incompatible length.\n"),"Tlist",3);
128         /* Was previously: */
129 #if 0
130         Scierror(999, _("%s: Wrong size for arguments #%d: Incompatible length.\n"),"Tlist","Tlist",3);
131 #endif
132         return 0;
133     }
134
135     if ( nbRow[0] * nbCol[0] == 0 || nbRow[1] * nbCol[1] == 0 || nbRow[2] * nbCol[2] == 0 )
136     {
137         return sciReturnEmptyMatrix(_pvCtx);
138     }
139
140     /*
141      * Update the x and y vectors dimensions
142      * These vectors are column ones
143      */
144     gridSize[0] = nbRow[0];
145     gridSize[1] = 1;
146     gridSize[2] = nbRow[1];
147     gridSize[3] = 1;
148
149     /* Resizes the coordinates arrays if required */
150     result = setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_GRID_SIZE__, gridSize, jni_int_vector, 4);
151
152     if (result == FALSE)
153     {
154         Scierror(999, _("%s: No more memory.\n"), "setgrayplotdata");
155         return SET_PROPERTY_ERROR;
156     }
157
158     setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_X__, pvecx, jni_double_vector, nbRow[0]);
159     setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Y__, pvecy, jni_double_vector, nbRow[1]);
160     setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Z__, pvecz, jni_double_vector, nbRow[2]*nbCol[2]);
161
162     return SET_PROPERTY_SUCCEED;
163 }
164 /*--------------------------------------------------------------------------*/
165 /* set3ddata(pobj,cstk(l2), &l3, &numrow3, &numcol3) */
166 int set3ddata(void* _pvCtx, char* pobjUID, AssignedList * tlist )
167 {
168     char* type;
169
170     int m1, n1, m2, n2, m3, n3;
171     int m3n, n3n;
172     int isFac3d;
173
174     double * pvecx = NULL;
175     double * pvecy = NULL;
176     double * pvecz = NULL;
177     int dimvectx = 0;
178     int dimvecty = 0;
179
180     double* inputColors;
181     int nbInputColors;
182
183     // number of specified colors
184     int nc = 0;
185
186     int izcol;
187
188     /* no copy now we just perform tests on the matrices */
189     pvecx = getCurrentDoubleMatrixFromList( tlist, &m1, &n1 );
190     pvecy = getCurrentDoubleMatrixFromList( tlist, &m2, &n2 );
191     pvecz = getCurrentDoubleMatrixFromList( tlist, &m3, &n3 );
192
193     if ( m1 * n1 == m3 * n3 && m1 * n1 == m2 * n2 && m1 * n1 != 1 )
194     {
195         if ( !(m1 == m2 && m2 == m3 && n1 == n2 && n2 == n3) )
196         {
197             Scierror(999, _("%s: Wrong size for arguments #%d, #%d and #%d: Incompatible length.\n"),"Tlist",1,2,3);
198             return SET_PROPERTY_ERROR;
199         }
200     }
201     else
202     {
203         if ( m2 * n2 != n3 )
204         {
205             Scierror(999, _("%s: Wrong size for arguments #%d and #%d: Incompatible length.\n"),"Tlist",2,3);
206             return SET_PROPERTY_ERROR;
207         }
208         if ( m1 * n1 != m3 )
209         {
210             Scierror(999, _("%s: Wrong size for arguments #%d and #%d: Incompatible length.\n"),"Tlist",1,3);
211             return SET_PROPERTY_ERROR;
212         }
213         if ( m1 * n1 <= 1 || m2 * n2 <= 1 )
214         {
215             Scierror(999, _("%s: Wrong size for arguments #%d and #%d: Should be >= %d.\n"),"Tlist",1,2,2);
216             return SET_PROPERTY_ERROR;
217         }
218     }
219
220     if ( m1 * n1 == 0 || m2 * n2 == 0 || m3 * n3 == 0 )
221     {
222         return sciReturnEmptyMatrix(_pvCtx);
223     }
224
225     /* get color size if exists */
226     if ( getAssignedListNbElement( tlist ) == 4 )
227     {
228         getCurrentDoubleMatrixFromList( tlist, &m3n, &n3n ) ;
229         if ( m3n * n3n == m3 * n3 )
230         {
231             /* the color is a matrix, with same size as Z */
232             izcol = 2;
233         }
234         else if (m3n * n3n == n3 && (m3n == 1 || n3n == 1))
235         {
236             /* a vector with as many colors as facets */
237             izcol = 1;
238         }
239         else
240         {
241             Scierror(999, _("Wrong size for %s element: A %d-by-%d matrix or a vector of size %d expected.\n"), "color", m3, n3, n3);
242             return SET_PROPERTY_ERROR;
243         }
244     }
245     else
246     {
247         m3n = 0;
248         n3n = 0;
249         izcol = 0;
250     }
251
252     getGraphicObjectProperty(pobjUID, __GO_TYPE__, jni_string, (void **)&type);
253
254     if (strcmp(type, __GO_FAC3D__) == 0)
255     {
256         isFac3d = 1;
257     }
258     else
259     {
260         isFac3d = 0;
261     }
262
263     if ( m1 * n1 == m3 * n3 && m1 * n1 == m2 * n2 && m1 * n1 != 1 ) /* NG beg */
264     {
265         /* case isfac=1;*/
266         if (isFac3d == 0)
267         {
268             Scierror(999, _("Can not change the %s of graphic object: its type is %s.\n"),"typeof3d","SCI_PLOT3D");
269             return SET_PROPERTY_ERROR;
270         }
271     }
272     else
273     {
274         /* case isfac=0;*/
275         if (isFac3d == 1)
276         {
277             Scierror(999, _("Can not change the %s of graphic object: its type is %s.\n"),"typeof3d","SCI_FAC3D");
278             return SET_PROPERTY_ERROR;
279         }
280     }
281
282     /* check the monotony on x and y */
283
284     if (isFac3d == 1)
285     {
286         /* x is considered as a matrix */
287         dimvectx = -1;
288     }
289     else if ( m1 == 1 ) /* x is a row vector */
290     {
291         dimvectx = n1;
292     }
293     else if ( n1 == 1 ) /* x is a column vector */
294     {
295         dimvectx = m1;
296     }
297     else /* x is a matrix */
298     {
299         dimvectx = -1;
300     }
301
302     if ( dimvectx > 1 )
303     {
304         int monotony = checkMonotony( pvecx, dimvectx );
305         if ( monotony == 0 )
306         {
307             Scierror(999, _("%s: Wrong value: Vector is not monotonous.\n"),"Objplot3d");
308             return SET_PROPERTY_ERROR;
309         }
310
311         /* To be implemented within the MVC */
312 #if 0
313         psurf->flag_x = monotony;
314 #endif
315     }
316
317     if (isFac3d == 1)
318     {
319         /* x is considered as a matrix */
320         dimvecty = -1;
321     }
322     else if(m2 == 1) /* y is a row vector */
323     {
324         dimvecty = n2;
325     }
326     else if(n2 == 1) /* y is a column vector */
327     {
328         dimvecty = m2;
329     }
330     else /* y is a matrix */
331     {
332         dimvecty = -1;
333     }
334
335     if( dimvecty > 1 )
336     {
337         int monotony = checkMonotony( pvecy, dimvecty );
338         if ( monotony == 0 )
339         {
340             Scierror(999, _("%s: Wrong value: Vector is not monotonous.\n"),"Objplot3d");
341             return SET_PROPERTY_ERROR;
342         }
343
344         /* To be implemented within the MVC */
345 #if 0
346         psurf->flag_y = monotony;
347 #endif
348     }
349
350     /* get the values now */
351     rewindAssignedList( tlist );
352
353     pvecx = getCurrentDoubleMatrixFromList( tlist, &m1, &n1 );
354     pvecy = getCurrentDoubleMatrixFromList( tlist, &m2, &n2 );
355     pvecz = getCurrentDoubleMatrixFromList( tlist, &m3, &n3 );
356
357     if (isFac3d == 1)
358     {
359         int numElementsArray[3];
360         int result;
361
362         numElementsArray[0] = n1;
363         numElementsArray[1] = m1;
364         numElementsArray[2] = m3n * n3n;
365
366         result = setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_NUM_ELEMENTS_ARRAY__, numElementsArray, jni_int_vector, 3);
367
368         if (result == 0)
369         {
370             Scierror(999, _("%s: No more memory.\n"), "set3ddata");
371             return SET_PROPERTY_ERROR;
372         }
373     }
374     else if (isFac3d == 0)
375     {
376         int gridSize[4];
377         int result;
378
379         gridSize[0] = m1;
380         gridSize[1] = n1;
381         gridSize[2] = m2;
382         gridSize[3] = n2;
383
384         result = setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_GRID_SIZE__, gridSize, jni_int_vector, 4);
385
386         if (result == 0)
387         {
388             Scierror(999, _("%s: No more memory.\n"), "set3ddata");
389             return SET_PROPERTY_ERROR;
390         }
391     }
392
393     setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_X__, pvecx, jni_double_vector, m1*n1);
394     setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Y__, pvecy, jni_double_vector, m2*n2);
395     setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_Z__, pvecz, jni_double_vector, m3*n3);
396
397     if( getAssignedListNbElement( tlist ) == 4 ) /* F.Leray There is a color matrix */
398     {
399         inputColors = getCurrentDoubleMatrixFromList( tlist, &m3n, &n3n );
400         nbInputColors = m3n * n3n;
401     }
402     else
403     {
404         inputColors = NULL;
405         nbInputColors = 0;
406     }
407
408     /*
409      * Plot 3d case not treated for now
410      * To be implemented
411      */
412     if (isFac3d == 1)
413     {
414         setGraphicObjectProperty(pobjUID, __GO_DATA_MODEL_COLORS__, inputColors, jni_double_vector, nbInputColors);
415     }
416
417     /* Color vector/matrix dimensions: to be checked for MVC implementation */
418 #if 0
419     psurf->m3n = m3n; /* If m3n and n3n are 0, then it means that no color matrix/vector was in input*/
420     psurf->n3n = n3n;
421 #endif
422
423     return SET_PROPERTY_SUCCEED;
424 }
425 /*--------------------------------------------------------------------------*/
426 int set_data_property(void* _pvCtx, char* pobjUID, size_t stackPointer, int valueType, int nbRow, int nbCol)
427 {
428     char* type;
429
430     getGraphicObjectProperty(pobjUID, __GO_TYPE__, jni_string, (void **)&type);
431
432     if (strcmp(type, __GO_CHAMP__) == 0)
433     {
434         AssignedList* tlist = NULL;
435         int status = -1;
436
437         if( !isParameterTlist( valueType ) )
438         {
439             Scierror(999, "Incorrect argument, must be a Tlist!\n");
440             return SET_PROPERTY_ERROR;
441         }
442
443         /* we should have 4 properties in the tlist */
444         tlist = createAssignedList( 3, 4 );
445         if ( tlist == NULL )
446         {
447             return SET_PROPERTY_ERROR;
448         }
449
450         status = setchampdata(_pvCtx, pobjUID, tlist);
451         destroyAssignedList( tlist );
452         return status;
453     }
454     else if (strcmp(type, __GO_GRAYPLOT__) == 0)
455     {
456         AssignedList * tlist = NULL;
457         int status = -1;
458
459         if( !isParameterTlist( valueType ) )
460         {
461             Scierror(999, _("Wrong type for input argument: Tlist expected.\n"));
462             return SET_PROPERTY_ERROR;
463         }
464
465         /* we should have 3 properties in the tlist */
466         tlist = createAssignedList( 3, 3 );
467         if ( tlist == NULL )
468         {
469             return SET_PROPERTY_ERROR;
470         }
471
472         status = setgrayplotdata(_pvCtx, pobjUID, tlist);
473         destroyAssignedList( tlist );
474         return status;
475     }
476     else if ((strcmp(type, __GO_FAC3D__) == 0) || (strcmp(type, __GO_PLOT3D__) == 0))
477     {
478         AssignedList * tlist = NULL;
479         int status = -1;
480         int listSize = 0;
481
482         if( !isParameterTlist( valueType ) )
483         {
484             Scierror(999, _("Wrong type for input argument: Tlist expected.\n"));
485             return SET_PROPERTY_ERROR ;
486         }
487
488         listSize = getStackListNbElement( 3 );
489
490         if ( listSize == 3 )
491         {
492             tlist = createAssignedList( 3, 3 );
493         }
494         else if ( listSize == 4 )
495         {
496             tlist = createAssignedList( 3, 4 );
497         }
498         else
499         {
500             Scierror(999, _("Wrong size for input argument: %d or %d expected.\n"),4,5);
501             return SET_PROPERTY_ERROR;
502         }
503
504         if ( tlist == NULL )
505         {
506             return SET_PROPERTY_ERROR;
507         }
508
509         status = set3ddata(_pvCtx, pobjUID, tlist);
510         destroyAssignedList( tlist );
511         return status;
512
513     }
514     else  /* F.Leray 02.05.05 : "data" case for others (using sciGetPoint routine inside GetProperty.c) */
515     {
516         if ( !isParameterDoubleMatrix( valueType ) )
517         {
518             Scierror(999, _("Incompatible type for property %s.\n"),"data");
519             return SET_PROPERTY_ERROR;
520         }
521
522         return sciSetPoint( pobjUID, getDoubleMatrixFromStack( stackPointer ), &nbRow, &nbCol );
523     }
524     return SET_PROPERTY_ERROR;
525
526 }
527 /*------------------------------------------------------------------------*/