298
299
maxThis=-std::numeric_limits<float>::max();
299
300
minThis=std::numeric_limits<float>::max();
300
for(unsigned int ui=0;ui<v.size();ui++)
302
minThis=std::min(minThis,v[ui].second);
303
maxThis=std::max(maxThis,v[ui].second);
301
if(newDataRef.errBars.size())
303
ASSERT(newDataRef.errBars.size() == v.size());
304
for(unsigned int ui=0;ui<v.size();ui++)
306
minThis=std::min(minThis,v[ui].second-newDataRef.errBars[ui]);
307
maxThis=std::max(maxThis,v[ui].second+newDataRef.errBars[ui]);
312
for(unsigned int ui=0;ui<v.size();ui++)
314
minThis=std::min(minThis,v[ui].second);
315
maxThis=std::max(maxThis,v[ui].second);
305
319
newDataRef.minY=minThis;
306
320
newDataRef.maxY=1.10f*maxThis; //The 1.10 is because mathgl chops off data
328
342
ASSERT(mode<PLOT_TYPE_ENDOFENUM);
329
plottingData[uniqueIDHandler.getPos(plotUniqueID)].plotType=mode;
343
plottingData[plotIDHandler.getPos(plotUniqueID)].plotType=mode;
330
344
plotChanged=true;
333
347
void Multiplot::setColours(unsigned int plotUniqueID, float rN,float gN,float bN)
335
unsigned int plotPos=uniqueIDHandler.getPos(plotUniqueID);
349
unsigned int plotPos=plotIDHandler.getPos(plotUniqueID);
336
350
plottingData[plotPos].r=rN;
337
351
plottingData[plotPos].g=gN;
338
352
plottingData[plotPos].b=bN;
352
368
plotChanged=true;
372
void Multiplot::disableUserAxisBounds(bool xBound)
374
float xMin,xMax,yMin,yMax;
375
scanBounds(xMin,xMax,yMin,yMax);
384
yUserMin=std::max(0.0f,yMin);
389
//Check to see if we have zoomed all the bounds out anyway
390
if(fabs(xUserMin -xMin)<=std::numeric_limits<float>::epsilon() &&
391
fabs(yUserMin -yMin)<=std::numeric_limits<float>::epsilon())
393
applyUserBounds=false;
355
398
void Multiplot::getBounds(float &xMin, float &xMax,
356
399
float &yMin,float &yMax) const
367
//OK, we are going to have to scan for max/min
368
xMin=std::numeric_limits<float>::max();
369
xMax=-std::numeric_limits<float>::max();
370
yMin=std::numeric_limits<float>::max();
371
yMax=-std::numeric_limits<float>::max();
373
for(unsigned int ui=0;ui<plottingData.size();ui++)
410
scanBounds(xMin,xMax,yMin,yMax);
413
ASSERT(xMin < xMax && yMin < yMax);
416
void Multiplot::scanBounds(float &xMin,float &xMax,float &yMin,float &yMax) const
418
//OK, we are going to have to scan for max/min
419
xMin=std::numeric_limits<float>::max();
420
xMax=-std::numeric_limits<float>::max();
421
yMin=std::numeric_limits<float>::max();
422
yMax=-std::numeric_limits<float>::max();
424
for(unsigned int ui=0;ui<plottingData.size();ui++)
426
if(plottingData[ui].visible)
375
428
xMin=std::min(plottingData[ui].minX,xMin);
376
429
xMax=std::max(plottingData[ui].maxX,xMax);
722
797
void Multiplot::setVisible(unsigned int uniqueID, bool setVis)
724
unsigned int plotPos = uniqueIDHandler.getPos(uniqueID);
799
unsigned int plotPos = plotIDHandler.getPos(uniqueID);
726
801
plottingData[plotPos].visible=setVis;
727
802
plotChanged=true;
730
void Multiplot::addRegion(unsigned int parentPlot,float start, float end,
731
float rNew, float gNew, float bNew)
805
void Multiplot::addRegion(unsigned int parentPlot,unsigned int regionID,float start, float end,
806
float rNew, float gNew, float bNew, Filter *parentFilter)
733
808
ASSERT(start <end);
734
809
ASSERT( rNew>=0.0 && rNew <= 1.0);
958
float Multiplot::moveRegionTest(unsigned int regionID,
959
unsigned int method, float newPos) const
961
unsigned int region=(unsigned int)-1;
962
for(unsigned int ui=0;ui<regions.size();ui++)
964
if(regionID== regions[ui].uniqueID)
968
ASSERT(region<regions.size());
969
ASSERT(isPlotVisible(regions[region].ownerPlot));
971
//Check that moving this range will not cause any overlaps with
974
mean=(regions[region].bounds.first + regions[region].bounds.second)/2.0f;
976
//Who is the owner of the current plot -- we only want to interact with our colleagues
977
unsigned int curOwnerPlot= regions[region].ownerPlot;
978
float xMin,xMax,yMin,yMax;
979
getBounds(xMin,xMax,yMin,yMax);
984
case REGION_LEFT_EXTEND:
985
//Check that the upper bound does not intersect any RHS of
987
for(unsigned int ui=0; ui<regions.size(); ui++)
989
if(regions[ui].ownerPlot == curOwnerPlot &&
990
(regions[ui].bounds.second < mean && ui !=region) )
991
newPos=std::max(newPos,regions[ui].bounds.second);
993
//Dont allow past self right
994
newPos=std::min(newPos,regions[region].bounds.second);
995
//Dont extend outside plot
996
newPos=std::max(newPos,xMin);
1000
//Check that the upper bound does not intersect any RHS or LHS of
1005
//Disallow hitting other bounds
1006
for(unsigned int ui=0; ui<regions.size(); ui++)
1008
if(regions[ui].ownerPlot == curOwnerPlot &&
1009
(regions[ui].bounds.first > mean && ui != region) )
1010
newPos=std::min(newPos,regions[ui].bounds.first);
1012
newPos=std::max(newPos,xMin);
1016
//Disallow hitting other bounds
1017
for(unsigned int ui=0; ui<regions.size(); ui++)
1019
if(regions[ui].ownerPlot == curOwnerPlot &&
1020
(regions[ui].bounds.second < mean && ui != region))
1021
newPos=std::max(newPos,regions[ui].bounds.second);
1023
//Dont extend outside plot
1024
newPos=std::min(newPos,xMax);
1028
case REGION_RIGHT_EXTEND:
1029
//Disallow hitting other bounds
1031
for(unsigned int ui=0; ui<regions.size(); ui++)
1033
if(regions[ui].ownerPlot == curOwnerPlot &&
1034
(regions[ui].bounds.second > mean && ui != region))
1035
newPos=std::min(newPos,regions[ui].bounds.first);
1037
//Dont allow past self left
1038
newPos=std::max(newPos,regions[region].bounds.first);
1039
//Dont extend outside plot
1040
newPos=std::min(newPos,xMax);
1052
void Multiplot::moveRegion(unsigned int regionID, unsigned int method, float newPos)
1055
//Well, we should have called this externally to determine location
1056
//let us confirm that this is the case
1057
moveRegionTest(regionID,method,newPos);
1059
unsigned int region=(unsigned int)-1;
1060
for(unsigned int ui=0;ui<regions.size();ui++)
1062
if(regionID== regions[ui].uniqueID)
1066
ASSERT(region<regions.size());
1067
ASSERT(regions[region].parentFilter);
1068
regions[region].parentFilter->setPropFromRegion(method,regions[region].id,newPos);