3d6038ef315dee6cdb2db33d002095d4692fe879
[occt.git] / src / ShapeFix / ShapeFix_ComposeShell.hxx
1 // Created on: 1999-04-26
2 // Created by: Andrey BETENEV
3 // Copyright (c) 1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #ifndef _ShapeFix_ComposeShell_HeaderFile
18 #define _ShapeFix_ComposeShell_HeaderFile
19
20 #include <Standard.hxx>
21 #include <Standard_Type.hxx>
22
23 #include <TopLoc_Location.hxx>
24 #include <TopoDS_Face.hxx>
25 #include <TopAbs_Orientation.hxx>
26 #include <TopoDS_Shape.hxx>
27 #include <Standard_Integer.hxx>
28 #include <Standard_Real.hxx>
29 #include <Standard_Boolean.hxx>
30 #include <ShapeFix_Root.hxx>
31 #include <ShapeExtend_Status.hxx>
32 #include <ShapeFix_SequenceOfWireSegment.hxx>
33 #include <TColStd_SequenceOfInteger.hxx>
34 #include <TColStd_SequenceOfReal.hxx>
35 #include <TopTools_SequenceOfShape.hxx>
36 #include <TopTools_MapOfShape.hxx>
37 class ShapeExtend_CompositeSurface;
38 class ShapeAnalysis_TransferParameters;
39 class ShapeExtend_WireData;
40 class gp_Lin2d;
41 class ShapeFix_WireSegment;
42 class Geom_Surface;
43
44 // resolve name collisions with X11 headers
45 #ifdef Status
46   #undef Status
47 #endif
48
49 class ShapeFix_ComposeShell;
50 DEFINE_STANDARD_HANDLE(ShapeFix_ComposeShell, ShapeFix_Root)
51
52 //! This class is intended to create a shell from the composite
53 //! surface (grid of surfaces) and set of wires.
54 //! It may be either division of the supporting surface of the
55 //! face, or creating a shape corresponding to face on composite
56 //! surface which is missing in CAS.CADE but exists in some other
57 //! systems.
58 //!
59 //! It splits (if necessary) original face to several ones by
60 //! splitting lines which are joint lines on a supplied grid of
61 //! surfaces (U- and V- isolines of the  composite surface).
62 //! There are two modes of work, which differ in the way of
63 //! handling faces on periodic surfaces:
64 //!
65 //! - if ClosedMode is False (default), when splitting itself is
66 //! done as if surface were not periodic. The periodicity of the
67 //! underlying surface is taken into account by duplicating splitting
68 //! lines in the periodic direction, as necessary to split all
69 //! the wires (whole parametrical range of a face)
70 //! In this mode, some regularization procedures are performed
71 //! (indexation of splitted segments by patch numbers), and it is
72 //! expected to be more reliable and robust in case of bad shapes
73 //!
74 //! - if ClosedMode is True, when everything on a periodic surfaces
75 //! is considered as modulo period. This allows to deal with wires
76 //! which are closed in 3d but not in 2d, with wires which may be
77 //! shifted on several periods in 2d etc. However, this mode is
78 //! less reliable since some regularizations do not work for it.
79 //!
80 //! The work is made basing on pcurves of the edges. These pcurves
81 //! should already exist (for example, in the case of division of
82 //! existing face), then they are taken as is. The existing pcurves
83 //! should be assigned to one surface (face) for all edges,
84 //! this surface (face) will be used only for accessing pcurves,
85 //! and it may have any geometry.
86 //!
87 //! All the modifications are recorded in the context tool
88 //! (ShapeBuild_ReShape).
89 class ShapeFix_ComposeShell : public ShapeFix_Root
90 {
91
92 public:
93
94   
95   //! Creates empty tool.
96   Standard_EXPORT ShapeFix_ComposeShell();
97   
98   //! Initializes with composite surface, face and precision.
99   //! Here face defines both set of wires and way of getting
100   //! pcurves. Precision is used (together with tolerance of edges)
101   //! for handling subtle cases, such as tangential intersections.
102   Standard_EXPORT void Init (const Handle(ShapeExtend_CompositeSurface)& Grid,
103                              const TopLoc_Location& L,
104                              const TopoDS_Face& Face,
105                              const Standard_Real Prec);
106   
107   //! Returns (modifiable) flag for special 'closed'
108   //! mode which forces ComposeShell to consider
109   //! all pcurves on closed surface as modulo period.
110   //! This can reduce reliability, but allows to deal
111   //! with wires closed in 3d but open in 2d (missing seam)
112   //! Default is False
113   Standard_EXPORT Standard_Boolean& ClosedMode();
114   
115   //! Performs the work on already loaded data.
116   Standard_EXPORT virtual Standard_Boolean Perform();
117   
118   //! Splits edges in the original shape by grid.
119   //! This is a part of Perform() which does not produce any
120   //! resulting shape; the only result is filled context
121   //! where splittings are recorded.
122   //!
123   //! NOTE: If edge is splitted, it is replaced by wire, and
124   //! order of edges in the wire corresponds to FORWARD orientation
125   //! of the edge.
126   Standard_EXPORT void SplitEdges();
127   
128   //! Returns resulting shell or face (or Null shape if not done)
129   Standard_EXPORT const TopoDS_Shape& Result() const;
130   
131   //! Queries status of last call to Perform()
132   //! OK   : nothing done (some kind of error)
133   //! DONE1: splitting is done, at least one new face created
134   //! DONE2: splitting is done, several new faces obtained
135   //! FAIL1: misoriented wire encountered (handled)
136   //! FAIL2: recoverable parity error
137   //! FAIL3: edge with no pcurve on supporting face
138   //! FAIL4: unrecoverable algorithm error (parity check)
139   Standard_EXPORT Standard_Boolean Status (const ShapeExtend_Status status) const;
140   
141   //! Creates new faces from the set of (closed) wires. Each wire
142   //! is put on corresponding patch in the composite surface,
143   //! and all pcurves on the initial (pseudo)face are reassigned to
144   //! that surface. If several wires are one inside another, single
145   //! face is created.
146   Standard_EXPORT void DispatchWires (TopTools_SequenceOfShape& faces,
147                                       ShapeFix_SequenceOfWireSegment& wires) const;
148   
149   //! Sets tool for transfer parameters from 3d to 2d and vice versa.
150   Standard_EXPORT void SetTransferParamTool (const Handle(ShapeAnalysis_TransferParameters)& TransferParam);
151   
152   //! Gets tool for transfer parameters from 3d to 2d and vice versa.
153   Standard_EXPORT Handle(ShapeAnalysis_TransferParameters) GetTransferParamTool() const;
154
155
156
157
158   DEFINE_STANDARD_RTTIEXT(ShapeFix_ComposeShell,ShapeFix_Root)
159
160 protected:
161
162   
163   //! Fill sequence of wire segments by wires from myFace
164   //! (pre-loaded). It performs reorder so that edges in segments
165   //! are well-ordered. The context is applied to all wires
166   //! before using them.
167   Standard_EXPORT void LoadWires (ShapeFix_SequenceOfWireSegment& seqw) const;
168   
169   //! Analyze tangencies and compute orientation code for wire segment
170   //! between two intersections: tells if segment is on left or right side
171   //! of cutting line, or tangent to it (by several points recomputed to 3d,
172   //! distance is compared with tolerance of corresponding edge).
173   Standard_EXPORT Standard_Integer ComputeCode (const Handle(ShapeExtend_WireData)& wire,
174                                                 const gp_Lin2d& line,
175                                                 const Standard_Integer begInd,
176                                                 const Standard_Integer endInd,
177                                                 const Standard_Real begPar,
178                                                 const Standard_Real endPar,
179                                                 const Standard_Boolean IsInternal = Standard_False);
180   
181   //! Splits edges in the wire by given indices of edges and
182   //! parameters on them. Returns resulting wire and vertices
183   //! corresponding to splitting parameters. If two consequtive
184   //! splitting points are too near one to another (with tolerance
185   //! of edge), edge is divided in single point. In the same way,
186   //! splitting which is too near to end of edge, is not applied
187   //! (end vertex is returned instead).
188   //!
189   //! NOTE: If edge is splitted, it is replaced by wire, and
190   //! order of edges in the wire corresponds to FORWARD orientation
191   //! of the edge.
192   Standard_EXPORT ShapeFix_WireSegment SplitWire (ShapeFix_WireSegment& wire,
193                                                   TColStd_SequenceOfInteger& indexes,
194                                                   const TColStd_SequenceOfReal& values,
195                                                   const TopTools_MapOfShape& theVerts,
196                                                   TopTools_SequenceOfShape& vertices,
197                                                   const TColStd_SequenceOfInteger& segcodes,
198                                                   const Standard_Boolean cutbyu,
199                                                   const Standard_Integer cutindex);
200   
201   //! Split edges in the wire by cutting line.
202   //! Wires with FORWARD or REVERSED orientation are considered
203   //! as closed.
204   //!
205   //! All modifications (splitting) are recorded in context,
206   //! except splitting of wires marked as EXTERNAL
207   //! (they are supposed to be former cutting lines).
208   //!
209   //! Method fills sequences of parameters of intersection points
210   //! of cutting line with all edges, their types, and corresponding
211   //! vertices (including ones created during splitting edges).
212   Standard_EXPORT Standard_Boolean SplitByLine (ShapeFix_WireSegment& wire,
213                                                 const gp_Lin2d& line,
214                                                 const Standard_Boolean cutbyu,
215                                                 const Standard_Integer cutindex,
216                                                 TColStd_SequenceOfReal& SplitLinePar,
217                                                 TColStd_SequenceOfInteger& SplitLineCode,
218                                                 TopTools_SequenceOfShape& SplitLineVertex);
219   
220   //! Split edges in the sequence of wires by cutting line.
221   //! Wires with FORWARD or REVERSED orientation are considered
222   //! as closed.
223   //!
224   //! Parts of cutting line which get inside the face (defined by
225   //! parity check of intersections with all wires) are added
226   //! into that sequence (with orientation EXTERNAL). Each part
227   //! is represented by one-edge wire segment with no 3d curve.
228   //! They share common vertices with all wires they intersect.
229   //!
230   //! All modifications (splitting) are recorded in context,
231   //! except splitting of wires marked as EXTERNAL
232   //! (they are supposed to be former cutting lines).
233   Standard_EXPORT void SplitByLine (ShapeFix_SequenceOfWireSegment& seqw,
234                                     const gp_Lin2d& line,
235                                     const Standard_Boolean cutbyu,
236                                     const Standard_Integer cutindex);
237   
238   //! Split initial set of (closed) wires by grid of lines corresponding
239   //! to joints between patches on the composite surface.
240   //! Parts of joint lines which get inside the face are also added
241   //! into the sequence as wires with orientation EXTERNAL.
242   //! They share common vertices with all wires they intersect.
243   //! All modifications (splitting) are recorded in context,
244   //! except splitting of joint edge itself and wires marked as
245   //! EXTERNAL (they supposed to be another joint edges).
246   Standard_EXPORT void SplitByGrid (ShapeFix_SequenceOfWireSegment& seqw);
247   
248   //! Break wires into open wire segments by common vertices
249   //! (splitting points), so that each segment is either closed and
250   //! not touching others, or touches others at ends (have common
251   //! vertices).
252   //! After that, each wire segment lies on its own patch of grid.
253   Standard_EXPORT void BreakWires (ShapeFix_SequenceOfWireSegment& seqw);
254   
255   //! Collect set of wire segments (already splitted) into closed
256   //! wires. This is done by traversing all the segments in allowed
257   //! directions, starting only from the REVERSED and FORWARD and
258   //! taking EXTERNAL as necessary in fork points. Forks are detected
259   //! by common vertices. In fork point, most left way is seleccted
260   //! among all possible ways.
261   Standard_EXPORT void CollectWires (ShapeFix_SequenceOfWireSegment& wires,
262                                      ShapeFix_SequenceOfWireSegment& seqw);
263   
264   //! Creates new faces on one path of grid. It dispatches given loops
265   //! (wires) into one or several faces depending on their mutual
266   //! position.
267   Standard_EXPORT void MakeFacesOnPatch (TopTools_SequenceOfShape& faces,
268                                          const Handle(Geom_Surface)& surf,
269                                          TopTools_SequenceOfShape& loops) const;
270
271   TopAbs_Orientation myOrient;
272   TopoDS_Shape myResult;
273   Standard_Integer myStatus;
274
275
276 private:
277
278
279   Handle(ShapeExtend_CompositeSurface) myGrid;
280   TopLoc_Location myLoc;
281   TopoDS_Face myFace;
282   Standard_Real myUResolution;
283   Standard_Real myVResolution;
284   Handle(ShapeAnalysis_TransferParameters) myTransferParamTool;
285   Standard_Boolean myInvertEdgeStatus;
286   Standard_Boolean myClosedMode;
287   Standard_Boolean myUClosed;
288   Standard_Boolean myVClosed;
289   Standard_Real myUPeriod;
290   Standard_Real myVPeriod;
291
292
293 };
294
295
296
297
298
299
300
301 #endif // _ShapeFix_ComposeShell_HeaderFile