diff options
Diffstat (limited to 'chart2/source/view/main/PlottingPositionHelper.cxx')
-rw-r--r-- | chart2/source/view/main/PlottingPositionHelper.cxx | 73 |
1 files changed, 44 insertions, 29 deletions
diff --git a/chart2/source/view/main/PlottingPositionHelper.cxx b/chart2/source/view/main/PlottingPositionHelper.cxx index 300ecaddb68b..dfbf38bbd90e 100644 --- a/chart2/source/view/main/PlottingPositionHelper.cxx +++ b/chart2/source/view/main/PlottingPositionHelper.cxx @@ -27,9 +27,7 @@ #include <com/sun/star/chart/TimeUnit.hpp> #include <com/sun/star/chart2/AxisType.hpp> -#include <com/sun/star/drawing/DoubleSequence.hpp> #include <com/sun/star/drawing/Position3D.hpp> -#include <com/sun/star/drawing/XShapes.hpp> #include <rtl/math.hxx> @@ -38,6 +36,8 @@ namespace chart using namespace ::com::sun::star; using namespace ::com::sun::star::chart2; +XTransformation2::~XTransformation2() {} + PlottingPositionHelper::PlottingPositionHelper() : m_bSwapXAndY( false ) , m_nXResolution( 1000 ) @@ -100,7 +100,7 @@ void PlottingPositionHelper::setScales( std::vector< ExplicitScaleData >&& rScal m_xTransformationLogicToScene = nullptr; } -uno::Reference< XTransformation > PlottingPositionHelper::getTransformationScaledLogicToScene() const +::chart::XTransformation2* PlottingPositionHelper::getTransformationScaledLogicToScene() const { //this is a standard transformation for a cartesian coordinate system @@ -108,7 +108,7 @@ uno::Reference< XTransformation > PlottingPositionHelper::getTransformationScale //we need to apply this transformation to each geometric object because of a bug/problem //of the old drawing layer (the UNO_NAME_3D_EXTRUDE_DEPTH is an integer value instead of a double ) - if(!m_xTransformationLogicToScene.is()) + if(!m_xTransformationLogicToScene) { ::basegfx::B3DHomMatrix aMatrix; double MinX = getLogicMinX(); @@ -162,9 +162,9 @@ uno::Reference< XTransformation > PlottingPositionHelper::getTransformationScale aMatrix = m_aMatrixScreenToScene*aMatrix; - m_xTransformationLogicToScene = new Linear3DTransformation(B3DHomMatrixToHomogenMatrix( aMatrix ),m_bSwapXAndY); + m_xTransformationLogicToScene.reset(new Linear3DTransformation(B3DHomMatrixToHomogenMatrix( aMatrix ), m_bSwapXAndY)); } - return m_xTransformationLogicToScene; + return m_xTransformationLogicToScene.get(); } drawing::Position3D PlottingPositionHelper::transformLogicToScene( @@ -185,16 +185,13 @@ drawing::Position3D PlottingPositionHelper::transformScaledLogicToScene( drawing::Position3D aPos( fX, fY, fZ); - uno::Reference< XTransformation > xTransformation = + ::chart::XTransformation2* pTransformation = getTransformationScaledLogicToScene(); - uno::Sequence< double > aSeq = - xTransformation->transform( Position3DToSequence(aPos) ); - return SequenceToPosition3D(aSeq); + return pTransformation->transform( aPos ); } awt::Point PlottingPositionHelper::transformSceneToScreenPosition( const drawing::Position3D& rScenePosition3D - , const uno::Reference< drawing::XShapes >& xSceneTarget - , ShapeFactory* pShapeFactory + , const rtl::Reference<SvxShapeGroupAnyD>& xSceneTarget , sal_Int32 nDimensionCount ) { //@todo would like to have a cheaper method to do this transformation @@ -205,7 +202,7 @@ awt::Point PlottingPositionHelper::transformSceneToScreenPosition( const drawing { //create 3D anchor shape tPropertyNameMap aDummyPropertyNameMap; - uno::Reference< drawing::XShape > xShape3DAnchor = pShapeFactory->createCube( xSceneTarget + rtl::Reference<Svx3DExtrudeObject> xShape3DAnchor = ShapeFactory::createCube( xSceneTarget , rScenePosition3D,drawing::Direction3D(1,1,1) , 0, nullptr, aDummyPropertyNameMap); //get 2D position from xShape3DAnchor @@ -218,16 +215,38 @@ awt::Point PlottingPositionHelper::transformSceneToScreenPosition( const drawing void PlottingPositionHelper::transformScaledLogicToScene( drawing::PolyPolygonShape3D& rPolygon ) const { drawing::Position3D aScenePosition; + auto SequenceXRange = asNonConstRange(rPolygon.SequenceX); + auto SequenceYRange = asNonConstRange(rPolygon.SequenceY); + auto SequenceZRange = asNonConstRange(rPolygon.SequenceZ); for( sal_Int32 nS = rPolygon.SequenceX.getLength(); nS--;) { - drawing::DoubleSequence& xValues = rPolygon.SequenceX[nS]; - drawing::DoubleSequence& yValues = rPolygon.SequenceY[nS]; - drawing::DoubleSequence& zValues = rPolygon.SequenceZ[nS]; - for( sal_Int32 nP = xValues.getLength(); nP--; ) + auto xValuesRange = asNonConstRange(SequenceXRange[nS]); + auto yValuesRange = asNonConstRange(SequenceYRange[nS]); + auto zValuesRange = asNonConstRange(SequenceZRange[nS]); + for( sal_Int32 nP = SequenceXRange[nS].getLength(); nP--; ) { - double& fX = xValues[nP]; - double& fY = yValues[nP]; - double& fZ = zValues[nP]; + double& fX = xValuesRange[nP]; + double& fY = yValuesRange[nP]; + double& fZ = zValuesRange[nP]; + aScenePosition = transformScaledLogicToScene( fX,fY,fZ,true ); + fX = aScenePosition.PositionX; + fY = aScenePosition.PositionY; + fZ = aScenePosition.PositionZ; + } + } +} + +void PlottingPositionHelper::transformScaledLogicToScene( std::vector<std::vector<css::drawing::Position3D>>& rPolygon ) const +{ + drawing::Position3D aScenePosition; + for( sal_Int32 nS = static_cast<sal_Int32>(rPolygon.size()); nS--;) + { + auto valuesRange = rPolygon[nS].data(); + for( sal_Int32 nP = rPolygon[nS].size(); nP--; ) + { + double& fX = valuesRange[nP].PositionX; + double& fY = valuesRange[nP].PositionY; + double& fZ = valuesRange[nP].PositionZ; aScenePosition = transformScaledLogicToScene( fX,fY,fZ,true ); fX = aScenePosition.PositionX; fY = aScenePosition.PositionY; @@ -388,22 +407,18 @@ void PolarPlottingPositionHelper::setScales( std::vector< ExplicitScaleData >&& return aRet; } -uno::Reference< XTransformation > PolarPlottingPositionHelper::getTransformationScaledLogicToScene() const +::chart::XTransformation2* PolarPlottingPositionHelper::getTransformationScaledLogicToScene() const { - if( !m_xTransformationLogicToScene.is() ) - m_xTransformationLogicToScene = new VPolarTransformation(*this); - return m_xTransformationLogicToScene; + if( !m_xTransformationLogicToScene ) + m_xTransformationLogicToScene.reset(new VPolarTransformation(*this)); + return m_xTransformationLogicToScene.get(); } double PolarPlottingPositionHelper::getWidthAngleDegree( double& fStartLogicValueOnAngleAxis, double& fEndLogicValueOnAngleAxis ) const { const ExplicitScaleData& rAngleScale = m_bSwapXAndY ? m_aScales[1] : m_aScales[0]; if( rAngleScale.Orientation != AxisOrientation_MATHEMATICAL ) - { - double fHelp = fEndLogicValueOnAngleAxis; - fEndLogicValueOnAngleAxis = fStartLogicValueOnAngleAxis; - fStartLogicValueOnAngleAxis = fHelp; - } + std::swap( fStartLogicValueOnAngleAxis, fEndLogicValueOnAngleAxis ); double fStartAngleDegree = transformToAngleDegree( fStartLogicValueOnAngleAxis ); double fEndAngleDegree = transformToAngleDegree( fEndLogicValueOnAngleAxis ); |