xref: /trunk/main/svx/source/unodraw/unoshap3.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f6e50924SAndrew Rist  * distributed with this work for additional information
6*f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17*f6e50924SAndrew Rist  * specific language governing permissions and limitations
18*f6e50924SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*f6e50924SAndrew Rist  *************************************************************/
21*f6e50924SAndrew Rist 
22*f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define _SVX_USE_UNOGLOBALS_
28cdf0e10cSrcweir #include <com/sun/star/drawing/HomogenMatrix.hpp>
29cdf0e10cSrcweir #include <com/sun/star/drawing/Position3D.hpp>
30cdf0e10cSrcweir #include <com/sun/star/drawing/Direction3D.hpp>
31cdf0e10cSrcweir #include <com/sun/star/drawing/DoubleSequence.hpp>
32cdf0e10cSrcweir #include <com/sun/star/drawing/CameraGeometry.hpp>
33cdf0e10cSrcweir #include <vcl/svapp.hxx>
34cdf0e10cSrcweir #include <vos/mutex.hxx>
35cdf0e10cSrcweir #include <comphelper/serviceinfohelper.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include <rtl/uuid.h>
38cdf0e10cSrcweir #include <rtl/memory.h>
39cdf0e10cSrcweir #include <svx/svdpool.hxx>
40cdf0e10cSrcweir #include <svx/unoshape.hxx>
41cdf0e10cSrcweir #include <svx/unopage.hxx>
42cdf0e10cSrcweir #include <editeng/unoprnms.hxx>
43cdf0e10cSrcweir #include <svx/polysc3d.hxx>
44cdf0e10cSrcweir #include "svx/globl3d.hxx"
45cdf0e10cSrcweir #include <svx/cube3d.hxx>
46cdf0e10cSrcweir #include <svx/sphere3d.hxx>
47cdf0e10cSrcweir #include <svx/lathe3d.hxx>
48cdf0e10cSrcweir #include <svx/extrud3d.hxx>
49cdf0e10cSrcweir #include <svx/polygn3d.hxx>
50cdf0e10cSrcweir #include "svx/unoshprp.hxx"
51cdf0e10cSrcweir #include "svx/svdmodel.hxx"
52cdf0e10cSrcweir #include <basegfx/polygon/b3dpolygon.hxx>
53cdf0e10cSrcweir #include <basegfx/polygon/b3dpolygontools.hxx>
54cdf0e10cSrcweir #include <com/sun/star/drawing/PolyPolygonShape3D.hpp>
55cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygontools.hxx>
56cdf0e10cSrcweir 
57cdf0e10cSrcweir using ::rtl::OUString;
58cdf0e10cSrcweir using namespace ::vos;
59cdf0e10cSrcweir using namespace ::cppu;
60cdf0e10cSrcweir using namespace ::com::sun::star;
61cdf0e10cSrcweir using namespace ::com::sun::star::uno;
62cdf0e10cSrcweir using namespace ::com::sun::star::lang;
63cdf0e10cSrcweir using namespace ::com::sun::star::container;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir #define INTERFACE_TYPE( xint ) \
66cdf0e10cSrcweir     ::getCppuType((const Reference< xint >*)0)
67cdf0e10cSrcweir 
68cdf0e10cSrcweir #define QUERYINT( xint ) \
69cdf0e10cSrcweir     if( rType == ::getCppuType((const Reference< xint >*)0) ) \
70cdf0e10cSrcweir         aAny <<= Reference< xint >(this)
71cdf0e10cSrcweir 
72cdf0e10cSrcweir /***********************************************************************
73cdf0e10cSrcweir * class Svx3DSceneObject                                               *
74cdf0e10cSrcweir ***********************************************************************/
75cdf0e10cSrcweir 
76cdf0e10cSrcweir //----------------------------------------------------------------------
Svx3DSceneObject(SdrObject * pObj,SvxDrawPage * pDrawPage)77cdf0e10cSrcweir Svx3DSceneObject::Svx3DSceneObject( SdrObject* pObj, SvxDrawPage* pDrawPage ) throw()
78cdf0e10cSrcweir :   SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DSCENEOBJECT), aSvxMapProvider.GetPropertySet(SVXMAP_3DSCENEOBJECT, SdrObject::GetGlobalDrawObjectItemPool()) )
79cdf0e10cSrcweir ,   mxPage( pDrawPage )
80cdf0e10cSrcweir {
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir //----------------------------------------------------------------------
~Svx3DSceneObject()84cdf0e10cSrcweir Svx3DSceneObject::~Svx3DSceneObject() throw()
85cdf0e10cSrcweir {
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir //----------------------------------------------------------------------
Create(SdrObject * pNewObj,SvxDrawPage * pNewPage)89cdf0e10cSrcweir void Svx3DSceneObject::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
90cdf0e10cSrcweir {
91cdf0e10cSrcweir     SvxShape::Create( pNewObj, pNewPage );
92cdf0e10cSrcweir     mxPage = pNewPage;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir //----------------------------------------------------------------------
queryAggregation(const uno::Type & rType)96cdf0e10cSrcweir uno::Any SAL_CALL Svx3DSceneObject::queryAggregation( const uno::Type & rType ) throw(uno::RuntimeException)
97cdf0e10cSrcweir {
98cdf0e10cSrcweir     uno::Any aAny;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir     QUERYINT( drawing::XShapes );
101cdf0e10cSrcweir     else QUERYINT( container::XIndexAccess );
102cdf0e10cSrcweir     else QUERYINT( container::XElementAccess );
103cdf0e10cSrcweir     else
104cdf0e10cSrcweir         return SvxShape::queryAggregation( rType );
105cdf0e10cSrcweir 
106cdf0e10cSrcweir     return aAny;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
queryInterface(const uno::Type & rType)109cdf0e10cSrcweir uno::Any SAL_CALL Svx3DSceneObject::queryInterface( const uno::Type & rType ) throw( uno::RuntimeException )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir     return SvxShape::queryInterface( rType );
112cdf0e10cSrcweir }
113cdf0e10cSrcweir 
acquire()114cdf0e10cSrcweir void SAL_CALL Svx3DSceneObject::acquire() throw ( )
115cdf0e10cSrcweir {
116cdf0e10cSrcweir     SvxShape::acquire();
117cdf0e10cSrcweir }
118cdf0e10cSrcweir 
release()119cdf0e10cSrcweir void SAL_CALL Svx3DSceneObject::release() throw ( )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir     SvxShape::release();
122cdf0e10cSrcweir }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir // XTypeProvider
125cdf0e10cSrcweir 
getTypes()126cdf0e10cSrcweir uno::Sequence< uno::Type > SAL_CALL Svx3DSceneObject::getTypes()
127cdf0e10cSrcweir     throw (uno::RuntimeException)
128cdf0e10cSrcweir {
129cdf0e10cSrcweir 
130cdf0e10cSrcweir     return SvxShape::getTypes();
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
getImplementationId()133cdf0e10cSrcweir uno::Sequence< sal_Int8 > SAL_CALL Svx3DSceneObject::getImplementationId()
134cdf0e10cSrcweir     throw (uno::RuntimeException)
135cdf0e10cSrcweir {
136cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId;
137cdf0e10cSrcweir     if( aId.getLength() == 0 )
138cdf0e10cSrcweir     {
139cdf0e10cSrcweir         aId.realloc( 16 );
140cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
141cdf0e10cSrcweir     }
142cdf0e10cSrcweir     return aId;
143cdf0e10cSrcweir }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir //----------------------------------------------------------------------
add(const Reference<drawing::XShape> & xShape)146cdf0e10cSrcweir void SAL_CALL Svx3DSceneObject::add( const Reference< drawing::XShape >& xShape )
147cdf0e10cSrcweir     throw( uno::RuntimeException)
148cdf0e10cSrcweir {
149cdf0e10cSrcweir     OGuard aGuard( Application::GetSolarMutex() );
150cdf0e10cSrcweir 
151cdf0e10cSrcweir     SvxShape* pShape = SvxShape::getImplementation( xShape );
152cdf0e10cSrcweir 
153cdf0e10cSrcweir     if(!mpObj.is() || !mxPage.is() || pShape == NULL || NULL != pShape->GetSdrObject() )
154cdf0e10cSrcweir         throw uno::RuntimeException();
155cdf0e10cSrcweir 
156cdf0e10cSrcweir     SdrObject* pSdrShape = mxPage->_CreateSdrObject( xShape );
157cdf0e10cSrcweir     if( pSdrShape->ISA(E3dObject) )
158cdf0e10cSrcweir     {
159cdf0e10cSrcweir         mpObj->GetSubList()->NbcInsertObject( pSdrShape );
160cdf0e10cSrcweir 
161cdf0e10cSrcweir         if(pShape)
162cdf0e10cSrcweir             pShape->Create( pSdrShape, mxPage.get()  );
163cdf0e10cSrcweir     }
164cdf0e10cSrcweir     else
165cdf0e10cSrcweir     {
166cdf0e10cSrcweir         SdrObject::Free( pSdrShape );
167cdf0e10cSrcweir         throw uno::RuntimeException();
168cdf0e10cSrcweir     }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir     if( mpModel )
171cdf0e10cSrcweir         mpModel->SetChanged();
172cdf0e10cSrcweir }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir //----------------------------------------------------------------------
remove(const Reference<drawing::XShape> & xShape)175cdf0e10cSrcweir void SAL_CALL Svx3DSceneObject::remove( const Reference< drawing::XShape >& xShape )
176cdf0e10cSrcweir     throw( uno::RuntimeException )
177cdf0e10cSrcweir {
178cdf0e10cSrcweir     OGuard aGuard( Application::GetSolarMutex() );
179cdf0e10cSrcweir 
180cdf0e10cSrcweir     SvxShape* pShape = SvxShape::getImplementation( xShape );
181cdf0e10cSrcweir 
182cdf0e10cSrcweir     if(!mpObj.is() || pShape == NULL)
183cdf0e10cSrcweir         throw uno::RuntimeException();
184cdf0e10cSrcweir 
185cdf0e10cSrcweir     SdrObject* pSdrShape = pShape->GetSdrObject();
186cdf0e10cSrcweir     if(pSdrShape == NULL || pSdrShape->GetObjList()->GetOwnerObj() != mpObj.get())
187cdf0e10cSrcweir     {
188cdf0e10cSrcweir         throw uno::RuntimeException();
189cdf0e10cSrcweir     }
190cdf0e10cSrcweir     else
191cdf0e10cSrcweir     {
192cdf0e10cSrcweir         SdrObjList& rList = *pSdrShape->GetObjList();
193cdf0e10cSrcweir 
194cdf0e10cSrcweir         const sal_uInt32 nObjCount = rList.GetObjCount();
195cdf0e10cSrcweir         sal_uInt32 nObjNum = 0;
196cdf0e10cSrcweir         while( nObjNum < nObjCount )
197cdf0e10cSrcweir         {
198cdf0e10cSrcweir             if(rList.GetObj( nObjNum ) == pSdrShape )
199cdf0e10cSrcweir                 break;
200cdf0e10cSrcweir             nObjNum++;
201cdf0e10cSrcweir         }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir         if( nObjNum < nObjCount )
204cdf0e10cSrcweir         {
205cdf0e10cSrcweir             SdrObject* pObject = rList.NbcRemoveObject( nObjNum );
206cdf0e10cSrcweir             SdrObject::Free( pObject );
207cdf0e10cSrcweir         }
208cdf0e10cSrcweir         else
209cdf0e10cSrcweir         {
210cdf0e10cSrcweir             DBG_ASSERT( 0, "Fatality! SdrObject is not belonging to its SdrObjList! [CL]" );
211cdf0e10cSrcweir         }
212cdf0e10cSrcweir     }
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir //----------------------------------------------------------------------
getCount()216cdf0e10cSrcweir sal_Int32 SAL_CALL Svx3DSceneObject::getCount()
217cdf0e10cSrcweir     throw( uno::RuntimeException )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir     OGuard aGuard( Application::GetSolarMutex() );
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     sal_Int32 nRetval = 0;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     if(mpObj.is() && mpObj->ISA(E3dPolyScene) && mpObj->GetSubList())
224cdf0e10cSrcweir         nRetval = mpObj->GetSubList()->GetObjCount();
225cdf0e10cSrcweir     return nRetval;
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir //----------------------------------------------------------------------
229cdf0e10cSrcweir 
getByIndex(sal_Int32 Index)230cdf0e10cSrcweir uno::Any SAL_CALL Svx3DSceneObject::getByIndex( sal_Int32 Index )
231cdf0e10cSrcweir     throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
232cdf0e10cSrcweir {
233cdf0e10cSrcweir     OGuard aGuard( Application::GetSolarMutex() );
234cdf0e10cSrcweir 
235cdf0e10cSrcweir     if( !mpObj.is() || mpObj->GetSubList() == NULL )
236cdf0e10cSrcweir         throw uno::RuntimeException();
237cdf0e10cSrcweir 
238cdf0e10cSrcweir     if( mpObj->GetSubList()->GetObjCount() <= (sal_uInt32)Index )
239cdf0e10cSrcweir         throw lang::IndexOutOfBoundsException();
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     SdrObject* pDestObj = mpObj->GetSubList()->GetObj( Index );
242cdf0e10cSrcweir     if(pDestObj == NULL)
243cdf0e10cSrcweir         throw lang::IndexOutOfBoundsException();
244cdf0e10cSrcweir 
245cdf0e10cSrcweir     Reference< drawing::XShape > xShape( pDestObj->getUnoShape(), uno::UNO_QUERY );
246cdf0e10cSrcweir     uno::Any aAny;
247cdf0e10cSrcweir     aAny <<= xShape;
248cdf0e10cSrcweir     return aAny;
249cdf0e10cSrcweir }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir //----------------------------------------------------------------------
252cdf0e10cSrcweir // ::com::sun::star::container::XElementAccess
253cdf0e10cSrcweir 
getElementType()254cdf0e10cSrcweir uno::Type SAL_CALL Svx3DSceneObject::getElementType()
255cdf0e10cSrcweir     throw( uno::RuntimeException )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir     return ::getCppuType(( const Reference< drawing::XShape>*)0);
258cdf0e10cSrcweir }
259cdf0e10cSrcweir 
260cdf0e10cSrcweir //----------------------------------------------------------------------
hasElements()261cdf0e10cSrcweir sal_Bool SAL_CALL Svx3DSceneObject::hasElements()
262cdf0e10cSrcweir     throw( uno::RuntimeException )
263cdf0e10cSrcweir {
264cdf0e10cSrcweir     OGuard aGuard( Application::GetSolarMutex() );
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     return mpObj.is() && mpObj->GetSubList() && (mpObj->GetSubList()->GetObjCount() > 0);
267cdf0e10cSrcweir }
268cdf0e10cSrcweir 
269cdf0e10cSrcweir //----------------------------------------------------------------------
270cdf0e10cSrcweir 
ConvertHomogenMatrixToObject(E3dObject * pObject,const Any & rValue)271cdf0e10cSrcweir static bool ConvertHomogenMatrixToObject( E3dObject* pObject, const Any& rValue )
272cdf0e10cSrcweir {
273cdf0e10cSrcweir     drawing::HomogenMatrix m;
274cdf0e10cSrcweir     if( rValue >>= m )
275cdf0e10cSrcweir     {
276cdf0e10cSrcweir         basegfx::B3DHomMatrix aMat;
277cdf0e10cSrcweir         aMat.set(0, 0, m.Line1.Column1);
278cdf0e10cSrcweir         aMat.set(0, 1, m.Line1.Column2);
279cdf0e10cSrcweir         aMat.set(0, 2, m.Line1.Column3);
280cdf0e10cSrcweir         aMat.set(0, 3, m.Line1.Column4);
281cdf0e10cSrcweir         aMat.set(1, 0, m.Line2.Column1);
282cdf0e10cSrcweir         aMat.set(1, 1, m.Line2.Column2);
283cdf0e10cSrcweir         aMat.set(1, 2, m.Line2.Column3);
284cdf0e10cSrcweir         aMat.set(1, 3, m.Line2.Column4);
285cdf0e10cSrcweir         aMat.set(2, 0, m.Line3.Column1);
286cdf0e10cSrcweir         aMat.set(2, 1, m.Line3.Column2);
287cdf0e10cSrcweir         aMat.set(2, 2, m.Line3.Column3);
288cdf0e10cSrcweir         aMat.set(2, 3, m.Line3.Column4);
289cdf0e10cSrcweir         aMat.set(3, 0, m.Line4.Column1);
290cdf0e10cSrcweir         aMat.set(3, 1, m.Line4.Column2);
291cdf0e10cSrcweir         aMat.set(3, 2, m.Line4.Column3);
292cdf0e10cSrcweir         aMat.set(3, 3, m.Line4.Column4);
293cdf0e10cSrcweir         pObject->SetTransform(aMat);
294cdf0e10cSrcweir         return true;
295cdf0e10cSrcweir     }
296cdf0e10cSrcweir     return false;
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
ConvertObjectToHomogenMatric(E3dObject * pObject,Any & rValue)299cdf0e10cSrcweir static void ConvertObjectToHomogenMatric( E3dObject* pObject, Any& rValue )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir     drawing::HomogenMatrix aHomMat;
302cdf0e10cSrcweir     const basegfx::B3DHomMatrix& rMat = pObject->GetTransform();
303cdf0e10cSrcweir     aHomMat.Line1.Column1 = rMat.get(0, 0);
304cdf0e10cSrcweir     aHomMat.Line1.Column2 = rMat.get(0, 1);
305cdf0e10cSrcweir     aHomMat.Line1.Column3 = rMat.get(0, 2);
306cdf0e10cSrcweir     aHomMat.Line1.Column4 = rMat.get(0, 3);
307cdf0e10cSrcweir     aHomMat.Line2.Column1 = rMat.get(1, 0);
308cdf0e10cSrcweir     aHomMat.Line2.Column2 = rMat.get(1, 1);
309cdf0e10cSrcweir     aHomMat.Line2.Column3 = rMat.get(1, 2);
310cdf0e10cSrcweir     aHomMat.Line2.Column4 = rMat.get(1, 3);
311cdf0e10cSrcweir     aHomMat.Line3.Column1 = rMat.get(2, 0);
312cdf0e10cSrcweir     aHomMat.Line3.Column2 = rMat.get(2, 1);
313cdf0e10cSrcweir     aHomMat.Line3.Column3 = rMat.get(2, 2);
314cdf0e10cSrcweir     aHomMat.Line3.Column4 = rMat.get(2, 3);
315cdf0e10cSrcweir     aHomMat.Line4.Column1 = rMat.get(3, 0);
316cdf0e10cSrcweir     aHomMat.Line4.Column2 = rMat.get(3, 1);
317cdf0e10cSrcweir     aHomMat.Line4.Column3 = rMat.get(3, 2);
318cdf0e10cSrcweir     aHomMat.Line4.Column4 = rMat.get(3, 3);
319cdf0e10cSrcweir     rValue <<= aHomMat;
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir //----------------------------------------------------------------------
323cdf0e10cSrcweir #include <svx/svditer.hxx>
324cdf0e10cSrcweir 
325cdf0e10cSrcweir struct ImpRememberTransAndRect
326cdf0e10cSrcweir {
327cdf0e10cSrcweir     basegfx::B3DHomMatrix                   maMat;
328cdf0e10cSrcweir     Rectangle                   maRect;
329cdf0e10cSrcweir };
330cdf0e10cSrcweir 
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)331cdf0e10cSrcweir bool Svx3DSceneObject::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
332cdf0e10cSrcweir {
333cdf0e10cSrcweir     switch( pProperty->nWID )
334cdf0e10cSrcweir     {
335cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
336cdf0e10cSrcweir     {
337cdf0e10cSrcweir         // Transformationsmatrix in das Objekt packen
338cdf0e10cSrcweir         if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) )
339cdf0e10cSrcweir             return true;
340cdf0e10cSrcweir         break;
341cdf0e10cSrcweir     }
342cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_CAMERA_GEOMETRY:
343cdf0e10cSrcweir     {
344cdf0e10cSrcweir         // set CameraGeometry at scene
345cdf0e10cSrcweir         E3dScene* pScene = static_cast< E3dScene* >( mpObj.get() );
346cdf0e10cSrcweir         drawing::CameraGeometry aCamGeo;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir         if(rValue >>= aCamGeo)
349cdf0e10cSrcweir         {
350cdf0e10cSrcweir             basegfx::B3DPoint aVRP(aCamGeo.vrp.PositionX, aCamGeo.vrp.PositionY, aCamGeo.vrp.PositionZ);
351cdf0e10cSrcweir             basegfx::B3DVector aVPN(aCamGeo.vpn.DirectionX, aCamGeo.vpn.DirectionY, aCamGeo.vpn.DirectionZ);
352cdf0e10cSrcweir             basegfx::B3DVector aVUP(aCamGeo.vup.DirectionX, aCamGeo.vup.DirectionY, aCamGeo.vup.DirectionZ);
353cdf0e10cSrcweir 
354cdf0e10cSrcweir             // rescue scene transformation
355cdf0e10cSrcweir             ImpRememberTransAndRect aSceneTAR;
356cdf0e10cSrcweir             aSceneTAR.maMat = pScene->GetTransform();
357cdf0e10cSrcweir             aSceneTAR.maRect = pScene->GetSnapRect();
358cdf0e10cSrcweir 
359cdf0e10cSrcweir             // rescue object transformations
360cdf0e10cSrcweir             SdrObjListIter aIter(*pScene->GetSubList(), IM_DEEPWITHGROUPS);
361cdf0e10cSrcweir             List aObjTrans;
362cdf0e10cSrcweir             while(aIter.IsMore())
363cdf0e10cSrcweir             {
364cdf0e10cSrcweir                 E3dObject* p3DObj = (E3dObject*)aIter.Next();
365cdf0e10cSrcweir                 basegfx::B3DHomMatrix* pNew = new basegfx::B3DHomMatrix;
366cdf0e10cSrcweir                 *pNew = p3DObj->GetTransform();
367cdf0e10cSrcweir                 aObjTrans.Insert(pNew, LIST_APPEND);
368cdf0e10cSrcweir             }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir             // reset object transformations
371cdf0e10cSrcweir             aIter.Reset();
372cdf0e10cSrcweir             while(aIter.IsMore())
373cdf0e10cSrcweir             {
374cdf0e10cSrcweir                 E3dObject* p3DObj = (E3dObject*)aIter.Next();
375cdf0e10cSrcweir                 p3DObj->NbcSetTransform(basegfx::B3DHomMatrix());
376cdf0e10cSrcweir             }
377cdf0e10cSrcweir 
378cdf0e10cSrcweir             // reset scene transformation and make a complete recalc
379cdf0e10cSrcweir             pScene->NbcSetTransform(basegfx::B3DHomMatrix());
380cdf0e10cSrcweir 
381cdf0e10cSrcweir             // fill old camera from new parameters
382cdf0e10cSrcweir             Camera3D aCam(pScene->GetCamera());
383cdf0e10cSrcweir             const basegfx::B3DRange& rVolume = pScene->GetBoundVolume();
384cdf0e10cSrcweir             double fW = rVolume.getWidth();
385cdf0e10cSrcweir             double fH = rVolume.getHeight();
386cdf0e10cSrcweir 
387cdf0e10cSrcweir             const SfxItemSet& rSceneSet = pScene->GetMergedItemSet();
388cdf0e10cSrcweir             double fCamPosZ =
389cdf0e10cSrcweir                 (double)((const SfxUInt32Item&)rSceneSet.Get(SDRATTR_3DSCENE_DISTANCE)).GetValue();
390cdf0e10cSrcweir             double fCamFocal =
391cdf0e10cSrcweir                 (double)((const SfxUInt32Item&)rSceneSet.Get(SDRATTR_3DSCENE_FOCAL_LENGTH)).GetValue();
392cdf0e10cSrcweir 
393cdf0e10cSrcweir             aCam.SetAutoAdjustProjection(sal_False);
394cdf0e10cSrcweir             aCam.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
395cdf0e10cSrcweir             basegfx::B3DPoint aLookAt;
396cdf0e10cSrcweir             basegfx::B3DPoint aCamPos(0.0, 0.0, fCamPosZ);
397cdf0e10cSrcweir             aCam.SetPosAndLookAt(aCamPos, aLookAt);
398cdf0e10cSrcweir             aCam.SetFocalLength(fCamFocal / 100.0);
399cdf0e10cSrcweir             aCam.SetDefaults(basegfx::B3DPoint(0.0, 0.0, fCamPosZ), aLookAt, fCamFocal / 100.0);
400cdf0e10cSrcweir             aCam.SetDeviceWindow(Rectangle(0, 0, (long)fW, (long)fH));
401cdf0e10cSrcweir 
402cdf0e10cSrcweir             // set at scene
403cdf0e10cSrcweir             pScene->SetCamera(aCam);
404cdf0e10cSrcweir 
405cdf0e10cSrcweir             // #91047# use imported VRP, VPN and VUP (if used)
406cdf0e10cSrcweir             sal_Bool bVRPUsed(!aVRP.equal(basegfx::B3DPoint(0.0, 0.0, 1.0)));
407cdf0e10cSrcweir             sal_Bool bVPNUsed(!aVPN.equal(basegfx::B3DVector(0.0, 0.0, 1.0)));
408cdf0e10cSrcweir             sal_Bool bVUPUsed(!aVUP.equal(basegfx::B3DVector(0.0, 1.0, 0.0)));
409cdf0e10cSrcweir 
410cdf0e10cSrcweir             if(bVRPUsed || bVPNUsed || bVUPUsed)
411cdf0e10cSrcweir             {
412cdf0e10cSrcweir                 pScene->GetCameraSet().SetViewportValues(aVRP, aVPN, aVUP);
413cdf0e10cSrcweir             }
414cdf0e10cSrcweir 
415cdf0e10cSrcweir             // set object transformations again at objects
416cdf0e10cSrcweir             aIter.Reset();
417cdf0e10cSrcweir             sal_uInt32 nIndex(0L);
418cdf0e10cSrcweir             while(aIter.IsMore())
419cdf0e10cSrcweir             {
420cdf0e10cSrcweir                 E3dObject* p3DObj = (E3dObject*)aIter.Next();
421cdf0e10cSrcweir                 basegfx::B3DHomMatrix* pMat = (basegfx::B3DHomMatrix*)aObjTrans.GetObject(nIndex++);
422cdf0e10cSrcweir                 p3DObj->NbcSetTransform(*pMat);
423cdf0e10cSrcweir                 delete pMat;
424cdf0e10cSrcweir             }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir             // set scene transformation again at scene
427cdf0e10cSrcweir             pScene->NbcSetTransform(aSceneTAR.maMat);
428cdf0e10cSrcweir             pScene->NbcSetSnapRect(aSceneTAR.maRect);
429cdf0e10cSrcweir 
430cdf0e10cSrcweir             return true;
431cdf0e10cSrcweir         }
432cdf0e10cSrcweir         break;
433cdf0e10cSrcweir     }
434cdf0e10cSrcweir     default:
435cdf0e10cSrcweir         return SvxShape::setPropertyValueImpl(rName, pProperty, rValue);
436cdf0e10cSrcweir     }
437cdf0e10cSrcweir 
438cdf0e10cSrcweir     throw IllegalArgumentException();
439cdf0e10cSrcweir }
440cdf0e10cSrcweir 
441cdf0e10cSrcweir //----------------------------------------------------------------------
442cdf0e10cSrcweir 
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)443cdf0e10cSrcweir bool Svx3DSceneObject::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
444cdf0e10cSrcweir {
445cdf0e10cSrcweir     switch( pProperty->nWID )
446cdf0e10cSrcweir     {
447cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
448cdf0e10cSrcweir     {
449cdf0e10cSrcweir         // Objekt in eine homogene 4x4 Matrix packen
450cdf0e10cSrcweir         ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue );
451cdf0e10cSrcweir         break;
452cdf0e10cSrcweir     }
453cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_CAMERA_GEOMETRY:
454cdf0e10cSrcweir     {
455cdf0e10cSrcweir         // get CameraGeometry from scene
456cdf0e10cSrcweir         E3dScene* pScene = static_cast< E3dScene* >( mpObj.get() );
457cdf0e10cSrcweir         drawing::CameraGeometry aCamGeo;
458cdf0e10cSrcweir 
459cdf0e10cSrcweir         // fill Vectors from scene camera
460cdf0e10cSrcweir         B3dCamera& aCameraSet = pScene->GetCameraSet();
461cdf0e10cSrcweir         basegfx::B3DPoint aVRP(aCameraSet.GetVRP());
462cdf0e10cSrcweir         basegfx::B3DVector aVPN(aCameraSet.GetVPN());
463cdf0e10cSrcweir         basegfx::B3DVector aVUP(aCameraSet.GetVUV());
464cdf0e10cSrcweir 
465cdf0e10cSrcweir         // transfer to structure
466cdf0e10cSrcweir         aCamGeo.vrp.PositionX = aVRP.getX();
467cdf0e10cSrcweir         aCamGeo.vrp.PositionY = aVRP.getY();
468cdf0e10cSrcweir         aCamGeo.vrp.PositionZ = aVRP.getZ();
469cdf0e10cSrcweir         aCamGeo.vpn.DirectionX = aVPN.getX();
470cdf0e10cSrcweir         aCamGeo.vpn.DirectionY = aVPN.getY();
471cdf0e10cSrcweir         aCamGeo.vpn.DirectionZ = aVPN.getZ();
472cdf0e10cSrcweir         aCamGeo.vup.DirectionX = aVUP.getX();
473cdf0e10cSrcweir         aCamGeo.vup.DirectionY = aVUP.getY();
474cdf0e10cSrcweir         aCamGeo.vup.DirectionZ = aVUP.getZ();
475cdf0e10cSrcweir 
476cdf0e10cSrcweir         rValue <<= aCamGeo;
477cdf0e10cSrcweir         break;
478cdf0e10cSrcweir     }
479cdf0e10cSrcweir     default:
480cdf0e10cSrcweir         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
481cdf0e10cSrcweir     }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir     return true;
484cdf0e10cSrcweir }
485cdf0e10cSrcweir 
486cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo
getSupportedServiceNames()487cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL Svx3DSceneObject::getSupportedServiceNames()
488cdf0e10cSrcweir     throw(uno::RuntimeException)
489cdf0e10cSrcweir {
490cdf0e10cSrcweir     uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
491cdf0e10cSrcweir     comphelper::ServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.drawing.Shape3DScene" );
492cdf0e10cSrcweir     return aSeq;
493cdf0e10cSrcweir }
494cdf0e10cSrcweir 
495cdf0e10cSrcweir /***********************************************************************
496cdf0e10cSrcweir *                                                                      *
497cdf0e10cSrcweir ***********************************************************************/
498cdf0e10cSrcweir 
499cdf0e10cSrcweir //----------------------------------------------------------------------
Svx3DCubeObject(SdrObject * pObj)500cdf0e10cSrcweir Svx3DCubeObject::Svx3DCubeObject( SdrObject* pObj ) throw()
501cdf0e10cSrcweir :   SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DCUBEOBJEKT), aSvxMapProvider.GetPropertySet(SVXMAP_3DCUBEOBJEKT, SdrObject::GetGlobalDrawObjectItemPool()) )
502cdf0e10cSrcweir {
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir //----------------------------------------------------------------------
~Svx3DCubeObject()506cdf0e10cSrcweir Svx3DCubeObject::~Svx3DCubeObject() throw()
507cdf0e10cSrcweir {
508cdf0e10cSrcweir }
509cdf0e10cSrcweir 
510cdf0e10cSrcweir //----------------------------------------------------------------------
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)511cdf0e10cSrcweir bool Svx3DCubeObject::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
512cdf0e10cSrcweir {
513cdf0e10cSrcweir     OGuard aGuard( Application::GetSolarMutex() );
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     switch( pProperty->nWID )
516cdf0e10cSrcweir     {
517cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
518cdf0e10cSrcweir     {
519cdf0e10cSrcweir         // Transformationsmatrix in das Objekt packen
520cdf0e10cSrcweir         if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) )
521cdf0e10cSrcweir             return true;
522cdf0e10cSrcweir         break;
523cdf0e10cSrcweir     }
524cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POSITION:
525cdf0e10cSrcweir     {
526cdf0e10cSrcweir         // Position in das Objekt packen
527cdf0e10cSrcweir         drawing::Position3D aUnoPos;
528cdf0e10cSrcweir         if( rValue >>= aUnoPos )
529cdf0e10cSrcweir         {
530cdf0e10cSrcweir             basegfx::B3DPoint aPos(aUnoPos.PositionX, aUnoPos.PositionY, aUnoPos.PositionZ);
531cdf0e10cSrcweir             static_cast< E3dCubeObj* >( mpObj.get() )->SetCubePos(aPos);
532cdf0e10cSrcweir             return true;
533cdf0e10cSrcweir         }
534cdf0e10cSrcweir         break;
535cdf0e10cSrcweir     }
536cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_SIZE:
537cdf0e10cSrcweir     {
538cdf0e10cSrcweir         // Groesse in das Objekt packen
539cdf0e10cSrcweir         drawing::Direction3D aDirection;
540cdf0e10cSrcweir         if( rValue >>= aDirection )
541cdf0e10cSrcweir         {
542cdf0e10cSrcweir             basegfx::B3DVector aSize(aDirection.DirectionX, aDirection.DirectionY, aDirection.DirectionZ);
543cdf0e10cSrcweir             static_cast< E3dCubeObj* >( mpObj.get() )->SetCubeSize(aSize);
544cdf0e10cSrcweir             return true;
545cdf0e10cSrcweir         }
546cdf0e10cSrcweir         break;
547cdf0e10cSrcweir     }
548cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POS_IS_CENTER:
549cdf0e10cSrcweir     {
550cdf0e10cSrcweir         sal_Bool bNew = sal_False;
551cdf0e10cSrcweir         // sal_Bool bPosIsCenter in das Objekt packen
552cdf0e10cSrcweir         if( rValue >>= bNew )
553cdf0e10cSrcweir         {
554cdf0e10cSrcweir             static_cast< E3dCubeObj* >( mpObj.get() )->SetPosIsCenter(bNew);
555cdf0e10cSrcweir             return true;
556cdf0e10cSrcweir         }
557cdf0e10cSrcweir         break;
558cdf0e10cSrcweir     }
559cdf0e10cSrcweir     default:
560cdf0e10cSrcweir         return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
561cdf0e10cSrcweir     }
562cdf0e10cSrcweir 
563cdf0e10cSrcweir     throw IllegalArgumentException();
564cdf0e10cSrcweir }
565cdf0e10cSrcweir 
566cdf0e10cSrcweir //----------------------------------------------------------------------
567cdf0e10cSrcweir 
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)568cdf0e10cSrcweir bool Svx3DCubeObject::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
569cdf0e10cSrcweir {
570cdf0e10cSrcweir     switch( pProperty->nWID )
571cdf0e10cSrcweir     {
572cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
573cdf0e10cSrcweir     {
574cdf0e10cSrcweir         // Transformation in eine homogene Matrix packen
575cdf0e10cSrcweir         ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue );
576cdf0e10cSrcweir         break;
577cdf0e10cSrcweir     }
578cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POSITION:
579cdf0e10cSrcweir     {
580cdf0e10cSrcweir         // Position packen
581cdf0e10cSrcweir         const basegfx::B3DPoint& rPos = ((E3dCubeObj*)mpObj.get())->GetCubePos();
582cdf0e10cSrcweir         drawing::Position3D aPos;
583cdf0e10cSrcweir 
584cdf0e10cSrcweir         aPos.PositionX = rPos.getX();
585cdf0e10cSrcweir         aPos.PositionY = rPos.getY();
586cdf0e10cSrcweir         aPos.PositionZ = rPos.getZ();
587cdf0e10cSrcweir 
588cdf0e10cSrcweir         rValue <<= aPos;
589cdf0e10cSrcweir         break;
590cdf0e10cSrcweir     }
591cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_SIZE:
592cdf0e10cSrcweir     {
593cdf0e10cSrcweir         // Groesse packen
594cdf0e10cSrcweir         const basegfx::B3DVector& rSize = static_cast<E3dCubeObj*>(mpObj.get())->GetCubeSize();
595cdf0e10cSrcweir         drawing::Direction3D aDir;
596cdf0e10cSrcweir 
597cdf0e10cSrcweir         aDir.DirectionX = rSize.getX();
598cdf0e10cSrcweir         aDir.DirectionY = rSize.getY();
599cdf0e10cSrcweir         aDir.DirectionZ = rSize.getZ();
600cdf0e10cSrcweir 
601cdf0e10cSrcweir         rValue <<= aDir;
602cdf0e10cSrcweir         break;
603cdf0e10cSrcweir     }
604cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POS_IS_CENTER:
605cdf0e10cSrcweir     {
606cdf0e10cSrcweir         rValue <<= static_cast<E3dCubeObj*>(mpObj.get())->GetPosIsCenter();
607cdf0e10cSrcweir         break;
608cdf0e10cSrcweir     }
609cdf0e10cSrcweir     default:
610cdf0e10cSrcweir         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
611cdf0e10cSrcweir     }
612cdf0e10cSrcweir 
613cdf0e10cSrcweir     return true;
614cdf0e10cSrcweir }
615cdf0e10cSrcweir 
616cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo
getSupportedServiceNames()617cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL Svx3DCubeObject::getSupportedServiceNames()
618cdf0e10cSrcweir     throw(uno::RuntimeException)
619cdf0e10cSrcweir {
620cdf0e10cSrcweir     uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
621cdf0e10cSrcweir     comphelper::ServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
622cdf0e10cSrcweir                             "com.sun.star.drawing.Shape3DCube");
623cdf0e10cSrcweir     return aSeq;
624cdf0e10cSrcweir }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir /***********************************************************************
627cdf0e10cSrcweir *                                                                      *
628cdf0e10cSrcweir ***********************************************************************/
629cdf0e10cSrcweir 
630cdf0e10cSrcweir //----------------------------------------------------------------------
Svx3DSphereObject(SdrObject * pObj)631cdf0e10cSrcweir Svx3DSphereObject::Svx3DSphereObject( SdrObject* pObj ) throw()
632cdf0e10cSrcweir :   SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DSPHEREOBJECT), aSvxMapProvider.GetPropertySet(SVXMAP_3DSPHEREOBJECT, SdrObject::GetGlobalDrawObjectItemPool()) )
633cdf0e10cSrcweir {
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
636cdf0e10cSrcweir //----------------------------------------------------------------------
~Svx3DSphereObject()637cdf0e10cSrcweir Svx3DSphereObject::~Svx3DSphereObject() throw()
638cdf0e10cSrcweir {
639cdf0e10cSrcweir }
640cdf0e10cSrcweir 
641cdf0e10cSrcweir //----------------------------------------------------------------------
642cdf0e10cSrcweir 
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)643cdf0e10cSrcweir bool Svx3DSphereObject::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
644cdf0e10cSrcweir {
645cdf0e10cSrcweir     switch( pProperty->nWID )
646cdf0e10cSrcweir     {
647cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
648cdf0e10cSrcweir     {
649cdf0e10cSrcweir         // Transformationsmatrix in das Objekt packen
650cdf0e10cSrcweir         if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) )
651cdf0e10cSrcweir             return true;
652cdf0e10cSrcweir         break;
653cdf0e10cSrcweir     }
654cdf0e10cSrcweir 
655cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POSITION:
656cdf0e10cSrcweir     {
657cdf0e10cSrcweir         // Position in das Objekt packen
658cdf0e10cSrcweir         drawing::Position3D aUnoPos;
659cdf0e10cSrcweir         if( rValue >>= aUnoPos )
660cdf0e10cSrcweir         {
661cdf0e10cSrcweir             basegfx::B3DPoint aPos(aUnoPos.PositionX, aUnoPos.PositionY, aUnoPos.PositionZ);
662cdf0e10cSrcweir             static_cast<E3dSphereObj*>(mpObj.get())->SetCenter(aPos);
663cdf0e10cSrcweir             return true;
664cdf0e10cSrcweir         }
665cdf0e10cSrcweir         break;
666cdf0e10cSrcweir     }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_SIZE:
669cdf0e10cSrcweir     {
670cdf0e10cSrcweir         // Groesse in das Objekt packen
671cdf0e10cSrcweir         drawing::Direction3D aDir;
672cdf0e10cSrcweir         if( rValue >>= aDir )
673cdf0e10cSrcweir         {
674cdf0e10cSrcweir             basegfx::B3DVector aPos(aDir.DirectionX, aDir.DirectionY, aDir.DirectionZ);
675cdf0e10cSrcweir             static_cast<E3dSphereObj*>(mpObj.get())->SetSize(aPos);
676cdf0e10cSrcweir             return true;
677cdf0e10cSrcweir         }
678cdf0e10cSrcweir         break;
679cdf0e10cSrcweir     }
680cdf0e10cSrcweir     default:
681cdf0e10cSrcweir         return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
682cdf0e10cSrcweir     }
683cdf0e10cSrcweir 
684cdf0e10cSrcweir     throw IllegalArgumentException();
685cdf0e10cSrcweir }
686cdf0e10cSrcweir 
687cdf0e10cSrcweir //----------------------------------------------------------------------
688cdf0e10cSrcweir 
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)689cdf0e10cSrcweir bool Svx3DSphereObject::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
690cdf0e10cSrcweir {
691cdf0e10cSrcweir     switch( pProperty->nWID )
692cdf0e10cSrcweir     {
693cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
694cdf0e10cSrcweir     {
695cdf0e10cSrcweir         // Transformation in eine homogene Matrix packen
696cdf0e10cSrcweir         ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue );
697cdf0e10cSrcweir         break;
698cdf0e10cSrcweir     }
699cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POSITION:
700cdf0e10cSrcweir     {
701cdf0e10cSrcweir         // Position packen
702cdf0e10cSrcweir         const basegfx::B3DPoint& rPos = ((E3dSphereObj*)mpObj.get())->Center();
703cdf0e10cSrcweir         drawing::Position3D aPos;
704cdf0e10cSrcweir 
705cdf0e10cSrcweir         aPos.PositionX = rPos.getX();
706cdf0e10cSrcweir         aPos.PositionY = rPos.getY();
707cdf0e10cSrcweir         aPos.PositionZ = rPos.getZ();
708cdf0e10cSrcweir 
709cdf0e10cSrcweir         rValue <<= aPos;
710cdf0e10cSrcweir         break;
711cdf0e10cSrcweir     }
712cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_SIZE:
713cdf0e10cSrcweir     {
714cdf0e10cSrcweir         // Groesse packen
715cdf0e10cSrcweir         const basegfx::B3DVector& rSize = ((E3dSphereObj*)mpObj.get())->Size();
716cdf0e10cSrcweir         drawing::Direction3D aDir;
717cdf0e10cSrcweir 
718cdf0e10cSrcweir         aDir.DirectionX = rSize.getX();
719cdf0e10cSrcweir         aDir.DirectionY = rSize.getY();
720cdf0e10cSrcweir         aDir.DirectionZ = rSize.getZ();
721cdf0e10cSrcweir 
722cdf0e10cSrcweir         rValue <<= aDir;
723cdf0e10cSrcweir         break;
724cdf0e10cSrcweir     }
725cdf0e10cSrcweir     default:
726cdf0e10cSrcweir         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
727cdf0e10cSrcweir     }
728cdf0e10cSrcweir 
729cdf0e10cSrcweir     return true;
730cdf0e10cSrcweir }
731cdf0e10cSrcweir 
732cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo
getSupportedServiceNames()733cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL Svx3DSphereObject::getSupportedServiceNames()
734cdf0e10cSrcweir     throw(uno::RuntimeException)
735cdf0e10cSrcweir {
736cdf0e10cSrcweir     uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
737cdf0e10cSrcweir     comphelper::ServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
738cdf0e10cSrcweir                             "com.sun.star.drawing.Shape3DSphere");
739cdf0e10cSrcweir     return aSeq;
740cdf0e10cSrcweir }
741cdf0e10cSrcweir 
742cdf0e10cSrcweir /***********************************************************************
743cdf0e10cSrcweir *                                                                      *
744cdf0e10cSrcweir ***********************************************************************/
745cdf0e10cSrcweir 
746cdf0e10cSrcweir //----------------------------------------------------------------------
Svx3DLatheObject(SdrObject * pObj)747cdf0e10cSrcweir Svx3DLatheObject::Svx3DLatheObject( SdrObject* pObj ) throw()
748cdf0e10cSrcweir :   SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DLATHEOBJECT), aSvxMapProvider.GetPropertySet(SVXMAP_3DLATHEOBJECT, SdrObject::GetGlobalDrawObjectItemPool()) )
749cdf0e10cSrcweir {
750cdf0e10cSrcweir }
751cdf0e10cSrcweir 
752cdf0e10cSrcweir //----------------------------------------------------------------------
~Svx3DLatheObject()753cdf0e10cSrcweir Svx3DLatheObject::~Svx3DLatheObject() throw()
754cdf0e10cSrcweir {
755cdf0e10cSrcweir }
756cdf0e10cSrcweir 
PolyPolygonShape3D_to_B3dPolyPolygon(const Any & rValue,basegfx::B3DPolyPolygon & rResultPolygon,bool bCorrectPolygon)757cdf0e10cSrcweir bool PolyPolygonShape3D_to_B3dPolyPolygon(
758cdf0e10cSrcweir     const Any& rValue,
759cdf0e10cSrcweir     basegfx::B3DPolyPolygon& rResultPolygon,
760cdf0e10cSrcweir     bool bCorrectPolygon)
761cdf0e10cSrcweir {
762cdf0e10cSrcweir     drawing::PolyPolygonShape3D aSourcePolyPolygon;
763cdf0e10cSrcweir     if( !(rValue >>= aSourcePolyPolygon) )
764cdf0e10cSrcweir         return false;
765cdf0e10cSrcweir 
766cdf0e10cSrcweir     sal_Int32 nOuterSequenceCount = aSourcePolyPolygon.SequenceX.getLength();
767cdf0e10cSrcweir     if(nOuterSequenceCount != aSourcePolyPolygon.SequenceY.getLength() || nOuterSequenceCount != aSourcePolyPolygon.SequenceZ.getLength())
768cdf0e10cSrcweir         return false;
769cdf0e10cSrcweir 
770cdf0e10cSrcweir     drawing::DoubleSequence* pInnerSequenceX = aSourcePolyPolygon.SequenceX.getArray();
771cdf0e10cSrcweir     drawing::DoubleSequence* pInnerSequenceY = aSourcePolyPolygon.SequenceY.getArray();
772cdf0e10cSrcweir     drawing::DoubleSequence* pInnerSequenceZ = aSourcePolyPolygon.SequenceZ.getArray();
773cdf0e10cSrcweir     for(sal_Int32 a(0L);a<nOuterSequenceCount;a++)
774cdf0e10cSrcweir     {
775cdf0e10cSrcweir         sal_Int32 nInnerSequenceCount = pInnerSequenceX->getLength();
776cdf0e10cSrcweir         if(nInnerSequenceCount != pInnerSequenceY->getLength() || nInnerSequenceCount != pInnerSequenceZ->getLength())
777cdf0e10cSrcweir         {
778cdf0e10cSrcweir             return false;
779cdf0e10cSrcweir         }
780cdf0e10cSrcweir         basegfx::B3DPolygon aNewPolygon;
781cdf0e10cSrcweir         double* pArrayX = pInnerSequenceX->getArray();
782cdf0e10cSrcweir         double* pArrayY = pInnerSequenceY->getArray();
783cdf0e10cSrcweir         double* pArrayZ = pInnerSequenceZ->getArray();
784cdf0e10cSrcweir         for(sal_Int32 b(0L);b<nInnerSequenceCount;b++)
785cdf0e10cSrcweir         {
786cdf0e10cSrcweir             aNewPolygon.append(basegfx::B3DPoint(*pArrayX++,*pArrayY++,*pArrayZ++));
787cdf0e10cSrcweir         }
788cdf0e10cSrcweir         pInnerSequenceX++;
789cdf0e10cSrcweir         pInnerSequenceY++;
790cdf0e10cSrcweir         pInnerSequenceZ++;
791cdf0e10cSrcweir 
792cdf0e10cSrcweir         // #i101520# correction is needed for imported polygons of old format,
793cdf0e10cSrcweir         // see callers
794cdf0e10cSrcweir         if(bCorrectPolygon)
795cdf0e10cSrcweir         {
796cdf0e10cSrcweir             basegfx::tools::checkClosed(aNewPolygon);
797cdf0e10cSrcweir         }
798cdf0e10cSrcweir 
799cdf0e10cSrcweir         rResultPolygon.append(aNewPolygon);
800cdf0e10cSrcweir     }
801cdf0e10cSrcweir     return true;
802cdf0e10cSrcweir }
803cdf0e10cSrcweir 
B3dPolyPolygon_to_PolyPolygonShape3D(const basegfx::B3DPolyPolygon & rSourcePolyPolygon,Any & rValue)804cdf0e10cSrcweir static void B3dPolyPolygon_to_PolyPolygonShape3D( const basegfx::B3DPolyPolygon& rSourcePolyPolygon, Any& rValue )
805cdf0e10cSrcweir {
806cdf0e10cSrcweir     drawing::PolyPolygonShape3D aRetval;
807cdf0e10cSrcweir     aRetval.SequenceX.realloc(rSourcePolyPolygon.count());
808cdf0e10cSrcweir     aRetval.SequenceY.realloc(rSourcePolyPolygon.count());
809cdf0e10cSrcweir     aRetval.SequenceZ.realloc(rSourcePolyPolygon.count());
810cdf0e10cSrcweir     drawing::DoubleSequence* pOuterSequenceX = aRetval.SequenceX.getArray();
811cdf0e10cSrcweir     drawing::DoubleSequence* pOuterSequenceY = aRetval.SequenceY.getArray();
812cdf0e10cSrcweir     drawing::DoubleSequence* pOuterSequenceZ = aRetval.SequenceZ.getArray();
813cdf0e10cSrcweir     for(sal_uInt32 a(0L);a<rSourcePolyPolygon.count();a++)
814cdf0e10cSrcweir     {
815cdf0e10cSrcweir         const basegfx::B3DPolygon aPoly(rSourcePolyPolygon.getB3DPolygon(a));
816cdf0e10cSrcweir         sal_Int32 nPointCount(aPoly.count());
817cdf0e10cSrcweir         if(aPoly.isClosed()) nPointCount++;
818cdf0e10cSrcweir         pOuterSequenceX->realloc(nPointCount);
819cdf0e10cSrcweir         pOuterSequenceY->realloc(nPointCount);
820cdf0e10cSrcweir         pOuterSequenceZ->realloc(nPointCount);
821cdf0e10cSrcweir         double* pInnerSequenceX = pOuterSequenceX->getArray();
822cdf0e10cSrcweir         double* pInnerSequenceY = pOuterSequenceY->getArray();
823cdf0e10cSrcweir         double* pInnerSequenceZ = pOuterSequenceZ->getArray();
824cdf0e10cSrcweir         for(sal_uInt32 b(0L);b<aPoly.count();b++)
825cdf0e10cSrcweir         {
826cdf0e10cSrcweir             const basegfx::B3DPoint aPoint(aPoly.getB3DPoint(b));
827cdf0e10cSrcweir             *pInnerSequenceX++ = aPoint.getX();
828cdf0e10cSrcweir             *pInnerSequenceY++ = aPoint.getY();
829cdf0e10cSrcweir             *pInnerSequenceZ++ = aPoint.getZ();
830cdf0e10cSrcweir         }
831cdf0e10cSrcweir         if(aPoly.isClosed())
832cdf0e10cSrcweir         {
833cdf0e10cSrcweir             const basegfx::B3DPoint aPoint(aPoly.getB3DPoint(0L));
834cdf0e10cSrcweir             *pInnerSequenceX++ = aPoint.getX();
835cdf0e10cSrcweir             *pInnerSequenceY++ = aPoint.getY();
836cdf0e10cSrcweir             *pInnerSequenceZ++ = aPoint.getZ();
837cdf0e10cSrcweir         }
838cdf0e10cSrcweir         pOuterSequenceX++;
839cdf0e10cSrcweir         pOuterSequenceY++;
840cdf0e10cSrcweir         pOuterSequenceZ++;
841cdf0e10cSrcweir     }
842cdf0e10cSrcweir     rValue <<= aRetval;
843cdf0e10cSrcweir }
844cdf0e10cSrcweir 
845cdf0e10cSrcweir //----------------------------------------------------------------------
846cdf0e10cSrcweir 
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)847cdf0e10cSrcweir bool Svx3DLatheObject::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
848cdf0e10cSrcweir {
849cdf0e10cSrcweir     switch( pProperty->nWID )
850cdf0e10cSrcweir     {
851cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
852cdf0e10cSrcweir     {
853cdf0e10cSrcweir         // Transformationsmatrix in das Objekt packen
854cdf0e10cSrcweir         if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) )
855cdf0e10cSrcweir             return true;
856cdf0e10cSrcweir         break;
857cdf0e10cSrcweir     }
858cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POLYPOLYGON3D:
859cdf0e10cSrcweir     {
860cdf0e10cSrcweir         // Polygondefinition in das Objekt packen
861cdf0e10cSrcweir         basegfx::B3DPolyPolygon aNewB3DPolyPolygon;
862cdf0e10cSrcweir 
863cdf0e10cSrcweir         // #i101520# Probably imported
864cdf0e10cSrcweir         if( PolyPolygonShape3D_to_B3dPolyPolygon( rValue, aNewB3DPolyPolygon, true ) )
865cdf0e10cSrcweir         {
866cdf0e10cSrcweir             // #105127# SetPolyPoly3D sets the Svx3DVerticalSegmentsItem to the number
867cdf0e10cSrcweir             // of points of the polygon. Thus, value gets lost. To avoid this, rescue
868cdf0e10cSrcweir             // item here and re-set after setting the polygon.
869cdf0e10cSrcweir             const sal_uInt32 nPrevVerticalSegs(static_cast<E3dLatheObj*>(mpObj.get())->GetVerticalSegments());
870cdf0e10cSrcweir 
871cdf0e10cSrcweir             // Polygon setzen
872cdf0e10cSrcweir             const basegfx::B3DHomMatrix aIdentity;
873cdf0e10cSrcweir             const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::tools::createB2DPolyPolygonFromB3DPolyPolygon(aNewB3DPolyPolygon, aIdentity));
874cdf0e10cSrcweir             static_cast<E3dLatheObj*>(mpObj.get())->SetPolyPoly2D(aB2DPolyPolygon);
875cdf0e10cSrcweir             const sal_uInt32 nPostVerticalSegs(static_cast<E3dLatheObj*>(mpObj.get())->GetVerticalSegments());
876cdf0e10cSrcweir 
877cdf0e10cSrcweir             if(nPrevVerticalSegs != nPostVerticalSegs)
878cdf0e10cSrcweir             {
879cdf0e10cSrcweir                 // restore the vertical segment count
880cdf0e10cSrcweir                 static_cast<E3dLatheObj*>(mpObj.get())->SetMergedItem(Svx3DVerticalSegmentsItem(nPrevVerticalSegs));
881cdf0e10cSrcweir             }
882cdf0e10cSrcweir             return true;
883cdf0e10cSrcweir         }
884cdf0e10cSrcweir         break;
885cdf0e10cSrcweir     }
886cdf0e10cSrcweir     default:
887cdf0e10cSrcweir         return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
888cdf0e10cSrcweir     }
889cdf0e10cSrcweir 
890cdf0e10cSrcweir     throw IllegalArgumentException();
891cdf0e10cSrcweir }
892cdf0e10cSrcweir 
893cdf0e10cSrcweir //----------------------------------------------------------------------
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)894cdf0e10cSrcweir bool Svx3DLatheObject::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
895cdf0e10cSrcweir {
896cdf0e10cSrcweir     switch( pProperty->nWID )
897cdf0e10cSrcweir     {
898cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
899cdf0e10cSrcweir     {
900cdf0e10cSrcweir         // Transformation in eine homogene Matrix packen
901cdf0e10cSrcweir         drawing::HomogenMatrix aHomMat;
902cdf0e10cSrcweir         basegfx::B3DHomMatrix aMat = static_cast<E3dObject*>(mpObj.get())->GetTransform();
903cdf0e10cSrcweir 
904cdf0e10cSrcweir         // pack evtl. transformed matrix to output
905cdf0e10cSrcweir         aHomMat.Line1.Column1 = aMat.get(0, 0);
906cdf0e10cSrcweir         aHomMat.Line1.Column2 = aMat.get(0, 1);
907cdf0e10cSrcweir         aHomMat.Line1.Column3 = aMat.get(0, 2);
908cdf0e10cSrcweir         aHomMat.Line1.Column4 = aMat.get(0, 3);
909cdf0e10cSrcweir         aHomMat.Line2.Column1 = aMat.get(1, 0);
910cdf0e10cSrcweir         aHomMat.Line2.Column2 = aMat.get(1, 1);
911cdf0e10cSrcweir         aHomMat.Line2.Column3 = aMat.get(1, 2);
912cdf0e10cSrcweir         aHomMat.Line2.Column4 = aMat.get(1, 3);
913cdf0e10cSrcweir         aHomMat.Line3.Column1 = aMat.get(2, 0);
914cdf0e10cSrcweir         aHomMat.Line3.Column2 = aMat.get(2, 1);
915cdf0e10cSrcweir         aHomMat.Line3.Column3 = aMat.get(2, 2);
916cdf0e10cSrcweir         aHomMat.Line3.Column4 = aMat.get(2, 3);
917cdf0e10cSrcweir         aHomMat.Line4.Column1 = aMat.get(3, 0);
918cdf0e10cSrcweir         aHomMat.Line4.Column2 = aMat.get(3, 1);
919cdf0e10cSrcweir         aHomMat.Line4.Column3 = aMat.get(3, 2);
920cdf0e10cSrcweir         aHomMat.Line4.Column4 = aMat.get(3, 3);
921cdf0e10cSrcweir 
922cdf0e10cSrcweir         rValue <<= aHomMat;
923cdf0e10cSrcweir         break;
924cdf0e10cSrcweir     }
925cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POLYPOLYGON3D:
926cdf0e10cSrcweir     {
927cdf0e10cSrcweir         const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dLatheObj*>(mpObj.get())->GetPolyPoly2D();
928cdf0e10cSrcweir         const basegfx::B3DPolyPolygon aB3DPolyPolygon(basegfx::tools::createB3DPolyPolygonFromB2DPolyPolygon(rPolyPoly));
929cdf0e10cSrcweir 
930cdf0e10cSrcweir         B3dPolyPolygon_to_PolyPolygonShape3D(aB3DPolyPolygon, rValue);
931cdf0e10cSrcweir         break;
932cdf0e10cSrcweir     }
933cdf0e10cSrcweir     default:
934cdf0e10cSrcweir         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
935cdf0e10cSrcweir     }
936cdf0e10cSrcweir 
937cdf0e10cSrcweir     return true;
938cdf0e10cSrcweir }
939cdf0e10cSrcweir 
940cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo
getSupportedServiceNames()941cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL Svx3DLatheObject::getSupportedServiceNames()
942cdf0e10cSrcweir     throw(uno::RuntimeException)
943cdf0e10cSrcweir {
944cdf0e10cSrcweir     uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
945cdf0e10cSrcweir     comphelper::ServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
946cdf0e10cSrcweir                             "com.sun.star.drawing.Shape3DLathe");
947cdf0e10cSrcweir     return aSeq;
948cdf0e10cSrcweir }
949cdf0e10cSrcweir 
950cdf0e10cSrcweir /***********************************************************************
951cdf0e10cSrcweir *                                                                      *
952cdf0e10cSrcweir ***********************************************************************/
953cdf0e10cSrcweir 
Svx3DExtrudeObject(SdrObject * pObj)954cdf0e10cSrcweir Svx3DExtrudeObject::Svx3DExtrudeObject( SdrObject* pObj ) throw()
955cdf0e10cSrcweir :   SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DEXTRUDEOBJECT), aSvxMapProvider.GetPropertySet(SVXMAP_3DEXTRUDEOBJECT, SdrObject::GetGlobalDrawObjectItemPool()) )
956cdf0e10cSrcweir {
957cdf0e10cSrcweir }
958cdf0e10cSrcweir 
959cdf0e10cSrcweir //----------------------------------------------------------------------
~Svx3DExtrudeObject()960cdf0e10cSrcweir Svx3DExtrudeObject::~Svx3DExtrudeObject() throw()
961cdf0e10cSrcweir {
962cdf0e10cSrcweir }
963cdf0e10cSrcweir 
964cdf0e10cSrcweir //----------------------------------------------------------------------
965cdf0e10cSrcweir 
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)966cdf0e10cSrcweir bool Svx3DExtrudeObject::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
967cdf0e10cSrcweir {
968cdf0e10cSrcweir     switch( pProperty->nWID )
969cdf0e10cSrcweir     {
970cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
971cdf0e10cSrcweir     {
972cdf0e10cSrcweir         // Transformationsmatrix in das Objekt packen
973cdf0e10cSrcweir         if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) )
974cdf0e10cSrcweir             return true;
975cdf0e10cSrcweir         break;
976cdf0e10cSrcweir     }
977cdf0e10cSrcweir 
978cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POLYPOLYGON3D:
979cdf0e10cSrcweir     {
980cdf0e10cSrcweir         // Polygondefinition in das Objekt packen
981cdf0e10cSrcweir         basegfx::B3DPolyPolygon aNewB3DPolyPolygon;
982cdf0e10cSrcweir 
983cdf0e10cSrcweir         // #i101520# Probably imported
984cdf0e10cSrcweir         if( PolyPolygonShape3D_to_B3dPolyPolygon( rValue, aNewB3DPolyPolygon, true ) )
985cdf0e10cSrcweir         {
986cdf0e10cSrcweir             // Polygon setzen
987cdf0e10cSrcweir             const basegfx::B3DHomMatrix aIdentity;
988cdf0e10cSrcweir             const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::tools::createB2DPolyPolygonFromB3DPolyPolygon(aNewB3DPolyPolygon, aIdentity));
989cdf0e10cSrcweir             static_cast<E3dExtrudeObj*>(mpObj.get())->SetExtrudePolygon(aB2DPolyPolygon);
990cdf0e10cSrcweir             return true;
991cdf0e10cSrcweir         }
992cdf0e10cSrcweir         break;
993cdf0e10cSrcweir     }
994cdf0e10cSrcweir     default:
995cdf0e10cSrcweir         return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
996cdf0e10cSrcweir     }
997cdf0e10cSrcweir 
998cdf0e10cSrcweir     throw IllegalArgumentException();
999cdf0e10cSrcweir }
1000cdf0e10cSrcweir 
1001cdf0e10cSrcweir //----------------------------------------------------------------------
1002cdf0e10cSrcweir 
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)1003cdf0e10cSrcweir bool Svx3DExtrudeObject::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
1004cdf0e10cSrcweir {
1005cdf0e10cSrcweir     switch( pProperty->nWID )
1006cdf0e10cSrcweir     {
1007cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
1008cdf0e10cSrcweir     {
1009cdf0e10cSrcweir         // Transformation in eine homogene Matrix packen
1010cdf0e10cSrcweir         drawing::HomogenMatrix aHomMat;
1011cdf0e10cSrcweir         basegfx::B3DHomMatrix aMat = ((E3dObject*)mpObj.get())->GetTransform();
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir         // pack evtl. transformed matrix to output
1014cdf0e10cSrcweir         aHomMat.Line1.Column1 = aMat.get(0, 0);
1015cdf0e10cSrcweir         aHomMat.Line1.Column2 = aMat.get(0, 1);
1016cdf0e10cSrcweir         aHomMat.Line1.Column3 = aMat.get(0, 2);
1017cdf0e10cSrcweir         aHomMat.Line1.Column4 = aMat.get(0, 3);
1018cdf0e10cSrcweir         aHomMat.Line2.Column1 = aMat.get(1, 0);
1019cdf0e10cSrcweir         aHomMat.Line2.Column2 = aMat.get(1, 1);
1020cdf0e10cSrcweir         aHomMat.Line2.Column3 = aMat.get(1, 2);
1021cdf0e10cSrcweir         aHomMat.Line2.Column4 = aMat.get(1, 3);
1022cdf0e10cSrcweir         aHomMat.Line3.Column1 = aMat.get(2, 0);
1023cdf0e10cSrcweir         aHomMat.Line3.Column2 = aMat.get(2, 1);
1024cdf0e10cSrcweir         aHomMat.Line3.Column3 = aMat.get(2, 2);
1025cdf0e10cSrcweir         aHomMat.Line3.Column4 = aMat.get(2, 3);
1026cdf0e10cSrcweir         aHomMat.Line4.Column1 = aMat.get(3, 0);
1027cdf0e10cSrcweir         aHomMat.Line4.Column2 = aMat.get(3, 1);
1028cdf0e10cSrcweir         aHomMat.Line4.Column3 = aMat.get(3, 2);
1029cdf0e10cSrcweir         aHomMat.Line4.Column4 = aMat.get(3, 3);
1030cdf0e10cSrcweir 
1031cdf0e10cSrcweir         rValue <<= aHomMat;
1032cdf0e10cSrcweir         break;
1033cdf0e10cSrcweir     }
1034cdf0e10cSrcweir 
1035cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POLYPOLYGON3D:
1036cdf0e10cSrcweir     {
1037cdf0e10cSrcweir         // Polygondefinition packen
1038cdf0e10cSrcweir         const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dExtrudeObj*>(mpObj.get())->GetExtrudePolygon();
1039cdf0e10cSrcweir         const basegfx::B3DPolyPolygon aB3DPolyPolygon(basegfx::tools::createB3DPolyPolygonFromB2DPolyPolygon(rPolyPoly));
1040cdf0e10cSrcweir 
1041cdf0e10cSrcweir         B3dPolyPolygon_to_PolyPolygonShape3D(aB3DPolyPolygon, rValue);
1042cdf0e10cSrcweir         break;
1043cdf0e10cSrcweir     }
1044cdf0e10cSrcweir     default:
1045cdf0e10cSrcweir         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
1046cdf0e10cSrcweir     }
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir     return true;
1049cdf0e10cSrcweir }
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo
getSupportedServiceNames()1052cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL Svx3DExtrudeObject::getSupportedServiceNames()
1053cdf0e10cSrcweir     throw(uno::RuntimeException)
1054cdf0e10cSrcweir {
1055cdf0e10cSrcweir     uno::Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
1056cdf0e10cSrcweir     comphelper::ServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
1057cdf0e10cSrcweir                             "com.sun.star.drawing.Shape3DExtrude");
1058cdf0e10cSrcweir     return aSeq;
1059cdf0e10cSrcweir }
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir /***********************************************************************
1062cdf0e10cSrcweir *                                                                      *
1063cdf0e10cSrcweir ***********************************************************************/
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir //----------------------------------------------------------------------
Svx3DPolygonObject(SdrObject * pObj)1066cdf0e10cSrcweir Svx3DPolygonObject::Svx3DPolygonObject( SdrObject* pObj ) throw()
1067cdf0e10cSrcweir :   SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_3DPOLYGONOBJECT), aSvxMapProvider.GetPropertySet(SVXMAP_3DPOLYGONOBJECT, SdrObject::GetGlobalDrawObjectItemPool()) )
1068cdf0e10cSrcweir {
1069cdf0e10cSrcweir }
1070cdf0e10cSrcweir 
1071cdf0e10cSrcweir //----------------------------------------------------------------------
~Svx3DPolygonObject()1072cdf0e10cSrcweir Svx3DPolygonObject::~Svx3DPolygonObject() throw()
1073cdf0e10cSrcweir {
1074cdf0e10cSrcweir }
1075cdf0e10cSrcweir 
1076cdf0e10cSrcweir //----------------------------------------------------------------------
setPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,const::com::sun::star::uno::Any & rValue)1077cdf0e10cSrcweir bool Svx3DPolygonObject::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
1078cdf0e10cSrcweir {
1079cdf0e10cSrcweir     switch( pProperty->nWID )
1080cdf0e10cSrcweir     {
1081cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
1082cdf0e10cSrcweir     {
1083cdf0e10cSrcweir         // Transformationsmatrix in das Objekt packen
1084cdf0e10cSrcweir         if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) )
1085cdf0e10cSrcweir             return true;
1086cdf0e10cSrcweir         break;
1087cdf0e10cSrcweir     }
1088cdf0e10cSrcweir 
1089cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POLYPOLYGON3D:
1090cdf0e10cSrcweir     {
1091cdf0e10cSrcweir         // Polygondefinition in das Objekt packen
1092cdf0e10cSrcweir         basegfx::B3DPolyPolygon aNewB3DPolyPolygon;
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir         // #i101520# Direct API data (e.g. from chart)
1095cdf0e10cSrcweir         if( PolyPolygonShape3D_to_B3dPolyPolygon( rValue, aNewB3DPolyPolygon, false ) )
1096cdf0e10cSrcweir         {
1097cdf0e10cSrcweir             // Polygon setzen
1098cdf0e10cSrcweir             static_cast<E3dPolygonObj*>(mpObj.get())->SetPolyPolygon3D(aNewB3DPolyPolygon);
1099cdf0e10cSrcweir             return true;
1100cdf0e10cSrcweir         }
1101cdf0e10cSrcweir         break;
1102cdf0e10cSrcweir     }
1103cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_NORMALSPOLYGON3D:
1104cdf0e10cSrcweir     {
1105cdf0e10cSrcweir         // Normalendefinition in das Objekt packen
1106cdf0e10cSrcweir         basegfx::B3DPolyPolygon aNewB3DPolyPolygon;
1107cdf0e10cSrcweir 
1108cdf0e10cSrcweir         // #i101520# Direct API data (e.g. from chart)
1109cdf0e10cSrcweir         if( PolyPolygonShape3D_to_B3dPolyPolygon( rValue, aNewB3DPolyPolygon, false ) )
1110cdf0e10cSrcweir         {
1111cdf0e10cSrcweir             // Polygon setzen
1112cdf0e10cSrcweir             static_cast<E3dPolygonObj*>(mpObj.get())->SetPolyNormals3D(aNewB3DPolyPolygon);
1113cdf0e10cSrcweir             return true;
1114cdf0e10cSrcweir         }
1115cdf0e10cSrcweir         break;
1116cdf0e10cSrcweir     }
1117cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TEXTUREPOLYGON3D:
1118cdf0e10cSrcweir     {
1119cdf0e10cSrcweir         // Texturdefinition in das Objekt packen
1120cdf0e10cSrcweir         basegfx::B3DPolyPolygon aNewB3DPolyPolygon;
1121cdf0e10cSrcweir 
1122cdf0e10cSrcweir         // #i101520# Direct API data (e.g. from chart)
1123cdf0e10cSrcweir         if( PolyPolygonShape3D_to_B3dPolyPolygon( rValue, aNewB3DPolyPolygon, false ) )
1124cdf0e10cSrcweir         {
1125cdf0e10cSrcweir             // Polygon setzen
1126cdf0e10cSrcweir             const basegfx::B3DHomMatrix aIdentity;
1127cdf0e10cSrcweir             const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::tools::createB2DPolyPolygonFromB3DPolyPolygon(aNewB3DPolyPolygon, aIdentity));
1128cdf0e10cSrcweir             static_cast<E3dPolygonObj*>(mpObj.get())->SetPolyTexture2D(aB2DPolyPolygon);
1129cdf0e10cSrcweir             return true;
1130cdf0e10cSrcweir         }
1131cdf0e10cSrcweir         break;
1132cdf0e10cSrcweir     }
1133cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_LINEONLY:
1134cdf0e10cSrcweir     {
1135cdf0e10cSrcweir         sal_Bool bNew = sal_False;
1136cdf0e10cSrcweir         if( rValue >>= bNew )
1137cdf0e10cSrcweir         {
1138cdf0e10cSrcweir             static_cast<E3dPolygonObj*>(mpObj.get())->SetLineOnly(bNew);
1139cdf0e10cSrcweir             return true;
1140cdf0e10cSrcweir         }
1141cdf0e10cSrcweir         break;
1142cdf0e10cSrcweir     }
1143cdf0e10cSrcweir     default:
1144cdf0e10cSrcweir         return SvxShape::setPropertyValueImpl( rName, pProperty, rValue );
1145cdf0e10cSrcweir     }
1146cdf0e10cSrcweir 
1147cdf0e10cSrcweir     throw IllegalArgumentException();
1148cdf0e10cSrcweir }
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir //----------------------------------------------------------------------
getPropertyValueImpl(const::rtl::OUString & rName,const SfxItemPropertySimpleEntry * pProperty,::com::sun::star::uno::Any & rValue)1151cdf0e10cSrcweir bool Svx3DPolygonObject::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
1152cdf0e10cSrcweir {
1153cdf0e10cSrcweir     switch( pProperty->nWID )
1154cdf0e10cSrcweir     {
1155cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX:
1156cdf0e10cSrcweir     {
1157cdf0e10cSrcweir         ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue );
1158cdf0e10cSrcweir         break;
1159cdf0e10cSrcweir     }
1160cdf0e10cSrcweir 
1161cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_POLYPOLYGON3D:
1162cdf0e10cSrcweir     {
1163cdf0e10cSrcweir         B3dPolyPolygon_to_PolyPolygonShape3D(static_cast<E3dPolygonObj*>(mpObj.get())->GetPolyPolygon3D(),rValue);
1164cdf0e10cSrcweir         break;
1165cdf0e10cSrcweir     }
1166cdf0e10cSrcweir 
1167cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_NORMALSPOLYGON3D:
1168cdf0e10cSrcweir     {
1169cdf0e10cSrcweir         B3dPolyPolygon_to_PolyPolygonShape3D(static_cast<E3dPolygonObj*>(mpObj.get())->GetPolyNormals3D(),rValue);
1170cdf0e10cSrcweir         break;
1171cdf0e10cSrcweir     }
1172cdf0e10cSrcweir 
1173cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_TEXTUREPOLYGON3D:
1174cdf0e10cSrcweir     {
1175cdf0e10cSrcweir         // Texturdefinition packen
1176cdf0e10cSrcweir         const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dPolygonObj*>(mpObj.get())->GetPolyTexture2D();
1177cdf0e10cSrcweir         const basegfx::B3DPolyPolygon aB3DPolyPolygon(basegfx::tools::createB3DPolyPolygonFromB2DPolyPolygon(rPolyPoly));
1178cdf0e10cSrcweir 
1179cdf0e10cSrcweir         B3dPolyPolygon_to_PolyPolygonShape3D(aB3DPolyPolygon,rValue);
1180cdf0e10cSrcweir         break;
1181cdf0e10cSrcweir     }
1182cdf0e10cSrcweir 
1183cdf0e10cSrcweir     case OWN_ATTR_3D_VALUE_LINEONLY:
1184cdf0e10cSrcweir     {
1185cdf0e10cSrcweir         rValue <<= (sal_Bool)static_cast<E3dPolygonObj*>(mpObj.get())->GetLineOnly();
1186cdf0e10cSrcweir         break;
1187cdf0e10cSrcweir     }
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir     default:
1190cdf0e10cSrcweir         return SvxShape::getPropertyValueImpl( rName, pProperty, rValue );
1191cdf0e10cSrcweir     }
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir     return true;
1194cdf0e10cSrcweir }
1195cdf0e10cSrcweir 
1196cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo
getSupportedServiceNames()1197cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL Svx3DPolygonObject::getSupportedServiceNames()
1198cdf0e10cSrcweir     throw(uno::RuntimeException)
1199cdf0e10cSrcweir {
1200cdf0e10cSrcweir     Sequence< OUString > aSeq( SvxShape::getSupportedServiceNames() );
1201cdf0e10cSrcweir     comphelper::ServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.drawing.Shape3D",
1202cdf0e10cSrcweir                             "com.sun.star.drawing.Shape3DPolygon");
1203cdf0e10cSrcweir     return aSeq;
1204cdf0e10cSrcweir }
1205cdf0e10cSrcweir 
1206cdf0e10cSrcweir // eof
1207