-plot2d function adapted to the MVC framework
[scilab.git] / scilab / modules / graphics / src / c / Plo2dEch.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 1998-2000 - ENPC - Jean-Philippe Chancelier
4  * Copyright (C) 2002-2004 - INRIA - Djalel Abdemouche
5  * Copyright (C) 2002 - INRIA - Serge Steer
6  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
7  * Copyright (C) 2005 - INRIA - Jean-Baptiste Silvy
8  * Copyright (C) 2010 - 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  *    Graphic library
20  --------------------------------------------------------------------------*/
21
22 #include "math_graphics.h" 
23 #include "PloEch.h"
24
25 #include "GetProperty.h"
26 #include "SetProperty.h"
27 #include "BuildObjects.h"
28 #include "axesScale.h"
29 #include "Format.h"
30 #include "CurrentObjectsManagement.h"
31 #include "DrawingBridge.h"
32 #include "GraphicSynchronizerInterface.h"
33 #include "HandleManagement.h"
34 #include "Axes.h"
35
36 #include "MALLOC.h" /* MALLOC */
37
38 #include "getGraphicObjectProperty.h"
39 #include "graphicObjectProperties.h"
40
41 /*-------------------------------------------
42  * setscale2d 
43  * uses WRect,ARect,FRect,logscale to update 
44  * current subwindow
45  *  WRect gives the subwindow to use 
46  *  ARect gives the axis rectangle 
47  *  FRect gives the bounds 
48  *  WRect=[<x-upperleft>,<y-upperleft>,largeur,hauteur]
49  *    example WRect=[0,0,1.0,1.0] we use all the window 
50  *            WRect=[0.5,0.5,0.5,0.5] we use the down right 
51  *            quarter of the window
52  *  logscale : gives xy log axis flags 
53  *  each argument can be a null pointer if they are 
54  *  not to be changed from their current value 
55  *
56  *  
57  *-------------------------------------------*/
58
59 int setscale2d(double WRect[4],
60                 double ARect[4],
61                 double FRect[4],
62                 char   logscale[2])
63 {
64   sciPointObj * masousfen = NULL;
65   sciPointObj * currentFigure = sciGetCurrentFigure();
66  
67         startFigureDataWriting(currentFigure);
68   if (WRect != NULL) 
69   {
70       /* Ajout djalel */
71       if (( masousfen = sciIsExistingSubWin(WRect)) != NULL)
72                         {
73                                 /* Select the subwin */
74         sciSetSelectedSubWin(masousfen);
75       }
76       else if ((masousfen = ConstructSubWin (sciGetCurrentFigure())) != NULL)
77       {
78         /* F.Leray Adding here 26.03.04*/
79         sciSetCurrentObj(masousfen);
80         sciSetSelectedSubWin(masousfen);
81         pSUBWIN_FEATURE (masousfen)->WRect[0]   = WRect[0];
82         pSUBWIN_FEATURE (masousfen)->WRect[1]   = WRect[1];
83         pSUBWIN_FEATURE (masousfen)->WRect[2]   = WRect[2];
84         pSUBWIN_FEATURE (masousfen)->WRect[3]   = WRect[3];
85       }
86                         else
87                         {
88                                 /* An error occured */
89                                 endFigureDataWriting(currentFigure);
90                                 return -1;
91                         }
92         }
93    
94         masousfen = sciGetCurrentSubWin();
95
96   if (FRect != NULL)
97   {
98                 /* Frect is [xMin, yMin, xMax, yMax] */
99     pSUBWIN_FEATURE (masousfen)->SRect[0] = FRect[0];
100     pSUBWIN_FEATURE (masousfen)->SRect[2] = FRect[1];
101     pSUBWIN_FEATURE (masousfen)->SRect[1] = FRect[2];
102     pSUBWIN_FEATURE (masousfen)->SRect[3] = FRect[3];
103   }
104
105   if (ARect != NULL)
106   {
107     pSUBWIN_FEATURE (masousfen)->ARect[0] = ARect[0];
108     pSUBWIN_FEATURE (masousfen)->ARect[1] = ARect[1];
109     pSUBWIN_FEATURE (masousfen)->ARect[2] = ARect[2];
110     pSUBWIN_FEATURE (masousfen)->ARect[3] = ARect[3];
111   }
112
113         if (logscale != NULL)
114         {
115                 /* only log flsgs on X and Y are modified */
116                 char logFlags[3];
117                 sciGetLogFlags(masousfen, logFlags);
118                 logFlags[0] = logscale[0];
119                 logFlags[1] = logscale[1];
120                 sciSetLogFlags(masousfen, logFlags);
121         }
122         endFigureDataWriting(currentFigure);
123
124   if (masousfen != NULL)
125   {
126     // subwindow has changed, redraw it
127     sciDrawObj(masousfen);
128   }
129
130   return(0);
131 }
132
133 /* used to send values to Scilab */
134 int getscale2d( double WRect[4], double FRect[4], char logscale[2], double ARect[4] )
135 {
136   int i;
137   int* tmp;
138   double* axesBounds;
139   double* margins;
140   double* realDataBounds;
141   sciPointObj * curSubwin = sciGetCurrentSubWin();
142
143   tmp = (int*) getGraphicObjectProperty(curSubwin->UID, __GO_X_AXIS_LOG_FLAG__, jni_bool);
144   logscale[0] = getTextLogFlag(*tmp);
145
146   tmp = (int*) getGraphicObjectProperty(curSubwin->UID, __GO_Y_AXIS_LOG_FLAG__, jni_bool);
147   logscale[1] = getTextLogFlag(*tmp);
148
149   axesBounds = (double*) getGraphicObjectProperty(curSubwin->UID, __GO_AXES_BOUNDS__, jni_double_vector);
150   margins = (double*) getGraphicObjectProperty(curSubwin->UID, __GO_MARGINS__, jni_double_vector);
151   realDataBounds = (double*) getGraphicObjectProperty(curSubwin->UID, __GO_REAL_DATA_BOUNDS__, jni_double_vector);
152
153   for ( i=0; i < 4 ; i++)
154   {
155     WRect[i] = axesBounds[i];
156     ARect[i] = margins[i];
157   }
158
159   /* Frect is [xMin, yMin, xMax, yMax] whereas data bounds are [xmin, xmax, ymin, ymax] */
160   FRect[0] = realDataBounds[0];
161   FRect[1] = realDataBounds[2];
162   FRect[2] = realDataBounds[1];
163   FRect[3] = realDataBounds[3];
164
165   return(0);
166 }
167
168
169 extern void unzoom()
170 {
171   /** 17/09/2002 ***/
172   double fmin,fmax,lmin,lmax;
173   int min,max,puiss,deux=2,dix=10;
174   sciPointObj *psousfen;
175   sciSons *psonstmp;
176
177   /***** 02/10/2002 ****/
178   psonstmp = sciGetSons(sciGetCurrentFigure());
179   while (psonstmp != (sciSons *) NULL)
180   {
181     if(sciGetEntityType (psonstmp->pointobj) == SCI_SUBWIN)
182     {
183       psousfen= (sciPointObj *)psonstmp->pointobj;
184       if (sciGetZooming(psousfen))
185       {
186         sciSetZooming(psousfen, 0);
187
188         pSUBWIN_FEATURE (psousfen)->ZRect[0]   = pSUBWIN_FEATURE (psousfen)->SRect[0];
189         pSUBWIN_FEATURE (psousfen)->ZRect[1]   = pSUBWIN_FEATURE (psousfen)->SRect[1];
190         pSUBWIN_FEATURE (psousfen)->ZRect[2]   = pSUBWIN_FEATURE (psousfen)->SRect[2];
191         pSUBWIN_FEATURE (psousfen)->ZRect[3]   = pSUBWIN_FEATURE (psousfen)->SRect[3];
192
193         /*}  SS: moved below because if sciGetZooming(psousfen)==0 
194         ZRect is undefined -> code may enter in infinite recursion loop to compute graduation
195         and there is no use to regraduate */
196
197         /** regraduation de l'axe des axes ***/
198         fmin= pSUBWIN_FEATURE (psousfen)->ZRect[0];
199         fmax= pSUBWIN_FEATURE (psousfen)->ZRect[2];
200         C2F(graduate)(&fmin, &fmax,&lmin,&lmax,&deux,&dix,&min,&max,&puiss) ;
201
202         fmin= pSUBWIN_FEATURE (psousfen)->ZRect[1];
203         fmax= pSUBWIN_FEATURE (psousfen)->ZRect[3];
204         C2F(graduate)(&fmin, &fmax,&lmin,&lmax,&deux,&dix,&min,&max,&puiss) ;
205         /*****/
206       }
207     }
208     psonstmp = psonstmp->pnext;
209   }
210
211   sciDrawObj(sciGetCurrentFigure());
212 }
213
214 /*--------------------------------------------------------------------------*/
215 /**
216  * Interface to function xchange "f2i". Convert user 2d coordinates
217  * to pixel ones.
218  * @param rect [x,y,w,h] of current subwin
219  */
220 void convertUserCoordToPixelCoords(const double xCoords[], const double yCoords[],
221                                    int xPixCoords[], int yPixCoords[], int nbCoords,
222                                    int rect[4])
223
224   /* coordinates transformation */
225   int i;
226   sciPointObj * selectedSubwin = sciGetCurrentSubWin();
227   updateSubwinScale(selectedSubwin);
228   for (i = 0; i < nbCoords; i++)
229   {
230     // specify a default value for Z
231     double curCoords[3] = {xCoords[i], yCoords[i], 0.0};
232     int curPixCoords[2];
233     sciGet2dViewPixelCoordinates(selectedSubwin, curCoords, curPixCoords);
234     xPixCoords[i] = curPixCoords[0];
235     yPixCoords[i] = curPixCoords[1];
236   }
237
238   /* get viewing area */
239   sciGetViewingArea(selectedSubwin, &rect[0], &rect[1], &rect[2], &rect[3]);
240  
241 }
242 /*--------------------------------------------------------------------------*/
243 /**
244 * Interface to function xchange "i2f". Convert pixel coordinates
245 * to user 2d coordinates.
246 * @param rect [x,y,w,h] of current subwin
247 */
248 void convertPixelCoordsToUserCoords(const int xPixCoords[], const int yPixCoords[],
249                                     double xUserCoords[], double yUserCoords[], int nbCoords,
250                                     int rect[4])
251
252   /* coordinates transformation */
253   int i;
254   sciPointObj * selectedSubwin = sciGetCurrentSubWin();
255   updateSubwinScale(selectedSubwin);
256   for (i = 0; i < nbCoords; i++)
257   {
258     // specify a default value for Z
259     int curPixCoords[2] = {xPixCoords[i], yPixCoords[i]};
260     double curCoords[2];
261     sciGet2dViewCoordFromPixel(selectedSubwin, curPixCoords, curCoords);
262     xUserCoords[i] = curCoords[0];
263     yUserCoords[i] = curCoords[1];
264   }
265
266   /* get viewing area */
267   sciGetViewingArea(selectedSubwin, &rect[0], &rect[1], &rect[2], &rect[3]);
268
269 }
270 /*--------------------------------------------------------------------------*/