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