xref: /AOO41X/main/svx/source/engine3d/lathe3d.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
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 <tools/poly.hxx>
30 #include <svx/svdpage.hxx>
31 #include "svx/globl3d.hxx"
32 #include <svx/lathe3d.hxx>
33 #include <svx/xpoly.hxx>
34 #include <svx/svxids.hrc>
35 #include <svx/svdopath.hxx>
36 #include <svx/svdmodel.hxx>
37 #include <svx/svx3ditems.hxx>
38 #include <svx/sdr/properties/e3dlatheproperties.hxx>
39 #include <svx/sdr/contact/viewcontactofe3dlathe.hxx>
40 #include <basegfx/polygon/b2dpolypolygontools.hxx>
41 #include <basegfx/polygon/b2dpolygontools.hxx>
42 #include <basegfx/matrix/b2dhommatrix.hxx>
43 
44 //////////////////////////////////////////////////////////////////////////////
45 // #110094# DrawContact section
46 
CreateObjectSpecificViewContact()47 sdr::contact::ViewContact* E3dLatheObj::CreateObjectSpecificViewContact()
48 {
49     return new sdr::contact::ViewContactOfE3dLathe(*this);
50 }
51 
52 //////////////////////////////////////////////////////////////////////////////
53 
CreateObjectSpecificProperties()54 sdr::properties::BaseProperties* E3dLatheObj::CreateObjectSpecificProperties()
55 {
56     return new sdr::properties::E3dLatheProperties(*this);
57 }
58 
59 //////////////////////////////////////////////////////////////////////////////
60 
61 TYPEINIT1(E3dLatheObj, E3dCompoundObject);
62 
63 /*************************************************************************
64 |*
65 |* Konstruktor aus 3D-Polygon, Scale gibt den Umrechnungsfaktor fuer
66 |* die Koordinaten an
67 |*
68 \************************************************************************/
69 
E3dLatheObj(E3dDefaultAttributes & rDefault,const basegfx::B2DPolyPolygon rPoly2D)70 E3dLatheObj::E3dLatheObj(E3dDefaultAttributes& rDefault, const basegfx::B2DPolyPolygon rPoly2D)
71 :   E3dCompoundObject(rDefault),
72     maPolyPoly2D(rPoly2D)
73 {
74     // since the old class PolyPolygon3D did mirror the given PolyPolygons in Y, do the same here
75     basegfx::B2DHomMatrix aMirrorY;
76     aMirrorY.scale(1.0, -1.0);
77     maPolyPoly2D.transform(aMirrorY);
78 
79     // Defaults setzen
80     SetDefaultAttributes(rDefault);
81 
82     // Ueberfluessige Punkte entfernen, insbesondere doppelte
83     // Start- und Endpunkte verhindern
84     maPolyPoly2D.removeDoublePoints();
85 
86     if(maPolyPoly2D.count())
87     {
88         const basegfx::B2DPolygon rPoly(maPolyPoly2D.getB2DPolygon(0L));
89         sal_uInt32 nSegCnt(rPoly.count());
90 
91         if(nSegCnt && !rPoly.isClosed())
92         {
93             nSegCnt -= 1;
94         }
95 
96         GetProperties().SetObjectItemDirect(Svx3DVerticalSegmentsItem(nSegCnt));
97     }
98 }
99 
100 /*************************************************************************
101 |*
102 |* Leer-Konstruktor
103 |*
104 \************************************************************************/
105 
E3dLatheObj()106 E3dLatheObj::E3dLatheObj()
107 :    E3dCompoundObject()
108 {
109     // Defaults setzen
110     E3dDefaultAttributes aDefault;
111     SetDefaultAttributes(aDefault);
112 }
113 
SetDefaultAttributes(E3dDefaultAttributes & rDefault)114 void E3dLatheObj::SetDefaultAttributes(E3dDefaultAttributes& rDefault)
115 {
116     GetProperties().SetObjectItemDirect(Svx3DSmoothNormalsItem(rDefault.GetDefaultLatheSmoothed()));
117     GetProperties().SetObjectItemDirect(Svx3DSmoothLidsItem(rDefault.GetDefaultLatheSmoothFrontBack()));
118     GetProperties().SetObjectItemDirect(Svx3DCharacterModeItem(rDefault.GetDefaultLatheCharacterMode()));
119     GetProperties().SetObjectItemDirect(Svx3DCloseFrontItem(rDefault.GetDefaultLatheCloseFront()));
120     GetProperties().SetObjectItemDirect(Svx3DCloseBackItem(rDefault.GetDefaultLatheCloseBack()));
121 }
122 
123 /*************************************************************************
124 |*
125 |* Identifier zurueckgeben
126 |*
127 \************************************************************************/
128 
GetObjIdentifier() const129 sal_uInt16 E3dLatheObj::GetObjIdentifier() const
130 {
131     return E3D_LATHEOBJ_ID;
132 }
133 
134 /*************************************************************************
135 |*
136 |* Zuweisungsoperator
137 |*
138 \************************************************************************/
139 
operator =(const SdrObject & rObj)140 void E3dLatheObj::operator=(const SdrObject& rObj)
141 {
142     // erstmal alle Childs kopieren
143     E3dCompoundObject::operator=(rObj);
144 
145     // weitere Parameter kopieren
146     const E3dLatheObj& r3DObj = (const E3dLatheObj&)rObj;
147 
148     maPolyPoly2D  = r3DObj.maPolyPoly2D;
149 }
150 
151 /*************************************************************************
152 |*
153 |* Wandle das Objekt in ein Gruppenobjekt bestehend aus n Polygonen
154 |*
155 \************************************************************************/
156 
DoConvertToPolyObj(sal_Bool,bool) const157 SdrObject *E3dLatheObj::DoConvertToPolyObj(sal_Bool /*bBezier*/, bool /*bAddText*/) const
158 {
159     return NULL;
160 }
161 
162 /*************************************************************************
163 |*
164 |* Neue Segmentierung (Beschreibung siehe Header-File)
165 |*
166 \************************************************************************/
167 
ReSegment(sal_uInt32 nHSegs,sal_uInt32 nVSegs)168 void E3dLatheObj::ReSegment(sal_uInt32 nHSegs, sal_uInt32 nVSegs)
169 {
170     if ((nHSegs != GetHorizontalSegments() || nVSegs != GetVerticalSegments()) &&
171         (nHSegs != 0 || nVSegs != 0))
172     {
173         GetProperties().SetObjectItemDirect(Svx3DHorizontalSegmentsItem(nHSegs));
174         GetProperties().SetObjectItemDirect(Svx3DVerticalSegmentsItem(nVSegs));
175 
176         ActionChanged();
177     }
178 }
179 
180 /*************************************************************************
181 |*
182 |* Lokale Parameter setzen mit Geometrieneuerzeugung
183 |*
184 \************************************************************************/
185 
SetPolyPoly2D(const basegfx::B2DPolyPolygon & rNew)186 void E3dLatheObj::SetPolyPoly2D(const basegfx::B2DPolyPolygon& rNew)
187 {
188     if(maPolyPoly2D != rNew)
189     {
190         maPolyPoly2D = rNew;
191         maPolyPoly2D.removeDoublePoints();
192 
193         if(maPolyPoly2D.count())
194         {
195             const basegfx::B2DPolygon rPoly(maPolyPoly2D.getB2DPolygon(0L));
196             sal_uInt32 nSegCnt(rPoly.count());
197 
198             if(nSegCnt && !rPoly.isClosed())
199             {
200                 nSegCnt -= 1;
201             }
202 
203             GetProperties().SetObjectItemDirect(Svx3DVerticalSegmentsItem(nSegCnt));
204         }
205 
206         ActionChanged();
207     }
208 }
209 
210 /*************************************************************************
211 |*
212 |* Get the name of the object (singular)
213 |*
214 \************************************************************************/
215 
TakeObjNameSingul(XubString & rName) const216 void E3dLatheObj::TakeObjNameSingul(XubString& rName) const
217 {
218     rName=ImpGetResStr(STR_ObjNameSingulLathe3d);
219 
220     String aName( GetName() );
221     if(aName.Len())
222     {
223         rName += sal_Unicode(' ');
224         rName += sal_Unicode('\'');
225         rName += aName;
226         rName += sal_Unicode('\'');
227     }
228 }
229 
230 /*************************************************************************
231 |*
232 |* Get the name of the object (plural)
233 |*
234 \************************************************************************/
235 
TakeObjNamePlural(XubString & rName) const236 void E3dLatheObj::TakeObjNamePlural(XubString& rName) const
237 {
238     rName=ImpGetResStr(STR_ObjNamePluralLathe3d);
239 }
240 
241 /*************************************************************************
242 |*
243 |* Aufbrechen
244 |*
245 \************************************************************************/
246 
IsBreakObjPossible()247 sal_Bool E3dLatheObj::IsBreakObjPossible()
248 {
249     return sal_True;
250 }
251 
GetBreakObj()252 SdrAttrObj* E3dLatheObj::GetBreakObj()
253 {
254     // create PathObj
255     basegfx::B3DPolyPolygon aLathePoly3D(basegfx::tools::createB3DPolyPolygonFromB2DPolyPolygon(maPolyPoly2D));
256     basegfx::B2DPolyPolygon aTransPoly(TransformToScreenCoor(aLathePoly3D));
257     SdrPathObj* pPathObj = new SdrPathObj(OBJ_PLIN, aTransPoly);
258 
259     if(pPathObj)
260     {
261         // Attribute setzen
262         SfxItemSet aSet(GetObjectItemSet());
263 
264         // Linien aktivieren, um Objekt garantiert sichtbar zu machen
265         aSet.Put(XLineStyleItem(XLINE_SOLID));
266 
267         pPathObj->SetMergedItemSet(aSet);
268     }
269 
270     return pPathObj;
271 }
272 
273 // eof
274