Changeset 9 in Sophya for trunk/SophyaPI/PI/piscdrawwdg.cc


Ignore:
Timestamp:
Mar 6, 1996, 11:52:37 PM (30 years ago)
Author:
eros
Message:

Version debuggee avec SharedLibraries, et gestion correcte de fontes ds
pibwdgx.cc, Version MAc ramene de Saclay (6/3/96) - link dynamique ds
pidemo.cc (Reza)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/PI/piscdrawwdg.cc

    r8 r9  
    33#include <algo.h>
    44
    5 
    65PIScDrawWdg::PIScDrawWdg(PIContainerGen *par, char *nom,
    76                         int sx, int sy, int px, int py)
     
    1110  limitsFixed = 0;
    1211  xEndDrag = yEndDrag = xBegDrag = yBegDrag = 0;
     12  SetAxesFlags(kAxesDflt);
     13  clip = true;
    1314}
    1415
     
    5152PIScDrawWdg::CalcScale()
    5253{
    53   xScale = XSize() / (xMax-xMin);
    54   yScale = -YSize() / (yMax-yMin);
    55   xOrg   = -xMin * xScale + XPos();
    56   yOrg   = -yMax * yScale + YPos();
     54  double margeH = (xMax-xMin)*0.2;
     55  double margeV = (yMax-yMin)*0.2;
     56  xScale = XSize() / (xMax-xMin + 2*margeH);
     57  yScale = -YSize() / (yMax-yMin + 2*margeV);
     58  xOrg   = (-xMin + margeH) * xScale + XPos();
     59  yOrg   = (-yMax - margeV) * yScale + YPos();
    5760}
    5861
     
    8184    if (yFirstMinTick < yMin) yFirstMinTick += yMinTickStep;
    8285   
    83     xMajTickLen = -2/yScale;
    84     xMinTickLen = -1/yScale;
    85     yMajTickLen = 2/xScale;
    86     yMinTickLen = 1/xScale;
     86//    xMajTickLen = -2/yScale;
     87//    xMinTickLen = -1/yScale;
     88//    yMajTickLen = 2/xScale;
     89//    yMinTickLen = 1/xScale;
     90
     91    yMajTickLen = (xMax-xMin)/100;
     92    yMinTickLen = (xMax-xMin)/250;
     93    xMajTickLen = (yMax-yMin)/100;
     94    xMinTickLen = (yMax-yMin)/250;
     95
    8796}
    8897
     
    108117  dypix = int(dy*yScale + .5);
    109118}
     119
     120double
     121PIScDrawWdg::ScStringWidth(char const* s)
     122{
     123  return CalcStringWidth(s) / xScale;
     124}
     125
     126void
     127PIScDrawWdg::ScSelFontSz(double size, PIFontAtt att)
     128{
     129  int npt = int(fabs(size * yScale)+.5);
     130  if (npt < 8) npt = 8;
     131  if (npt > 127) npt = 127;
     132  SelFontSzPt(npt, att);
     133}
     134
    110135
    111136void
     
    120145PIScDrawWdg::ScDrawLine(double x1, double y1, double x2, double y2)
    121146{
     147 
     148  if (clip) {
     149    if (x2 < xMin && x1 < xMin) return;
     150    if (x2 > xMax && x1 > xMax) return;
     151    if (y1 < yMin && y2 < yMin) return;
     152    if (y2 > yMax && y2 > yMax) return;
     153    if (x2 < x1) {
     154      swap(x1,x2);
     155      swap(y1,y2);
     156    }
     157    if (x2>xMax) {
     158      y2 = y1 + (y2-y1)/(x2-x1)*(xMax-x1);
     159      x2 = xMax;
     160    }
     161    if (x1<xMin) {
     162      y1 = y2 + (y1-y2)/(x1-x2)*(xMin-x2);
     163      x1 = xMin;
     164    }
     165    if (y2 < y1) {
     166      swap(x1,x2);
     167      swap(y1,y2);
     168    }
     169    if (y2>yMax) {
     170      x2 = x1 + (x2-x1)/(y2-y1)*(yMax-y1);
     171      y2 = yMax;
     172    }
     173    if (y1<yMin) {
     174      x1 = x2 + (x1-x2)/(y1-y2)*(yMin-y2);
     175      y1 = yMin;
     176    }
     177  }
    122178  int x1Pix, y1Pix, x2Pix, y2Pix;
    123179  Sc2Local(x1, y1, x1Pix, y1Pix);
     
    129185PIScDrawWdg::ScDrawBox(double x, double y, double dx, double dy)
    130186{
     187  if (clip) {
     188    if (dx < 0) {
     189      x = x+dx;
     190      dx = -dx;
     191    }
     192    if (dy < 0) {
     193      y = y+dy;
     194      dy = -dy;
     195    }
     196    if (x > xMax || x+dx < xMin || y > yMax || y+dy < yMin) return;
     197    if (x < xMin) {
     198      dx -= (xMin-x);
     199      x = xMin;
     200    }
     201    if (y < yMin) {
     202      dy -= (yMin-y);
     203      y = yMin;
     204    }
     205    if (x+dx > xMax)
     206      dx = (xMax-x);
     207    if (y+dy > yMax)
     208      dy = (yMax-y);
     209  }
    131210  int xPix, yPix, x2Pix, y2Pix;
    132211  Sc2Local(x, y, xPix, yPix);
     
    138217PIScDrawWdg::ScDrawFBox(double x, double y, double dx, double dy)
    139218{
     219  if (clip) {
     220    if (dx < 0) {
     221      x = x+dx;
     222      dx = -dx;
     223    }
     224    if (dy < 0) {
     225      y = y+dy;
     226      dy = -dy;
     227    }
     228    if (x > xMax || x+dx < xMin || y > yMax || y+dy < yMin) return;
     229    if (x < xMin) {
     230      dx -= (xMin-x);
     231      x = xMin;
     232    }
     233    if (y < yMin) {
     234      dy -= (yMin-y);
     235      y = yMin;
     236    }
     237    if (x+dx > xMax)
     238      dx = (xMax-x);
     239    if (y+dy > yMax)
     240      dy = (yMax-y);
     241  }
    140242  int xPix, yPix, x2Pix, y2Pix;
    141243  Sc2Local(x, y, xPix, yPix);
     
    163265
    164266void
    165 PIScDrawWdg::DrawAxes(int tickLevel, int markLevel)
    166 {
    167   // Les axes
    168  
    169   ScDrawLine(xMin, 0, xMax, 0);
    170   ScDrawLine(0, yMin, 0, yMax);
    171  
    172   // Les ticks majeurs
    173  
    174   if (tickLevel > 0) {
    175     for (double x=xFirstMajTick; x<=xMax; x += xMajTickStep)
    176       ScDrawLine(x, -xMajTickLen, x, xMajTickLen);
    177     for (double y=yFirstMajTick; y<=yMax; y += yMajTickStep)
    178       ScDrawLine(-yMajTickLen, y, yMajTickLen, y);
    179   }
    180 
    181   // Les ticks mineurs
    182  
    183   if (tickLevel > 1) {
    184     for (double x=xFirstMinTick; x<=xMax; x += xMinTickStep)
    185       ScDrawLine(x, -xMinTickLen, x, xMinTickLen);
    186     for (double y=yFirstMinTick; y<=yMax; y += yMinTickStep)
    187       ScDrawLine(-yMinTickLen, y, yMinTickLen, y);
    188   }
    189 
    190 
    191 }
    192 
    193 void
    194 PIScDrawWdg::SetBBoxMargin(double h, double v)
    195 {
    196   bbmargeh = h;
    197   bbmargev = v;
    198 }
    199 
    200 void
    201 PIScDrawWdg::DrawBBox(int tickLevel, int tickFlags, int markLevel)
    202 {
    203 
    204   double xLow = xMin + bbmargeh;
    205   double xHig = xMax - bbmargeh;
    206   double yLow = yMin + bbmargev;
    207   double yHig = yMax - bbmargev;
    208  
    209   double extXMajTickLen = tickFlags&2 ? xMajTickLen : 0;
    210   double intXMajTickLen = tickFlags&1 ? xMajTickLen : 0;
    211   double extXMinTickLen = tickFlags&2 ? xMinTickLen : 0;
    212   double intXMinTickLen = tickFlags&1 ? xMinTickLen : 0;
    213   double extYMajTickLen = tickFlags&2 ? yMajTickLen : 0;
    214   double intYMajTickLen = tickFlags&1 ? yMajTickLen : 0;
    215   double extYMinTickLen = tickFlags&2 ? yMinTickLen : 0;
    216   double intYMinTickLen = tickFlags&1 ? yMinTickLen : 0;
    217  
    218  
    219   // Les bordures
    220  
    221   ScDrawLine(xLow, yLow, xHig, yLow);
    222   ScDrawLine(xHig, yLow, xHig, yHig);
    223   ScDrawLine(xHig, yHig, xLow, yHig);
    224   ScDrawLine(xLow, yHig, xLow, yLow);
    225  
    226   // Les ticks majeurs
    227  
    228   if (tickLevel > 0) {
    229     for (double x=xFirstMajTick; x<=xHig; x += xMajTickStep) {
    230       ScDrawLine(x, yLow - extXMajTickLen, x, yLow + intXMajTickLen);
    231       ScDrawLine(x, yHig + extXMajTickLen, x, yHig + intXMajTickLen);
    232     }
    233     for (double y=yFirstMajTick; y<=yHig; y += yMajTickStep) {
    234       ScDrawLine(xLow - extYMajTickLen, y, xLow + intYMajTickLen, y);
    235       ScDrawLine(xHig + extYMajTickLen, y, xHig - intYMajTickLen, y);
    236     }
    237   }
    238  
    239 
    240   // Les ticks mineurs
    241  
    242   if (tickLevel > 1) {
    243     for (double x=xFirstMinTick; x<=xHig; x += xMinTickStep) {
    244       ScDrawLine(x, yLow - extXMinTickLen, x, yLow + intXMinTickLen);
    245       ScDrawLine(x, yHig + extXMinTickLen, x, yHig + intXMinTickLen);
    246     }
    247     for (double y=yFirstMinTick; y<=yHig; y += yMinTickStep) {
    248       ScDrawLine(xLow - extYMinTickLen, y, xLow + intYMinTickLen, y);
    249       ScDrawLine(xHig + extYMinTickLen, y, xHig - intYMinTickLen, y);
    250     }
    251   }
    252  
    253   // Les labels
    254   if (markLevel > 0) {
    255     for (double x=xFirstMajTick; x<=xHig; x += xMajTickStep) {
     267PIScDrawWdg::DrawHTicks(double y, double tickUp, double tickDown, double xBeg, double xStep)
     268{
     269  for (double x=xBeg; x<=xMax; x += xStep)
     270    ScDrawLine(x, y-tickDown, x, y+tickUp);
     271}
     272
     273void
     274PIScDrawWdg::DrawVTicks(double x, double tickLeft, double tickRight, double yBeg, double yStep)
     275{
     276  for (double y=yBeg; y<=yMax; y += yStep)
     277    ScDrawLine(x-tickLeft, y, x+tickRight, y);
     278}
     279
     280void
     281PIScDrawWdg::DrawHLabels(double y, double xBeg, double xStep, int just)
     282{
     283  double xOffset = 0;
     284 
     285  ScSelFontSz(xMajTickLen*4);
     286  for (double x=xBeg; x<=xMax; x += xStep) {
    256287      char label[20]; sprintf(label, "%-6g", x);
    257       ScDrawString(x, yLow - 8 * xMajTickLen, label);
    258       ScDrawString(x, yHig + 2 * xMajTickLen, label);
    259     }
    260     for (double y=yFirstMajTick; y<=yHig; y += yMajTickStep) {
     288      double largeur = ScStringWidth(label);
     289      if (just == 1)
     290        xOffset = -largeur;
     291      else if (just == 0)
     292        xOffset = -largeur/2;
     293      else
     294        xOffset = 0;
     295      ScDrawString(x+xOffset, y, label);
     296  }
     297}
     298
     299void
     300PIScDrawWdg::DrawVLabels(double x, double yBeg, double yStep, int just)
     301{
     302  double xOffset = 0;
     303  ScSelFontSz(xMajTickLen*4);
     304  for (double y=yBeg; y<=yMax; y += yStep) {
    261305      char label[20]; sprintf(label, "%-6g", y);
    262       ScDrawString(xLow - 8 * yMajTickLen, y, label);
    263       ScDrawString(xHig + 2 * yMajTickLen, y, label);
    264     }
    265   }
    266 }
     306      double largeur = ScStringWidth(label);
     307      if (just == 1)
     308        xOffset = -largeur;
     309      else if (just == 0)
     310        xOffset = -largeur/2;
     311      else
     312        xOffset = 0;
     313      ScDrawString(x+xOffset, y, label);
     314  }
     315}
     316
     317
     318void
     319PIScDrawWdg::DrawAxes(int flags)
     320{
     321  NoClip();
     322  if (flags == -1)
     323    flags = axesFlags;
     324   
     325 
     326  if (flags & kStdAxes) {
     327 
     328    // Les axes
     329   
     330    ScDrawLine(xMin, 0, xMax, 0);
     331    ScDrawLine(0, yMin, 0, yMax);
     332 
     333    // Les ticks majeurs
     334 
     335    if (flags & kMajTicks) {
     336        DrawHTicks(0, xMajTickLen, xMajTickLen, xFirstMajTick, xMajTickStep);
     337        DrawVTicks(0, yMajTickLen, yMajTickLen, yFirstMajTick, yMajTickStep);
     338    }
     339   
     340    // Les ticks mineurs
     341 
     342    if (flags & kMinTicks) {
     343        DrawHTicks(0, xMinTickLen, xMinTickLen, xFirstMinTick, xMinTickStep);
     344        DrawVTicks(0, yMinTickLen, yMinTickLen, yFirstMinTick, yMinTickStep);
     345    }
     346   
     347    // Les labels
     348   
     349    if (flags & kLabels) {
     350        DrawHLabels(-xMajTickLen*8, xFirstMajTick, xMajTickStep,0);
     351        DrawVLabels(-yMajTickLen*2, yFirstMajTick, yMajTickStep,1);
     352    }
     353   
     354  }
     355 
     356  if (flags & kBoxAxes) {
     357 
     358    // La boite
     359   
     360    ScDrawLine(xMin, yMin, xMax, yMin);
     361    ScDrawLine(xMax, yMin, xMax, yMax);
     362    ScDrawLine(xMax, yMax, xMin, yMax);
     363    ScDrawLine(xMin, yMax, xMin, yMin);
     364
     365    // Longueur des ticks
     366   
     367    double extXMajTickLen = flags&kExtTicks ? xMajTickLen : 0;
     368    double intXMajTickLen = flags&kIntTicks ? xMajTickLen : 0;
     369    double extXMinTickLen = flags&kExtTicks ? xMinTickLen : 0;
     370    double intXMinTickLen = flags&kIntTicks ? xMinTickLen : 0;
     371    double extYMajTickLen = flags&kExtTicks ? yMajTickLen : 0;
     372    double intYMajTickLen = flags&kIntTicks ? yMajTickLen : 0;
     373    double extYMinTickLen = flags&kExtTicks ? yMinTickLen : 0;
     374    double intYMinTickLen = flags&kIntTicks ? yMinTickLen : 0;
     375
     376    // Les ticks majeurs
     377 
     378    if (flags & kMajTicks) {
     379        DrawHTicks(yMin, intXMajTickLen, extXMajTickLen, xFirstMajTick, xMajTickStep);
     380        DrawHTicks(yMax, extXMajTickLen, intXMajTickLen, xFirstMajTick, xMajTickStep);
     381        DrawVTicks(xMin, extYMajTickLen, intYMajTickLen, yFirstMajTick, yMajTickStep);
     382        DrawVTicks(xMax, intYMajTickLen, extYMajTickLen, yFirstMajTick, yMajTickStep);
     383    }
     384   
     385    // Les ticks mineurs
     386 
     387    if (flags & kMinTicks) {
     388        DrawHTicks(yMin, intXMinTickLen, extXMinTickLen, xFirstMinTick, xMinTickStep);
     389        DrawHTicks(yMax, extXMinTickLen, intXMinTickLen, xFirstMinTick, xMinTickStep);
     390        DrawVTicks(xMin, extYMinTickLen, intYMinTickLen, yFirstMinTick, yMinTickStep);
     391        DrawVTicks(xMax, intYMinTickLen, extYMinTickLen, yFirstMinTick, yMinTickStep);
     392    }
     393
     394
     395    // Les labels
     396   
     397    if (flags & kLabels) {
     398        DrawHLabels(yMin-xMajTickLen*8, xFirstMajTick, xMajTickStep,0);
     399        DrawHLabels(yMax+xMajTickLen*2, xFirstMajTick, xMajTickStep,0);
     400        DrawVLabels(xMin-yMajTickLen*2, yFirstMajTick, yMajTickStep,1);
     401        DrawVLabels(xMax+yMajTickLen*2, yFirstMajTick, yMajTickStep,-1);
     402    }
     403  }
     404  Clip();
     405}
     406
     407 
    267408
    268409void
     
    302443
    303444void
    304 PIScDrawWdg::SetAxesKind(int axesKind, int tickLevel, int markLevel)
    305 {
    306   axesChoice  = axesKind;
    307   tickChoice  = tickLevel;
    308   labelChoice = markLevel;
     445PIScDrawWdg::SetAxesFlags(int flags)
     446{
     447  axesFlags = flags;
     448  if (axesFlags & (kIntTicks | kExtTicks | kMajTicks | kMinTicks))
     449    axesFlags |= kTicks;
     450  if ((axesFlags & (kTicks | kIntTicks | kExtTicks)) == kTicks)
     451    axesFlags |= kIntTicks | kExtTicks;
     452  if ((axesFlags & (kTicks | kMajTicks | kMinTicks)) == kTicks)
     453    axesFlags |= kMajTicks;
    309454}
    310455
     
    313458{
    314459  EraseWindow();
    315   if (axesChoice == 1)
    316     DrawAxes(tickChoice, labelChoice);
    317   else if (axesChoice == 2)
    318     DrawBBox(tickChoice, labelChoice);
     460  DrawAxes();
    319461  CallDrawers();
     462  DrawSelf();
    320463}
    321464
     
    329472  xEndDrag = xBegDrag = x;
    330473  yEndDrag = yBegDrag = y;
    331   PIBeep();
    332474}
    333475
     
    429571PIScGFFDrawer::PIScGFFDrawer(GeneralFitFunction* f)
    430572: mFunc(f), mNParms(f->NPar()), mParms(new double[mNParms])
    431 {}
     573{
     574  ASSERT(f->NVar() == 1);
     575}
    432576
    433577PIScGFFDrawer::~PIScGFFDrawer()
     
    437581
    438582void
    439 PIScGFFDrawer::SetParms(double const*)
    440 {}
     583PIScGFFDrawer::SetParms(double const* p)
     584{
     585  for (int i=0; i<mNParms; i++)
     586    mParms[i] = p[i];
     587}
    441588
    442589
     
    444591PIScGFFDrawer::Draw()
    445592{
    446 }
    447 
     593  if (!mDrawWdg) return;
     594  double xMax = mDrawWdg->XMax();
     595  double xMin = mDrawWdg->XMin();
     596  double yMax = mDrawWdg->YMax();
     597  double yMin = mDrawWdg->YMin();
     598  double xStep = (xMax - xMin)/100;
     599  double xOld = xMin;
     600  double yOld = 0;
     601//  double yOld = f->Value(&xMin, mParms);
     602  for (double x = xMin+xStep; x<xMax; x+=xStep) {
     603   double y = 0; // $CHECK$
     604//    double y = f->Value(&x, mParms);
     605    if (y>yMin && yOld>yMin &&
     606        y<yMax && yOld<yMax)
     607           mDrawWdg->ScDrawLine(xOld, yOld, x, y);
     608    xOld = x;
     609    yOld = y;
     610  }
     611}
     612
Note: See TracChangeset for help on using the changeset viewer.