summaryrefslogtreecommitdiff
path: root/inc/ShapeFix_Face.hxx
blob: 31fce8949a523684aad57af5a0e3f660ab756c9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
// This file is generated by WOK (CPPExt).
// Please do not edit this file; modify original file instead.
// The copyright and license terms as defined for the original file apply to 
// this header file considered to be the "object code" form of the original source.

#ifndef _ShapeFix_Face_HeaderFile
#define _ShapeFix_Face_HeaderFile

#ifndef _Standard_HeaderFile
#include <Standard.hxx>
#endif
#ifndef _Standard_DefineHandle_HeaderFile
#include <Standard_DefineHandle.hxx>
#endif
#ifndef _Handle_ShapeFix_Face_HeaderFile
#include <Handle_ShapeFix_Face.hxx>
#endif

#ifndef _Handle_ShapeAnalysis_Surface_HeaderFile
#include <Handle_ShapeAnalysis_Surface.hxx>
#endif
#ifndef _TopoDS_Face_HeaderFile
#include <TopoDS_Face.hxx>
#endif
#ifndef _TopoDS_Shape_HeaderFile
#include <TopoDS_Shape.hxx>
#endif
#ifndef _Handle_ShapeFix_Wire_HeaderFile
#include <Handle_ShapeFix_Wire.hxx>
#endif
#ifndef _Standard_Boolean_HeaderFile
#include <Standard_Boolean.hxx>
#endif
#ifndef _Standard_Integer_HeaderFile
#include <Standard_Integer.hxx>
#endif
#ifndef _ShapeFix_Root_HeaderFile
#include <ShapeFix_Root.hxx>
#endif
#ifndef _Handle_Geom_Surface_HeaderFile
#include <Handle_Geom_Surface.hxx>
#endif
#ifndef _Standard_Real_HeaderFile
#include <Standard_Real.hxx>
#endif
#ifndef _Handle_ShapeExtend_BasicMsgRegistrator_HeaderFile
#include <Handle_ShapeExtend_BasicMsgRegistrator.hxx>
#endif
#ifndef _Handle_ShapeExtend_WireData_HeaderFile
#include <Handle_ShapeExtend_WireData.hxx>
#endif
#ifndef _ShapeExtend_Status_HeaderFile
#include <ShapeExtend_Status.hxx>
#endif
class ShapeAnalysis_Surface;
class ShapeFix_Wire;
class TopoDS_Face;
class Geom_Surface;
class ShapeExtend_BasicMsgRegistrator;
class TopoDS_Wire;
class TopTools_DataMapOfShapeListOfShape;
class TopTools_SequenceOfShape;
class ShapeExtend_WireData;
class TopoDS_Vertex;
class ShapeFix_DataMapOfShapeBox2d;


//! This operator allows to perform various fixes on face <br>
//!          and its wires: fixes provided by ShapeFix_Wire, <br>
//!          fixing orientation of wires, addition of natural bounds, <br>
//!          fixing of missing seam edge, <br>
//!          and detection and removal of null-area wires <br>
class ShapeFix_Face : public ShapeFix_Root {

public:

