1 Boolean Operations {#occt_user_guides__boolean_operations}
2 =========================
6 @section occt_algorithms_1 Introduction
8 This document provides a comprehensive description of the Boolean Operation Algorithm (BOA) as it is implemented in Open CASCADE Technology. The Boolean Component contains:
10 * General Fuse Operator (GFA),
11 * Boolean Operator (BOA),
12 * Section Operator (SA),
13 * Splitter Operator (SPA).
15 GFA is the base algorithm for BOA, SPA, SA.
17 GFA has a history-based architecture designed to allow using OCAF naming functionality. The architecture of GFA is expandable, that allows creating new algorithms basing on it.
20 @section occt_algorithms_2 Overview
22 @subsection occt_algorithms_2_1 Operators
24 @subsubsection occt_algorithms_2_1_1 Boolean operator
26 The Boolean operator provides the operations (Common, Fuse, Cut) between two groups: *Objects* and *Tools*. Each group consists of an arbitrary number of arguments in terms of *TopoDS_Shape*.
28 The operator can be represented as:
30 <i>R<sub>B</sub>=B<sub>j</sub> (G<sub>1</sub>, G<sub>2</sub>),</i>
33 * *R<sub>B</sub>* -- result of the operation;
34 * *B<sub>j</sub>* -- operation of type *j* (Common, Fuse, Cut);
35 * *G<sub>1</sub>={S<sub>11</sub>, S<sub>12</sub> ... S<sub>1n1</sub>}* group of arguments (Objects);
36 * *G<sub>2</sub>={S<sub>21</sub>, S<sub>22</sub> ... S<sub>2n2</sub>}* group of arguments (Tools);
37 * *n<sub>1</sub>* -- Number of arguments in *Objects* group;
38 * *n<sub>2</sub>* -- Number of arguments in *Tools* group.
41 **Note** There is an operation *Cut21*, which is an extension for forward Cut operation, i.e <i>Cut21=Cut(G2, G1)</i>.
43 For more details see @ref occt_algorithms_9 "Boolean Operations Algorithm" section.
45 @subsubsection occt_algorithms_2_1_2 General Fuse operator
47 The General fuse operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*.
49 The GFA operator can be represented as:
51 <i>R<sub>GF</sub> = GF (S<sub>1</sub>, S<sub>2</sub> ... S<sub>n</sub>), </i>
54 * *R<sub>GF</sub>* -- result of the operation,
55 * *S<sub>1</sub>, S<sub>2</sub> ... S<sub>n</sub>* -- arguments of the operation,
56 * *n* -- number of arguments.
58 The result of the Boolean operator, *R<sub>B</sub>*, can be obtained from *R<sub>GF</sub>*.
60 For example, for two arguments *S<sub>1</sub>* and *S<sub>2</sub>* the result *R<sub>GF</sub>* is
62 <i>R<sub>GF</sub> = GF (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub> + S<sub>p2</sub> + S<sub>p12</sub></i>
64 @figure{/user_guides/boolean_operations/images/operations_image001.svg, "Operators"}
66 This Figure shows that
67 * <i>B<sub>common</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p12</sub>;</i>
68 * <i>B<sub>cut12</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub>;</i>
69 * <i>B<sub>cut21</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p2</sub>;</i>
70 * <i>B<sub>fuse</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub>+S<sub>p2</sub>+S<sub>p12</sub></i>
72 <i>R<sub>GF</sub>=GF (S<sub>1</sub>, S<sub>2</sub>) = B<sub>fuse</sub> = B<sub>common</sub>+ B<sub>cut12</sub>+ B<sub>cut21</sub>.</i>
74 The fact that *R<sub>GF</sub>* contains the components of *R<sub>B</sub>* allows considering GFA as the general case of BOA. So it is possible to implement BOA as a subclass of GFA.
76 For more details see @ref occt_algorithms_7 "General Fuse Algorithm" section.
78 @subsubsection occt_algorithms_2_1_3 Splitter operator
80 The Splitter operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*. The arguments are divided into two groups: *Objects* and *Tools*. The result of *SPA* contains all parts that belong to the *Objects* but does not contain the parts that belong to the *Tools*.
82 The *SPA* operator can be represented as follows:
84 <i>R<sub>SPA</sub>=SPA (G<sub>1</sub>, G<sub>2</sub>),</i>
86 * <i>R<sub>SPA</sub></i> -- is the result of the operation;
87 * *G<sub>1</sub>={S<sub>11</sub>, S<sub>12</sub> ... S<sub>1n1</sub>}* group of arguments (*Objects*);
88 * *G<sub>2</sub>={S<sub>21</sub>, S<sub>22</sub> ... S<sub>2n2</sub>}* group of arguments (*Tools*);
89 * *n<sub>1</sub>* -- Number of arguments in *Objects* group;
90 * *n<sub>2</sub>* -- Number of arguments in *Tools* group.
92 The result *R<sub>SPA</sub>* can be obtained from *R<sub>GF</sub>* .
94 For example, for two arguments *S<sub>1</sub>* and *S<sub>2</sub>* the result *R<sub>SPA</sub>* is
96 <i>R<sub>SPA</sub>=SPA(S<sub>1</sub>,S<sub>2</sub>)=S<sub>p1</sub>+S<sub>p12</sub>.</i>
98 In case when all arguments of the *SPA* are *Objects* and there are no *Tools*, the result of *SPA* is equivalent to the result of *GFA*.
100 For example, when *G<sub>1</sub>* consists of shapes *S<sub>1</sub>* and *S<sub>2</sub>* the result of *SPA* is
102 <i>R<sub>SPA</sub>=SPA(S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub> + S<sub>p2</sub> + S<sub>p12</sub> = GF (S<sub>1</sub>, S<sub>2</sub>)</i>
104 The fact that the *R<sub>GF</sub>* contains the components of *R<sub>SPA</sub>* allows considering *GFA* as the general case of *SPA*. Thus, it is possible to implement *SPA* as a subclass of *GFA*.
106 For more details see @ref occt_algorithms_8 "Splitter Algorithm" section.
108 @subsubsection occt_algorithms_2_1_4 Section operator
110 The Section operator *SA* can be applied to arbitrary number of arguments in terms of *TopoDS_Shape*. The result of *SA* contains vertices and edges in accordance with interferences between the arguments
111 The SA operator can be represented as follows:
112 <i>R<sub>SA</sub>=SA(S1, S2… Sn)</i>, where
113 * <i>R<sub>SA</sub></i> -- the operation result;
114 * <i>S1, S2 ... Sn</i> -- the operation arguments;
115 * *n* -- the number of arguments.
117 For more details see @ref occt_algorithms_10a "Section Algorithm" section.
119 @subsection occt_algorithms_2_2 Parts of algorithms
121 GFA, BOA, SPA and SA have the same Data Structure (DS). The main goal of the Data Structure is to store all necessary information for input data and intermediate results.
123 The operators consist of two main parts:
124 * Intersection Part (IP). The main goal of IP is to compute the interferences between sub-shapes of arguments. The IP uses DS to retrieve input data and store the results of intersections.
125 * Building Part (BP). The main goal of BP is to build required result of an operation. This part also uses DS to retrieve data and store the results.
127 As it follows from the definition of operator results, the main differences between GFA, BOA, SPA and SA are in the Building Part. The Intersection Part is the same for the algorithms.
129 @section occt_algorithms_3 Terms and Definitions
131 This chapter provides the background terms and definitions that are necessary to understand how the algorithms work.
133 @subsection occt_algorithms_3_1 Interferences
135 There are two groups of interferences.
137 At first, each shape having a boundary representation (vertex, edge, face) has an internal value of geometrical tolerance. The shapes interfere with each other in terms of their tolerances. The shapes that have a boundary representation interfere when there is a part of 3D space where the distance between the underlying geometry of shapes is less or equal to the sum of tolerances of the shapes. Three types of shapes: vertex, edge and face -- produce six types of **BRep interferences:**
145 At second, there are interferences that occur between a solid *Z1* and a shape *S2* when *Z1* and *S2* have no BRep interferences but *S2* is completely inside of *Z1*. These interferences are **Non-BRep interferences**. There are four possible cases:
151 @subsubsection occt_algorithms_3_1_1 Vertex/Vertex interference
153 For two vertices *Vi* and *Vj*, the distance between their corresponding 3D points is less than the sum of their tolerances *Tol(Vi)* and *Tol(Vj)*.
155 @figure{/user_guides/boolean_operations/images/operations_image002.svg, "Vertex/vertex interference"}
157 The result is a new vertex *Vn* with 3D point *Pn* and tolerance value <i>Tol(Vn)</i>.
159 The coordinates of *Pn* and the value <i>Tol(Vn)</i> are computed as the center and the radius of the sphere enclosing the tolerance spheres of the source vertices <i>(V1, V2)</i>.
161 @subsubsection occt_algorithms_3_1_2 Vertex/Edge interference
163 For a vertex *Vi* and an edge *Ej*, the distance *D* between 3D point of the vertex and its projection on the 3D curve of edge *Ej* is less or equal than sum of tolerances of vertex *Tol(Vi)* and edge *Tol(Ej)*.
165 @figure{/user_guides/boolean_operations/images/operations_image003.svg, "Vertex/edge interference"}
167 The result is vertex *Vi* with the corresponding tolerance value <i>Tol(Vi)=Max(Tol(Vi), D+Tol(Ej))</i>, where <i>D = distance (Pi, PPi)</i>;
169 and parameter *t<sub>i</sub>* of the projected point *PPi* on 3D curve *Cj* of edge *Ej*.
171 @subsubsection occt_algorithms_3_1_3 Vertex/Face interference
173 For a vertex *Vi* and a face *Fj* the distance *D* between 3D point of the vertex and its projection on the surface of the face is less or equal than sum of tolerances of the vertex *Tol(Vi)* and the face *Tol(Fj)*.
175 @figure{/user_guides/boolean_operations/images/operations_image004.svg, "Vertex/face interference"}
177 The result is vertex *Vi* with the corresponding tolerance value <i>Tol(Vi)=Max(Tol(Vi), D+Tol(Fj))</i>, where <i>D = distance (Pi, PPi)</i>
179 and parameters <i>u<sub>i</sub>, v<sub>i</sub></i> of the projected point *PPi* on surface *Sj* of face *Fj*.
181 @subsubsection occt_algorithms_3_1_4 Edge/Edge interference
183 For two edges *Ei* and *Ej* (with the corresponding 3D curves *Ci* and *Cj*) there are some places where the distance between the curves is less than (or equal to) sum of tolerances of the edges.
185 Let us examine two cases:
187 In the first case two edges have one or several common parts of 3D curves in terms of tolerance.
189 @figure{/user_guides/boolean_operations/images/operations_image005.svg, "Edge/edge interference: common parts"}
192 * Parametric range <i>[t<sub>i1</sub>, t<sub>i2</sub> ]</i> for 3D curve *Ci* of edge *Ei*.
193 * Parametric range <i>[t<sub>j1</sub>, t<sub>j2</sub> ]</i> for 3D curve *Cj* of edge *Ej*.
195 In the second case two edges have one or several common points in terms of tolerance.
197 @image html /user_guides/boolean_operations/images/operations_image006.svg "Edge/edge interference: common points"
198 @image latex /user_guides/boolean_operations/images/operations_image006.svg "Edge/edge interference: common points"
200 The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*.
202 The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curves *Ci*, *Cj* of source edges *Ei*, *Ej*.
204 * Parameter *t<sub>i</sub>* of *Pi* for the 3D curve *Ci*.
205 * Parameter *t<sub>j</sub>* of *Pj* for the 3D curve *Cj*.
207 @subsubsection occt_algorithms_3_1_5 Edge/Face interference
209 For an edge *Ei* (with the corresponding 3D curve *Ci*) and a face *Fj* (with the corresponding 3D surface *Sj*) there are some places in 3D space, where the distance between *Ci* and surface *Sj* is less than (or equal to) the sum of tolerances of edge *Ei* and face *Fj*.
211 Let us examine two cases:
213 In the first case Edge *Ei* and Face *Fj* have one or several common parts in terms of tolerance.
215 @figure{/user_guides/boolean_operations/images/operations_image007.svg, "Edge/face interference: common parts"}
217 The result is a parametric range <i>[t<sub>i1</sub>, t<sub>i2</sub>]</i> for the 3D curve *Ci* of the edge *Ei*.
219 In the second case Edge *Ei* and Face *Fj* have one or several common points in terms of tolerance.
221 @figure{/user_guides/boolean_operations/images/operations_image008.svg, "Edge/face interference: common points"}
223 The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*.
225 The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curve *Ci* and surface *Sj* of source edges *Ei*, *Fj*.
227 * Parameter *t<sub>i</sub>* of *Pi* for the 3D curve *Ci*.
228 * Parameters *u<sub>i</sub>* and *v<sub>i</sub>* of the projected point *PPi* on the surface *Sj* of the face *Fj*.
230 @subsubsection occt_algorithms_3_1_6 Face/Face Interference
232 For a face *Fi* and a face *Fj* (with the corresponding surfaces *Si* and *Sj*) there are some places in 3D space, where the distance between the surfaces is less than (or equal to) sum of tolerances of the faces.
234 @figure{/user_guides/boolean_operations/images/operations_image009.svg, "Face/face interference: common curves"}
236 In the first case the result contains intersection curves *C<sub>ijk</sub> (k = 0, 1, 2…k<sub>N</sub>,* where *k<sub>N</sub>* is the number of intersection curves with corresponding values of tolerances *Tol(C<sub>ijk</sub>)*.
238 @figure{/user_guides/boolean_operations/images/operations_image010.svg, "Face/face interference: common points"}
240 In the second case Face *Fi* and face *Fj* have one or several new vertices *V<sub>ijm</sub>*, where <i>m=0,1,2, ... mN, mN </i> is the number of intersection points.
242 The coordinates of a 3D point *P<sub>ijm</sub>* and the value *Tol(V<sub>ijm</sub>)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of the surface *Si*, *Sj* of source shapes *Fi*, *Fj*.
244 * Parameters *u<sub>j</sub>*, *v<sub>j</sub>* belong to point *PPj* projected on surface *Sj* of face *Fj*.
245 * Parameters *u<sub>i</sub>* and *v<sub>i</sub>* belong to point *PPi* projected on surface *Si* of face *Fi*.
247 @subsubsection occt_algorithms_3_1_7 Vertex/Solid Interference
249 For a vertex *Vi* and a solid *Zj* there is Vertex/Solid interference if the vertex *Vi* has no BRep interferences with any sub-shape of *Zj* and *Vi* is completely inside the solid *Zj*.
251 @figure{/user_guides/boolean_operations/images/operations_image060.png, "Vertex/Solid Interference"}
253 @subsubsection occt_algorithms_3_1_8 Edge/Soild Interference
255 For an edge *Ei* and a solid *Zj* there is Edge/Solid interference if the edge *Ei* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Ei* is completely inside the solid *Zj*.
257 @figure{/user_guides/boolean_operations/images/operations_image061.png, "Edge/Solid Interference"}
259 @subsubsection occt_algorithms_3_1_9 Face/Soild Interference
261 For a face *Fi* and a solid *Zj* there is Face/Solid interference if the face *Fi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Fi* is completely inside the solid *Zj*.
263 @figure{/user_guides/boolean_operations/images/operations_image062.png, "Face/Solid Interference"}
265 @subsubsection occt_algorithms_3_1_10 Solid/Soild Interference
267 For a solid *Zi* and a solid *Zj* there is Solid/Solid interference if the solid *Zi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Zi* is completely inside the solid *Zj*.
269 @figure{/user_guides/boolean_operations/images/operations_image063.png, "Solid/Solid Interference"}
272 @subsubsection occt_algorithms_3_1_11 Computation Order
274 The interferences between shapes are computed on the basis of increasing of the dimension value of the shape in the following order:
286 This order allows avoiding the computation of redundant interferences between upper-level shapes *Si* and *Sj* when there are interferences between lower sub-shapes *Sik* and *Sjm*.
288 @subsubsection occt_algorithms_3_1_12 Results
290 * The result of the interference is a shape that can be either interfered shape itself (or its part) or a new shape.
291 * The result of the interference is a shape with the dimension value that is less or equal to the minimal dimension value of interfered shapes. For example, the result of Vertex/Edge interference is a vertex, but not an edge.
292 * The result of the interference splits the source shapes on the parts each time as it can do that.
294 @subsection occt_algorithms_3_2 Paves
296 The result of interferences of the type Vertex/Edge, Edge/Edge and Edge/Face in most cases is a vertex (new or old) lying on an edge.
298 The result of interferences of the type Face/Face in most cases is intersection curves, which go through some vertices lying on the faces.
300 The position of vertex *Vi* on curve *C* can be defined by a value of parameter <i>t<sub>i</sub></i> of the 3D point of the vertex on the curve.
301 Pave *PVi* on curve *C* is a structure containing the vertex *Vi* and correspondent value of the parameter <i>t<sub>i</sub></i> of the 3D point of the vertex on the curve. Curve *C* can be a 3D or a 2D curve.
303 @figure{/user_guides/boolean_operations/images/operations_image011.svg, "Paves"}
305 Two paves *PV1* and *PV2* on the same curve *C* can be compared using the parameter value @code PV1 > PV2 if t1 > t2 @endcode
307 The usage of paves allows binding of the vertex to the curve (or any structure that contains a curve: edge, intersection curve).
310 @subsection occt_algorithms_3_3 Pave Blocks
312 A set of paves *PVi (i=1, 2...nPV)*, where *nPV* is the number of paves] of curve *C* can be sorted in the increasing order using the value of parameter *t* on curve *C*.
314 A pave block *PBi* is a part of the object (edge, intersection curve) between neighboring paves.
316 @figure{/user_guides/boolean_operations/images/operations_image012.svg, "Pave Blocks"}
318 Any finite source edge *E* has at least one pave block that contains two paves *PVb* and *PVe*:
319 * Pave *PVb* corresponds to the vertex *Vb* with minimal parameter <i>t<sub>b</sub></i> on the curve of the edge.
320 * Pave *PVe* corresponds to the vertex *Ve* with maximal parameter <i>t<sub>e</sub></i> on the curve of the edge.
322 @subsection occt_algorithms_3_4 Shrunk Range
324 Pave block *PV* of curve *C* is bounded by vertices *V1* and *V2* with tolerance values *Tol(V1)* and *Tol(V2)*. Curve *C* has its own tolerance value *Tol(C)*:
325 * In case of edge, the tolerance value is the tolerance of the edge.
326 * In case of intersection curve, the tolerance value is obtained from an intersection algorithm.
328 @figure{/user_guides/boolean_operations/images/operations_image013.svg, "Shrunk Range"}
330 The theoretical parametric range of the pave block is <i>[t1C, t2C]</i>.
332 The positions of the vertices *V1* and *V2* of the pave block can be different. The positions are determined by the following conditions:
334 Distance (P1, P1c) is equal or less than Tol(V1) + Tol(C)
335 Distance (P2, P2c) is equal or less than Tol(V2) + Tol(C)
337 The Figure shows that each tolerance sphere of a vertex can reduce the parametric range of the pave block to a range <i>[t1S, t2S]</i>. The range <i>[t1S, t2S]</i> is the shrunk range of the pave block.
339 The shrunk range of the pave block is the part of 3D curve that can interfere with other shapes.
341 @subsection occt_algorithms_3_5 Common Blocks
343 The interferences of the type Edge/Edge, Edge/Face produce results as common parts.
345 In case of Edge/Edge interference the common parts are pave blocks that have different base edges.
347 @figure{/user_guides/boolean_operations/images/operations_image014.svg, "Common Blocks: Edge/Edge interference"}
349 If the pave blocks <i>PB<sub>1</sub>, PB<sub>2</sub>…PB<sub>NbPB</sub></i> , where *NbPB* is the number of pave blocks have the same bounding vertices and geometrically coincide, the pave blocks form common block *CB*.
352 In case of Edge/Face interference the common parts are pave blocks lying on a face(s).
354 @figure{/user_guides/boolean_operations/images/operations_image015.svg, "Common Blocks: Edge/Face interference"}
356 If the pave blocks *PBi* geometrically coincide with a face *Fj*, the pave blocks form common block *CB*.
358 In general case a common block *CB* contains:
359 * Pave blocks *PBi (i=0,1,2, 3… NbPB)*.
360 * A set of faces *Fj (j=0,1... NbF), NbF* -- number of faces.
363 @subsection occt_algorithms_3_6 FaceInfo
365 The structure *FaceInfo* contains the following information:
366 * Pave blocks that have state **In** for the face;
367 * Vertices that have state **In** for the face;
368 * Pave blocks that have state **On** for the face;
369 * Vertices that have state **On** for the face;
370 * Pave blocks built up from intersection curves for the face;
371 * Vertices built up from intersection points for the face.
373 @figure{/user_guides/boolean_operations/images/operations_image016.svg, "Face Info"}
375 In the figure, for face *F1*:
376 * Pave blocks that have state **In** for the face: *PB<sub>in1</sub>*.
377 * Vertices that have state **In** for the face: *V<sub>in1</sub>*.
378 * Pave blocks that have state **On** for the face: *PB<sub>on11</sub>*, *PB<sub>on12</sub>*, *PB<sub>on2</sub>*, *PB<sub>on31</sub>*, *PB<sub>on32</sub>*, *PB<sub>on4</sub>*.
379 * Vertices that have state **On** for the face: *V1, V2, V3, V4, V5, V6*.
380 * Pave blocks built up from intersection curves for the face: *PB<sub>sc1</sub>*.
381 * Vertices built up from intersection points for the face: none
384 @section occt_algorithms_4 Data Structure
386 Data Structure (DS) is used to:
387 * Store information about input data and intermediate results;
388 * Provide the access to the information;
389 * Provide the links between the chunks of information.
391 This information includes:
398 Data Structure is implemented in the class *BOPDS_DS*.
400 @subsection occt_algorithms_4_1 Arguments
402 The arguments are shapes (in terms of *TopoDS_Shape*):
403 * Number of arguments is unlimited.
404 * Each argument is a valid shape (in terms of *BRepCheck_Analyzer*).
405 * Each argument can be of one of the following types (see the Table):
407 | No | Type | Index of Type |
408 | :----- | :----- | :----- |
410 | 2 | COMPSOLID | 1 |
418 * The argument of type *0 (COMPOUND)* can include any number of shapes of an arbitrary type (0, 1…7).
419 * The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) must share these entities.
420 * There are no restrictions on the type of underlying geometry of the shapes. The faces or edges of arguments *S<sub>i</sub>* can have underlying geometry of any type supported by Open CASCADE Technology modeling algorithms (in terms of *GeomAbs_CurveType* and *GeomAbs_SurfaceType*).
421 * The faces or edges of the arguments should have underlying geometry with continuity that is not less than C1.
423 @subsection occt_algorithms_4_2 Shapes
425 The information about Shapes is stored in structure *BOPDS_ShapeInfo*. The objects of type *BOPDS_ShapeInfo* are stored in the container of array type. The array allows getting the access to the information by an index (DS index).
426 The structure *BOPDS_ShapeInfo* has the following contents:
430 | :-------- | :----- |
431 | *myShape* | Shape itself |
432 | *myType* | Type of shape |
433 | *myBox* | 3D bounding box of the shape |
434 | *mySubShapes* | List of DS indices of sub-shapes |
435 | *myReference* | Storage for some auxiliary information |
436 | *myFlag* | Storage for some auxiliary information |
438 @subsection occt_algorithms_4_3 Interferences
440 The information about interferences is stored in the instances of classes that are inherited from class <i>BOPDS_Interf</i>.
444 | *BOPDS_Interf* | Root class for interference |
445 | *Index1* | DS index of the shape 1 |
446 | *Index2* | DS index of the shape 2 |
447 | *BOPDS_InterfVV* | Storage for Vertex/Vertex interference |
448 | *BOPDS_InterfVE* | Storage for Vertex/Edge interference |
449 | *myParam* | The value of parameter of the point of the vertex on the curve of the edge |
450 | *BOPDS_InterfVF* | Storage for Vertex/Face interference |
451 | *myU, myV* | The value of parameters of the point of the vertex on the surface of the face |
452 | *BOPDS_InterfEE* | Storage for Edge/Edge interference |
453 | *myCommonPart* | Common part (in terms of *IntTools_CommonPart* ) |
454 | *BOPDS_InterfEF* | Storage for Edge/Face interference |
455 | *myCommonPart* | Common part (in terms of *IntTools_CommonPart* ) |
456 | *BOPDS_InterfFF* | Storage for Face/Face interference |
457 | *myTolR3D, myTolR2D* | The value of tolerances of curves (points) reached in 3D and 2D |
458 | *myCurves* | Intersection Curves (in terms of *BOPDS_Curve*) |
459 | *myPoints* | Intersection Points (in terms of *BOPDS_Point*) |
460 | *BOPDS_InterfVZ* | Storage for Vertex/Solid interference |
461 | *BOPDS_InterfEZ* | Storage for Edge/Solid interference |
462 | *BOPDS_InterfFZ* | Storage for Face/Solid interference |
463 | *BOPDS_InterfZZ* | Storage for Solid/Solid interference |
469 The Figure shows inheritance diagram for *BOPDS_Interf* classes.
471 @figure{/user_guides/boolean_operations/images/operations_image017.svg, "BOPDS_Interf classes"}
474 @subsection occt_algorithms_4_4 Pave, PaveBlock and CommonBlock
476 The information about the pave is stored in objects of type *BOPDS_Pave*.
481 | *myIndex* | DS index of the vertex |
482 | *myParam* | Value of the parameter of the 3D point of vertex on curve. |
484 The information about pave blocks is stored in objects of type *BOPDS_PaveBlock*.
488 | *BOPDS_PaveBlock* | |
489 | *myEdge* | DS index of the edge produced from the pave block |
490 | *myOriginalEdge* | DS index of the source edge |
491 | *myPave1* | Pave 1 (in terms of *BOPDS_Pave*) |
492 | *myPave2* | Pave 2 (in terms of *BOPDS_Pave*) |
493 | *myExtPaves* | The list of paves (in terms of *BOPDS_Pave*) that is used to store paves lying inside the pave block during intersection process |
494 | *myCommonBlock* | The reference to common block (in terms of *BOPDS_CommonBlock*) if the pave block is a common block |
495 | *myShrunkData* | The shrunk range of the pave block |
497 * To be bound to an edge (or intersection curve) the structures of type *BOPDS_PaveBlock* are stored in one container of list type <i>(BOPDS_ListOfPaveBlock)</i>.
498 * In case of edge, all the lists of pave blocks above are stored in one container of array type. The array allows getting the access to the information by index of the list of pave blocks for the edge. This index (if exists) is stored in the field *myReference*.
500 The information about common block is stored in objects of type *BOPDS_CommonBlock*.
504 | *BOPDS_CommonBlock* | |
505 | *myPaveBlocks* | The list of pave blocks that are common in terms of @ref occt_algorithms_3_5 "Common Blocks" |
506 | *myFaces* | The list of DS indices of the faces, on which the pave blocks lie. |
509 @subsection occt_algorithms_4_5 Points and Curves
510 The information about intersection point is stored in objects of type *BOPDS_Point*.
515 | *myPnt* | 3D point |
516 | *myPnt2D1* | 2D point on the face1 |
517 | *myPnt2D2* | 2D point on the face2 |
519 The information about intersection curve is stored in objects of type *BOPDS_Curve*.
524 | *myCurve* | The intersection curve (in terms of *IntTools_Curve* ) |
525 | *myPaveBlocks* | The list of pave blocks that belong to the curve |
526 | *myBox* | The bounding box of the curve (in terms of *Bnd_Box* ) |
528 @subsection occt_algorithms_4_6 FaceInfo
529 The information about *FaceInfo* is stored in a structure *BOPDS_FaceInfo*.
530 The structure *BOPDS_FaceInfo* has the following contents.
534 | *BOPDS_FaceInfo* | |
535 | *myPaveBlocksIn* | Pave blocks that have state In for the face |
536 | *myVerticesIn* | Vertices that have state In for the face |
537 | *myPaveBlocksOn* | Pave blocks that have state On for the face |
538 | *myVerticesOn* | Vertices that have state On for the face |
539 | *myPaveBlocksSc* | Pave blocks built up from intersection curves for the face |
540 | *myVerticesSc* | Vertices built up from intersection points for the face +
542 The objects of type *BOPDS_FaceInfo* are stored in one container of array type. The array allows getting the access to the information by index. This index (if exists) is stored in the field *myReference*.
544 @section occt_algorithms_5 Intersection Part
546 Intersection Part (IP) is used to
547 * Initialize the Data Structure;
548 * Compute interferences between the arguments (or their sub-shapes);
549 * Compute same domain vertices, edges;
551 * Build section edges;
553 * Store all obtained information in DS.
555 IP is implemented in the class *BOPAlgo_PaveFiller*.
557 @figure{/user_guides/boolean_operations/images/operations_image064.svg, "Diagram for Class BOPAlgo_PaveFiller"}
559 @subsection occt_algorithms_5_1a Class BOPAlgo_Algo
560 The class *BOPAlgo_Algo* provides the base interface for all algorithms to provide the possibility to:
562 * Get Warning status;
563 * Turn on/off the parallel processing
564 * Break the operations by user request
567 * Set the appropriate memory allocator.
569 The description provided in the next paragraphs is coherent with the implementation of the method *BOPAlgo_PaveFiller::Perform()*.
571 @subsection occt_algorithms_5_1 Initialization
572 The input data for the step is the Arguments. The description of initialization step is shown in the Table.
574 | No | Contents | Implementation |
575 | :--- | :----- | :----- |
576 | 1 | Initialization the array of shapes (in terms of @ref occt_algorithms_4_2 "Shapes"). Filling the array of shapes. | *BOPDS_DS::Init()* |
577 | 2 | Initialization the array pave blocks (in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock, CommonBlock") | *BOPDS_DS::Init()* |
578 | 3 | Initialization of intersection Iterator. The intersection Iterator is the object that computes intersections between sub-shapes of the arguments in terms of bounding boxes. The intersection Iterator provides approximate number of the interferences for given type (in terms of @ref occt_algorithms_3_1 "Interferences") | *BOPDS_Iterator* |
579 | 4 | Initialization of intersection Context. The intersection Context is an object that contains geometrical and topological toolkit (classifiers, projectors, etc). The intersection Context is used to cache the tools to increase the algorithm performance. | *IntTools_Context* |
582 @subsection occt_algorithms_5_2 Compute Vertex/Vertex Interferences
584 The input data for this step is the DS after the @ref occt_algorithms_5_1 "Initialization". The description of this step is shown in the table :
587 | No | Contents | Implementation |
588 | :--- | :---- | :----- |
589 | 1 | Initialize array of Vertex/Vertex interferences. | *BOPAlgo_PaveFiller::PerformVV()* |
590 | 2 | Access to the pairs of interfered shapes <i>(nVi, nVj)k, k=0, 1…nk,</i> where *nVi* and *nVj* are DS indices of vertices *Vi* and *Vj* and *nk* is the number of pairs. | *BOPDS_Iterator* |
591 | 3 | Compute the connexity chains of interfered vertices *nV1C, nV2C… nVnC)k, C=0, 1…nCs*, where *nCs* is the number of the connexity chains | *BOPAlgo_Tools::MakeBlocksCnx()* |
592 | 4 | Build new vertices from the chains *VNc. C=0, 1…nCs.* | *BOPAlgo_PaveFiller::PerformVV()* |
593 | 5 | Append new vertices in DS. | *BOPDS_DS::Append()* |
594 | 6 | Append same domain vertices in DS. | *BOPDS_DS::AddShapeSD()* |
595 | 7 | Append Vertex/Vertex interferences in DS. | *BOPDS_DS::AddInterf()* |
597 * The pairs of interfered vertices are: <i>(nV11, nV12), (nV11, nV13), (nV12, nV13), (nV13, nV15), (nV13, nV14), (nV14, nV15), (nV21, nV22), (nV21, nV23), (nV22, nV23);</i>
598 * These pairs produce two chains: <i>(nV11, nV12, nV13, nV14, nV15)</i> and <i>(nV21, nV22, nV23);</i>
599 * Each chain is used to create a new vertex, *VN1* and *VN2*, correspondingly.
601 The example of connexity chains of interfered vertices is given in the image:
603 @figure{/user_guides/boolean_operations/images/operations_image018.svg, "Connexity chains of interfered vertices"}
606 @subsection occt_algorithms_5_3 Compute Vertex/Edge Interferences
608 The input data for this step is the DS after computing Vertex/Vertex interferences.
610 | No | Contents | Implementation |
611 | :--- | :--- | :--- |
612 | 1 | Initialize array of Vertex/Edge interferences | *BOPAlgo_PaveFiller::PerformVE()* |
613 | 2 | Access to the pairs of interfered shapes <i>(nVi, nEj)k k=0, 1…nk,</i> where *nVi* is DS index of vertex *Vi*, *nEj* is DS index of edge *Ej* and *nk* is the number of pairs. | *BOPDS_Iterator* |
614 | 3 | Compute paves. See @ref occt_algorithms_3_1_2 "Vertex/Edge Interference" | *BOPInt_Context::ComputeVE()* |
615 | 4 | Initialize pave blocks for the edges *Ej* involved in the interference | *BOPDS_DS:: ChangePaveBlocks()* |
616 | 5 | Append the paves into the pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* |
617 | 6 | Append Vertex/Edge interferences in DS | *BOPDS_DS::AddInterf()* |
619 @subsection occt_algorithms_5_4 Update Pave Blocks
620 The input data for this step is the DS after computing Vertex/Edge Interferences.
622 | No | Contents | Implementation |
623 | :--- | :---- | :--- |
624 | 1 | Each pave block PB containing internal paves is split by internal paves into new pave blocks *PBN1, PBN2… PBNn*. PB is replaced by new pave blocks *PBN1, PBN2… PBNn* in the DS. | *BOPDS_DS:: UpdatePaveBlocks()* |
626 @subsection occt_algorithms_5_5 Compute Edge/Edge Interferences
628 The input data for this step is the DS after updating Pave Blocks.
630 | No | Contents | Implementation |
631 | :---- | :---- | :----- |
632 | 1 | Initialize array of Edge/Edge interferences | *BOPAlgo_PaveFiller::PerformEE()* |
633 | 2 | Access to the pairs of interfered shapes <i>(nEi, nEj)k, k=0, 1…nk,</i> where *nEi* is DS index of the edge *Ei*, *nEj* is DS index of the edge *Ej* and *nk* is the number of pairs. | *BOPDS_Iterator* |
634 | 3 | Initialize pave blocks for the edges involved in the interference, if it is necessary. | *BOPDS_DS:: ChangePaveBlocks()* |
635 | 4 | Access to the pave blocks of interfered shapes: <i>(PBi1, PBi2…PBiNi)</i> for edge *Ei* and <i>(PBj1, PBj2…PBjNj)</i> for edge *Ej* | *BOPAlgo_PaveFiller::PerformEE()* |
636 | 5 | Compute shrunk data for pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock", if it is necessary. | *BOPAlgo_PaveFiller::FillShrunkData()* |
637 | 6 | Compute Edge/Edge interference for pave blocks *PBix* and *PBiy*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeEdge* |
638 | 7.1 | For each *CommonPart* of type *VERTEX:* Create new vertices *VNi (i =1, 2…,NbVN),* where *NbVN* is the number of new vertices. Intersect the vertices *VNi* using the steps Initialization and compute Vertex/Vertex interferences as follows: a) create a new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* |
639 | 7.2 | For each *CommonPart* of type *EDGE:* Compute the coinciding connexity chains of pave blocks <i>(PB1C, PB2C… PNnC)k, C=0, 1…nCs,</i> where *nCs* is the number of the connexity chains. Create common blocks <i>(CBc. C=0, 1…nCs)</i> from the chains. Attach the common blocks to the pave blocks. | *BOPAlgo_Tools::PerformCommonBlocks()* |
640 | 8 | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* |
641 | 9 | Split common blocks CBc by the paves. | *BOPDS_DS:: UpdateCommonBlock()* |
642 | 10 | Append Edge/Edge interferences in the DS. | *BOPDS_DS::AddInterf()* |
644 The example of coinciding chains of pave blocks is given in the image:
646 @figure{/user_guides/boolean_operations/images/operations_image019.png, "Coinciding chains of pave blocks"}
648 * The pairs of coincided pave blocks are: <i>(PB11, PB12), (PB11, PB13), (PB12, PB13), (PB21, PB22), (PB21, PB23), (PB22, PB23).</i>
649 * The pairs produce two chains: <i>(PB11, PB12, PB13)</i> and <i>(PB21, PB22, PB23).</i>
651 @subsection occt_algorithms_5_6 Compute Vertex/Face Interferences
653 The input data for this step is the DS after computing Edge/Edge interferences.
655 | No | Contents | Implementation |
656 | :---- | :--- | :---- |
657 | 1 | Initialize array of Vertex/Face interferences | *BOPAlgo_PaveFiller::PerformVF()* |
658 | 2 | Access to the pairs of interfered shapes <i>(nVi, nFj)k, k=0, 1…nk,</i> where *nVi* is DS index of the vertex *Vi*, *nFj* is DS index of the edge *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* |
659 | 3 | Compute interference See @ref occt_algorithms_3_1_3 "Vertex/Face Interference" | *BOPInt_Context::ComputeVF()* |
660 | 4 | Append Vertex/Face interferences in the DS | *BOPDS_DS::AddInterf()* |
661 | 5 | Repeat steps 2-4 for each new vertex *VNXi (i=1, 2…,NbVNX),* where *NbVNX* is the number of vertices. | *BOPAlgo_PaveFiller::TreatVerticesEE()* |
663 @subsection occt_algorithms_5_7 Compute Edge/Face Interferences
664 The input data for this step is the DS after computing Vertex/Face Interferences.
666 | No | Contents | Implementation |
667 | :---- | :---- | :---- |
668 | 1 | Initialize array of Edge/Face interferences | *BOPAlgo_PaveFiller::PerformEF()* |
669 | 2 | Access to the pairs of interfered shapes <i>(nEi, nFj)k, k=0, 1…nk,</i> where *nEi* is DS index of edge *Ei*, *nFj* is DS index of face *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* |
670 | 3 | Initialize pave blocks for the edges involved in the interference, if it is necessary. | *BOPDS_DS::ChangePaveBlocks()* |
671 | 4 | Access to the pave blocks of interfered edge <i>(PBi1, PBi2…PBiNi)</i> for edge *Ei* | *BOPAlgo_PaveFiller::PerformEF()* |
672 | 5 | Compute shrunk data for pave blocks (in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock") if it is necessary. | *BOPAlgo_PaveFiller::FillShrunkData()* |
673 | 6 | Compute Edge/Face interference for pave block *PBix*, and face *nFj*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeFace* |
674 | 7.1 | For each *CommonPart* of type *VERTEX:* Create new vertices *VNi (i=1, 2…,NbVN),* where *NbVN* is the number of new vertices. Merge vertices *VNi* as follows: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* and *BOPAlgo_PaveFiller::PerformVertices1()* |
675 | 7.2 | For each *CommonPart* of type *EDGE:* Create common blocks <i>(CBc. C=0, 1…nCs)</i> from pave blocks that lie on the faces. Attach the common blocks to the pave blocks. | *BOPAlgo_Tools::PerformCommonBlocks()* |
676 | 8 | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock". | *BOPDS_PaveBlock:: AppendExtPave()* |
677 | 9 | Split pave blocks and common blocks *CBc* by the paves. | *BOPAlgo_PaveFiller::PerformVertices1()*, *BOPDS_DS:: UpdatePaveBlock()* and *BOPDS_DS:: UpdateCommonBlock()* |
678 | 10 | Append Edge/Face interferences in the DS | *BOPDS_DS::AddInterf()* |
679 | 11 | Update *FaceInfo* for all faces having EF common parts. | *BOPDS_DS:: UpdateFaceInfoIn()* |
682 @subsection occt_algorithms_5_8 Build Split Edges
684 The input data for this step is the DS after computing Edge/Face Interferences.
686 For each pave block *PB* take the following steps:
688 | No | Contents | Implementation |
689 | :--- | :--- | :--- |
690 | 1 | Get the real pave block *PBR*, which is equal to *PB* if *PB* is not a common block and to *PB<sub>1</sub>* if *PB* is a common block. *PB<sub>1</sub>* is the first pave block in the pave blocks list of the common block. See @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock". | *BOPAlgo_PaveFiller::MakeSplitEdges()* |
691 | 2 | Build the split edge *Esp* using the information from *DS* and *PBR*. | *BOPTools_Tools::MakeSplitEdge()* |
692 | 3 | Compute *BOPDS_ShapeInfo* contents for Esp | *BOPAlgo_PaveFiller::MakeSplitEdges()* |
693 | 4 | Append *BOPDS_ShapeInfo* contents to the DS | *BOPDS_DS::Append()* |
695 @subsection occt_algorithms_5_9 Compute Face/Face Interferences
697 The input data for this step is DS after building Split Edges.
699 | No | Contents | Implementation |
700 | :--- | :--- | :--- |
701 | 1 | Initialize array of Face/Face interferences | *BOPAlgo_PaveFiller::PerformFF()* |
702 | 2 | Access to the pairs of interfered shapes <i>(nFi, nFj)k, k=0, 1…nk,</i> where *nFi* is DS index of edge *Fi*, *nFj* is DS index of face *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* |
703 | 3 | Compute Face/Face interference | *IntTools_FaceFace* |
704 | 4 | Append Face/Face interferences in the DS. | *BOPDS_DS::AddInterf()* |
706 @subsection occt_algorithms_5_10 Build Section Edges
708 The input data for this step is the DS after computing Face/Face interferences.
710 | No | Contents | Implementation |
711 | :---- | :---- | :---- |
712 | 1 | For each Face/Face interference *nFi, nFj*, retrieve @ref occt_algorithms_4_6 "FaceInfo". Create draft vertices from intersection points *VPk (k=1, 2…, NbVP)*, where *NbVP* is the number of new vertices, and the draft vertex *VPk* is created from an intersection point if *VPk ≠ Vm (m = 0, 1, 2… NbVm)*, where *Vm* is an existing vertex for the faces *nFi* and *nF,j* (*On* or *In* in terms of *TopoDs_Shape*), *NbVm* is the number of vertices existing on faces *nFi* and *nF,j* and ≠ -- means non-coincidence in terms of @ref occt_algorithms_3_1_1 "Vertex/Vertex interference". | *BOPAlgo_PaveFiller::MakeBlocks()* |
713 | 2 | For each intersection curve *Cijk* | |
714 | 2.1 | Create paves PVc for the curve using existing vertices, i.e. vertices On or In (in terms of *FaceInfo*) for faces *nFi* and *nFj*. Append the paves *PVc* | *BOPAlgo_PaveFiller::PutPaveOnCurve()* and *BOPDS_PaveBlock::AppendExtPave()* |
715 | 2.2 | Create technological vertices *Vt*, which are the bounding points of an intersection curve (with the value of tolerance *Tol(Cijk)*). Each vertex *Vt* with parameter *Tt* on curve *Cijk* forms pave *PVt* on curve *Cijk*. Append technological paves. | *BOPAlgo_PaveFiller::PutBoundPaveOnCurve()* |
716 | 2.3 | Create pave blocks *PBk* for the curve using paves <i>(k=1, 2…, NbPB)</i>, where *NbPB* is the number of pave blocks | *BOPAlgo_PaveFiller::MakeBlocks()* |
717 | 2.4 | Build draft section edges *ESk* using the pave blocks <i>(k=1, 2…, NbES)</i>, where *NbES* is the number of draft section edges The draft section edge is created from a pave block *PBk* if *PBk* has state *In* or *On* for both faces *nFi* and *nF,j* and *PBk ≠ PBm (m=0, 1, 2… NbPBm)*, where *PBm* is an existing pave block for faces *nFi* and *nF,j* (*On* or *In* in terms of *FaceInfo*), *NbVm* is the number of existing pave blocks for faces *nFi* and *nF,j* and ≠ -- means non-coincidence (in terms of @ref occt_algorithms_3_1_3 "Vertex/Face interference"). | *BOPTools_Tools::MakeEdge()* |
718 | 3 | Intersect the draft vertices *VPk (k=1, 2…, NbVP)* and the draft section edges *ESk (k=1, 2…, NbES)*. For this: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use vertices *VPk* and edges *ESk* as arguments (in terms of @ref occt_algorithms_4_1 "Arguments") of *PFn*; c) invoke method *Perform()* for *PFn*. Resulting vertices *VPXk (k=1, 2… NbVPX)* and edges *ESXk (k=1, 2… NbESX)* are obtained via mapping between *VPk, ESk* and the results of *PVn*. | *BOPAlgo_PaveFiller::PostTreatFF()* |
719 | 4 | Update face info (sections about pave blocks and vertices) | *BOPAlgo_PaveFiller::PerformFF()* |
721 @subsection occt_algorithms_5_11 Build P-Curves
722 The input data for this step is the DS after building section edges.
724 | No | Contents | Implementation |
725 | :---- | :---- | :---- |
726 | 1 | For each Face/Face interference *nFi* and *nFj* build p-Curves on *nFi* and *nFj* for each section edge *ESXk*. | *BOPAlgo_PaveFiller::MakePCurves()* |
727 | 2 | For each pave block that is common for faces *nFi* and *nFj* build p-Curves on *nFi* and *nFj*. | *BOPAlgo_PaveFiller::MakePCurves()* |
729 @subsection occt_algorithms_5_12 Process Degenerated Edges
730 The input data for this step is the DS after building P-curves.
732 | No | Contents | Implementation |
733 | :---- | :---- | :---- |
734 | | For each degenerated edge *ED* having vertex *VD* | BOPAlgo_PaveFiller::ProcessDE() |
735 | 1 | Find pave blocks *PBi (i=1,2… NbPB)*, where *NbPB* is the number of pave blocks, that go through vertex *VD*. | *BOPAlgo_PaveFiller::FindPaveBlocks()* |
736 | 2 | Compute paves for the degenerated edge *ED* using a 2D curve of *ED* and a 2D curve of *PBi*. Form pave blocks *PBDi (i=1,2… NbPBD)*, where *NbPBD* is the number of the pave blocks for the degenerated edge *ED* | *BOPAlgo_PaveFiller::FillPaves()* |
737 | 3 | Build split edges *ESDi (i=1,2…NbESD)*, where *ESD* is the number of split edges, using the pave blocks *PBDi* | *BOPAlgo_PaveFiller:: MakeSplitEdge()* |
739 @section occt_algorithms_6 General description of the Building Part
741 Building Part (BP) is used to
742 * Build the result of the operation
743 * Provide history information (in terms of <i>\::Generated(), \::Modified()</i> and <i>\::IsDeleted()</i>)
744 BP uses the DS prepared by *BOPAlgo_PaveFiller* described at chapter 5 as input data.
745 BP is implemented in the following classes:
746 * *BOPAlgo_Builder* -- for the General Fuse operator (GFA).
747 * *BOPAlgo_BOP* -- for the Boolean Operation operator (BOA).
748 * *BOPAlgo_Section* -- for the Section operator (SA).
750 @figure{/user_guides/boolean_operations/images/operations_image020.svg, "Diagram for BP classes"}
752 The class *BOPAlgo_BuilderShape* provides the interface for algorithms that have:
753 * A Shape as the result;
754 * History information (in terms of <i>\::Generated(), \::Modified()</i> and <i>\::IsDeleted()).</i>
756 @section occt_algorithms_7 General Fuse Algorithm
757 @subsection occt_algorithms_7_1 Arguments
758 The arguments of the algorithm are shapes (in terms of *TopoDS_Shape*). The main requirements for the arguments are described in @ref occt_algorithms_4 "Data Structure" chapter.
760 @subsection occt_algorithms_7_2 Results
762 During the operation argument *Si* can be split into several parts *Si1, Si2… Si1NbSp*, where *NbSp* is the number of parts. The set <i>(Si1, Si2… Si1NbSp)</i> is an image of argument *Si*.
763 * The result of the General Fuse operation is a compound. Each sub-shape of the compound corresponds to the certain argument shape S1, S2…Sn and has shared sub-shapes in accordance with interferences between the arguments.
764 * For the arguments of the type EDGE, FACE, SOLID the result contains split parts of the argument.
765 * For the arguments of the type WIRE, SHELL, COMPSOLID, COMPOUND the result contains the image of the shape of the corresponding type (i.e. WIRE, SHELL, COMPSOLID or COMPOUND).
766 The types of resulting shapes depend on the type of the corresponding argument participating in the operation. See the table below:
768 | No | Type of argument | Type of resulting shape | Comments |
769 | :--- | :---- | :--- | :--- |
770 | 1 | COMPOUND | COMPOUND | The resulting COMPOUND is built from images of sub-shapes of type COMPOUND COMPSOLID, SHELL, WIRE and VERTEX. Sets of split sub-shapes of type SOLID, FACE, EDGE. |
771 | 2 | COMPSOLID | COMPSOLID | The resulting COMPSOLID is built from split SOLIDs. |
772 | 3 | SOLID | Set of split SOLIDs | |
773 | 4 | SHELL | SHELL | The resulting SHELL is built from split FACEs |
774 | 5 | FACE | Set of split FACEs | |
775 | 6 | WIRE | WIRE | The resulting WIRE is built from split EDGEs |
776 | 7 | EDGE | Set of split EDGEs | |
777 | 8 | VERTEX | VERTEX | |
779 @subsection occt_algorithms_7_3 Examples
781 Please, have a look at the examples, which can help to better understand the definitions.
783 @subsubsection occt_algorithms_7_3_1 Case 1: Three edges intersecting at a point
785 Let us consider three edges: *E1, E2* and *E3* that intersect in one 3D point.
787 @figure{/user_guides/boolean_operations/images/operations_image021.svg, "Three Intersecting Edges"}
789 The result of the GFA operation is a compound containing 6 new edges: *E11, E12, E21, E22, E31*, and *E32*. These edges have one shared vertex *Vn1*.
792 * The argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*).
793 * The argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*).
794 * The argument edge *E3* has resulting split edges *E31* and *E32* (image of *E3*).
796 @subsubsection occt_algorithms_7_3_2 Case 2: Two wires and an edge
798 Let us consider two wires *W1 (Ew11, Ew12, Ew13)* and *W2 (Ew21, Ew22, Ew23)* and edge *E1*.
800 @figure{/user_guides/boolean_operations/images/operations_image022.svg, "Two wires and an edge"}
802 The result of the GF operation is a compound consisting of 2 wires: *Wn1 (Ew11, En1, En2, En3, Ew13)* and *Wn2 (Ew21, En2, En3, En4, Ew23)* and two edges: *E11* and *E12*.
805 * The argument *W1* has image *Wn1*.
806 * The argument *W2* has image *Wn2*.
807 * The argument edge *E1* has split edges *E11* and *E12*. (image of *E1*).
808 The edges *En1, En2, En3, En4* and vertex *Vn1* are new shapes created during the operation. Edge *Ew12* has split edges *En1, En2* and *En3* and edge *Ew22* has split edges *En2, En3* and *En4*.
810 @subsubsection occt_algorithms_7_3_3 Case 3: An edge intersecting with a face
812 Let us consider edge *E1* and face *F2*:
814 @figure{/user_guides/boolean_operations/images/operations_image023.svg, "An edge intersecting with a face"}
816 The result of the GF operation is a compound consisting of 3 shapes:
817 * Split edge parts *E11* and *E12* (image of *E1*).
818 * New face *F21* with internal edge *E12* (image of *F2*).
820 @subsubsection occt_algorithms_7_3_4 Case 4: An edge lying on a face
822 Let us consider edge *E1* and face *F2*:
824 @figure{/user_guides/boolean_operations/images/operations_image024.svg, "An edge lying on a face"}
826 The result of the GF operation is a compound consisting of 5 shapes:
827 * Split edge parts *E11, E12* and *E13* (image of *E1*).
828 * Split face parts *F21* and *F22* (image of *F2*).
831 @subsubsection occt_algorithms_7_3_5 Case 5: An edge and a shell
833 Let us consider edge *E1* and shell *Sh2* that consists of 2 faces: *F21* and *F22*
835 @figure{/user_guides/boolean_operations/images/operations_image025.svg, "An edge and a shell"}
837 The result of the GF operation is a compound consisting of 5 shapes:
838 * Split edge parts *E11, E12 , E13* and *E14* (image of *E1*).
839 * Image shell *Sh21* (that contains split face parts *F211, F212, F221* and *F222*).
841 @subsubsection occt_algorithms_7_3_6 Case 6: A wire and a shell
843 Let us consider wire *W1 (E1, E2, E3, E4)* and shell *Sh2 (F21, F22)*.
844 @figure{/user_guides/boolean_operations/images/operations_image026.svg, "A wire and a shell"}
846 The result of the GF operation is a compound consisting of 2 shapes:
848 * Image wire *W11* that consists of split edge parts from wire *W1: E11, E12, E13* and *E14*.
849 * Image shell *Sh21* that contains split face parts: *F211, F212, F213, F221, F222* and *F223*.
851 @subsubsection occt_algorithms_7_3_7 Case 7: Three faces
853 Let us consider 3 faces: *F1, F2* and *F3*. @figure{/user_guides/boolean_operations/images/operations_image027.png, "Three faces"}
855 The result of the GF operation is a compound consisting of 7 shapes:
856 * Split face parts: *Fn1, Fn2, Fn3, Fn4, Fn5, Fn6* and *Fn7*.
858 @subsubsection occt_algorithms_7_3_8 Case 8: A face and a shell
860 Let us consider shell *Sh1 (F11, F12, F13)* and face *F2*.
861 @figure{/user_guides/boolean_operations/images/operations_image028.png, "A face and a shell"}
863 The result of the GF operation is a compound consisting of 4 shapes:
864 * Image shell *Sh11* that consists of split face parts from shell *Sh1: Fn1, Fn2, Fn3, Fn4, Fn5* and *Fn6*.
865 * Split parts of face *F2: Fn3, Fn6* and *Fn7*.
867 @subsubsection occt_algorithms_7_3_9 Case 9: A shell and a solid
869 Let us consider shell *Sh1 (F11, F12…F16)* and solid *So2*. @figure{/user_guides/boolean_operations/images/operations_image029.png, "A shell and a solid: arguments"}
871 The result of the GF operation is a compound consisting of 2 shapes:
872 * Image shell *Sh11* consisting of split face parts of *Sh1: Fn1, Fn2 ... Fn8.*
873 * Solid *So21* with internal shell. (image of *So2*).
874 @figure{/user_guides/boolean_operations/images/operations_image030.png, "A shell and a solid: results"}
876 @subsubsection occt_algorithms_7_3_10 Case 10: A compound and a solid
878 Let us consider compound *Cm1* consisting of 2 solids *So11* and *So12*) and solid *So2*.
879 @figure{/user_guides/boolean_operations/images/operations_image031.png, "A compound and a solid: arguments"}
881 The result of the GF operation is a compound consisting of 4 shapes:
882 * Image compound *Cm11* consisting of split solid parts from *So11* and *So12 (Sn1, Sn2, Sn3, Sn4)*.
883 * Split parts of solid *So2 (Sn2, Sn3, Sn5)*.
885 @figure{/user_guides/boolean_operations/images/operations_image032.png, "A compound and a solid: results"}
887 @subsection occt_algorithms_7_4 Class BOPAlgo_Builder
889 GFA is implemented in the class *BOPAlgo_Builder*.
891 @subsubsection occt_algorithms_7_4_1 Fields
893 The main fields of the class are described in the Table:
897 | *myPaveFiller* | Pointer to the *BOPAlgo_PaveFiller* object |
898 | *myDS* | Pointer to the *BOPDS_DS* object |
899 | *myContext* | Pointer to the intersection Context |
900 | *myImages* | The Map between the source shape and its images |
901 | *myShapesSD* | The Map between the source shape (or split part of source shape) and the shape (or part of shape) that will be used in result due to same domain property. |
903 @subsubsection occt_algorithms_7_4_2 Initialization
905 The input data for this step is a *BOPAlgo_PaveFiller* object (in terms of @ref occt_algorithms_5 "Intersection") at the state after @ref occt_algorithms_5_12 "Processing of degenerated edges" with the corresponding DS.
907 | No | Contents | Implementation |
908 | :---- | :---- | :---- |
909 | 1 | Check the readiness of the DS and *BOPAlgo_PaveFiller*. | *BOPAlgo_Builder::CheckData()* |
910 | 2 | Build an empty result of type Compound. | *BOPAlgo_Builder::Prepare()* |
912 @subsubsection occt_algorithms_7_4_3 Build Images for Vertices
914 The input data for this step is *BOPAlgo_Builder* object after Initialisation.
916 | No | Contents | Implementation |
917 | :--- | :--- | :--- |
918 | 1 | Fill *myShapesSD* by SD vertices using the information from the DS. | *BOPAlgo_Builder::FillImagesVertices()* |
920 @subsubsection occt_algorithms_7_4_4 Build Result of Type Vertex
922 The input data for this step is *BOPAlgo_Builder* object after building images for vertices and *Type*, which is the shape type (*TopAbs_VERTEX*).
924 | No | Contents | Implementation |
925 | :--- | :--- | :----- |
926 | 1 | For the arguments of type *Type*. If there is an image for the argument: add the image to the result. If there is no image for the argument: add the argument to the result. | *BOPAlgo_Builder::BuildResult()* |
928 @subsubsection occt_algorithms_7_4_5 Build Images for Edges
930 The input data for this step is *BOPAlgo_Builder object* after building result of type vertex.
932 | No | Contents | Implementation |
933 | :---- | :---- | :----- |
934 | 1 | For all pave blocks in the DS. Fill *myImages* for the original edge *E* by split edges *ESPi* from pave blocks. In case of common blocks on edges, use edge *ESPSDj* that corresponds to the leading pave block and fill *myShapesSD* by the pairs *ESPi/ESPSDj*. | *BOPAlgo_Builder::FillImagesEdges()* |
936 @subsubsection occt_algorithms_7_4_6 Build Result of Type Edge
938 This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type *Edge*.
940 @subsubsection occt_algorithms_7_4_7 Build Images for Wires
942 The input data for this step is:
943 * *BOPAlgo_Builder* object after building result of type *Edge*;
944 * Original Shape -- Wire
945 * *Type* -- the shape type <i>(TopAbs_WIRE).</i>
947 | No | Contents | Implementation |
948 | :---- | :---- | :----- |
949 | 1 | For all arguments of the type *Type*. Create a container C of the type *Type*. | *BOPAlgo_Builder::FillImagesContainers()* |
950 | 2 | Add to C the images or non-split parts of the *Original Shape*, taking into account its orientation. | *BOPAlgo_Builder::FillImagesContainers()* *BOPTools_Tools::IsSplitToReverse()* |
951 | 3 | Fill *myImages* for the *Original Shape* by the information above. | *BOPAlgo_Builder::FillImagesContainers()* |
953 @subsubsection occt_algorithms_7_4_8 Build Result of Type Wire
955 This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex" but for the type *Wire*.
957 @subsubsection occt_algorithms_7_4_9 Build Images for Faces
959 The input data for this step is *BOPAlgo_Builder* object after building result of type *Wire*.
961 | No | Contents | Implementation |
962 | :--- | :--- | :--- |
963 | 1 | Build Split Faces for all interfered DS shapes *Fi* of type *FACE*. | |
964 | 1.1 | Collect all edges or their images of *Fi(ESPij)*. | *BOPAlgo_Builder::BuildSplitFaces()* |
965 | 1.2 | Impart to ESPij the orientation to be coherent with the original one. | *BOPAlgo_Builder::BuildSplitFaces()* |
966 | 1.3 | Collect all section edges *SEk* for *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* |
967 | 1.4 | Build split faces for *Fi (Fi1, Fi2…FiNbSp)*, where *NbSp* is the number of split parts (see @ref occt_algorithms_7_2 "Building faces from a set of edges" for more details). | *BOPAlgo_BuilderFace* |
968 | 1.5 | Impart to <i>(Fi1, Fi2…FiNbSp)</i> the orientation coherent with the original face *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* |
969 | 1.6 | Fill the map mySplits with *Fi/(Fi1, Fi2…FiNbSp)* | *BOPAlgo_Builder::BuildSplitFaces()* |
970 | 2 | Fill Same Domain faces | *BOPAlgo_Builder::FillSameDomainFaces* |
971 | 2.1 | Find and collect in the contents of *mySplits* the pairs of same domain split faces <i>(Fij, Fkl)m</i>, where *m* is the number of pairs. | *BOPAlgo_Builder::FillSameDomainFaces* *BOPTools_Tools::AreFacesSameDomain()* |
972 | 2.2 | Compute the connexity chains 1) of same domain faces <i>(F1C, F2C… FnC)k, C=0, 1…nCs,</i> where *nCs* is the number of connexity chains. | *BOPAlgo_Builder::FillSameDomainFaces()* |
973 | 2.3 | Fill *myShapesSD* using the chains <i>(F1C, F2C… FnC)k</i> | *BOPAlgo_Builder::FillSameDomainFaces()* |
974 | 2.4 | Add internal vertices to split faces. | *BOPAlgo_Builder::FillSameDomainFaces()* |
975 | 2.5 | Fill *myImages* using *myShapesSD* and *mySplits*. | *BOPAlgo_Builder::FillSameDomainFaces()* |
978 The example of chains of same domain faces is given in the image:
980 @figure{/user_guides/boolean_operations/images/operations_image033.svg, "Chains of same domain faces"}
982 * The pairs of same domain faces are: <i>(F11, F21), (F22, F31), (F41, F51) , (F41, F6)</i> and <i>(F51, F6)</i>.
983 * The pairs produce the three chains: <i>(F11, F21), (F22, F31)</i> and <i>(F41, F51, F6)</i>.
985 @subsubsection occt_algorithms_7_4_10 Build Result of Type Face
986 This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex" but for the type *Face*.
988 @subsubsection occt_algorithms_7_4_11 Build Images for Shells
989 The input data for this step is:
990 * *BOPAlgo_Builder* object after building result of type face;
991 * *Original Shape* -- a Shell;
992 * *Type* -- the type of the shape <i>(TopAbs_SHELL)</i>.
994 The procedure is the same as for building images for wires.
996 @subsubsection occt_algorithms_7_4_12 Build Result of Type Shell
997 This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex" but for the type *Shell*.
999 @subsubsection occt_algorithms_7_4_13 Build Images for Solids
1001 The input data for this step is *BOPAlgo_Builder* object after building result of type *Shell*.
1003 The following procedure is executed for all interfered DS shapes *Si* of type *SOLID*.
1005 | No | Contents | Implementation |
1006 | :--- | :--- | :--- |
1007 | 1 | Collect all images or non-split parts for all faces <i>(FSPij)</i> that have 3D state *In Si*. | *BOPAlgo_Builder::FillIn3DParts ()* |
1008 | 2 | Collect all images or non-split parts for all faces of *Si* | *BOPAlgo_Builder::BuildSplitSolids()* |
1009 | 3 | Build split solids for *Si -> (Si1, Si2…SiNbSp)*, where *NbSp* is the number of split parts (see @ref occt_algorithms_7_2 "Building faces from a set of edges" for more details) | *BOPAlgo_BuilderSolid* |
1010 | 4 | Fill the map Same Domain solids *myShapesSD* | *BOPAlgo_Builder::BuildSplitSolids()* |
1011 | 5 | Fill the map *myImages* | *BOPAlgo_Builder::BuildSplitSolids()* |
1012 | 6 | Add internal vertices to split solids | *BOPAlgo_Builder::FillInternalShapes()* |
1014 @subsubsection occt_algorithms_7_4_14 Build Result of Type Solid
1015 This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type Solid.
1017 @subsubsection occt_algorithms_7_4_15 Build Images for Type CompSolid
1019 The input data for this step is:
1020 * *BOPAlgo_Builder* object after building result of type solid;
1021 * *Original Shape* -- a Compsolid;
1022 * *Type* -- the type of the shape <i>(TopAbs_COMPSOLID)</i>.
1024 The procedure is the same as for building images for wires.
1026 @subsubsection occt_algorithms_7_4_16 Build Result of Type Compsolid
1027 This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type Compsolid.
1029 @subsubsection occt_algorithms_7_4_17 Build Images for Compounds
1030 The input data for this step is as follows:
1031 * *BOPAlgo_Builder* object after building results of type *compsolid*;
1032 * *Original Shape* -- a Compound;
1033 * *Type* -- the type of the shape <i>(TopAbs_COMPOUND)</i>.
1035 The procedure is the same as for building images for wires.
1037 @subsubsection occt_algorithms_7_4_18 Build Result of Type Compound
1039 This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type Compound.
1041 @subsubsection occt_algorithms_7_4_19 Post-Processing
1042 The purpose of the step is to correct tolerances of the result to provide its validity in terms of *BRepCheck_Analyzer.*
1044 The input data for this step is a *BOPAlgo_Builder* object after building result of type compound.
1046 | No | Contents | Implementation |
1047 | :---- | :---- | :----- |
1048 | 1 | Correct tolerances of vertices on curves | *BOPTools_Tools::CorrectPointOnCurve()* |
1049 | 2 | Correct tolerances of edges on faces | *BOPTools_Tools::CorrectCurveOnSurface()* |
1052 @section occt_algorithms_8 Splitter Algorithm
1054 The Splitter algorithm allows splitting a group of arbitrary shapes by another group of arbitrary shapes.<br>
1055 It is based on the General Fuse algorithm, thus all options of the General Fuse such as Fuzzy mode, safe processing mode, parallel mode, gluing mode and history support are also available in this algorithm.
1057 @subsection occt_algorithms_8_1 Arguments
1059 * The arguments of the Splitter algorithm are divided into two groups - *Objects* (shapes that will be split) and *Tools* (shapes, by which the *Objects* will be split);
1060 * The requirements for the arguments (both for *Objects* and *Tools*) are the same as for the General Fuse algorithm - there can be any number of arguments of any type in each group, but each argument should be valid and not self-interfered.
1062 @subsection occt_algorithms_8_2 Results
1064 * The result of Splitter algorithm contains only the split parts of the shapes included into the group of *Objects*;
1065 * The split parts of the shapes included only into the group of *Tools* are excluded from the result;
1066 * If there are no shapes in the group of *Tools* the result of the operation will be equivalent to the result of General Fuse operation;
1067 * The shapes can be split by other shapes from the same group (if these shapes are interfering).
1069 @subsection occt_algorithms_8_3 Usage
1071 @subsubsection occt_algorithms_8_3_1 API
1073 On the low level the Splitter algorithm is implemented in class *BOPAlgo_Splitter*. The usage of this algorithm looks as follows:
1075 BOPAlgo_Splitter aSplitter;
1076 BOPCol_ListOfShape aLSObjects = …; // Objects
1077 BOPCol_ListOfShape aLSTools = …; // Tools
1078 Standard_Boolean bRunParallel = Standard_False; /* parallel or single mode (the default value is FALSE)*/
1079 Standard_Real aTol = 0.0; /* fuzzy option (default value is 0)*/
1080 Standard_Boolean bSafeMode = Standard_False; /* protect or not the arguments from modification*/
1081 BOPAlgo_Glue aGlue = BOPAlgo_GlueOff; /* Glue option to speed up intersection of the arguments*/
1082 // setting arguments
1083 aSplitter.SetArguments(aLSObjects);
1084 aSplitter.SetTools(aLSTools);
1086 aSplitter.SetRunParallel(bRunParallel);
1087 aSplitter.SetFuzzyValue(aTol);
1088 aSplitter.SetNonDestructive(bSafeMode);
1089 aSplitter.SetGlue(aGlue);
1091 aSplitter.Perform(); //perform the operation
1092 if (aSplitter.ErrorStatus()) { //check error status
1096 const TopoDS_Shape& aResult = aSplitter.Shape(); // result of the operation
1099 @subsubsection occt_algorithms_8_3_2 DRAW
1101 The command *bsplit* implements the Splitter algorithm in DRAW. Similarly to the *bbuild* command for the General Fuse algorithm, the *bsplit* command should be used after the Pave Filler is filled.
1103 # s1 s2 s3 - objects
1107 baddobjects s1 s2 s3
1113 @subsection occt_algorithms_8_4 Examples
1115 @subsubsection occt_algorithms_8_4_1 Example 1
1117 Splitting a face by the set of edges:
1120 # draw script for reproducing
1125 cylinder cyl 0 0 0 0 0 1 10
1126 mkface f cyl 0 2*pi -$height $height
1134 set ustep [expr $pi2/$nb_uedges]
1135 for {set i 0} {$i <= $pi2} {set i [expr $i + $ustep]} {
1142 set vstep [expr 2*$height/$nb_vedges]
1143 for {set i -20} {$i <= 20} {set i [expr $i + $vstep]} {
1154 <table align="center">
1156 <td>@figure{/user_guides/boolean_operations/images/bsplit_image001.png, "Arguments"}</td>
1157 <td>@figure{/user_guides/boolean_operations/images/bsplit_image002.png, "Result"}</td>
1161 @subsubsection occt_algorithms_8_4_2 Example 2
1163 Splitting a plate by the set of cylinders:
1166 # draw script for reproducing:
1175 for {set i 0} {$i < 101} {incr i 5} {
1176 for {set j 0} {$j < 101} {incr j 5} {
1178 ttranslate p1 $i $j -5;
1188 <table align="center">
1190 <td>@figure{/user_guides/boolean_operations/images/bsplit_image003.png, "Arguments"}</td>
1191 <td>@figure{/user_guides/boolean_operations/images/bsplit_image004.png, "Result"}</td>
1195 @subsubsection occt_algorithms_8_4_3 Example 3
1197 Splitting shell hull by the planes:
1198 <table align="center">
1200 <td>@figure{/user_guides/boolean_operations/images/bsplit_image005.png, "Arguments"}</td>
1201 <td>@figure{/user_guides/boolean_operations/images/bsplit_image006.png, "Results"}</td>
1205 @section occt_algorithms_9 Boolean Operations Algorithm
1207 @subsection occt_algorithms_9_1 Arguments
1209 * The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the @ref occt_algorithms_4 "Data Structure"
1210 * There are two groups of arguments in BOA:
1211 * Objects <i>(S1=S11, S12, ...)</i>;
1212 * Tools <i>(S2=S21, S22, ...)</i>.
1213 * The following table contains the values of dimension for different types of arguments:
1215 | No | Type of Argument | Index of Type | Dimension |
1216 | :---- | :---- | :----- | :---- |
1217 | 1 | COMPOUND | 0 | One of 0, 1, 2, 3 |
1218 | 2 | COMPSOLID | 1 | 3 |
1219 | 3 | SOLID | 2 | 3 |
1220 | 4 | SHELL | 3 | 2 |
1221 | 5 | FACE | 4 | 2 |
1222 | 6 | WIRE | 5 | 1 |
1223 | 7 | EDGE | 6 | 1 |
1224 | 8 | VERTEX | 7 | 0 |
1226 * For Boolean operation Fuse all arguments should have equal dimensions.
1227 * For Boolean operation Cut the minimal dimension of *S2* should not be less than the maximal dimension of *S1*.
1228 * For Boolean operation Common the arguments can have any dimension.
1230 @subsection occt_algorithms_9_3 Results. General Rules
1232 * The result of the Boolean operation is a compound (if defined). Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments.
1233 * The content of the result depends on the type of the operation (Common, Fuse, Cut12, Cut21) and the dimensions of the arguments.
1234 * The result of the operation Fuse is defined for arguments *S1* and *S2* that have the same dimension value : *Dim(S1)=Dim(S2)*. If the arguments have different dimension values the result of the operation Fuse is not defined. The dimension of the result is equal to the dimension of the arguments. For example, it is impossible to fuse an edge and a face.
1235 * The result of the operation Fuse for arguments *S1* and *S2* contains the parts of arguments that have states **OUT** relative to the opposite arguments.
1236 * The result of the operation Fuse for arguments *S1* and *S2* having dimension value 3 (Solids) is refined by removing all possible internal faces to provide minimal number of solids.
1237 * The result of the operation Common for arguments *S1* and *S2* is defined for all values of the dimensions of the arguments. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the arguments. For example, the result of the operation Common between edges cannot be a vertex.
1238 * The result of the operation Common for the arguments *S1* and *S2* contains the parts of the argument that have states **IN** and **ON** relative to the opposite argument.
1239 * The result of the operation Cut is defined for arguments *S1* and *S2* that have values of dimensions *Dim(S2)* that should not be less than *Dim(S1)*. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the objects *Dim(S1)*. The result of the operation *Cut12* is not defined for other cases. For example, it is impossible to cut an edge from a solid, because a solid without an edge is not defined.
1240 * The result of the operation *Cut12* for arguments *S1* and *S2* contains the parts of argument *S1* that have state **OUT** relative to the opposite argument *S2*.
1241 * The result of the operation *Cut21* for arguments *S1* and *S2* contains the parts of argument *S2* that have state **OUT** relative to the opposite argument *S1*.
1242 * For the arguments of collection type (WIRE, SHELL, COMPSOLID) the type will be passed in the result. For example, the result of Common operation between Shell and Wire will be a compound containing Wire.
1243 * For the arguments of collection type (WIRE, SHELL, COMPSOLID) containing overlapping parts the overlapping parts passed into result will be repeated for each container from the input shapes containing such parts. The containers completely included in other containers will be avoided in the result.
1244 * For the arguments of collection type (WIRE, SHELL, COMPSOLID) the containers included into result will have the same orientation as the original containers from arguments. In case of duplication its orientation will be defined by the orientation of the first container in arguments. Each container included into result will have coherent orientation of its sub-shapes.
1245 * The result of the operation Fuse for the arguments of collection type (WIRE, SHELL) will consist of the shapes of the same collection type. The overlapping parts (EDGES/FACES) will be shared among containers, but duplicating containers will be avoided in the result. For example, the result of Fuse operation between two fully coinciding wires will be one wire, but the result of Fuse operation between two partially coinciding wires will be two wires sharing coinciding edges.
1246 * The result of the operation Fuse for the arguments of type COMPSOLID will consist of the compound containing COMPSOLIDs created from connexity blocks of fused solids.
1247 * The result of the operation Common for the arguments of collection type (WIRE, SHELL, COMPSOLID) will consist of the unique containers containing the overlapping parts. For example, the result of Common operation between two fully overlapping wires will be one wire containing all splits of edges. The number of wires in the result of Common operation between two partially overlapping wires will be equal to the number of connexity blocks of overlapping edges.
1249 @subsection occt_algorithms_9_4 Examples
1251 @subsubsection occt_algorithms_9_4_1 Case 1: Two Vertices
1253 Let us consider two interfering vertices *V1* and *V2*:
1255 @figure{/user_guides/boolean_operations/images/boolean_image001.svg}
1257 * The result of *Fuse* operation is the compound that contains new vertex *V*.
1259 @figure{/user_guides/boolean_operations/images/boolean_image002.svg}
1261 * The result of *Common* operation is a compound containing new vertex *V*.
1263 * The result of *Cut12* operation is an empty compound.
1264 * The result of *Cut21* operation is an empty compound.
1266 @subsubsection occt_algorithms_9_4_2 Case 2: A Vertex and an Edge
1268 Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point:
1270 @figure{/user_guides/boolean_operations/images/boolean_image004.png}
1272 * The result of *Fuse* operation is result is not defined because the dimension of the vertex (0) is not equal to the dimension of the edge (1).
1274 * The result of *Common* operation is a compound containing vertex *V<sub>1</sub>* as the argument *V<sub>1</sub>* has a common part with edge *E2*.
1276 @figure{/user_guides/boolean_operations/images/boolean_image005.png}
1278 * The result of *Cut12* operation is an empty compound.
1279 * The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the edge (1).
1281 @subsubsection occt_algorithms_9_4_3 Case 3: A Vertex and a Face
1283 Let us consider vertex *V1* and face *F2*, that intersect in a 3D point:
1285 @figure{/user_guides/boolean_operations/images/boolean_image006.png}
1287 * The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the face (2).
1289 * The result of *Common* operation is a compound containing vertex *V<sub>1</sub>* as the argument *V<sub>1</sub>* has a common part with face *F2*.
1291 @figure{/user_guides/boolean_operations/images/boolean_image007.png}
1293 * The result of *Cut12* operation is an empty compound.
1294 * The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the face (2).
1296 @subsubsection occt_algorithms_9_4_4 Case 4: A Vertex and a Solid
1298 Let us consider vertex *V1* and solid *S2*, that intersect in a 3D point:
1300 @figure{/user_guides/boolean_operations/images/boolean_image008.png}
1302 * The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the solid (3).
1304 * The result of *Common* operation is a compound containing vertex *V<sub>1</sub>* as the argument *V<sub>1</sub>* has a common part with solid *S2*.
1306 @figure{/user_guides/boolean_operations/images/boolean_image009.png}
1308 * The result of *Cut12* operation is an empty compound.
1309 * The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the solid (3).
1311 @subsubsection occt_algorithms_9_4_5 Case 5: Two edges intersecting at one point
1313 Let us consider edges *E1* and *E2* that intersect in a 3D point:
1315 @figure{/user_guides/boolean_operations/images/boolean_image010.svg}
1317 * The result of *Fuse* operation is a compound containing split parts of arguments i.e. 4 new edges *E11, E12, E21*, and *E22*. These edges have one shared vertex *Vn1*.
1319 * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*);
1320 * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*).
1322 @figure{/user_guides/boolean_operations/images/boolean_image011.svg}
1324 * The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edges (vertex) is less than the dimension of the arguments (1).
1326 * The result of *Cut12* operation is a compound containing split parts of the argument *E1*, i.e. 2 new edges *E11* and *E12*. These edges have one shared vertex *Vn1*.
1328 In this case the argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*).
1330 @figure{/user_guides/boolean_operations/images/boolean_image012.svg}
1332 * The result of *Cut21* operation is a compound containing split parts of the argument *E2*, i.e. 2 new edges *E21* and *E12*. These edges have one shared vertex *Vn1*.
1334 In this case the argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*).
1336 @figure{/user_guides/boolean_operations/images/boolean_image013.svg}
1338 @subsubsection occt_algorithms_9_4_6 Case 6: Two edges having a common block
1340 Let us consider edges *E1* and *E2* that have a common block:
1342 @figure{/user_guides/boolean_operations/images/boolean_image014.svg}
1344 * The result of *Fuse* operation is a compound containing split parts of arguments i.e. 3 new edges *E11*, *E12* and *E22*. These edges have two shared vertices.
1346 * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*);
1347 * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*);
1348 * edge *E12* is common for the images of *E1* and *E2*.
1350 @figure{/user_guides/boolean_operations/images/boolean_image015.svg}
1352 * The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new edge *E12*. In this case edge *E12* is common for the images of *E1* and *E2*.
1353 The common part between the edges (edge) has the same dimension (1) as the dimension of the arguments (1).
1355 @figure{/user_guides/boolean_operations/images/boolean_image016.svg}
1357 * The result of *Cut12* operation is a compound containing a split part of argument *E1*, i.e. new edge *E11*.
1359 @figure{/user_guides/boolean_operations/images/boolean_image017.svg}
1361 * The result of *Cut21* operation is a compound containing a split part of argument *E2*, i.e. new edge *E22*.
1363 @figure{/user_guides/boolean_operations/images/boolean_image018.svg}
1366 @subsubsection occt_algorithms_9_4_7 Case 7: An Edge and a Face intersecting at a point
1368 Let us consider edge *E1* and face *F2* that intersect at a 3D point:
1370 @figure{/user_guides/boolean_operations/images/boolean_image019.png}
1372 * The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2).
1374 * The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edge and face (vertex) is less than the dimension of the arguments (1).
1376 * The result of *Cut12* operation is a compound containing split parts of the argument *E1*, i.e. 2 new edges *E11* and *E12*.
1378 In this case the argument edge *E1* has no common parts with the face *F2* so the whole image of *E1* is in the result.
1380 @figure{/user_guides/boolean_operations/images/boolean_image020.png}
1382 * The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2).
1384 @subsubsection occt_algorithms_9_4_8 Case 8: A Face and an Edge that have a common block
1386 Let us consider edge *E1* and face *F2* that have a common block:
1388 @figure{/user_guides/boolean_operations/images/boolean_image021.png}
1390 * The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2).
1392 * The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*.
1394 In this case the argument edge *E1* has a common part with face *F2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *F2*.
1396 @figure{/user_guides/boolean_operations/images/boolean_image022.png}
1398 * The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*.
1400 In this case the argument edge *E1* has a common part with face *F2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of F2.
1402 @figure{/user_guides/boolean_operations/images/boolean_image023.png}
1404 * The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2).
1406 @subsubsection occt_algorithms_9_4_9 Case 9: An Edge and a Solid intersecting at a point
1408 Let us consider edge *E1* and solid *S2* that intersect at a point:
1410 @figure{/user_guides/boolean_operations/images/boolean_image024.png}
1412 * The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3).
1414 * The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*.
1416 In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*.
1418 @figure{/user_guides/boolean_operations/images/boolean_image025.png}
1420 * The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*.
1422 In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*.
1424 @figure{/user_guides/boolean_operations/images/boolean_image071.png}
1426 * The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3).
1428 @subsubsection occt_algorithms_9_4_10 Case 10: An Edge and a Solid that have a common block
1430 Let us consider edge *E1* and solid *S2* that have a common block:
1432 @figure{/user_guides/boolean_operations/images/boolean_image072.png}
1434 * The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3).
1436 * The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*.
1438 In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*.
1440 @figure{/user_guides/boolean_operations/images/boolean_image073.png}
1442 * The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*.
1444 In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*.
1446 @figure{/user_guides/boolean_operations/images/boolean_image026.png}
1448 * The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3).
1450 @subsubsection occt_algorithms_9_4_11 Case 11: Two intersecting faces
1452 Let us consider two intersecting faces *F1* and *F2*:
1454 @figure{/user_guides/boolean_operations/images/boolean_image027.png}
1456 * The result of *Fuse* operation is a compound containing split parts of arguments i.e. 2 new faces *F11* and *F21*. These faces have one shared edge *En1*.
1458 @figure{/user_guides/boolean_operations/images/boolean_image028.png}
1461 * The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge) is less than the dimension of arguments (2).
1463 * The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*.
1465 @figure{/user_guides/boolean_operations/images/boolean_image029.png}
1467 * The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*.
1469 @figure{/user_guides/boolean_operations/images/boolean_image030.png}
1471 @subsubsection occt_algorithms_9_4_12 Case 12: Two faces that have a common part
1473 Let us consider two faces *F1* and *F2* that have a common part:
1475 @figure{/user_guides/boolean_operations/images/boolean_image031.png}
1477 * The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 3 new faces: *F11*, *F12* and *F22*. These faces are shared through edges In this case:
1478 * the argument edge *F1* has resulting split faces *F11* and *F12* (image of *F1*)
1479 * the argument face *F2* has resulting split faces *F12* and *F22* (image of *F2*)
1480 * the face *F12* is common for the images of *F1* and *F2*.
1482 @figure{/user_guides/boolean_operations/images/boolean_image032.png}
1484 * The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new face *F12*.
1485 In this case: face *F12* is common for the images of *F1* and *F2*.
1486 The common part between the faces (face) has the same dimension (2) as the dimension of the arguments (2).
1489 @figure{/user_guides/boolean_operations/images/boolean_image033.png}
1491 * The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*.
1493 @figure{/user_guides/boolean_operations/images/boolean_image034.png}
1495 * The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*.
1497 @figure{/user_guides/boolean_operations/images/boolean_image035.png}
1499 @subsubsection occt_algorithms_9_4_13 Case 13: Two faces that have a common edge
1501 Let us consider two faces *F1* and *F2* that have a common edge:
1503 @figure{/user_guides/boolean_operations/images/boolean_image036.png}
1505 * The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared edge *En1*.
1507 @figure{/user_guides/boolean_operations/images/boolean_image037.png}
1509 * The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge)is less than the dimension of the arguments (2)
1511 * The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. The vertices are shown just to clarify the fact that the edges are spitted.
1513 @figure{/user_guides/boolean_operations/images/boolean_image038.png}
1515 * The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. The vertices are shown just to clarify the fact that the edges are spitted.
1517 @figure{/user_guides/boolean_operations/images/boolean_image039.png}
1519 @subsubsection occt_algorithms_9_4_14 Case 14: Two faces that have a common vertex
1521 Let us consider two faces *F1* and *F2* that have a common vertex:
1523 @figure{/user_guides/boolean_operations/images/boolean_image040.png}
1525 * The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared vertex *Vn1*.
1527 @figure{/user_guides/boolean_operations/images/boolean_image041.png}
1529 * The result of *Common* operation is an empty compound because the dimension (0) of the common part between *F1* and *F2* (vertex) is less than the dimension of the arguments (2)
1531 * The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*.
1533 @figure{/user_guides/boolean_operations/images/boolean_image042.png}
1535 * The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*.
1537 @figure{/user_guides/boolean_operations/images/boolean_image043.png}
1540 @subsubsection occt_algorithms_9_4_15 Case 15: A Face and a Solid that have an intersection curve.
1542 Let us consider face *F1* and solid *S2* that have an intersection curve:
1544 @figure{/user_guides/boolean_operations/images/boolean_image044.png}
1546 * The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
1548 * The result of *Common* operation is a compound containing split part of the argument *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is in the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
1550 @figure{/user_guides/boolean_operations/images/boolean_image045.png}
1552 * The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
1554 @figure{/user_guides/boolean_operations/images/boolean_image046.png}
1556 * The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
1558 @subsubsection occt_algorithms_9_4_16 Case 16: A Face and a Solid that have overlapping faces.
1560 Let us consider face *F1* and solid *S2* that have overlapping faces:
1562 @figure{/user_guides/boolean_operations/images/boolean_image047.png}
1564 * The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
1566 * The result of *Common* operation is a compound containing split part of the argument *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is included in the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
1568 @figure{/user_guides/boolean_operations/images/boolean_image048.png}
1570 * The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
1572 @figure{/user_guides/boolean_operations/images/boolean_image049.png}
1574 * The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
1577 @subsubsection occt_algorithms_9_4_17 Case 17: A Face and a Solid that have overlapping edges.
1579 Let us consider face *F1* and solid *S2* that have overlapping edges:
1581 @figure{/user_guides/boolean_operations/images/boolean_image050.png}
1583 * The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
1585 * The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (edge) is less than the lower dimension of the arguments (2).
1587 * The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
1589 @figure{/user_guides/boolean_operations/images/boolean_image051.png}
1591 * The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
1593 @subsubsection occt_algorithms_9_4_18 Case 18: A Face and a Solid that have overlapping vertices.
1595 Let us consider face *F1* and solid *S2* that have overlapping vertices:
1597 @figure{/user_guides/boolean_operations/images/boolean_image052.png}
1599 * The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
1601 * The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (vertex) is less than the lower dimension of the arguments (2).
1603 * The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
1605 @figure{/user_guides/boolean_operations/images/boolean_image053.png}
1607 * The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
1609 @subsubsection occt_algorithms_9_4_19 Case 19: Two intersecting Solids.
1611 Let us consider two intersecting solids *S1* and *S2*:
1613 @figure{/user_guides/boolean_operations/images/boolean_image054.png}
1615 * The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* <i>(Cut12, Common, Cut21)</i>. All inner webs are removed, so the result is one new solid *R*.
1617 @figure{/user_guides/boolean_operations/images/boolean_image055.png}
1619 * The result of *Common* operation is a compound containing split parts of arguments i.e. one new solid *S12*. In this case solid *S12* is common for the images of *S1* and *S2*. The common part between the solids (solid) has the same dimension (3) as the dimension of the arguments (3). The yellow contour is not a part of the result. It only shows the place of *S1*.
1621 @figure{/user_guides/boolean_operations/images/boolean_image056.png}
1623 * The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*.
1625 @figure{/user_guides/boolean_operations/images/boolean_image057.png}
1627 * The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*.
1629 @figure{/user_guides/boolean_operations/images/boolean_image058.png}
1631 @subsubsection occt_algorithms_9_4_20 Case 20: Two Solids that have overlapping faces.
1633 Let us consider two solids *S1* and *S2* that have a common part on face:
1635 @figure{/user_guides/boolean_operations/images/boolean_image059.png}
1637 * The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* <i>(Cut12, Common, Cut21)</i>. All inner webs are removed, so the result is one new solid *R*.
1639 @figure{/user_guides/boolean_operations/images/boolean_image060.png}
1641 * The result of *Common* operation is an empty compound because the dimension (2) of the common part between *S1* and *S2* (face) is less than the lower dimension of the arguments (3).
1643 * The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*.
1645 @figure{/user_guides/boolean_operations/images/boolean_image061.png}
1647 * The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*.
1648 @figure{/user_guides/boolean_operations/images/boolean_image062.png}
1651 @subsubsection occt_algorithms_9_4_21 Case 21: Two Solids that have overlapping edges.
1653 Let us consider two solids *S1* and *S2* that have overlapping edges:
1655 @figure{/user_guides/boolean_operations/images/boolean_image063.png}
1657 * The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids have one shared edge *En1*.
1659 @figure{/user_guides/boolean_operations/images/boolean_image064.png}
1661 * The result of *Common* operation is an empty compound because the dimension (1) of the common part between *S1* and *S2* (edge) is less than the lower dimension of the arguments (3).
1663 * The result of *Cut12* operation is a compound containing split part of the argument *S1*. In this case
1664 argument *S1* has a common part with solid *S2* so the corresponding part is not included into the result.
1666 @figure{/user_guides/boolean_operations/images/boolean_image065.png}
1668 * The result of *Cut21* operation is a compound containing split part of the argument *S2*. In this case
1669 argument *S2* has a common part with solid *S1* so the corresponding part is not included into the result.
1670 @figure{/user_guides/boolean_operations/images/boolean_image066.png}
1672 @subsubsection occt_algorithms_9_4_22 Case 22: Two Solids that have overlapping vertices.
1674 Let us consider two solids *S1* and *S2* that have overlapping vertices:
1676 @figure{/user_guides/boolean_operations/images/boolean_image067.png}
1678 * The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids share *Vn1*.
1680 @figure{/user_guides/boolean_operations/images/boolean_image068.png}
1682 * The result of *Common* operation is an empty compound because the dimension (0) of the common part between *S1* and *S2* (vertex) is less than the lower dimension of the arguments (3).
1684 * The result of *Cut12* operation is a compound containing split part of the argument *S1*.
1686 @figure{/user_guides/boolean_operations/images/boolean_image069.png}
1688 * The result of *Cut21* operation is a compound containing split part of the argument *S2*.
1690 @figure{/user_guides/boolean_operations/images/boolean_image070.png}
1692 @subsubsection occt_algorithms_9_4_23 Case 23: A Shell and a Wire cut by a Solid.
1694 Let us consider Shell *Sh* and Wire *W* as the objects and Solid *S* as the tool:
1696 @figure{/user_guides/boolean_operations/images/boolean_image136.png}
1698 * The result of *Fuse* operation is not defined as the dimension of the arguments is not the same.
1700 * The result of *Common* operation is a compound containing the parts of the initial Shell and Wire common for the Solid. The new Shell and Wire are created from the objects.
1702 @figure{/user_guides/boolean_operations/images/boolean_image137.png}
1704 * The result of *Cut12* operation is a compound containing new Shell and Wire split from the arguments *Sh* and *W*. In this case they have a common part with solid *S* so the corresponding part is not included into the result.
1706 @figure{/user_guides/boolean_operations/images/boolean_image138.png}
1708 * The result of *Cut21* operation is not defined as the objects have a lower dimension than the tool.
1710 @subsubsection occt_algorithms_9_4_24 Case 24: Two Wires that have overlapping edges.
1712 Let us consider two Wires that have overlapping edges, *W1* is the object and *W2* is the tool:
1714 @figure{/user_guides/boolean_operations/images/boolean_image139.png}
1716 * The result of *Fuse* operation is a compound containing two Wires, which share an overlapping edge. The new Wires are created from the objects:
1718 @figure{/user_guides/boolean_operations/images/boolean_image140.png}
1720 * The result of *Common* operation is a compound containing one Wire consisting of an overlapping edge. The new Wire is created from the objects:
1722 @figure{/user_guides/boolean_operations/images/boolean_image141.png}
1724 * The result of *Cut12* operation is a compound containing a wire split from object *W1*. Its common part with *W2* is not included into the result.
1726 @figure{/user_guides/boolean_operations/images/boolean_image142.png}
1728 * The result of *Cut21* operation is a compound containing a wire split from *W2*. Its common part with *W1* is not included into the result.
1730 @figure{/user_guides/boolean_operations/images/boolean_image143.png}
1733 @subsection occt_algorithms_9_5 Class BOPAlgo_BOP
1735 BOA is implemented in the class *BOPAlgo_BOP*. The main fields of this class are described in the Table:
1739 | *myOperation* | The type of the Boolean operation (Common, Fuse, Cut) |
1740 | *myTools* | The tools |
1741 | *myDims[2]* | The values of the dimensions of the arguments |
1742 | *myRC* | The draft result (shape) |
1744 The main steps of the *BOPAlgo_BOP* are the same as of @ref occt_algorithms_7_4 "BOPAlgo_Builder" except for some aspects described in the next paragraphs.
1746 @subsection occt_algorithms_9_6 Building Draft Result
1748 The input data for this step is as follows:
1749 * *BOPAlgo_BOP* object after building result of type *Compound*;
1750 * *Type* of the Boolean operation.
1752 | No | Contents | Implementation |
1753 | :---- | :----- | :----- |
1754 | 1 | For the Boolean operation *Fuse* add to *myRC* all images of arguments. | *BOPAlgo_BOP::BuildRC()* |
1755 | 2 | For the Boolean operation *Common* or *Cut* add to *myRC* all images of argument *S1* that are *Common* for the Common operation and are *Not Common* for the Cut operation | *BOPAlgo_BOP::BuildRC()* |
1757 @subsection occt_algorithms_9_7 Building the Result
1759 The input data for this step is as follows:
1760 * *BOPAlgo_BOP* object the state after building draft result.
1762 | No | Contents | Implementation |
1763 | :---- | :---- | :------ |
1764 | 1 | For the Type of the Boolean operation Common, Cut with any dimension and operation Fuse with *myDim[0] < 3* | |
1765 | 1.1 | Find containers (WIRE, SHELL, COMPSOLID) in the arguments | *BOPAlgo_BOP:: BuildShape()* |
1766 | 1.2 | Make connexity blocks from splits of each container that are in *myRC* | *BOPTools_Tools::MakeConnexityBlocks()* |
1767 | 1.3 | Build the result from shapes made from the connexity blocks | *BOPAlgo_BOP:: BuildShape()* |
1768 | 1.4 | Add the remaining shapes from *myRC* to the result | *BOPAlgo_BOP:: BuildShape()* |
1769 | 2 | For the Type of the Boolean operation Fuse with *myDim[0] = 3* | |
1770 | 2.1 | Find internal faces <i>(FWi)</i> in *myRC* | *BOPAlgo_BOP::BuildSolid()* |
1771 | 2.2 | Collect all faces of *myRC* except for internal faces <i>(FWi) -> SFS</i> | *BOPAlgo_BOP::BuildSolid ()* |
1772 | 2.3 | Build solids <i>(SDi)</i> from *SFS*. | *BOPAlgo_BuilderSolid* |
1773 | 2.4 | Add the solids <i>(SDi)</i> to the result | |
1775 @section occt_algorithms_10a Section Algorithm
1777 @subsection occt_algorithms_10a_1 Arguments
1779 The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the Algorithms.
1781 @subsection occt_algorithms_10a_2 Results and general rules
1782 * The result of Section operation is a compound. Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments.
1783 * The result of Section operation contains shapes that have dimension that is less then 2 i.e. vertices and edges.
1784 * The result of Section operation contains standalone vertices if these vertices do not belong to the edges of the result.
1785 * The result of Section operation contains vertices and edges of the arguments (or images of the arguments) that belong to at least two arguments (or two images of the arguments).
1786 * The result of Section operation contains Section vertices and edges obtained from Face/Face interferences.
1787 * The result of Section operation contains vertices that are the result of interferences between vertices and faces.
1788 * The result of Section operation contains edges that are the result of interferences between edges and faces (Common Blocks),
1790 @subsection occt_algorithms_10a_3 Examples
1792 @subsubsection occt_algorithms_10a_3_1 Case 1: Two Vertices
1794 Let us consider two interfering vertices: *V1* and *V2*.
1796 @figure{/user_guides/boolean_operations/images/boolean_image080.png}
1798 The result of *Section* operation is the compound that contains a new vertex *V*.
1800 @figure{/user_guides/boolean_operations/images/boolean_image081.png}
1802 @subsubsection occt_algorithms_10a_3_2 Case 1: Case 2: A Vertex and an Edge
1804 Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point:
1806 @figure{/user_guides/boolean_operations/images/boolean_image082.png}
1808 The result of *Section* operation is the compound that contains vertex *V1*.
1810 @figure{/user_guides/boolean_operations/images/boolean_image083.png}
1812 @subsubsection occt_algorithms_10a_3_3 Case 1: Case 2: A Vertex and a Face
1814 Let us consider vertex *V1* and face *F2*, that intersect in a 3D point:
1816 @figure{/user_guides/boolean_operations/images/boolean_image084.png}
1818 The result of *Section* operation is the compound that contains vertex *V1*.
1820 @figure{/user_guides/boolean_operations/images/boolean_image085.png}
1822 @subsubsection occt_algorithms_10a_3_4 Case 4: A Vertex and a Solid
1824 Let us consider vertex *V1* and solid *Z2*. The vertex *V1* is inside the solid *Z2*.
1826 @figure{/user_guides/boolean_operations/images/boolean_image086.png}
1828 The result of *Section* operation is an empty compound.
1830 @subsubsection occt_algorithms_10a_3_5 Case 5: Two edges intersecting at one point
1832 Let us consider edges *E1* and *E2*, that intersect in a 3D point:
1834 @figure{/user_guides/boolean_operations/images/boolean_image087.png}
1836 The result of *Section* operation is the compound that contains a new vertex *Vnew*.
1838 @figure{/user_guides/boolean_operations/images/boolean_image088.png}
1840 @subsubsection occt_algorithms_10a_3_6 Case 6: Two edges having a common block
1842 Let us consider edges *E1* and *E2*, that have a common block:
1844 @figure{/user_guides/boolean_operations/images/boolean_image089.png}
1846 The result of *Section* operation is the compound that contains a new edge *Enew*.
1848 @figure{/user_guides/boolean_operations/images/boolean_image090.png}
1850 @subsubsection occt_algorithms_10a_3_7 Case 7: An Edge and a Face intersecting at a point
1852 Let us consider edge *E1* and face *F2*, that intersect at a 3D point:
1854 @figure{/user_guides/boolean_operations/images/boolean_image091.png}
1856 The result of *Section* operation is the compound that contains a new vertex *Vnew*.
1858 @figure{/user_guides/boolean_operations/images/boolean_image092.png}
1860 @subsubsection occt_algorithms_10a_3_8 Case 8: A Face and an Edge that have a common block
1862 Let us consider edge *E1* and face *F2*, that have a common block:
1864 @figure{/user_guides/boolean_operations/images/boolean_image093.png}
1866 The result of *Section* operation is the compound that contains new edge *Enew*.
1868 @figure{/user_guides/boolean_operations/images/boolean_image094.png}
1871 @subsubsection occt_algorithms_10a_3_9 Case 9: An Edge and a Solid intersecting at a point
1873 Let us consider edge *E1* and solid *Z2*, that intersect at a point:
1875 @figure{/user_guides/boolean_operations/images/boolean_image095.png}
1877 The result of *Section* operation is the compound that contains a new vertex *Vnew*.
1879 @figure{/user_guides/boolean_operations/images/boolean_image096.png}
1881 @subsubsection occt_algorithms_10a_3_10 Case 10: An Edge and a Solid that have a common block
1883 Let us consider edge *E1* and solid *Z2*, that have a common block at a face:
1885 @figure{/user_guides/boolean_operations/images/boolean_image097.png}
1887 The result of *Section* operation is the compound that contains a new edge *Enew*.
1889 @figure{/user_guides/boolean_operations/images/boolean_image098.png}
1891 @subsubsection occt_algorithms_10a_3_11 Case 11: Two intersecting faces
1893 Let us consider two intersecting faces *F1* and *F2*:
1895 @figure{/user_guides/boolean_operations/images/boolean_image099.png}
1897 The result of *Section* operation is the compound that contains a new edge *Enew*.
1899 @figure{/user_guides/boolean_operations/images/boolean_image100.png}
1901 @subsubsection occt_algorithms_10a_3_12 Case 12: Two faces that have a common part
1903 Let us consider two faces *F1* and *F2* that have a common part:
1905 @figure{/user_guides/boolean_operations/images/boolean_image133.png}
1907 The result of *Section* operation is the compound that contains 4 new edges.
1909 @figure{/user_guides/boolean_operations/images/boolean_image134.png}
1911 @subsubsection occt_algorithms_10a_3_13 Case 13: Two faces that have overlapping edges
1913 Let us consider two faces *F1* and *F2* that have a overlapping edges:
1915 @figure{/user_guides/boolean_operations/images/boolean_image101.png}
1917 The result of *Section* operation is the compound that contains a new edge *Enew*.
1919 @figure{/user_guides/boolean_operations/images/boolean_image102.png}
1921 @subsubsection occt_algorithms_10a_3_14 Case 14: Two faces that have overlapping vertices
1923 Let us consider two faces *F1* and *F2* that have overlapping vertices:
1925 @figure{/user_guides/boolean_operations/images/boolean_image103.png}
1927 The result of *Section* operation is the compound that contains a new vertex *Vnew*.
1929 @figure{/user_guides/boolean_operations/images/boolean_image104.png}
1931 @subsubsection occt_algorithms_10a_3_15 Case 15: A Face and a Solid that have an intersection curve
1933 Let us consider face *F1* and solid *Z2* that have an intersection curve:
1935 @figure{/user_guides/boolean_operations/images/boolean_image105.png}
1937 The result of *Section* operation is the compound that contains new edges.
1939 @figure{/user_guides/boolean_operations/images/boolean_image106.png}
1941 @subsubsection occt_algorithms_10a_3_16 Case 16: A Face and a Solid that have overlapping faces.
1943 Let us consider face *F1* and solid *Z2* that have overlapping faces:
1945 @figure{/user_guides/boolean_operations/images/boolean_image107.png}
1947 The result of *Section* operation is the compound that contains new edges
1949 @figure{/user_guides/boolean_operations/images/boolean_image108.png}
1951 @subsubsection occt_algorithms_10a_3_17 Case 17: A Face and a Solid that have overlapping edges.
1953 Let us consider face *F1* and solid *Z2* that have a common part on edge:
1955 @figure{/user_guides/boolean_operations/images/boolean_image109.png}
1957 The result of *Section* operation is the compound that contains a new edge *Enew*.
1959 @figure{/user_guides/boolean_operations/images/boolean_image110.png}
1961 @subsubsection occt_algorithms_10a_3_18 Case 18: A Face and a Solid that have overlapping vertices.
1963 Let us consider face *F1* and solid *Z2* that have overlapping vertices:
1965 @figure{/user_guides/boolean_operations/images/boolean_image111.png}
1967 The result of *Section* operation is the compound that contains a new vertex *Vnew*.
1969 @figure{/user_guides/boolean_operations/images/boolean_image112.png}
1971 @subsubsection occt_algorithms_10a_3_19 Case 19: Two intersecting Solids
1973 Let us consider two intersecting solids *Z1* and *Z2*:
1974 @figure{/user_guides/boolean_operations/images/boolean_image113.png}
1976 The result of *Section* operation is the compound that contains new edges.
1977 @figure{/user_guides/boolean_operations/images/boolean_image114.png}
1979 @subsubsection occt_algorithms_10a_3_20 Case 20: Two Solids that have overlapping faces
1981 Let us consider two solids *Z1* and *Z2* that have a common part on face:
1982 @figure{/user_guides/boolean_operations/images/boolean_image115.png}
1984 The result of *Section* operation is the compound that contains new edges.
1985 @figure{/user_guides/boolean_operations/images/boolean_image116.png}
1987 @subsubsection occt_algorithms_10a_3_21 Case 21: Two Solids that have overlapping edges
1989 Let us consider two solids *Z1* and *Z2* that have overlapping edges:
1990 @figure{/user_guides/boolean_operations/images/boolean_image117.png}
1992 The result of *Section* operation is the compound that contains a new edge *Enew*.
1993 @figure{/user_guides/boolean_operations/images/boolean_image118.png}
1995 @subsubsection occt_algorithms_10a_3_22 Case 22: Two Solids that have overlapping vertices
1997 Let us consider two solids *Z1* and *Z2* that have overlapping vertices:
1998 @figure{/user_guides/boolean_operations/images/boolean_image119.png}
2000 The result of *Section* operation is the compound that contains a new vertex *Vnew*.
2001 @figure{/user_guides/boolean_operations/images/boolean_image120.png}
2003 @subsection occt_algorithms_10a_4 Class BOPAlgo_Section
2005 SA is implemented in the class *BOPAlgo_Section*. The class has no specific fields.
2006 The main steps of the *BOPAlgo_Section* are the same as of *BOPAlgo_Builder* except for the following steps:
2008 * Build Images for Wires;
2009 * Build Result of Type Wire;
2010 * Build Images for Faces;
2011 * Build Result of Type Face;
2012 * Build Images for Shells;
2013 * Build Result of Type Shell;
2014 * Build Images for Solids;
2015 * Build Result of Type Solid;
2016 * Build Images for Type CompSolid;
2017 * Build Result of Type CompSolid;
2018 * Build Images for Compounds;
2019 Some aspects of building the result are described in the next paragraph
2021 @subsection occt_algorithms_10a_5 Building the Result
2023 | No | Contents | Implementation |
2024 | :---- | :---- | :------ |
2025 | 1 | Build the result of the operation using all information contained in *FaceInfo*, Common Block, Shared entities of the arguments, etc. | *BOPAlgo_Section:: BuildSection()* |
2027 @section occt_algorithms_10b Volume Maker Algorithm
2029 The Volume Maker algorithm has been designed for building the elementary volumes (solids) from a set of connected, intersecting, or nested shapes. The algorithm can also be useful for splitting solids into parts, or constructing new solid(s) from set of intersecting or connected faces or shells.
2030 The algorithm creates only closed solids. In general case the result solids are non-manifold: fragments of the input shapes (wires, faces) located inside the solids are added as internal sub-shapes to these solids.
2031 But the algorithm allows preventing the addition of the internal for solids parts into result. In this case the result solids will be manifold and not contain any internal parts. However, this option does not prevent from the occurrence of the internal edges or vertices in the faces.<br>
2032 Non-closed faces, free wires etc. located outside of any solid are always excluded from the result.
2034 The Volume Maker algorithm is implemented in the class BOPAlgo_MakerVolume. It is based on the General Fuse (GF) algorithm. All the options of the GF algorithm such as possibility to run algorithm in parallel mode, fuzzy option, safe mode, glue options and history support are also available in this algorithm.
2036 The requirements for the arguments are the same as for the arguments of GF algorithm - they could be of any type, but each argument should be valid and not self-interfered.
2038 The algorithm allows disabling the calculation of intersections among the arguments. In this case the algorithm will run much faster, but the user should guarantee that the arguments do not interfere with each other, otherwise the result will be invalid (e.g. contain unexpected parts) or empty.
2039 This option is useful e.g. for building a solid from the faces of one shell or from the shapes that have already been intersected.
2041 @subsection occt_algorithms_10b_1 Usage
2044 The usage of the algorithm on the API level:
2046 BOPAlgo_MakerVolume aMV;
2047 BOPCol_ListOfShape aLS = …; // arguments
2048 Standard_Boolean bRunParallel = Standard_False; /* parallel or single mode (the default value is FALSE)*/
2049 Standard_Boolean bIntersect = Standard_True; /* intersect or not the arguments (the default value is TRUE)*/
2050 Standard_Real aTol = 0.0; /* fuzzy option (default value is 0)*/
2051 Standard_Boolean bSafeMode = Standard_False; /* protect or not the arguments from modification*/
2052 BOPAlgo_Glue aGlue = BOPAlgo_GlueOff; /* Glue option to speed up intersection of the arguments*/
2053 Standard_Boolean bAvoidInternalShapes = Standard_False; /* Avoid or not the internal for solids shapes in the result*/
2055 aMV.SetArguments(aLS);
2056 aMV.SetRunParallel(bRunParallel);
2057 aMV.SetIntersect(bIntersect);
2058 aMV.SetFuzzyValue(aTol);
2059 aMV.SetNonDestructive(bSafeMode);
2061 aMV.SetAvoidInternalShapes(bAvoidInternalShapes);
2063 aMV.Perform(); //perform the operation
2064 if (aMV.ErrorStatus()) { //check error status
2068 const TopoDS_Shape& aResult = aMV.Shape(); // result of the operation
2072 To use the algorithm in Draw the command mkvolume has been implemented. The usage of this command is following:
2074 Usage: mkvolume r b1 b2 ... [-c] [-ni] [-ai]
2076 -c - use this option to have input compounds considered as set of separate arguments (allows passing multiple arguments as one compound);
2077 -ni - use this option to disable the intersection of the arguments;
2078 -ai - use this option to avoid internal for solids shapes in the result.
2081 @subsection occt_algorithms_10b_2 Examples
2084 Creation of 9832 solids from sphere and set of 63 planes:
2086 <table align="center">
2088 <td>@figure{/user_guides/boolean_operations/images/mkvolume_image001.png, "Arguments"}</td>
2089 <td>@figure{/user_guides/boolean_operations/images/mkvolume_image002.png, "Results"}</td>
2094 Creating compartments on a ship defined by hull shell and a set of planes. The ship is divided on compartments by five transverse bulkheads and a deck – six compartments are created:
2096 <table align="center">
2098 <td>@figure{/user_guides/boolean_operations/images/mkvolume_image003.png, "Arguments"}</td>
2099 <td>@figure{/user_guides/boolean_operations/images/mkvolume_image004.png, "Results"}</td>
2103 @section occt_algorithms_10c_Cells Cells Builder algorithm
2105 The Cells Builder algorithm is an extension of the General Fuse algorithm. The result of General Fuse algorithm contains all split parts of the arguments. The Cells Builder algorithm provides means to specify if any given split part of the arguments (referred to as Cell) can be taken or avoided in the result.
2107 The possibility of selecting any Cell allows combining any possible result and gives the Cells Builder algorithm a very wide sphere of application - from building the result of any Boolean operation to building the result of any application-specific operation.
2109 The algorithm builds Cells only once and then just reuses them for combining the result. This gives this algorithm the performance advantage over Boolean operations, which always rebuild the splits to obtain the desirable result.
2111 Thus, the Cells Builder algorithm can be especially useful for simulating Boolean expressions, i.e. a sequence of Boolean operations on the same arguments. Instead of performing many Boolean operations it allows getting the final result in a single operation. The Cells Builder will also be beneficial to obtain the results of different Boolean operations on the same arguments - Cut and Common, for example.
2113 The Cells Builder algorithm also provides the possibility to remove any internal boundaries between splits of the same type, i.e. to fuse any same-dimensional parts added into the result and to keep any other parts as separate. This possibility is implemented through the Cells material approach: to remove the boundary between two Cells, both Cells should be assigned with the same material ID. However, if the same material ID has been assigned to the Cells of different dimension, the removal of the internal boundaries for that material will not be performed. Currently, such case is considered a limitation for the algorithm.
2115 The algorithm can also create containers from the connected Cells added into result - WIRES from Edges, SHELLS from Faces and COMPSOLIDS from Solids.
2117 @subsection occt_algorithms_10c_Cells_1 Usage
2119 The algorithm has been implemented in the *BOPAlgo_CellsBuilder* class.
2121 Cells Builder is based on the General Fuse algorithm. Thus all options of the General Fuse algorithm, such as parallel processing mode, fuzzy mode, safe processing mode, gluing mode and history support are also available in this algorithm.
2123 The requirements for the input shapes are the same as for General Fuse - each argument should be valid in terms of *BRepCheck_Analyzer* and *BOPAlgo_ArgumentAnalyzer*.
2125 The result of the algorithm is a compound containing the selected parts of the basic type (VERTEX, EDGE, FACE or SOLID). The default result is an empty compound. It is possible to add any Cell by using the methods *AddToRessult()* and *AddAllToResult()*. It is also possible to remove any part from the result by using methods *RemoveFromResult()* and *RemoveAllFromResult()*. The method *RemoveAllFromResult()* is also suitable for clearing the result.
2127 The Cells that should be added/removed to/from the result are defined through the input shapes containing the parts that should be taken *(ShapesToTake)* and the ones containing parts that should be avoided (ShapesToAvoid).
2128 To be taken into the result the part must be IN all shapes from *ShapesToTake* and OUT of all shapes from *ShapesToAvoid*.
2130 To remove Internal boundaries, it is necessary to set the same material to the Cells, between which the boundaries should be removed, and call the method *RemoveInternalBoundaries()*.
2131 The material should not be equal to 0, as this is the default material ID. The boundaries between Cells with this material ID will not be removed. The same Cell cannot be added with different materials.
2132 It is also possible to remove the boundaries when the result is combined. To do this, it is necessary to set the material for parts (not equal to 0) and set the flag *bUpdate* to TRUE.
2133 If the same material ID has been set for parts of different dimension, the removal of internal boundaries for this material will not be performed.
2135 It is possible to create typed Containers from the parts added into result by using method *MakeContainers()*. The type of the containers will depend on the type of the input shapes: WIRES for EDGE, SHELLS for FACES and COMPSOLIDS for SOLIDS. The result will be a compound containing containers.
2138 Here is the example of the algorithm use on the API level:
2140 BOPAlgo_CellsBuilder aCBuilder;
2141 BOPCol_ListOfShape aLS = …; // arguments
2142 Standard_Boolean bRunParallel = Standard_False; /* parallel or single mode (the default value is FALSE)*/
2143 Standard_Real aTol = 0.0; /* fuzzy option (the default value is 0)*/
2144 Standard_Boolean bSafeMode = Standard_False; /* protect or not the arguments from modification*/
2145 BOPAlgo_Glue aGlue = BOPAlgo_GlueOff; /* Glue option to speed up the intersection of arguments*/
2147 aCBuilder.SetArguments(aLS);
2148 aCBuilder.SetRunParallel(bRunParallel);
2149 aCBuilder.SetFuzzyValue(aTol);
2150 aCBuilder.SetNonDestructive(bSafeMode);
2151 aCBuilder.SetGlue(aGlue);
2153 aCBuilder.Perform(); // build splits of all arguments (GF)
2154 if (aCBuilder.ErrorStatus()) { // check error status
2158 // collecting of the cells into result
2159 const TopoDS_Shape& anEmptyRes = aCBuilder.Shape(); // empty result, as nothing has been added yet
2160 const TopoDS_Shape& anAllCells = aCBuilder.GetAllParts(); //all split parts
2162 BOPCol_ListOfShape aLSToTake = ...; // parts of these arguments will be taken into result
2163 BOPCol_ListOfShape aLSToAvoid = ...; // parts of these arguments will not be taken into result
2165 Standard_Integer iMaterial = 1; // defines the material for the cells
2166 Standard_Boolean bUpdate = Standard_False; // defines whether to update the result right now or not
2168 aCBuilder.AddToResult(aLSToTake, aLSToAvoid, iMaterial, bUpdate);
2169 aCBuilder.RemoveInternalBoundaries(); // removing of the boundaries
2170 TopoDS_Shape aResult = aCBuilder.Shape(); // the result
2171 // removing from result
2172 aCBuilder.AddAllToResult();
2173 aCBuilder.RemoveFromResult(aLSToTake, aLSToAvoid);
2174 aResult = aCBuilder.Shape(); // the result
2179 The following set of new commands has been implemented to run the algorithm in DRAW Test Harness:
2181 bcbuild : Initialization of the Cells Builder. Use: *bcbuild r*
2182 bcadd : Add parts to result. Use: *bcadd r s1 (0,1) s2 (0,1) ... [-m material [-u]]*
2183 bcaddall : Add all parts to result. Use: *bcaddall r [-m material [-u]]*
2184 bcremove : Remove parts from result. Use: *bcremove r s1 (0,1) s2 (0,1) ...*
2185 bcremoveall : Remove all parts from result. Use: *bcremoveall*
2186 bcremoveint : Remove internal boundaries. Use: *bcremoveint r*
2187 bcmakecontainers : Make containers from the parts added to result. Use: *bcmakecontainers r*
2190 Here is the example of the algorithm use on the DRAW level:
2195 ttranslate s1 0 0 10
2196 ttranslate s2 20 0 10
2197 ttranslate s3 10 0 0
2198 bclearobjects; bcleartools
2199 baddobjects s1 s2 s3
2201 # rx will contain all split parts
2203 # add to result the part that is common for all three spheres
2204 bcadd res s1 1 s2 1 s3 1 -m 1
2205 # add to result the part that is common only for first and third spheres
2206 bcadd res s1 1 s2 0 s3 1 -m 1
2207 # remove internal boundaries
2211 @subsection occt_algorithms_10c_Cells_2 Examples
2213 The following simple example illustrates the possibilities of the algorithm working on a cylinder and a sphere intersected by a plane:
2218 plane p 0 0 20 1 0 0
2219 mkface f p -25 30 -17 17
2222 @figure{/user_guides/boolean_operations/images/cells_algorithm_001.png, "Arguments"}
2232 #### 1. Common for all arguments
2236 bcadd res c 1 s 1 f 1
2239 @figure{/user_guides/boolean_operations/images/cells_algorithm_002.png, "The result of COMMON operation"}
2241 #### 2. Common between cylinder and face
2248 @figure{/user_guides/boolean_operations/images/cells_algorithm_003.png, "The result of COMMON operation between cylinder and face"}
2250 #### 3. Common between cylinder and sphere
2257 @figure{/user_guides/boolean_operations/images/cells_algorithm_004.png, "The result of COMMON operation between cylinder and sphere"}
2259 #### 4. Fuse of cylinder and sphere
2268 @figure{/user_guides/boolean_operations/images/cells_algorithm_005.png, "The result of FUSE operation between cylinder and sphere"}
2270 #### 5. Parts of the face inside solids - FUSE(COMMON(f, c), COMMON(f, s))
2274 bcadd res f 1 s 1 -m 1
2275 bcadd res f 1 c 1 -m 1
2278 @figure{/user_guides/boolean_operations/images/cells_algorithm_006_1.png, "Parts of the face inside solids"}
2284 @figure{/user_guides/boolean_operations/images/cells_algorithm_006_2.png, "Unified parts of the face inside solids"}
2286 #### 6. Part of the face outside solids
2290 bcadd res f 1 c 0 s 0
2293 @figure{/user_guides/boolean_operations/images/cells_algorithm_007.png, "Part of the face outside solids"}
2295 #### 7. Fuse operation (impossible using standard Boolean Fuse operation)
2301 bcadd res f 1 c 0 s 0
2305 @figure{/user_guides/boolean_operations/images/cells_algorithm_008.png, "Fuse operation"}
2308 These examples may last forever. To define any new operation, it is just necessary to define, which Cells should be taken and which should be avoided.
2311 @section occt_algorithms_10 Algorithm Limitations
2313 The chapter describes the problems that are considered as Algorithm limitations. In most cases an Algorithm failure is caused by a combination of various factors, such as self-interfered arguments, inappropriate or ungrounded values of the argument tolerances, adverse mutual position of the arguments, tangency, etc.
2315 A lot of failures of GFA algorithm can be caused by bugs in low-level algorithms: Intersection Algorithm, Projection Algorithm, Approximation Algorithm, Classification Algorithm, etc.
2316 * The Intersection, Projection and Approximation Algorithms are mostly used at the Intersection step. Their bugs directly cause wrong section results (i.e. incorrect section edges, section points, missing section edges or micro edges). It is not possible to obtain a correct final result of the GFA if a section result is wrong.
2317 * The Projection Algorithm is used at the Intersection step. The purpose of Projection Algorithm is to compute 2D curves on surfaces. Wrong results here lead to incorrect or missing faces in the final GFA result.
2318 * The Classification Algorithm is used at the Building step. The bugs in the Classification Algorithm lead to errors in selecting shape parts (edges, faces, solids) and ultimately to a wrong final GFA result.
2320 The description below illustrates some known GFA limitations. It does not enumerate exhaustively all problems that can arise in practice. Please, address cases of Algorithm failure to the OCCT Maintenance Service.
2323 @subsection occt_algorithms_10_1 Arguments
2325 @subsubsection occt_algorithms_10_1_1 Common requirements
2327 Each argument should be valid (in terms of *BRepCheck_Analyzer*), or conversely, if the argument is considered as non-valid (in terms of *BRepCheck_Analyzer*), it cannot be used as an argument of the algorithm.
2329 The class *BRepCheck_Analyzer* is used to check the overall validity of a shape. In OCCT a Shape (or its sub-shapes) is considered valid if it meets certain criteria. If the shape is found as invalid, it can be fixed by tools from *ShapeAnalysis, ShapeUpgrade* and *ShapeFix* packages.
2331 However, it is important to note that class *BRepCheck_Analyzer* is just a tool that can have its own problems; this means that due to a specific factor(s) this tool can sometimes provide a wrong result.
2333 Let us consider the following example:
2335 The Analyzer checks distances between couples of 3D check-points <i>(Pi, PSi)</i> of edge *E* on face *F*. Point *Pi* is obtained from the 3D curve (at the parameter *ti*) of the edge. *PSi* is obtained from 2D curve (at the parameter *ti*) of the edge on surface *S* of face *F*. To be valid the distance should be less than *Tol(E)* for all couples of check-points. The number of these check-points is a predefined value (e.g. 23).
2337 Let us consider the case when edge *E* is recognized valid (in terms of *BRepCheck_Analyzer*).
2339 Further, after some operation, edge *E* is split into two edges *E1* and *E2*. Each split edge has the same 3D curve and 2D curve as the original edge *E*.
2341 Let us check *E1* (or E2). The Analyzer again checks the distances between the couples of check-points points <i>(Pi, PSi)</i>. The number of these check-points is the same constant value (23), but there is no guarantee that the distances will be less than *Tol(E)*, because the points chosen for *E1* are not the same as for *E*.
2343 Thus, if *E1* is recognized by the Analyzer as non-valid, edge *E* should also be non-valid. However *E* has been recognized as valid. Thus the Analyzer gives a wrong result for *E*.
2345 The fact that the argument is a valid shape (in terms of *BRepCheck_Analyzer*) is a necessary but insufficient requirement to produce a valid result of the Algorithms.
2347 @subsubsection occt_algorithms_10_1_3 Pure self-interference
2349 The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) should share these entities.
2351 #### Example 1: Compound of two edges
2352 The compound of two edges *E1* and *E2* is a self-interfered shape and cannot be used as the argument of the Algorithms.
2354 @figure{/user_guides/boolean_operations/images/operations_image036.svg, "Compound of two edges"}
2356 #### Example 2: Self-interfered Edge
2357 The edge *E* is a self-interfered shape and cannot be used as an argument of the Algorithms.
2359 @figure{/user_guides/boolean_operations/images/operations_image037.svg, "Self-interfered Edge"}
2361 #### Example 3: Self-interfered Face
2362 The face *F* is a self-interfered shape and cannot be used as an argument of the Algorithms.
2364 @figure{/user_guides/boolean_operations/images/operations_image038.svg, "Self-interfered Face"}
2366 #### Example 4: Face of Revolution
2367 The face *F* has been obtained by revolution of edge *E* around line *L*.
2369 @figure{/user_guides/boolean_operations/images/operations_image039a.png, "Face of Revolution: Arguments"}
2370 @figure{/user_guides/boolean_operations/images/operations_image039b.png, "Face of Revolution: Result"}
2372 In spite of the fact that face *F* is valid (in terms of *BRepCheck_Analyzer*) it is a self-interfered shape and cannot be used as the argument of the Algorithms.
2374 @subsubsection occt_algorithms_10_1_4 Self-interferences due to tolerances
2375 #### Example 1: Non-closed Edge
2377 Let us consider edge *E* based on a non-closed circle. @figure{/user_guides/boolean_operations/images/operations_image040.png, "Edge based on a non-closed circle"}
2379 The distance between the vertices of *E* is *D=0.69799*. The values of the tolerances *Tol(V1)=Tol(V2)=0.5*.
2380 @figure{/user_guides/boolean_operations/images/operations_image041.png, "Distance and Tolerances"}
2382 In spite of the fact that the edge *E* is valid in terms of *BRepCheck_Analyzer*, it is a self-interfered shape because its vertices are interfered. Thus, edge *E* cannot be used as an argument of the Algorithms.
2384 #### Example 2: Solid containing an interfered vertex
2386 Let us consider solid *S* containing vertex V. @figure{/user_guides/boolean_operations/images/operations_image042.png, "Solid containing an interfered vertex"}
2388 The value of tolerance Tol(V)= 50.000075982061.
2390 @figure{/user_guides/boolean_operations/images/operations_image043.png, "Tolerance"}
2392 In spite of the fact that solid *S* is valid in terms of *BRepCheck_Analyzer* it is a self-interfered shape because vertex *V* is interfered with a lot of sub-shapes from *S* without any topological connection with them. Thus solid *S* cannot be used as an argument of the Algorithms.
2394 @subsubsection occt_algorithms_10_1_5 Parametric representation
2395 The parameterization of some surfaces (cylinder, cone, surface of revolution) can be the cause of limitation.
2397 #### Example 1: Cylindrical surface
2398 The parameterization range for cylindrical surface is:
2400 @figure{/user_guides/boolean_operations/images/boolean_image135.png}
2402 The range of *U* coordinate is always restricted while the range of *V* coordinate is non-restricted.
2404 Let us consider a cylinder-based *Face 1* with radii *R=3* and *H=6*.
2406 @figure{/user_guides/boolean_operations/images/operations_image044.png, "Face 1"}
2408 @figure{/user_guides/boolean_operations/images/operations_image045.png, "P-Curves for Face 1"}
2410 Let us also consider a cylinder-based *Face 2* with radii *R=3000* and *H=6000* (resulting from scaling Face 1 with scale factor *ScF=1000*).
2412 @figure{/user_guides/boolean_operations/images/operations_image046.png, "Face 2"}
2414 @figure{/user_guides/boolean_operations/images/operations_image047.png, "P-Curves for Face 2"}
2416 Please, pay attention to the Zoom value of the Figures.
2418 It is obvious that starting with some value of *ScF*, e.g. *ScF>1000000*, all sloped p-Curves on *Face 2* will be almost vertical. At least, there will be no difference between the values of angles computed by standard C Run-Time Library functions, such as *double acos(double x)*. The loss of accuracy in computation of angles can cause failure of some BP sub-algorithms, such as building faces from a set of edges or building solids from a set of faces.
2421 @subsubsection occt_algorithms_10_1_6 Using tolerances of vertices to fix gaps
2423 It is possible to create shapes that use sub-shapes of lower order to avoid gaps in the tolerance-based data model.
2425 Let us consider the following example:
2427 @figure{/user_guides/boolean_operations/images/operations_image048.png, "Example"}
2429 * Face *F* has two edges *E1* and *E2* and two vertices, the base plane is <i>{0,0,0, 0,0,1}</i>;
2430 * Edge *E1* is based on line <i>{0,0,0, 1,0,0}, Tol(E1) = 1.e-7; </i>
2431 * Edge *E2* is based on line <i>{0,1,0, 1,0,0}, Tol(E2) = 1.e-7;</i>
2432 * Vertex *V1*, point <i>{0,0.5,0}, Tol(V1) = 1;</i>
2433 * Vertex *V2*, point <i>{10,0.5,0}, Tol(V2) = 1;</i>
2434 * Face *F* is valid (in terms of *BRepCheck_Analyzer*).
2436 The values of tolerances *Tol(V1)* and *Tol(V2)* are big enough to fix the gaps between the ends of the edges, but the vertices *V1* and *V2* do not contain any information about the trajectories connecting the corresponding ends of the edges. Thus, the trajectories are undefined. This will cause failure of some sub-algorithms of BP. For example, the sub-algorithms for building faces from a set of edges use the information about all edges connected in a vertex. The situation when a vertex has several pairs of edges such as above will not be solved in a right way.
2439 @subsection occt_algorithms_11_1 Intersection problems
2440 @subsubsection occt_algorithms_11_1_1 Pure intersections and common zones
2442 #### Example: Intersecting Edges
2444 Let us consider the intersection between two edges:
2445 * *E1* is based on a line: <i>{0,-10,0, 1,0,0}, Tol(E1)=2.</i>
2446 * *E2* is based on a circle: <i>{0,0,0, 0,0,1}, R=10, Tol(E2)=2.</i>
2448 @figure{/user_guides/boolean_operations/images/operations_image049.png, "Intersecting Edges"}
2450 The result of pure intersection between *E1* and *E2* is vertex *Vx {0,-10,0}*.
2452 The result of intersection taking into account tolerances is the common zone *CZ* (part of 3D-space where the distance between the curves is less than or equals to the sum of edge tolerances.
2454 The Intersection Part of Algorithms uses the result of pure intersection *Vx* instead of *CZ* for the following reasons:
2455 * The Algorithms do not produce Common Blocks between edges based on underlying curves of explicitly different type (e.g. Line / Circle). If the curves have different types, the rule of thumb is that the produced result is of type **vertex**. This rule does not work for non-analytic curves (Bezier, B-Spline) and their combinations with analytic curves.
2456 * The algorithm of intersection between two surfaces *IntPatch_Intersection* does not compute *CZ* of the intersection between curves and points. So even if *CZ* were computed by Edge/Edge intersection algorithm, its result could not be treated by Face/Face intersection algorithm.
2458 @subsubsection occt_algorithms_11_2_2 Tolerances and inaccuracies
2460 The following limitations result from modeling errors or inaccuracies.
2462 #### Example: Intersection of planar faces
2464 Let us consider two planar rectangular faces *F1* and *F2*.
2466 The intersection curve between the planes is curve *C12*. The curve produces a new intersection edge *EC12*. The edge goes through vertices *V1* and *V2* thanks to big tolerance values of vertices *Tol(V1)* and *Tol(V2)*. So, two straight edges *E12* and *EC12* go through two vertices, which is impossible in this case.
2468 @figure{/user_guides/boolean_operations/images/operations_image050.svg, "Intersecting Faces"}
2471 The problem cannot be solved in general, because the length of *E12* can be infinite and the values of *Tol(V1)* and *Tol(V2)* theoretically can be infinite too.
2473 In a particular case the problem can be solved in several ways:
2474 * Reduce, if possible, the values of *Tol(V1)* and *Tol(V2)* (refinement of *F1*).
2475 * Analyze the value of *Tol(EC12)* and increase *Tol(EC12)* to get a common part between the edges *EC12* and *E12*. Then the common part will be rejected as there is an already existing edge *E12* for face *F1*.
2477 It is easy to see that if *C12* is slightly above the tolerance spheres of *V1* and *V2* the problem does not appear.
2479 #### Example: Intersection of two edges
2481 Let us consider two edges *E1* and *E2*, which have common vertices *V1* and *V2*. The edges *E1* and *E2* have 3D-curves *C1* and *C2. Tol(E1)=1.e<sup>-7</sup>, Tol(E2)=1.e<sup>-7</sup>.*
2483 *C1* practically coincides in 3D with *C2*. The value of deflection is *Dmax* (e.g. *Dmax=1.e<sup>-6</sup>*).
2485 @figure{/user_guides/boolean_operations/images/operations_image051.svg, "Intersecting Edges"}
2487 The evident and prospective result should be the Common Block between *E1* and *E2*. However, the result of intersection differs.
2489 @figure{/user_guides/boolean_operations/images/operations_image052.svg, "Result of Intersection"}
2491 The result contains three new vertices *Vx1, Vx2* and *Vx3*, 8 new edges <i>(V1, Vx1, Vx2, Vx3, V2)</i> and no Common Blocks. This is correct due to the source data: *Tol(E1)=1.e<sup>-7</sup>, Tol(E2)=1.e<sup>-7</sup>* and <i>Dmax=1.e<sup>-6</sup></i>.
2493 In this particular case the problem can be solved by several ways:
2494 * Increase, if possible, the values *Tol(E1)* and *Tol(E2)* to get coincidence in 3D between *E1* and *E2* in terms of tolerance.
2495 * Replace *E1* by a more accurate model.
2497 The example can be extended from 1D (edges) to 2D (faces).
2499 @figure{/user_guides/boolean_operations/images/operations_image053.svg, "Intersecting Faces"}
2501 The comments and recommendations are the same as for 1D case above.
2504 @subsubsection occt_algorithms_11_2_3 Acquired Self-interferences
2505 #### Example 1: Vertex and edge
2507 Let us consider vertex *V1* and edge *E2*.
2509 @figure{/user_guides/boolean_operations/images/operations_image054.svg, "Vertex and Edge"}
2511 Vertex *V1* interferes with vertices *V12* and *V22*.
2512 So vertex *V21* should interfere with vertex *V22*, which is impossible because vertices *V21* and *V22* are the vertices of edge *E2*, thus *V21* is not equal to *V22*.
2514 The problem cannot be solved in general, because the length can be as small as possible to provide validity of *E2* (in the extreme case: *Length (E2) = Tol(V21) + Tol(V22) + e,* where *e-> 0*).
2516 In a particular case the problem can be solved by refinement of arguments, i.e. by decreasing the values of *Tol(V21)*, *Tol(V22)* and *Tol(V1)*.
2518 #### Example 2: Vertex and wire
2520 Let us consider vertex *V2* and wire consisting of edges *E11* and *E12*.
2522 @figure{/user_guides/boolean_operations/images/operations_image055.svg, "Vertex and Wire"}
2524 The arguments themselves are not self-intersected.
2525 Vertex *V2* interferes with edges *E11* and *E12*. Thus, edge *E11* should interfere with edge *E22*, but it is impossible because edges *E11* and *E12* cannot interfere by the condition.
2527 The cases when a non-self-interfered argument (or its sub-shapes) become interfered due to the intersections with other arguments (or their sub-shapes) are considered as limitations for the Algorithms.
2529 @section occt_algorithms_11a Advanced Options
2531 The previous chapters describe so called Basic Operations. Most of tasks can be solved using Basic Operations. Nonetheless, there are cases that can not be solved straightforwardly by Basic Operations. The tasks are considered as limitations of Basic Operations.
2533 The chapter is devoted to Advanced Options. In some cases the usage of Advanced Options allows overcoming the limitations, improving the quality of the result of operations, robustness and performance of the operators themselves.
2535 @subsection occt_algorithms_11a_1 Fuzzy Boolean Operation
2537 Fuzzy Boolean operation is the option of Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations, in which additional user-specified tolerance is used. This option allows operators to handle robustly cases of touching and near-coincident, misaligned entities of the arguments.
2539 The Fuzzy option is useful on the shapes with gaps or embeddings between the entities of these shapes, which are not covered by the tolerance values of these entities. Such shapes can be the result of modeling mistakes, or translating process, or import from other systems with loss of precision, or errors in some algorithms.
2541 Most likely, the Basic Operations will give unsatisfactory results on such models. The result may contain unexpected and unwanted small entities, faulty entities (in terms of *BRepCheck_Analyzer*), or there can be no result at all.
2543 With the Fuzzy option it is possible to get the expected result -- it is just necessary to define the appropriate value of fuzzy tolerance for the operation. To define that value it is necessary to measure the value of the gap (or the value of embedding depth) between the entities of the models, slightly increase it (to make the shifted entities coincident in terms of their tolerance plus the additional one) and pass it to the algorithm.
2545 Fuzzy option is included in interface of Intersection Part (class *BOPAlgo_PaveFiller*) and application programming interface (class *BRepAlgoAPI_BooleanOperation*)
2547 @subsubsection occt_algorithms_11a_1_1 Examples
2548 The following examples demonstrate the advantages of usage Fuzzy option operations over the Basic Operations in typical situations.
2552 In this example the cylinder (shown in yellow and transparent) is subtracted from the box (shown in red). The cylinder is shifted by 5e<sup>-5</sup> relatively to the box along its axis (the distance between rear faces of the box and cylinder is 5e<sup>-5</sup>).
2554 @figure{/user_guides/boolean_operations/images/boolean_image121.png}
2556 The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 5e<sup>-5</sup>:
2558 @figure{/user_guides/boolean_operations/images/boolean_image122.png, "Result of CUT operation obtained with Basic Operations"}
2560 @figure{/user_guides/boolean_operations/images/boolean_image123.png, "Result of CUT operation obtained with Fuzzy Option"}
2562 In this example Fuzzy option allows eliminating a very thin part of the result shape produced by Basic algorithm due to misalignment of rear faces of the box and the cylinder.
2566 In this example two boxes are fused. One of them has dimensions 10*10*10, and the other is 10*10.000001*10.000001 and adjacent to the first one. There is no gap in this case as the surfaces of the neighboring faces coincide, but one box is slightly greater than the other.
2568 @figure{/user_guides/boolean_operations/images/boolean_image124.png}
2570 The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e<sup>-6</sup>:
2572 @figure{/user_guides/boolean_operations/images/boolean_image125.png, "Result of CUT operation obtained with Basic Operations"}
2574 @figure{/user_guides/boolean_operations/images/boolean_image126.png, "Result of CUT operation obtained with Fuzzy Option"}
2576 In this example Fuzzy option allows eliminating an extremely narrow face in the result produced by Basic operation.
2580 In this example the small planar face (shown in orange) is subtracted from the big one (shown in yellow). There is a gap 1e<sup>-5</sup> between the edges of these faces.
2582 @figure{/user_guides/boolean_operations/images/boolean_image127.png}
2584 The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e<sup>-5</sup>:
2586 @figure{/user_guides/boolean_operations/images/boolean_image128.png, "Result of CUT operation obtained with Basic Operations"}
2588 @figure{/user_guides/boolean_operations/images/boolean_image129.png, "Result of CUT operation obtained with Fuzzy Option"}
2590 In this example Fuzzy options eliminated a pin-like protrusion resulting from the gap between edges of the argument faces.
2594 In this example the small edge is subtracted from the big one. The edges are overlapping not precisely, with max deviation between them equal to 5.28004e<sup>-5</sup>. We will use 6e<sup>-5</sup> value for Fuzzy option.
2596 @figure{/user_guides/boolean_operations/images/boolean_image130.png}
2598 The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 6e<sup>-5</sup>:
2600 @figure{/user_guides/boolean_operations/images/boolean_image131.png, "Result of CUT operation obtained with Basic Operations"}
2602 @figure{/user_guides/boolean_operations/images/boolean_image132.png, "Result of CUT operation obtained with Fuzzy Option"}
2604 This example stresses not only the validity, but also the performance issue. The usage of Fuzzy option with the appropriate value allows processing the case much faster than with the pure Basic operation. The performance gain for the case is 45 (Processor: Intel(R) Core(TM) i5-3450 CPU @ 3.10 GHz).
2606 @subsection occt_algorithms_11a_2 Gluing Operation
2608 The Gluing operation is the option of the Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations.
2609 It has been designed to speed up the computation of the interferences among arguments of the operations on special cases, in which the arguments may be overlapping but do not have real intersections between their sub-shapes.
2611 This option cannot be used on the shapes having real intersections, like intersection vertex between edges, or intersection vertex between edge and a face or intersection line between faces:
2612 @figure{/user_guides/boolean_operations/images/glue_options_image002.png, "Intersecting faces"}
2614 There are two possibilities of overlapping shapes:
2615 * The shapes can be partially coinciding - the faces do not have intersection curves, but overlapping. The faces of such arguments will be split during the operation. The following picture illustrates such shapes:
2616 @figure{/user_guides/boolean_operations/images/glue_options_image001.png, "Partially coinciding faces"}
2617 * The shapes can be fully coinciding - there should be no partial overlapping of the faces, thus no intersection of type EDGE/FACE at all. In such cases the faces will not be split during the operation
2618 @figure{/user_guides/boolean_operations/images/glue_options_image003.png, "Full coinciding faces of the boxes"}
2620 Thus, there are two possible options - for full and partial coincidence of the shapes.
2622 Even though there are no real intersections on such cases without Gluing options the algorithm will still intersect the sub-shapes of the arguments with interfering bounding boxes.
2624 The performance improvement in gluing mode is achieved by excluding the most time consuming computations and in some case can go up to 90%:
2625 * Exclude computation of FACE/FACE intersections for partial coincidence;
2626 * Exclude computation of VERTEX/FACE, EDGE/FACE and FACE/FACE intersections for full coincidence.
2628 By setting the Gluing option for the operation user should guarantee that the arguments are really coinciding. The algorithm does not check this itself. Setting inappropriate option for the operation is likely to lead to incorrect result.
2630 @subsubsection occt_algorithms_11a_2_1 Usage
2632 The Gluing option is an enumeration implemented in BOPAlgo_GlueEnum.hxx:
2633 * BOPAlgo_GlueOff - default value for the algorithms, Gluing is switched off;
2634 * BOPAlgo_GlueShift - Glue option for shapes with partial coincidence;
2635 * BOPAlgo_GlueFull - Glue option for shapes with full coincidence.
2638 For setting the Gluing options for the algorithm it is just necessary to call the SetGlue(const BOPAlgo_Glue) method with appropriate value:
2640 BOPAlgo_Builder aGF;
2643 // setting the gluing option to speed up intersection of the arguments
2644 aGF.SetGlue(BOPAlgo_GlueShift)
2650 For setting the Gluing options in DRAW it is necessary to call the <i>bglue</i> command with appropriate value:
2651 * 0 - default value, Gluing is off;
2652 * 1 - for partial coincidence;
2653 * 2 - for full coincidence
2659 @subsubsection occt_algorithms_11a_2_2 Examples
2660 #### Case1 - Fusing the 64 bspline boxes into one solid
2661 @figure{/user_guides/boolean_operations/images/glue_options_image004.png, "BSpline Boxes with partial coincidence"}
2663 Performance improvement from using the GlueShift option in this case is about 70 percent.
2665 #### Case2 - Sewing faces of the shape after reading from IGES
2666 @figure{/user_guides/boolean_operations/images/glue_options_image005.png, "Faces with coinciding but not shared edges"}
2668 Performance improvement in this case is also about 70 percent.
2670 @subsection occt_algorithms_11a_3 Safe processing mode
2672 The safe processing mode is the advanced option in Boolean Operation component. This mode can be applied to all Basic operations such as General Fuse, Splitting, Boolean, Section, Maker Volume, Cells building.
2673 This option allows keeping the input arguments untouched. In other words, switching this option on prevents the input arguments from any modification such as tolerance increase, addition of the P-Curves on edges, etc.
2675 The option can be very useful for implementation of the Undo/Redo mechanism in the applications and allows performing the operation many times without changing the inputs.
2677 By default the safe processing option is switched off for the algorithms. Enabling this option might slightly decrease the performance of the operation, because instead of the modification of some entity it will be necessary to create the copy of this entity and modify it. However, this degradation should be very small because the copying is performed only in case of necessity.
2679 The option is also available in the Intersection algorithm - *BOPAlgo_PaveFiller*. To perform several different operations on the same arguments, the safe processing mode can be enabled in PaveFiller, prepared only once and then used in operations. It is enough to set this option to PaveFiller only and all algorithms taking this PaveFiller will also work in the safe mode.
2681 @subsubsection occt_algorithms_11a_3_1 Usage
2685 To enable/disable the safe processing mode for the algorithm, it is necessary to call *SetNonDestructive()* method with the appropriate value:
2687 BOPAlgo_Builder aGF;
2690 // enabling the safe processing mode to prevent modification of the input shapes
2691 aGF.SetNonDestructive(Standard_True);
2697 To enable the safe processing mode for the operation in DRAW, it is necessary to call the <i>bnondestructive</i> command with the appropriate value:
2698 * 0 - default value, the safe mode is switched off;
2699 * 1 - the safe mode will be switched on.
2706 @section occt_algorithms_11b Usage
2708 The chapter contains some examples of the OCCT Boolean Component usage. The usage is possible on two levels: C++ and Tcl.
2710 @subsection occt_algorithms_11b_1 Package BRepAlgoAPI
2712 The package *BRepAlgoAPI* provides the Application Programming Interface of the Boolean Component.
2714 The package consists of the following classes:
2715 * *BRepAlgoAPI_Algo* -- the root class that provides the interface for algorithms.
2716 * *BRepAlgoAPI_BuilderAlgo* -- the class API level of General Fuse algorithm.
2717 * *BRepAlgoAPI_Splitter* -- the class API level of the Splitter algorithm.
2718 * *BRepAlgoAPI_BooleanOperation* -- the root class for the classes *BRepAlgoAPI_Fuse*. *BRepAlgoAPI_Common*, *BRepAlgoAPI_Cut* and *BRepAlgoAPI_Section*.
2719 * *BRepAlgoAPI_Fuse* -- the class provides Boolean fusion operation.
2720 * *BRepAlgoAPI_Common* -- the class provides Boolean common operation.
2721 * *BRepAlgoAPI_Cut* -- the class provides Boolean cut operation.
2722 * *BRepAlgoAPI_Section* -- the class provides Boolean section operation.
2724 @figure{/user_guides/boolean_operations/images/operations_image065.png, "Diagram of BRepAlgoAPI package"}
2726 The detailed description of the classes can be found in the corresponding .hxx files. The examples are below in this chapter.
2728 @subsection occt_algorithms_11b_2 Package BOPTest
2729 The package *BOPTest* provides the usage of the Boolean Component on Tcl level. The method *BOPTest::APICommands* contains corresponding Tcl commands:
2731 * *bapibuild* -- for General Fuse Operator;
2732 * *bapisplit* -- for Splitter Operator;
2733 * *bapibop* -- for Boolean Operator and Section Operator.
2735 The examples of how to use the commands are below in this chapter.
2737 @subsubsection occt_algorithms_11b_2_1 Case 1. General Fuse operation
2739 The following example illustrates how to use General Fuse operator:
2744 #include <TopoDS_Shape.hxx>
2745 #include <TopTools_ListOfShape.hxx>
2746 #include <BRepAlgoAPI_BuilderAlgo.hxx>
2748 Standard_Boolean bRunParallel;
2749 Standard_Integer iErr;
2750 Standard_Real aFuzzyValue;
2751 BRepAlgoAPI_BuilderAlgo aBuilder;
2753 // prepare the arguments
2754 TopTools_ListOfShape& aLS=…;
2756 bRunParallel=Standard_True;
2759 // set the arguments
2760 aBuilder.SetArguments(aLS);
2761 // set parallel processing mode
2762 // if bRunParallel= Standard_True : the parallel processing is switched on
2763 // if bRunParallel= Standard_False : the parallel processing is switched off
2764 aBuilder.SetRunParallel(bRunParallel);
2767 // if aFuzzyValue=0.: the Fuzzy option is off
2768 // if aFuzzyValue>0.: the Fuzzy option is on
2769 aBuilder.SetFuzzyValue(aFuzzyValue);
2771 // safe mode - avoid modification of the arguments
2772 Standard_Boolean bSafeMode = Standard_True;
2773 // if bSafeMode == Standard_True - the safe mode is switched on
2774 // if bSafeMode == Standard_False - the safe mode is switched off
2775 aBuilder.SetNonDestructive(bSafeMode);
2777 // gluing options - for coinciding arguments
2778 BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
2779 // if aGlueOpt == BOPAlgo_GlueOff - the gluing mode is switched off
2780 // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
2781 // if aGlueOpt == BOPAlgo_GlueFull - the gluing mode is switched on
2782 aBuilder.SetGlue(aGlueOpt);
2784 // run the algorithm
2786 iErr=aBuilder.ErrorStatus();
2788 // an error treatment
2792 // result of the operation aR
2793 const TopoDS_Shape& aR=aBuilder.Shape();
2801 # prepare the arguments
2803 box b2 3 4 5 10 10 10
2804 box b3 5 6 7 10 10 10
2806 # clear inner contents
2807 bclearobjects; bcleartools;
2810 baddobjects b1 b2 b3
2811 # set parallel processing mode
2812 # 1: the parallel processing is switched on
2813 # 0: the parallel processing is switched off
2817 # 0. : the Fuzzy option is off
2818 # >0. : the Fuzzy option is on
2821 # set safe processing mode
2824 # 1 - the safe processing mode is switched on
2825 # 0 - the safe processing mode is switched off
2829 # set the gluing mode
2830 # 1 or 2 - the gluing mode is switched on
2831 # 0 - the gluing mode is switched off
2834 # r is the result of the operation
2838 @subsubsection occt_algorithms_11b_2_2 Case 2. Splitting operation
2840 The following example illustrates how to use the Splitter operator:
2845 #include <TopoDS_Shape.hxx>
2846 #include <TopTools_ListOfShape.hxx>
2847 #include <BRepAlgoAPI_Splitter.hxx>
2849 BRepAlgoAPI_BuilderAlgo aSplitter;
2851 // prepare the arguments
2853 TopTools_ListOfShape& aLSObjects = … ;
2855 TopTools_ListOfShape& aLSTools = … ;
2857 // set the arguments
2858 aSplitter.SetArguments(aLSObjects);
2859 aSplitter.SetTools(aLSTools);
2862 // parallel processing mode
2863 Standard_Boolean bRunParallel = Standard_True;
2864 // bRunParallel == Standard_True - the parallel processing is switched on
2865 // bRunParallel == Standard_False - the parallel processing is switched off
2866 aSplitter.SetRunParallel();
2868 // fuzzy value - additional tolerance for the operation
2869 Standard_Real aFuzzyValue = 1.e-5;
2870 // if aFuzzyValue == 0. - the Fuzzy option is off
2871 // if aFuzzyValue > 0. - the Fuzzy option is on
2872 aSplitter.SetFuzzyValue(aFuzzyValue);
2874 // safe mode - avoid modification of the arguments
2875 Standard_Boolean bSafeMode = Standard_True;
2876 // if bSafeMode == Standard_True - the safe mode is switched on
2877 // if bSafeMode == Standard_False - the safe mode is switched off
2878 aSplitter.SetNonDestructive(bSafeMode);
2880 // gluing options - for coinciding arguments
2881 BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
2882 // if aGlueOpt == BOPAlgo_GlueOff - the gluing mode is switched off
2883 // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
2884 // if aGlueOpt == BOPAlgo_GlueFull - the gluing mode is switched on
2885 aSplitter.SetGlue(aGlueOpt);
2887 // run the algorithm
2889 // check error status
2890 if (aSplitter.ErrorStatus()) {
2894 // result of the operation aResult
2895 const TopoDS_Shape& aResult = aSplitter.Shape();
2901 # prepare the arguments
2904 box b2 7 0 0 10 10 10
2907 plane p 10 5 5 0 1 0
2908 mkface f p -20 20 -20 20
2910 # clear inner contents
2911 bclearobjects; bcleartools;
2918 # set parallel processing mode
2919 # 1: the parallel processing is switched on
2920 # 0: the parallel processing is switched off
2924 # 0. : the Fuzzy option is off
2925 # >0. : the Fuzzy option is on
2928 # set safe processing mode
2931 # 1 - the safe processing mode is switched on
2932 # 0 - the safe processing mode is switched off
2936 # set the gluing mode
2937 # 1 or 2 - the gluing mode is switched on
2938 # 0 - the gluing mode is switched off
2941 # r is the result of the operation
2945 @subsubsection occt_algorithms_11b_2_3 Case 3. Common operation
2947 The following example illustrates how to use Common operation:
2952 #include <TopoDS_Shape.hxx>
2953 #include <TopTools_ListOfShape.hxx>
2954 #include < BRepAlgoAPI_Common.hxx>
2956 Standard_Boolean bRunParallel;
2957 Standard_Integer iErr;
2958 Standard_Real aFuzzyValue;
2959 BRepAlgoAPI_Common aBuilder;
2961 // perpare the arguments
2962 TopTools_ListOfShape& aLS=…;
2963 TopTools_ListOfShape& aLT=…;
2965 bRunParallel=Standard_True;
2968 // set the arguments
2969 aBuilder.SetArguments(aLS);
2970 aBuilder.SetTools(aLT);
2972 // set parallel processing mode
2973 // if bRunParallel= Standard_True : the parallel processing is switched on
2974 // if bRunParallel= Standard_False : the parallel processing is switched off
2975 aBuilder.SetRunParallel(bRunParallel);
2978 // if aFuzzyValue=0.: the Fuzzy option is off
2979 // if aFuzzyValue>0.: the Fuzzy option is on
2980 aBuilder.SetFuzzyValue(aFuzzyValue);
2982 // safe mode - avoid modification of the arguments
2983 Standard_Boolean bSafeMode = Standard_True;
2984 // if bSafeMode == Standard_True - the safe mode is switched on
2985 // if bSafeMode == Standard_False - the safe mode is switched off
2986 aBuilder.SetNonDestructive(bSafeMode);
2988 // gluing options - for coinciding arguments
2989 BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
2990 // if aGlueOpt == BOPAlgo_GlueOff - the gluing mode is switched off
2991 // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
2992 // if aGlueOpt == BOPAlgo_GlueFull - the gluing mode is switched on
2993 aBuilder.SetGlue(aGlueOpt);
2995 // run the algorithm
2997 iErr=aBuilder.ErrorStatus();
2999 // an error treatment
3003 // result of the operation aR
3004 const TopoDS_Shape& aR=aBuilder.Shape();
3012 # prepare the arguments
3014 box b2 7 0 4 10 10 10
3015 box b3 14 0 0 10 10 10
3017 # clear inner contents
3018 bclearobjects; bcleartools;
3024 # set parallel processing mode
3025 # 1: the parallel processing is switched on
3026 # 0: the parallel processing is switched off
3030 # 0. : the Fuzzy option is off
3031 # >0. : the Fuzzy option is on
3034 # set safe processing mode
3037 # 1 - the safe processing mode is switched on
3038 # 0 - the safe processing mode is switched off
3042 # set the gluing mode
3043 # 1 or 2 - the gluing mode is switched on
3044 # 0 - the gluing mode is switched off
3047 # r is the result of the operation
3048 # 0 means Common operation
3052 @subsubsection occt_algorithms_11b_2_4 Case 4. Fuse operation
3054 The following example illustrates how to use Fuse operation:
3059 #include <TopoDS_Shape.hxx>
3060 #include <TopTools_ListOfShape.hxx>
3061 #include < BRepAlgoAPI_Fuse.hxx>
3063 Standard_Boolean bRunParallel;
3064 Standard_Integer iErr;
3065 Standard_Real aFuzzyValue;
3066 BRepAlgoAPI_Fuse aBuilder;
3068 // perpare the arguments
3069 TopTools_ListOfShape& aLS=…;
3070 TopTools_ListOfShape& aLT=…;
3072 bRunParallel=Standard_True;
3075 // set the arguments
3076 aBuilder.SetArguments(aLS);
3077 aBuilder.SetTools(aLT);
3079 // set parallel processing mode
3080 // if bRunParallel= Standard_True : the parallel processing is switched on
3081 // if bRunParallel= Standard_False : the parallel processing is switched off
3082 aBuilder.SetRunParallel(bRunParallel);
3085 // if aFuzzyValue=0.: the Fuzzy option is off
3086 // if aFuzzyValue>0.: the Fuzzy option is on
3087 aBuilder.SetFuzzyValue(aFuzzyValue);
3089 // safe mode - avoid modification of the arguments
3090 Standard_Boolean bSafeMode = Standard_True;
3091 // if bSafeMode == Standard_True - the safe mode is switched on
3092 // if bSafeMode == Standard_False - the safe mode is switched off
3093 aBuilder.SetNonDestructive(bSafeMode);
3095 // gluing options - for coinciding arguments
3096 BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
3097 // if aGlueOpt == BOPAlgo_GlueOff - the gluing mode is switched off
3098 // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
3099 // if aGlueOpt == BOPAlgo_GlueFull - the gluing mode is switched on
3100 aBuilder.SetGlue(aGlueOpt);
3102 // run the algorithm
3104 iErr=aBuilder.ErrorStatus();
3106 // an error treatment
3110 // result of the operation aR
3111 const TopoDS_Shape& aR=aBuilder.Shape();
3119 # prepare the arguments
3121 box b2 7 0 4 10 10 10
3122 box b3 14 0 0 10 10 10
3124 # clear inner contents
3125 bclearobjects; bcleartools;
3131 # set parallel processing mode
3132 # 1: the parallel processing is switched on
3133 # 0: the parallel processing is switched off
3137 # 0. : the Fuzzy option is off
3138 # >0. : the Fuzzy option is on
3141 # set safe processing mode
3144 # 1 - the safe processing mode is switched on
3145 # 0 - the safe processing mode is switched off
3149 # set the gluing mode
3150 # 1 or 2 - the gluing mode is switched on
3151 # 0 - the gluing mode is switched off
3154 # r is the result of the operation
3155 # 1 means Fuse operation
3159 @subsubsection occt_algorithms_11b_2_5 Case 5. Cut operation
3161 The following example illustrates how to use Cut operation:
3166 #include <TopoDS_Shape.hxx>
3167 #include <TopTools_ListOfShape.hxx>
3168 #include < BRepAlgoAPI_Cut.hxx>
3170 Standard_Boolean bRunParallel;
3171 Standard_Integer iErr;
3172 Standard_Real aFuzzyValue;
3173 BRepAlgoAPI_Cut aBuilder;
3175 // perpare the arguments
3176 TopTools_ListOfShape& aLS=…;
3177 TopTools_ListOfShape& aLT=…;
3179 bRunParallel=Standard_True;
3182 // set the arguments
3183 aBuilder.SetArguments(aLS);
3184 aBuilder.SetTools(aLT);
3186 // set parallel processing mode
3187 // if bRunParallel= Standard_True : the parallel processing is switched on
3188 // if bRunParallel= Standard_False : the parallel processing is switched off
3189 aBuilder.SetRunParallel(bRunParallel);
3192 // if aFuzzyValue=0.: the Fuzzy option is off
3193 // if aFuzzyValue>0.: the Fuzzy option is on
3194 aBuilder.SetFuzzyValue(aFuzzyValue);
3196 // safe mode - avoid modification of the arguments
3197 Standard_Boolean bSafeMode = Standard_True;
3198 // if bSafeMode == Standard_True - the safe mode is switched on
3199 // if bSafeMode == Standard_False - the safe mode is switched off
3200 aBuilder.SetNonDestructive(bSafeMode);
3202 // gluing options - for coinciding arguments
3203 BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
3204 // if aGlueOpt == BOPAlgo_GlueOff - the gluing mode is switched off
3205 // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
3206 // if aGlueOpt == BOPAlgo_GlueFull - the gluing mode is switched on
3207 aBuilder.SetGlue(aGlueOpt);
3209 // run the algorithm
3211 iErr=aBuilder.ErrorStatus();
3213 // an error treatment
3217 // result of the operation aR
3218 const TopoDS_Shape& aR=aBuilder.Shape();
3226 # prepare the arguments
3228 box b2 7 0 4 10 10 10
3229 box b3 14 0 0 10 10 10
3231 # clear inner contents
3232 bclearobjects; bcleartools;
3238 # set parallel processing mode
3239 # 1: the parallel processing is switched on
3240 # 0: the parallel processing is switched off
3244 # 0. : the Fuzzy option is off
3245 # >0. : the Fuzzy option is on
3248 # set safe processing mode
3251 # 1 - the safe processing mode is switched on
3252 # 0 - the safe processing mode is switched off
3256 # set the gluing mode
3257 # 1 or 2 - the gluing mode is switched on
3258 # 0 - the gluing mode is switched off
3261 # r is the result of the operation
3262 # 2 means Cut operation
3267 @subsubsection occt_algorithms_11b_2_6 Case 6. Section operation
3269 The following example illustrates how to use Section operation:
3274 #include <TopoDS_Shape.hxx>
3275 #include <TopTools_ListOfShape.hxx>
3276 #include < BRepAlgoAPI_Section.hxx>
3278 Standard_Boolean bRunParallel;
3279 Standard_Integer iErr;
3280 Standard_Real aFuzzyValue;
3281 BRepAlgoAPI_Section aBuilder;
3283 // perpare the arguments
3284 TopTools_ListOfShape& aLS=…;
3285 TopTools_ListOfShape& aLT=…;
3287 bRunParallel=Standard_True;
3290 // set the arguments
3291 aBuilder.SetArguments(aLS);
3292 aBuilder.SetTools(aLT);
3294 // set parallel processing mode
3295 // if bRunParallel= Standard_True : the parallel processing is switched on
3296 // if bRunParallel= Standard_False : the parallel processing is switched off
3297 aBuilder.SetRunParallel(bRunParallel);
3300 // if aFuzzyValue=0.: the Fuzzy option is off
3301 // if aFuzzyValue>0.: the Fuzzy option is on
3302 aBuilder.SetFuzzyValue(aFuzzyValue);
3304 // safe mode - avoid modification of the arguments
3305 Standard_Boolean bSafeMode = Standard_True;
3306 // if bSafeMode == Standard_True - the safe mode is switched on
3307 // if bSafeMode == Standard_False - the safe mode is switched off
3308 aBuilder.SetNonDestructive(bSafeMode);
3310 // gluing options - for coinciding arguments
3311 BOPAlgo_GlueEnum aGlueOpt = BOPAlgo_GlueFull;
3312 // if aGlueOpt == BOPAlgo_GlueOff - the gluing mode is switched off
3313 // if aGlueOpt == BOPAlgo_GlueShift - the gluing mode is switched on
3314 // if aGlueOpt == BOPAlgo_GlueFull - the gluing mode is switched on
3315 aBuilder.SetGlue(aGlueOpt);
3317 // run the algorithm
3319 iErr=aBuilder.ErrorStatus();
3321 // an error treatment
3325 // result of the operation aR
3326 const TopoDS_Shape& aR=aBuilder.Shape();
3334 # prepare the arguments
3336 box b2 3 4 5 10 10 10
3337 box b3 5 6 7 10 10 10
3339 # clear inner contents
3340 bclearobjects; bcleartools;
3346 # set parallel processing mode
3347 # 1: the parallel processing is switched on
3348 # 0: the parallel processing is switched off
3352 # 0. : the Fuzzy option is off
3353 # >0. : the Fuzzy option is on
3356 # set safe processing mode
3359 # 1 - the safe processing mode is switched on
3360 # 0 - the safe processing mode is switched off
3364 # set the gluing mode
3365 # 1 or 2 - the gluing mode is switched on
3366 # 0 - the gluing mode is switched off
3369 # r is the result of the operation
3370 # 4 means Section operation