Interface property zoom_box and zoom_state of axes objects.
Jean-baptiste Silvy [Wed, 2 Jan 2008 15:02:44 +0000 (15:02 +0000)]
17 files changed:
scilab/modules/graphics/help/en_US/axes_properties.xml
scilab/modules/graphics/includes/GetProperty.h
scilab/modules/graphics/includes/SetProperty.h
scilab/modules/graphics/includes/axesScale.h
scilab/modules/graphics/sci_gateway/c/sci_zoom_rect.c
scilab/modules/graphics/src/c/GetProperty.c
scilab/modules/graphics/src/c/Plo2dEch.c
scilab/modules/graphics/src/c/SetProperty.c
scilab/modules/graphics/src/c/axesScale.c
scilab/modules/graphics/src/c/getHandleProperty/get_zoom_box_property.c
scilab/modules/graphics/src/c/getHandleProperty/set_data_bounds_property.c
scilab/modules/graphics/src/c/getHandleProperty/set_zoom_box_property.c
scilab/modules/renderer/graphics_Import.def
scilab/modules/renderer/src/cpp/subwinDrawing/ConcreteDrawableSubwin.cpp
scilab/modules/renderer/src/cpp/subwinDrawing/TicksDrawerFactory.cpp
scilab/modules/renderer/src/java/org/scilab/modules/renderer/subwinDrawing/BoxTrimmingObjectGL.java
scilab/modules/renderer/src/java/org/scilab/modules/renderer/textDrawing/TextContentDrawerGL.java

index 448a5f1..0c81590 100644 (file)
           <DESCRIPTION_ITEM label="zoom_box: ">
             <SP>This field contains the current zoom box if any coordinates
             are given. It is an empty matrix (no zoom) or the vector
-            <VERB>[xmin,ymin,xmax,ymax]</VERB> (defines a rectangle given by
-            two opposite corners). The z coordinates is not yet taken into
-            account.</SP>
+            <VERB>[xmin,ymin,xmax,ymax,zmin,zmax]</VERB> (defines a smaller axes box).</SP>
           </DESCRIPTION_ITEM>
 
           <DESCRIPTION_ITEM label="margins: ">
   </SEE_ALSO>
 
   <AUTHOR>Djalel ABDEMOUCHE</AUTHOR>
-</MAN>
\ No newline at end of file
+</MAN>
index 11c1057..1e527c7 100644 (file)
@@ -196,6 +196,7 @@ double * sciGetMargins( sciPointObj * pObj ) ;
 
 void sciGetRealDataBounds( sciPointObj * pObj, double bounds[6] ) ; /* GET */
 void sciGetDataBounds( sciPointObj * pObj, double bounds[6] ) ; /* GET */
+void sciGetDisplayedDataBounds(sciPointObj * pObj, double bounds[6]); /* GET */
 
 void sciGetViewingAngles( sciPointObj * pObj, double * alpha, double * theta) ; /* GET */
 
@@ -230,6 +231,8 @@ void sciGetAutoTicks(sciPointObj * pObj, BOOL autoTicks[3]); /* GET */
 
 void sciGetAxesVisible(sciPointObj * pObj, BOOL axesVisible[3]); /* GET */
 
+void sciGetZoomBox(sciPointObj * pObj, double zoomBox[6]); /* GET */
+
 void printSetGetErrorMessage(const char * propertyName);
 
 #endif /* __SCI_GET_PROPERTY__ */
