0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / BRepMesh / BRepMesh_FaceChecker.hxx
CommitLineData
7bd071ed 1// Created on: 2016-07-04
2// Copyright (c) 2016 OPEN CASCADE SAS
3// Created by: Oleg AGASHIN
4//
5// This file is part of Open CASCADE Technology software library.
6//
7// This library is free software; you can redistribute it and/or modify it under
8// the terms of the GNU Lesser General Public License version 2.1 as published
9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
12//
13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
15
16#ifndef _BRepMesh_FaceChecker_HeaderFile
17#define _BRepMesh_FaceChecker_HeaderFile
18
19#include <IMeshTools_Parameters.hxx>
20#include <Standard_Transient.hxx>
21#include <IMeshData_Face.hxx>
22#include <Standard_Type.hxx>
23#include <NCollection_Shared.hxx>
24
25//! Auxiliary class checking wires of target face for self-intersections.
26//! Explodes wires of discrete face on sets of segments using tessellation
27//! data stored in model. Each segment is then checked for intersection with
b81b237f 28//! other ones. All collisions are registered and returned as result of check.
7bd071ed 29class BRepMesh_FaceChecker : public Standard_Transient
30{
31public: //! @name mesher API
32
33 //! Identifies segment inside face.
34 struct Segment
35 {
36 IMeshData::IEdgePtr EdgePtr;
37 gp_Pnt2d* Point1; // \ Use explicit pointers to points instead of accessing
38 gp_Pnt2d* Point2; // / using indices.
39
40 Segment()
d533dafb 41 : EdgePtr(NULL),
42 Point1(NULL),
43 Point2(NULL)
7bd071ed 44 {
45 }
46
47 Segment(const IMeshData::IEdgePtr& theEdgePtr,
48 gp_Pnt2d* thePoint1,
49 gp_Pnt2d* thePoint2)
50 : EdgePtr(theEdgePtr)
51 , Point1(thePoint1)
52 , Point2(thePoint2)
53 {
54 }
55 };
56
57 typedef NCollection_Shared<NCollection_Vector<Segment> > Segments;
58 typedef NCollection_Shared<NCollection_Array1<Handle(Segments)> > ArrayOfSegments;
59 typedef NCollection_Shared<NCollection_Array1<Handle(IMeshData::BndBox2dTree)> > ArrayOfBndBoxTree;
60 typedef NCollection_Shared<NCollection_Array1<Handle(IMeshData::MapOfIEdgePtr)> > ArrayOfMapOfIEdgePtr;
61
62
63 //! Default constructor
64 Standard_EXPORT BRepMesh_FaceChecker(const IMeshData::IFaceHandle& theFace,
65 const IMeshTools_Parameters& theParameters);
66
67 //! Destructor
68 Standard_EXPORT virtual ~BRepMesh_FaceChecker();
69
70 //! Performs check wires of the face for intersections.
71 //! @return True if there is no intersection, False elsewhere.
72 Standard_EXPORT Standard_Boolean Perform();
73
74 //! Returns intersecting edges.
75 const Handle(IMeshData::MapOfIEdgePtr)& GetIntersectingEdges() const
76 {
77 return myIntersectingEdges;
78 }
79
80 //! Checks wire with the given index for intersection with others.
4945e8be 81 void operator()(const Standard_Integer theWireIndex) const
7bd071ed 82 {
83 perform(theWireIndex);
84 }
85
4945e8be 86 DEFINE_STANDARD_RTTIEXT(BRepMesh_FaceChecker, Standard_Transient)
7bd071ed 87
88private:
89
90 //! Returns True in case if check can be performed in parallel mode.
4945e8be 91 Standard_Boolean isParallel() const
7bd071ed 92 {
93 return (myParameters.InParallel && myDFace->WiresNb() > 1);
94 }
95
96 //! Collects face segments.
97 void collectSegments();
98
99 //! Collects intersecting edges.
100 void collectResult();
101
102 //! Checks wire with the given index for intersection with others.
103 void perform(const Standard_Integer theWireIndex) const;
104
105private:
106
107 BRepMesh_FaceChecker (const BRepMesh_FaceChecker& theOther);
108
109 void operator=(const BRepMesh_FaceChecker& theOther);
110
111private:
112
113 IMeshData::IFaceHandle myDFace;
114 const IMeshTools_Parameters& myParameters;
115
116 Handle(ArrayOfSegments) myWiresSegments;
117 Handle(ArrayOfBndBoxTree) myWiresBndBoxTree;
118 Handle(ArrayOfMapOfIEdgePtr) myWiresIntersectingEdges;
119 Handle(IMeshData::MapOfIEdgePtr) myIntersectingEdges;
120
121};
122
123#endif