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