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