index a42d287..9975acc 100644 (file)
@@ -254,6 +254,8 @@ int sciSetAutoTicks(sciPointObj * pObj, BOOL autoTicksX, BOOL autoTicksY, BOOL a
 
 int sciSetRenderingEnable(sciPointObj * pObj, BOOL enable); /* SET */
 
+int sciSetZoomBox(sciPointObj * pObj, const double zoomBox[6]); /* SET */
+
 BOOL sciCheckColorIndex(sciPointObj * pObj, int colorIndex);
 
 /*---------------------------------------------------------------------------*/
index b4a3c2e..c050cd0 100644 (file)
@@ -26,5 +26,14 @@ int trans3d( sciPointObj * pobj,
              double        y[] ,
              double        z[]  ) ;
 /*------------------------------------------------------------------------------*/
+int sciZoom2D(sciPointObj * pObj, const double zoomRect[4]);
+int sciZoom3D(sciPointObj * pObj, const double zoomBox[6]);
+void sciUnzoom(sciPointObj * pObj);
+void sciGetZoom3D(sciPointObj * pObj, double zoomBox[6]);
+/*------------------------------------------------------------------------------*/
+BOOL checkDataBounds(sciPointObj * pObj, double xMin, double xMax,
+                     double yMin, double yMax, double zMin, double zMax);
+/*------------------------------------------------------------------------------*/
+
 
 #endif /* _AXES_SCALE_H_ */
index 5e674c6..d20f9f9 100644 (file)
@@ -10,6 +10,7 @@
 #include "PloEch.h"
 #include "BuildObjects.h"
 #include "gw_graphics.h"
+#include "axesScale.h"
 
 /*--------------------------------------------------------------------------*/
 int sci_zoom_rect(char *fname,unsigned long fname_len)
@@ -26,7 +27,8 @@ int sci_zoom_rect(char *fname,unsigned long fname_len)
   {
     GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&m,&n,&l); 
     CheckLength(1,4,m*n);
-    zoom_box(stk(l),&x_pixel,&y_pixel);
+    /*zoom_box(stk(l),&x_pixel,&y_pixel);*/
+    sciZoom2D(sciGetCurrentSubWin(), getDoubleMatrixFromStack(l));
   }
 
   LhsVar(1)=0; 
index 847d4d9..d310c92 100644 (file)
@@ -3925,6 +3925,21 @@ void sciGetRealDataBounds( sciPointObj * pObj, double bounds[6] )
 }
 /*----------------------------------------------------------------------------------*/
 /**
+ * Get the bounds we need to use for a subwin (between user defined one and zoomed ones).
+ */
+void sciGetDisplayedDataBounds(sciPointObj * pObj, double bounds[6])
+{
+  if(sciGetZooming(pObj))
+  {
+    sciGetZoomBox(pObj, bounds);
+  }
+  else
+  {
+    sciGetDataBounds(pObj, bounds);
+  }
+}
+/*----------------------------------------------------------------------------------*/
+/**
  * Get data-bounds defined by the user and not modified for pretty print by scilab.
  * @param bounds [Xmin,Xmax,Ymain,Ymax,Zmin,Zmax] vector.
  */
@@ -4231,6 +4246,28 @@ void sciGetAxesVisible(sciPointObj * pObj, BOOL axesVisible[3])
 }
 /*----------------------------------------------------------------------------------*/
 /**
+ * Get the current zoom box of a subwin object
+ * @param[out] zoomBox output parameter with thte zoom box
+ */
+void sciGetZoomBox(sciPointObj * pObj, double zoomBox[6])
+{
+  switch(sciGetEntityType(pObj))
+  {
+  case SCI_SUBWIN:
+    zoomBox[0] = pSUBWIN_FEATURE(pObj)->ZRect[0] ;
+    zoomBox[1] = pSUBWIN_FEATURE(pObj)->ZRect[1] ;
+    zoomBox[2] = pSUBWIN_FEATURE(pObj)->ZRect[2] ;
+    zoomBox[3] = pSUBWIN_FEATURE(pObj)->ZRect[3] ;
+    zoomBox[4] = pSUBWIN_FEATURE(pObj)->ZRect[4] ;
+    zoomBox[5] = pSUBWIN_FEATURE(pObj)->ZRect[5] ;
+    break;
+  default:
+    printSetGetErrorMessage("zoom_box");
+    break;
+  }
+}
+/*----------------------------------------------------------------------------------*/
+/**
  * Print the message "This object has no xxx property." in Scilab.
  */
 void printSetGetErrorMessage(const char * propertyName)
