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