  //! Creates an empty tool <br>
  Standard_EXPORT   ShapeFix_Face();
  //! Creates a tool and loads a face <br>
  Standard_EXPORT   ShapeFix_Face(const TopoDS_Face& face);
  //! Sets all modes to default <br>
  Standard_EXPORT   virtual  void ClearModes() ;
  //! Loads a whole face already created, with its wires, sense and <br>
//!          location <br>
  Standard_EXPORT     void Init(const TopoDS_Face& face) ;
  //! Starts the creation of the face <br>
//!          By default it will be FORWARD, or REVERSED if <fwd> is False <br>
  Standard_EXPORT     void Init(const Handle(Geom_Surface)& surf,const Standard_Real preci,const Standard_Boolean fwd = Standard_True) ;
  //! Starts the creation of the face <br>
//!          By default it will be FORWARD, or REVERSED if <fwd> is False <br>
  Standard_EXPORT     void Init(const Handle(ShapeAnalysis_Surface)& surf,const Standard_Real preci,const Standard_Boolean fwd = Standard_True) ;
  //! Sets message registrator <br>
  Standard_EXPORT   virtual  void SetMsgRegistrator(const Handle(ShapeExtend_BasicMsgRegistrator)& msgreg) ;
  //! Sets basic precision value (also to FixWireTool) <br>
  Standard_EXPORT   virtual  void SetPrecision(const Standard_Real preci) ;
  //! Sets minimal allowed tolerance (also to FixWireTool) <br>
  Standard_EXPORT   virtual  void SetMinTolerance(const Standard_Real mintol) ;
  //! Sets maximal allowed tolerance (also to FixWireTool) <br>
  Standard_EXPORT   virtual  void SetMaxTolerance(const Standard_Real maxtol) ;
  //! Returns (modifiable) the mode for applying fixes of <br>
//!          ShapeFix_Wire, by default True. <br>
        Standard_Integer& FixWireMode() ;
  //! Returns (modifiable) the fix orientation mode, by default <br>
//!          True. If True, wires oriented to border limited square. <br>
        Standard_Integer& FixOrientationMode() ;
  //! Returns (modifiable) the add natural bound mode. <br>
//!          If true, natural boundary is added on faces that miss them. <br>
//!          Default is False for faces with single wire (they are <br>
//!          handled by FixOrientation in that case) and True for others. <br>
        Standard_Integer& FixAddNaturalBoundMode() ;
  //! Returns (modifiable) the fix missing seam mode, by default <br>
//!          True. If True, tries to insert seam is missed. <br>
        Standard_Integer& FixMissingSeamMode() ;
  //! Returns (modifiable) the fix small area wire mode, by default <br>
//!          False. If True, drops small wires. <br>
        Standard_Integer& FixSmallAreaWireMode() ;
  //! Returns (modifiable) the fix intersecting wires mode <br>
//!          by default True. <br>
        Standard_Integer& FixIntersectingWiresMode() ;
  //! Returns (modifiable) the fix loop wires mode <br>
//!          by default True. <br>
        Standard_Integer& FixLoopWiresMode() ;
  //! Returns (modifiable) the fix split face mode <br>
//!          by default True. <br>
        Standard_Integer& FixSplitFaceMode() ;
  //! Returns (modifiable) the auto-correct precision mode <br>
//!          by default False. <br>
        Standard_Integer& AutoCorrectPrecisionMode() ;
  //! Returns a face which corresponds to the current state <br>
//!  Warning: The finally produced face may be another one ... but with the <br>
//!          same support <br>
        TopoDS_Face Face() const;
  //! Returns resulting shape (Face or Shell if splitted) <br>
//!          To be used instead of Face() if FixMissingSeam involved <br>
        TopoDS_Shape Result() const;
  //! Add a wire to current face using BRep_Builder. <br>
//!          Wire is added without taking into account orientation of face <br>
//!          (as if face were FORWARD). <br>
  Standard_EXPORT     void Add(const TopoDS_Wire& wire) ;
  //! Performs all the fixes, depending on modes <br>
//! Function Status returns the status of last call to Perform() <br>
//!          ShapeExtend_OK   : face was OK, nothing done <br>
//!          ShapeExtend_DONE1: some wires are fixed <br>
//!          ShapeExtend_DONE2: orientation of wires fixed <br>
//!          ShapeExtend_DONE3: missing seam added <br>
//!          ShapeExtend_DONE4: small area wire removed <br>
//!          ShapeExtend_DONE5: natural bounds added <br>
//!          ShapeExtend_FAIL1: some fails during fixing wires <br>
//!          ShapeExtend_FAIL2: cannot fix orientation of wires <br>
//!          ShapeExtend_FAIL3: cannot add missing seam <br>
//!          ShapeExtend_FAIL4: cannot remove small area wire <br>
  Standard_EXPORT     Standard_Boolean Perform() ;
  //! Fixes orientation of wires on the face <br>
//!          It tries to make all wires lie outside all others (according <br>
//!          to orientation) by reversing orientation of some of them. <br>
//!          If face lying on sphere or torus has single wire and <br>
//!          AddNaturalBoundMode is True, that wire is not reversed in <br>
//!          any case (supposing that natural bound will be added). <br>
//!          Returns True if wires were reversed <br>
  Standard_EXPORT     Standard_Boolean FixOrientation() ;
  //! Fixes orientation of wires on the face <br>
//!          It tries to make all wires lie outside all others (according <br>
//!          to orientation) by reversing orientation of some of them. <br>
//!          If face lying on sphere or torus has single wire and <br>
//!          AddNaturalBoundMode is True, that wire is not reversed in <br>
//!          any case (supposing that natural bound will be added). <br>
//!          Returns True if wires were reversed <br>
//!          OutWires return information about out wires + list of <br>
//!          internal wires for each (for performing split face). <br>
  Standard_EXPORT     Standard_Boolean FixOrientation(TopTools_DataMapOfShapeListOfShape& MapWires) ;
  //! Adds natural boundary on face if it is missing. <br>
//!          Two cases are supported: <br>
//!          - face has no wires <br>
//!          - face lies on geometrically double-closed surface <br>
//!            (sphere or torus) and none of wires is left-oriented <br>
//!          Returns True if natural boundary was added <br>
  Standard_EXPORT     Standard_Boolean FixAddNaturalBound() ;
  //! Detects and fixes the special case when face on a closed <br>
//!          surface is given by two wires closed in 3d but with gap in 2d. <br>
//!          In that case it creates a new wire from the two, and adds a <br>
//!          missing seam edge <br>
//!          Returns True if missing seam was added <br>
  Standard_EXPORT     Standard_Boolean FixMissingSeam() ;
  //! Detects wires with small area (that is less than <br>
//!          100*Precision::PConfusion(). Removes these wires if they are internal. <br>
//!  Returns : True if at least one small wire removed, <br>
//!    	    False if does nothing. <br>
  Standard_EXPORT     Standard_Boolean FixSmallAreaWire() ;
  //! Detects if wire has a loop and fixes this situation by splitting on the few parts. <br>
//!          if wire has a loops and it was splitted Status was set to value ShapeExtend_DONE6. <br>
  Standard_EXPORT     Standard_Boolean FixLoopWire(TopTools_SequenceOfShape& aResWires) ;
  //! Detects and fixes the special case when face has more than one wire <br>
//!          and this wires have intersection point <br>
  Standard_EXPORT     Standard_Boolean FixIntersectingWires() ;
  //! If wire contains two coincidence edges it must be removed <br>
//! Queries on status after Perform() <br>
  Standard_EXPORT     Standard_Boolean FixWiresTwoCoincEdges() ;
  //! Split face if there are more than one out wire <br>
//!          using inrormation after FixOrientation() <br>
  Standard_EXPORT     Standard_Boolean FixSplitFace(const TopTools_DataMapOfShapeListOfShape& MapWires) ;
  //! Returns the status of last call to Perform() <br>
//!          ShapeExtend_OK   : face was OK, nothing done <br>
//!          ShapeExtend_DONE1: some wires are fixed <br>
//!          ShapeExtend_DONE2: orientation of wires fixed <br>
//!          ShapeExtend_DONE3: missing seam added <br>
//!          ShapeExtend_DONE4: small area wire removed <br>
//!          ShapeExtend_DONE5: natural bounds added <br>
//!          ShapeExtend_DONE8: face may be splited <br>
//!          ShapeExtend_FAIL1: some fails during fixing wires <br>
//!          ShapeExtend_FAIL2: cannot fix orientation of wires <br>
//!          ShapeExtend_FAIL3: cannot add missing seam <br>
//!          ShapeExtend_FAIL4: cannot remove small area wire <br>
        Standard_Boolean Status(const ShapeExtend_Status status) const;
  //! Returns tool for fixing wires. <br>
        Handle_ShapeFix_Wire FixWireTool() ;