index d8ffff1..447cba0 100644 (file)
@@ -1594,7 +1594,7 @@ void scizoom( double bbox[4], sciPointObj * pobj )
 
   if ( !( sciGetZooming(pobj) ) )
   {
-    sciSetZooming(psousfen, 1);
+    sciSetZooming(psousfen, TRUE);
   }
   /** regraduation de l'axe des axes ***/
   fmin=  bbox[0];
index f8fda66..4ec785f 100644 (file)
@@ -4121,6 +4121,29 @@ int sciSetRenderingEnable(sciPointObj * pObj, BOOL enable)
 }
 /*----------------------------------------------------------------------------------*/
 /**
+ * Specify a new zoom box for a subwin object.
+ * @param zoomBox [xMin, xMax, yMin, yMax, zMin, zMax] vector.
+ */
+int sciSetZoomBox(sciPointObj * pObj, const double zoomBox[6])
+{
+  switch(sciGetEntityType(pObj))
+  {
+  case SCI_SUBWIN:
+    pSUBWIN_FEATURE(pObj)->ZRect[0] = zoomBox[0];
+    pSUBWIN_FEATURE(pObj)->ZRect[1] = zoomBox[1];
+    pSUBWIN_FEATURE(pObj)->ZRect[2] = zoomBox[2];
+    pSUBWIN_FEATURE(pObj)->ZRect[3] = zoomBox[3];
+    pSUBWIN_FEATURE(pObj)->ZRect[4] = zoomBox[4];
+    pSUBWIN_FEATURE(pObj)->ZRect[5] = zoomBox[5];
+    break;
+  default:
+    printSetGetErrorMessage("zoom_box");
+    return -1;
+  }
+  return 0;
+}
+/*----------------------------------------------------------------------------------*/
+/**
  * Check that a color index is within the colormap range or not
  * @param pObj object conatining the color
  */
index 8df372f..ccb11b8 100644 (file)
 #include "math_graphics.h"
 #include "MALLOC.h"
 #include "GetProperty.h"
+#include "SetProperty.h"
 #include "sciprint.h"
 #include "PloEch.h"
 #include "GraphicZoom.h"
 #include "Vertices.h"
 #include "localization.h"
+#include "SetPropertyStatus.h"
 
 /*------------------------------------------------------------------------------*/
 double InvAxis( double min, double max, double u )
@@ -340,3 +342,115 @@ int trans3d( sciPointObj * pobj,
   return(1);
 }
 /*------------------------------------------------------------------------------*/
