0028599: Replacement of old Boolean operations with new ones in BRepProj_Projection...
[occt.git] / src / BRepAlgoAPI / BRepAlgoAPI_Section.cxx
CommitLineData
b311480e 1// Created on: 1994-02-18
2// Created by: Remi LEQUETTE
3// Copyright (c) 1994-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
b311480e 16
7fd59977 17// modified by Michael KLOKOV Wed Mar 6 15:01:25 2002
4e57c75e 18// modified by Eugeny MALTCHIKOV Wed Jul 04 11:13:01 2012
7fd59977 19
03cca6f7 20#include <BRepAlgoAPI_Section.hxx>
21
42cf5bc1 22#include <BOPAlgo_PaveFiller.hxx>
03cca6f7 23
42cf5bc1 24#include <BOPDS_DS.hxx>
03cca6f7 25
7fd59977 26#include <BRepBuilderAPI_MakeFace.hxx>
27#include <BRepBuilderAPI_MakeShell.hxx>
03cca6f7 28
42cf5bc1 29#include <Geom_Plane.hxx>
30#include <Geom_Surface.hxx>
03cca6f7 31
42cf5bc1 32#include <gp_Pln.hxx>
03cca6f7 33
7fd59977 34#include <TopoDS_Face.hxx>
42cf5bc1 35#include <TopoDS_Shape.hxx>
7fd59977 36
b1d15f53 37//
38static
39 TopoDS_Shape MakeShape(const Handle(Geom_Surface)& );
7fd59977 40
b1d15f53 41static
42 Standard_Boolean HasAncestorFaces(const BOPAlgo_PPaveFiller&,
43 const TopoDS_Shape&,
44 TopoDS_Shape&,
45 TopoDS_Shape&);
49b0c452 46static
47 Standard_Boolean HasAncestorFace (const BOPAlgo_PPaveFiller& ,
48 Standard_Integer ,
49 const TopoDS_Shape& ,
50 TopoDS_Shape& );
51//
7fd59977 52//=======================================================================
b1d15f53 53//function : BRepAlgoAPI_Section
54//purpose :
55//=======================================================================
56BRepAlgoAPI_Section::BRepAlgoAPI_Section()
57:
58 BRepAlgoAPI_BooleanOperation()
59{
49b0c452 60 Init(Standard_False);
b1d15f53 61}
62//=======================================================================
49b0c452 63//function : BRepAlgoAPI_Section
b1d15f53 64//purpose :
65//=======================================================================
49b0c452 66BRepAlgoAPI_Section::BRepAlgoAPI_Section(const BOPAlgo_PaveFiller& aPF)
67:
68 BRepAlgoAPI_BooleanOperation(aPF)
b1d15f53 69{
49b0c452 70 Init(Standard_False);
b1d15f53 71}
72//=======================================================================
7fd59977 73//function : Constructor
74//purpose :
75//=======================================================================
76BRepAlgoAPI_Section::BRepAlgoAPI_Section(const TopoDS_Shape& Sh1,
4e57c75e 77 const TopoDS_Shape& Sh2,
78 const Standard_Boolean PerformNow)
b1d15f53 79:
49b0c452 80 BRepAlgoAPI_BooleanOperation(Sh1,
81 Sh2,
82 BOPAlgo_SECTION)
7fd59977 83{
49b0c452 84 Init(PerformNow);
7fd59977 85}
b1d15f53 86//=======================================================================
87//function : BRepAlgoAPI_Section
88//purpose :
89//=======================================================================
90BRepAlgoAPI_Section::BRepAlgoAPI_Section
91 (const TopoDS_Shape& aS1,
92 const TopoDS_Shape& aS2,
93 const BOPAlgo_PaveFiller& aDSF,
94 const Standard_Boolean PerformNow)
95:
49b0c452 96 BRepAlgoAPI_BooleanOperation(aS1,
97 aS2,
98 aDSF,
99 BOPAlgo_SECTION)
7fd59977 100{
49b0c452 101 Init(PerformNow);
7fd59977 102}
7fd59977 103//=======================================================================
104//function : Constructor
105//purpose :
106//=======================================================================
b1d15f53 107BRepAlgoAPI_Section::BRepAlgoAPI_Section
108 (const TopoDS_Shape& Sh,
109 const gp_Pln& Pl,
110 const Standard_Boolean PerformNow)
111:
49b0c452 112 BRepAlgoAPI_BooleanOperation(Sh,
113 MakeShape(new Geom_Plane(Pl)),
b1d15f53 114 BOPAlgo_SECTION)
7fd59977 115{
49b0c452 116 Init(PerformNow);
7fd59977 117}
7fd59977 118//=======================================================================
119//function : Constructor
120//purpose :
121//=======================================================================
b1d15f53 122BRepAlgoAPI_Section::BRepAlgoAPI_Section
123 (const TopoDS_Shape& Sh,
124 const Handle(Geom_Surface)& Sf,
125 const Standard_Boolean PerformNow)
126:
49b0c452 127 BRepAlgoAPI_BooleanOperation(Sh,
128 MakeShape(Sf),
129 BOPAlgo_SECTION)
7fd59977 130{
49b0c452 131 Init(PerformNow);
7fd59977 132}
7fd59977 133//=======================================================================
134//function : Constructor
135//purpose :
136//=======================================================================
b1d15f53 137BRepAlgoAPI_Section::BRepAlgoAPI_Section
138 (const Handle(Geom_Surface)& Sf,
139 const TopoDS_Shape& Sh,
140 const Standard_Boolean PerformNow)
141:
49b0c452 142 BRepAlgoAPI_BooleanOperation(MakeShape(Sf),
143 Sh,
144 BOPAlgo_SECTION)
7fd59977 145{
49b0c452 146 Init(PerformNow);
7fd59977 147}
7fd59977 148//=======================================================================
149//function : Constructor
150//purpose :
151//=======================================================================
b1d15f53 152BRepAlgoAPI_Section::BRepAlgoAPI_Section
153 (const Handle(Geom_Surface)& Sf1,
154 const Handle(Geom_Surface)& Sf2,
155 const Standard_Boolean PerformNow)
156:
157 BRepAlgoAPI_BooleanOperation(MakeShape(Sf1),
158 MakeShape(Sf2),
159 BOPAlgo_SECTION)
7fd59977 160{
49b0c452 161 Init(PerformNow);
162}
163//=======================================================================
164//function : ~BRepAlgoAPI_Section
165//purpose :
166//=======================================================================
167BRepAlgoAPI_Section::~BRepAlgoAPI_Section()
168{
169}
170//=======================================================================
171//function : Init
172//purpose :
173//=======================================================================
174void BRepAlgoAPI_Section::Init(const Standard_Boolean bFlag)
175{
176 myOperation=BOPAlgo_SECTION;
49b0c452 177 myApprox = Standard_False;
178 myComputePCurve1 = Standard_False;
179 myComputePCurve2 = Standard_False;
49b0c452 180 //
181 if (bFlag) {
7fd59977 182 Build();
4e57c75e 183 }
7fd59977 184}
7fd59977 185//=======================================================================
186//function : Init1
187//purpose :
188//=======================================================================
189void BRepAlgoAPI_Section::Init1(const TopoDS_Shape& S1)
190{
49b0c452 191 myArguments.Clear();
192 myArguments.Append(S1);
7fd59977 193}
7fd59977 194//=======================================================================
195//function : Init1
196//purpose :
197//=======================================================================
198void BRepAlgoAPI_Section::Init1(const gp_Pln& Pl)
199{
200 Init1(MakeShape(new Geom_Plane(Pl)));
201}
7fd59977 202//=======================================================================
203//function : Init1
204//purpose :
205//=======================================================================
206void BRepAlgoAPI_Section::Init1(const Handle(Geom_Surface)& Sf)
207{
208 Init1(MakeShape(Sf));
209}
7fd59977 210//=======================================================================
211//function : Init2
212//purpose :
213//=======================================================================
214void BRepAlgoAPI_Section::Init2(const TopoDS_Shape& S2)
215{
49b0c452 216 myTools.Clear();
217 myTools.Append(S2);
7fd59977 218}
7fd59977 219//=======================================================================
220//function : Init2
221//purpose :
222//=======================================================================
223void BRepAlgoAPI_Section::Init2(const gp_Pln& Pl)
224{
225 Init2(MakeShape(new Geom_Plane(Pl)));
226}
7fd59977 227//=======================================================================
228//function : Init2
229//purpose :
230//=======================================================================
231void BRepAlgoAPI_Section::Init2(const Handle(Geom_Surface)& Sf)
232{
233 Init2(MakeShape(Sf));
234}
7fd59977 235//=======================================================================
236//function : Approximation
237//purpose :
238//=======================================================================
239void BRepAlgoAPI_Section::Approximation(const Standard_Boolean B)
240{
03cca6f7 241 myApprox = B;
7fd59977 242}
7fd59977 243//=======================================================================
244//function : ComputePCurveOn1
245//purpose :
246//=======================================================================
247void BRepAlgoAPI_Section::ComputePCurveOn1(const Standard_Boolean B)
248{
03cca6f7 249 myComputePCurve1 = B;
7fd59977 250}
7fd59977 251//=======================================================================
252//function : ComputePCurveOn2
253//purpose :
254//=======================================================================
255void BRepAlgoAPI_Section::ComputePCurveOn2(const Standard_Boolean B)
256{
03cca6f7 257 myComputePCurve2 = B;
7fd59977 258}
7fd59977 259//=======================================================================
49b0c452 260//function : SetAttributes
261//purpose :
262//=======================================================================
263void BRepAlgoAPI_Section::SetAttributes()
264{
03cca6f7 265 BOPAlgo_SectionAttribute theSecAttr(myApprox,
266 myComputePCurve1,
267 myComputePCurve2);
49b0c452 268 myDSFiller->SetSectionAttribute(theSecAttr);
269}
270//=======================================================================
7fd59977 271//function : Build
272//purpose :
273//=======================================================================
274void BRepAlgoAPI_Section::Build()
275{
49b0c452 276 BRepAlgoAPI_BooleanOperation::Build();
7fd59977 277}
7fd59977 278//=======================================================================
279//function : HasAncestorFaceOn1
280//purpose :
281//=======================================================================
b1d15f53 282Standard_Boolean BRepAlgoAPI_Section::HasAncestorFaceOn1
49b0c452 283 (const TopoDS_Shape& aE,
284 TopoDS_Shape& aF) const
7fd59977 285{
49b0c452 286 Standard_Boolean bRes;
287 //
288 bRes = HasAncestorFace(myDSFiller,1 , aE, aF);
289 return bRes;
7fd59977 290}
7fd59977 291//=======================================================================
292//function : HasAncestorFaceOn2
293//purpose :
294//=======================================================================
b1d15f53 295Standard_Boolean BRepAlgoAPI_Section::HasAncestorFaceOn2
49b0c452 296 (const TopoDS_Shape& aE,
297 TopoDS_Shape& aF) const
298{
299 Standard_Boolean bRes;
300 //
301 bRes = HasAncestorFace(myDSFiller, 2, aE, aF);
302 return bRes;
303}
304//=======================================================================
305//function : HasAncestorFace
306//purpose :
307//=======================================================================
308Standard_Boolean HasAncestorFace (const BOPAlgo_PPaveFiller& pPF,
309 Standard_Integer aIndex,
310 const TopoDS_Shape& aE,
311 TopoDS_Shape& aF)
7fd59977 312{
49b0c452 313 Standard_Boolean bRes;
314 //
315 bRes = Standard_False;
316 if(aE.IsNull()) {
317 return bRes;
7fd59977 318 }
49b0c452 319 if(aE.ShapeType() != TopAbs_EDGE) {
320 return bRes;
7fd59977 321 }
49b0c452 322 //
323 TopoDS_Shape aF1, aF2;
324 //
325 bRes=HasAncestorFaces(pPF, aE, aF1, aF2);
326 if (!bRes) {
327 return bRes;
7fd59977 328 }
49b0c452 329 //
330 aF=(aIndex==1) ? aF1 : aF2;
331 return bRes;
7fd59977 332}
333
334//=======================================================================
b1d15f53 335//function : HasAncestorFaces
7fd59977 336//purpose :
337//=======================================================================
49b0c452 338Standard_Boolean HasAncestorFaces (const BOPAlgo_PPaveFiller& pPF,
339 const TopoDS_Shape& aEx,
340 TopoDS_Shape& aF1,
341 TopoDS_Shape& aF2)
7fd59977 342{
b1d15f53 343
49b0c452 344 Standard_Integer aNbFF, i, j, nE, nF1, nF2, aNbVC;
345 BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
4e57c75e 346 //
49b0c452 347 const BOPDS_PDS& pDS = pPF->PDS();
4e57c75e 348 BOPDS_VectorOfInterfFF& aFFs=pDS->InterfFF();
349 //
7a9d451a 350 //section edges
1155d05a 351 aNbFF=aFFs.Length();
49b0c452 352 for (i = 0; i<aNbFF; ++i) {
4e57c75e 353 BOPDS_InterfFF& aFFi=aFFs(i);
354 aFFi.Indices(nF1, nF2);
355 //
49b0c452 356 const BOPDS_VectorOfCurve& aVC=aFFi.Curves();
1155d05a 357 aNbVC=aVC.Length();
49b0c452 358 for (j=0; j<aNbVC; j++) {
359 const BOPDS_Curve& aBC=aVC(j);
360 //
361 const BOPDS_ListOfPaveBlock& aLPB = aBC.PaveBlocks();
362 //
363 aItLPB.Initialize(aLPB);
364 for(; aItLPB.More(); aItLPB.Next()) {
365 const Handle(BOPDS_PaveBlock)& aPB = aItLPB.Value();
4e57c75e 366 nE = aPB->Edge();
49b0c452 367 if(nE < 0) {
368 continue;
369 }
4e57c75e 370 //
49b0c452 371 const TopoDS_Shape aE=pDS->Shape(nE);
372 if(aEx.IsSame(aE)) {
373 aF1 = pDS->Shape(nF1);
374 aF2 = pDS->Shape(nF2);
4e57c75e 375 return Standard_True;
376 }
7fd59977 377 }
378 }
7fd59977 379 }
380 return Standard_False;
381}
b1d15f53 382//=======================================================================
383//function : MakeShape
384//purpose :
385//=======================================================================
386TopoDS_Shape MakeShape(const Handle(Geom_Surface)& S)
387{
388 GeomAbs_Shape c = S->Continuity();
389 if (c >= GeomAbs_C2) {
390 return BRepBuilderAPI_MakeFace(S, Precision::Confusion());
391 }
392 return BRepBuilderAPI_MakeShell(S);
393}