187 double minColumnValue,
188 double maxColumnValue,
189 double columnValueDistance,
199 ai.bCenterThePoints = mCenterThePoints;
200 calculateAbscissaInfos( *params(), *data,
201 datasetStart, datasetEnd,
204 mCenterThePoints = ai.bCenterThePoints;
206 bool bOrdinateDecreasing = ordinatePara
209 bool bOrdinateIsLogarithmic
211 ? (KDChartAxisParams::AxisCalcLogarithmic == ordinatePara->
axisCalcMode())
215 const double ordinatePixelsPerUnit
220 : logHeight / columnValueDistance;;
224 const bool showThreeDLines = !mIsArea && params()->
threeDLines();
226 enum { Normal, Stacked, Percent } mode = Normal;
227 if ( ( ( mChartType == KDChartParams::Line )
228 && ( params()->lineChartSubType() == KDChartParams::LineNormal ) )
229 || ( ( mChartType == KDChartParams::Area )
230 && ( params()->areaChartSubType() == KDChartParams::AreaNormal ) ) )
232 else if ( ( ( mChartType == KDChartParams::Line )
233 && ( params()->lineChartSubType() == KDChartParams::LineStacked ) )
234 || ( ( mChartType == KDChartParams::Area )
235 && ( params()->areaChartSubType() == KDChartParams::AreaStacked ) ) )
237 else if ( ( ( mChartType == KDChartParams::Line )
238 && ( params()->lineChartSubType() == KDChartParams::LinePercent ) )
239 || ( ( mChartType == KDChartParams::Area )
240 && ( params()->areaChartSubType() == KDChartParams::AreaPercent ) ) )
243 tqDebug(
"Internal error in KDChartLinesPainter::paintDataInternal(): Unknown subtype" );
246 TQMap < int, double > currentValueSums;
247 if ( mode == Stacked || mode == Percent ) {
250 for (
int value = 0; value < ai.numValues; ++value )
251 currentValueSums[ value ] = 0.0;
253 TQMap < int, double > totalValueSums;
257 if ( mode == Percent ) {
258 if ( minColumnValue == 0.0 )
259 zeroXAxisI = logHeight + axisYOffset;
260 else if( maxColumnValue == 0.0 )
261 zeroXAxisI = _dataRect.y() + axisYOffset;
263 zeroXAxisI = logHeight / 2.0 + _dataRect.y();
270 int xShift = mCenterThePoints ?
static_cast < int > ( ai.pointDist * 0.5 ) : 0;
275 int arrayNumDatasets = 0;
276 int arrayNumValues = ai.bAbscissaHasTrueAxisDtValues
280 for( dataset = datasetEnd;
281 ( dataset >=
static_cast < int > ( datasetStart ) && dataset >= 0 );
284 TQValueVector<MyPoint> allPoints(
285 arrayNumDatasets * arrayNumValues );
288 int curPropSetId = KDChartPropertySet::UndefinedID;
290 for( dataset = datasetEnd; ( dataset >= (int)datasetStart && dataset >= 0 ); --dataset ) {
297 const TQPen default2DPen( params()->lineColor().isValid()
298 ? params()->lineColor()
303 if( ai.bAbscissaHasTrueAxisDtValues )
304 ai.numValues = data->
cols();
309 for(
int value = 0; value < ai.numValues; ++value ) {
312 double valueTotal = 0.0;
313 if( mode == Percent ) {
316 for ( uint dataset2 = datasetStart;
317 dataset2 <= datasetEnd;
319 if( data->
cellCoord( dataset2, value, vValY, 1 ) &&
320 TQVariant::Double == vValY.type() )
321 valueTotal += vValY.toDouble();
325 if( data->
cellContent( dataset, value, vValY, vValX, cellPropID ) &&
326 TQVariant::Double == vValY.type() &&
327 ( !ai.bCellsHaveSeveralCoordinates || TQVariant::Invalid != vValX.type() ) ){
332 double cellValue = vValY.toDouble();
333 double drawValue = 0.0;
335 if ( mode == Stacked )
336 drawValue = ( cellValue + currentValueSums[ value ] ) * ordinatePixelsPerUnit;
337 else if ( mode == Percent )
338 drawValue = ( ( cellValue + currentValueSums[ value ] ) / valueTotal ) * 100.0 * ordinatePixelsPerUnit;
341 if( bOrdinateIsLogarithmic ){
342 if( 0.0 < cellValue )
343 drawValue = log10( cellValue ) * ordinatePixelsPerUnit;
345 drawValue = -10250.0;
349 drawValue = cellValue * ordinatePixelsPerUnit * (bOrdinateDecreasing ? -1.0 : 1.0);
359 bool skipMe = !calculateAbscissaAxisValue( vValX, ai, value,
369 double pY = TQMIN( zeroXAxisI - drawValue,
370 (logHeight + axisYOffset) * 3 );
371 pY = TQMAX( pY, -(logHeight + axisYOffset) * 3 );
373 int myPointX =
static_cast < int > ( xValue ) + xShift;
374 int myPointY =
static_cast < int > ( pY );
376 if( cellPropID == curPropSetId &&
377 myPointX == prevPointX &&
378 myPointY == prevPointY ){
379 allPoints[
static_cast < int > ( datasetEnd-dataset )
380 * arrayNumValues + value ].setSkipThis(
true );
385 allPoints[
static_cast < int > ( datasetEnd-dataset )
386 * arrayNumValues + value ].set( myPointX, myPointY, cellValue );
394 if( cellPropID != curPropSetId ){
398 if( cellPropID != KDChartPropertySet::UndefinedID &&
399 params()->calculateProperties( cellPropID,
401 curPropSetId = cellPropID;
405 curPropSetId = KDChartPropertySet::UndefinedID;
410 if( mChartType == KDChartParams::Line ){
411 if( curPropSetId != KDChartPropertySet::UndefinedID ){
412 drawExtraLinesAndMarkers(
425 prevPointX = myPointX;
426 prevPointY = myPointY;
430 if ( mode == Stacked || mode == Percent ) {
434 currentValueSums[ value ] += cellValue;
442 TQPointArray previousPoints;
449 const bool defaultDrawMarkers = mDrawMarkers;
451 for ( dataset = datasetEnd; ( dataset >= (int)datasetStart && dataset >= 0 ); --dataset ) {
457 const TQPen default2DPen( params()->lineColor().isValid()
458 ? params()->lineColor()
462 bool currentDrawMarkers = defaultDrawMarkers;
466 TQPtrVector< TQPointArray > points( 2 );
467 points.setAutoDelete(
true );
471 TQPtrVector< TQPointArray > oripoints( 2 );
472 oripoints.setAutoDelete(
true );
475 for( i = 0; i < 2; ++i ) {
476 points.insert( i,
new TQPointArray( ai.numValues + 2 ) );
477 oripoints.insert( i,
new TQPointArray( ai.numValues + 2 ) );
480 if( ai.bAbscissaHasTrueAxisDtValues )
481 ai.numValues = data->
cols();
485 for (
int value = 0; value < ai.numValues; ++value ) {
489 currentDrawMarkers = defaultDrawMarkers;
491 if( data->
cellProp( dataset, value, cellPropID ) &&
492 cellPropID != curPropSetId ){
493 if( cellPropID != KDChartPropertySet::UndefinedID &&
494 params()->calculateProperties( cellPropID,
496 curPropSetId = cellPropID;
498 curPropSetId = KDChartPropertySet::UndefinedID;
500 if( curPropSetId != KDChartPropertySet::UndefinedID ){
509 int iVec =
static_cast < int > ( datasetEnd-dataset ) * arrayNumValues + value;
510 if( allPoints[ iVec ].bValid && !allPoints[ iVec ].bSkipThis ){
511 const MyPoint& mp = allPoints[iVec];
518 if( showThreeDLines ) {
519 points[0]->setPoint( point,
project( mp.p.x(), mp.p.y(),
520 (datasetStart+dataset)*params()->threeDLineDepth() ) );
521 points[1]->setPoint( point,
project( mp.p.x(), mp.p.y(),
522 (datasetStart+dataset + 1)*params()->threeDLineDepth() ) );
523 oripoints[0]->setPoint( point, mp.p.x(), mp.p.y() );
524 oripoints[1]->setPoint( point, mp.p.x() - (datasetStart+dataset + 1)*params()->
threeDLineDepth(),
529 points[0]->setPoint( point, mp.p );
533 int y = TQMAX(TQMIN(mp.p.y(),
534 static_cast < int > (logHeight +axisYOffset)),
536 bool markerIsOutside = y != mp.p.y();
538 if ( currentDrawMarkers ){
539 uint theAlignment = TQt::AlignCenter;
540 bool hasOwnSize =
false;
543 TQColor theColor(params()->dataColor( dataset ));
544 int theStyle = markerStyle;
545 if( curPropSetId != KDChartPropertySet::UndefinedID ){
550 curPropSet.hasOwnMarkerAlign( iDummy, theAlignment );
551 curPropSet.hasOwnMarkerColor( iDummy, theColor );
552 curPropSet.hasOwnMarkerStyle( iDummy, theStyle );
553 TQSize size(theWidth, theHeight);
554 hasOwnSize = curPropSet.hasOwnMarkerSize(iDummy, size);
556 theWidth = size.width();
557 theHeight = size.height();
563 _areaWidthP1000, _areaHeightP1000,
567 ? KDChartParams::LineMarker1Pixel
571 dataset, value, chart, regions,
572 hasOwnSize ? &theWidth : 0,
573 hasOwnSize ? &theHeight : 0,
579 TQRect rect( TQPoint( x-1, y-1 ), TQPoint( x+1, y+1 ) );
580 rect.moveBy( _dataRect.x(), _dataRect.y() );
582 new KDChartDataRegion(dataset, value, chart, rect) );
588 bool bDrawLines = (0 != params()->
lineWidth());
595 painter->setPen( TQPen( TQt::NoPen ) );
596 const TQBrush datasetBrush( params()->dataColor( dataset ), TQt::SolidPattern );
597 painter->setBrush( datasetBrush );
598 TQBrush currentBrush( datasetBrush );
600 if ( mode == Normal || dataset == (
int)datasetEnd ) {
605 TQPoint lastPoint = points[0]->point( point - 1 );
612 if ( params()->areaLocation() == KDChartParams::AreaBelow ||
614 yCoord =
static_cast<int>(zeroXAxisI);
616 yCoord =
static_cast<int>(axisYOffset);
632 curPropSetId = KDChartPropertySet::UndefinedID;
633 for(
int value = 0; value < point-1; ++value ) {
636 if( data->
cellProp( dataset, value, cellPropID ) &&
637 cellPropID != curPropSetId ){
639 if( cellPropID != KDChartPropertySet::UndefinedID &&
642 curPropSetId = cellPropID;
644 curPropSetId = KDChartPropertySet::UndefinedID;
647 TQBrush theAreaBrush = datasetBrush;
649 if( curPropSetId != KDChartPropertySet::UndefinedID ){
656 painter->setBrush( theAreaBrush );
659 TQPointArray segment( 4 );
660 segment.setPoint( 0, points[0]->point( value ) );
661 segment.setPoint( 1, points[0]->point( value+1 ) );
662 segment.setPoint( 2, points[0]->point( value+1 ).x(), yCoord );
663 segment.setPoint( 3, points[0]->point( value ).x(), yCoord );
664 painter->drawPolygon( segment );
680 TQPointArray thisSection = points[0]->copy();
682 thisSection.resize( point + previousPoints.size() );
686 for (
unsigned int i = 0; i < previousPoints.size(); ++i ) {
687 thisSection.setPoint( point + i,
688 previousPoints.point( previousPoints.size() - i - 1 ) );
692 painter->drawPolygon( thisSection );
695 painter->setBrush( TQt::NoBrush );
696 painter->setPen( TQPen( params()->outlineDataColor(),
697 params()->outlineDataLineWidth() ) );
700 if( showThreeDLines ) {
704 painter->setBrush( params()->dataColor( dataset ) );
705 painter->setPen( TQPen( params()->outlineDataColor(),
706 params()->outlineDataLineWidth() ) );
711 painter->setBrush( TQt::NoBrush );
712 painter->setPen( default2DPen );
720 ( (mode != Percent) || !mIsArea || (dataset != (
int)datasetEnd) ) ){
721 if( showThreeDLines ) {
724 for (
int value = 0; value < point-1; ++value ) {
730 TQPointArray rotatedSegment( 4 );
731 rotatedSegment.setPoint( 0, points[0]->point( value ));
732 rotatedSegment.setPoint( 1, points[0]->point( value+1 ) );
733 rotatedSegment.setPoint( 2, points[1]->point( value+1 ) );
734 rotatedSegment.setPoint( 3, points[1]->point( value ) );
737 TQPointArray trueSegment( 4 );
738 trueSegment.setPoint( 0, oripoints[0]->point( value ));
739 trueSegment.setPoint( 1, oripoints[0]->point( value+1 ) );
740 trueSegment.setPoint( 2, oripoints[1]->point( value+1 ) );
741 trueSegment.setPoint( 3, oripoints[1]->point( value ) );
747 int dx30 = rotatedSegment.point(3).x() - rotatedSegment.point(0).x();
748 int dy30 = rotatedSegment.point(3).y() - rotatedSegment.point(0).y();
750 int dx12 = rotatedSegment.point(2).x() - rotatedSegment.point(1).x();
751 int dy12 = rotatedSegment.point(2).y() - rotatedSegment.point(1).y();
754 TQPointArray segment( 4 );
755 segment.setPoint( 0, trueSegment.point(0) );
756 segment.setPoint( 1, trueSegment.point(1) );
757 segment.setPoint( 2, trueSegment.point(1).x() + dx12, trueSegment.point(1).y() + dy12 );
758 segment.setPoint( 3, trueSegment.point(0).x() + dx30, trueSegment.point(0).y() + dy30);
762 painter->drawPolygon( segment );
773 bool b4PMarkers = KDChartParams::LineMarker4Pixels == markerStyle;
775 KDChartParams::LineMarker1Pixel == markerStyle || b4PMarkers;
776 curPropSetId = KDChartPropertySet::UndefinedID;
777 painter->setPen( default2DPen );
778 for (
int value = 0; value < point-1; ++value ) {
779 p1 = points[0]->point( value );
780 p2 = points[0]->point( value+1 );
784 currentDrawMarkers = defaultDrawMarkers;
786 if( data->
cellProp( dataset, value, cellPropID ) &&
787 cellPropID != curPropSetId ){
788 if( cellPropID != KDChartPropertySet::UndefinedID &&
789 params()->calculateProperties( cellPropID,
791 curPropSetId = cellPropID;
793 curPropSetId = KDChartPropertySet::UndefinedID;
796 int theLineWidth = default2DPen.width();
797 TQColor theLineColor = default2DPen.color();
798 TQt::PenStyle theLineStyle = default2DPen.style();
799 if( curPropSetId != KDChartPropertySet::UndefinedID ){
809 painter->setPen( TQPen( theLineColor,
814 if( !currentDrawMarkers ){
816 painter->drawLine( p1, p2 );
818 int dx = p2.x() - p1.x();
819 int dy = p2.y() - p1.y();
820 if( !bTinyMarkers || (abs(dx) > 4) || (abs(dy) > 4) ){
822 double m = !dx ? 100.0
824 : ((double)dy / (
double)dx);
831 }
else if( 0.67 > am ){
834 }
else if( 1.33 > am ){
837 }
else if( 4.0 > am ){
858 p1.rx() += dxx; p1.ry() += dyy;
859 p2.rx() -= dxx; p2.ry() -= dyy;
862 painter->drawLine( p1, p2 );
872 points[0]->resize( point );
873 previousPoints = points[0]->copy();
879 if( mChartType == KDChartParams::Line ){
880 for( dataset = datasetEnd; ( dataset >= (int)datasetStart && dataset >= 0 ); --dataset ) {
884 const TQPen default2DPen( params()->lineColor().isValid()
885 ? params()->lineColor()
890 if( ai.bAbscissaHasTrueAxisDtValues )
891 ai.numValues = data->
cols();
893 for (
int value = 0; value < ai.numValues; ++value ) {
894 int iVec =
static_cast < int > ( datasetEnd-dataset ) * arrayNumValues + value;
895 if( allPoints[ iVec ].bValid ){
896 const MyPoint& mp = allPoints[iVec];
904 if( data->
cellProp( dataset, value, cellPropID ) &&
905 cellPropID != curPropSetId ){
906 if( cellPropID != KDChartPropertySet::UndefinedID &&
909 curPropSetId = cellPropID;
911 curPropSetId = KDChartPropertySet::UndefinedID;
913 if( curPropSetId != KDChartPropertySet::UndefinedID ){
914 drawExtraLinesAndMarkers(