1 // Created on: 1996-02-13
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <BRepOffset_MakeOffset.hxx>
18 #include <BRepOffsetAPI_MakeOffsetShape.hxx>
19 #include <Standard_ConstructionError.hxx>
20 #include <TopoDS_Shape.hxx>
21 #include <TopTools_ListIteratorOfListOfShape.hxx>
23 //=======================================================================
24 //function : BRepOffsetAPI_MakeOffsetShape
26 //=======================================================================
27 BRepOffsetAPI_MakeOffsetShape::BRepOffsetAPI_MakeOffsetShape()
28 : myLastUsedAlgo(OffsetAlgo_NONE)
32 //=======================================================================
33 //function : BRepOffsetAPI_MakeOffsetShape
35 //=======================================================================
36 BRepOffsetAPI_MakeOffsetShape::BRepOffsetAPI_MakeOffsetShape(const TopoDS_Shape& S,
37 const Standard_Real Offset,
38 const Standard_Real Tol,
39 const BRepOffset_Mode Mode,
40 const Standard_Boolean Intersection,
41 const Standard_Boolean SelfInter,
42 const GeomAbs_JoinType Join,
43 const Standard_Boolean RemoveIntEdges)
44 : myLastUsedAlgo(OffsetAlgo_NONE)
46 PerformByJoin(S, Offset, Tol, Mode, Intersection, SelfInter, Join, RemoveIntEdges);
49 //=======================================================================
50 //function : PerformByJoin
52 //=======================================================================
53 void BRepOffsetAPI_MakeOffsetShape::PerformByJoin
54 (const TopoDS_Shape& S,
55 const Standard_Real Offset,
56 const Standard_Real Tol,
57 const BRepOffset_Mode Mode,
58 const Standard_Boolean Intersection,
59 const Standard_Boolean SelfInter,
60 const GeomAbs_JoinType Join,
61 const Standard_Boolean RemoveIntEdges)
64 myLastUsedAlgo = OffsetAlgo_JOIN;
66 myOffsetShape.Initialize (S,Offset,Tol,Mode,Intersection,SelfInter,
67 Join, Standard_False, RemoveIntEdges);
68 myOffsetShape.MakeOffsetShape();
70 if (!myOffsetShape.IsDone())
73 myShape = myOffsetShape.Shape();
77 //=======================================================================
78 //function : PerformBySimple
80 //=======================================================================
81 void BRepOffsetAPI_MakeOffsetShape::PerformBySimple(const TopoDS_Shape& theS,
82 const Standard_Real theOffsetValue)
85 myLastUsedAlgo = OffsetAlgo_SIMPLE;
87 mySimpleOffsetShape.Initialize(theS, theOffsetValue);
88 mySimpleOffsetShape.Perform();
90 if (!mySimpleOffsetShape.IsDone())
93 myShape = mySimpleOffsetShape.GetResultShape();
97 //=======================================================================
98 //function :MakeOffset
100 //=======================================================================
101 const BRepOffset_MakeOffset& BRepOffsetAPI_MakeOffsetShape::MakeOffset() const
103 return myOffsetShape;
106 //=======================================================================
109 //=======================================================================
110 void BRepOffsetAPI_MakeOffsetShape::Build()
114 //=======================================================================
115 //function : Generated
117 //=======================================================================
118 const TopTools_ListOfShape& BRepOffsetAPI_MakeOffsetShape::Generated (const TopoDS_Shape& S)
122 if (myLastUsedAlgo == OffsetAlgo_JOIN && !myOffsetShape.ClosingFaces().Contains(S))
124 myOffsetShape.OffsetFacesFromShapes ().LastImage (S, myGenerated);
126 if (!myOffsetShape.ClosingFaces().IsEmpty())
128 // Reverse generated shapes in case of small solids.
129 // Useful only for faces without influence on others.
130 TopTools_ListIteratorOfListOfShape it(myGenerated);
131 for (; it.More(); it.Next())
132 it.Value().Reverse();
135 else if (myLastUsedAlgo == OffsetAlgo_SIMPLE)
137 TopoDS_Shape aGenShape = mySimpleOffsetShape.Generated(S);
138 if (!aGenShape.IsNull())
139 myGenerated.Append(aGenShape);
145 //=======================================================================
146 //function : GeneratedEdge
148 //=======================================================================
149 const TopTools_ListOfShape& BRepOffsetAPI_MakeOffsetShape::GeneratedEdge (const TopoDS_Shape& S)
153 if (myLastUsedAlgo == OffsetAlgo_JOIN)
155 myOffsetShape.OffsetEdgesFromShapes().LastImage (S, myGenerated);
157 if (!myGenerated.IsEmpty())
159 if (S.IsSame(myGenerated.First()))
160 myGenerated.RemoveFirst();
163 else if (myLastUsedAlgo == OffsetAlgo_SIMPLE)
165 TopoDS_Shape aGenShape = mySimpleOffsetShape.Generated(S);
166 if (!aGenShape.IsNull())
167 myGenerated.Append(aGenShape);
173 //=======================================================================
174 //function : GetJoinType
175 //purpose : Query offset join type.
176 //=======================================================================
177 GeomAbs_JoinType BRepOffsetAPI_MakeOffsetShape::GetJoinType() const
179 return myOffsetShape.GetJoinType();