From 9e5629aebccbf8a048cd6fbefcbb46d4c9be3c60 Mon Sep 17 00:00:00 2001 From: koldo Date: Sun, 11 Nov 2018 17:43:31 +0000 Subject: [PATCH] ScatterDraw: Different improvements git-svn-id: svn://ultimatepp.org/upp/trunk@12512 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/ScatterDraw/DrawingFunctions.cpp | 16 + uppsrc/ScatterDraw/DrawingFunctions.h | 3 +- uppsrc/ScatterDraw/Legend.cpp | 6 +- uppsrc/ScatterDraw/ScatterDraw.cpp | 98 ++-- uppsrc/ScatterDraw/ScatterDraw.h | 48 +- .../ScatterDraw/src.tpp/ScatterDraw_en-us.tpp | 47 +- .../src.tpp/ScatterDraw_en-us.tppi | 542 +++++++++--------- 7 files changed, 400 insertions(+), 360 deletions(-) diff --git a/uppsrc/ScatterDraw/DrawingFunctions.cpp b/uppsrc/ScatterDraw/DrawingFunctions.cpp index a7881c893..368be189c 100644 --- a/uppsrc/ScatterDraw/DrawingFunctions.cpp +++ b/uppsrc/ScatterDraw/DrawingFunctions.cpp @@ -24,6 +24,22 @@ Vector GetLineDash(String dash) { return d; } +double GetDashLength(const char *dash) { + double len = 0; + CParser p(dash); + try { + while(!p.IsEof()) + if(!p.Char(':')) { + double data = p.ReadDouble(); + len += data; + } + } + catch(CParser::Error) {} + if (len == 0) + len = 100000; + return len; +} + Vector &GetDashedArray(String dash) { static VectorMap > pats; diff --git a/uppsrc/ScatterDraw/DrawingFunctions.h b/uppsrc/ScatterDraw/DrawingFunctions.h index 91c9b2edc..36e6add61 100644 --- a/uppsrc/ScatterDraw/DrawingFunctions.h +++ b/uppsrc/ScatterDraw/DrawingFunctions.h @@ -37,5 +37,6 @@ void Clip(Draw &w, double x, double y, double cx, double cy); void Clip(Painter &w, double x, double y, double cx, double cy); void ClipEnd(Draw &w); void ClipEnd(Painter &w); - +double GetDashLength(const char *dash); + #endif diff --git a/uppsrc/ScatterDraw/Legend.cpp b/uppsrc/ScatterDraw/Legend.cpp index 2954e87bb..6dfaace12 100644 --- a/uppsrc/ScatterDraw/Legend.cpp +++ b/uppsrc/ScatterDraw/Legend.cpp @@ -29,7 +29,7 @@ void ScatterDraw::DrawLegend(Draw& w) const { for (int i = 0; i < series.GetCount(); ++i) { if (series[i].showLegend) { String legend = series[i].legend; - if (!series[i].unitsY.IsEmpty()) + if (legend.Find('[') < 0 && !series[i].unitsY.IsEmpty()) legend += " [" + series[i].unitsY + "]"; legends.Add(legend); legendWidth = max(legendWidth, GetTextSize(legend, scaledFont).cx); @@ -106,7 +106,9 @@ void ScatterDraw::DrawLegend(Draw& w) const { double ly = (rowIncSign >= 0 ? rect.top : rect.bottom) + rowIncSign*int(rowHeight*(row + 0.6) + loclegendRowSpacing*(row + 0.5)); Vector line; - line << Pointf(lx, ly) << Pointf(lx + lineLen, ly); + double dashLen = GetDashLength(series[i].dash); + double realLineLen = lineLen/dashLen > 1 ? dashLen*int(lineLen/dashLen) : lineLen; + line << Pointf(lx, ly) << Pointf(lx + realLineLen, ly); if (series[i].opacity > 0 && series[i].seriesPlot) DrawPolylineOpa(w, line, plotScaleAvg, 1, series[i].thickness, series[i].color, series[i].dash); Pointf mark_p(lx + xWidth, ly); diff --git a/uppsrc/ScatterDraw/ScatterDraw.cpp b/uppsrc/ScatterDraw/ScatterDraw.cpp index 856108d80..97239ada3 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.cpp +++ b/uppsrc/ScatterDraw/ScatterDraw.cpp @@ -32,7 +32,7 @@ ScatterDraw::ScatterDraw() { fastViewX = false; sequentialXAll = false; zoomStyleX = zoomStyleY = TO_CENTER; - maxMajorUnitsX = maxMajorUnitsY = 10; + //maxMajorUnitsX = maxMajorUnitsY = 10; SetMajorUnitsNum(5, 10); Color(graphColor); isPolar = false; @@ -208,8 +208,8 @@ ScatterDraw& ScatterDraw::FreqGrid2(double freq) { bool ScatterDraw::PointInPlot(Point &pt) { - return hPlotLeft <= pt.x && pt.x <= (GetSize().cx - hPlotRight) && - (vPlotTop + titleHeight) <= pt.y && pt.y <= (GetSize().cy - vPlotBottom); + return hPlotLeft*plotScaleX <= pt.x && pt.x <= (GetSize().cx - hPlotRight*plotScaleX) && + (vPlotTop*plotScaleY + titleHeight) <= pt.y && pt.y <= (GetSize().cy - vPlotBottom*plotScaleY); } bool ScatterDraw::PointInBorder(Point &pt) @@ -225,8 +225,8 @@ bool ScatterDraw::PointInLegend(Point &pt) void ScatterDraw::AdjustMinUnitX() { if (xMajorUnit > 0) { if (xMinUnit < 0) - xMinUnit += (fabs(ceil(xMinUnit/xMajorUnit)) + 1)*xMajorUnit; - else if (xMinUnit >= xMajorUnit) + xMinUnit += (fabs(floor(xMinUnit/xMajorUnit)))*xMajorUnit; + else if (xMinUnit >= xMajorUnit) xMinUnit -= (fabs(floor(xMinUnit/xMajorUnit)))*xMajorUnit; } } @@ -256,17 +256,17 @@ ScatterDraw &ScatterDraw::SetRange(double rx, double ry, double ry2) { if (!IsNull(rx)) { xRange = rx; - xMajorUnit = xRange/10; + xMajorUnit = xRange/xMajorUnitNum; AdjustMinUnitX(); } if (!IsNull(ry)) { yRange = ry; - yMajorUnit = yRange/10; + yMajorUnit = yRange/yMajorUnitNum; AdjustMinUnitY(); } if (!IsNull(ry2)) { yRange2 = ry2; - yMajorUnit2 = yRange2/10; + yMajorUnit2 = yRange2/yMajorUnitNum; AdjustMinUnitY2(); } WhenSetRange(); @@ -276,11 +276,13 @@ ScatterDraw &ScatterDraw::SetRange(double rx, double ry, double ry2) { ScatterDraw &ScatterDraw::SetMajorUnits(double ux, double uy) { if (!IsNull(ux)) { xMajorUnit = ux; + xMajorUnitNum = int(xRange/ux); AdjustMinUnitX(); } if (!IsNull(uy)) { yMajorUnit = uy; yMajorUnit2 = yMajorUnit*yRange2/yRange; + yMajorUnitNum = int(yRange/uy); AdjustMinUnitY(); AdjustMinUnitY2(); } @@ -289,10 +291,12 @@ ScatterDraw &ScatterDraw::SetMajorUnits(double ux, double uy) { ScatterDraw &ScatterDraw::SetMajorUnitsNum(int nx, int ny) { if (!IsNull(nx)) { + xMajorUnitNum = nx; xMajorUnit = xRange/nx; AdjustMinUnitX(); } if (!IsNull(ny)) { + yMajorUnitNum = ny; yMajorUnit = yRange/ny; yMajorUnit2 = yMajorUnit*yRange2/yRange; AdjustMinUnitY(); @@ -303,10 +307,10 @@ ScatterDraw &ScatterDraw::SetMajorUnitsNum(int nx, int ny) { ScatterDraw &ScatterDraw::SetMinUnits(double ux, double uy) { if (!IsNull(ux)) - xMinUnit = ux; + xMinUnit = xMinUnit0 = ux; if (!IsNull(uy)) { - yMinUnit = uy; - yMinUnit2 = yRange2*yMinUnit/yRange; + yMinUnit = yMinUnit0 = uy; + yMinUnit2 = yMinUnit20 = yRange2*yMinUnit/yRange; } if (!IsNull(ux)) AdjustMinUnitX(); @@ -413,7 +417,7 @@ ScatterDraw &ScatterDraw::DoFitToData(bool horizontal, bool vertical, double fac double deltaX = xMin - minx; xMin -= deltaX; xMinUnit += deltaX; - xMajorUnit = xRange/10; + xMajorUnit = xRange/xMajorUnitNum; AdjustMinUnitX(); } } @@ -426,7 +430,7 @@ ScatterDraw &ScatterDraw::DoFitToData(bool horizontal, bool vertical, double fac double deltaY = yMin - miny; yMin -= deltaY; yMinUnit += deltaY; - yMajorUnit = yRange/10; + yMajorUnit = yRange/yMajorUnitNum; AdjustMinUnitY(); } if (miny2 != -DOUBLE_NULL) { @@ -437,7 +441,7 @@ ScatterDraw &ScatterDraw::DoFitToData(bool horizontal, bool vertical, double fac double deltaY2 = yMin2 - miny2; yMin2 -= deltaY2; yMinUnit2 += deltaY2; - yMajorUnit2 = yRange2/10; + yMajorUnit2 = yRange2/yMajorUnitNum; AdjustMinUnitY2(); } } @@ -453,9 +457,9 @@ ScatterDraw &ScatterDraw::DoFitToData(bool horizontal, bool vertical, double fac ScatterDraw &ScatterDraw::Graduation_FormatX(Formats fi) { switch (fi) { - case EXP: cbModifFormatX = THISBACK(ExpFormat); break; - case MON: cbModifFormatX = THISBACK(MonFormat); break; - case DY: cbModifFormatX = THISBACK(DyFormat); break; + case EXP: cbModifFormatX = cbModifFormatXGridUnits = THISBACK(ExpFormat); break; + case MON: cbModifFormatX = cbModifFormatXGridUnits = THISBACK(MonFormat); break; + case DY: cbModifFormatX = cbModifFormatXGridUnits = THISBACK(DyFormat); break; default:break; } return *this; @@ -463,9 +467,9 @@ ScatterDraw &ScatterDraw::Graduation_FormatX(Formats fi) { ScatterDraw &ScatterDraw::Graduation_FormatY(Formats fi) { switch (fi) { - case EXP: cbModifFormatY = THISBACK(ExpFormat); break; - case MON: cbModifFormatY = THISBACK(MonFormat); break; - case DY: cbModifFormatY = THISBACK(DyFormat); break; + case EXP: cbModifFormatY = cbModifFormatYGridUnits = THISBACK(ExpFormat); break; + case MON: cbModifFormatY = cbModifFormatYGridUnits = THISBACK(MonFormat); break; + case DY: cbModifFormatY = cbModifFormatYGridUnits = THISBACK(DyFormat); break; default:break; } return *this; @@ -473,9 +477,9 @@ ScatterDraw &ScatterDraw::Graduation_FormatY(Formats fi) { ScatterDraw &ScatterDraw::Graduation_FormatY2(Formats fi) { switch (fi) { - case EXP: cbModifFormatY2 = THISBACK(ExpFormat); break; - case MON: cbModifFormatY2 = THISBACK(MonFormat); break; - case DY: cbModifFormatY2 = THISBACK(DyFormat); break; + case EXP: cbModifFormatY2 = cbModifFormatY2GridUnits = THISBACK(ExpFormat); break; + case MON: cbModifFormatY2 = cbModifFormatY2GridUnits = THISBACK(MonFormat); break; + case DY: cbModifFormatY2 = cbModifFormatY2GridUnits = THISBACK(DyFormat); break; default:break; } return *this; @@ -1293,13 +1297,8 @@ void ScatterDraw::DoZoom(double scale, bool mouseX, bool mouseY) { } } } - //double plotW = scale*(GetSize().cx - (hPlotLeft + hPlotRight)); - //double plotH = scale*(GetSize().cy - (vPlotTop + vPlotBottom)) - titleHeight; - //double dw = plotW*xMajorUnit/double(xRange); - //double dh = plotH*yMajorUnit/double(yRange); - bool can = true;//min(dw, dh) > 20 || scale < 1; - if (mouseX && can) { + if (mouseX) { if (zoomStyleX == TO_CENTER) { if (!IsNull(minXmin) && xMin + xRange*(1-scale)/2. <= minXmin) { highlight_0 = GetTickCount(); @@ -1317,16 +1316,18 @@ void ScatterDraw::DoZoom(double scale, bool mouseX, bool mouseY) { AdjustMinUnitX(); } xRange *= scale; - if (!IsNull(maxMajorUnitsX)) { - if (xRange < 2*xMajorUnit) - xMajorUnit /= 5; - else if (xRange/xMajorUnit > maxMajorUnitsX) - xMajorUnit *= 5; - AdjustMinUnitX(); + double xmun = xRange/xMajorUnit; + if (xmun > 2*xMajorUnitNum) { + xMajorUnit *= 2; + xMinUnit = xMinUnit0; + } else if (xmun < xMajorUnitNum/2) { + xMajorUnit /= 2; + xMinUnit = xMinUnit0; } + AdjustMinUnitX(); lastxRange = xRange; } - if (mouseY && can) { + if (mouseY) { if (zoomStyleY == TO_CENTER) { if (!IsNull(minYmin) && yMin + yRange*(1-scale)/2. <= minYmin) { highlight_0 = GetTickCount(); @@ -1349,19 +1350,22 @@ void ScatterDraw::DoZoom(double scale, bool mouseX, bool mouseY) { } yRange *= scale; yRange2 *= scale; - if (!IsNull(maxMajorUnitsY)) { - if (yRange < 2*yMajorUnit) { - yMajorUnit /= 5; - yMajorUnit2 /= 5; - } else if (yRange/yMajorUnit > maxMajorUnitsY) { - yMajorUnit *= 5; - yMajorUnit2 *= 5; - } - AdjustMinUnitY(); - } + double ymun = yRange/yMajorUnit; + if (ymun > 2*yMajorUnitNum) { + yMajorUnit *= 2; + yMinUnit = yMinUnit0; + yMajorUnit2 *= 2; + yMinUnit2 = yMinUnit20; + } else if (ymun < yMajorUnitNum/2) { + yMajorUnit /= 2; + yMinUnit = yMinUnit0; + yMajorUnit2 /= 2; + yMinUnit2 = yMinUnit20; + } + AdjustMinUnitY(); lastyRange = yRange; } - if ((mouseX || mouseY) && can) { + if (mouseX || mouseY) { WhenSetRange(); if (zoomStyleX == TO_CENTER || zoomStyleY == TO_CENTER) WhenSetXYMin(); diff --git a/uppsrc/ScatterDraw/ScatterDraw.h b/uppsrc/ScatterDraw/ScatterDraw.h index f0889ebd2..48aa30323 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.h +++ b/uppsrc/ScatterDraw/ScatterDraw.h @@ -307,10 +307,13 @@ protected: public: Callback3 cbModifFormatX; + Callback3 cbModifFormatXGridUnits; Callback3 cbModifFormatDeltaX; Callback3 cbModifFormatY; + Callback3 cbModifFormatYGridUnits; Callback3 cbModifFormatDeltaY; Callback3 cbModifFormatY2; + Callback3 cbModifFormatY2GridUnits; Callback3 cbModifFormatDeltaY2; Callback WhenZoomScroll; @@ -436,7 +439,6 @@ public: double GetY2Range()const {return yRange2;} ScatterDraw &SetMajorUnits(double ux, double uy = Null); ScatterDraw &SetMajorUnitsNum(int nx, int ny = Null); - ScatterDraw &SetMaxMajorUnits(int maxX, int maxY) {maxMajorUnitsX = maxX; maxMajorUnitsY = maxY; return *this;} double GetMajorUnitsX() {return xMajorUnit;} double GetMajorUnitsY() {return yMajorUnit;} double GetMajorUnitsY2() {return yMajorUnit2;} @@ -1066,7 +1068,9 @@ protected: double xRange, yRange, yRange2; double xMin, yMin, yMin2; double xMajorUnit, yMajorUnit, yMajorUnit2; + double xMajorUnitNum, yMajorUnitNum; double xMinUnit, yMinUnit, yMinUnit2; + double xMinUnit0, yMinUnit0, yMinUnit20; double minXRange, maxXRange, minYRange, maxYRange; double minXmin, minYmin, maxXmax, maxYmax; double lastxRange, lastyRange; @@ -1074,7 +1078,7 @@ protected: Font reticleFont; Color reticleColor; - int maxMajorUnitsX, maxMajorUnitsY; + //int maxMajorUnitsX, maxMajorUnitsY; Color gridColor; double gridWidth; @@ -1256,17 +1260,17 @@ bool ScatterDraw::PlotTexts(T& w, const bool boldX, bool boldY) yUnits2.FindAdd(serie.unitsY); } } - if (!xUnits.IsEmpty()) { + if (xLabel.Find('[') < 0 && !xUnits.IsEmpty()) { xLabel += " "; for (int i = 0; i < xUnits.GetCount(); ++i) xLabel += "[" + xUnits[i] + "]"; } - if (!yUnits.IsEmpty()) { + if (yLabel.Find('[') < 0 && !yUnits.IsEmpty()) { yLabel += " "; for (int i = 0; i < yUnits.GetCount(); ++i) yLabel += "[" + yUnits[i] + "]"; } - if (!yUnits2.IsEmpty()) { + if (yLabel2.Find('[') < 0 && !yUnits2.IsEmpty()) { yLabel2 += " "; for (int i = 0; i < yUnits2.GetCount(); ++i) yLabel2 += "[" + yUnits2[i] + "]"; @@ -1295,12 +1299,15 @@ bool ScatterDraw::PlotTexts(T& w, const bool boldX, bool boldY) Upp::Font fontY2Num = fontYNum; fontY2Num.Italic(); +debug_h(); if (drawXReticle) for(int i = 0; xMinUnit + i*xMajorUnit <= xRange; i++) { double reticleX = plotW*xMinUnit/xRange + i*plotW/(xRange/xMajorUnit); double gridX = xMinUnit + i*xMajorUnit + xMin; String gridLabelX; - if (cbModifFormatX) + if (cbModifFormatXGridUnits) + cbModifFormatXGridUnits(gridLabelX, i, gridX); + else if (cbModifFormatX) cbModifFormatX(gridLabelX, i, gridX); else gridLabelX = VariableFormatX(gridX); @@ -1320,7 +1327,6 @@ bool ScatterDraw::PlotTexts(T& w, const bool boldX, bool boldY) } } -debug_h(); if (drawYReticle) for(int i = 0; yMinUnit + i*yMajorUnit <= yRange; i++) { int reticleY = fround(-plotH*yMinUnit/yRange + plotH - i*plotH/(yRange/yMajorUnit)); @@ -1329,7 +1335,9 @@ debug_h(); w.DrawLine(fround(plotW + plotScaleX*4.), reticleY, plotW, reticleY, fround(gridWidth*plotScaleAvg), axisColor); double gridY = yMinUnit + i*yMajorUnit + yMin; String gridLabelY; - if (cbModifFormatY) + if (cbModifFormatYGridUnits) + cbModifFormatYGridUnits(gridLabelY, i, gridY); + else if (cbModifFormatY) cbModifFormatY(gridLabelY, i, gridY); else gridLabelY = VariableFormatY(gridY); @@ -1338,7 +1346,9 @@ debug_h(); if (drawY2Reticle) { double gridY2 = (gridY - yMin)/yRange*yRange2 + yMin2; String gridLabelY2; - if (cbModifFormatY2) + if (cbModifFormatY2GridUnits) + cbModifFormatY2GridUnits(gridLabelY2, i, gridY2); + else if (cbModifFormatY2) cbModifFormatY2(gridLabelY2, i, gridY2); else gridLabelY2 = VariableFormatY2(gridY2); @@ -1422,36 +1432,32 @@ void ScatterDraw::Plot(T& w) if (drawVGrid) { if (!isPolar) { double x0 = plotW*xMinUnit/xRange; - if ((xRange - xMinUnit)/xMajorUnit > maxMajorUnitsX) - xMajorUnit = (xRange - xMinUnit)/maxMajorUnitsX; for(int i = 0; xMinUnit + i*xMajorUnit < xRange; i++) { - int xg = fround(x0 + i*plotW/d1); + double xg = x0 + i*plotW/d1; if (xg > 2*gridWidth*plotScaleAvg && xg < plotW - 2*gridWidth*plotScaleAvg) - DrawLineOpa(w, xg, 0, xg, fround(plotH), plotScaleAvg, 1, gridWidth, gridColor, gridDash); + DrawLineOpa(w, xg, 0, xg, plotH, plotScaleAvg, 1, gridWidth, gridColor, gridDash); } - } else { + } /*else { double ang0 = 2*M_PI*xMinUnit/xRange; for(double i = 0; xMinUnit + i*xMajorUnit < xRange; i++) { double ang = ang0 + i*2*M_PI*xMajorUnit/xRange; - DrawLineOpa(w, fround(x_c), fround(y_c), fround(x_c + r*cos(ang)), fround(y_c + r*sin(ang)), plotScaleAvg, 1, gridWidth*plotScaleAvg, gridColor, gridDash); + DrawLineOpa(w, x_c, y_c, x_c + r*cos(ang), y_c + r*sin(ang), plotScaleAvg, 1, gridWidth*plotScaleAvg, gridColor, gridDash); } - } + }*/ } if (drawHGrid) { if (!isPolar) { double y0 = -plotH*yMinUnit/yRange + plotH; - if ((yRange - yMinUnit)/yMajorUnit > maxMajorUnitsY) - yMajorUnit = (yRange - yMinUnit)/maxMajorUnitsY; for(int i = 0; yMinUnit + i*yMajorUnit < yRange; i++) { - int yg = fround(y0 - i*plotH/d2); + double yg = y0 - i*plotH/d2; if (yg > 2*gridWidth*plotScaleAvg && yg < plotH - 2*gridWidth*plotScaleAvg) - DrawLineOpa(w, 0, yg, fround(plotW), yg, plotScaleAvg, 1, gridWidth, gridColor, gridDash); + DrawLineOpa(w, 0, yg, plotW, yg, plotScaleAvg, 1, gridWidth, gridColor, gridDash); } } /*else { double y0 = -plotH*yMinUnit/r + plotH; for(double i = 0; yMinUnit + i*yMajorUnit < yRange; i++) { double yg = y0 + i*r*yRange/yMajorUnit; - DrawCircleOpa(w, fround(plotW/2), fround(plotH/2), yg, 1, 1, gridWidth, gridColor, gridDash); + DrawCircleOpa(w, plotW/2, plotH/2, yg, 1, 1, gridWidth, gridColor, gridDash); } }*/ } diff --git a/uppsrc/ScatterDraw/src.tpp/ScatterDraw_en-us.tpp b/uppsrc/ScatterDraw/src.tpp/ScatterDraw_en-us.tpp index 8ac4fb94f..605748c23 100644 --- a/uppsrc/ScatterDraw/src.tpp/ScatterDraw_en-us.tpp +++ b/uppsrc/ScatterDraw/src.tpp/ScatterDraw_en-us.tpp @@ -52,23 +52,37 @@ surfaces]&] [s6;%- &] [s5;:ScatterDraw`:`:cbModifFormatX:%- [_^Callback3^ Callback3]_[* cbModifFormatX]&] +[s3; If set this callback will give the String to be painted in the +pop window and table data to refer X axis data.&] +[s3; The input values are the X axis value index and value.&] +[s1;%- &] +[s6;%- &] +[s5;:ScatterDraw`:`:cbModifFormatXGridUnits:%- [_^Upp`:`:Callback3^ Callback3]_[* cbModifFormatXGridUnits]&] [s3; If set this callback will give the String to be painted beside -every X axis grid line and in the pop window. The input values -are the X axis value index and value.&] +every X axis grid line.&] +[s3; The input values are the X axis value index and value.&] [s1;%- &] [s6;%- &] [s5;:ScatterDraw`:`:cbModifFormatDeltaX:%- [_^Callback3^ Callback3]_[* cbModifFormatDeltaX]&] [s3; If set this callback will give the String to be painted in the -pop window representing the delta between two X axis points. -The input values are the X axis value index and value.&] +pop window representing the delta between two X axis points.&] +[s3; The input values are the X axis value index and value.&] [s1;%- &] [s6;%- &] [s5;:ScatterDraw`:`:cbModifFormatY:%- [_^Callback3^ Callback3]_[* cbModifFormatY]&] +[s3; If set this callback will give the String to be painted in the +pop window and table data to refer Y axis data.&] +[s3; The input values are the Y axis value index and value.&] +[s1;%- &] +[s6;%- &] +[s5;:ScatterDraw`:`:cbModifFormatYGridUnits:%- [_^Upp`:`:Callback3^ Callback3]_[* cbModifFormatYGridUnits]&] [s3; If set this callback will give the String to be painted beside -every main Y axis grid line and in the pop window. The input -values are the Y axis value index and value.&] +every Y axis grid line.&] +[s3; The input values are the Y axis value index and value.&] [s1;%- &] [s6;%- &] [s5;:ScatterDraw`:`:cbModifFormatDeltaY:%- [_^Callback3^ Callback3]_[* cbModifFormatY2]&] +[s3; If set this callback will give the String to be painted in the +pop window and table data to refer secondary Y axis data.&] +[s3; The input values are the Y axis value index and value.&] +[s1;%- &] +[s6;%- &] +[s5;:ScatterDraw`:`:cbModifFormatY2GridUnits:%- [_^Upp`:`:Callback3^ Callback3]_[* cbModifFormatY2GridUnits]&] [s3; If set this callback will give the String to be painted beside -every secondary and in the pop window Y axis grid line. The input -values are the Y axis value index and value.&] +every secondary Y axis grid line.&] +[s3; The input values are the secondary Y axis value index and value.&] [s1;%- &] [s6;%- &] [s5;:ScatterDraw`:`:cbModifFormatDeltaY2:%- [_^Callback3^ Callback3]