home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / irit / drawfuns.arc / SETSCALE.C < prev    next >
Text File  |  1989-07-29  |  5KB  |  124 lines

  1. /*****************************************************************************
  2. *   Routines to set and handle the scaling of the drawing:                   *
  3. *                                                                            *
  4. * Written by:  Gershon Elber                           Ver 0.2, Apr. 1989    *
  5. *****************************************************************************/
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <graphics.h>
  10. #include "Expr2TrG.h"
  11. #include "Program.h"
  12. #include "GraphGnG.h"
  13.  
  14. static void UpdateScaleFlags(MenuItem *SetScaleMenu,
  15.     double Xmin, double Xmax, double Ymax, int NumOfSamples,
  16.     int AutoScaleFlag, double DomainMin, double DomainMax);
  17.  
  18. /*****************************************************************************
  19. *   Main routine of the SetScale module - set the Menu and call the          *
  20. * requested routines.                                                        *
  21. *****************************************************************************/
  22. void DoSetScale(double *Xmin, double *Xmax, double *Ymax, int *NumOfSamples,
  23.     int *AutoScaleFlag, double *DomainMin, double *DomainMax)
  24. {
  25.     static struct MenuItem SetScaleMenu[] = {           /* Load Data Menu */
  26.         YELLOW,    "Set Scale",
  27.     MAGENTA, "                ",       /* Used as Auto/Fixed scale modes */
  28.     MAGENTA, "Set Xmin=         ",           /* Updated to real values ... */
  29.     MAGENTA, "Set Xmax=         ",              /* In UpdateFlags routine. */
  30.         MAGENTA, "Set Ymax=         ",
  31.     GREEN,    "Set Samples=      ",      /* Set number of samples per func. */
  32.     MAGENTA, "Set Tmin=         ",
  33.     MAGENTA, "Set Tmax=         ",
  34.         CYAN,    "Help",
  35.         BLUE,    "Exit"
  36.     };
  37.     int select;
  38.     char s[LINE_LEN];
  39.     double Rtemp;
  40.  
  41.     while (TRUE) {
  42.     UpdateScaleFlags(SetScaleMenu, *Xmin, *Xmax, *Ymax, *NumOfSamples,
  43.                 *AutoScaleFlag, *DomainMin, *DomainMax);
  44.     GGMenuDraw(9, SetScaleMenu, TRUE);            /* Draw Menu */
  45.     select = GGMenuPick();
  46.  
  47.         switch (select) {
  48.         case 1:              /* Toggle Auto/Fixed scaling modes */
  49.                 *AutoScaleFlag = !*AutoScaleFlag;
  50.                 break;
  51.         case 2:                         /* Set Xmin */
  52.         sprintf(s, "%lf", *Xmin);
  53.         GetLine("Enter New Xmin:", s);
  54.         if ((sscanf(s, "%lf", &Rtemp) == 1) && (Rtemp < *Xmax))
  55.                     *Xmin = Rtemp;
  56.         else GGPutErrorMsg("Wrong Format/Range");
  57.                 break;
  58.         case 3:                         /* Set Xmax */
  59.         sprintf(s, "%lf", *Xmax);
  60.         GetLine("Enter New Xmax:", s);
  61.         if ((sscanf(s, "%lf", &Rtemp) == 1) && (Rtemp > *Xmin))
  62.                     *Xmax = Rtemp;
  63.         else GGPutErrorMsg("Wrong Format/Range");
  64.                 break;
  65.         case 4:                         /* Set Ymax */
  66.         sprintf(s, "%lf", *Ymax);
  67.         GetLine("Enter New Ymax:", s);
  68.         if ((sscanf(s, "%lf", &Rtemp) == 1) && (Rtemp > 0))
  69.                     *Ymax = Rtemp;
  70.         else GGPutErrorMsg("Wrong Format/Range");
  71.                 break;
  72.         case 5:               /* Set number of samples per function */
  73.         sprintf(s, "%d", *NumOfSamples);
  74.         GetLine("New NumOfSamples:", s);
  75.         if ((sscanf(s, "%lf", &Rtemp) == 1) && (Rtemp >= 2) &&
  76.                          (Rtemp <= 1000)) *NumOfSamples = (int) Rtemp;
  77.         else GGPutErrorMsg("Wrong Format/Range");
  78.                 break;
  79.         case 6:            /* Set Minimum of function(s) domain */
  80.         sprintf(s, "%lf", *DomainMin);
  81.         GetLine("Enter Domain Min.:", s);
  82.         if ((sscanf(s, "%lf", &Rtemp) == 1) && (Rtemp < *DomainMax))
  83.                     *DomainMin = Rtemp;
  84.         else GGPutErrorMsg("Wrong Format/Range");
  85.                 break;
  86.         case 7:            /* Set Maximum of function(s) domain */
  87.         sprintf(s, "%lf", *DomainMax);
  88.         GetLine("Enter Domain Max.:", s);
  89.         if ((sscanf(s, "%lf", &Rtemp) == 1) && (Rtemp > *DomainMin))
  90.                     *DomainMax = Rtemp;
  91.         else GGPutErrorMsg("Wrong Format/Range");
  92.                 break;
  93.         case 8:                             /* Help */
  94.         GGPrintHelpMenu("DrawFunc.hlp", "SETSCALE");
  95.                 break;
  96.         case 9:                             /* Exit */
  97.                 return;
  98.         }
  99.     }
  100. }
  101.  
  102. /*****************************************************************************
  103. *   Routine to update the EditMenu status according to flags :               *
  104. *****************************************************************************/
  105. static void UpdateScaleFlags(MenuItem *SetScaleMenu,
  106.     double Xmin, double Xmax, double Ymax, int NumOfSamples,
  107.     int AutoScaleFlag, double DomainMin, double DomainMax)
  108. {
  109.     static char *AutoScaleMode   = "Auto Scale Mode";
  110.     static char *FixedScaleMode  = "Fixed Scale Mode";
  111.  
  112.     if (AutoScaleFlag) strcpy(SetScaleMenu[1].string, AutoScaleMode);
  113.     else               strcpy(SetScaleMenu[1].string, FixedScaleMode);
  114.  
  115.     sprintf(SetScaleMenu[2].string, "Set Xmin=%7lg", Xmin);
  116.     sprintf(SetScaleMenu[3].string, "Set Xmax=%7lg", Xmax);
  117.     sprintf(SetScaleMenu[4].string, "Set Ymax=%7lg", Ymax);
  118.  
  119.     sprintf(SetScaleMenu[5].string, "Set Samples=%4d", NumOfSamples);
  120.  
  121.     sprintf(SetScaleMenu[6].string, "Set Dmin=%7lg", DomainMin);
  122.     sprintf(SetScaleMenu[7].string, "Set Dmax=%7lg", DomainMax);
  123. }
  124.