summaryrefslogtreecommitdiff
path: root/chart2/source/tools/ThreeDHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'chart2/source/tools/ThreeDHelper.cxx')
-rw-r--r--chart2/source/tools/ThreeDHelper.cxx1519
1 files changed, 0 insertions, 1519 deletions
diff --git a/chart2/source/tools/ThreeDHelper.cxx b/chart2/source/tools/ThreeDHelper.cxx
deleted file mode 100644
index 83ee9d51a..000000000
--- a/chart2/source/tools/ThreeDHelper.cxx
+++ /dev/null
@@ -1,1519 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org 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 version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_chart2.hxx"
-
-#include "ThreeDHelper.hxx"
-#include "macros.hxx"
-#include "DiagramHelper.hxx"
-#include "ChartTypeHelper.hxx"
-#include "BaseGFXHelper.hxx"
-#include "DataSeriesHelper.hxx"
-#include <editeng/unoprnms.hxx>
-#include <com/sun/star/beans/XPropertyState.hpp>
-#include <com/sun/star/chart2/XDiagram.hpp>
-#include <com/sun/star/drawing/LineStyle.hpp>
-
-#include <tools/debug.hxx>
-
-//.............................................................................
-namespace chart
-{
-//.............................................................................
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::chart2;
-
-using ::com::sun::star::uno::Reference;
-using ::com::sun::star::uno::Sequence;
-using ::rtl::OUString;
-using ::rtl::math::cos;
-using ::rtl::math::sin;
-using ::rtl::math::tan;
-
-#define FIXED_SIZE_FOR_3D_CHART_VOLUME (10000.0)
-
-namespace
-{
-
-bool lcl_isRightAngledAxesSetAndSupported( const Reference< beans::XPropertySet >& xSceneProperties )
-{
- sal_Bool bRightAngledAxes = sal_False;
- if( xSceneProperties.is() )
- {
- xSceneProperties->getPropertyValue( C2U("RightAngledAxes")) >>= bRightAngledAxes;
- if(bRightAngledAxes)
- {
- uno::Reference< chart2::XDiagram > xDiagram( xSceneProperties, uno::UNO_QUERY );
- if( ChartTypeHelper::isSupportingRightAngledAxes(
- DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) ) )
- {
- return true;
- }
- }
- }
- return false;
-}
-
-void lcl_RotateLightSource( const Reference< beans::XPropertySet >& xSceneProperties
- , const OUString& rLightSourceDirection
- , const OUString& rLightSourceOn
- , const ::basegfx::B3DHomMatrix& rRotationMatrix )
-{
- if( xSceneProperties.is() )
- {
- sal_Bool bLightOn = sal_False;
- if( xSceneProperties->getPropertyValue( rLightSourceOn ) >>= bLightOn )
- {
- if( bLightOn )
- {
- drawing::Direction3D aLight;
- if( xSceneProperties->getPropertyValue( rLightSourceDirection ) >>= aLight )
- {
- ::basegfx::B3DVector aLightVector( BaseGFXHelper::Direction3DToB3DVector( aLight ) );
- aLightVector = rRotationMatrix*aLightVector;
-
- xSceneProperties->setPropertyValue( rLightSourceDirection
- , uno::makeAny( BaseGFXHelper::B3DVectorToDirection3D( aLightVector ) ) );
- }
- }
- }
- }
-}
-
-void lcl_rotateLights( const ::basegfx::B3DHomMatrix& rLightRottion, const Reference< beans::XPropertySet >& xSceneProperties )
-{
- if(!xSceneProperties.is())
- return;
-
- ::basegfx::B3DHomMatrix aLightRottion( rLightRottion );
- BaseGFXHelper::ReduceToRotationMatrix( aLightRottion );
-
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection1"), C2U("D3DSceneLightOn1"), aLightRottion );
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection2"), C2U("D3DSceneLightOn2"), aLightRottion );
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection3"), C2U("D3DSceneLightOn3"), aLightRottion );
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection4"), C2U("D3DSceneLightOn4"), aLightRottion );
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection5"), C2U("D3DSceneLightOn5"), aLightRottion );
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection6"), C2U("D3DSceneLightOn6"), aLightRottion );
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection7"), C2U("D3DSceneLightOn7"), aLightRottion );
- lcl_RotateLightSource( xSceneProperties, C2U("D3DSceneLightDirection8"), C2U("D3DSceneLightOn8"), aLightRottion );
-}
-
-::basegfx::B3DHomMatrix lcl_getInverseRotationMatrix( const Reference< beans::XPropertySet >& xSceneProperties )
-{
- ::basegfx::B3DHomMatrix aInverseRotation;
- double fXAngleRad=0.0;
- double fYAngleRad=0.0;
- double fZAngleRad=0.0;
- ThreeDHelper::getRotationAngleFromDiagram(
- xSceneProperties, fXAngleRad, fYAngleRad, fZAngleRad );
- aInverseRotation.rotate( 0.0, 0.0, -fZAngleRad );
- aInverseRotation.rotate( 0.0, -fYAngleRad, 0.0 );
- aInverseRotation.rotate( -fXAngleRad, 0.0, 0.0 );
- return aInverseRotation;
-}
-
-::basegfx::B3DHomMatrix lcl_getCompleteRotationMatrix( const Reference< beans::XPropertySet >& xSceneProperties )
-{
- ::basegfx::B3DHomMatrix aCompleteRotation;
- double fXAngleRad=0.0;
- double fYAngleRad=0.0;
- double fZAngleRad=0.0;
- ThreeDHelper::getRotationAngleFromDiagram(
- xSceneProperties, fXAngleRad, fYAngleRad, fZAngleRad );
- aCompleteRotation.rotate( fXAngleRad, fYAngleRad, fZAngleRad );
- return aCompleteRotation;
-}
-
-bool lcl_isEqual( const drawing::Direction3D& rA, const drawing::Direction3D& rB )
-{
- return ::rtl::math::approxEqual(rA.DirectionX, rB.DirectionX)
- && ::rtl::math::approxEqual(rA.DirectionY, rB.DirectionY)
- && ::rtl::math::approxEqual(rA.DirectionZ, rB.DirectionZ);
-}
-
-bool lcl_isLightScheme( const uno::Reference< beans::XPropertySet >& xDiagramProps, bool bRealistic )
-{
- if(!xDiagramProps.is())
- return false;
-
- sal_Bool bIsOn = sal_False;
- xDiagramProps->getPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_2 ) ) >>= bIsOn;
- if(!bIsOn)
- return false;
-
- uno::Reference< chart2::XDiagram > xDiagram( xDiagramProps, uno::UNO_QUERY );
- uno::Reference< chart2::XChartType > xChartType( DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) );
-
- sal_Int32 nColor = 0;
- xDiagramProps->getPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTCOLOR_2 ) ) >>= nColor;
- if( nColor != ::chart::ChartTypeHelper::getDefaultDirectLightColor( !bRealistic, xChartType ) )
- return false;
-
- sal_Int32 nAmbientColor = 0;
- xDiagramProps->getPropertyValue( C2U( UNO_NAME_3D_SCENE_AMBIENTCOLOR ) ) >>= nAmbientColor;
- if( nAmbientColor != ::chart::ChartTypeHelper::getDefaultAmbientLightColor( !bRealistic, xChartType ) )
- return false;
-
- drawing::Direction3D aDirection(0,0,0);
- xDiagramProps->getPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTDIRECTION_2 ) ) >>= aDirection;
-
- drawing::Direction3D aDefaultDirection( bRealistic
- ? ChartTypeHelper::getDefaultRealisticLightDirection(xChartType)
- : ChartTypeHelper::getDefaultSimpleLightDirection(xChartType) );
-
- //rotate default light direction when right angled axes are off but supported
- {
- sal_Bool bRightAngledAxes = sal_False;
- xDiagramProps->getPropertyValue( C2U("RightAngledAxes")) >>= bRightAngledAxes;
- if(!bRightAngledAxes)
- {
- if( ChartTypeHelper::isSupportingRightAngledAxes(
- DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) ) )
- {
- ::basegfx::B3DHomMatrix aRotation( lcl_getCompleteRotationMatrix( xDiagramProps ) );
- BaseGFXHelper::ReduceToRotationMatrix( aRotation );
- ::basegfx::B3DVector aLightVector( BaseGFXHelper::Direction3DToB3DVector( aDefaultDirection ) );
- aLightVector = aRotation*aLightVector;
- aDefaultDirection = BaseGFXHelper::B3DVectorToDirection3D( aLightVector );
- }
- }
- }
-
- return lcl_isEqual( aDirection, aDefaultDirection );
-}
-
-bool lcl_isRealisticLightScheme( const uno::Reference< beans::XPropertySet >& xDiagramProps )
-{
- return lcl_isLightScheme( xDiagramProps, true /*bRealistic*/ );
-}
-bool lcl_isSimpleLightScheme( const uno::Reference< beans::XPropertySet >& xDiagramProps )
-{
- return lcl_isLightScheme( xDiagramProps, false /*bRealistic*/ );
-}
-void lcl_setLightsForScheme( const uno::Reference< beans::XPropertySet >& xDiagramProps, const ThreeDLookScheme& rScheme )
-{
- if(!xDiagramProps.is())
- return;
- if( rScheme == ThreeDLookScheme_Unknown)
- return;
-
- xDiagramProps->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_2 ), uno::makeAny( sal_True ) );
-
- uno::Reference< chart2::XDiagram > xDiagram( xDiagramProps, uno::UNO_QUERY );
- uno::Reference< chart2::XChartType > xChartType( DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) );
- uno::Any aADirection( uno::makeAny( rScheme == ThreeDLookScheme_Simple
- ? ChartTypeHelper::getDefaultSimpleLightDirection(xChartType)
- : ChartTypeHelper::getDefaultRealisticLightDirection(xChartType) ) );
-
- xDiagramProps->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTDIRECTION_2 ), aADirection );
- //rotate light direction when right angled axes are off but supported
- {
- sal_Bool bRightAngledAxes = sal_False;
- xDiagramProps->getPropertyValue( C2U("RightAngledAxes")) >>= bRightAngledAxes;
- if(!bRightAngledAxes)
- {
- if( ChartTypeHelper::isSupportingRightAngledAxes( xChartType ) )
- {
- ::basegfx::B3DHomMatrix aRotation( lcl_getCompleteRotationMatrix( xDiagramProps ) );
- BaseGFXHelper::ReduceToRotationMatrix( aRotation );
- lcl_RotateLightSource( xDiagramProps, C2U("D3DSceneLightDirection2"), C2U("D3DSceneLightOn2"), aRotation );
- }
- }
- }
-
- sal_Int32 nColor = ::chart::ChartTypeHelper::getDefaultDirectLightColor( rScheme==ThreeDLookScheme_Simple, xChartType );
- xDiagramProps->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTCOLOR_2 ), uno::makeAny( nColor ) );
-
- sal_Int32 nAmbientColor = ::chart::ChartTypeHelper::getDefaultAmbientLightColor( rScheme==ThreeDLookScheme_Simple, xChartType );
- xDiagramProps->setPropertyValue( C2U( UNO_NAME_3D_SCENE_AMBIENTCOLOR ), uno::makeAny( nAmbientColor ) );
-}
-
-bool lcl_isRealisticScheme( drawing::ShadeMode aShadeMode
- , sal_Int32 nRoundedEdges
- , sal_Int32 nObjectLines )
-{
- if(aShadeMode!=drawing::ShadeMode_SMOOTH)
- return false;
- if(nRoundedEdges!=5)
- return false;
- if(nObjectLines!=0)
- return false;
- return true;
-}
-
-bool lcl_isSimpleScheme( drawing::ShadeMode aShadeMode
- , sal_Int32 nRoundedEdges
- , sal_Int32 nObjectLines
- , const uno::Reference< XDiagram >& xDiagram )
-{
- if(aShadeMode!=drawing::ShadeMode_FLAT)
- return false;
- if(nRoundedEdges!=0)
- return false;
- if(nObjectLines==0)
- {
- uno::Reference< chart2::XChartType > xChartType( DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) );
- return ChartTypeHelper::noBordersForSimpleScheme( xChartType );
- }
- if(nObjectLines!=1)
- return false;
- return true;
-}
-
-void lcl_setRealisticScheme( drawing::ShadeMode& rShadeMode
- , sal_Int32& rnRoundedEdges
- , sal_Int32& rnObjectLines )
-{
- rShadeMode = drawing::ShadeMode_SMOOTH;
- rnRoundedEdges = 5;
- rnObjectLines = 0;
-}
-
-void lcl_setSimpleScheme( drawing::ShadeMode& rShadeMode
- , sal_Int32& rnRoundedEdges
- , sal_Int32& rnObjectLines
- , const uno::Reference< XDiagram >& xDiagram )
-{
- rShadeMode = drawing::ShadeMode_FLAT;
- rnRoundedEdges = 0;
-
- uno::Reference< chart2::XChartType > xChartType( DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) );
- rnObjectLines = ChartTypeHelper::noBordersForSimpleScheme( xChartType ) ? 0 : 1;
-}
-
-} //end anonymous namespace
-
-
-drawing::CameraGeometry ThreeDHelper::getDefaultCameraGeometry( bool bPie )
-{
- // ViewReferencePoint (Point on the View plane)
- drawing::Position3D vrp(17634.6218373783, 10271.4823817647, 24594.8639082739);
- // ViewPlaneNormal (Normal to the View Plane)
- drawing::Direction3D vpn(0.416199821709347, 0.173649045905254, 0.892537795986984);
- // ViewUpVector (determines the v-axis direction on the view plane as
- // projection of VUP parallel to VPN onto th view pane)
- drawing::Direction3D vup(-0.0733876362771618, 0.984807599917971, -0.157379306090273);
-
- if( bPie )
- {
- vrp = drawing::Position3D( 0.0, 0.0, 87591.2408759124 );//--> 5 percent perspecitve
- vpn = drawing::Direction3D( 0.0, 0.0, 1.0 );
- vup = drawing::Direction3D( 0.0, 1.0, 0.0 );
- }
-
- return drawing::CameraGeometry( vrp, vpn, vup );
-}
-
-namespace
-{
-::basegfx::B3DHomMatrix lcl_getCameraMatrix( const uno::Reference< beans::XPropertySet >& xSceneProperties )
-{
- drawing::HomogenMatrix aCameraMatrix;
-
- drawing::CameraGeometry aCG( ThreeDHelper::getDefaultCameraGeometry() );
- if( xSceneProperties.is() )
- xSceneProperties->getPropertyValue( C2U( "D3DCameraGeometry" ) ) >>= aCG;
-
- ::basegfx::B3DVector aVPN( BaseGFXHelper::Direction3DToB3DVector( aCG.vpn ) );
- ::basegfx::B3DVector aVUP( BaseGFXHelper::Direction3DToB3DVector( aCG.vup ) );
-
- //normalize vectors:
- aVPN.normalize();
- aVUP.normalize();
-
- ::basegfx::B3DVector aCross = ::basegfx::cross( aVUP, aVPN );
-
- //first line is VUP x VPN
- aCameraMatrix.Line1.Column1 = aCross[0];
- aCameraMatrix.Line1.Column2 = aCross[1];
- aCameraMatrix.Line1.Column3 = aCross[2];
- aCameraMatrix.Line1.Column4 = 0.0;
-
- //second line is VUP
- aCameraMatrix.Line2.Column1 = aVUP[0];
- aCameraMatrix.Line2.Column2 = aVUP[1];
- aCameraMatrix.Line2.Column3 = aVUP[2];
- aCameraMatrix.Line2.Column4 = 0.0;
-
- //third line is VPN
- aCameraMatrix.Line3.Column1 = aVPN[0];
- aCameraMatrix.Line3.Column2 = aVPN[1];
- aCameraMatrix.Line3.Column3 = aVPN[2];
- aCameraMatrix.Line3.Column4 = 0.0;
-
- //fourth line is 0 0 0 1
- aCameraMatrix.Line4.Column1 = 0.0;
- aCameraMatrix.Line4.Column2 = 0.0;
- aCameraMatrix.Line4.Column3 = 0.0;
- aCameraMatrix.Line4.Column4 = 1.0;
-
- return BaseGFXHelper::HomogenMatrixToB3DHomMatrix( aCameraMatrix );
-}
-
-double lcl_shiftAngleToIntervalMinusPiToPi( double fAngleRad )
-{
- //valid range: ]-Pi,Pi]
- while( fAngleRad<=-F_PI )
- fAngleRad+=(2*F_PI);
- while( fAngleRad>F_PI )
- fAngleRad-=(2*F_PI);
- return fAngleRad;
-}
-
-void lcl_shiftAngleToIntervalMinus180To180( sal_Int32& rnAngleDegree )
-{
- //valid range: ]-180,180]
- while( rnAngleDegree<=-180 )
- rnAngleDegree+=360;
- while( rnAngleDegree>180 )
- rnAngleDegree-=360;
-}
-
-void lcl_shiftAngleToIntervalZeroTo360( sal_Int32& rnAngleDegree )
-{
- //valid range: [0,360[
- while( rnAngleDegree<0 )
- rnAngleDegree+=360;
- while( rnAngleDegree>=360 )
- rnAngleDegree-=360;
-}
-
-void lcl_ensureIntervalMinus1To1( double& rSinOrCos )
-{
- if (rSinOrCos < -1.0)
- rSinOrCos = -1.0;
- else if (rSinOrCos > 1.0)
- rSinOrCos = 1.0;
-}
-
-bool lcl_isSinZero( double fAngleRad )
-{
- return ::basegfx::fTools::equalZero( sin(fAngleRad), 0.0000001 );
-}
-bool lcl_isCosZero( double fAngleRad )
-{
- return ::basegfx::fTools::equalZero( cos(fAngleRad), 0.0000001 );
-}
-
-}
-
-void ThreeDHelper::convertElevationRotationDegToXYZAngleRad(
- sal_Int32 nElevationDeg, sal_Int32 nRotationDeg,
- double& rfXAngleRad, double& rfYAngleRad, double& rfZAngleRad)
-{
- // for a description of the algorithm see issue 72994
- //http://www.openoffice.org/issues/show_bug.cgi?id=72994
- //http://www.openoffice.org/nonav/issues/showattachment.cgi/50608/DescriptionCorrected.odt
-
- lcl_shiftAngleToIntervalZeroTo360( nElevationDeg );
- lcl_shiftAngleToIntervalZeroTo360( nRotationDeg );
-
- double& x = rfXAngleRad;
- double& y = rfYAngleRad;
- double& z = rfZAngleRad;
-
- double E = F_PI*nElevationDeg/180; //elevation in Rad
- double R = F_PI*nRotationDeg/180; //rotation in Rad
-
- if( (nRotationDeg == 0 || nRotationDeg == 180 )
- && ( nElevationDeg == 90 || nElevationDeg == 270 ) )
- {
- //sR==0 && cE==0
- z = 0.0;
- //element 23
- double f23 = cos(R)*sin(E);
- if(f23>0)
- x = F_PI/2;
- else
- x = -F_PI/2;
- y = R;
- }
- else if( ( nRotationDeg == 90 || nRotationDeg == 270 )
- && ( nElevationDeg == 90 || nElevationDeg == 270 ) )
- {
- //cR==0 && cE==0
- z = F_PI/2;
- if( sin(R)>0 )
- x = F_PI/2.0;
- else
- x = -F_PI/2.0;
-
- if( (sin(R)*sin(E))>0 )
- y = 0.0;
- else
- y = F_PI;
- }
- else if( (nRotationDeg == 0 || nRotationDeg == 180 )
- && ( nElevationDeg == 0 || nElevationDeg == 180 ) )
- {
- //sR==0 && sE==0
- z = 0.0;
- y = R;
- x = E;
- }
- else if( ( nRotationDeg == 90 || nRotationDeg == 270 )
- && ( nElevationDeg == 0 || nElevationDeg == 180 ) )
- {
- //cR==0 && sE==0
- z = 0.0;
-
- if( (sin(R)/cos(E))>0 )
- y = F_PI/2;
- else
- y = -F_PI/2;
-
- if( (cos(E))>0 )
- x = 0;
- else
- x = F_PI;
- }
- else if ( nElevationDeg == 0 || nElevationDeg == 180 )
- {
- //sR!=0 cR!=0 sE==0
- z = 0.0;
- x = E;
- y = R;
- //use element 13 for sign
- if((cos(x)*sin(y)*sin(R))<0.0)
- y *= -1.0;
- }
- else if ( nElevationDeg == 90 || nElevationDeg == 270 )
- {
- //sR!=0 cR!=0 cE==0
- //element 12 + 22 --> y=0 or F_PI and x=+-F_PI/2
- //-->element 13/23:
- z = atan(sin(R)/(cos(R)*sin(E)));
- //use element 13 for sign for x
- if( (sin(R)*sin(z))>0.0 )
- x = F_PI/2;
- else
- x = -F_PI/2;
- //use element 21 for y
- if( (sin(R)*sin(E)*sin(z))>0.0)
- y = 0.0;
- else
- y = F_PI;
- }
- else if ( nRotationDeg == 0 || nRotationDeg == 180 )
- {
- //sE!=0 cE!=0 sR==0
- z = 0.0;
- x = E;
- y = R;
- double f23 = cos(R)*sin(E);
- if( (f23 * sin(x)) < 0.0 )
- x *= -1.0; //todo ??
- }
- else if (nRotationDeg == 90 || nRotationDeg == 270)
- {
- //sE!=0 cE!=0 cR==0
- //z = +- F_PI/2;
- //x = +- F_PI/2;
- z = F_PI/2;
- x = F_PI/2;
- double sR = sin(R);
- if( sR<0.0 )
- x *= -1.0; //different signs for x and z
-
- //use element 21:
- double cy = sR*sin(E)/sin(z);
- lcl_ensureIntervalMinus1To1(cy);
- y = acos(cy);
-
- //use element 22 for sign:
- if( (sin(x)*sin(y)*sin(z)*cos(E))<0.0)
- y *= -1.0;
- }
- else
- {
- z = atan(tan(R) * sin(E));
- if(cos(z)==0.0)
- {
- OSL_FAIL("calculation error in ThreeDHelper::convertElevationRotationDegToXYZAngleRad");
- return;
- }
- double cy = cos(R)/cos(z);
- lcl_ensureIntervalMinus1To1(cy);
- y = acos(cy);
-
- //element 12 in 23
- double fDenominator = cos(z)*(1.0-pow(sin(y),2));
- if(fDenominator==0.0)
- {
- OSL_FAIL("calculation error in ThreeDHelper::convertElevationRotationDegToXYZAngleRad");
- return;
- }
- double sx = cos(R)*sin(E)/fDenominator;
- lcl_ensureIntervalMinus1To1(sx);
- x = asin( sx );
-
- //use element 13 for sign:
- double f13a = cos(x)*cos(z)*sin(y);
- double f13b = sin(R)-sx*sin(z);
- if( (f13b*f13a)<0.0 )
- {
- //change x or y
- //use element 22 for further investigations:
- //try
- y *= -1;
- double f22a = cos(x)*cos(z);
- double f22b = cos(E)-(sx*sin(y)*sin(z));
- if( (f22a*f22b)<0.0 )
- {
- y *= -1;
- x=(F_PI-x);
- }
- }
- else
- {
- //change nothing or both
- //use element 22 for further investigations:
- double f22a = cos(x)*cos(z);
- double f22b = cos(E)-(sx*sin(y)*sin(z));
- if( (f22a*f22b)<0.0 )
- {
- y *= -1;
- x=(F_PI-x);
- }
- }
- }
-}
-
-void ThreeDHelper::convertXYZAngleRadToElevationRotationDeg(
- sal_Int32& rnElevationDeg, sal_Int32& rnRotationDeg,
- double fXRad, double fYRad, double fZRad)
-{
- // for a description of the algorithm see issue 72994
- //http://www.openoffice.org/issues/show_bug.cgi?id=72994
- //http://www.openoffice.org/nonav/issues/showattachment.cgi/50608/DescriptionCorrected.odt
-
- double R = 0.0; //Rotation in Rad
- double E = 0.0; //Elevation in Rad
-
- double& x = fXRad;
- double& y = fYRad;
- double& z = fZRad;
-
- double f11 = cos(y)*cos(z);
-
- if( lcl_isSinZero(y) )
- {
- //siny == 0
-
- if( lcl_isCosZero(x) )
- {
- //siny == 0 && cosx == 0
-
- if( lcl_isSinZero(z) )
- {
- //siny == 0 && cosx == 0 && sinz == 0
- //example: x=+-90 y=0oder180 z=0(oder180)
-
- //element 13+11
- if( f11 > 0 )
- R = 0.0;
- else
- R = F_PI;
-
- //element 23
- double f23 = cos(z)*sin(x) / cos(R);
- if( f23 > 0 )
- E = F_PI/2.0;
- else
- E = -F_PI/2.0;
- }
- else if( lcl_isCosZero(z) )
- {
- //siny == 0 && cosx == 0 && cosz == 0
- //example: x=+-90 y=0oder180 z=+-90
-
- double f13 = sin(x)*sin(z);
- //element 13+11
- if( f13 > 0 )
- R = F_PI/2.0;
- else
- R = -F_PI/2.0;
-
- //element 21
- double f21 = cos(y)*sin(z) / sin(R);
- if( f21 > 0 )
- E = F_PI/2.0;
- else
- E = -F_PI/2.0;
- }
- else
- {
- //siny == 0 && cosx == 0 && cosz != 0 && sinz != 0
- //element 11 && 13
- double f13 = sin(x)*sin(z);
- R = atan( f13/f11 );
-
- if(f11<0)
- R+=F_PI;
-
- //element 23
- double f23 = cos(z)*sin(x);
- if( f23/cos(R) > 0 )
- E = F_PI/2.0;
- else
- E = -F_PI/2.0;
- }
- }
- else if( lcl_isSinZero(x) )
- {
- //sinY==0 sinX==0
- //element 13+11
- if( f11 > 0 )
- R = 0.0;
- else
- R = F_PI;
-
- double f22 = cos(x)*cos(z);
- if( f22 > 0 )
- E = 0.0;
- else
- E = F_PI;
- }
- else if( lcl_isSinZero(z) )
- {
- //sinY==0 sinZ==0 sinx!=0 cosx!=0
- //element 13+11
- if( f11 > 0 )
- R = 0.0;
- else
- R = F_PI;
-
- //element 22 && 23
- double f22 = cos(x)*cos(z);
- double f23 = cos(z)*sin(x);
- E = atan( f23/(f22*cos(R)) );
- if( (f22*cos(E))<0 )
- E+=F_PI;
- }
- else if( lcl_isCosZero(z) )
- {
- //sinY == 0 && cosZ == 0 && cosx != 0 && sinx != 0
- double f13 = sin(x)*sin(z);
- //element 13+11
- if( f13 > 0 )
- R = F_PI/2.0;
- else
- R = -F_PI/2.0;
-
- //element 21+22
- double f21 = cos(y)*sin(z);
- if( f21/sin(R) > 0 )
- E = F_PI/2.0;
- else
- E = -F_PI/2.0;
- }
- else
- {
- //sinY == 0 && all other !=0
- double f13 = sin(x)*sin(z);
- R = atan( f13/f11 );
- if( (f11*cos(R))<0.0 )
- R+=F_PI;
-
- double f22 = cos(x)*cos(z);
- if( !lcl_isCosZero(R) )
- E = atan( cos(z)*sin(x) /( f22*cos(R) ) );
- else
- E = atan( cos(y)*sin(z) /( f22*sin(R) ) );
- if( (f22*cos(E))<0 )
- E+=F_PI;
- }
- }
- else if( lcl_isCosZero(y) )
- {
- //cosY==0
-
- double f13 = sin(x)*sin(z)+cos(x)*cos(z)*sin(y);
- if( f13 >= 0 )
- R = F_PI/2.0;
- else
- R = -F_PI/2.0;
-
- double f22 = cos(x)*cos(z)+sin(x)*sin(y)*sin(z);
- if( f22 >= 0 )
- E = 0.0;
- else
- E = F_PI;
- }
- else if( lcl_isSinZero(x) )
- {
- //cosY!=0 sinY!=0 sinX=0
- if( lcl_isSinZero(z) )
- {
- //cosY!=0 sinY!=0 sinX=0 sinZ=0
- double f13 = cos(x)*cos(z)*sin(y);
- R = atan( f13/f11 );
- //R = asin(f13);
- if( f11<0 )
- R+=F_PI;
-
- double f22 = cos(x)*cos(z);
- if( f22>0 )
- E = 0.0;
- else
- E = F_PI;
- }
- else if( lcl_isCosZero(z) )
- {
- //cosY!=0 sinY!=0 sinX=0 cosZ=0
- R = x;
- E = y;//or -y
- //use 23 for 'signs'
- double f23 = -1.0*cos(x)*sin(y)*sin(z);
- if( (f23*cos(R)*sin(E))<0.0 )
- {
- //change R or E
- E = -y;
- }
- }
- else
- {
- //cosY!=0 sinY!=0 sinX=0 sinZ!=0 cosZ!=0
- double f13 = cos(x)*cos(z)*sin(y);
- R = atan( f13/f11 );
-
- if( f11<0 )
- R+=F_PI;
-
- double f21 = cos(y)*sin(z);
- double f22 = cos(x)*cos(z);
- E = atan(f21/(f22*sin(R)) );
-
- if( (f22*cos(E))<0.0 )
- E+=F_PI;
- }
- }
- else if( lcl_isCosZero(x) )
- {
- //cosY!=0 sinY!=0 cosX=0
-
- if( lcl_isSinZero(z) )
- {
- //cosY!=0 sinY!=0 cosX=0 sinZ=0
- R=0;//13 -> R=0 or F_PI
- if( f11<0.0 )
- R=F_PI;
- E=F_PI/2;//22 -> E=+-F_PI/2
- //use element 11 and 23 for sign
- double f23 = cos(z)*sin(x);
- if( (f11*f23*sin(E))<0.0 )
- E=-F_PI/2.0;
- }
- else if( lcl_isCosZero(z) )
- {
- //cosY!=0 sinY!=0 cosX=0 cosZ=0
- //element 11 & 13:
- if( (sin(x)*sin(z))>0.0 )
- R=F_PI/2.0;
- else
- R=-F_PI/2.0;
- //element 22:
- E=acos( sin(x)*sin(y)*sin(z));
- //use element 21 for sign:
- if( (cos(y)*sin(z)*sin(R)*sin(E))<0.0 )
- E*=-1.0;
- }
- else
- {
- //cosY!=0 sinY!=0 cosX=0 sinZ!=0 cosZ!=0
- //element 13/11
- R = atan( sin(x)*sin(z)/(cos(y)*cos(z)) );
- //use 13 for 'sign'
- if( (sin(x)*sin(z))<0.0 )
- R += F_PI;
- //element 22
- E = acos(sin(x)*sin(y)*sin(z) );
- //use 21 for sign
- if( (cos(y)*sin(z)*sin(R)*sin(E))<0.0 )
- E*=-1.0;
- }
- }
- else if( lcl_isSinZero(z) )
- {
- //cosY!=0 sinY!=0 sinX!=0 cosX!=0 sinZ=0
- //element 11
- R=y;
- //use elenment 13 for sign
- if( (cos(x)*cos(z)*sin(y)*sin(R))<0.0 )
- R*=-1.0;
- //element 22
- E = acos( cos(x)*cos(z) );
- //use element 23 for sign
- if( (cos(z)*sin(x)*cos(R)*sin(E))<0.0 )
- E*=-1.0;
- }
- else if( lcl_isCosZero(z) )
- {
- //cosY!=0 sinY!=0 sinX!=0 cosX!=0 cosZ=0
- //element 21/23
- R=atan(-cos(y)/(cos(x)*sin(y)));
- //use element 13 for 'sign'
- if( (sin(x)*sin(z)*sin(R))<0.0 )
- R+=F_PI;
- //element 21/22
- E=atan( cos(y)*sin(z)/(sin(R)*sin(x)*sin(y)*sin(z)) );
- //use element 23 for 'sign'
- if( (-cos(x)*sin(y)*sin(z)*cos(R)*sin(E))<0.0 )
- E+=F_PI;
- }
- else
- {
- //cosY!=0 sinY!=0 sinX!=0 cosX!=0 sinZ!=0 cosZ!=0
- //13/11:
- double f13 = sin(x)*sin(z)+cos(x)*cos(z)*sin(y);
- R = atan( f13/ f11 );
- if(f11<0.0)
- R+=F_PI;
- double f22 = cos(x)*cos(z)+sin(x)*sin(y)*sin(z);
- double f23 = cos(x)*sin(y)*sin(z)-cos(z)*sin(x);
- //23/22:
- E = atan( -1.0*f23/(f22*cos(R)) );
- if(f22<0.0)
- E+=F_PI;
- }
-
- rnElevationDeg = ::basegfx::fround( BaseGFXHelper::Rad2Deg( E ) );
- rnRotationDeg = ::basegfx::fround( BaseGFXHelper::Rad2Deg( R ) );
-}
-
-double ThreeDHelper::getValueClippedToRange( double fAngle, const double& fPositivLimit )
-{
- if( fAngle<-1*fPositivLimit )
- fAngle=-1*fPositivLimit;
- else if( fAngle>fPositivLimit )
- fAngle=fPositivLimit;
- return fAngle;
-}
-
-double ThreeDHelper::getXDegreeAngleLimitForRightAngledAxes()
-{
- return 90.0;
-}
-
-double ThreeDHelper::getYDegreeAngleLimitForRightAngledAxes()
-{
- return 45.0;
-}
-
-void ThreeDHelper::adaptRadAnglesForRightAngledAxes( double& rfXAngleRad, double& rfYAngleRad )
-{
- rfXAngleRad = ThreeDHelper::getValueClippedToRange(rfXAngleRad, BaseGFXHelper::Deg2Rad(ThreeDHelper::getXDegreeAngleLimitForRightAngledAxes()) );
- rfYAngleRad = ThreeDHelper::getValueClippedToRange(rfYAngleRad, BaseGFXHelper::Deg2Rad(ThreeDHelper::getYDegreeAngleLimitForRightAngledAxes()) );
-}
-
-void ThreeDHelper::getRotationAngleFromDiagram(
- const Reference< beans::XPropertySet >& xSceneProperties, double& rfXAngleRad, double& rfYAngleRad, double& rfZAngleRad )
-{
- //takes the camera and the transformation matrix into account
-
- rfXAngleRad = rfYAngleRad = rfZAngleRad = 0.0;
-
- if( !xSceneProperties.is() )
- return;
-
- //get camera rotation
- ::basegfx::B3DHomMatrix aFixCameraRotationMatrix( lcl_getCameraMatrix( xSceneProperties ) );
- BaseGFXHelper::ReduceToRotationMatrix( aFixCameraRotationMatrix );
-
- //get scene rotation
- ::basegfx::B3DHomMatrix aSceneRotation;
- {
- drawing::HomogenMatrix aHomMatrix;
- if( xSceneProperties->getPropertyValue( C2U("D3DTransformMatrix")) >>= aHomMatrix )
- {
- aSceneRotation = BaseGFXHelper::HomogenMatrixToB3DHomMatrix( aHomMatrix );
- BaseGFXHelper::ReduceToRotationMatrix( aSceneRotation );
- }
- }
-
- ::basegfx::B3DHomMatrix aResultRotation = aFixCameraRotationMatrix * aSceneRotation;
- ::basegfx::B3DTuple aRotation( BaseGFXHelper::GetRotationFromMatrix( aResultRotation ) );
-
- rfXAngleRad = lcl_shiftAngleToIntervalMinusPiToPi(aRotation.getX());
- rfYAngleRad = lcl_shiftAngleToIntervalMinusPiToPi(aRotation.getY());
- rfZAngleRad = lcl_shiftAngleToIntervalMinusPiToPi(aRotation.getZ());
-
- if(rfZAngleRad<(-F_PI/2) || rfZAngleRad>(F_PI/2))
- {
- rfZAngleRad-=F_PI;
- rfXAngleRad-=F_PI;
- rfYAngleRad=(F_PI-rfYAngleRad);
-
- rfXAngleRad = lcl_shiftAngleToIntervalMinusPiToPi(rfXAngleRad);
- rfYAngleRad = lcl_shiftAngleToIntervalMinusPiToPi(rfYAngleRad);
- rfZAngleRad = lcl_shiftAngleToIntervalMinusPiToPi(rfZAngleRad);
- }
-}
-
-void ThreeDHelper::switchRightAngledAxes( const Reference< beans::XPropertySet >& xSceneProperties, sal_Bool bRightAngledAxes, bool bRotateLights )
-{
- try
- {
- if( xSceneProperties.is() )
- {
- sal_Bool bOldRightAngledAxes = sal_False;
- xSceneProperties->getPropertyValue( C2U("RightAngledAxes")) >>= bOldRightAngledAxes;
- if( bOldRightAngledAxes!=bRightAngledAxes)
- {
- xSceneProperties->setPropertyValue( C2U("RightAngledAxes"), uno::makeAny( bRightAngledAxes ));
- if( bRotateLights )
- {
- if(bRightAngledAxes)
- {
- ::basegfx::B3DHomMatrix aInverseRotation( lcl_getInverseRotationMatrix( xSceneProperties ) );
- lcl_rotateLights( aInverseRotation, xSceneProperties );
- }
- else
- {
- ::basegfx::B3DHomMatrix aCompleteRotation( lcl_getCompleteRotationMatrix( xSceneProperties ) );
- lcl_rotateLights( aCompleteRotation, xSceneProperties );
- }
- }
- }
- }
- }
- catch( const uno::Exception & ex )
- {
- ASSERT_EXCEPTION( ex );
- }
-}
-
-void ThreeDHelper::setRotationAngleToDiagram(
- const Reference< beans::XPropertySet >& xSceneProperties
- , double fXAngleRad, double fYAngleRad, double fZAngleRad )
-{
- //the rotation of the camera is not touched but taken into account
- //the rotation difference is applied to the transformation matrix
-
- //the light sources will be adapted also
-
- if( !xSceneProperties.is() )
- return;
-
- try
- {
- //remind old rotation for adaption of light directions
- ::basegfx::B3DHomMatrix aInverseOldRotation( lcl_getInverseRotationMatrix( xSceneProperties ) );
-
- ::basegfx::B3DHomMatrix aInverseCameraRotation;
- {
- ::basegfx::B3DTuple aR( BaseGFXHelper::GetRotationFromMatrix(
- lcl_getCameraMatrix( xSceneProperties ) ) );
- aInverseCameraRotation.rotate( 0.0, 0.0, -aR.getZ() );
- aInverseCameraRotation.rotate( 0.0, -aR.getY(), 0.0 );
- aInverseCameraRotation.rotate( -aR.getX(), 0.0, 0.0 );
- }
-
- ::basegfx::B3DHomMatrix aCumulatedRotation;
- aCumulatedRotation.rotate( fXAngleRad, fYAngleRad, fZAngleRad );
-
- //calculate new scene matrix
- ::basegfx::B3DHomMatrix aSceneRotation = aInverseCameraRotation*aCumulatedRotation;
- BaseGFXHelper::ReduceToRotationMatrix( aSceneRotation );
-
- //set new rotation to transformation matrix
- xSceneProperties->setPropertyValue(
- C2U("D3DTransformMatrix"), uno::makeAny( BaseGFXHelper::B3DHomMatrixToHomogenMatrix( aSceneRotation )));
-
- //rotate lights if RightAngledAxes are not set or not supported
- sal_Bool bRightAngledAxes = sal_False;
- xSceneProperties->getPropertyValue( C2U("RightAngledAxes")) >>= bRightAngledAxes;
- uno::Reference< chart2::XDiagram > xDiagram( xSceneProperties, uno::UNO_QUERY );
- if(!bRightAngledAxes || !ChartTypeHelper::isSupportingRightAngledAxes(
- DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) ) )
- {
- ::basegfx::B3DHomMatrix aNewRotation;
- aNewRotation.rotate( fXAngleRad, fYAngleRad, fZAngleRad );
- lcl_rotateLights( aNewRotation*aInverseOldRotation, xSceneProperties );
- }
- }
- catch( const uno::Exception & ex )
- {
- ASSERT_EXCEPTION( ex );
- }
-}
-
-void ThreeDHelper::getRotationFromDiagram( const uno::Reference< beans::XPropertySet >& xSceneProperties
- , sal_Int32& rnHorizontalAngleDegree, sal_Int32& rnVerticalAngleDegree )
-{
- double fXAngle, fYAngle, fZAngle;
- ThreeDHelper::getRotationAngleFromDiagram( xSceneProperties, fXAngle, fYAngle, fZAngle );
-
- if( !lcl_isRightAngledAxesSetAndSupported( xSceneProperties ) )
- {
- ThreeDHelper::convertXYZAngleRadToElevationRotationDeg(
- rnHorizontalAngleDegree, rnVerticalAngleDegree, fXAngle, fYAngle, fZAngle);
- rnVerticalAngleDegree*=-1;
- }
- else
- {
- fXAngle = BaseGFXHelper::Rad2Deg( fXAngle );
- fYAngle = BaseGFXHelper::Rad2Deg( fYAngle );
- fZAngle = BaseGFXHelper::Rad2Deg( fZAngle );
-
- rnHorizontalAngleDegree = ::basegfx::fround(fXAngle);
- rnVerticalAngleDegree = ::basegfx::fround(-1.0*fYAngle);
- //nZRotation = ::basegfx::fround(-1.0*fZAngle);
- }
-
- lcl_shiftAngleToIntervalMinus180To180( rnHorizontalAngleDegree );
- lcl_shiftAngleToIntervalMinus180To180( rnVerticalAngleDegree );
-}
-
-void ThreeDHelper::setRotationToDiagram( const uno::Reference< beans::XPropertySet >& xSceneProperties
- , sal_Int32 nHorizontalAngleDegree, sal_Int32 nVerticalYAngleDegree )
-{
- //todo: x and y is not equal to horz and vert in case of RightAngledAxes==false
- double fXAngle = BaseGFXHelper::Deg2Rad( nHorizontalAngleDegree );
- double fYAngle = BaseGFXHelper::Deg2Rad( -1*nVerticalYAngleDegree );
- double fZAngle = 0.0;
-
- if( !lcl_isRightAngledAxesSetAndSupported( xSceneProperties ) )
- ThreeDHelper::convertElevationRotationDegToXYZAngleRad(
- nHorizontalAngleDegree, -1*nVerticalYAngleDegree, fXAngle, fYAngle, fZAngle );
-
- ThreeDHelper::setRotationAngleToDiagram( xSceneProperties, fXAngle, fYAngle, fZAngle );
-}
-
-void ThreeDHelper::getCameraDistanceRange( double& rfMinimumDistance, double& rfMaximumDistance )
-{
- rfMinimumDistance = 3.0/4.0*FIXED_SIZE_FOR_3D_CHART_VOLUME;//empiric value
- rfMaximumDistance = 20.0*FIXED_SIZE_FOR_3D_CHART_VOLUME;//empiric value
-}
-
-void ThreeDHelper::ensureCameraDistanceRange( double& rfCameraDistance )
-{
- double fMin, fMax;
- getCameraDistanceRange( fMin, fMax );
- if( rfCameraDistance < fMin )
- rfCameraDistance = fMin;
- if( rfCameraDistance > fMax )
- rfCameraDistance = fMax;
-}
-
-double ThreeDHelper::getCameraDistance(
- const Reference< beans::XPropertySet >& xSceneProperties )
-{
- double fCameraDistance = FIXED_SIZE_FOR_3D_CHART_VOLUME;
-
- if( !xSceneProperties.is() )
- return fCameraDistance;
-
- try
- {
- drawing::CameraGeometry aCG( ThreeDHelper::getDefaultCameraGeometry() );
- xSceneProperties->getPropertyValue( C2U( "D3DCameraGeometry" ) ) >>= aCG;
- ::basegfx::B3DVector aVRP( BaseGFXHelper::Position3DToB3DVector( aCG.vrp ) );
- fCameraDistance = aVRP.getLength();
-
- ensureCameraDistanceRange( fCameraDistance );
- }
- catch( const uno::Exception & ex )
- {
- ASSERT_EXCEPTION( ex );
- }
- return fCameraDistance;
-}
-
-void ThreeDHelper::setCameraDistance(
- const Reference< beans::XPropertySet >& xSceneProperties, double fCameraDistance )
-{
- if( !xSceneProperties.is() )
- return;
-
- try
- {
- if( fCameraDistance <= 0 )
- fCameraDistance = FIXED_SIZE_FOR_3D_CHART_VOLUME;
-
- drawing::CameraGeometry aCG( ThreeDHelper::getDefaultCameraGeometry() );
- xSceneProperties->getPropertyValue( C2U( "D3DCameraGeometry" ) ) >>= aCG;
- ::basegfx::B3DVector aVRP( BaseGFXHelper::Position3DToB3DVector( aCG.vrp ) );
- if( ::basegfx::fTools::equalZero( aVRP.getLength() ) )
- aVRP = ::basegfx::B3DVector(0,0,1);
- aVRP.setLength(fCameraDistance);
- aCG.vrp = BaseGFXHelper::B3DVectorToPosition3D( aVRP );
-
- xSceneProperties->setPropertyValue( C2U("D3DCameraGeometry"), uno::makeAny( aCG ));
- }
- catch( const uno::Exception & ex )
- {
- ASSERT_EXCEPTION( ex );
- }
-}
-
-double ThreeDHelper::CameraDistanceToPerspective( double fCameraDistance )
-{
- double fRet = fCameraDistance;
- double fMin, fMax;
- ThreeDHelper::getCameraDistanceRange( fMin, fMax );
- //fMax <-> 0; fMin <->100
- //a/x + b = y
- double a = 100.0*fMax*fMin/(fMax-fMin);
- double b = -a/fMax;
-
- fRet = a/fCameraDistance + b;
-
- return fRet;
-}
-
-double ThreeDHelper::PerspectiveToCameraDistance( double fPerspective )
-{
- double fRet = fPerspective;
- double fMin, fMax;
- ThreeDHelper::getCameraDistanceRange( fMin, fMax );
- //fMax <-> 0; fMin <->100
- //a/x + b = y
- double a = 100.0*fMax*fMin/(fMax-fMin);
- double b = -a/fMax;
-
- fRet = a/(fPerspective - b);
-
- return fRet;
-}
-
-ThreeDLookScheme ThreeDHelper::detectScheme( const uno::Reference< XDiagram >& xDiagram )
-{
- ThreeDLookScheme aScheme = ThreeDLookScheme_Unknown;
-
- sal_Int32 nRoundedEdges;
- sal_Int32 nObjectLines;
- ThreeDHelper::getRoundedEdgesAndObjectLines( xDiagram, nRoundedEdges, nObjectLines );
-
- //get shade mode and light settings:
- drawing::ShadeMode aShadeMode( drawing::ShadeMode_SMOOTH );
- uno::Reference< beans::XPropertySet > xDiagramProps( xDiagram, uno::UNO_QUERY );
- try
- {
- if( xDiagramProps.is() )
- xDiagramProps->getPropertyValue( C2U( "D3DSceneShadeMode" ) )>>= aShadeMode;
- }
- catch( uno::Exception & ex )
- {
- ASSERT_EXCEPTION( ex );
- }
-
- if( lcl_isSimpleScheme( aShadeMode, nRoundedEdges, nObjectLines, xDiagram ) )
- {
- if( lcl_isSimpleLightScheme(xDiagramProps) )
- aScheme = ThreeDLookScheme_Simple;
- }
- else if( lcl_isRealisticScheme( aShadeMode, nRoundedEdges, nObjectLines ) )
- {
- if( lcl_isRealisticLightScheme(xDiagramProps) )
- aScheme = ThreeDLookScheme_Realistic;
- }
-
- return aScheme;
-}
-
-void ThreeDHelper::setScheme( const uno::Reference< XDiagram >& xDiagram, ThreeDLookScheme aScheme )
-{
- if( aScheme == ThreeDLookScheme_Unknown )
- return;
-
- drawing::ShadeMode aShadeMode;
- sal_Int32 nRoundedEdges;
- sal_Int32 nObjectLines;
-
- if( aScheme == ThreeDLookScheme_Simple )
- lcl_setSimpleScheme(aShadeMode,nRoundedEdges,nObjectLines,xDiagram);
- else
- lcl_setRealisticScheme(aShadeMode,nRoundedEdges,nObjectLines);
-
- try
- {
- ThreeDHelper::setRoundedEdgesAndObjectLines( xDiagram, nRoundedEdges, nObjectLines );
-
- uno::Reference< beans::XPropertySet > xProp( xDiagram, uno::UNO_QUERY );
- if( xProp.is() )
- {
- drawing::ShadeMode aOldShadeMode;
- if( ! ( (xProp->getPropertyValue( C2U( "D3DSceneShadeMode" ) )>>=aOldShadeMode) &&
- aOldShadeMode == aShadeMode ))
- {
- xProp->setPropertyValue( C2U( "D3DSceneShadeMode" ), uno::makeAny( aShadeMode ));
- }
- }
-
- lcl_setLightsForScheme( xProp, aScheme );
- }
- catch( uno::Exception & ex )
- {
- ASSERT_EXCEPTION( ex );
- }
-
-}
-
-void ThreeDHelper::set3DSettingsToDefault( const uno::Reference< beans::XPropertySet >& xSceneProperties )
-{
- Reference< beans::XPropertyState > xState( xSceneProperties, uno::UNO_QUERY );
- if(xState.is())
- {
- xState->setPropertyToDefault( C2U("D3DSceneDistance"));
- xState->setPropertyToDefault( C2U("D3DSceneFocalLength"));
- }
- ThreeDHelper::setDefaultRotation( xSceneProperties );
- ThreeDHelper::setDefaultIllumination( xSceneProperties );
-}
-
-void ThreeDHelper::setDefaultRotation( const uno::Reference< beans::XPropertySet >& xSceneProperties, bool bPieOrDonut )
-{
- if( !xSceneProperties.is() )
- return;
-
- drawing::CameraGeometry aCameraGeo( ThreeDHelper::getDefaultCameraGeometry( bPieOrDonut ) );
- xSceneProperties->setPropertyValue( C2U("D3DCameraGeometry"), uno::makeAny( aCameraGeo ));
-
- ::basegfx::B3DHomMatrix aSceneRotation;
- if( bPieOrDonut )
- aSceneRotation.rotate( -F_PI/3.0, 0, 0 );
- xSceneProperties->setPropertyValue( C2U("D3DTransformMatrix"),
- uno::makeAny( BaseGFXHelper::B3DHomMatrixToHomogenMatrix( aSceneRotation )));
-}
-
-void ThreeDHelper::setDefaultRotation( const uno::Reference< beans::XPropertySet >& xSceneProperties )
-{
- bool bPieOrDonut( DiagramHelper::isPieOrDonutChart( uno::Reference< XDiagram >(xSceneProperties, uno::UNO_QUERY) ) );
- ThreeDHelper::setDefaultRotation( xSceneProperties, bPieOrDonut );
-}
-
-void ThreeDHelper::setDefaultIllumination( const uno::Reference< beans::XPropertySet >& xSceneProperties )
-{
- if( !xSceneProperties.is() )
- return;
-
- drawing::ShadeMode aShadeMode( drawing::ShadeMode_SMOOTH );
- try
- {
- xSceneProperties->getPropertyValue( C2U( "D3DSceneShadeMode" ) )>>= aShadeMode;
- xSceneProperties->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_1 ), uno::makeAny( sal_False ) );
- xSceneProperties->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_3 ), uno::makeAny( sal_False ) );
- xSceneProperties->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_4 ), uno::makeAny( sal_False ) );
- xSceneProperties->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_5 ), uno::makeAny( sal_False ) );
- xSceneProperties->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_6 ), uno::makeAny( sal_False ) );
- xSceneProperties->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_7 ), uno::makeAny( sal_False ) );
- xSceneProperties->setPropertyValue( C2U( UNO_NAME_3D_SCENE_LIGHTON_8 ), uno::makeAny( sal_False ) );
- }
- catch( uno::Exception & ex )
- {
- ASSERT_EXCEPTION( ex );
- }
-
- ThreeDLookScheme aScheme = (drawing::ShadeMode_FLAT==aShadeMode) ? ThreeDLookScheme_Simple : ThreeDLookScheme_Realistic;
- lcl_setLightsForScheme( xSceneProperties, aScheme );
-}
-
-void ThreeDHelper::getRoundedEdgesAndObjectLines(
- const uno::Reference< XDiagram > & xDiagram
- , sal_Int32& rnRoundedEdges, sal_Int32& rnObjectLines )
-{
- rnRoundedEdges = -1;
- rnObjectLines = -1;
- try
- {
- bool bDifferentRoundedEdges = false;
- bool bDifferentObjectLines = false;
-
- drawing::LineStyle aLineStyle( drawing::LineStyle_SOLID );
-
- ::std::vector< uno::Reference< XDataSeries > > aSeriesList(
- DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
- sal_Int32 nSeriesCount = static_cast<sal_Int32>( aSeriesList.size() );
-
- rtl::OUString aPercentDiagonalPropertyName( C2U( "PercentDiagonal" ) );
- rtl::OUString aBorderStylePropertyName( C2U( "BorderStyle" ) );
-
- for( sal_Int32 nS = 0; nS < nSeriesCount; ++nS )
- {
- uno::Reference< XDataSeries > xSeries( aSeriesList[nS] );
- uno::Reference< beans::XPropertySet > xProp( xSeries, uno::UNO_QUERY );
- if(!nS)
- {
- rnRoundedEdges = 0;
- try
- {
- sal_Int16 nPercentDiagonal = 0;
-
- xProp->getPropertyValue( aPercentDiagonalPropertyName ) >>= nPercentDiagonal;
- rnRoundedEdges = static_cast< sal_Int32 >( nPercentDiagonal );
-
- if( DataSeriesHelper::hasAttributedDataPointDifferentValue( xSeries
- , aPercentDiagonalPropertyName, uno::makeAny(nPercentDiagonal) ) )
- bDifferentRoundedEdges = true;
- }
- catch( uno::Exception& e )
- {
- ASSERT_EXCEPTION( e );
- bDifferentRoundedEdges = true;
- }
- try
- {
- xProp->getPropertyValue( aBorderStylePropertyName ) >>= aLineStyle;
-
- if( DataSeriesHelper::hasAttributedDataPointDifferentValue( xSeries
- , aBorderStylePropertyName, uno::makeAny(aLineStyle) ) )
- bDifferentObjectLines = true;
- }
- catch( uno::Exception& e )
- {
- ASSERT_EXCEPTION( e );
- bDifferentObjectLines = true;
- }
- }
- else
- {
- if( !bDifferentRoundedEdges )
- {
- sal_Int16 nPercentDiagonal = 0;
- xProp->getPropertyValue( aPercentDiagonalPropertyName ) >>= nPercentDiagonal;
- sal_Int32 nCurrentRoundedEdges = static_cast< sal_Int32 >( nPercentDiagonal );
- if(nCurrentRoundedEdges!=rnRoundedEdges
- || DataSeriesHelper::hasAttributedDataPointDifferentValue( xSeries
- , aPercentDiagonalPropertyName, uno::makeAny( static_cast< sal_Int16 >(rnRoundedEdges) ) ) )
- {
- bDifferentRoundedEdges = true;
- nCurrentRoundedEdges = -1;
- }
- }
-
- if( !bDifferentObjectLines )
- {
- drawing::LineStyle aCurrentLineStyle;
- xProp->getPropertyValue( aBorderStylePropertyName ) >>= aCurrentLineStyle;
- if(aCurrentLineStyle!=aLineStyle
- || DataSeriesHelper::hasAttributedDataPointDifferentValue( xSeries
- , aBorderStylePropertyName, uno::makeAny(aLineStyle) ) )
- bDifferentObjectLines = true;
- }
- }
- if( bDifferentRoundedEdges && bDifferentObjectLines )
- break;
- }
-
- //set rnObjectLines
- rnObjectLines = 0;
- if( bDifferentObjectLines )
- rnObjectLines = -1;
- else if( aLineStyle == drawing::LineStyle_SOLID )
- rnObjectLines = 1;
- }
- catch( uno::Exception& e )
- {
- ASSERT_EXCEPTION( e );
- }
-}
-
-void ThreeDHelper::setRoundedEdgesAndObjectLines(
- const uno::Reference< XDiagram > & xDiagram
- , sal_Int32 nRoundedEdges, sal_Int32 nObjectLines )
-{
- if( (nRoundedEdges<0||nRoundedEdges>100) && nObjectLines!=0 && nObjectLines!=1 )
- return;
-
- drawing::LineStyle aLineStyle( drawing::LineStyle_NONE );
- if(nObjectLines==1)
- aLineStyle = drawing::LineStyle_SOLID;
-
- uno::Any aALineStyle( uno::makeAny(aLineStyle));
- uno::Any aARoundedEdges( uno::makeAny( static_cast< sal_Int16 >( nRoundedEdges )));
-
- ::std::vector< uno::Reference< XDataSeries > > aSeriesList(
- DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
- sal_Int32 nSeriesCount = static_cast<sal_Int32>( aSeriesList.size() );
- for( sal_Int32 nS = 0; nS < nSeriesCount; ++nS )
- {
- uno::Reference< XDataSeries > xSeries( aSeriesList[nS] );
-
- if( nRoundedEdges>=0 && nRoundedEdges<=100 )
- DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints( xSeries, C2U( "PercentDiagonal" ), aARoundedEdges );
-
- if( nObjectLines==0 || nObjectLines==1 )
- DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints( xSeries, C2U( "BorderStyle" ), aALineStyle );
- }
-}
-
-CuboidPlanePosition ThreeDHelper::getAutomaticCuboidPlanePositionForStandardLeftWall( const Reference< beans::XPropertySet >& xSceneProperties )
-{
- CuboidPlanePosition eRet(CuboidPlanePosition_Left);
-
- double fXAngleRad=0.0; double fYAngleRad=0.0; double fZAngleRad=0.0;
- ThreeDHelper::getRotationAngleFromDiagram( xSceneProperties, fXAngleRad, fYAngleRad, fZAngleRad );
- if( lcl_isRightAngledAxesSetAndSupported( xSceneProperties ) )
- {
- ThreeDHelper::adaptRadAnglesForRightAngledAxes( fXAngleRad, fYAngleRad );
- fZAngleRad=0.0;
- }
- if( sin(fYAngleRad)>0.0 )
- eRet = CuboidPlanePosition_Right;
- return eRet;
-}
-
-CuboidPlanePosition ThreeDHelper::getAutomaticCuboidPlanePositionForStandardBackWall( const Reference< beans::XPropertySet >& xSceneProperties )
-{
- CuboidPlanePosition eRet(CuboidPlanePosition_Back);
-
- double fXAngleRad=0.0; double fYAngleRad=0.0; double fZAngleRad=0.0;
- ThreeDHelper::getRotationAngleFromDiagram( xSceneProperties, fXAngleRad, fYAngleRad, fZAngleRad );
- if( lcl_isRightAngledAxesSetAndSupported( xSceneProperties ) )
- {
- ThreeDHelper::adaptRadAnglesForRightAngledAxes( fXAngleRad, fYAngleRad );
- fZAngleRad=0.0;
- }
- if( cos(fXAngleRad)*cos(fYAngleRad)<0.0 )
- eRet = CuboidPlanePosition_Front;
- return eRet;
-}
-
-CuboidPlanePosition ThreeDHelper::getAutomaticCuboidPlanePositionForStandardBottom( const Reference< beans::XPropertySet >& xSceneProperties )
-{
- CuboidPlanePosition eRet(CuboidPlanePosition_Bottom);
-
- double fXAngleRad=0.0; double fYAngleRad=0.0; double fZAngleRad=0.0;
- ThreeDHelper::getRotationAngleFromDiagram( xSceneProperties, fXAngleRad, fYAngleRad, fZAngleRad );
- if( lcl_isRightAngledAxesSetAndSupported( xSceneProperties ) )
- {
- ThreeDHelper::adaptRadAnglesForRightAngledAxes( fXAngleRad, fYAngleRad );
- fZAngleRad=0.0;
- }
- if( sin(fXAngleRad)*cos(fYAngleRad)<0.0 )
- eRet = CuboidPlanePosition_Top;
- return eRet;
-}
-
-//.............................................................................
-} //namespace chart
-//.............................................................................
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */