0024096: Eliminate compiler warning C4505 in MSVC++ with warning level 4
[occt.git] / src / BRepFeat / BRepFeat_MakePipe.cxx
1 // Created on: 1996-09-03
2 // Created by: Jacques GOUSSARD
3 // Copyright (c) 1996-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.
20
21
22
23 #include <BRepFeat_MakePipe.ixx>
24
25 #include <BRepFeat.hxx>
26 #include <LocOpe.hxx>
27
28 //modified by NIZNHY-PKV Thu Mar 21 17:54:27 2002 f
29 //#include <BRepAlgo_Fuse.hxx>
30 //#include <BRepAlgo_Cut.hxx> 
31 #include <BRepAlgoAPI_Fuse.hxx>
32 #include <BRepAlgoAPI_Cut.hxx> 
33 //modified by NIZNHY-PKV Thu Mar 21 17:54:30 2002 t
34
35 #include <gp_Vec.hxx>
36 #include <gp_Pnt.hxx>
37 #include <gp_Pnt2d.hxx>
38 #include <TColgp_SequenceOfPnt.hxx>
39 #include <Geom_Curve.hxx>
40 #include <Geom_Line.hxx>
41
42 #include <LocOpe_Pipe.hxx>
43
44 #include <BRep_Tool.hxx>
45 #include <TopExp_Explorer.hxx>
46 #include <TopTools_MapOfShape.hxx>
47 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
48 #include <TopTools_ListIteratorOfListOfShape.hxx>
49 #include <TopTools_MapIteratorOfMapOfShape.hxx>
50 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
51
52 #include <Bnd_Box.hxx>
53 #include <TopoDS_Face.hxx>
54 #include <TopoDS_Shape.hxx>
55 #include <TopoDS.hxx>
56
57 #include <Standard_ConstructionError.hxx>
58
59 #include <TopExp.hxx>
60 #include <BRepBndLib.hxx>
61
62 #ifdef DEB
63 extern Standard_Boolean BRepFeat_GettraceFEAT();
64 #endif
65
66 static void MajMap(const TopoDS_Shape&, // base
67                    LocOpe_Pipe&,
68                    TopTools_DataMapOfShapeListOfShape&, // myMap
69                    TopoDS_Shape&,  // myFShape
70                    TopoDS_Shape&); // myLShape
71
72 //=======================================================================
73 //function : Init
74 //purpose  : 
75 //=======================================================================
76
77 void BRepFeat_MakePipe::Init(const TopoDS_Shape& Sbase,
78                              const TopoDS_Shape& Pbase,
79                              const TopoDS_Face& Skface,
80                              const TopoDS_Wire& Spine,
81                              const Standard_Integer Mode,
82                              const Standard_Boolean Modify)
83 {
84 #ifdef DEB
85   Standard_Boolean trc = BRepFeat_GettraceFEAT();
86   if (trc) cout << "BRepFeat_MakePipe::Init" << endl;
87 #endif
88   mySbase  = Sbase;
89   BasisShapeValid();
90   mySkface = Skface;
91   SketchFaceValid();
92   myPbase  = Pbase;
93   mySlface.Clear();
94   mySpine   = Spine;
95   if(Mode == 0) {
96     myFuse   = Standard_False;
97     myJustFeat = Standard_False;
98   }
99   else if(Mode == 1) {
100     myFuse   = Standard_True;
101     myJustFeat = Standard_False;
102   }
103   else if(Mode == 2) {
104     myFuse   = Standard_True;
105     myJustFeat = Standard_True;
106   }
107   else {    
108   }
109   myModify = Modify;
110   myJustGluer = Standard_False;
111
112
113   //-------------- ifv
114   //mySkface.Nullify();
115   //-------------- ifv
116
117   myShape.Nullify();
118   myMap.Clear();
119   myFShape.Nullify();
120   myLShape.Nullify();
121   TopExp_Explorer exp;
122   for (exp.Init(mySbase,TopAbs_FACE);exp.More();exp.Next()) {
123     TopTools_ListOfShape thelist;
124     myMap.Bind(exp.Current(), thelist);
125     myMap(exp.Current()).Append(exp.Current());
126   }
127 #ifdef DEB
128   if (trc) {
129     if (myJustFeat)  cout << " Just Feature" << endl;
130     if (myFuse)  cout << " Fuse" << endl;
131     if (!myFuse)  cout << " Cut" << endl;
132     if (!myModify) cout << " Modify = 0" << endl;
133   }
134 #endif 
135 }
136
137
138 //=======================================================================
139 //function : Add
140 //purpose  : add faces of gluing
141 //=======================================================================
142
143 void BRepFeat_MakePipe::Add(const TopoDS_Edge& E,
144                              const TopoDS_Face& F)
145 {
146 #ifdef DEB
147   Standard_Boolean trc = BRepFeat_GettraceFEAT();
148   if (trc) cout << "BRepFeat_MakePipe::Add(Edge,face)" << endl;
149 #endif
150   TopExp_Explorer exp;
151   for (exp.Init(mySbase,TopAbs_FACE);exp.More();exp.Next()) {
152     if (exp.Current().IsSame(F)) {
153       break;
154     }
155   }
156   if (!exp.More()) {
157     Standard_ConstructionError::Raise();
158   }
159
160   for (exp.Init(myPbase,TopAbs_EDGE);exp.More();exp.Next()) {
161     if (exp.Current().IsSame(E)) {
162       break;
163     }
164   }
165   if (!exp.More()) {
166     Standard_ConstructionError::Raise();
167   }
168
169   if (!mySlface.IsBound(F)) {
170     TopTools_ListOfShape thelist1;
171     mySlface.Bind(F,thelist1);
172   }
173   TopTools_ListIteratorOfListOfShape itl(mySlface(F));
174   for (; itl.More();itl.Next()) {
175     if (itl.Value().IsSame(E)) {
176       break;
177     }
178   }
179   if (!itl.More()) {
180     mySlface(F).Append(E);
181   }
182 }
183
184
185 //=======================================================================
186 //function : Perform
187 //purpose  : 
188 //=======================================================================
189
190 void BRepFeat_MakePipe::Perform()
191 {
192 #ifdef DEB
193   Standard_Boolean trc = BRepFeat_GettraceFEAT();
194   if (trc) cout << "BRepFeat_MakePipe::Perform()" << endl;
195 #endif
196   mySFrom.Nullify();
197   ShapeFromValid();
198   mySUntil.Nullify();
199   ShapeUntilValid();
200   myGluedF.Clear();
201   myPerfSelection = BRepFeat_NoSelection;
202   PerfSelectionValid();
203   TopoDS_Shape theBase = myPbase;
204   LocOpe_Pipe thePipe(mySpine,theBase);
205   TopoDS_Shape VraiPipe = thePipe.Shape();
206   MajMap(myPbase,thePipe,myMap,myFShape,myLShape);
207   myGShape = VraiPipe;
208   GeneratedShapeValid();
209
210   GluedFacesValid();
211
212   if(myGluedF.IsEmpty()) {
213     if(myFuse == 1) {
214       //modified by NIZNHY-PKV Thu Mar 21 17:53:05 2002 f
215       //BRepAlgo_Fuse f(mySbase, myGShape);
216       //myShape = f.Shape();
217       //UpdateDescendants(f.Builder(), myShape, Standard_False);
218       BRepAlgoAPI_Fuse f(mySbase, myGShape);
219       myShape = f.Shape();
220       UpdateDescendants(f, myShape, Standard_False);
221       //modified by NIZNHY-PKV Thu Mar 21 17:53:10 2002 t
222       Done();
223     }
224     else if(myFuse == 0) {
225       //modified by NIZNHY-PKV Thu Mar 21 17:53:37 2002 f
226       //BRepAlgo_Cut c(mySbase, myGShape);
227       //myShape = c.Shape();
228       //UpdateDescendants(c.Builder(), myShape, Standard_False);
229       BRepAlgoAPI_Cut c(mySbase, myGShape);
230       myShape = c.Shape();
231       UpdateDescendants(c, myShape, Standard_False);
232       //modified by NIZNHY-PKV Thu Mar 21 17:53:50 2002 t
233       Done();
234     }
235     else {
236       myShape = myGShape;
237       Done();
238     }
239   }
240   else {
241     myFShape = thePipe.FirstShape();
242     TColgp_SequenceOfPnt spt;
243     LocOpe::SampleEdges(myFShape,spt); 
244     myCurves = thePipe.Curves(spt);
245     myBCurve = thePipe.BarycCurve();
246     GlobalPerform();
247   }
248 }
249
250
251 //=======================================================================
252 //function : Perform
253 //purpose  : till shape Until
254 //=======================================================================
255
256 void BRepFeat_MakePipe::Perform(const TopoDS_Shape& Until)
257 {
258 #ifdef DEB
259   Standard_Boolean trc = BRepFeat_GettraceFEAT();
260   if (trc) cout << "BRepFeat_MakePipe::Perform(Until)" << endl;
261 #endif
262   if (Until.IsNull()) {
263     Standard_ConstructionError::Raise();
264   }
265   TopExp_Explorer exp(Until, TopAbs_FACE);
266   if (!exp.More()) {
267     Standard_ConstructionError::Raise();
268   }
269   myGluedF.Clear();
270   myPerfSelection = BRepFeat_SelectionU;
271   PerfSelectionValid();
272   mySFrom.Nullify();
273   ShapeFromValid();
274   mySUntil = Until;
275   TransformShapeFU(1);
276   ShapeUntilValid();
277   LocOpe_Pipe thePipe(mySpine,myPbase);
278   TopoDS_Shape VraiTuyau = thePipe.Shape();
279   MajMap(myPbase,thePipe,myMap,myFShape,myLShape);
280   myGShape = VraiTuyau;
281   GeneratedShapeValid();
282
283   GluedFacesValid();
284
285   myFShape = thePipe.FirstShape();
286   TColgp_SequenceOfPnt spt;
287   LocOpe::SampleEdges(myFShape,spt); 
288   myCurves = thePipe.Curves(spt);
289   myBCurve = thePipe.BarycCurve();
290   GlobalPerform();
291 }
292
293
294 //=======================================================================
295 //function : Perform
296 //purpose  : between From and Until
297 //=======================================================================
298
299 void BRepFeat_MakePipe::Perform(const TopoDS_Shape& From,
300                                 const TopoDS_Shape& Until)
301 {
302 #ifdef DEB
303   Standard_Boolean trc = BRepFeat_GettraceFEAT();
304   if (trc) cout << "BRepFeat_MakePipe::Perform(From,Until)" << endl;
305 #endif
306   if (From.IsNull() || Until.IsNull()) {
307     Standard_ConstructionError::Raise();
308   }
309   if (!mySkface.IsNull()) {
310     if (From.IsSame(mySkface)) {
311       Perform(Until);
312       return;
313     }
314     else if (Until.IsSame(mySkface)) {
315       Perform(From);
316       return;
317     }
318   }
319   myGluedF.Clear();
320   myPerfSelection = BRepFeat_SelectionFU;
321   PerfSelectionValid();
322   TopExp_Explorer exp(From, TopAbs_FACE);
323   if (!exp.More()) {
324     Standard_ConstructionError::Raise();
325   }
326   exp.Init(Until, TopAbs_FACE);
327   if (!exp.More()) {
328     Standard_ConstructionError::Raise();
329   }
330   mySFrom = From;
331   TransformShapeFU(0);
332   ShapeFromValid();
333   mySUntil = Until;
334   TransformShapeFU(1);
335   ShapeUntilValid();  
336   LocOpe_Pipe thePipe(mySpine,myPbase);
337   TopoDS_Shape VraiTuyau = thePipe.Shape();
338   MajMap(myPbase,thePipe,myMap,myFShape,myLShape);
339   myGShape = VraiTuyau;
340   GeneratedShapeValid();
341
342         //      mySbase, myPbase, mySlface, thePipe, myGluedF);
343   GluedFacesValid();
344
345   myFShape = thePipe.FirstShape();
346   TColgp_SequenceOfPnt spt;
347   LocOpe::SampleEdges(myFShape,spt); 
348   myCurves = thePipe.Curves(spt);
349   myBCurve = thePipe.BarycCurve();
350   GlobalPerform();
351 }
352
353
354 //=======================================================================
355 //function : Curves
356 //purpose  : curves parallel to the generating wire of the pipe
357 //=======================================================================
358
359 void BRepFeat_MakePipe::Curves(TColGeom_SequenceOfCurve& scur)
360 {
361   scur = myCurves;
362 }
363
364 //=======================================================================
365 //function : BarycCurve
366 //purpose  : pass through the center of mass
367 //=======================================================================
368
369 Handle(Geom_Curve) BRepFeat_MakePipe::BarycCurve()
370 {
371   return myBCurve;
372 }
373
374 //=======================================================================
375 //function : MajMap
376 //purpose  : management of descendants
377 //=======================================================================
378
379 static void MajMap(const TopoDS_Shape& theB,
380                    LocOpe_Pipe& theP,
381                    TopTools_DataMapOfShapeListOfShape& theMap, // myMap
382                    TopoDS_Shape& theFShape,  // myFShape
383                    TopoDS_Shape& theLShape) // myLShape
384 {
385   TopExp_Explorer exp(theP.FirstShape(),TopAbs_WIRE);
386   if (exp.More()) {
387     theFShape = exp.Current();
388     TopTools_ListOfShape thelist2;
389     theMap.Bind(theFShape, thelist2);
390     for (exp.Init(theP.FirstShape(),TopAbs_FACE);exp.More();exp.Next()) {
391       theMap(theFShape).Append(exp.Current());
392     }
393   }
394   
395   exp.Init(theP.LastShape(),TopAbs_WIRE);
396   if (exp.More()) {
397     theLShape = exp.Current();
398     TopTools_ListOfShape thelist3;
399     theMap.Bind(theLShape, thelist3);
400     for (exp.Init(theP.LastShape(),TopAbs_FACE);exp.More();exp.Next()) {
401       theMap(theLShape).Append(exp.Current());
402     }
403   }
404
405   for (exp.Init(theB,TopAbs_EDGE); exp.More(); exp.Next()) {
406     if (!theMap.IsBound(exp.Current())) {
407       TopTools_ListOfShape thelist4;
408       theMap.Bind(exp.Current(), thelist4);
409       theMap(exp.Current()) = theP.Shapes(exp.Current());
410     }
411   }
412 }
413
414
415
416
417
418
419
420
421
422
423
424
425
426