1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 27 #include "svx/svdstr.hrc" 28 #include "svx/svdglob.hxx" 29 #include <svx/svdpage.hxx> 30 #include "svx/globl3d.hxx" 31 #include <svx/extrud3d.hxx> 32 #include <svx/scene3d.hxx> 33 34 #include <svx/svxids.hrc> 35 #include <svx/xpoly.hxx> 36 #include <svx/svdopath.hxx> 37 #include <svx/svdmodel.hxx> 38 #include <svx/svx3ditems.hxx> 39 #include <svx/sdr/properties/e3dextrudeproperties.hxx> 40 #include <svx/sdr/contact/viewcontactofe3dextrude.hxx> 41 #include <basegfx/polygon/b2dpolypolygontools.hxx> 42 #include <basegfx/polygon/b2dpolygontools.hxx> 43 #include <basegfx/polygon/b3dpolygontools.hxx> 44 #include <basegfx/polygon/b3dpolypolygontools.hxx> 45 46 ////////////////////////////////////////////////////////////////////////////// 47 // #110094# DrawContact section 48 49 sdr::contact::ViewContact* E3dExtrudeObj::CreateObjectSpecificViewContact() 50 { 51 return new sdr::contact::ViewContactOfE3dExtrude(*this); 52 } 53 54 ////////////////////////////////////////////////////////////////////////////// 55 56 sdr::properties::BaseProperties* E3dExtrudeObj::CreateObjectSpecificProperties() 57 { 58 return new sdr::properties::E3dExtrudeProperties(*this); 59 } 60 61 ////////////////////////////////////////////////////////////////////////////// 62 63 TYPEINIT1(E3dExtrudeObj, E3dCompoundObject); 64 65 /************************************************************************* 66 |* 67 |* Konstruktor, erzeugt zwei Deckelflaechen-PolyPolygone und (PointCount-1) 68 |* Seitenflaechen-Rechtecke aus dem uebergebenen PolyPolygon 69 |* 70 \************************************************************************/ 71 72 E3dExtrudeObj::E3dExtrudeObj(E3dDefaultAttributes& rDefault, const basegfx::B2DPolyPolygon& rPP, double fDepth) 73 : E3dCompoundObject(rDefault), 74 maExtrudePolygon(rPP) 75 { 76 // since the old class PolyPolygon3D did mirror the given PolyPolygons in Y, do the same here 77 basegfx::B2DHomMatrix aMirrorY; 78 aMirrorY.scale(1.0, -1.0); 79 maExtrudePolygon.transform(aMirrorY); 80 81 // Defaults setzen 82 SetDefaultAttributes(rDefault); 83 84 // set extrude depth 85 GetProperties().SetObjectItemDirect(Svx3DDepthItem((sal_uInt32)(fDepth + 0.5))); 86 } 87 88 E3dExtrudeObj::E3dExtrudeObj() 89 : E3dCompoundObject() 90 { 91 // Defaults setzen 92 E3dDefaultAttributes aDefault; 93 SetDefaultAttributes(aDefault); 94 } 95 96 void E3dExtrudeObj::SetDefaultAttributes(E3dDefaultAttributes& rDefault) 97 { 98 GetProperties().SetObjectItemDirect(Svx3DSmoothNormalsItem(rDefault.GetDefaultExtrudeSmoothed())); 99 GetProperties().SetObjectItemDirect(Svx3DSmoothLidsItem(rDefault.GetDefaultExtrudeSmoothFrontBack())); 100 GetProperties().SetObjectItemDirect(Svx3DCharacterModeItem(rDefault.GetDefaultExtrudeCharacterMode())); 101 GetProperties().SetObjectItemDirect(Svx3DCloseFrontItem(rDefault.GetDefaultExtrudeCloseFront())); 102 GetProperties().SetObjectItemDirect(Svx3DCloseBackItem(rDefault.GetDefaultExtrudeCloseBack())); 103 104 // Bei extrudes defaultmaessig StdTexture in X und Y 105 GetProperties().SetObjectItemDirect(Svx3DTextureProjectionXItem(1)); 106 GetProperties().SetObjectItemDirect(Svx3DTextureProjectionYItem(1)); 107 } 108 109 /************************************************************************* 110 |* 111 |* Identifier zurueckgeben 112 |* 113 \************************************************************************/ 114 115 sal_uInt16 E3dExtrudeObj::GetObjIdentifier() const 116 { 117 return E3D_EXTRUDEOBJ_ID; 118 } 119 120 /************************************************************************* 121 |* 122 |* Zuweisungsoperator 123 |* 124 \************************************************************************/ 125 126 void E3dExtrudeObj::operator=(const SdrObject& rObj) 127 { 128 // erstmal alle Childs kopieren 129 E3dCompoundObject::operator=(rObj); 130 131 // weitere Parameter kopieren 132 const E3dExtrudeObj& r3DObj = (const E3dExtrudeObj&)rObj; 133 134 maExtrudePolygon = r3DObj.maExtrudePolygon; 135 } 136 137 /************************************************************************* 138 |* 139 |* Lokale Parameter setzen mit Geometrieneuerzeugung 140 |* 141 \************************************************************************/ 142 143 void E3dExtrudeObj::SetExtrudePolygon(const basegfx::B2DPolyPolygon &rNew) 144 { 145 if(maExtrudePolygon != rNew) 146 { 147 maExtrudePolygon = rNew; 148 ActionChanged(); 149 } 150 } 151 152 /************************************************************************* 153 |* 154 |* Get the name of the object (singular) 155 |* 156 \************************************************************************/ 157 158 void E3dExtrudeObj::TakeObjNameSingul(XubString& rName) const 159 { 160 rName=ImpGetResStr(STR_ObjNameSingulExtrude3d); 161 162 String aName( GetName() ); 163 if(aName.Len()) 164 { 165 rName += sal_Unicode(' '); 166 rName += sal_Unicode('\''); 167 rName += aName; 168 rName += sal_Unicode('\''); 169 } 170 } 171 172 /************************************************************************* 173 |* 174 |* Get the name of the object (plural) 175 |* 176 \************************************************************************/ 177 178 void E3dExtrudeObj::TakeObjNamePlural(XubString& rName) const 179 { 180 rName=ImpGetResStr(STR_ObjNamePluralExtrude3d); 181 } 182 183 /************************************************************************* 184 |* 185 |* Aufbrechen 186 |* 187 \************************************************************************/ 188 189 sal_Bool E3dExtrudeObj::IsBreakObjPossible() 190 { 191 return sal_True; 192 } 193 194 SdrAttrObj* E3dExtrudeObj::GetBreakObj() 195 { 196 basegfx::B3DPolyPolygon aFrontSide; 197 basegfx::B3DPolyPolygon aBackSide; 198 199 if(maExtrudePolygon.count()) 200 { 201 basegfx::B2DPolyPolygon aTemp(maExtrudePolygon); 202 aTemp.removeDoublePoints(); 203 aTemp = basegfx::tools::correctOrientations(aTemp); 204 const basegfx::B2VectorOrientation aOrient = basegfx::tools::getOrientation(aTemp.getB2DPolygon(0L)); 205 206 if(basegfx::ORIENTATION_POSITIVE == aOrient) 207 { 208 aTemp.flip(); 209 } 210 211 aFrontSide = basegfx::tools::createB3DPolyPolygonFromB2DPolyPolygon(aTemp); 212 } 213 214 if(aFrontSide.count()) 215 { 216 aBackSide = aFrontSide; 217 218 if(GetExtrudeDepth()) 219 { 220 basegfx::B3DHomMatrix aTransform; 221 222 if(100 != GetPercentBackScale()) 223 { 224 // scale polygon from center 225 const double fScaleFactor(GetPercentBackScale() / 100.0); 226 const basegfx::B3DRange aPolyPolyRange(basegfx::tools::getRange(aBackSide)); 227 const basegfx::B3DPoint aCenter(aPolyPolyRange.getCenter()); 228 229 aTransform.translate(-aCenter.getX(), -aCenter.getY(), -aCenter.getZ()); 230 aTransform.scale(fScaleFactor, fScaleFactor, fScaleFactor); 231 aTransform.translate(aCenter.getX(), aCenter.getY(), aCenter.getZ()); 232 } 233 234 // translate by extrude depth 235 aTransform.translate(0.0, 0.0, (double)GetExtrudeDepth()); 236 237 aBackSide.transform(aTransform); 238 } 239 } 240 241 if(aBackSide.count()) 242 { 243 // create PathObj 244 basegfx::B2DPolyPolygon aPoly = TransformToScreenCoor(aBackSide); 245 SdrPathObj* pPathObj = new SdrPathObj(OBJ_PLIN, aPoly); 246 247 if(pPathObj) 248 { 249 SfxItemSet aSet(GetObjectItemSet()); 250 aSet.Put(XLineStyleItem(XLINE_SOLID)); 251 pPathObj->SetMergedItemSet(aSet); 252 } 253 254 return pPathObj; 255 } 256 257 return 0; 258 } 259 260 // eof 261