+/**
+ * Specify new zoom box for a subwin object.
+ * @param zoomRect vector [xMin, yMin, xMax, yMax]
+ */
+int sciZoom2D(sciPointObj * pObj, const double zoomRect[4])
+{
+  double zoomBox[6];
+
+  // add Z scale to data bounds.
+  sciGetDataBounds(pObj, zoomBox);
+  zoomBox[0] = zoomRect[0];
+  zoomBox[1] = zoomRect[1];
+  zoomBox[2] = zoomRect[2];
+  zoomBox[3] = zoomRect[3];
+
+  return sciZoom3D(pObj, zoomBox);
+
+}
+/*------------------------------------------------------------------------------*/
+/**
+ * Specify a new zoom box for a subwin object
+ * @param zoomBox vector [xMin, yMin, xMax, yMax, zMin, zMax].
+ */
+int sciZoom3D(sciPointObj * pObj, const double zoomBox[6])
+{
+  // convert zoomBox to [xMin, xMax, yMin, yMax, zMin, zMax]
+  double zoomBox3D[6];
+  zoomBox3D[0] = zoomBox[0];
+  zoomBox3D[1] = zoomBox[2];
+  zoomBox3D[2] = zoomBox[1];
+  zoomBox3D[3] = zoomBox[3];
+  zoomBox3D[4] = zoomBox[4];
+  zoomBox3D[5] = zoomBox[5];
+
+  if (!checkDataBounds(pObj, zoomBox3D[0], zoomBox3D[1], zoomBox3D[2],
+                       zoomBox3D[3], zoomBox3D[4], zoomBox3D[5]))
+  {
+    return SET_PROPERTY_ERROR;
+  }
+
+  sciSetZoomBox(pObj, zoomBox3D);
+
+  sciSetZooming(pObj, TRUE);
+
+  return SET_PROPERTY_SUCCEED;
+}
+/*------------------------------------------------------------------------------*/
+/**
+ * Unzoom the selected subwin
+ */
+void sciUnzoom(sciPointObj * pObj)
+{
+  sciSetZooming(pObj, FALSE);
+}
+/*------------------------------------------------------------------------------*/
+/**
+ * get the zoom box to dispplay in Scilab for a sunwin object
+ * @param[out] zoomBox [xMin, yMin, xMax, yMax, zMin, zMax];
+ */
+void sciGetZoom3D(sciPointObj * pObj, double zoomBox[6])
+{
+  double temp;
+
+  // here we get [xMin, xMax, yMin, yMax, zMin, zMax]
+  // we need to switch xMax and yMin
+  sciGetZoomBox(pObj, zoomBox);
+  temp = zoomBox[1];
+  zoomBox[1] = zoomBox[2];
+  zoomBox[2] = temp;
+}
+/*------------------------------------------------------------------------------*/
+/**
+ * Check if the follawing data bounds can be used as new data bounds for the subwin object
+ * @return TRUE if values can be used, false otherwise
+ */
+BOOL checkDataBounds(sciPointObj * pObj, double xMin, double xMax,
+                     double yMin, double yMax, double zMin, double zMax)
+{
+  char logFlags[3];
+  sciGetLogFlags(pObj, logFlags);
+
+  /* check if there is not an inf within the values */
+  /* since this has not any meaning */
+  if (    !finite(xMin) || !finite(xMax)
+       || !finite(yMin) || !finite(yMax)
+       || !finite(zMin) || !finite(zMax) )
+  {
+    sciprint("Error : data bounds values must be finite.");
+    return FALSE ;
+  }
+
+
+  /* check if the bounds are corrects */
+  /* allows equality with bounds since it is working */
+  if ( xMin > xMax || yMin > yMax || zMin > zMax )
+  {
+    sciprint("Error : Min and Max values for one axis do not verify Min <= Max.\n");
+    return FALSE ;
+  }
+
+  /* check for logflags that values are greater than 0 */
+  if (   ( logFlags[0] == 'l' && xMin <= 0.0 )
+      || ( logFlags[1] == 'l' && yMin <= 0.0 )
+      || ( logFlags[2] == 'l' && zMin <= 0.0 ) )
+  {
+    sciprint("Error: bounds on axis must be strictly positive to use logarithmic mode.\n" ) ;
+    return FALSE ;
+  }
+
+  return TRUE;
+}
+/*------------------------------------------------------------------------------*/
index eb859d3..46fdfc6 100644 (file)
@@ -11,6 +11,7 @@
 #include "returnProperty.h"
 #include "sciprint.h"
 #include "localization.h"
+#include "axesScale.h"
 
 /*------------------------------------------------------------------------*/
 int get_zoom_box_property( sciPointObj * pobj )
