0024059: Eliminate compiler warning C4701 in MSVC++ with warning level 4
[occt.git] / src / QANewBRepNaming / QANewBRepNaming_Loader.cxx
CommitLineData
b311480e 1// Created on: 1999-10-25
2// Created by: Sergey ZARITCHNY
3// Copyright (c) 1999 Matra Datavision
4// Copyright (c) 1999-2012 OPEN CASCADE SAS
5//
6// The content of this file is subject to the Open CASCADE Technology Public
7// License Version 6.5 (the "License"). You may not use the content of this file
8// except in compliance with the License. Please obtain a copy of the License
9// at http://www.opencascade.org and read it completely before using this file.
10//
11// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13//
14// The Original Code and all software distributed under the License is
15// distributed on an "AS IS" basis, without warranty of any kind, and the
16// Initial Developer hereby disclaims all such warranties, including without
17// limitation, any warranties of merchantability, fitness for a particular
18// purpose or non-infringement. Please see the License for the specific terms
19// and conditions governing the rights and limitations under the License.
7fd59977 20
21#include <QANewBRepNaming_Loader.ixx>
22
23#include <TNaming.hxx>
24#include <TDF_Label.hxx>
25#include <TNaming_Builder.hxx>
26#include <TopLoc_Location.hxx>
27#include <TopExp_Explorer.hxx>
28#include <TopTools_MapOfShape.hxx>
29#include <TopTools_DataMapOfShapeShape.hxx>
30#include <TopTools_ListOfShape.hxx>
31#include <TopTools_ListIteratorOfListOfShape.hxx>
32#include <BRepBuilderAPI_MakeShape.hxx>
33#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
34#include <TopExp.hxx>
35#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
36#include <TopoDS_Iterator.hxx>
37#include <TopTools_MapIteratorOfMapOfShape.hxx>
38#include <BRepAlgoAPI_BooleanOperation.hxx>
39#include <TDataStd_Name.hxx>
40#include <TNaming_NamedShape.hxx>
41
42//=======================================================================
43//function : LoadGeneratedShapes
44//purpose : Load in the naming data-structure the shape
45// generated from FACE, EDGE, VERTEX,..., after the
46// MakeShape operation. <ShapeIn> is the initial
47// shape. <GeneratedFrom> defines the kind of
48// shape generation to record in the naming
49// data-structure. The <builder> is used to store the
50// set of evolutions in the data-framework of TDF.
51//=======================================================================
52
53void QANewBRepNaming_Loader::LoadGeneratedShapes (BRepBuilderAPI_MakeShape& MS,
54 const TopoDS_Shape& ShapeIn,
55 const TopAbs_ShapeEnum KindOfShape,
56 TNaming_Builder& Builder)
57{
58 TopTools_MapOfShape View;
59 TopExp_Explorer ShapeExplorer (ShapeIn, KindOfShape);
60 for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
61 const TopoDS_Shape& Root = ShapeExplorer.Current ();
62 if (!View.Add(Root)) continue;
63 const TopTools_ListOfShape& Shapes = MS.Generated (Root);
64 TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
65 for (;ShapesIterator.More (); ShapesIterator.Next ()) {
66 const TopoDS_Shape& newShape = ShapesIterator.Value ();
67 if (!Root.IsSame (newShape)) Builder.Generated (Root,newShape );
68 }
69 }
70}
71
72
73
74//=======================================================================
75//function : LoadAndOrientGeneratedShapes
76//purpose : The same as LoadGeneratedShapes plus performs orientation of
77// loaded shapes according orientation of SubShapes
78//=======================================================================
79
80void QANewBRepNaming_Loader::LoadAndOrientGeneratedShapes (BRepBuilderAPI_MakeShape& MS,
81 const TopoDS_Shape& ShapeIn,
82 const TopAbs_ShapeEnum KindOfShape,
83 TNaming_Builder& Builder,
84 const TopTools_DataMapOfShapeShape& SubShapes)
85{
86 TopTools_MapOfShape View;
87 TopExp_Explorer ShapeExplorer (ShapeIn, KindOfShape);
88 for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
89 const TopoDS_Shape& Root = ShapeExplorer.Current ();
90 if (!View.Add(Root)) continue;
91 const TopTools_ListOfShape& Shapes = MS.Generated (Root);
92 TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
93 for (;ShapesIterator.More (); ShapesIterator.Next ()) {
94 TopoDS_Shape newShape = ShapesIterator.Value ();
95 if (SubShapes.IsBound(newShape)) {
96 newShape.Orientation((SubShapes(newShape)).Orientation());
97 }
98 if (!Root.IsSame (newShape)) Builder.Generated (Root,newShape );
99 }
100 }
101}
102
103//=======================================================================
104//function : LoadModifiedShapes
105//purpose : Load in the naming data-structure the shape
106// modified from FACE, EDGE, VERTEX,..., after the
107// MakeShape operation. <ShapeIn> is the initial
108// shape. <ModifiedFrom> defines the kind of shape
109// modification to record in the naming
110// data-structure. The <builder> is used to store the
111// set of evolutions in the data-framework of TDF.
112//=======================================================================
113
114void QANewBRepNaming_Loader::LoadModifiedShapes (BRepBuilderAPI_MakeShape& MS,
115 const TopoDS_Shape& ShapeIn,
116 const TopAbs_ShapeEnum KindOfShape,
117 TNaming_Builder& Builder,
118 const Standard_Boolean theBool)
119{
120 TopTools_MapOfShape View;
121 TopExp_Explorer ShapeExplorer (ShapeIn, KindOfShape);
122 TopTools_ListOfShape Shapes;
1d47d8d0 123 BRepAlgoAPI_BooleanOperation* pMS = NULL;
7fd59977 124 if (theBool)
125 pMS = (reinterpret_cast<BRepAlgoAPI_BooleanOperation *>(&MS));
126 for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
127 const TopoDS_Shape& Root = ShapeExplorer.Current ();
128 if (!View.Add(Root)) continue;
129// const TopTools_ListOfShape& Shapes = MS.Modified (Root);
130 if (theBool)
5549deff 131 Shapes = pMS->Modified (Root);
7fd59977 132 else
133 Shapes = MS.Modified (Root);
134 TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
135 for (;ShapesIterator.More (); ShapesIterator.Next ()) {
136 const TopoDS_Shape& newShape = ShapesIterator.Value ();
137 if (!Root.IsSame (newShape)) {
138 Builder.Modify (Root,newShape );
139 }
140 }
141 }
142}
143
144
145//=======================================================================
146//function : LoadAndOrientModifiedShapes
147//purpose : The same as LoadModifiedShapes plus performs orientation of
148// loaded shapes according orientation of SubShapes
149//=======================================================================
150
151void QANewBRepNaming_Loader::LoadAndOrientModifiedShapes (BRepBuilderAPI_MakeShape& MS,
152 const TopoDS_Shape& ShapeIn,
153 const TopAbs_ShapeEnum KindOfShape,
154 TNaming_Builder& Builder,
155 const TopTools_DataMapOfShapeShape& SubShapes)
156{
157 TopTools_MapOfShape View;
158 TopExp_Explorer ShapeExplorer (ShapeIn, KindOfShape);
159 for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
160 const TopoDS_Shape& Root = ShapeExplorer.Current ();
161 if (!View.Add(Root)) continue;
162 const TopTools_ListOfShape& Shapes = MS.Modified(Root);
163 TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
164 for (;ShapesIterator.More (); ShapesIterator.Next ()) {
165 TopoDS_Shape newShape = ShapesIterator.Value ();
166 if (SubShapes.IsBound(newShape)) {
167 newShape.Orientation((SubShapes(newShape)).Orientation());
168 }
169 if (!Root.IsSame (newShape)) Builder.Modify (Root,newShape );
170 }
171 }
172}
173
174
175//=======================================================================
176//function : LoadDeletedShapes
177//purpose : Load in the naming data-structure the shape
178// deleted after the MakeShape operation.
179// <ShapeIn> is the initial shape.
180// <KindOfDeletedShape> defines the kind of
181// deletion to record in the naming data-structure.
182// The <builder> is used to store the set of evolutions
183// in the data-framework of TDF.
184//=======================================================================
185
186void QANewBRepNaming_Loader::LoadDeletedShapes (BRepBuilderAPI_MakeShape& MS,
187 const TopoDS_Shape& ShapeIn,
188 const TopAbs_ShapeEnum KindOfShape,
189 TNaming_Builder& Builder)
190{
191 TopTools_MapOfShape View;
192 TopExp_Explorer ShapeExplorer (ShapeIn, KindOfShape);
193 for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
194 const TopoDS_Shape& Root = ShapeExplorer.Current ();
195 if (!View.Add(Root)) continue;
196 if (MS.IsDeleted (Root)) Builder.Delete (Root);
197 }
198}
199
200
201//=======================================================================
202//function : ModifyPart
203//purpose : Internal Tool
204//=======================================================================
205
206void QANewBRepNaming_Loader::ModifyPart (const TopoDS_Shape& PartShape,
207 const TopoDS_Shape& Primitive,
208 const TDF_Label& Label)
209{
210
211 TNaming_Builder Builder (Label);
212
213 TopLoc_Location PartLocation = PartShape.Location ();
214 if (!PartLocation.IsIdentity ()) {
215 TopLoc_Location Identity;
216 Builder.Modify (PartShape.Located(Identity), Primitive);
217 TNaming::Displace (Label, PartLocation);
218 }
219 else Builder.Modify (PartShape, Primitive);
220}
221
222//=======================================================================
223//function : HasDangleShapes
224//purpose :
225//=======================================================================
226
227Standard_Boolean QANewBRepNaming_Loader::HasDangleShapes(const TopoDS_Shape& ShapeIn) {
228 if (ShapeIn.ShapeType() == TopAbs_COMPOUND) {
229 TopoDS_Iterator itr(ShapeIn);
230 for (; itr.More(); itr.Next())
231 if (itr.Value().ShapeType() != TopAbs_SOLID) return Standard_True;
232 return Standard_False;
233 } else if (ShapeIn.ShapeType() == TopAbs_COMPSOLID ||
234 ShapeIn.ShapeType() == TopAbs_SOLID) {
235 return Standard_False;
236 } else if (ShapeIn.ShapeType() == TopAbs_SHELL ||
237 ShapeIn.ShapeType() == TopAbs_FACE ||
238 ShapeIn.ShapeType() == TopAbs_WIRE ||
239 ShapeIn.ShapeType() == TopAbs_EDGE ||
240 ShapeIn.ShapeType() == TopAbs_VERTEX)
241 return Standard_True;
242 return Standard_False;
243}
244
245//=======================================================================
246//function : GetDangleShapes
247//purpose : Returns dangle sub shapes Generator - Dangle.
248//=======================================================================
249
250Standard_Boolean QANewBRepNaming_Loader::GetDangleShapes(const TopoDS_Shape& ShapeIn,
251 const TopAbs_ShapeEnum GeneratedFrom,
252 TopTools_DataMapOfShapeShape& Dangles)
253{
254 Dangles.Clear();
255 TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors;
256 TopAbs_ShapeEnum GeneratedTo;
257 if (GeneratedFrom == TopAbs_FACE) GeneratedTo = TopAbs_EDGE;
258 else if (GeneratedFrom == TopAbs_EDGE) GeneratedTo = TopAbs_VERTEX;
259 else return Standard_False;
260 TopExp::MapShapesAndAncestors(ShapeIn, GeneratedTo, GeneratedFrom, subShapeAndAncestors);
261 for (Standard_Integer i = 1; i <= subShapeAndAncestors.Extent(); i++) {
262 const TopoDS_Shape& mayBeDangle = subShapeAndAncestors.FindKey(i);
263 const TopTools_ListOfShape& ancestors = subShapeAndAncestors.FindFromIndex(i);
264 if (ancestors.Extent() == 1) Dangles.Bind(ancestors.First(), mayBeDangle);
265 }
266 return Dangles.Extent();
267}
268
269//=======================================================================
270//function : GetDangleShapes
271//purpose : Returns dangle sub shapes.
272//=======================================================================
273Standard_Boolean QANewBRepNaming_Loader::GetDangleShapes(const TopoDS_Shape& ShapeIn,
274 const TopAbs_ShapeEnum GeneratedFrom,
275 TopTools_MapOfShape& Dangles)
276{
277 Dangles.Clear();
278 TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors;
279 TopAbs_ShapeEnum GeneratedTo;
280 if (GeneratedFrom == TopAbs_FACE) GeneratedTo = TopAbs_EDGE;
281 else if (GeneratedFrom == TopAbs_EDGE) GeneratedTo = TopAbs_VERTEX;
282 else return Standard_False;
283 TopExp::MapShapesAndAncestors(ShapeIn, GeneratedTo, GeneratedFrom, subShapeAndAncestors);
284 for (Standard_Integer i = 1; i <= subShapeAndAncestors.Extent(); i++) {
285 const TopoDS_Shape& mayBeDangle = subShapeAndAncestors.FindKey(i);
286 const TopTools_ListOfShape& ancestors = subShapeAndAncestors.FindFromIndex(i);
287 if (ancestors.Extent() == 1) Dangles.Add(mayBeDangle);
288 }
289 return Dangles.Extent();
290}
291
292//=======================================================================
293//function : LoadGeneratedDangleShapes
294//purpose :
295//=======================================================================
296
297void QANewBRepNaming_Loader::LoadGeneratedDangleShapes(const TopoDS_Shape& ShapeIn,
298 const TopAbs_ShapeEnum GeneratedFrom,
299 TNaming_Builder& Builder)
300{
301 TopTools_DataMapOfShapeShape dangles;
302 if (!QANewBRepNaming_Loader::GetDangleShapes(ShapeIn, GeneratedFrom, dangles)) return;
303 TopTools_DataMapIteratorOfDataMapOfShapeShape itr(dangles);
304 for (; itr.More(); itr.Next()) Builder.Generated(itr.Key(), itr.Value());
305}
306
307//=======================================================================
308//function : LoadGeneratedDangleShapes
309//purpose :
310//=======================================================================
311
312void QANewBRepNaming_Loader::LoadGeneratedDangleShapes(const TopoDS_Shape& ShapeIn,
313 const TopAbs_ShapeEnum GeneratedFrom,
314 const TopTools_MapOfShape& OnlyThese,
315 TNaming_Builder& Builder)
316{
317 TopTools_DataMapOfShapeShape dangles;
318 if (!QANewBRepNaming_Loader::GetDangleShapes(ShapeIn, GeneratedFrom, dangles)) return;
319 TopTools_DataMapIteratorOfDataMapOfShapeShape itr(dangles);
320 for (; itr.More(); itr.Next()) {
321 if (!OnlyThese.Contains(itr.Value())) continue;
322 Builder.Generated(itr.Key(), itr.Value());
323 }
324}
325
326//=======================================================================
327//function : LoadModifiedDangleShapes
328//purpose :
329//=======================================================================
330
331void QANewBRepNaming_Loader::LoadModifiedDangleShapes (BRepBuilderAPI_MakeShape& MS,
332 const TopoDS_Shape& ShapeIn,
333 const TopAbs_ShapeEnum KindOfShape,
334 TNaming_Builder& Builder)
335{
336 TopTools_MapOfShape OnlyThese;
337 TopAbs_ShapeEnum neighbour = TopAbs_EDGE;
338 if (KindOfShape == TopAbs_EDGE) neighbour = TopAbs_FACE;
339 if (!QANewBRepNaming_Loader::GetDangleShapes(ShapeIn, neighbour, OnlyThese)) return;
340
341 TopTools_MapOfShape View;
342 TopExp_Explorer ShapeExplorer (ShapeIn, KindOfShape);
343 for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
344 const TopoDS_Shape& Root = ShapeExplorer.Current ();
345 if (!View.Add(Root) || !OnlyThese.Contains(Root)) continue;
346 const TopTools_ListOfShape& Shapes = MS.Modified (Root);
347 TopTools_ListIteratorOfListOfShape ShapesIterator (Shapes);
348 for (;ShapesIterator.More (); ShapesIterator.Next ()) {
349 const TopoDS_Shape& newShape = ShapesIterator.Value ();
350 if (!Root.IsSame (newShape)) {
351 Builder.Modify (Root,newShape );
352 }
353 }
354 }
355}
356
357//=======================================================================
358//function : IsDangle
359//purpose : Don't use this method inside an iteration process!
360//=======================================================================
361Standard_Boolean QANewBRepNaming_Loader::IsDangle (const TopoDS_Shape& theDangle,
362 const TopoDS_Shape& theShape) {
363 TopTools_MapOfShape dangles;
364 TopAbs_ShapeEnum neighbour = TopAbs_EDGE;
365 if (theDangle.ShapeType() == TopAbs_EDGE) neighbour = TopAbs_FACE;
366 if (!QANewBRepNaming_Loader::GetDangleShapes(theShape, neighbour, dangles)) return Standard_False;
367 return dangles.Contains(theDangle);
368}
369
370//=======================================================================
371//function : LoadDeletedDangleShapes
372//purpose :
373//=======================================================================
374void QANewBRepNaming_Loader::LoadDeletedDangleShapes (BRepBuilderAPI_MakeShape& MS,
375 const TopoDS_Shape& ShapeIn,
376 const TopAbs_ShapeEnum KindOfShape,
377 TNaming_Builder& Builder)
378{
379 if (KindOfShape != TopAbs_EDGE && KindOfShape != TopAbs_VERTEX) return; // not implemented ...
380 TopTools_MapOfShape View;
381 TopExp_Explorer ShapeExplorer (ShapeIn, KindOfShape);
382 for (; ShapeExplorer.More(); ShapeExplorer.Next ()) {
383 const TopoDS_Shape& Root = ShapeExplorer.Current ();
384 if (!View.Add(Root)) continue;
385 if (!QANewBRepNaming_Loader::IsDangle(Root, ShapeIn)) continue;
386 if (MS.IsDeleted (Root)) Builder.Delete (Root);
387 }
388}
389
390//=======================================================================
391//function : LoadDangleShapes
392//purpose :
393//=======================================================================
394void QANewBRepNaming_Loader::LoadDangleShapes(const TopoDS_Shape& theShape,const TDF_Label& theLabelGenerator) {
395 QANewBRepNaming_Loader::LoadDangleShapes(theShape, TopoDS_Shape(), theLabelGenerator);
396}
397
398//=======================================================================
399//function : LoadDangleShapes
400//purpose :
401//=======================================================================
402void QANewBRepNaming_Loader::LoadDangleShapes(const TopoDS_Shape& theShape,
403 const TopoDS_Shape& theIgnoredShape,
404 const TDF_Label& theLabelGenerator)
405{
406 TopTools_MapOfShape dangles, ignored;
407 TopAbs_ShapeEnum GeneratedFrom = TopAbs_EDGE; // theShape.ShapeType() == TopAbs_WIRE or TopAbs_EDGE
408 if (theShape.ShapeType() == TopAbs_SHELL || theShape.ShapeType() == TopAbs_FACE)
409 GeneratedFrom = TopAbs_FACE;
410 if (!QANewBRepNaming_Loader::GetDangleShapes(theShape, GeneratedFrom, dangles)) return;
411 if (!theIgnoredShape.IsNull()) {
412 TopoDS_Iterator itrI(theIgnoredShape);
413 for (; itrI.More(); itrI.Next()) {
414 TopoDS_Shape ignoredShape = itrI.Value();
415 ignored.Add(ignoredShape);
416 }
417 }
418 TopTools_MapIteratorOfMapOfShape itr (dangles);
419 for (; itr.More(); itr.Next()) {
420 const TopoDS_Shape& aDangle = itr.Key();
421 if (ignored.Contains(aDangle)) continue;
422 TNaming_Builder aBuilder(theLabelGenerator.NewChild());
423#ifdef MDTV_DEB
424 TDataStd_Name::Set(aBuilder.NamedShape()->Label(), "NewShapes");
425#endif
426 aBuilder.Generated(aDangle);
427 }
428}