1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File: GEOMAlgo_Builder_3.cxx
22 // Author: Peter KURNEV
24 #include <GEOMAlgo_Builder.hxx>
26 #include <TopAbs_State.hxx>
29 #include <TopoDS_Iterator.hxx>
30 #include <TopoDS_Solid.hxx>
31 #include <TopoDS_Shape.hxx>
32 #include <TopoDS_Face.hxx>
33 #include <TopoDS_Solid.hxx>
34 #include <TopoDS_Iterator.hxx>
35 #include <TopoDS_Shell.hxx>
36 #include <TopoDS_Compound.hxx>
39 #include <TopExp_Explorer.hxx>
41 #include <BRep_Builder.hxx>
42 #include <BRepTools.hxx>
43 #include <BRepClass3d_SolidClassifier.hxx>
45 #include <TopTools_ListOfShape.hxx>
46 #include <TopTools_IndexedMapOfShape.hxx>
47 #include <TopTools_ListIteratorOfListOfShape.hxx>
48 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
49 #include <TopTools_IndexedMapOfShape.hxx>
50 #include <TopTools_MapIteratorOfMapOfShape.hxx>
51 #include <TopTools_DataMapOfShapeShape.hxx>
52 #include <TopTools_DataMapOfShapeInteger.hxx>
53 #include <TopTools_DataMapIteratorOfDataMapOfShapeInteger.hxx>
54 #include <TopTools_MapOfShape.hxx>
56 #include <IntTools_Context.hxx>
58 #include <NMTDS_ShapesDataStructure.hxx>
59 #include <NMTTools_PaveFiller.hxx>
61 #include <GEOMAlgo_Tools3D.hxx>
62 #include <GEOMAlgo_BuilderSolid.hxx>
63 #include <GEOMAlgo_ShapeSet.hxx>
64 #include <GEOMAlgo_DataMapOfShapeShapeSet.hxx>
65 #include <GEOMAlgo_DataMapIteratorOfDataMapOfShapeShapeSet.hxx>
70 void OwnInternalShapes(const TopoDS_Shape& ,
71 TopTools_IndexedMapOfShape& );
73 //=======================================================================
74 //function : FillImagesSolids
76 //=======================================================================
77 void GEOMAlgo_Builder::FillImagesSolids()
85 //=======================================================================
86 //function : BuildDraftSolid
88 //=======================================================================
89 void GEOMAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
90 TopoDS_Shape& theDraftSolid,
91 TopTools_ListOfShape& theLIF)
95 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
96 NMTTools_PaveFiller* pPF=myPaveFiller;
97 IntTools_Context& aCtx= pPF->ChangeContext();
99 Standard_Boolean bToReverse;
100 Standard_Integer iFlag;
101 TopAbs_Orientation aOrF, aOrSh, aOrSd;
102 TopoDS_Iterator aIt1, aIt2;
103 TopTools_ListIteratorOfListOfShape aItS;
106 TopoDS_Shape aFSDx, aFx;
108 aOrSd=theSolid.Orientation();
109 theDraftSolid.Orientation(aOrSd);
111 aIt1.Initialize(theSolid);
112 for (; aIt1.More(); aIt1.Next()) {
113 const TopoDS_Shape& aSh=aIt1.Value();
114 if(aSh.ShapeType()!=TopAbs_SHELL) {
115 continue; // mb internal edges,vertices
118 aOrSh=aSh.Orientation();
120 aShD.Orientation(aOrSh);
123 aIt2.Initialize(aSh);
124 for (; aIt2.More(); aIt2.Next()) {
125 const TopoDS_Shape& aF=aIt2.Value();
126 aOrF=aF.Orientation();
128 if (myImages.HasImage(aF)) {
129 const TopTools_ListOfShape& aLSp=myImages.Image(aF);
130 aItS.Initialize(aLSp);
131 for (; aItS.More(); aItS.Next()) {
134 if (mySameDomainShapes.Contains(aFx)) {
135 aFSDx=mySameDomainShapes.FindFromKey(aFx);
137 if (aOrF==TopAbs_INTERNAL) {
138 aFSDx.Orientation(aOrF);
139 theLIF.Append(aFSDx);
142 bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aFSDx, aF, aCtx);
148 aBB.Add(aShD, aFSDx);
150 }// if (mySameDomainShapes.Contains(aFx)) {
152 aFx.Orientation(aOrF);
153 if (aOrF==TopAbs_INTERNAL) {
162 } //if (myImages.HasImage(aF)) {
165 if (aOrF==TopAbs_INTERNAL) {
173 } //for (; aIt2.More(); aIt2.Next()) {
176 aBB.Add(theDraftSolid, aShD);
178 } //for (; aIt1.More(); aIt1.Next()) {
180 //=======================================================================
181 //function : FillIn3DParts
183 //=======================================================================
184 void GEOMAlgo_Builder::FillIn3DParts()
188 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
189 NMTTools_PaveFiller* pPF=myPaveFiller;
190 IntTools_Context& aCtx= pPF->ChangeContext();
192 Standard_Boolean bIsIN, bHasImage;
193 Standard_Integer aNbS, aNbSolids, i, j, aNbFaces, aNbFP, aNbFPx, aNbFIN, aNbLIF;// k,
194 TopAbs_ShapeEnum aType;
196 TopTools_IndexedMapOfShape aMSolids, aMS, aMFaces, aMFIN;
197 TopTools_MapOfShape aMFDone;
198 TopTools_IndexedDataMapOfShapeListOfShape aMEF;
199 TopTools_ListIteratorOfListOfShape aItS;
200 TopoDS_Iterator aIt, aItF;
202 TopoDS_Solid aSolidSp;
205 myDraftSolids.Clear();
207 aNbS=aDS.NumberOfShapesOfTheObject();
208 for (i=1; i<=aNbS; ++i) {
209 const TopoDS_Shape& aS=aDS.Shape(i);
211 aType=aS.ShapeType();
212 if (aType==TopAbs_SOLID) {
213 // all solids from DS
216 else if (aType==TopAbs_FACE) {
217 // all faces (originals from DS or theirs images)
218 if (myImages.HasImage(aS)) {
219 const TopTools_ListOfShape& aLS=myImages.Image(aS);
220 aItS.Initialize(aLS);
221 for (; aItS.More(); aItS.Next()) {
222 const TopoDS_Shape& aFx=aItS.Value();
224 if (mySameDomainShapes.Contains(aFx)) {
225 const TopoDS_Shape& aFSDx=mySameDomainShapes.FindFromKey(aFx);
234 if (mySameDomainShapes.Contains(aS)) {
235 const TopoDS_Shape& aFSDx=mySameDomainShapes.FindFromKey(aS);
245 aNbFaces=aMFaces.Extent();
246 aNbSolids=aMSolids.Extent();
248 for (i=1; i<=aNbSolids; ++i) {
249 const TopoDS_Solid& aSolid=TopoDS::Solid(aMSolids(i));
254 aBB.MakeSolid(aSolidSp);
256 TopTools_ListOfShape aLIF;
258 BuildDraftSolid(aSolid, aSolidSp, aLIF);
259 aNbLIF=aLIF.Extent();
261 // 1 all faces/edges from aSolid [ aMS ]
262 bHasImage=Standard_False;
264 aIt.Initialize(aSolid);
265 for (; aIt.More(); aIt.Next()) {
266 const TopoDS_Shape& aShell=aIt.Value();
268 if (myImages.HasImage(aShell)) {
269 bHasImage=Standard_True;
271 const TopTools_ListOfShape& aLS=myImages.Image(aShell);
272 aItS.Initialize(aLS);
273 for (; aItS.More(); aItS.Next()) {
274 const TopoDS_Shape& aSx=aItS.Value();
276 TopExp::MapShapes(aSx, TopAbs_FACE, aMS);
277 TopExp::MapShapes(aSx, TopAbs_EDGE, aMS);
278 TopExp::MapShapesAndAncestors(aSx, TopAbs_EDGE, TopAbs_FACE, aMEF);
283 TopExp::MapShapes(aShell, TopAbs_FACE, aMS);
284 TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEF);
288 // 2 all faces that are not from aSolid [ aLFP1 ]
289 Standard_Integer aNbEFP;
290 TopTools_IndexedDataMapOfShapeListOfShape aMEFP;
291 TopTools_ListIteratorOfListOfShape aItFP, aItEx;
292 TopTools_MapOfShape aMFence;
293 TopTools_ListOfShape aLFP1, aLFP2, aLFP, aLCBF, aLFIN, aLEx;//*pLFP,
295 // for all non-solid faces build EF map [ aMEFP ]
296 for (j=1; j<=aNbFaces; ++j) {
297 const TopoDS_Shape& aFace=aMFaces(j);
298 if (!aMS.Contains(aFace)) {
299 TopExp::MapShapesAndAncestors(aFace, TopAbs_EDGE, TopAbs_FACE, aMEFP);
303 // among all faces from aMEFP select these that have same edges
304 // with the solid (i.e aMEF). These faces will be treated first
305 // to prevent the usage of 3D classifier.
306 // The full list of faces to process is aLFP1.
307 aNbEFP=aMEFP.Extent();
308 for (j=1; j<=aNbEFP; ++j) {
309 const TopoDS_Shape& aE=aMEFP.FindKey(j);
311 if (aMEF.Contains(aE)) { // !!
312 const TopTools_ListOfShape& aLF=aMEFP(j);
313 aItFP.Initialize(aLF);
314 for (; aItFP.More(); aItFP.Next()) {
315 const TopoDS_Shape& aF=aItFP.Value();
316 if (aMFence.Add(aF)) {
326 aItEx.Initialize(aLEx);
327 for (; aItEx.More(); aItEx.Next()) {
328 const TopoDS_Shape& aE=aItEx.Value();
329 const TopTools_ListOfShape& aLF=aMEFP.FindFromKey(aE);
330 aItFP.Initialize(aLF);
331 for (; aItFP.More(); aItFP.Next()) {
332 const TopoDS_Shape& aF=aItFP.Value();
333 if (aMFence.Add(aF)) {
341 // 3 Process faces aLFP1
342 aNbFP=aLFP1.Extent();
343 aItFP.Initialize(aLFP1);
344 for (; aItFP.More(); aItFP.Next()) {
345 const TopoDS_Shape& aSP=aItFP.Value();
346 if (!aMFDone.Add(aSP)) {
351 // first face to process
352 aFP=TopoDS::Face(aSP);
353 bIsIN= GEOMAlgo_Tools3D::IsInternalFace(aFP, aSolidSp, aMEF, 1.e-14, aCtx);
354 aState=(bIsIN) ? TopAbs_IN : TopAbs_OUT;
356 // collect faces to process [ aFP is the first ]
359 aItS.Initialize(aLFP1);
360 for (; aItS.More(); aItS.Next()) {
361 const TopoDS_Shape& aSk=aItS.Value();
362 if (!aMFDone.Contains(aSk)) {
367 // Connexity Block that spreads from aFP the Bound
368 // or till the end of the block itself
370 GEOMAlgo_Tools3D::MakeConnexityBlock(aLFP, aMS, aLCBF);
372 // fill states for the Connexity Block
373 aItS.Initialize(aLCBF);
374 for (; aItS.More(); aItS.Next()) {
375 const TopoDS_Shape& aSx=aItS.Value();
377 if (aState==TopAbs_IN) {
382 aNbFPx=aMFDone.Extent();
386 }//for (; aItFP.More(); aItFP.Next())
388 // faces Inside aSolid
390 aNbFIN=aMFIN.Extent();
391 if (aNbFIN || aNbLIF) {
392 for (j=1; j<=aNbFIN; ++j) {
393 const TopoDS_Shape& aFIN=aMFIN(j);
397 aItS.Initialize(aLIF);
398 for (; aItS.More(); aItS.Next()) {
399 const TopoDS_Shape& aFIN=aItS.Value();
403 myInParts.Add(aSolid, aLFIN);
405 if (aNbFIN || bHasImage) {
406 myDraftSolids.Add(aSolid, aSolidSp);
408 }//for (i=1; i<=aNbSolids; ++i) { // next solid
410 //=======================================================================
411 //function : BuildSplitSolids
413 //=======================================================================
414 void GEOMAlgo_Builder::BuildSplitSolids()
418 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
419 NMTTools_PaveFiller* pPF=myPaveFiller;
420 IntTools_Context& aCtx= pPF->ChangeContext();
422 Standard_Integer i, aNbS, iErr;
423 TopExp_Explorer aExp;
424 TopTools_ListOfShape aSFS, aLSEmpty;
425 TopTools_MapOfShape aMFence;
426 TopTools_ListIteratorOfListOfShape aIt;
427 GEOMAlgo_BuilderSolid aSB;
428 GEOMAlgo_DataMapIteratorOfDataMapOfShapeShapeSet aItSS;
429 GEOMAlgo_DataMapOfShapeShapeSet aMSS;
430 GEOMAlgo_ShapeSet aSSi;
432 //modified by NIZNHY-PKV Wed Dec 6 17:08:03 2006f
434 // 0. Find same domain solids for non-interferred solids
435 aNbS=aDS.NumberOfShapesOfTheObject();
436 for (i=1; i<=aNbS; ++i) {
437 const TopoDS_Shape& aS=aDS.Shape(i);
438 if (aS.ShapeType()!=TopAbs_SOLID) {
441 if (!aMFence.Add(aS)) {
444 if(myDraftSolids.Contains(aS)) {
449 aSSi.Add(aS, TopAbs_FACE);
452 } //for (i=1; i<=aNbS; ++i)
454 //modified by NIZNHY-PKV Wed Dec 6 17:08:09 2006t
456 // 1. Build solids for interferred source solids
458 aSB.SetContext(aCtx);
459 aNbS=myDraftSolids.Extent();
460 for (i=1; i<=aNbS; ++i) {
461 const TopoDS_Shape& aS =myDraftSolids.FindKey(i);
462 const TopoDS_Shape& aSD=myDraftSolids.FindFromIndex(i);
463 const TopTools_ListOfShape& aLFIN=
464 (myInParts.Contains(aS)) ? myInParts.FindFromKey(aS) : aLSEmpty;
466 // 1.1 Fill Shell Faces Set
469 aExp.Init(aSD, TopAbs_FACE);
470 for (; aExp.More(); aExp.Next()) {
471 const TopoDS_Shape& aF=aExp.Current();
475 aIt.Initialize(aLFIN);
476 for (; aIt.More(); aIt.Next()) {
477 TopoDS_Shape aF=aIt.Value();
479 aF.Orientation(TopAbs_FORWARD);
481 aF.Orientation(TopAbs_REVERSED);
485 Standard_Integer aNbSFS;
486 aNbSFS=aSFS.Extent();
489 // Check whether aSFS contains a subsets of faces
490 // of solids that have been already built.
491 // If yes, shrink aSFS by these subsets.
495 aItSS.Initialize(aMSS);
496 for (; aItSS.More(); aItSS.Next()) {
497 const TopoDS_Shape& aSR=aItSS.Key();
498 const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
499 if (aSSi.Contains(aSSR)) {
500 // the aSR is SD solid for aS
503 if(myImages.HasImage(aS)) {
504 myImages.Add(aS, aSR);
507 myImages.Bind(aS, aSR);
511 mySameDomainShapes.Add(aSR, aSR);
514 const TopTools_ListOfShape& aSFS1=aSSi.GetSet();
515 aNbSFS=aSFS1.Extent();
517 // 1.3 Build new solids
518 aSB.SetShapes(aSFS1);
520 iErr=aSB.ErrorStatus();
522 myErrorStatus=30; // SolidBuilder failed
526 const TopTools_ListOfShape& aLSR=aSB.Areas();
528 // 1.4 Collect resulting solids and theirs set of faces
529 aIt.Initialize(aLSR);
530 for (; aIt.More(); aIt.Next()) {
531 const TopoDS_Shape& aSR=aIt.Value();
534 aExp.Init(aSR, TopAbs_FACE);
535 for (; aExp.More(); aExp.Next()) {
536 const TopoDS_Shape& aF=aExp.Current();
539 aMSS.Bind(aSR, aSSi);
543 if (myImages.HasImage(aS)) {
544 myImages.Add(aS, aLSR);
547 myImages.Bind(aS, aLSR);
549 } // for (i=1; i<=aNbS; ++i) {
550 //modified by NIZNHY-PKV Wed Dec 6 17:07:47 2006f
553 // 2. Find same domain solids for non-interferred solids
554 aNbS=aDS.NumberOfShapesOfTheObject();
555 for (i=1; i<=aNbS; ++i) {
556 const TopoDS_Shape& aS=aDS.Shape(i);
557 if (aS.ShapeType()!=TopAbs_SOLID) {
560 if (!aMFence.Add(aS)) {
563 if(myImages.HasImage(aS)) {
568 aSSi.Add(aS, TopAbs_FACE);
570 aItSS.Initialize(aMSS);
571 for (; aItSS.More(); aItSS.Next()) {
572 const TopoDS_Shape& aSR=aItSS.Key();
573 const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
574 if (aSSi.Contains(aSSR)) {
575 myImages.Bind(aS, aSR);
579 } //for (i=1; i<=aNbS; ++i)
581 //modified by NIZNHY-PKV Wed Dec 6 17:07:55 2006t
583 //=======================================================================
584 //function :FillInternalShapes
586 //=======================================================================
587 void GEOMAlgo_Builder::FillInternalShapes()
591 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
592 NMTTools_PaveFiller* pPF=myPaveFiller;
593 IntTools_Context& aCtx= pPF->ChangeContext();
595 //Standard_Boolean bHasImage;
596 Standard_Integer i, j, jT, aNbS, aNbSI, aNbSx, aNbSd;
597 TopAbs_ShapeEnum aType, aT[]={ TopAbs_VERTEX, TopAbs_EDGE };
599 TopTools_ListIteratorOfListOfShape aIt, aIt1;
600 TopTools_IndexedDataMapOfShapeListOfShape aMSx;
601 TopTools_IndexedMapOfShape aMx;
602 TopTools_MapOfShape aMSI, aMFence, aMSOr;
603 TopTools_MapIteratorOfMapOfShape aItM;
604 TopTools_ListOfShape aLSI, aLSd;
605 TopoDS_Iterator aItS;
608 // 1. Shapes to process
610 // 1.1 Shapes from pure arguments aMSI
611 // 1.1.1 vertex, edge
612 for (i=0; i<2; ++i) {
613 jT=(Standard_Integer)aT[i];
614 const TopTools_ListOfShape &aLS=myShapes1[jT];
616 for (; aIt.More(); aIt.Next()) {
617 const TopoDS_Shape& aS=aIt.Value();
618 if (aMFence.Add(aS)) {
625 jT=(Standard_Integer)TopAbs_WIRE;
626 const TopTools_ListOfShape &aLW=myShapes1[jT];
628 for (; aIt.More(); aIt.Next()) {
629 const TopoDS_Shape& aW=aIt.Value();
631 for (; aItS.More(); aItS.Next()) {
632 const TopoDS_Shape& aE=aItS.Value();
633 if (aMFence.Add(aE)) {
639 // 1.1.3 theirs images/sources
640 aIt1.Initialize(aLSI);
641 for (; aIt1.More(); aIt1.Next()) {
642 const TopoDS_Shape& aS=aIt1.Value();
643 if (myImages.HasImage(aS)) {
644 const TopTools_ListOfShape &aLSp=myImages.Image(aS);
645 aIt.Initialize(aLSp);
646 for (; aIt.More(); aIt.Next()) {
647 const TopoDS_Shape& aSI=aIt.Value();
658 // 2. Internal vertices, edges from source solids
662 aNbS=aDS.NumberOfShapesOfTheObject();
663 for (i=1; i<=aNbS; ++i) {
664 const TopoDS_Shape& aS=aDS.Shape(i);
665 aType=aS.ShapeType();
666 if (aType==TopAbs_SOLID) {
669 OwnInternalShapes(aS, aMx);
672 for (j=1; j<=aNbSx; ++j) {
673 const TopoDS_Shape& aSI=aMx(j);
674 if (myImages.HasImage(aSI)) {
675 const TopTools_ListOfShape &aLSp=myImages.Image(aSI);
676 aIt.Initialize(aLSp);
677 for (; aIt.More(); aIt.Next()) {
678 const TopoDS_Shape& aSp=aIt.Value();
687 // build aux map from splits of solids
688 if (myImages.HasImage(aS)) {
689 const TopTools_ListOfShape &aLSp=myImages.Image(aS);
690 aIt.Initialize(aLSp);
691 for (; aIt.More(); aIt.Next()) {
692 const TopoDS_Shape& aSp=aIt.Value();
693 if (aMFence.Add(aSp)) {
694 TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
695 TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_FACE, aMSx);
696 TopExp::MapShapesAndAncestors(aSp, TopAbs_EDGE , TopAbs_FACE, aMSx);
702 if (aMFence.Add(aS)) {
703 TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
704 TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_FACE, aMSx);
705 TopExp::MapShapesAndAncestors(aS, TopAbs_EDGE , TopAbs_FACE, aMSx);
710 }//if (aType==TopAbs_SOLID)
715 // 3. Some shapes of aMSI can be already tied with faces of
717 aItM.Initialize(aMSI);
718 for (; aItM.More(); aItM.Next()) {
719 const TopoDS_Shape& aSI=aItM.Key();
720 if (aMSx.Contains(aSI)) {
721 const TopTools_ListOfShape &aLSx=aMSx.FindFromKey(aSI);
735 // 5 Settle internal vertices and edges into solids
737 aIt.Initialize(aLSd);
738 for (; aIt.More(); aIt.Next()) {
739 TopoDS_Solid aSd=TopoDS::Solid(aIt.Value());
741 aItM.Initialize(aMSI);
742 for (; aItM.More(); aItM.Next()) {
743 TopoDS_Shape aSI=aItM.Key();
744 aSI.Orientation(TopAbs_INTERNAL);
746 aState=GEOMAlgo_Tools3D::ComputeStateByOnePoint(aSI, aSd, 1.e-11, aCtx);
747 if (aState==TopAbs_IN) {
749 if(aMSOr.Contains(aSd)) {
754 aItS.Initialize(aSd);
755 for (; aItS.More(); aItS.Next()) {
756 const TopoDS_Shape& aSh=aItS.Value();
762 myImages.Bind(aSd, aSdx);
771 } //if (aState==TopAbs_IN) {
772 }// for (; aItM.More(); aItM.Next()) {
773 }//for (; aIt1.More(); aIt1.Next()) {
775 //=======================================================================
776 //function : OwnInternalShapes
778 //=======================================================================
779 void OwnInternalShapes(const TopoDS_Shape& theS,
780 TopTools_IndexedMapOfShape& theMx)
784 aIt.Initialize(theS);
785 for (; aIt.More(); aIt.Next()) {
786 const TopoDS_Shape& aSx=aIt.Value();
787 if (aSx.ShapeType()!=TopAbs_SHELL) {
794 // 30 - SolidBuilder failed