1 // File: BOPTools_StateFiller.cxx
2 // Created: Mon Feb 4 10:08:20 2002
3 // Author: Peter KURNEV
6 // Modified by skv - Tue Aug 24 12:31:16 2004 OCC6450
8 #include <BOPTools_StateFiller.ixx>
10 #include <Precision.hxx>
12 #include <Geom_Curve.hxx>
15 #include <BRep_Tool.hxx>
16 #include <BRepClass3d_SolidClassifier.hxx>
19 #include <TopoDS_Vertex.hxx>
20 #include <TopoDS_Solid.hxx>
22 #include <TopAbs_State.hxx>
23 #include <TopTools_IndexedMapOfShape.hxx>
26 #include <BooleanOperations_StateOfShape.hxx>
28 #include <IntTools_Tools.hxx>
29 #include <IntTools_Context.hxx>
30 #include <Geom_Surface.hxx>
32 //=======================================================================
33 // function: BOPTools_StateFiller::BOPTools_StateFiller
35 //=======================================================================
36 BOPTools_StateFiller::BOPTools_StateFiller(const BOPTools_PaveFiller& aFiller)
38 myIsDone(Standard_False)
40 myFiller=(BOPTools_PaveFiller*) &aFiller;
42 myIntrPool=myFiller->InterfPool();
44 //=======================================================================
47 //=======================================================================
48 void BOPTools_StateFiller::Do()
51 //=======================================================================
54 //=======================================================================
55 Standard_Boolean BOPTools_StateFiller::IsDone() const
60 //=======================================================================
61 // function: ConvertState
63 //=======================================================================
64 BooleanOperations_StateOfShape BOPTools_StateFiller::ConvertState(const TopAbs_State aSt)
66 BooleanOperations_StateOfShape aState;
69 aState=BooleanOperations_IN;
72 aState=BooleanOperations_OUT;
75 aState=BooleanOperations_ON;
78 aState=BooleanOperations_UNKNOWN;
81 aState=BooleanOperations_UNKNOWN;
87 //=======================================================================
88 // function: ConvertState
90 //=======================================================================
91 TopAbs_State BOPTools_StateFiller::ConvertState(const BooleanOperations_StateOfShape aSt)
96 case BooleanOperations_IN:
99 case BooleanOperations_OUT:
102 case BooleanOperations_ON:
105 case BooleanOperations_UNKNOWN:
106 aState=TopAbs_UNKNOWN;
109 aState=TopAbs_UNKNOWN;
115 //=======================================================================
116 // function: ClassifyShapeByRef
118 //=======================================================================
119 BooleanOperations_StateOfShape BOPTools_StateFiller::ClassifyShapeByRef (const TopoDS_Shape& aS,
120 const TopoDS_Shape& aRef)
122 TopAbs_ShapeEnum aType;
123 aType=aS.ShapeType();
125 // Modified by skv - Tue Aug 24 12:31:16 2004 OCC6450 Begin
126 Standard_Boolean hasEdge = Standard_True;
127 // Modified by skv - Tue Aug 24 12:31:17 2004 OCC6450 End
129 if (aType!=TopAbs_EDGE) {
130 TopTools_IndexedMapOfShape aME;
131 TopExp::MapShapes(aS, TopAbs_EDGE, aME);
133 // Modified by skv - Tue Aug 24 12:31:16 2004 OCC6450 Begin
134 if (aME.Extent() == 0)
135 hasEdge = Standard_False;
137 // Modified by skv - Tue Aug 24 12:31:16 2004 OCC6450 End
138 aE=TopoDS::Edge(aME(1));
144 // Modified by skv - Tue Aug 24 12:31:16 2004 OCC6450 Begin
145 // TopAbs_State aSt=ClassifyEdgeToSolidByOnePoint(aE, aRef);
149 aSt = ClassifyEdgeToSolidByOnePoint(aE, aRef);
151 TopTools_IndexedMapOfShape aMF;
152 Standard_Boolean hasFace = Standard_True;
155 TopExp::MapShapes(aS, TopAbs_FACE, aMF);
157 // Modified by skv - Tue Aug 24 12:31:16 2004 OCC6450 Begin
158 if (aMF.Extent() == 0) {
159 hasFace = Standard_False;
161 aF = TopoDS::Face(aMF(1));
165 aSt = TopAbs_UNKNOWN;
167 Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aF);
173 aSurf->Bounds(aUMin, aUMax, aVMin, aVMax);
175 Standard_Boolean isMinInf = Precision::IsNegativeInfinite(aUMin);
176 Standard_Boolean isMaxInf = Precision::IsPositiveInfinite(aUMax);
177 Standard_Real dT=10.;
181 if (isMinInf && !isMaxInf) {
183 } else if (!isMinInf && isMaxInf) {
185 } else if (isMinInf && isMaxInf) {
188 aParU = IntTools_Tools::IntermediatePoint(aUMin, aUMax);
191 isMinInf = Precision::IsNegativeInfinite(aVMin);
192 isMaxInf = Precision::IsPositiveInfinite(aVMax);
194 if (isMinInf && !isMaxInf) {
196 } else if (!isMinInf && isMaxInf) {
198 } else if (isMinInf && isMaxInf) {
201 aParV = IntTools_Tools::IntermediatePoint(aVMin, aVMax);
204 gp_Pnt aP3d = aSurf->Value(aParU, aParV);
206 const TopoDS_Solid &aRefSolid = TopoDS::Solid(aRef);
207 const Handle(IntTools_Context)& aContext = myFiller->Context();
208 BRepClass3d_SolidClassifier &aSC =
209 aContext->SolidClassifier(aRefSolid);
211 aSC.Perform(aP3d, 1e-7);
216 // Modified by skv - Tue Aug 24 12:31:16 2004 OCC6450 Begin
218 BooleanOperations_StateOfShape aState=BOPTools_StateFiller::ConvertState(aSt) ;
224 //=======================================================================
225 // function: ClassifyEdgeToSolidByOnePoint
227 //=======================================================================
228 TopAbs_State BOPTools_StateFiller::ClassifyEdgeToSolidByOnePoint(const TopoDS_Edge& E,
229 const TopoDS_Shape& Ref)
231 Standard_Real f2 = 0., l2 = 0., par = 0.;
233 Handle(Geom_Curve) C3D = BRep_Tool::Curve(E, f2, l2);
237 //it means that we are in degenerated edge
238 const TopoDS_Vertex& fv = TopExp::FirstVertex(E);
240 return TopAbs_UNKNOWN;
242 aP3d = BRep_Tool::Pnt(fv);
245 Standard_Boolean bF2Inf, bL2Inf;
246 Standard_Real dT=10.;
248 bF2Inf = Precision::IsNegativeInfinite(f2);
249 bL2Inf = Precision::IsPositiveInfinite(l2);
251 if (bF2Inf && !bL2Inf) {
254 else if (!bF2Inf && bL2Inf) {
257 else if (bF2Inf && bL2Inf) {
261 par=IntTools_Tools::IntermediatePoint(f2, l2);
263 C3D -> D0(par, aP3d);
266 const TopoDS_Solid& aRefSolid=TopoDS::Solid(Ref);
267 const Handle(IntTools_Context)& aContext=myFiller->Context();
268 BRepClass3d_SolidClassifier& aSC=aContext->SolidClassifier(aRefSolid);
270 aSC.Perform(aP3d, 1e-7);
272 TopAbs_State aState=aSC.State();
276 //=======================================================================
279 //=======================================================================
280 TopAbs_ShapeEnum BOPTools_StateFiller::SubType(const TopoDS_Shape& aS)
282 TopAbs_ShapeEnum aSourceType, aReturnType;
283 aSourceType=aS.ShapeType();
285 switch (aSourceType) {
287 aReturnType=TopAbs_SHELL;
290 aReturnType=TopAbs_FACE;
293 aReturnType=TopAbs_WIRE;
296 aReturnType=TopAbs_EDGE;
299 aReturnType=TopAbs_VERTEX;
302 aReturnType=TopAbs_SHAPE;