xref: /aoo41x/main/svx/source/engine3d/lathe3d.cxx (revision f6e50924)
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