/* Copyright (c) 2008-2019 Jan W. Krieger () This software is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License (LGPL) for more details. You should have received a copy of the GNU Lesser General Public License (LGPL) along with this program. If not, see . */ #include "jkqtplotter/jkqtpgraphs.h" #include "jkqtplotter/jkqtpbaseplotter.h" #include #include #include #include "jkqtplottertools/jkqtptools.h" #include "jkqtplottertools/jkqtpimagetools.h" #include "jkqtplotter/jkqtpgraphsimage.h" #include "jkqtplotter/jkqtpbaseelements.h" #include "jkqtplotter/jkqtplotter.h" #define SmallestGreaterZeroCompare_xvsgz() if ((xvsgz>10.0*DBL_MIN)&&((smallestGreaterZero<10.0*DBL_MIN) || (xvsgzgetNextStyle(); //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); style=parent->getPlotStyle(parentPlotStyle).style(); } fillColor=color; } JKQTPXYLineGraph::JKQTPXYLineGraph(JKQTBasePlotter* parent): JKQTPXYGraph(parent) { sortData=JKQTPXYGraph::Unsorted; drawSelectionLine=false; selectionLineColor=Qt::transparent; color=QColor("red"); style=Qt::SolidLine; lineWidth=2; parentPlotStyle=-1; symbolSize=12; symbolWidth=1; symbol=JKQTPNoSymbol; drawLine=true; if (parent) { // get style settings from parent object parentPlotStyle=parent->getNextStyle(); //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); style=parent->getPlotStyle(parentPlotStyle).style(); } fillColor=color; } void JKQTPXYLineGraph::draw(JKQTPEnhancedPainter& painter) { #ifdef JKQTBP_AUTOTIMER JKQTPAutoOutputTimer jkaaot("JKQTPXYLineGraph::draw"); #endif if (parent==nullptr) return; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return; //qDebug()<<"JKQTPXYLineGraph::draw();"; drawErrorsBefore(painter); //qDebug()<<"JKQTPXYLineGraph::draw(): "<<1; painter.save(); //qDebug()<<"JKQTPXYLineGraph::draw(): "<<2; QPen p=painter.pen(); p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->getLineWidthMultiplier()))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); QPen penSelection=p; penSelection.setStyle(Qt::SolidLine); QColor selcol=penSelection.color(); selcol.setAlphaF(0.5); penSelection.setColor(selcol); if (selectionLineColor!=Qt::transparent) { penSelection.setColor(selectionLineColor); } penSelection.setWidthF(penSelection.widthF()*3.0); int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); int imin=0; // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxpt2px(painter, symbolSize*1.5), parent->pt2px(painter, symbolWidth*parent->getLineWidthMultiplier()), penSelection.color(), penSelection.color()); } JKQTPPlotSymbol(painter, x, y, symbol, parent->pt2px(painter, symbolSize), parent->pt2px(painter, symbolWidth*parent->getLineWidthMultiplier()), symbColor, symbFillColor); /*if (drawLine && first) { double xl1=xold; double yl1=yold; double xl2=x; double yl2=y; lines.append(QLineF(xl1, yl1, xl2, yl2)); }*/ if (drawLine) { linesP<pt2px(painter, this->symbolSize); if (symbolSize>minSize*0.9) symbolSize=minSize*0.9; double symbolWidth=parent->pt2px(painter, this->symbolWidth*parent->getLineWidthMultiplier()); if (symbolWidth>0.3*symbolSize) symbolWidth=0.3*symbolSize; double lineWidth=parent->pt2px(painter, this->lineWidth*parent->getLineWidthMultiplier()); if (lineWidth>0.5*maxSize) lineWidth=0.5*maxSize; painter.save(); QPen p=painter.pen(); p.setColor(getKeyLabelColor()); p.setStyle(style); p.setWidthF(lineWidth); painter.setPen(p); double y=rect.top()+rect.height()/2.0; if (drawLine) painter.drawLine(QLineF(rect.left(), y, rect.right(), y)); JKQTPPlotSymbol(painter, rect.left()+rect.width()/2.0, rect.top()+rect.height()/2.0, symbol, symbolSize, symbolWidth, getKeyLabelColor(), fillColor); painter.restore(); } QColor JKQTPXYLineGraph::getKeyLabelColor() { return color; } JKQTPXYLineErrorGraph::JKQTPXYLineErrorGraph(JKQTBasePlotter *parent): JKQTPXYLineGraph(parent), JKQTPXYGraphErrors() { setErrorColorFromGraphColor(color); } JKQTPXYLineErrorGraph::JKQTPXYLineErrorGraph(JKQTPlotter *parent): JKQTPXYLineGraph(parent), JKQTPXYGraphErrors() { setErrorColorFromGraphColor(color); } bool JKQTPXYLineErrorGraph::getXMinMax(double &minx, double &maxx, double &smallestGreaterZero) { if (xErrorColumn<0 || xErrorStyle==JKQTPNoError) { return JKQTPXYLineGraph::getXMinMax(minx, maxx, smallestGreaterZero); } else { bool start=true; minx=0; maxx=0; smallestGreaterZero=0; if (parent==nullptr) return false; JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxget(static_cast(xColumn),static_cast(i))+getXErrorU(i, datastore); if (JKQTPIsOKFloat(xv)) { if (start || xv>maxx) maxx=xv; if (start || xvget(static_cast(xColumn),static_cast(i))-getXErrorL(i, datastore); if (start || xv>maxx) maxx=xv; if (start || xvgetDatastore(); int imin=0; int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxget(static_cast(yColumn),static_cast(i))+getYErrorU(i, datastore); if (JKQTPIsOKFloat(yv)) { if (start || yv>maxy) maxy=yv; if (start || yvget(static_cast(yColumn),static_cast(i))-getYErrorL(i, datastore); if (start || yv>maxy) maxy=yv; if (start || yvgetNextStyle(); //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); fillColor=color.lighter(); style=parent->getPlotStyle(parentPlotStyle).style(); } } JKQTPStepHorizontalGraph::JKQTPStepHorizontalGraph(JKQTPlotter* parent): JKQTPXYGraph(parent) { color=QColor("red"); fillColor=color.lighter(); style=Qt::SolidLine; lineWidth=2; fillStyle=Qt::SolidPattern; drawLine=true; fillCurve=true; stepType=JKQTPStepLeft; if (parent) { // get style settings from parent object parentPlotStyle=parent->getNextStyle(); //std::cout<<"got style settings from parent: "<getPlotStyle(parentPlotStyle).color(); fillColor=color.lighter(); style=parent->getPlotStyle(parentPlotStyle).style(); } } void JKQTPStepHorizontalGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { painter.save(); QPen p=painter.pen(); QPen np(Qt::NoPen); p.setColor(color); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); QBrush b=painter.brush(); b.setColor(fillColor); b.setStyle(fillStyle); int y=rect.top()+rect.height()/2.0; painter.setPen(np); if (drawLine) painter.setPen(p); painter.setBrush(b); if (fillCurve) painter.drawRect(rect); if (!fillCurve & drawLine) painter.drawLine(QLineF(rect.left(), y, rect.right(), y)); painter.restore(); } QColor JKQTPStepHorizontalGraph::getKeyLabelColor() { return color; } void JKQTPStepHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { #ifdef JKQTBP_AUTOTIMER JKQTPAutoOutputTimer jkaaot("JKQTPStepHorizontalGraph::draw"); #endif if (parent==nullptr) return; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return; drawErrorsBefore(painter); QPen p=painter.pen(); p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->getLineWidthMultiplier()))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); QPen np(Qt::NoPen); QBrush b=painter.brush(); b.setColor(fillColor); b.setStyle(fillStyle); int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); int imin=0; // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxgetXAxis()->isLogAxis()) x0=transformX(parent->getXAxis()->getMin()); double y0=transformY(0); if (parent->getYAxis()->isLogAxis()) y0=transformY(parent->getYAxis()->getMin()); bool subsequentItem=false; intSortData(); for (int iii=imin; iiiget(static_cast(xColumn),static_cast(i)); double yv=datastore->get(static_cast(yColumn),static_cast(i)); //std::cout<<"(xv, yv) = ( "<getDatastore(); if (datastore==nullptr) return; drawErrorsBefore(painter); QPen p=painter.pen(); p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->getLineWidthMultiplier()))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); QPen np(Qt::NoPen); QBrush b=painter.brush(); b.setColor(fillColor); b.setStyle(fillStyle); int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); int imin=0; // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxgetXAxis()->isLogAxis()) x0=transformX(parent->getXAxis()->getMin()); //double y0=transformY(0); //if (parent->getYAxis()->isLogAxis()) y0=transformY(parent->getYAxis()->getMin()); bool first=false; intSortData(); for (int iii=imin; iiiget(static_cast(xColumn),static_cast(i)); double yv=datastore->get(static_cast(yColumn),static_cast(i)); //std::cout<<"(xv, yv) = ( "<getNextStyle(); centerColor=parent->getPlotStyle(parentPlotStyle).color(); color=centerColor.darker(); fillColor=centerColor.lighter(); } fillColor.setAlphaF(0.5); rangeMin=rangeMax=0; rangeCenter=0; plotCenterLine=true; plotRange=true; plotRangeLines=true; fillRange=true; } JKQTPHorizontalRange::JKQTPHorizontalRange(JKQTPlotter* parent): JKQTPGraph(parent) { color=QColor("red").darker(); fillColor=QColor("red").lighter(); style=Qt::DotLine; lineWidth=1; fillStyle=Qt::SolidPattern; centerColor=QColor("red"); centerStyle=Qt::SolidLine; centerLineWidth=2; sizeMin=0; sizeMax=1; unlimitedSizeMin=true; unlimitedSizeMax=true; invertedRange=false; if (parent) { // get style settings from parent object parentPlotStyle=parent->getNextStyle(); centerColor=parent->getPlotStyle(parentPlotStyle).color(); color=centerColor.darker(); fillColor=centerColor.lighter(); } fillColor.setAlphaF(0.5); rangeMin=rangeMax=0; rangeCenter=0; plotCenterLine=true; plotRange=true; plotRangeLines=true; fillRange=true; } void JKQTPHorizontalRange::draw(JKQTPEnhancedPainter& painter) { #ifdef JKQTBP_AUTOTIMER JKQTPAutoOutputTimer jkaaot("JKQTPHorizontalRange::draw"); #endif double c=transformY(rangeCenter); double cmi=transformY(rangeMin); double cma=transformY(rangeMax); double smi=transformY(parent->getYAxis()->getMin()); double sma=transformY(parent->getYAxis()->getMax()); double mi=transformX(parent->getXAxis()->getMin()); double ma=transformX(parent->getXAxis()->getMax()); if (!unlimitedSizeMin) mi=transformX(sizeMin); if (!unlimitedSizeMax) ma=transformX(sizeMax); //std::cout<<"hor: rangeMin="< "< "<pt2px(painter, lineWidth*parent->getLineWidthMultiplier()))); QBrush nb(Qt::NoBrush); QBrush b=painter.brush(); b.setColor(fillColor); b.setStyle(fillStyle); QRectF rect(QPointF(mi, cmi), QPointF(ma, cma)); if (fillRange) { painter.setPen(np); painter.setBrush(b); if (invertedRange) { if (JKQTPIsOKFloat(cmi)) { QRectF rectl(QPointF(mi, smi), QPointF(ma, cmi)); painter.drawRect(rectl); } if (JKQTPIsOKFloat(cma)) { QRectF rectr(QPointF(mi, cma), QPointF(ma, sma)); painter.drawRect(rectr); } } else { if (JKQTPIsOKFloat(cmi) && JKQTPIsOKFloat(cma)) painter.drawRect(rect); } } //std::cout<<"hor: rangeMin.rect.top="<getYAxis()->getMin()); double ma=transformY(parent->getYAxis()->getMax()); double smi=transformX(parent->getXAxis()->getMin()); double sma=transformX(parent->getXAxis()->getMax()); if (!unlimitedSizeMin) mi=transformY(sizeMin); if (!unlimitedSizeMax) ma=transformY(sizeMax); painter.save(); if (plotRange && (cmi!=cma) && JKQTPIsOKFloat(mi) && JKQTPIsOKFloat(ma)) { QPen p=painter.pen(); QPen np(Qt::NoPen); p.setColor(color); p.setStyle(style); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->getLineWidthMultiplier()))); QBrush nb(Qt::NoBrush); QBrush b=painter.brush(); b.setColor(fillColor); b.setStyle(fillStyle); QRectF rect(QPointF(cmi, mi), QPointF(cma, ma)); if (fillRange) { painter.setPen(np); painter.setBrush(b); if (invertedRange) { if (JKQTPIsOKFloat(cmi)) { QRectF rectl(QPointF(smi,mi), QPointF(cmi,ma)); painter.drawRect(rectl); } if (JKQTPIsOKFloat(cma)) { QRectF rectr(QPointF(cma,mi), QPointF(sma,ma)); painter.drawRect(rectr); } } else { if (JKQTPIsOKFloat(cmi) && JKQTPIsOKFloat(cma)) painter.drawRect(rect); } } if (plotRangeLines && JKQTPIsOKFloat(cmi) && JKQTPIsOKFloat(cma)) { painter.setPen(p); painter.setBrush(nb); painter.drawLine(rect.left(), rect.top(), rect.left(), rect.bottom()); painter.drawLine(rect.right(), rect.top(), rect.right(), rect.bottom()); } } if (plotCenterLine&& JKQTPIsOKFloat(c) && JKQTPIsOKFloat(ma) && JKQTPIsOKFloat(mi)) { QPen p=painter.pen(); p.setColor(centerColor); p.setStyle(centerStyle); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, centerLineWidth*parent->getLineWidthMultiplier()))); painter.setPen(p); painter.drawLine(QLineF(c, mi, c, ma)); } painter.restore(); } void JKQTPVerticalRange::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { painter.save(); QPen p=painter.pen(); QPen np(Qt::NoPen); p.setColor(color); p.setStyle(style); QBrush nb(Qt::NoBrush); QBrush b=painter.brush(); b.setColor(fillColor); b.setStyle(fillStyle); //int y=rect.top()+rect.height()/2.0; if (plotRange) { painter.setPen(np); painter.setBrush(b); if (fillRange) painter.drawRect(rect); painter.setPen(p); painter.setBrush(nb); if (plotRangeLines) { painter.drawLine(rect.left(), rect.top(), rect.left(), rect.bottom()); painter.drawLine(rect.right(), rect.top(), rect.right(), rect.bottom()); } } if (plotCenterLine) { QPen p=painter.pen(); p.setColor(centerColor); p.setStyle(centerStyle); painter.setPen(p); int y=rect.left()+rect.width()/2.0; painter.drawLine(y, rect.top(), y, rect.bottom()); } painter.restore(); } bool JKQTPVerticalRange::getXMinMax(double &minx, double &maxx, double &smallestGreaterZero) { minx=rangeMin; maxx=rangeMax; smallestGreaterZero=0; if (rangeMin>0) smallestGreaterZero=rangeMin; return true; } bool JKQTPVerticalRange::getYMinMax(double &miny, double &maxy, double &smallestGreaterZero) { smallestGreaterZero=miny=maxy=0; return false; } QPen JKQTPXYLineGraph::getLinePen(JKQTPEnhancedPainter& painter) const { QPen p; p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*lineWidth))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); return p; } QPen JKQTPXYLineGraph::getSymbolPen(JKQTPEnhancedPainter& painter) const { QPen p; p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*symbolWidth))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); return p; } QBrush JKQTPXYLineGraph::getBrush(JKQTPEnhancedPainter& /*painter*/) const { QBrush b; b.setColor(fillColor); return b; } QBrush JKQTPStepHorizontalGraph::getBrush(JKQTPEnhancedPainter& /*painter*/) const { QBrush b; b.setColor(fillColor); b.setStyle(fillStyle); return b; } QPen JKQTPStepHorizontalGraph::getLinePen(JKQTPEnhancedPainter& painter) const { QPen p; p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*lineWidth))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); return p; } QBrush JKQTPHorizontalRange::getBrush(JKQTPEnhancedPainter& /*painter*/ ) const { QBrush b; b.setColor(fillColor); b.setStyle(fillStyle); return b; } QPen JKQTPHorizontalRange::getLinePen(JKQTPEnhancedPainter& painter) const { QPen p; p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*lineWidth))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); return p; } JKQTPXYParametrizedScatterGraph::JKQTPXYParametrizedScatterGraph(JKQTBasePlotter *parent): JKQTPXYLineGraph(parent), JKQTPColorPaletteTools(parent) { sizeColumn=-1; colorColumn=-1; symbolColumn=-1; linewidthColumn=-1; palette=JKQTPMathImageMATLAB; colorColumnContainsRGB=false; symbol=JKQTPFilledCircle; drawLine=false; gridModeForSymbolSize=false; gridDeltaX=1; gridDeltaY=1; gridSymbolFractionSize=0.9; } JKQTPXYParametrizedScatterGraph::JKQTPXYParametrizedScatterGraph(JKQTPlotter *parent): JKQTPXYLineGraph(parent), JKQTPColorPaletteTools(parent->getPlotter()) { sizeColumn=-1; colorColumn=-1; symbolColumn=-1; linewidthColumn=-1; palette=JKQTPMathImageMATLAB; colorColumnContainsRGB=false; symbol=JKQTPFilledCircle; drawLine=false; gridModeForSymbolSize=false; gridDeltaX=1; gridDeltaY=1; gridSymbolFractionSize=0.9; } void JKQTPXYParametrizedScatterGraph::draw(JKQTPEnhancedPainter &painter) { #ifdef JKQTBP_AUTOTIMER JKQTPAutoOutputTimer jkaaot("JKQTPXYParametrizedScatterGraph::draw"); #endif if (parent==nullptr) return; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return; cbGetDataMinMax(intColMin, intColMax); drawErrorsBefore(painter); painter.save(); QPen p=painter.pen(); p.setColor(color); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->getLineWidthMultiplier()))); p.setStyle(style); p.setJoinStyle(Qt::RoundJoin); p.setJoinStyle(Qt::RoundJoin); p.setCapStyle(Qt::RoundCap); QPen penSelection=p; penSelection.setStyle(Qt::SolidLine); QColor selcol=penSelection.color(); selcol.setAlphaF(0.5); penSelection.setColor(selcol); if (selectionLineColor!=Qt::transparent) { penSelection.setColor(selectionLineColor); } penSelection.setWidthF(penSelection.widthF()*3.0); int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); int imin=0; // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imax(colorval, 2, 1, img, getPalette(), double(0.0), double(1.0)); color1=img.pixel(0,0); color2=img.pixel(1,0); } } if (symbolColumn>=0) { symbol1=JKQTPFilledCircle; symbol2=JKQTPFilledRect; } double symbolWidth=parent->pt2px(painter, this->symbolWidth*0.7*parent->getLineWidthMultiplier()); if (symbolWidth>0.2*symbolSize) symbolWidth=0.3*symbolSize; double lineWidth=parent->pt2px(painter, this->lineWidth*0.7*parent->getLineWidthMultiplier()); if (lineWidth>0.1*maxSize) lineWidth=0.1*maxSize; painter.save(); QPen p=painter.pen(); p.setColor(color1); p.setStyle(style); p.setWidthF(lineWidth); painter.setPen(p); double x1=rect.left()+symbolSize1/2.0; double y1=rect.top()+symbolSize1/2.0; double x2=rect.right()-symbolSize2/2.0; double y2=rect.bottom()-symbolSize2/2.0; JKQTPPlotSymbol(painter, x1, y1, symbol1, symbolSize1, symbolWidth, color1, color1.lighter()); JKQTPPlotSymbol(painter, x2, y2, symbol2, symbolSize2, symbolWidth, color2, color2.lighter()); if (drawLine) painter.drawLine(x1,y1, x2,y2); painter.restore(); } QColor JKQTPXYParametrizedScatterGraph::getKeyLabelColor() { return getLocalColor(-1); } void JKQTPXYParametrizedScatterGraph::setParent(JKQTBasePlotter *parent) { JKQTPXYLineGraph::setParent(parent); cbSetParent(parent); } void JKQTPXYParametrizedScatterGraph::getOutsideSize(JKQTPEnhancedPainter &painter, int &leftSpace, int &rightSpace, int &topSpace, int &bottomSpace) { JKQTPXYLineGraph::getOutsideSize(painter, leftSpace, rightSpace, topSpace, bottomSpace); if (showColorBar&& colorColumn>=0 && !colorColumnContainsRGB) cbGetOutsideSize(painter, leftSpace, rightSpace, topSpace, bottomSpace); } void JKQTPXYParametrizedScatterGraph::drawOutside(JKQTPEnhancedPainter &painter, QRect leftSpace, QRect rightSpace, QRect topSpace, QRect bottomSpace) { JKQTPXYLineGraph::drawOutside(painter, leftSpace, rightSpace, topSpace, bottomSpace); if (showColorBar&& colorColumn>=0 && !colorColumnContainsRGB) cbDrawOutside(painter, leftSpace, rightSpace, topSpace, bottomSpace); } void JKQTPXYParametrizedScatterGraph::cbGetDataMinMax(double &dmin, double &dmax) { if (autoImageRange) { dmin=dmax=0; if (parent==nullptr) return; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return; if (colorColumn<0) return; int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); int imin=0; // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxget(colorColumn,i); if (first) { dmin=dmax=xv; first=false; } else { dmin=qMin(xv, dmin); dmax=qMax(xv, dmax); } } } else { dmin=imageMin; dmax=imageMax; } } bool JKQTPXYParametrizedScatterGraph::usesColumn(int c) const { return (c==colorColumn) || (c==sizeColumn) || (c==symbolColumn) || (c==linewidthColumn) || JKQTPXYLineGraph::usesColumn(c); } double JKQTPXYParametrizedScatterGraph::getInternalDataMin() const { return 0; } double JKQTPXYParametrizedScatterGraph::getInternalDataMax() const { return 0; } double JKQTPXYParametrizedScatterGraph::getLocalSymbolSize(int i) { if (parent==nullptr) return symbolSize; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return symbolSize; if (sizeColumn<0) return symbolSize; if (i>=(int64_t)datastore->getColumn(sizeColumn).getRows()) return symbolSize; return datastore->get(sizeColumn,i); } double JKQTPXYParametrizedScatterGraph::getLocalLineWidth(int i) { if (parent==nullptr) return lineWidth; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return lineWidth; if (linewidthColumn<0) return lineWidth; if (i>=(int64_t)datastore->getColumn(linewidthColumn).getRows()) return lineWidth; return datastore->get(linewidthColumn,i); } QColor JKQTPXYParametrizedScatterGraph::getLocalColor(int i) { if (parent==nullptr) return color; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return color; if (colorColumn<0) return color; if (colorColumnContainsRGB) { if (i<0 || i>=(int64_t)datastore->getColumn(colorColumn).getRows()) return color; //QRgb rgb= return QRgb(round(datastore->get(colorColumn,i))); } else { QImage img; double colorval=0; if (i>=0 && i<(int64_t)datastore->getColumn(colorColumn).getRows()) colorval=datastore->get(colorColumn,i); double colMin=0; double colMax=0; if (intColMin==intColMax) { colMin=0; colMax=datastore->getColumn(colorColumn).getRows()-1; } else { colMin=intColMin; colMax=intColMax; } JKQTPImagePlot_array2image(&colorval, 1, 1, img, palette, colMin, colMax); return img.pixel(0,0); } } JKQTPGraphSymbols JKQTPXYParametrizedScatterGraph::getLocalSymbolType(int i) { if (parent==nullptr) return symbol; JKQTPDatastore* datastore=parent->getDatastore(); if (datastore==nullptr) return symbol; if (symbolColumn<0) return symbol; if (i>=static_cast(datastore->getColumn(symbolColumn).getRows())) return symbol; int id=static_cast(floor(datastore->get(symbolColumn,i))); if (id<0) return symbol; return JKQTPGraphSymbols(id%(JKQTPMaxSymbolID+1)); } JKQTPXYParametrizedErrorScatterGraph::JKQTPXYParametrizedErrorScatterGraph(JKQTBasePlotter *parent): JKQTPXYParametrizedScatterGraph(parent), JKQTPXYGraphErrors() { setErrorColorFromGraphColor(color); } JKQTPXYParametrizedErrorScatterGraph::JKQTPXYParametrizedErrorScatterGraph(JKQTPlotter *parent): JKQTPXYParametrizedScatterGraph(parent), JKQTPXYGraphErrors() { setErrorColorFromGraphColor(color); } bool JKQTPXYParametrizedErrorScatterGraph::getXMinMax(double &minx, double &maxx, double &smallestGreaterZero) { if (xErrorColumn<0 || xErrorStyle==JKQTPNoError) { return JKQTPXYLineGraph::getXMinMax(minx, maxx, smallestGreaterZero); } else { bool start=true; minx=0; maxx=0; smallestGreaterZero=0; if (parent==nullptr) return false; JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxget(static_cast(xColumn),static_cast(i))+getXErrorU(i, datastore); double xvv=datastore->get(static_cast(xColumn),static_cast(i))-getXErrorL(i, datastore); if (JKQTPIsOKFloat(xv) && JKQTPIsOKFloat(xvv) ) { if (start || xv>maxx) maxx=xv; if (start || xvmaxx) maxx=xvv; if (start || xvvgetDatastore(); int imin=0; int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); // interpret data ranges if (datarange_start>-1) { imin=qMin(datarange_start, static_cast(imax)); } if (datarange_end>-1) { imax=qMin(datarange_end, static_cast(imax)); } if (imaxget(static_cast(yColumn),static_cast(i))+getYErrorU(i, datastore); double yvv=datastore->get(static_cast(yColumn),static_cast(i))-getYErrorL(i, datastore); if (JKQTPIsOKFloat(yv) && JKQTPIsOKFloat(yvv) ) { if (start || yv>maxy) maxy=yv; if (start || yvmaxy) maxy=yvv; if (start || yvv