@@ -23,7 +24,9 @@ int get_zoom_box_property( sciPointObj * pobj )
 
   if ( sciGetZooming( pobj ) )
   {
-    return sciReturnRowVector( pSUBWIN_FEATURE(pobj)->ZRect, 4 ) ;
+    double zoomBox[6];
+    sciGetZoom3D(pobj, zoomBox);
+    return sciReturnRowVector( zoomBox, 6 ) ;
   }
   else
   {
index fe731b2..62339e7 100644 (file)
@@ -151,33 +151,10 @@ int set_data_bounds_property( sciPointObj * pobj, int stackPointer, int valueTyp
       return SET_PROPERTY_ERROR ;
     }
 
-    /* check if there is not an inf within the values */
-    /* since this has not any meaning */
-    if (    !finite(xMin) || !finite(xMax)
-         || !finite(yMin) || !finite(yMax)
-         || !finite(zMin) || !finite(zMax) )
-    {
-      sciprint("Error : data_bounds values must be finite.");
-      return SET_PROPERTY_ERROR ;
-    }
-
-
-    /* check if the bounds are corrects */
-    /* allows equality with bounds since it is working */
-    if ( xMin > xMax || yMin > yMax || zMin > zMax )
-    {
-      sciprint("Error : Min and Max values for one axis do not verify Min <= Max.\n");
-      return SET_PROPERTY_ERROR ;
-    }
-
-    /* check for logflags that values are greater than 0 */
-    if (   ( ppSubWin->logflags[0] == 'l' && xMin <= 0.0 )
-      || ( ppSubWin->logflags[1] == 'l' && yMin <= 0.0 )
-      || ( ppSubWin->logflags[2] == 'l' && zMin <= 0.0 ) )
-    {
-      sciprint("Error: bounds on axis must be strictly positive to use logarithmic mode\n" ) ;
-      return SET_PROPERTY_ERROR ;
-    }
+   if (!checkDataBounds(pobj, xMin, xMax, yMin, yMax, zMin, zMax))
+   {
+     return SET_PROPERTY_ERROR;
+   }
 
     /* copy the values in the axis */
     if ( nbRow * nbCol == 4 )
index e536271..f54223e 100644 (file)
@@ -13,7 +13,7 @@
 #include "sciprint.h"
 #include "localization.h"
 #include "SetPropertyStatus.h"
-#include "PloEch.h"
+#include "axesScale.h"
 
 /*------------------------------------------------------------------------*/
 int set_zoom_box_property( sciPointObj * pobj, int stackPointer, int valueType, int nbRow, int nbCol )
@@ -31,20 +31,26 @@ int set_zoom_box_property( sciPointObj * pobj, int stackPointer, int valueType,
     return SET_PROPERTY_ERROR ;
   }
 
-  /* On doit avoir avoir une matrice 4x1 */
-  if ( nbRow * nbCol == 4 )
+  /* We must have a 4x1 matrix */
+  if ( nbRow * nbCol == 6 )
   {
-    scizoom( getDoubleMatrixFromStack( stackPointer ), pobj ) ;
+    //scizoom( getDoubleMatrixFromStack( stackPointer ), pobj ) ;
+    return sciZoom3D(pobj, getDoubleMatrixFromStack(stackPointer));
+  }
+  else if( nbRow * nbCol == 4)
+  {
+    return sciZoom2D(pobj, getDoubleMatrixFromStack(stackPointer));
   }
   else if ( nbCol * nbRow == 0 )
   {
-    unzoom() ;
+    sciUnzoom(pobj);
+    //unzoom() ;
   }
   else
   {
-    sciprint("Argument must be a vector of size 4.\n");
+    sciprint("Argument must be a vector of size 6 (or 4 in 2d).\n");
     return SET_PROPERTY_ERROR ;
   }
-  return SET_PROPERTY_ERROR ;
+  return SET_PROPERTY_SUCCEED ;
 }
 /*------------------------------------------------------------------------*/
index 8395dc7..eff45ac 100644 (file)
@@ -90,3 +90,4 @@ ChoixFormatE
 ComputeNbSubTics
 sciGetIs3d
 sciGetGridStyle
