summaryrefslogtreecommitdiff
path: root/binfilter/bf_svx/source/unodraw/svx_unoshap3.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_svx/source/unodraw/svx_unoshap3.cxx')
-rw-r--r--binfilter/bf_svx/source/unodraw/svx_unoshap3.cxx1145
1 files changed, 1145 insertions, 0 deletions
diff --git a/binfilter/bf_svx/source/unodraw/svx_unoshap3.cxx b/binfilter/bf_svx/source/unodraw/svx_unoshap3.cxx
new file mode 100644
index 000000000000..ff29c7231f1a
--- /dev/null
+++ b/binfilter/bf_svx/source/unodraw/svx_unoshap3.cxx
@@ -0,0 +1,1145 @@
+/* -*- 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.
+ *
+ ************************************************************************/
+
+#define _SVX_USE_UNOGLOBALS_
+
+#include <com/sun/star/drawing/HomogenMatrix.hpp>
+#include <com/sun/star/drawing/DoubleSequence.hpp>
+#include <com/sun/star/drawing/CameraGeometry.hpp>
+
+#include <vcl/svapp.hxx>
+
+#include <rtl/uuid.h>
+#include <rtl/memory.h>
+
+#include "unoshape.hxx"
+#include "unopage.hxx"
+#include "polysc3d.hxx"
+#include "cube3d.hxx"
+#include "sphere3d.hxx"
+#include "lathe3d.hxx"
+#include "extrud3d.hxx"
+#include "polygn3d.hxx"
+#include "svdmodel.hxx"
+namespace binfilter {
+
+using namespace ::cppu;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+
+using rtl::OUString;
+
+#define INTERFACE_TYPE( xint ) \
+ ::getCppuType((const Reference< xint >*)0)
+
+#define QUERYINT( xint ) \
+ if( rType == ::getCppuType((const Reference< xint >*)0) ) \
+ aAny <<= Reference< xint >(this)
+
+/***********************************************************************
+* class Svx3DSceneObject *
+***********************************************************************/
+
+//----------------------------------------------------------------------
+Svx3DSceneObject::Svx3DSceneObject( SdrObject* pObj, SvxDrawPage* pDrawPage ) throw()
+: SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DSCENEOBJECT) ), pPage( pDrawPage )
+{
+}
+
+//----------------------------------------------------------------------
+Svx3DSceneObject::~Svx3DSceneObject() throw()
+{
+}
+
+//----------------------------------------------------------------------
+void Svx3DSceneObject::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage ) throw()
+{
+ SvxShape::Create( pNewObj, pNewPage );
+ pPage = pNewPage;
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL Svx3DSceneObject::queryAggregation( const uno::Type & rType )
+ throw(uno::RuntimeException)
+{
+ uno::Any aAny;
+
+ QUERYINT( drawing::XShapes );
+ else QUERYINT( container::XIndexAccess );
+ else QUERYINT( container::XElementAccess );
+ else
+ SvxShape::queryAggregation( rType, aAny );
+
+ return aAny;
+}
+
+uno::Any SAL_CALL Svx3DSceneObject::queryInterface( const uno::Type & rType ) throw( uno::RuntimeException )
+{
+ return SvxShape::queryInterface( rType );
+}
+
+void SAL_CALL Svx3DSceneObject::acquire() throw ( )
+{
+ SvxShape::acquire();
+}
+
+void SAL_CALL Svx3DSceneObject::release() throw ( )
+{
+ SvxShape::release();
+}
+
+// XTypeProvider
+
+uno::Sequence< uno::Type > SAL_CALL Svx3DSceneObject::getTypes()
+ throw (uno::RuntimeException)
+{
+
+ return SvxShape::getTypes();
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL Svx3DSceneObject::getImplementationId()
+ throw (uno::RuntimeException)
+{
+ static uno::Sequence< sal_Int8 > aId;
+ if( aId.getLength() == 0 )
+ {
+ aId.realloc( 16 );
+ rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
+ }
+ return aId;
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL Svx3DSceneObject::add( const Reference< drawing::XShape >& xShape )
+ throw( uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ SvxShape* pShape = SvxShape::getImplementation( xShape );
+
+ if(pObj == NULL || pPage == NULL || pShape == NULL || NULL != pShape->GetSdrObject() )
+ throw uno::RuntimeException();
+
+ SdrObject* pSdrShape = pPage->_CreateSdrObject( xShape );
+ if( pSdrShape->ISA(E3dObject) )
+ {
+ pObj->GetSubList()->NbcInsertObject( pSdrShape );
+
+ if(pShape)
+ pShape->Create( pSdrShape, pPage );
+ }
+ else
+ {
+ delete pSdrShape;
+ pShape->InvalidateSdrObject();
+ throw uno::RuntimeException();
+ }
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL Svx3DSceneObject::remove( const Reference< drawing::XShape >& xShape )
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ SvxShape* pShape = SvxShape::getImplementation( xShape );
+
+ if(pObj == NULL || pShape == NULL)
+ throw uno::RuntimeException();
+
+ SdrObject* pSdrShape = pShape->GetSdrObject();
+ if(pSdrShape == NULL || pSdrShape->GetObjList()->GetOwnerObj() != pObj)
+ {
+ throw uno::RuntimeException();
+ }
+ else
+ {
+ SdrObjList& rList = *pSdrShape->GetObjList();
+
+ const sal_uInt32 nObjCount = rList.GetObjCount();
+ sal_uInt32 nObjNum = 0;
+ while( nObjNum < nObjCount )
+ {
+ if(rList.GetObj( nObjNum ) == pSdrShape )
+ break;
+ nObjNum++;
+ }
+
+ if( nObjNum < nObjCount )
+ {
+ delete rList.NbcRemoveObject( nObjNum );
+ pShape->InvalidateSdrObject();
+ }
+ else
+ {
+ DBG_ASSERT( 0, "Fatality! SdrObject is not belonging to its SdrObjList! [CL]" );
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+sal_Int32 SAL_CALL Svx3DSceneObject::getCount()
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ sal_Int32 nRetval = 0;
+
+ if(pObj && pObj->ISA(E3dPolyScene) && pObj->GetSubList())
+ nRetval = pObj->GetSubList()->GetObjCount();
+ return nRetval;
+}
+
+//----------------------------------------------------------------------
+
+uno::Any SAL_CALL Svx3DSceneObject::getByIndex( sal_Int32 Index )
+ throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if( pObj == NULL || pObj->GetSubList() == NULL )
+ throw uno::RuntimeException();
+
+ if( pObj->GetSubList()->GetObjCount() <= (sal_uInt32)Index )
+ throw lang::IndexOutOfBoundsException();
+
+ SdrObject* pDestObj = pObj->GetSubList()->GetObj( Index );
+ if(pDestObj == NULL)
+ throw lang::IndexOutOfBoundsException();
+
+ Reference< drawing::XShape > xShape( pDestObj->getUnoShape(), uno::UNO_QUERY );
+ uno::Any aAny;
+ aAny <<= xShape;
+ return aAny;
+}
+
+//----------------------------------------------------------------------
+// ::com::sun::star::container::XElementAccess
+
+uno::Type SAL_CALL Svx3DSceneObject::getElementType()
+ throw( uno::RuntimeException )
+{
+ return ::getCppuType(( const Reference< drawing::XShape>*)0);
+}
+
+//----------------------------------------------------------------------
+sal_Bool SAL_CALL Svx3DSceneObject::hasElements()
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ return pObj && pObj->GetSubList() && (pObj->GetSubList()->GetObjCount() > 0);
+}
+
+//----------------------------------------------------------------------
+#define HOMOGEN_MATRIX_TO_OBJECT \
+ drawing::HomogenMatrix m; \
+ if( aValue >>= m ) { \
+ Matrix4D aMat; \
+ aMat[0][0] = m.Line1.Column1; \
+ aMat[0][1] = m.Line1.Column2; \
+ aMat[0][2] = m.Line1.Column3; \
+ aMat[0][3] = m.Line1.Column4; \
+ aMat[1][0] = m.Line2.Column1; \
+ aMat[1][1] = m.Line2.Column2; \
+ aMat[1][2] = m.Line2.Column3; \
+ aMat[1][3] = m.Line2.Column4; \
+ aMat[2][0] = m.Line3.Column1; \
+ aMat[2][1] = m.Line3.Column2; \
+ aMat[2][2] = m.Line3.Column3; \
+ aMat[2][3] = m.Line3.Column4; \
+ aMat[3][0] = m.Line4.Column1; \
+ aMat[3][1] = m.Line4.Column2; \
+ aMat[3][2] = m.Line4.Column3; \
+ aMat[3][3] = m.Line4.Column4; \
+ ((E3dObject*)pObj)->SetTransform(aMat); \
+ }
+
+#define OBJECT_TO_HOMOGEN_MATRIX \
+ drawing::HomogenMatrix aHomMat; \
+ const Matrix4D& rMat = ((E3dObject*)pObj)->GetTransform(); \
+ aHomMat.Line1.Column1 = rMat[0][0]; \
+ aHomMat.Line1.Column2 = rMat[0][1]; \
+ aHomMat.Line1.Column3 = rMat[0][2]; \
+ aHomMat.Line1.Column4 = rMat[0][3]; \
+ aHomMat.Line2.Column1 = rMat[1][0]; \
+ aHomMat.Line2.Column2 = rMat[1][1]; \
+ aHomMat.Line2.Column3 = rMat[1][2]; \
+ aHomMat.Line2.Column4 = rMat[1][3]; \
+ aHomMat.Line3.Column1 = rMat[2][0]; \
+ aHomMat.Line3.Column2 = rMat[2][1]; \
+ aHomMat.Line3.Column3 = rMat[2][2]; \
+ aHomMat.Line3.Column4 = rMat[2][3]; \
+ aHomMat.Line4.Column1 = rMat[3][0]; \
+ aHomMat.Line4.Column2 = rMat[3][1]; \
+ aHomMat.Line4.Column3 = rMat[3][2]; \
+ aHomMat.Line4.Column4 = rMat[3][3]; \
+ return uno::Any( &aHomMat, ::getCppuType((const drawing::HomogenMatrix*)0) );
+
+//----------------------------------------------------------------------
+} //namespace binfilter
+#include <svditer.hxx>
+namespace binfilter {//STRIP009
+struct ImpRememberTransAndRect
+{
+ Matrix4D maMat;
+ Rectangle maRect;
+};
+
+void SAL_CALL Svx3DSceneObject::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformationsmatrix in das Objekt packen
+ HOMOGEN_MATRIX_TO_OBJECT
+ }
+ else if(pObj
+ && pObj->ISA(E3dScene)
+ && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_CAMERA_GEOMETRY)) )
+ {
+ // set CameraGeometry at scene
+ E3dScene* pScene = (E3dScene*)pObj;
+ drawing::CameraGeometry aCamGeo;
+
+ if(aValue >>= aCamGeo)
+ {
+ Vector3D aVRP(aCamGeo.vrp.PositionX, aCamGeo.vrp.PositionY, aCamGeo.vrp.PositionZ);
+ Vector3D aVPN(aCamGeo.vpn.DirectionX, aCamGeo.vpn.DirectionY, aCamGeo.vpn.DirectionZ);
+ Vector3D aVUP(aCamGeo.vup.DirectionX, aCamGeo.vup.DirectionY, aCamGeo.vup.DirectionZ);
+
+ // rescue scene transformation
+ ImpRememberTransAndRect aSceneTAR;
+ aSceneTAR.maMat = pScene->GetTransform();
+ aSceneTAR.maRect = pScene->GetSnapRect();
+
+ // rescue object transformations
+ SdrObjListIter aIter(*pScene->GetSubList(), IM_DEEPWITHGROUPS);
+ List aObjTrans;
+ while(aIter.IsMore())
+ {
+ E3dObject* p3DObj = (E3dObject*)aIter.Next();
+ Matrix4D* pNew = new Matrix4D;
+ *pNew = p3DObj->GetTransform();
+ aObjTrans.Insert(pNew, LIST_APPEND);
+ }
+
+ // reset object transformations
+ aIter.Reset();
+ while(aIter.IsMore())
+ {
+ E3dObject* p3DObj = (E3dObject*)aIter.Next();
+ p3DObj->NbcResetTransform();
+ }
+
+ // reset scene transformation and make a complete recalc
+ pScene->NbcResetTransform();
+
+ // fill old camera from new parameters
+ Camera3D aCam(pScene->GetCamera());
+ const Volume3D& rVolume = pScene->GetBoundVolume();
+ double fW = rVolume.GetWidth();
+ double fH = rVolume.GetHeight();
+ double fCamPosZ =
+ (double)((const SfxUInt32Item&)pScene->GetItem(SDRATTR_3DSCENE_DISTANCE)).GetValue();
+ double fCamFocal =
+ (double)((const SfxUInt32Item&)pScene->GetItem(SDRATTR_3DSCENE_FOCAL_LENGTH)).GetValue();
+
+ aCam.SetAutoAdjustProjection(FALSE);
+ aCam.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
+ Vector3D aLookAt;
+ Vector3D aCamPos(0.0, 0.0, fCamPosZ);
+ aCam.SetPosAndLookAt(aCamPos, aLookAt);
+ aCam.SetFocalLength(fCamFocal / 100.0);
+ aCam.SetDefaults(Vector3D(0.0, 0.0, fCamPosZ), aLookAt, fCamFocal / 100.0);
+ aCam.SetDeviceWindow(Rectangle(0, 0, fW, fH));
+
+ // set at scene
+ pScene->SetCamera(aCam);
+
+ // #91047# use imported VRP, VPN and VUP (if used)
+ sal_Bool bVRPUsed(aVRP != Vector3D(0.0, 0.0, 1.0));
+ sal_Bool bVPNUsed(aVPN != Vector3D(0.0, 0.0, 1.0));
+ sal_Bool bVUPUsed(aVUP != Vector3D(0.0, 1.0, 0.0));
+
+ if(bVRPUsed || bVPNUsed || bVUPUsed)
+ {
+ pScene->GetCameraSet().SetViewportValues(aVRP, aVPN, aVUP);
+ }
+
+ // set object transformations again at objects
+ aIter.Reset();
+ sal_uInt32 nIndex(0L);
+ while(aIter.IsMore())
+ {
+ E3dObject* p3DObj = (E3dObject*)aIter.Next();
+ Matrix4D* pMat = (Matrix4D*)aObjTrans.GetObject(nIndex++);
+ p3DObj->NbcSetTransform(*pMat);
+ delete pMat;
+ }
+
+ // set scene transformation again at scene
+ pScene->NbcSetTransform(aSceneTAR.maMat);
+ pScene->FitSnapRectToBoundVol();
+ pScene->NbcSetSnapRect(aSceneTAR.maRect);
+
+ // #86559# init transformation set to allow correct
+ // calculation of BoundRect
+ pScene->InitTransformationSet();
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL Svx3DSceneObject::getPropertyValue( const OUString& PropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Objekt in eine homogene 4x4 Matrix packen
+ OBJECT_TO_HOMOGEN_MATRIX
+ }
+ else if(pObj
+ && pObj->ISA(E3dScene)
+ && PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_CAMERA_GEOMETRY)) )
+ {
+ // get CameraGeometry from scene
+ E3dScene* pScene = (E3dScene*)pObj;
+ drawing::CameraGeometry aCamGeo;
+
+ // fill Vectors from scene camera
+ B3dCamera& aCameraSet = pScene->GetCameraSet();
+ Vector3D aVRP = aCameraSet.GetVRP();
+ Vector3D aVPN = aCameraSet.GetVPN();
+ Vector3D aVUP = aCameraSet.GetVUV();
+
+ // transfer to structure
+ aCamGeo.vrp.PositionX = aVRP.X();
+ aCamGeo.vrp.PositionY = aVRP.Y();
+ aCamGeo.vrp.PositionZ = aVRP.Z();
+ aCamGeo.vpn.DirectionX = aVPN.X();
+ aCamGeo.vpn.DirectionY = aVPN.Y();
+ aCamGeo.vpn.DirectionZ = aVPN.Z();
+ aCamGeo.vup.DirectionX = aVUP.X();
+ aCamGeo.vup.DirectionY = aVUP.Y();
+ aCamGeo.vup.DirectionZ = aVUP.Z();
+
+ return uno::Any(&aCamGeo, ::getCppuType((const drawing::CameraGeometry*)0) );
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(PropertyName);
+ }
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL Svx3DSceneObject::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
+ SvxServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.drawing.Shape3DScene" );
+ return aSeq;
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+//----------------------------------------------------------------------
+Svx3DCubeObject::Svx3DCubeObject( SdrObject* pObj ) throw()
+: SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DCUBEOBJEKT) )
+{
+}
+
+//----------------------------------------------------------------------
+Svx3DCubeObject::~Svx3DCubeObject() throw()
+{
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL Svx3DCubeObject::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformationsmatrix in das Objekt packen
+ HOMOGEN_MATRIX_TO_OBJECT
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POS)) )
+ {
+ // Position in das Objekt packen
+ drawing::Position3D aUnoPos;
+ if( aValue >>= aUnoPos )
+ {
+ Vector3D aPos(aUnoPos.PositionX, aUnoPos.PositionY, aUnoPos.PositionZ);
+ ((E3dCubeObj*)pObj)->SetCubePos(aPos);
+ }
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_SIZE)) )
+ {
+ // Groesse in das Objekt packen
+ drawing::Direction3D aDirection;
+ if( aValue >>= aDirection )
+ {
+ Vector3D aSize(aDirection.DirectionX, aDirection.DirectionY, aDirection.DirectionZ);
+ ((E3dCubeObj*)pObj)->SetCubeSize(aSize);
+ }
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POS_IS_CENTER)) )
+ {
+ // sal_Bool bPosIsCenter in das Objekt packen
+ if( aValue.getValueType() == ::getCppuBooleanType() )
+ {
+ sal_Bool bNew = *(sal_Bool*)aValue.getValue();
+ ((E3dCubeObj*)pObj)->SetPosIsCenter(bNew);
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyValue( aPropertyName, aValue );
+ }
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL Svx3DCubeObject::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformation in eine homogene Matrix packen
+ OBJECT_TO_HOMOGEN_MATRIX
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POS)) )
+ {
+ // Position packen
+ const Vector3D& rPos = ((E3dCubeObj*)pObj)->GetCubePos();
+ drawing::Position3D aPos;
+
+ aPos.PositionX = rPos.X();
+ aPos.PositionY = rPos.Y();
+ aPos.PositionZ = rPos.Z();
+
+ return uno::Any( &aPos, ::getCppuType((const drawing::Position3D*)0) );
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_SIZE)) )
+ {
+ // Groesse packen
+ const Vector3D& rSize = ((E3dCubeObj*)pObj)->GetCubeSize();
+ drawing::Direction3D aDir;
+
+ aDir.DirectionX = rSize.X();
+ aDir.DirectionY = rSize.Y();
+ aDir.DirectionZ = rSize.Z();
+
+ return uno::Any( &aDir, ::getCppuType((const drawing::Direction3D*)0) );
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POS_IS_CENTER)) )
+ {
+ // sal_Bool bPosIsCenter packen
+ sal_Bool bIsCenter = ((E3dCubeObj*)pObj)->GetPosIsCenter();
+ return uno::Any( &bIsCenter, ::getCppuBooleanType() );
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL Svx3DCubeObject::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
+ SvxServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
+ "com.sun.star.drawing.Shape3DCube");
+ return aSeq;
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+//----------------------------------------------------------------------
+Svx3DSphereObject::Svx3DSphereObject( SdrObject* pObj ) throw()
+: SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DSPHEREOBJECT) )
+{
+}
+
+//----------------------------------------------------------------------
+Svx3DSphereObject::~Svx3DSphereObject() throw()
+{
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL Svx3DSphereObject::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)))
+ {
+ // Transformationsmatrix in das Objekt packen
+ HOMOGEN_MATRIX_TO_OBJECT
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POS)))
+ {
+ // Position in das Objekt packen
+ drawing::Position3D aUnoPos;
+ if( aValue >>= aUnoPos )
+ {
+ Vector3D aPos(aUnoPos.PositionX, aUnoPos.PositionY, aUnoPos.PositionZ);
+ ((E3dSphereObj*)pObj)->SetCenter(aPos);
+ }
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_SIZE)))
+ {
+ // Groesse in das Objekt packen
+ drawing::Direction3D aDir;
+ if( aValue >>= aDir )
+ {
+ Vector3D aPos(aDir.DirectionX, aDir.DirectionY, aDir.DirectionZ);
+ ((E3dSphereObj*)pObj)->SetSize(aPos);
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL Svx3DSphereObject::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)))
+ {
+ // Transformation in eine homogene Matrix packen
+ OBJECT_TO_HOMOGEN_MATRIX
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POS)))
+ {
+ // Position packen
+ const Vector3D& rPos = ((E3dSphereObj*)pObj)->Center();
+ drawing::Position3D aPos;
+
+ aPos.PositionX = rPos.X();
+ aPos.PositionY = rPos.Y();
+ aPos.PositionZ = rPos.Z();
+
+ return uno::Any( &aPos, ::getCppuType((const drawing::Position3D*)0) );
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_SIZE)))
+ {
+ // Groesse packen
+ const Vector3D& rSize = ((E3dSphereObj*)pObj)->Size();
+ drawing::Direction3D aDir;
+
+ aDir.DirectionX = rSize.X();
+ aDir.DirectionY = rSize.Y();
+ aDir.DirectionZ = rSize.Z();
+
+ return uno::Any( &aDir, ::getCppuType((const drawing::Direction3D*)0) );
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL Svx3DSphereObject::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
+ SvxServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
+ "com.sun.star.drawing.Shape3DSphere");
+ return aSeq;
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+} //namespace binfilter
+#include <com/sun/star/drawing/PolyPolygonShape3D.hpp>
+namespace binfilter {//STRIP009
+
+
+//----------------------------------------------------------------------
+Svx3DLatheObject::Svx3DLatheObject( SdrObject* pObj ) throw()
+: SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DLATHEOBJECT) )
+{
+}
+
+//----------------------------------------------------------------------
+Svx3DLatheObject::~Svx3DLatheObject() throw()
+{
+}
+
+#define POLYPOLYGONSHAPE3D_TO_POLYPOLYGON3D \
+ drawing::PolyPolygonShape3D aSourcePolyPolygon; \
+ if( !(aValue >>= aSourcePolyPolygon) ) \
+ throw lang::IllegalArgumentException(); \
+ sal_Int32 nOuterSequenceCount = aSourcePolyPolygon.SequenceX.getLength(); \
+ if(nOuterSequenceCount != aSourcePolyPolygon.SequenceY.getLength() \
+ || nOuterSequenceCount != aSourcePolyPolygon.SequenceZ.getLength()) \
+ { \
+ throw lang::IllegalArgumentException(); \
+ } \
+ PolyPolygon3D aNewPolyPolygon; \
+ drawing::DoubleSequence* pInnerSequenceX = aSourcePolyPolygon.SequenceX.getArray(); \
+ drawing::DoubleSequence* pInnerSequenceY = aSourcePolyPolygon.SequenceY.getArray(); \
+ drawing::DoubleSequence* pInnerSequenceZ = aSourcePolyPolygon.SequenceZ.getArray(); \
+ for(sal_Int32 a=0;a<nOuterSequenceCount;a++) \
+ { \
+ sal_Int32 nInnerSequenceCount = pInnerSequenceX->getLength(); \
+ if(nInnerSequenceCount != pInnerSequenceY->getLength() \
+ || nInnerSequenceCount != pInnerSequenceZ->getLength()) \
+ { \
+ throw lang::IllegalArgumentException(); \
+ } \
+ Polygon3D aNewPolygon((USHORT)nInnerSequenceCount); \
+ double* pArrayX = pInnerSequenceX->getArray(); \
+ double* pArrayY = pInnerSequenceY->getArray(); \
+ double* pArrayZ = pInnerSequenceZ->getArray(); \
+ for(sal_Int32 b=0;b<nInnerSequenceCount;b++) \
+ { \
+ aNewPolygon[(USHORT)b].X() = *pArrayX++; \
+ aNewPolygon[(USHORT)b].Y() = *pArrayY++; \
+ aNewPolygon[(USHORT)b].Z() = *pArrayZ++; \
+ } \
+ pInnerSequenceX++; \
+ pInnerSequenceY++; \
+ pInnerSequenceZ++; \
+ aNewPolygon.CheckClosed(); \
+ aNewPolyPolygon.Insert(aNewPolygon); \
+ } \
+
+#define POLYPOLYGON3D_TO_POLYPOLYGONSHAPE3D \
+ drawing::PolyPolygonShape3D aRetval; \
+ aRetval.SequenceX.realloc((sal_Int32)rPolyPoly.Count()); \
+ aRetval.SequenceY.realloc((sal_Int32)rPolyPoly.Count()); \
+ aRetval.SequenceZ.realloc((sal_Int32)rPolyPoly.Count()); \
+ drawing::DoubleSequence* pOuterSequenceX = aRetval.SequenceX.getArray(); \
+ drawing::DoubleSequence* pOuterSequenceY = aRetval.SequenceY.getArray(); \
+ drawing::DoubleSequence* pOuterSequenceZ = aRetval.SequenceZ.getArray(); \
+ for(sal_uInt16 a=0;a<rPolyPoly.Count();a++) \
+ { \
+ const Polygon3D& rPoly = rPolyPoly[a]; \
+ sal_Int32 nPointCount(rPoly.GetPointCount()); \
+ if(rPoly.IsClosed()) nPointCount++; \
+ pOuterSequenceX->realloc(nPointCount); \
+ pOuterSequenceY->realloc(nPointCount); \
+ pOuterSequenceZ->realloc(nPointCount); \
+ double* pInnerSequenceX = pOuterSequenceX->getArray(); \
+ double* pInnerSequenceY = pOuterSequenceY->getArray(); \
+ double* pInnerSequenceZ = pOuterSequenceZ->getArray(); \
+ for(sal_uInt16 b=0;b<rPoly.GetPointCount();b++) \
+ { \
+ *pInnerSequenceX++ = rPoly[(USHORT)b].X(); \
+ *pInnerSequenceY++ = rPoly[(USHORT)b].Y(); \
+ *pInnerSequenceZ++ = rPoly[(USHORT)b].Z(); \
+ } \
+ if(rPoly.IsClosed()) \
+ { \
+ *pInnerSequenceX++ = rPoly[0].X(); \
+ *pInnerSequenceY++ = rPoly[0].Y(); \
+ *pInnerSequenceZ++ = rPoly[0].Z(); \
+ } \
+ pOuterSequenceX++; \
+ pOuterSequenceY++; \
+ pOuterSequenceZ++; \
+ } \
+ return uno::Any( &aRetval, ::getCppuType((const drawing::PolyPolygonShape3D*)0) ); \
+
+//----------------------------------------------------------------------
+void SAL_CALL Svx3DLatheObject::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformationsmatrix in das Objekt packen
+ HOMOGEN_MATRIX_TO_OBJECT
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POLYPOLYGON3D)) )
+ {
+ // Polygondefinition in das Objekt packen
+ POLYPOLYGONSHAPE3D_TO_POLYPOLYGON3D
+
+ // #105127# SetPolyPoly3D sets the Svx3DVerticalSegmentsItem to the number
+ // of points of the polygon. Thus, value gets lost. To avoid this, rescue
+ // item here and re-set after setting the polygon.
+ const sal_uInt32 nPrevVerticalSegs(((E3dLatheObj*)pObj)->GetVerticalSegments());
+
+ // Polygon setzen
+ ((E3dLatheObj*)pObj)->SetPolyPoly3D(aNewPolyPolygon);
+
+ const sal_uInt32 nPostVerticalSegs(((E3dLatheObj*)pObj)->GetVerticalSegments());
+
+ if(nPrevVerticalSegs != nPostVerticalSegs)
+ {
+ // restore the vertical segment count
+ ((E3dLatheObj*)pObj)->SetItem(Svx3DVerticalSegmentsItem(nPrevVerticalSegs));
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL Svx3DLatheObject::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformation in eine homogene Matrix packen
+ drawing::HomogenMatrix aHomMat;
+ Matrix4D aMat = ((E3dObject*)pObj)->GetTransform();
+
+ // test for transformed PolyPolygon3D
+ const PolyPolygon3D& rPolyPoly = ((E3dExtrudeObj*)pObj)->GetExtrudePolygon();
+ if(rPolyPoly.Count() && rPolyPoly[0].GetPointCount())
+ {
+ const Vector3D& rFirstPoint = rPolyPoly[0][0];
+ if(rFirstPoint.Z() != 0.0)
+ {
+ // change transformation so that source poly lies in Z == 0,
+ // so it can be exported as 2D polygon
+ //
+ // ATTENTION: the translation has to be multiplied from LEFT
+ // SIDE since it was executed as the first translate for this
+ // 3D object during it's creation.
+ Matrix4D aTransMat;
+ aTransMat.TranslateZ(rFirstPoint.Z());
+ aMat = aTransMat * aMat;
+ }
+ }
+
+ // pack evtl. transformed matrix to output
+ aHomMat.Line1.Column1 = aMat[0][0];
+ aHomMat.Line1.Column2 = aMat[0][1];
+ aHomMat.Line1.Column3 = aMat[0][2];
+ aHomMat.Line1.Column4 = aMat[0][3];
+ aHomMat.Line2.Column1 = aMat[1][0];
+ aHomMat.Line2.Column2 = aMat[1][1];
+ aHomMat.Line2.Column3 = aMat[1][2];
+ aHomMat.Line2.Column4 = aMat[1][3];
+ aHomMat.Line3.Column1 = aMat[2][0];
+ aHomMat.Line3.Column2 = aMat[2][1];
+ aHomMat.Line3.Column3 = aMat[2][2];
+ aHomMat.Line3.Column4 = aMat[2][3];
+ aHomMat.Line4.Column1 = aMat[3][0];
+ aHomMat.Line4.Column2 = aMat[3][1];
+ aHomMat.Line4.Column3 = aMat[3][2];
+ aHomMat.Line4.Column4 = aMat[3][3];
+
+ return uno::Any( &aHomMat, ::getCppuType((const drawing::HomogenMatrix*)0) );
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POLYPOLYGON3D)) )
+ {
+ const PolyPolygon3D& rPolyPoly = ((E3dLatheObj*)pObj)->GetPolyPoly3D();
+
+ POLYPOLYGON3D_TO_POLYPOLYGONSHAPE3D
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL Svx3DLatheObject::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
+ SvxServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
+ "com.sun.star.drawing.Shape3DLathe");
+ return aSeq;
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+Svx3DExtrudeObject::Svx3DExtrudeObject( SdrObject* pObj ) throw()
+: SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DEXTRUDEOBJECT) )
+{
+}
+
+//----------------------------------------------------------------------
+Svx3DExtrudeObject::~Svx3DExtrudeObject() throw()
+{
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL Svx3DExtrudeObject::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformationsmatrix in das Objekt packen
+ HOMOGEN_MATRIX_TO_OBJECT
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POLYPOLYGON3D)) )
+ {
+ // Polygondefinition in das Objekt packen
+ POLYPOLYGONSHAPE3D_TO_POLYPOLYGON3D
+
+ // Polygon setzen
+ ((E3dExtrudeObj*)pObj)->SetExtrudePolygon(aNewPolyPolygon);
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL Svx3DExtrudeObject::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformation in eine homogene Matrix packen
+ drawing::HomogenMatrix aHomMat;
+ Matrix4D aMat = ((E3dObject*)pObj)->GetTransform();
+
+ // test for transformed PolyPolygon3D
+ const PolyPolygon3D& rPolyPoly = ((E3dExtrudeObj*)pObj)->GetExtrudePolygon();
+ if(rPolyPoly.Count() && rPolyPoly[0].GetPointCount())
+ {
+ const Vector3D& rFirstPoint = rPolyPoly[0][0];
+ if(rFirstPoint.Z() != 0.0)
+ {
+ // change transformation so that source poly lies in Z == 0,
+ // so it can be exported as 2D polygon
+ //
+ // ATTENTION: the translation has to be multiplied from LEFT
+ // SIDE since it was executed as the first translate for this
+ // 3D object during it's creation.
+ Matrix4D aTransMat;
+ aTransMat.TranslateZ(rFirstPoint.Z());
+ aMat = aTransMat * aMat;
+ }
+ }
+
+ // pack evtl. transformed matrix to output
+ aHomMat.Line1.Column1 = aMat[0][0];
+ aHomMat.Line1.Column2 = aMat[0][1];
+ aHomMat.Line1.Column3 = aMat[0][2];
+ aHomMat.Line1.Column4 = aMat[0][3];
+ aHomMat.Line2.Column1 = aMat[1][0];
+ aHomMat.Line2.Column2 = aMat[1][1];
+ aHomMat.Line2.Column3 = aMat[1][2];
+ aHomMat.Line2.Column4 = aMat[1][3];
+ aHomMat.Line3.Column1 = aMat[2][0];
+ aHomMat.Line3.Column2 = aMat[2][1];
+ aHomMat.Line3.Column3 = aMat[2][2];
+ aHomMat.Line3.Column4 = aMat[2][3];
+ aHomMat.Line4.Column1 = aMat[3][0];
+ aHomMat.Line4.Column2 = aMat[3][1];
+ aHomMat.Line4.Column3 = aMat[3][2];
+ aHomMat.Line4.Column4 = aMat[3][3];
+
+ return uno::Any( &aHomMat, ::getCppuType((const drawing::HomogenMatrix*)0) );
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POLYPOLYGON3D)) )
+ {
+ // Polygondefinition packen
+ const PolyPolygon3D& rPolyPoly = ((E3dExtrudeObj*)pObj)->GetExtrudePolygon();
+
+ POLYPOLYGON3D_TO_POLYPOLYGONSHAPE3D
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL Svx3DExtrudeObject::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
+ SvxServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
+ "com.sun.star.drawing.Shape3DExtrude");
+ return aSeq;
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+//----------------------------------------------------------------------
+Svx3DPolygonObject::Svx3DPolygonObject( SdrObject* pObj ) throw()
+: SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DPOLYGONOBJECT) )
+{
+}
+
+//----------------------------------------------------------------------
+Svx3DPolygonObject::~Svx3DPolygonObject() throw()
+{
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL Svx3DPolygonObject::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformationsmatrix in das Objekt packen
+ HOMOGEN_MATRIX_TO_OBJECT
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POLYPOLYGON3D)) )
+ {
+ // Polygondefinition in das Objekt packen
+ POLYPOLYGONSHAPE3D_TO_POLYPOLYGON3D
+
+ // Polygon setzen
+ ((E3dPolygonObj*)pObj)->SetPolyPolygon3D(aNewPolyPolygon);
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_NORMALSPOLYGON3D)) )
+ {
+ // Normalendefinition in das Objekt packen
+ POLYPOLYGONSHAPE3D_TO_POLYPOLYGON3D
+
+ // Polygon setzen
+ ((E3dPolygonObj*)pObj)->SetPolyNormals3D(aNewPolyPolygon);
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TEXTUREPOLYGON3D)) )
+ {
+ // Texturdefinition in das Objekt packen
+ POLYPOLYGONSHAPE3D_TO_POLYPOLYGON3D
+
+ // Polygon setzen
+ ((E3dPolygonObj*)pObj)->SetPolyTexture3D(aNewPolyPolygon);
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_LINEONLY)) )
+ {
+ // sal_Bool bLineOnly in das Objekt packen
+ if( aValue.getValueType() == ::getCppuBooleanType() )
+ {
+ sal_Bool bNew = *(sal_Bool*)aValue.getValue();
+ ((E3dPolygonObj*)pObj)->SetLineOnly(bNew);
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL Svx3DPolygonObject::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TRANSFORM_MATRIX)) )
+ {
+ // Transformation in eine homogene Matrix packen
+ OBJECT_TO_HOMOGEN_MATRIX
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_POLYPOLYGON3D)) )
+ {
+ // Polygondefinition packen
+ const PolyPolygon3D& rPolyPoly = ((E3dPolygonObj*)pObj)->GetPolyPolygon3D();
+
+ POLYPOLYGON3D_TO_POLYPOLYGONSHAPE3D
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_NORMALSPOLYGON3D)) )
+ {
+ // Normalendefinition packen
+ const PolyPolygon3D& rPolyPoly = ((E3dPolygonObj*)pObj)->GetPolyNormals3D();
+
+ POLYPOLYGON3D_TO_POLYPOLYGONSHAPE3D
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_TEXTUREPOLYGON3D)) )
+ {
+ // Texturdefinition packen
+ const PolyPolygon3D& rPolyPoly = ((E3dPolygonObj*)pObj)->GetPolyTexture3D();
+
+ POLYPOLYGON3D_TO_POLYPOLYGONSHAPE3D
+ }
+ else if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_3D_LINEONLY)) )
+ {
+ // sal_Bool bLineOnly packen
+ sal_Bool bNew = ((E3dPolygonObj*)pObj)->GetLineOnly();
+ return uno::Any( &bNew, ::getCppuBooleanType() );
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL Svx3DPolygonObject::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
+ SvxServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
+ "com.sun.star.drawing.Shape3DPolygon");
+ return aSeq;
+}
+
+
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */