chart2/source/controller/dialogs/dlg_InsertTrendline.src | 2 chart2/source/controller/dialogs/res_Trendline.cxx | 56 +++++ chart2/source/controller/dialogs/res_Trendline.hxx | 6 chart2/source/controller/dialogs/res_Trendline_IDs.hrc | 5 chart2/source/controller/dialogs/res_Trendline_tmpl.hrc | 45 +++- chart2/source/controller/itemsetwrapper/RegressionCurveItemConverter.cxx | 72 +++++++ chart2/source/controller/itemsetwrapper/StatisticsItemConverter.cxx | 57 +++++ chart2/source/inc/PolynomialRegressionCurveCalculator.hxx | 30 +-- chart2/source/inc/RegressionCurveCalculator.hxx | 63 +++--- chart2/source/tools/PolynomialRegressionCurveCalculator.cxx | 96 ++++++---- chart2/source/tools/RegressionCurveCalculator.cxx | 28 +- chart2/source/tools/RegressionCurveModel.cxx | 18 + chart2/source/view/charttypes/VSeriesPlotter.cxx | 13 - chart2/source/view/main/ChartItemPool.cxx | 14 - offapi/com/sun/star/chart2/XRegressionCurveCalculator.idl | 3 oox/source/drawingml/chart/seriesconverter.cxx | 7 oox/source/export/chartexport.cxx | 14 + oox/source/token/properties.txt | 2 sc/source/filter/excel/xechart.cxx | 5 sc/source/filter/excel/xichart.cxx | 14 + sc/source/filter/inc/xlchart.hxx | 2 21 files changed, 435 insertions(+), 117 deletions(-)
New commits: commit c552b2c507a3df6adc968b81b375a13fcb89f50d Author: Tomaž Vajngerl <qui...@gmail.com> Date: Fri Jun 28 22:58:15 2013 +0200 Force intercept import/export for binary MS office format. Change-Id: I301762b94b4471e8bb144b63892afdf7f68fed77 diff --git a/sc/source/filter/excel/xechart.cxx b/sc/source/filter/excel/xechart.cxx index b0e13ac..b403bab 100644 --- a/sc/source/filter/excel/xechart.cxx +++ b/sc/source/filter/excel/xechart.cxx @@ -1731,6 +1731,11 @@ bool XclExpChSerTrendLine::Convert( Reference< XRegressionCurve > xRegCurve, sal aCurveProp.GetProperty(maData.mfForecastFor, EXC_CHPROP_EXTRAPOLATE_FORWARD); aCurveProp.GetProperty(maData.mfForecastBack, EXC_CHPROP_EXTRAPOLATE_BACKWARD); + sal_Bool bIsForceIntercept = false; + aCurveProp.GetProperty(bIsForceIntercept, EXC_CHPROP_FORCE_INTERCEPT); + if (bIsForceIntercept) + aCurveProp.GetProperty(maData.mfIntercept, EXC_CHPROP_INTERCEPT_VALUE); + // line formatting XclChDataPointPos aPointPos( nSeriesIdx ); diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx index 6ae9237..d2cca4a 100644 --- a/sc/source/filter/excel/xichart.cxx +++ b/sc/source/filter/excel/xichart.cxx @@ -195,6 +195,13 @@ void lclConvertTimeInterval( Any& rInterval, sal_uInt16 nValue, bool bAuto, sal_ rInterval <<= cssc::TimeInterval( nValue, lclGetApiTimeUnit( nTimeUnit ) ); } +bool lcl_IsForceIntercept(double intercept) +{ + sal_math_Double* pIntercept = reinterpret_cast<sal_math_Double*>(&intercept); + return (pIntercept->w32_parts.msw != 0xFFFFFFFF || + pIntercept->w32_parts.lsw != 0xFFFFFFFF); +} + } // namespace // Common ===================================================================== @@ -1650,6 +1657,13 @@ Reference< XRegressionCurve > XclImpChSerTrendLine::CreateRegressionCurve() cons aPropSet.SetProperty(EXC_CHPROP_EXTRAPOLATE_FORWARD, maData.mfForecastFor); aPropSet.SetProperty(EXC_CHPROP_EXTRAPOLATE_BACKWARD, maData.mfForecastBack); + sal_Bool bForceIntercept = lcl_IsForceIntercept(maData.mfIntercept); + aPropSet.SetProperty(EXC_CHPROP_FORCE_INTERCEPT, bForceIntercept); + if (bForceIntercept) + { + aPropSet.SetProperty(EXC_CHPROP_INTERCEPT_VALUE, maData.mfIntercept); + } + // #i83100# show equation and correlation coefficient ScfPropertySet aLabelProp( xRegCurve->getEquationProperties() ); aLabelProp.SetBoolProperty( EXC_CHPROP_SHOWEQUATION, maData.mnShowEquation != 0 ); diff --git a/sc/source/filter/inc/xlchart.hxx b/sc/source/filter/inc/xlchart.hxx index b13d932..4354b5c 100644 --- a/sc/source/filter/inc/xlchart.hxx +++ b/sc/source/filter/inc/xlchart.hxx @@ -87,10 +87,12 @@ class XclRoot; #define EXC_CHPROP_EXTRAPOLATE_BACKWARD "ExtrapolateBackward" #define EXC_CHPROP_FILLBITMAPMODE "FillBitmapMode" #define EXC_CHPROP_FILLSTYLE "FillStyle" +#define EXC_CHPROP_FORCE_INTERCEPT "ForceIntercept" #define EXC_CHPROP_GAPWIDTHSEQ "GapwidthSequence" #define EXC_CHPROP_GEOMETRY3D "Geometry3D" #define EXC_CHPROP_HASMAINTITLE "HasMainTitle" #define EXC_CHPROP_INCLUDEHIDDENCELLS "IncludeHiddenCells" +#define EXC_CHPROP_INTERCEPT_VALUE "InterceptValue" #define EXC_CHPROP_JAPANESE "Japanese" #define EXC_CHPROP_LABEL "Label" #define EXC_CHPROP_LABELPLACEMENT "LabelPlacement" commit bcecad10e2346b919a4cea80d27d9c04c6f50422 Author: Tomaž Vajngerl <qui...@gmail.com> Date: Fri Jun 28 22:56:48 2013 +0200 Force intercept export for OOXML Change-Id: I5ec993a6aba0c0bb3b9f77ef6fb9e00680dfa574 diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index ede6cec..516639b 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -2570,6 +2570,20 @@ void ChartExport::exportTrendlines( Reference< chart2::XDataSeries > xSeries ) XML_val, OString::number(aExtrapolateBackward).getStr(), FSEND ); + sal_Bool aForceIntercept = false; + xProperties->getPropertyValue( "ForceIntercept") >>= aForceIntercept; + + if (aForceIntercept) + { + double aInterceptValue = 0.0; + xProperties->getPropertyValue( "InterceptValue") >>= aInterceptValue; + + pFS->singleElement( FSNS( XML_c, XML_intercept ), + XML_val, OString::number(aInterceptValue).getStr(), + FSEND ); + } + + // Equation properties Reference< XPropertySet > xEquationProperties( xRegCurve->getEquationProperties() ); commit 9ddbe8402b2a24f780eaabf3975c7bdf6fe82d19 Author: Tomaž Vajngerl <qui...@gmail.com> Date: Fri Jun 28 21:10:38 2013 +0200 Force intercept support for ooxml. Change-Id: I065742bbe22f24169a99e33558399fe16c601238 diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx index a02e52a..cc05567 100644 --- a/oox/source/drawingml/chart/seriesconverter.cxx +++ b/oox/source/drawingml/chart/seriesconverter.cxx @@ -436,6 +436,13 @@ void TrendlineConverter::convertFromModel( const Reference< XDataSeries >& rxDat aPropSet.setProperty( PROP_PolynomialDegree, mrModel.mnOrder ); aPropSet.setProperty( PROP_MovingAveragePeriod, mrModel.mnPeriod ); + // Intercept + sal_Bool hasIntercept = mrModel.mfIntercept.has(); + aPropSet.setProperty( PROP_ForceIntercept, hasIntercept); + if (hasIntercept) + aPropSet.setProperty( PROP_InterceptValue, mrModel.mfIntercept.get()); + + // Extrapolation if (mrModel.mfForward.has()) aPropSet.setProperty( PROP_ExtrapolateForward, mrModel.mfForward.get() ); if (mrModel.mfBackward.has()) diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index e292d14..0acfe06 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -185,6 +185,7 @@ FooterHeight FooterIsDynamicHeight FooterIsOn FooterIsShared +ForceIntercept FormulaConvention FrameIsAutomaticHeight Function @@ -238,6 +239,7 @@ ImageURL IncludeHiddenCells InputMessage InputTitle +InterceptValue IsActive IsAdjustHeightEnabled IsCaseSensitive commit f6cbdcfa36456fe653c201b2c8551a47812871ea Author: Tomaž Vajngerl <qui...@gmail.com> Date: Fri Jun 28 19:49:25 2013 +0200 Force intercept for polynomial regression & dialog improvements Change-Id: I2f712d8b95b5fdeb05b93b5247aab9772a00cc70 diff --git a/chart2/source/controller/dialogs/dlg_InsertTrendline.src b/chart2/source/controller/dialogs/dlg_InsertTrendline.src index baf7dd9..2b8b621 100644 --- a/chart2/source/controller/dialogs/dlg_InsertTrendline.src +++ b/chart2/source/controller/dialogs/dlg_InsertTrendline.src @@ -31,7 +31,7 @@ ModalDialog DLG_DATA_TRENDLINE HelpID = HID_INSERT_STATISTICS ; OutputSize = TRUE ; SVLook = TRUE ; - Size = MAP_APPFONT( DLG_DATA_TRENDLINE_RES_WIDTH + DLG_DATA_TRENDLINE_ADD_TO_RES, 172 ); + Size = MAP_APPFONT( DLG_DATA_TRENDLINE_RES_WIDTH + DLG_DATA_TRENDLINE_ADD_TO_RES, 220 ); Moveable = TRUE ; BUTTONS_OK_CANCEL_HELP_STACKED( DLG_DATA_TRENDLINE_RES_WIDTH + DLG_DATA_TRENDLINE_ADD_TO_RES ) RESOURCE_TRENDLINE( DLG_DATA_TRENDLINE_RES_WIDTH, 22 ) diff --git a/chart2/source/controller/dialogs/res_Trendline.cxx b/chart2/source/controller/dialogs/res_Trendline.cxx index 803c060..316282c 100644 --- a/chart2/source/controller/dialogs/res_Trendline.cxx +++ b/chart2/source/controller/dialogs/res_Trendline.cxx @@ -78,11 +78,15 @@ TrendlineResources::TrendlineResources( Window * pParent, const SfxItemSet& rInA m_aFIPolynomial( pParent, SchResId( FI_POLYNOMIAL )), m_aFIMovingAverage( pParent, SchResId( FI_MOVING_AVERAGE )), + m_aFT_Degree( pParent, SchResId( FT_DEGREE )), m_aNF_Degree( pParent, SchResId( NF_DEGREE )), + m_aFT_Period( pParent, SchResId( FT_PERIOD )), m_aNF_Period( pParent, SchResId( NF_PERIOD )), + m_aFT_ExtrapolateForward( pParent, SchResId( FT_EXTRAPOLATE_FORWARD )), m_aNF_ExtrapolateForward( pParent, SchResId( NF_EXTRAPOLATE_FORWARD )), - m_aNF_ExtrapolateBackward( pParent, SchResId( NF_EXTRAPOLATE_BACKWARD )), + m_aFT_ExtrapolateBackward( pParent, SchResId( FT_EXTRAPOLATE_BACKWARD )), + m_aNF_ExtrapolateBackward( pParent, SchResId( NF_EXTRAPOLATE_BACKWARD )), m_aCB_SetIntercept( pParent, SchResId( CB_SET_INTERCEPT )), m_aNF_InterceptValue( pParent, SchResId( NF_INTERCEPT_VALUE )), @@ -121,7 +125,7 @@ TrendlineResources::~TrendlineResources() long TrendlineResources::adjustControlSizes() { // calculate right edge - ::std::vector< long > aControlRightEdges; + std::vector< long > aControlRightEdges; aControlRightEdges.push_back( lcl_getRightEdge( m_aRBNone )); aControlRightEdges.push_back( lcl_getRightEdge( m_aRBLinear )); aControlRightEdges.push_back( lcl_getRightEdge( m_aRBLogarithmic )); @@ -129,9 +133,18 @@ long TrendlineResources::adjustControlSizes() aControlRightEdges.push_back( lcl_getRightEdge( m_aRBPower )); aControlRightEdges.push_back( lcl_getRightEdge( m_aRBPolynomial )); aControlRightEdges.push_back( lcl_getRightEdge( m_aRBMovingAverage )); + + aControlRightEdges.push_back( lcl_getRightEdge( m_aNF_Degree )); + aControlRightEdges.push_back( lcl_getRightEdge( m_aNF_Period )); + aControlRightEdges.push_back( lcl_getRightEdge( m_aNF_ExtrapolateForward )); + aControlRightEdges.push_back( lcl_getRightEdge( m_aNF_ExtrapolateBackward )); + aControlRightEdges.push_back( lcl_getRightEdge( m_aNF_InterceptValue )); + aControlRightEdges.push_back( lcl_getRightEdge( m_aCB_SetIntercept )); + aControlRightEdges.push_back( lcl_getRightEdge( m_aCBShowEquation )); aControlRightEdges.push_back( lcl_getRightEdge( m_aCBShowCorrelationCoeff )); + lcl_AdjustControlSize( m_aRBNone ); lcl_AdjustControlSize( m_aRBLinear ); lcl_AdjustControlSize( m_aRBLogarithmic ); @@ -139,6 +152,14 @@ long TrendlineResources::adjustControlSizes() lcl_AdjustControlSize( m_aRBPower ); lcl_AdjustControlSize( m_aRBPolynomial ); lcl_AdjustControlSize( m_aRBMovingAverage ); + + lcl_AdjustControlSize( m_aNF_Degree ); + lcl_AdjustControlSize( m_aNF_Period ); + lcl_AdjustControlSize( m_aNF_ExtrapolateForward ); + lcl_AdjustControlSize( m_aNF_ExtrapolateBackward ); + lcl_AdjustControlSize( m_aNF_InterceptValue ); + lcl_AdjustControlSize( m_aCB_SetIntercept ); + lcl_AdjustControlSize( m_aCBShowEquation ); lcl_AdjustControlSize( m_aCBShowCorrelationCoeff ); @@ -240,6 +261,29 @@ void TrendlineResources::Reset( const SfxItemSet& rInAttrs ) m_aNF_ExtrapolateBackward.SetValue( 0 ); } + if( rInAttrs.GetItemState( SCHATTR_REGRESSION_INTERCEPT_VALUE, sal_True, &pPoolItem ) == SFX_ITEM_SET ) + { + double nValue = static_cast< const SvxDoubleItem * >( pPoolItem )->GetValue() * 10000; + m_aNF_InterceptValue.SetValue( (sal_Int64) nValue ); + } + else + { + m_aNF_InterceptValue.SetValue( 0 ); + } + + aState = rInAttrs.GetItemState( SCHATTR_REGRESSION_SET_INTERCEPT, sal_True, &pPoolItem ); + if( aState == SFX_ITEM_DONTCARE ) + { + m_aCB_SetIntercept.EnableTriState( sal_True ); + m_aCB_SetIntercept.SetState( STATE_DONTKNOW ); + } + else + { + m_aCB_SetIntercept.EnableTriState( sal_False ); + if( aState == SFX_ITEM_SET ) + m_aCB_SetIntercept.Check( static_cast< const SfxBoolItem * >( pPoolItem )->GetValue()); + } + aState = rInAttrs.GetItemState( SCHATTR_REGRESSION_SHOW_EQUATION, sal_True, &pPoolItem ); if( aState == SFX_ITEM_DONTCARE ) { @@ -300,8 +344,10 @@ sal_Bool TrendlineResources::FillItemSet(SfxItemSet& rOutAttrs) const { if( m_bTrendLineUnique ) rOutAttrs.Put( SvxChartRegressItem( m_eTrendLineType, SCHATTR_REGRESSION_TYPE )); + if( m_aCBShowEquation.GetState() != STATE_DONTKNOW ) rOutAttrs.Put( SfxBoolItem( SCHATTR_REGRESSION_SHOW_EQUATION, m_aCBShowEquation.IsChecked() )); + if( m_aCBShowCorrelationCoeff.GetState() != STATE_DONTKNOW ) rOutAttrs.Put( SfxBoolItem( SCHATTR_REGRESSION_SHOW_COEFF, m_aCBShowCorrelationCoeff.IsChecked() )); @@ -317,6 +363,12 @@ sal_Bool TrendlineResources::FillItemSet(SfxItemSet& rOutAttrs) const double aExtrapolateBackwardValue = m_aNF_ExtrapolateBackward.GetValue() / 100.0; rOutAttrs.Put(SvxDoubleItem( aExtrapolateBackwardValue, SCHATTR_REGRESSION_EXTRAPOLATE_BACKWARD ) ); + if( m_aCB_SetIntercept.GetState() != STATE_DONTKNOW ) + rOutAttrs.Put( SfxBoolItem( SCHATTR_REGRESSION_SET_INTERCEPT, m_aCB_SetIntercept.IsChecked() )); + + double aInterceptValue = m_aNF_InterceptValue.GetValue() / 10000.0; + rOutAttrs.Put(SvxDoubleItem( aInterceptValue, SCHATTR_REGRESSION_INTERCEPT_VALUE ) ); + return sal_True; } diff --git a/chart2/source/controller/dialogs/res_Trendline.hxx b/chart2/source/controller/dialogs/res_Trendline.hxx index bbabc7b..1ff8ca0 100644 --- a/chart2/source/controller/dialogs/res_Trendline.hxx +++ b/chart2/source/controller/dialogs/res_Trendline.hxx @@ -60,11 +60,17 @@ private: FixedImage m_aFIPolynomial; FixedImage m_aFIMovingAverage; + FixedText m_aFT_Degree; NumericField m_aNF_Degree; + FixedText m_aFT_Period; NumericField m_aNF_Period; + FixedText m_aFT_ExtrapolateForward; NumericField m_aNF_ExtrapolateForward; + + FixedText m_aFT_ExtrapolateBackward; NumericField m_aNF_ExtrapolateBackward; + CheckBox m_aCB_SetIntercept; NumericField m_aNF_InterceptValue; diff --git a/chart2/source/controller/dialogs/res_Trendline_IDs.hrc b/chart2/source/controller/dialogs/res_Trendline_IDs.hrc index aa54569..cb9e8d8 100644 --- a/chart2/source/controller/dialogs/res_Trendline_IDs.hrc +++ b/chart2/source/controller/dialogs/res_Trendline_IDs.hrc @@ -34,6 +34,11 @@ #define NF_EXTRAPOLATE_BACKWARD 4 #define NF_INTERCEPT_VALUE 5 +#define FT_DEGREE 1 +#define FT_PERIOD 2 +#define FT_EXTRAPOLATE_FORWARD 3 +#define FT_EXTRAPOLATE_BACKWARD 4 + #define RB_NONE 1 #define RB_LINEAR 2 #define RB_LOGARITHMIC 3 diff --git a/chart2/source/controller/dialogs/res_Trendline_tmpl.hrc b/chart2/source/controller/dialogs/res_Trendline_tmpl.hrc index 950726d..ff6498c 100644 --- a/chart2/source/controller/dialogs/res_Trendline_tmpl.hrc +++ b/chart2/source/controller/dialogs/res_Trendline_tmpl.hrc @@ -111,10 +111,16 @@ FixedImage FI_MOVING_AVERAGE \ Pos = MAP_APPFONT( 110, 62 + yoffset ); \ Size = MAP_APPFONT( 18, 18 ); \ }; \ +FixedText FT_DEGREE \ +{ \ + Pos = MAP_APPFONT ( 110, 44 + yoffset ) ; \ + Size = MAP_APPFONT ( 20 , 12 ) ; \ + Text [ en-US ] = "Degree"; \ +}; \ NumericField NF_DEGREE \ { \ Border = TRUE ; \ - Pos = MAP_APPFONT ( 110, 44 + yoffset ) ; \ + Pos = MAP_APPFONT ( 132, 42 + yoffset ) ; \ Size = MAP_APPFONT ( 28 , 12 ) ; \ TabStop = TRUE ; \ Repeat = TRUE ; \ @@ -124,10 +130,16 @@ NumericField NF_DEGREE \ Minimum = 2 ; \ Maximum = 100 ; \ }; \ +FixedText FT_PERIOD \ +{ \ + Pos = MAP_APPFONT ( 110, 88 + yoffset ) ; \ + Size = MAP_APPFONT ( 20 , 12 ) ; \ + Text [ en-US ] = "Period"; \ +}; \ NumericField NF_PERIOD \ { \ Border = TRUE ; \ - Pos = MAP_APPFONT ( 110, 88 + yoffset ) ; \ + Pos = MAP_APPFONT ( 132, 86 + yoffset ) ; \ Size = MAP_APPFONT ( 28 , 12 ) ; \ TabStop = TRUE ; \ Repeat = TRUE ; \ @@ -143,11 +155,17 @@ FixedLine FL_EQUATION \ Size = MAP_APPFONT( availablewidth - 12, 8 ); \ Text[ en-US ] = "Options"; \ }; \ +FixedText FT_EXTRAPOLATE_FORWARD \ +{ \ + Pos = MAP_APPFONT ( 10, 120 + yoffset ) ; \ + Size = MAP_APPFONT ( 70 , 12 ) ; \ + Text [ en-US ] = "Extrapolate ~forward"; \ +}; \ NumericField NF_EXTRAPOLATE_FORWARD \ { \ Border = TRUE ; \ - Pos = MAP_APPFONT ( 20, 120 + yoffset ) ; \ - Size = MAP_APPFONT ( 28 , 12 ) ; \ + Pos = MAP_APPFONT ( 80, 118 + yoffset ) ; \ + Size = MAP_APPFONT ( 40 , 12 ) ; \ TabStop = TRUE ; \ Repeat = TRUE ; \ Spin = TRUE ; \ @@ -157,11 +175,17 @@ NumericField NF_EXTRAPOLATE_FORWARD \ Maximum = 10000 ; \ DecimalDigits = 2 ; \ }; \ +FixedText FT_EXTRAPOLATE_BACKWARD \ +{ \ + Pos = MAP_APPFONT ( 10, 134 + yoffset ) ; \ + Size = MAP_APPFONT ( 70 , 12 ) ; \ + Text [ en-US ] = "Extrapolate ~backward"; \ +}; \ NumericField NF_EXTRAPOLATE_BACKWARD \ { \ Border = TRUE ; \ - Pos = MAP_APPFONT ( 20, 134 + yoffset ) ; \ - Size = MAP_APPFONT ( 28 , 12 ) ; \ + Pos = MAP_APPFONT ( 80, 132 + yoffset ) ; \ + Size = MAP_APPFONT ( 40 , 12 ) ; \ TabStop = TRUE ; \ Repeat = TRUE ; \ Spin = TRUE ; \ @@ -175,17 +199,18 @@ CheckBox CB_SET_INTERCEPT \ { \ HelpId = HID_SCH_TRENDLINE_SHOW_EQUATION; \ Pos = MAP_APPFONT( 10, 148 + yoffset ); \ - Size = MAP_APPFONT( 60, 10 ); \ + Size = MAP_APPFONT( 60, 12 ); \ TabStop = TRUE; \ - Text[ en-US ] = "Set ~intercept"; \ + Text[ en-US ] = "Force ~intercept"; \ }; \ NumericField NF_INTERCEPT_VALUE \ { \ Border = TRUE ; \ - Pos = MAP_APPFONT ( 75, 148 + yoffset ) ; \ + Pos = MAP_APPFONT ( 80, 146 + yoffset ) ; \ Size = MAP_APPFONT ( 40 , 12 ) ; \ TabStop = TRUE ; \ - Spin = FALSE ; \ + Spin = TRUE ; \ + SpinSize = 1000 ; \ DecimalDigits = 4 ; \ }; \ CheckBox CB_SHOW_EQUATION \ diff --git a/chart2/source/controller/itemsetwrapper/RegressionCurveItemConverter.cxx b/chart2/source/controller/itemsetwrapper/RegressionCurveItemConverter.cxx index 3ea1c0d..011853f 100644 --- a/chart2/source/controller/itemsetwrapper/RegressionCurveItemConverter.cxx +++ b/chart2/source/controller/itemsetwrapper/RegressionCurveItemConverter.cxx @@ -261,11 +261,49 @@ bool RegressionCurveItemConverter::ApplySpecialItem( case SCHATTR_REGRESSION_SET_INTERCEPT: { + if( xCurve.is()) + { + sal_Bool bNewValue = static_cast< sal_Bool >( + static_cast< const SfxBoolItem & >( + rItemSet.Get( nWhichId )).GetValue()); + + uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY ); + OSL_ASSERT( xProperties.is()); + sal_Bool bOldValue = false; + if( xProperties.is() ) + { + xProperties->getPropertyValue( "ForceIntercept" ) >>= bOldValue; + if (bOldValue != bNewValue) + { + xProperties->setPropertyValue( "ForceIntercept" , uno::makeAny( bNewValue )); + bChanged = true; + } + } + } } break; case SCHATTR_REGRESSION_INTERCEPT_VALUE: { + if( xCurve.is()) + { + double aValue = static_cast< double >( + static_cast< const SvxDoubleItem & >( + rItemSet.Get( nWhichId )).GetValue()); + + uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY ); + OSL_ASSERT( xProperties.is()); + double aOldValue = 0.0; + if( xProperties.is() ) + { + xProperties->getPropertyValue( "InterceptValue" ) >>= aOldValue; + if (aOldValue != aValue) + { + xProperties->setPropertyValue( "InterceptValue" , uno::makeAny( aValue )); + bChanged = true; + } + } + } } break; @@ -407,6 +445,40 @@ void RegressionCurveItemConverter::FillSpecialItem( } break; + case SCHATTR_REGRESSION_SET_INTERCEPT: + { + OSL_ASSERT( xCurve.is()); + if( xCurve.is()) + { + uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY ); + OSL_ASSERT( xProperties.is()); + sal_Bool bForceIntercept = false; + if( xProperties.is() && + (xProperties->getPropertyValue( "ForceIntercept" ) >>= bForceIntercept)) + { + rOutItemSet.Put( SfxBoolItem( nWhichId, bForceIntercept )); + } + } + } + break; + + case SCHATTR_REGRESSION_INTERCEPT_VALUE: + { + OSL_ASSERT( xCurve.is()); + if( xCurve.is()) + { + uno::Reference< beans::XPropertySet > xProperties( xCurve, uno::UNO_QUERY ); + OSL_ASSERT( xProperties.is()); + double aValue = 0.0; + if( xProperties.is() && + (xProperties->getPropertyValue( "InterceptValue" ) >>= aValue)) + { + rOutItemSet.Put( SvxDoubleItem( aValue, nWhichId )); + } + } + } + break; + case SCHATTR_REGRESSION_SHOW_EQUATION: { OSL_ASSERT( xCurve.is()); diff --git a/chart2/source/controller/itemsetwrapper/StatisticsItemConverter.cxx b/chart2/source/controller/itemsetwrapper/StatisticsItemConverter.cxx index 16ce0ce..c4b6896 100644 --- a/chart2/source/controller/itemsetwrapper/StatisticsItemConverter.cxx +++ b/chart2/source/controller/itemsetwrapper/StatisticsItemConverter.cxx @@ -511,6 +511,43 @@ bool StatisticsItemConverter::ApplySpecialItem( } break; + case SCHATTR_REGRESSION_SET_INTERCEPT: + { + uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet )); + if( xProperties.is()) + { + sal_Bool aSetInterceptValue = false; + xProperties->getPropertyValue( "ForceIntercept" ) >>= aSetInterceptValue; + sal_Bool bNewValue = + static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue(); + if( aSetInterceptValue != bNewValue ) + { + xProperties->setPropertyValue( "ForceIntercept" , uno::makeAny( bNewValue )); + bChanged = true; + } + } + } + break; + break; + + case SCHATTR_REGRESSION_INTERCEPT_VALUE: + { + uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), &rItemSet )); + if( xProperties.is()) + { + double aInterceptValue = 0.0; + xProperties->getPropertyValue( "InterceptValue" ) >>= aInterceptValue; + double aNewValue = + static_cast< const SvxDoubleItem& >( rItemSet.Get( nWhichId )).GetValue(); + if( aInterceptValue != aNewValue ) + { + xProperties->setPropertyValue( "InterceptValue" , uno::makeAny( aNewValue )); + bChanged = true; + } + } + } + break; + case SCHATTR_REGRESSION_SHOW_EQUATION: { uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), &rItemSet )); @@ -793,6 +830,26 @@ void StatisticsItemConverter::FillSpecialItem( } break; + case SCHATTR_REGRESSION_SET_INTERCEPT: + { + sal_Bool bForceIntercept = false; + uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 )); + if( xProperties.is()) + xProperties->getPropertyValue( "ForceIntercept" ) >>= bForceIntercept; + rOutItemSet.Put( SfxBoolItem( nWhichId, bForceIntercept )); + } + break; + + case SCHATTR_REGRESSION_INTERCEPT_VALUE: + { + double aValue = 0.0; + uno::Reference< beans::XPropertySet > xProperties( lcl_getCurveProperties( GetPropertySet(), 0 )); + if( xProperties.is()) + xProperties->getPropertyValue( "InterceptValue" ) >>= aValue; + rOutItemSet.Put( SvxDoubleItem( aValue, nWhichId )); + } + break; + case SCHATTR_REGRESSION_SHOW_EQUATION: { bool bShowEq = false; diff --git a/chart2/source/inc/PolynomialRegressionCurveCalculator.hxx b/chart2/source/inc/PolynomialRegressionCurveCalculator.hxx index b3b38a9..803abb6 100644 --- a/chart2/source/inc/PolynomialRegressionCurveCalculator.hxx +++ b/chart2/source/inc/PolynomialRegressionCurveCalculator.hxx @@ -33,32 +33,30 @@ public: protected: virtual OUString ImplGetRepresentation( - const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xNumFormatter, - ::sal_Int32 nNumberFormatKey ) const; + const com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatter >& xNumFormatter, + sal_Int32 nNumberFormatKey ) const; private: // ____ XRegressionCurveCalculator ____ virtual void SAL_CALL recalculateRegression( - const ::com::sun::star::uno::Sequence< double >& aXValues, - const ::com::sun::star::uno::Sequence< double >& aYValues ) - throw (::com::sun::star::uno::RuntimeException); + const com::sun::star::uno::Sequence< double >& aXValues, + const com::sun::star::uno::Sequence< double >& aYValues ) + throw (com::sun::star::uno::RuntimeException); virtual double SAL_CALL getCurveValue( double x ) - throw (::com::sun::star::lang::IllegalArgumentException, - ::com::sun::star::uno::RuntimeException); + throw (com::sun::star::lang::IllegalArgumentException, + com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues( + virtual ::com::sun::star::uno::Sequence< com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues( double min, double max, - ::sal_Int32 nPointCount, - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling >& xScalingX, - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling >& xScalingY, - ::sal_Bool bMaySkipPointsInCalculation ) - throw (::com::sun::star::lang::IllegalArgumentException, - ::com::sun::star::uno::RuntimeException); + sal_Int32 nPointCount, + const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScalingX, + const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScalingY, + sal_Bool bMaySkipPointsInCalculation ) + throw (com::sun::star::lang::IllegalArgumentException, + com::sun::star::uno::RuntimeException); - double m_fSlope; - double m_fIntercept; std::vector<double> mResult; }; diff --git a/chart2/source/inc/RegressionCurveCalculator.hxx b/chart2/source/inc/RegressionCurveCalculator.hxx index 0829543..a8cf124 100644 --- a/chart2/source/inc/RegressionCurveCalculator.hxx +++ b/chart2/source/inc/RegressionCurveCalculator.hxx @@ -28,64 +28,71 @@ namespace chart { class RegressionCurveCalculator : public - ::cppu::WeakImplHelper1< ::com::sun::star::chart2::XRegressionCurveCalculator > + cppu::WeakImplHelper1< com::sun::star::chart2::XRegressionCurveCalculator > { public: RegressionCurveCalculator(); virtual ~RegressionCurveCalculator(); static bool isLinearScaling( - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling > & xScaling ); + const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScaling ); + static bool isLogarithmicScaling( - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling > & xScaling ); + const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScaling ); protected: virtual OUString ImplGetRepresentation( - const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xNumFormatter, - ::sal_Int32 nNumberFormatKey ) const = 0; + const com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatter >& xNumFormatter, + sal_Int32 nNumberFormatKey ) const = 0; OUString getFormattedString( - const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xNumFormatter, - ::sal_Int32 nNumberFormatKey, + const com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatter >& xNumFormatter, + sal_Int32 nNumberFormatKey, double fNumber ) const; double m_fCorrelationCoeffitient; - sal_Int32 mDegree; - double mIntercept; - sal_Int32 mPeriod; + sal_Int32 mDegree; + sal_Bool mForceIntercept; + double mInterceptValue; + sal_Int32 mPeriod; // ____ XRegressionCurveCalculator ____ virtual void SAL_CALL setRegressionProperties( sal_Int32 aDegree, - double aIntercept, + sal_Bool aForceIntercept, + double aInterceptValue, sal_Int32 aPeriod); virtual void SAL_CALL recalculateRegression( - const ::com::sun::star::uno::Sequence< double >& aXValues, - const ::com::sun::star::uno::Sequence< double >& aYValues ) - throw (::com::sun::star::uno::RuntimeException) = 0; + const com::sun::star::uno::Sequence< double >& aXValues, + const com::sun::star::uno::Sequence< double >& aYValues ) + throw (com::sun::star::uno::RuntimeException) = 0; + virtual double SAL_CALL getCurveValue( double x ) - throw (::com::sun::star::lang::IllegalArgumentException, - ::com::sun::star::uno::RuntimeException) = 0; + throw (com::sun::star::lang::IllegalArgumentException, + com::sun::star::uno::RuntimeException) = 0; - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues( + virtual com::sun::star::uno::Sequence< com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues( double min, double max, - ::sal_Int32 nPointCount, - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling >& xScalingX, - const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling >& xScalingY, - ::sal_Bool bMaySkipPointsInCalculation ) - throw (::com::sun::star::lang::IllegalArgumentException, - ::com::sun::star::uno::RuntimeException); + sal_Int32 nPointCount, + const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScalingX, + const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScalingY, + sal_Bool bMaySkipPointsInCalculation ) + throw (com::sun::star::lang::IllegalArgumentException, + com::sun::star::uno::RuntimeException); + virtual double SAL_CALL getCorrelationCoefficient() - throw (::com::sun::star::uno::RuntimeException); + throw (com::sun::star::uno::RuntimeException); + virtual OUString SAL_CALL getRepresentation() - throw (::com::sun::star::uno::RuntimeException); + throw (com::sun::star::uno::RuntimeException); + virtual OUString SAL_CALL getFormattedRepresentation( - const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >& xNumFmtSupplier, - ::sal_Int32 nNumberFormatKey ) - throw (::com::sun::star::uno::RuntimeException); + const com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatsSupplier >& xNumFmtSupplier, + sal_Int32 nNumberFormatKey ) + throw (com::sun::star::uno::RuntimeException); }; } // namespace chart diff --git a/chart2/source/tools/PolynomialRegressionCurveCalculator.cxx b/chart2/source/tools/PolynomialRegressionCurveCalculator.cxx index f5717ab..0d3d4d1 100644 --- a/chart2/source/tools/PolynomialRegressionCurveCalculator.cxx +++ b/chart2/source/tools/PolynomialRegressionCurveCalculator.cxx @@ -25,7 +25,7 @@ #include <rtl/ustrbuf.hxx> #include "gauss.hxx" -using namespace ::com::sun::star; +using namespace com::sun::star; namespace chart @@ -43,66 +43,76 @@ void SAL_CALL PolynomialRegressionCurveCalculator::recalculateRegression( const uno::Sequence< double >& aYValues ) throw (uno::RuntimeException) { - ::rtl::math::setNan( & m_fCorrelationCoeffitient ); + rtl::math::setNan(&m_fCorrelationCoeffitient); RegressionCalculationHelper::tDoubleVectorPair aValues( RegressionCalculationHelper::cleanup( aXValues, aYValues, RegressionCalculationHelper::isValid())); - const double EPSILON( 1.0e-20 ); - - int aNumberOfPolyElements = mDegree + 1; - int aNumberOfPowers = 2 * aNumberOfPolyElements - 1; + int aNoElements = mForceIntercept ? mDegree : mDegree + 1; + int aNumberOfPowers = 2 * aNoElements - 1; std::vector<double> aPowers; aPowers.resize(aNumberOfPowers, 0.0); - int aNumberOfColumns = aNumberOfPolyElements; - int aNumberOfRows = aNumberOfPolyElements + 1; + int aNoColumns = aNoElements; + int aNoRows = aNoElements + 1; std::vector<double> aMatrix; - aMatrix.resize(aNumberOfColumns*aNumberOfRows, 0.0); + aMatrix.resize(aNoColumns * aNoRows, 0.0); - const size_t aSizeOfValues = aValues.first.size(); + const size_t aNoValues = aValues.first.size(); double yAverage = 0.0; - aPowers[0] += aSizeOfValues; - - for( size_t i = 0; i < aSizeOfValues; ++i ) + for( size_t i = 0; i < aNoValues; ++i ) { double x = aValues.first[i]; double y = aValues.second[i]; - for (int j = 1; j < aNumberOfPowers; j++) { - aPowers[j] += pow(x, j); + for (int j = 0; j < aNumberOfPowers; j++) + { + if (mForceIntercept) + aPowers[j] += std::pow(x, j + 2); + else + aPowers[j] += std::pow(x, j); } - for (int j = 0; j < aNumberOfPolyElements; j++) { - aMatrix[j * aNumberOfRows + aNumberOfPolyElements] += pow(x, j) * y; + for (int j = 0; j < aNoElements; j++) + { + if (mForceIntercept) + aMatrix[j * aNoRows + aNoElements] += std::pow(x, j + 1) * ( y - mInterceptValue ); + else + aMatrix[j * aNoRows + aNoElements] += std::pow(x, j) * y; } yAverage += y; } - yAverage = yAverage / aSizeOfValues; + yAverage = yAverage / aNoValues; - for (int y = 0; y < aNumberOfPolyElements; y++) { - for (int x = 0; x < aNumberOfPolyElements; x++) { - aMatrix[y * aNumberOfRows + x] = aPowers[y + x]; + for (int y = 0; y < aNoElements; y++) + { + for (int x = 0; x < aNoElements; x++) + { + aMatrix[y * aNoRows + x] = aPowers[y + x]; } } mResult.clear(); - mResult.resize(aNumberOfPolyElements, 0.0); + mResult.resize(aNoElements, 0.0); - solve(aMatrix, aNumberOfColumns, aNumberOfRows, mResult, EPSILON); + solve(aMatrix, aNoColumns, aNoRows, mResult, 1.0e-20); - // Calculate correlation coeffitient + // Set intercept value if force intercept is enabled + if (mForceIntercept) { + mResult.insert( mResult.begin(), mInterceptValue ); + } + // Calculate correlation coeffitient double aSumError = 0.0; double aSumTotal = 0.0; - for( size_t i = 0; i < aSizeOfValues; ++i ) + for( size_t i = 0; i < aNoValues; ++i ) { double x = aValues.first[i]; double yActual = aValues.second[i]; @@ -111,8 +121,11 @@ void SAL_CALL PolynomialRegressionCurveCalculator::recalculateRegression( aSumError += (yActual - yPredicted) * (yActual - yPredicted); } - m_fCorrelationCoeffitient = sqrt(1 - (aSumError / aSumTotal)); - + double aRSquared = 1.0 - (aSumError / aSumTotal); + if (aRSquared > 0.0) + m_fCorrelationCoeffitient = std::sqrt(aRSquared); + else + m_fCorrelationCoeffitient = 0.0; } double SAL_CALL PolynomialRegressionCurveCalculator::getCurveValue( double x ) @@ -130,7 +143,7 @@ double SAL_CALL PolynomialRegressionCurveCalculator::getCurveValue( double x ) fResult = 0.0; for (size_t i = 0; i<mResult.size(); i++) { - fResult += mResult[i]*pow(x,i); + fResult += mResult[i] * std::pow(x, i); } return fResult; } @@ -149,17 +162,34 @@ uno::Sequence< geometry::RealPoint2D > SAL_CALL PolynomialRegressionCurveCalcula OUString PolynomialRegressionCurveCalculator::ImplGetRepresentation( const uno::Reference< util::XNumberFormatter >& xNumFormatter, - ::sal_Int32 nNumberFormatKey ) const + sal_Int32 nNumberFormatKey ) const { OUStringBuffer aBuf( "f(x) = "); - for (int i=mResult.size()-1; i>=0; i--) + int aLastIndex = mResult.size() - 1; + for (int i = aLastIndex; i >= 0; i--) { - aBuf.append(getFormattedString( xNumFormatter, nNumberFormatKey, mResult[i] )); - if(i > 0) { + double aValue = mResult[i]; + if (aValue == 0.0) + { + continue; + } + else if (aValue < 0.0) + { + aBuf.appendAscii( " - " ); + } + else + { + if (i != aLastIndex) + aBuf.appendAscii( " + " ); + } + + aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, std::abs( aValue ) ) ); + + if(i > 0) + { aBuf.appendAscii( "x^" ); aBuf.append(i); - aBuf.append(" + "); } } diff --git a/chart2/source/tools/RegressionCurveCalculator.cxx b/chart2/source/tools/RegressionCurveCalculator.cxx index 461e504..8337d95 100644 --- a/chart2/source/tools/RegressionCurveCalculator.cxx +++ b/chart2/source/tools/RegressionCurveCalculator.cxx @@ -37,13 +37,14 @@ namespace chart { RegressionCurveCalculator::RegressionCurveCalculator() : - m_fCorrelationCoeffitient( 0.0 ), + m_fCorrelationCoeffitient(0.0), mDegree(2), - mIntercept(0.0), + mForceIntercept(false), + mInterceptValue(0.0), mPeriod(2) { - ::rtl::math::setNan( &m_fCorrelationCoeffitient ); - ::rtl::math::setNan( &mIntercept ); + rtl::math::setNan( &m_fCorrelationCoeffitient ); + rtl::math::setNan( &mInterceptValue ); } RegressionCurveCalculator::~RegressionCurveCalculator() @@ -70,17 +71,19 @@ bool RegressionCurveCalculator::isLogarithmicScaling( void RegressionCurveCalculator::setRegressionProperties( sal_Int32 aDegree, - double aIntercept, + sal_Bool aForceIntercept, + double aInterceptValue, sal_Int32 aPeriod) { - mDegree = aDegree; - mIntercept = aIntercept; - mPeriod = aPeriod; + mDegree = aDegree; + mForceIntercept = aForceIntercept; + mInterceptValue = aInterceptValue; + mPeriod = aPeriod; } OUString RegressionCurveCalculator::getFormattedString( const Reference< util::XNumberFormatter >& xNumFormatter, - ::sal_Int32 nNumberFormatKey, + sal_Int32 nNumberFormatKey, double fNumber ) const { OUString aResult; @@ -97,9 +100,8 @@ Sequence< geometry::RealPoint2D > SAL_CALL RegressionCurveCalculator::getCurveVa double min, double max, ::sal_Int32 nPointCount, const Reference< chart2::XScaling >& xScalingX, const Reference< chart2::XScaling >& /* xScalingY */, - ::sal_Bool /* bMaySkipPointsInCalculation */ ) - throw (lang::IllegalArgumentException, - uno::RuntimeException) + sal_Bool /* bMaySkipPointsInCalculation */ ) + throw (lang::IllegalArgumentException, uno::RuntimeException) { if( nPointCount < 2 ) throw lang::IllegalArgumentException(); @@ -148,7 +150,7 @@ OUString SAL_CALL RegressionCurveCalculator::getRepresentation() OUString SAL_CALL RegressionCurveCalculator::getFormattedRepresentation( const Reference< util::XNumberFormatsSupplier > & xNumFmtSupplier, - ::sal_Int32 nNumberFormatKey ) + sal_Int32 nNumberFormatKey ) throw (uno::RuntimeException) { // create and prepare a number formatter diff --git a/chart2/source/tools/RegressionCurveModel.cxx b/chart2/source/tools/RegressionCurveModel.cxx index cd9b143..c98d592 100644 --- a/chart2/source/tools/RegressionCurveModel.cxx +++ b/chart2/source/tools/RegressionCurveModel.cxx @@ -60,7 +60,9 @@ enum PROPERTY_DEGREE, PROPERTY_PERIOD, PROPERTY_EXTRAPOLATE_FORWARD, - PROPERTY_EXTRAPOLATE_BACKWARD + PROPERTY_EXTRAPOLATE_BACKWARD, + PROPERTY_FORCE_INTERCEPT, + PROPERTY_INTERCEPT_VALUE }; void lcl_AddPropertiesToVector( @@ -93,6 +95,20 @@ void lcl_AddPropertiesToVector( ::getCppuType( reinterpret_cast< const double* >(0) ), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT )); + + rOutProperties.push_back( + Property( "ForceIntercept", + PROPERTY_FORCE_INTERCEPT, + ::getBooleanCppuType(), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); + + rOutProperties.push_back( + Property( "InterceptValue", + PROPERTY_INTERCEPT_VALUE, + ::getCppuType( reinterpret_cast< const double* >(0) ), + beans::PropertyAttribute::BOUND | + beans::PropertyAttribute::MAYBEDEFAULT )); } struct StaticXXXDefaults_Initializer diff --git a/chart2/source/view/charttypes/VSeriesPlotter.cxx b/chart2/source/view/charttypes/VSeriesPlotter.cxx index 5c85e43..e8b4fa9 100644 --- a/chart2/source/view/charttypes/VSeriesPlotter.cxx +++ b/chart2/source/view/charttypes/VSeriesPlotter.cxx @@ -985,8 +985,9 @@ void VSeriesPlotter::createRegressionCurvesShapes( VDataSeries& rVDataSeries sal_Int32 aPeriod = 2; double aExtrapolateForward = 0.0; double aExtrapolateBackward = 0.0; - double aIntercept; - rtl::math::setNan(&aIntercept); + sal_Bool aForceIntercept = false; + double aInterceptValue; + rtl::math::setNan(&aInterceptValue); if ( xProperties.is() ) { @@ -994,10 +995,12 @@ void VSeriesPlotter::createRegressionCurvesShapes( VDataSeries& rVDataSeries xProperties->getPropertyValue( "MovingAveragePeriod") >>= aPeriod; xProperties->getPropertyValue( "ExtrapolateForward") >>= aExtrapolateForward; xProperties->getPropertyValue( "ExtrapolateBackward") >>= aExtrapolateBackward; + xProperties->getPropertyValue( "ForceIntercept") >>= aForceIntercept; + if (aForceIntercept) + xProperties->getPropertyValue( "InterceptValue") >>= aInterceptValue; } - uno::Reference< XRegressionCurveCalculator > xRegressionCurveCalculator( - aCurveList[nN]->getCalculator() ); + uno::Reference< XRegressionCurveCalculator > xRegressionCurveCalculator( aCurveList[nN]->getCalculator() ); if( ! xRegressionCurveCalculator.is()) continue; @@ -1009,7 +1012,7 @@ void VSeriesPlotter::createRegressionCurvesShapes( VDataSeries& rVDataSeries fMaxX += aExtrapolateForward; fMinX -= aExtrapolateBackward; - xRegressionCurveCalculator->setRegressionProperties(aDegree, aIntercept, aPeriod); + xRegressionCurveCalculator->setRegressionProperties(aDegree, aForceIntercept, aInterceptValue, aPeriod); xRegressionCurveCalculator->recalculateRegression( rVDataSeries.getAllX(), rVDataSeries.getAllY() ); sal_Int32 nRegressionPointCount = 100; //@todo find a more optimal solution if more complicated curve types are introduced diff --git a/chart2/source/view/main/ChartItemPool.cxx b/chart2/source/view/main/ChartItemPool.cxx index abb05a2..60a9ba4 100644 --- a/chart2/source/view/main/ChartItemPool.cxx +++ b/chart2/source/view/main/ChartItemPool.cxx @@ -74,7 +74,7 @@ ChartItemPool::ChartItemPool(): ppPoolDefaults[SCHATTR_STAT_INDICATE - SCHATTR_START] = new SvxChartIndicateItem (CHINDICATE_NONE, SCHATTR_STAT_INDICATE); ppPoolDefaults[SCHATTR_STAT_RANGE_POS - SCHATTR_START] = new SfxStringItem (SCHATTR_STAT_RANGE_POS, String()); ppPoolDefaults[SCHATTR_STAT_RANGE_NEG - SCHATTR_START] = new SfxStringItem (SCHATTR_STAT_RANGE_NEG, String()); - ppPoolDefaults[SCHATTR_STAT_ERRORBAR_TYPE - SCHATTR_START] = new SfxBoolItem(SCHATTR_STAT_ERRORBAR_TYPE, true); + ppPoolDefaults[SCHATTR_STAT_ERRORBAR_TYPE - SCHATTR_START] = new SfxBoolItem(SCHATTR_STAT_ERRORBAR_TYPE, true); ppPoolDefaults[SCHATTR_STYLE_DEEP - SCHATTR_START] = new SfxBoolItem (SCHATTR_STYLE_DEEP, 0); ppPoolDefaults[SCHATTR_STYLE_3D - SCHATTR_START] = new SfxBoolItem (SCHATTR_STYLE_3D, 0); @@ -83,7 +83,7 @@ ChartItemPool::ChartItemPool(): ppPoolDefaults[SCHATTR_STYLE_LINES - SCHATTR_START] = new SfxBoolItem (SCHATTR_STYLE_LINES, 0); ppPoolDefaults[SCHATTR_STYLE_PERCENT - SCHATTR_START] = new SfxBoolItem (SCHATTR_STYLE_PERCENT, 0); ppPoolDefaults[SCHATTR_STYLE_STACKED - SCHATTR_START] = new SfxBoolItem (SCHATTR_STYLE_STACKED, 0); - ppPoolDefaults[SCHATTR_STYLE_SPLINES - SCHATTR_START] = new SfxInt32Item (SCHATTR_STYLE_SPLINES, 0); //Bug: was Bool! test ->Fileformat (touches only 5's) + ppPoolDefaults[SCHATTR_STYLE_SPLINES - SCHATTR_START] = new SfxInt32Item (SCHATTR_STYLE_SPLINES, 0); //Bug: was Bool! test ->Fileformat (touches only 5's) ppPoolDefaults[SCHATTR_STYLE_SYMBOL - SCHATTR_START] = new SfxInt32Item (SCHATTR_STYLE_SYMBOL, 0); ppPoolDefaults[SCHATTR_STYLE_SHAPE - SCHATTR_START] = new SfxInt32Item (SCHATTR_STYLE_SHAPE, 0); @@ -152,11 +152,11 @@ ChartItemPool::ChartItemPool(): ppPoolDefaults[SCHATTR_REGRESSION_TYPE - SCHATTR_START] = new SvxChartRegressItem (CHREGRESS_NONE, SCHATTR_REGRESSION_TYPE); ppPoolDefaults[SCHATTR_REGRESSION_SHOW_EQUATION - SCHATTR_START] = new SfxBoolItem(SCHATTR_REGRESSION_SHOW_EQUATION, 0); ppPoolDefaults[SCHATTR_REGRESSION_SHOW_COEFF - SCHATTR_START] = new SfxBoolItem(SCHATTR_REGRESSION_SHOW_COEFF, 0); - ppPoolDefaults[SCHATTR_REGRESSION_DEGREE - SCHATTR_START] = new SfxInt32Item( SCHATTR_REGRESSION_DEGREE, 2 ); - ppPoolDefaults[SCHATTR_REGRESSION_PERIOD - SCHATTR_START] = new SfxInt32Item( SCHATTR_REGRESSION_PERIOD, 2 ); - ppPoolDefaults[SCHATTR_REGRESSION_EXTRAPOLATE_FORWARD - SCHATTR_START] = new SvxDoubleItem( 0.0, SCHATTR_REGRESSION_EXTRAPOLATE_FORWARD ); - ppPoolDefaults[SCHATTR_REGRESSION_EXTRAPOLATE_BACKWARD - SCHATTR_START] = new SvxDoubleItem( 0.0, SCHATTR_REGRESSION_EXTRAPOLATE_BACKWARD ); - ppPoolDefaults[SCHATTR_REGRESSION_SET_INTERCEPT - SCHATTR_START] = new SfxBoolItem( SCHATTR_REGRESSION_SET_INTERCEPT, false ); + ppPoolDefaults[SCHATTR_REGRESSION_DEGREE - SCHATTR_START] = new SfxInt32Item(SCHATTR_REGRESSION_DEGREE, 2); + ppPoolDefaults[SCHATTR_REGRESSION_PERIOD - SCHATTR_START] = new SfxInt32Item(SCHATTR_REGRESSION_PERIOD, 2); + ppPoolDefaults[SCHATTR_REGRESSION_EXTRAPOLATE_FORWARD - SCHATTR_START] = new SvxDoubleItem(0.0, SCHATTR_REGRESSION_EXTRAPOLATE_FORWARD); + ppPoolDefaults[SCHATTR_REGRESSION_EXTRAPOLATE_BACKWARD - SCHATTR_START] = new SvxDoubleItem(0.0, SCHATTR_REGRESSION_EXTRAPOLATE_BACKWARD); + ppPoolDefaults[SCHATTR_REGRESSION_SET_INTERCEPT - SCHATTR_START] = new SfxBoolItem(SCHATTR_REGRESSION_SET_INTERCEPT, sal_False); ppPoolDefaults[SCHATTR_REGRESSION_INTERCEPT_VALUE - SCHATTR_START] = new SvxDoubleItem( 0.0, SCHATTR_REGRESSION_INTERCEPT_VALUE); /************************************************************************** diff --git a/offapi/com/sun/star/chart2/XRegressionCurveCalculator.idl b/offapi/com/sun/star/chart2/XRegressionCurveCalculator.idl index b8831e3..9d2d3aa 100644 --- a/offapi/com/sun/star/chart2/XRegressionCurveCalculator.idl +++ b/offapi/com/sun/star/chart2/XRegressionCurveCalculator.idl @@ -38,7 +38,8 @@ interface XRegressionCurveCalculator : com::sun::star::uno::XInterface { void setRegressionProperties( [in] long degree, - [in] double intercept, + [in] boolean forceIntercept, + [in] double interceptValue, [in] long period); /** recalculates the parameters of the internal regression curve according to
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits