0030052: Data Exchange - STEP import missing surfaces
[occt.git] / src / ShapeFix / ShapeFix_ShapeTolerance.cxx
CommitLineData
973c2be1 1// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 2//
973c2be1 3// This file is part of Open CASCADE Technology software library.
b311480e 4//
d5f74e42 5// This library is free software; you can redistribute it and/or modify it under
6// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 7// by the Free Software Foundation, with special exception defined in the file
8// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9// distribution for complete text of the license and disclaimer of any warranty.
b311480e 10//
973c2be1 11// Alternatively, this file may be used under the terms of Open CASCADE
12// commercial license or contractual agreement.
b311480e 13
7fd59977 14// 25.12.98 pdn: adding empty constructor
15
7fd59977 16#include <BRep_TEdge.hxx>
17#include <BRep_TFace.hxx>
42cf5bc1 18#include <BRep_Tool.hxx>
19#include <BRep_TVertex.hxx>
20#include <ShapeFix_ShapeTolerance.hxx>
21#include <TopExp.hxx>
22#include <TopExp_Explorer.hxx>
7fd59977 23#include <TopoDS.hxx>
7fd59977 24#include <TopoDS_Edge.hxx>
25#include <TopoDS_Face.hxx>
42cf5bc1 26#include <TopoDS_Shape.hxx>
27#include <TopoDS_Vertex.hxx>
7fd59977 28
29//=======================================================================
30//function : Constructor
31//purpose :
32//=======================================================================
7fd59977 33ShapeFix_ShapeTolerance::ShapeFix_ShapeTolerance()
34{
35}
36
37//=======================================================================
38//function : LimitTolerance
39//purpose :
40//=======================================================================
41
42Standard_Boolean ShapeFix_ShapeTolerance::LimitTolerance(const TopoDS_Shape& shape,
43 const Standard_Real tmin,
44 const Standard_Real tmax,
45 const TopAbs_ShapeEnum styp) const
46{
47 if (shape.IsNull() || tmin < 0) return Standard_False;
48 Standard_Boolean iamax = (tmax >= tmin);
49 Standard_Real prec;
50 Standard_Boolean fait = Standard_False;
51 if (styp == TopAbs_VERTEX || styp == TopAbs_EDGE || styp == TopAbs_FACE) {
52 for (TopExp_Explorer ex(shape,styp); ex.More(); ex.Next()) {
53 TopoDS_Shape sh = ex.Current();
54 int newtol = 0;
55 if (styp == TopAbs_VERTEX) {
56 TopoDS_Vertex V = TopoDS::Vertex (sh);
57 prec = BRep_Tool::Tolerance (V);
58 if (iamax && prec > tmax) newtol = 1;
59 else if (prec < tmin) newtol = -1;
60 if (newtol) {
61 const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*)&V.TShape());
62 TV->Tolerance( (newtol > 0 ? tmax : tmin) );
63 fait = Standard_True;
64 }
65 } else if (styp == TopAbs_EDGE) {
66 TopoDS_Edge E = TopoDS::Edge (sh);
67 prec = BRep_Tool::Tolerance (E);
68 if (iamax && prec > tmax) newtol = 1;
69 else if (prec < tmin) newtol = -1;
70 if (newtol) {
71 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*)&E.TShape());
72 TE->Tolerance( (newtol > 0 ? tmax : tmin) );
73 fait = Standard_True;
74 }
75 } else if (styp == TopAbs_FACE) {
76 TopoDS_Face F = TopoDS::Face (sh);
77 prec = BRep_Tool::Tolerance (F);
78 if (iamax && prec > tmax) newtol = 1;
79 else if (prec < tmin) newtol = -1;
80 if (newtol) {
81 const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*)&F.TShape());
82 TF->Tolerance( (newtol > 0 ? tmax : tmin) );
83 fait = Standard_True;
84 }
85 }
86 }
87 } else if (styp == TopAbs_WIRE) {
88 for (TopExp_Explorer ex(shape,TopAbs_EDGE); ex.More(); ex.Next()) {
89 TopoDS_Shape sh = ex.Current();
90 TopoDS_Edge E = TopoDS::Edge (sh);
91 LimitTolerance (E,tmin,tmax,TopAbs_EDGE);
92 TopoDS_Vertex V1,V2;
93 TopExp::Vertices (E,V1,V2);
94 if (!V1.IsNull()) fait |= LimitTolerance (V1,tmin,tmax,TopAbs_VERTEX);
95 if (!V2.IsNull()) fait |= LimitTolerance (V2,tmin,tmax,TopAbs_VERTEX);
96 }
97 } else {
98 fait |= LimitTolerance (shape,tmin,tmax,TopAbs_VERTEX);
99 fait |= LimitTolerance (shape,tmin,tmax,TopAbs_EDGE);
100 fait |= LimitTolerance (shape,tmin,tmax,TopAbs_FACE);
101 }
102 return fait;
103}
104
105//=======================================================================
106//function : SetTolerance
107//purpose :
108//=======================================================================
109
110void ShapeFix_ShapeTolerance::SetTolerance(const TopoDS_Shape& shape,
111 const Standard_Real preci,
112 const TopAbs_ShapeEnum styp) const
113{
114// VERTEX ou EDGE ou FACE : ces types seulement
115// WIRE : EDGE + VERTEX
116// Autres : TOUT (donc == WIRE + FACE)
117 if (shape.IsNull() || preci <= 0) return;
118 if (styp == TopAbs_VERTEX || styp == TopAbs_EDGE || styp == TopAbs_FACE) {
119 for (TopExp_Explorer ex(shape,styp); ex.More(); ex.Next()) {
120 TopoDS_Shape sh = ex.Current();
121 if (styp == TopAbs_VERTEX) {
122 TopoDS_Vertex V = TopoDS::Vertex (sh);
123// B.UpdateVertex (V,preci);
124 const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*)&V.TShape());
125 TV->Tolerance(preci);
126 } else if (styp == TopAbs_EDGE) {
127 TopoDS_Edge E = TopoDS::Edge (sh);
128// B.UpdateEdge (E,preci);
129 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*)&E.TShape());
130 TE->Tolerance(preci);
131 } else if (styp == TopAbs_FACE) {
132 TopoDS_Face F = TopoDS::Face (sh);
133// B.UpdateFace (F,preci);
134 const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*)&F.TShape());
135 TF->Tolerance(preci);
136 }
137 }
138 }
139 else if (styp == TopAbs_WIRE) {
140 for (TopExp_Explorer ex(shape,TopAbs_EDGE); ex.More(); ex.Next()) {
141 TopoDS_Shape sh = ex.Current();
142 TopoDS_Edge E = TopoDS::Edge (sh);
143// B.UpdateEdge (E,preci);
144 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*)&E.TShape());
145 TE->Tolerance(preci);
146 TopoDS_Vertex V1,V2;
147 TopExp::Vertices (E,V1,V2);
148 if (!V1.IsNull()) {
149// B.UpdateVertex (V1,preci);
150 const Handle(BRep_TVertex)& TV= *((Handle(BRep_TVertex)*)&V1.TShape());
151 TV->Tolerance(preci);
152 }
153 if (!V2.IsNull()) {
154// B.UpdateVertex (V2,preci);
155 const Handle(BRep_TVertex)& TV= *((Handle(BRep_TVertex)*)&V2.TShape());
156 TV->Tolerance(preci);
157 }
158 }
159 }
160 else {
161 SetTolerance (shape,preci,TopAbs_VERTEX);
162 SetTolerance (shape,preci,TopAbs_EDGE);
163 SetTolerance (shape,preci,TopAbs_FACE);
164 }
165}