  DEFINE_STANDARD_RTTI(ShapeFix_Face)

protected:


Handle_ShapeAnalysis_Surface mySurf;
TopoDS_Face myFace;
TopoDS_Shape myResult;
Handle_ShapeFix_Wire myFixWire;
Standard_Boolean myFwd;
Standard_Integer myStatus;


private: 

  
  Standard_EXPORT     Standard_Boolean SplitEdge(const Handle(ShapeExtend_WireData)& sewd,const Standard_Integer num,const Standard_Real param,const TopoDS_Vertex& vert,const Standard_Real preci,ShapeFix_DataMapOfShapeBox2d& boxes) ;
  
  Standard_EXPORT     Standard_Boolean SplitEdge(const Handle(ShapeExtend_WireData)& sewd,const Standard_Integer num,const Standard_Real param1,const Standard_Real param2,const TopoDS_Vertex& vert,const Standard_Real preci,ShapeFix_DataMapOfShapeBox2d& boxes) ;

Standard_Integer myFixWireMode;
Standard_Integer myFixOrientationMode;
Standard_Integer myFixAddNaturalBoundMode;
Standard_Integer myFixMissingSeamMode;
Standard_Integer myFixSmallAreaWireMode;
Standard_Integer myFixLoopWiresMode;
Standard_Integer myFixIntersectingWiresMode;
Standard_Integer myFixSplitFaceMode;
Standard_Integer myAutoCorrectPrecisionMode;


};


#include <ShapeFix_Face.lxx>



// other Inline functions and methods (like "C++: function call" methods)


#endif