+sciGetDisplayedDataBounds
index 82c2715..bc55070 100644 (file)
@@ -162,7 +162,7 @@ void ConcreteDrawableSubwin::computeRealDataBounds(void)
 {
   // retrieve user bounds
   double userBounds[6];
-  sciGetDataBounds(m_pDrawed, userBounds);
+  sciGetDisplayedDataBounds(m_pDrawed, userBounds);
 
   double bestBounds[6]; // output bounds
 
index eb61902..1f4f311 100644 (file)
@@ -86,7 +86,7 @@ TicksDrawer * TicksDrawerFactory::createXTicksDrawer(void)
     
     new AutomaticTicksComputer(m_pDrawer);
     double bounds[6];
-    sciGetDataBounds(pSubwin, bounds);
+    sciGetDisplayedDataBounds(pSubwin, bounds);
     ticksComputer->setAxisBounds(bounds[0], bounds[1]);
     newTicksDrawer->setTicksComputer(ticksComputer);
   }
@@ -162,7 +162,7 @@ TicksDrawer * TicksDrawerFactory::createYTicksDrawer(void)
 
     new AutomaticTicksComputer(m_pDrawer);
     double bounds[6];
-    sciGetDataBounds(pSubwin, bounds);
+    sciGetDisplayedDataBounds(pSubwin, bounds);
     ticksComputer->setAxisBounds(bounds[2], bounds[3]);
     newTicksDrawer->setTicksComputer(ticksComputer);
   }
@@ -243,7 +243,7 @@ TicksDrawer * TicksDrawerFactory::createZTicksDrawer(void)
 
     new AutomaticTicksComputer(m_pDrawer);
     double bounds[6];
-    sciGetDataBounds(pSubwin, bounds);
+    sciGetDisplayedDataBounds(pSubwin, bounds);
     ticksComputer->setAxisBounds(bounds[4], bounds[5]);
     newTicksDrawer->setTicksComputer(ticksComputer);
   }
index 3feb58b..29f46fa 100644 (file)
@@ -214,7 +214,7 @@ public abstract class BoxTrimmingObjectGL extends DrawableObjectGL {
                
 //              same processus as for Z coordinate
                Vector3D pointYmin = new Vector3D(getXmin(), getYmin(), zCoordinate);
-               Vector3D pointYmax = new Vector3D(getXmin(), getXmax(), zCoordinate);
+               Vector3D pointYmax = new Vector3D(getXmin(), getYmax(), zCoordinate);
                
                // find the one which is upper in term of pixels
                CoordinateTransformation transform = CoordinateTransformation.getTransformation(gl);
index a19f00d..8252ddf 100644 (file)
@@ -180,7 +180,8 @@ public abstract class TextContentDrawerGL extends DrawableObjectGL implements Te
         * Destroy the current text renderer.
         */
        public void destroyTextRenderer() {
-               textRenderer.dispose();
+               // useless unless we share texture between OpenGL contexts
+               //textRenderer.dispose();
                textRenderer = null;
        }
        
@@ -226,7 +227,6 @@ public abstract class TextContentDrawerGL extends DrawableObjectGL implements Te
                CoordinateTransformation transform = CoordinateTransformation.getTransformation(gl);
 
                Vector3D textCenterPix = transform.getCanvasCoordinates(gl, getTextCenter());
-               gl.glPushMatrix();
                // switch to pixel coordinates
                GLTools.usePixelCoordinates(gl);
                
@@ -237,7 +237,6 @@ public abstract class TextContentDrawerGL extends DrawableObjectGL implements Te
                
                
                GLTools.endPixelCoordinates(gl);
-               gl.glPopMatrix();
                
        }
        
@@ -298,7 +297,6 @@ public abstract class TextContentDrawerGL extends DrawableObjectGL implements Te
                GL gl = getGL();
                CoordinateTransformation transform = CoordinateTransformation.getTransformation(gl);
                Vector3D textCenterPix = transform.getCanvasCoordinates(gl, getTextCenter());
-               gl.glPushMatrix();
                GLTools.usePixelCoordinates(gl);
                
                textCenterPix = transform.retrieveSceneCoordinates(gl, textCenterPix);
@@ -311,7 +309,6 @@ public abstract class TextContentDrawerGL extends DrawableObjectGL implements Te
                }
                
                GLTools.endPixelCoordinates(gl);
-               gl.glPopMatrix();
                return resPix;
        }