1 // Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: GEOMAlgo_Builder_3.cxx
25 // Author: Peter KURNEV
27 #include <GEOMAlgo_Builder.hxx>
29 #include <TopAbs_State.hxx>
32 #include <TopoDS_Iterator.hxx>
33 #include <TopoDS_Solid.hxx>
34 #include <TopoDS_Shape.hxx>
35 #include <TopoDS_Face.hxx>
36 #include <TopoDS_Solid.hxx>
37 #include <TopoDS_Iterator.hxx>
38 #include <TopoDS_Shell.hxx>
39 #include <TopoDS_Compound.hxx>
42 #include <TopExp_Explorer.hxx>
44 #include <BRep_Builder.hxx>
45 #include <BRepTools.hxx>
46 #include <BRepClass3d_SolidClassifier.hxx>
48 #include <TopTools_ListOfShape.hxx>
49 #include <TopTools_IndexedMapOfShape.hxx>
50 #include <TopTools_ListIteratorOfListOfShape.hxx>
51 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
52 #include <TopTools_IndexedMapOfShape.hxx>
53 #include <TopTools_MapIteratorOfMapOfShape.hxx>
54 #include <TopTools_DataMapOfShapeShape.hxx>
55 #include <TopTools_DataMapOfShapeInteger.hxx>
56 #include <TopTools_DataMapIteratorOfDataMapOfShapeInteger.hxx>
57 #include <TopTools_MapOfShape.hxx>
59 #include <IntTools_Context.hxx>
61 #include <NMTDS_ShapesDataStructure.hxx>
62 #include <NMTTools_PaveFiller.hxx>
64 #include <GEOMAlgo_Tools3D.hxx>
65 #include <GEOMAlgo_BuilderSolid.hxx>
66 #include <GEOMAlgo_ShapeSet.hxx>
67 #include <GEOMAlgo_DataMapOfShapeShapeSet.hxx>
68 #include <GEOMAlgo_DataMapIteratorOfDataMapOfShapeShapeSet.hxx>
73 void OwnInternalShapes(const TopoDS_Shape& ,
74 TopTools_IndexedMapOfShape& );
76 //=======================================================================
77 //function : FillImagesSolids
79 //=======================================================================
80 void GEOMAlgo_Builder::FillImagesSolids()
88 //=======================================================================
89 //function : BuildDraftSolid
91 //=======================================================================
92 void GEOMAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
93 TopoDS_Shape& theDraftSolid,
94 TopTools_ListOfShape& theLIF)
98 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
99 NMTTools_PaveFiller* pPF=myPaveFiller;
100 IntTools_Context& aCtx= pPF->ChangeContext();
102 Standard_Boolean bToReverse;
103 Standard_Integer iFlag;
104 TopAbs_Orientation aOrF, aOrSh, aOrSd;
105 TopoDS_Iterator aIt1, aIt2;
106 TopTools_ListIteratorOfListOfShape aItS;
109 TopoDS_Shape aFSDx, aFx;
111 aOrSd=theSolid.Orientation();
112 theDraftSolid.Orientation(aOrSd);
114 aIt1.Initialize(theSolid);
115 for (; aIt1.More(); aIt1.Next()) {
116 const TopoDS_Shape& aSh=aIt1.Value();
117 if(aSh.ShapeType()!=TopAbs_SHELL) {
118 continue; // mb internal edges,vertices
121 aOrSh=aSh.Orientation();
123 aShD.Orientation(aOrSh);
126 aIt2.Initialize(aSh);
127 for (; aIt2.More(); aIt2.Next()) {
128 const TopoDS_Shape& aF=aIt2.Value();
129 aOrF=aF.Orientation();
131 if (myImages.HasImage(aF)) {
132 const TopTools_ListOfShape& aLSp=myImages.Image(aF);
133 aItS.Initialize(aLSp);
134 for (; aItS.More(); aItS.Next()) {
137 if (mySameDomainShapes.Contains(aFx)) {
138 aFSDx=mySameDomainShapes.FindFromKey(aFx);
140 if (aOrF==TopAbs_INTERNAL) {
141 aFSDx.Orientation(aOrF);
142 theLIF.Append(aFSDx);
145 bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aFSDx, aF, aCtx);
151 aBB.Add(aShD, aFSDx);
153 }// if (mySameDomainShapes.Contains(aFx)) {
155 aFx.Orientation(aOrF);
156 if (aOrF==TopAbs_INTERNAL) {
165 } //if (myImages.HasImage(aF)) {
168 if (aOrF==TopAbs_INTERNAL) {
176 } //for (; aIt2.More(); aIt2.Next()) {
179 aBB.Add(theDraftSolid, aShD);
181 } //for (; aIt1.More(); aIt1.Next()) {
183 //=======================================================================
184 //function : FillIn3DParts
186 //=======================================================================
187 void GEOMAlgo_Builder::FillIn3DParts()
191 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
192 NMTTools_PaveFiller* pPF=myPaveFiller;
193 IntTools_Context& aCtx= pPF->ChangeContext();
195 Standard_Boolean bIsIN, bHasImage;
196 Standard_Integer aNbS, aNbSolids, i, j, aNbFaces, aNbFP, aNbFPx, aNbFIN, aNbLIF;// k,
197 TopAbs_ShapeEnum aType;
199 TopTools_IndexedMapOfShape aMSolids, aMS, aMFaces, aMFIN;
200 TopTools_MapOfShape aMFDone;
201 TopTools_IndexedDataMapOfShapeListOfShape aMEF;
202 TopTools_ListIteratorOfListOfShape aItS;
203 TopoDS_Iterator aIt, aItF;
205 TopoDS_Solid aSolidSp;
208 myDraftSolids.Clear();
210 aNbS=aDS.NumberOfShapesOfTheObject();
211 for (i=1; i<=aNbS; ++i) {
212 const TopoDS_Shape& aS=aDS.Shape(i);
214 aType=aS.ShapeType();
215 if (aType==TopAbs_SOLID) {
216 // all solids from DS
219 else if (aType==TopAbs_FACE) {
220 // all faces (originals from DS or theirs images)
221 if (myImages.HasImage(aS)) {
222 const TopTools_ListOfShape& aLS=myImages.Image(aS);
223 aItS.Initialize(aLS);
224 for (; aItS.More(); aItS.Next()) {
225 const TopoDS_Shape& aFx=aItS.Value();
227 if (mySameDomainShapes.Contains(aFx)) {
228 const TopoDS_Shape& aFSDx=mySameDomainShapes.FindFromKey(aFx);
237 if (mySameDomainShapes.Contains(aS)) {
238 const TopoDS_Shape& aFSDx=mySameDomainShapes.FindFromKey(aS);
248 aNbFaces=aMFaces.Extent();
249 aNbSolids=aMSolids.Extent();
251 for (i=1; i<=aNbSolids; ++i) {
252 const TopoDS_Solid& aSolid=TopoDS::Solid(aMSolids(i));
257 aBB.MakeSolid(aSolidSp);
259 TopTools_ListOfShape aLIF;
261 BuildDraftSolid(aSolid, aSolidSp, aLIF);
262 aNbLIF=aLIF.Extent();
264 // 1 all faces/edges from aSolid [ aMS ]
265 bHasImage=Standard_False;
267 aIt.Initialize(aSolid);
268 for (; aIt.More(); aIt.Next()) {
269 const TopoDS_Shape& aShell=aIt.Value();
271 if (myImages.HasImage(aShell)) {
272 bHasImage=Standard_True;
274 const TopTools_ListOfShape& aLS=myImages.Image(aShell);
275 aItS.Initialize(aLS);
276 for (; aItS.More(); aItS.Next()) {
277 const TopoDS_Shape& aSx=aItS.Value();
279 TopExp::MapShapes(aSx, TopAbs_FACE, aMS);
280 TopExp::MapShapes(aSx, TopAbs_EDGE, aMS);
281 TopExp::MapShapesAndAncestors(aSx, TopAbs_EDGE, TopAbs_FACE, aMEF);
286 TopExp::MapShapes(aShell, TopAbs_FACE, aMS);
287 TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEF);
291 // 2 all faces that are not from aSolid [ aLFP1 ]
292 Standard_Integer aNbEFP;
293 TopTools_IndexedDataMapOfShapeListOfShape aMEFP;
294 TopTools_ListIteratorOfListOfShape aItFP, aItEx;
295 TopTools_MapOfShape aMFence;
296 TopTools_ListOfShape aLFP1, aLFP2, aLFP, aLCBF, aLFIN, aLEx;//*pLFP,
298 // for all non-solid faces build EF map [ aMEFP ]
299 for (j=1; j<=aNbFaces; ++j) {
300 const TopoDS_Shape& aFace=aMFaces(j);
301 if (!aMS.Contains(aFace)) {
302 TopExp::MapShapesAndAncestors(aFace, TopAbs_EDGE, TopAbs_FACE, aMEFP);
306 // among all faces from aMEFP select these that have same edges
307 // with the solid (i.e aMEF). These faces will be treated first
308 // to prevent the usage of 3D classifier.
309 // The full list of faces to process is aLFP1.
310 aNbEFP=aMEFP.Extent();
311 for (j=1; j<=aNbEFP; ++j) {
312 const TopoDS_Shape& aE=aMEFP.FindKey(j);
314 if (aMEF.Contains(aE)) { // !!
315 const TopTools_ListOfShape& aLF=aMEFP(j);
316 aItFP.Initialize(aLF);
317 for (; aItFP.More(); aItFP.Next()) {
318 const TopoDS_Shape& aF=aItFP.Value();
319 if (aMFence.Add(aF)) {
329 aItEx.Initialize(aLEx);
330 for (; aItEx.More(); aItEx.Next()) {
331 const TopoDS_Shape& aE=aItEx.Value();
332 const TopTools_ListOfShape& aLF=aMEFP.FindFromKey(aE);
333 aItFP.Initialize(aLF);
334 for (; aItFP.More(); aItFP.Next()) {
335 const TopoDS_Shape& aF=aItFP.Value();
336 if (aMFence.Add(aF)) {
344 // 3 Process faces aLFP1
345 aNbFP=aLFP1.Extent();
346 aItFP.Initialize(aLFP1);
347 for (; aItFP.More(); aItFP.Next()) {
348 const TopoDS_Shape& aSP=aItFP.Value();
349 if (!aMFDone.Add(aSP)) {
354 // first face to process
355 aFP=TopoDS::Face(aSP);
356 bIsIN= GEOMAlgo_Tools3D::IsInternalFace(aFP, aSolidSp, aMEF, 1.e-14, aCtx);
357 aState=(bIsIN) ? TopAbs_IN : TopAbs_OUT;
359 // collect faces to process [ aFP is the first ]
362 aItS.Initialize(aLFP1);
363 for (; aItS.More(); aItS.Next()) {
364 const TopoDS_Shape& aSk=aItS.Value();
365 if (!aMFDone.Contains(aSk)) {
370 // Connexity Block that spreads from aFP the Bound
371 // or till the end of the block itself
373 GEOMAlgo_Tools3D::MakeConnexityBlock(aLFP, aMS, aLCBF);
375 // fill states for the Connexity Block
376 aItS.Initialize(aLCBF);
377 for (; aItS.More(); aItS.Next()) {
378 const TopoDS_Shape& aSx=aItS.Value();
380 if (aState==TopAbs_IN) {
385 aNbFPx=aMFDone.Extent();
389 }//for (; aItFP.More(); aItFP.Next())
391 // faces Inside aSolid
393 aNbFIN=aMFIN.Extent();
394 if (aNbFIN || aNbLIF) {
395 for (j=1; j<=aNbFIN; ++j) {
396 const TopoDS_Shape& aFIN=aMFIN(j);
400 aItS.Initialize(aLIF);
401 for (; aItS.More(); aItS.Next()) {
402 const TopoDS_Shape& aFIN=aItS.Value();
406 myInParts.Add(aSolid, aLFIN);
408 if (aNbFIN || bHasImage) {
409 myDraftSolids.Add(aSolid, aSolidSp);
411 }//for (i=1; i<=aNbSolids; ++i) { // next solid
413 //=======================================================================
414 //function : BuildSplitSolids
416 //=======================================================================
417 void GEOMAlgo_Builder::BuildSplitSolids()
421 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
422 NMTTools_PaveFiller* pPF=myPaveFiller;
423 IntTools_Context& aCtx= pPF->ChangeContext();
425 Standard_Integer i, aNbS, iErr;
426 TopExp_Explorer aExp;
427 TopTools_ListOfShape aSFS, aLSEmpty;
428 TopTools_MapOfShape aMFence;
429 TopTools_ListIteratorOfListOfShape aIt;
430 GEOMAlgo_BuilderSolid aSB;
431 GEOMAlgo_DataMapIteratorOfDataMapOfShapeShapeSet aItSS;
432 GEOMAlgo_DataMapOfShapeShapeSet aMSS;
433 GEOMAlgo_ShapeSet aSSi;
435 //modified by NIZNHY-PKV Wed Dec 6 17:08:03 2006f
437 // 0. Find same domain solids for non-interferred solids
438 aNbS=aDS.NumberOfShapesOfTheObject();
439 for (i=1; i<=aNbS; ++i) {
440 const TopoDS_Shape& aS=aDS.Shape(i);
441 if (aS.ShapeType()!=TopAbs_SOLID) {
444 if (!aMFence.Add(aS)) {
447 if(myDraftSolids.Contains(aS)) {
452 aSSi.Add(aS, TopAbs_FACE);
455 } //for (i=1; i<=aNbS; ++i)
457 //modified by NIZNHY-PKV Wed Dec 6 17:08:09 2006t
459 // 1. Build solids for interferred source solids
461 aSB.SetContext(aCtx);
462 aNbS=myDraftSolids.Extent();
463 for (i=1; i<=aNbS; ++i) {
464 const TopoDS_Shape& aS =myDraftSolids.FindKey(i);
465 const TopoDS_Shape& aSD=myDraftSolids.FindFromIndex(i);
466 const TopTools_ListOfShape& aLFIN=
467 (myInParts.Contains(aS)) ? myInParts.FindFromKey(aS) : aLSEmpty;
469 // 1.1 Fill Shell Faces Set
472 aExp.Init(aSD, TopAbs_FACE);
473 for (; aExp.More(); aExp.Next()) {
474 const TopoDS_Shape& aF=aExp.Current();
478 aIt.Initialize(aLFIN);
479 for (; aIt.More(); aIt.Next()) {
480 TopoDS_Shape aF=aIt.Value();
482 aF.Orientation(TopAbs_FORWARD);
484 aF.Orientation(TopAbs_REVERSED);
488 Standard_Integer aNbSFS;
489 aNbSFS=aSFS.Extent();
492 // Check whether aSFS contains a subsets of faces
493 // of solids that have been already built.
494 // If yes, shrink aSFS by these subsets.
498 aItSS.Initialize(aMSS);
499 for (; aItSS.More(); aItSS.Next()) {
500 const TopoDS_Shape& aSR=aItSS.Key();
501 const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
502 if (aSSi.Contains(aSSR)) {
503 // the aSR is SD solid for aS
506 if(myImages.HasImage(aS)) {
507 myImages.Add(aS, aSR);
510 myImages.Bind(aS, aSR);
514 mySameDomainShapes.Add(aSR, aSR);
517 const TopTools_ListOfShape& aSFS1=aSSi.GetSet();
518 aNbSFS=aSFS1.Extent();
520 // 1.3 Build new solids
521 aSB.SetShapes(aSFS1);
523 iErr=aSB.ErrorStatus();
525 myErrorStatus=30; // SolidBuilder failed
529 const TopTools_ListOfShape& aLSR=aSB.Areas();
531 // 1.4 Collect resulting solids and theirs set of faces
532 aIt.Initialize(aLSR);
533 for (; aIt.More(); aIt.Next()) {
534 const TopoDS_Shape& aSR=aIt.Value();
537 aExp.Init(aSR, TopAbs_FACE);
538 for (; aExp.More(); aExp.Next()) {
539 const TopoDS_Shape& aF=aExp.Current();
542 aMSS.Bind(aSR, aSSi);
546 if (myImages.HasImage(aS)) {
547 myImages.Add(aS, aLSR);
550 myImages.Bind(aS, aLSR);
552 } // for (i=1; i<=aNbS; ++i) {
553 //modified by NIZNHY-PKV Wed Dec 6 17:07:47 2006f
556 // 2. Find same domain solids for non-interferred solids
557 aNbS=aDS.NumberOfShapesOfTheObject();
558 for (i=1; i<=aNbS; ++i) {
559 const TopoDS_Shape& aS=aDS.Shape(i);
560 if (aS.ShapeType()!=TopAbs_SOLID) {
563 if (!aMFence.Add(aS)) {
566 if(myImages.HasImage(aS)) {
571 aSSi.Add(aS, TopAbs_FACE);
573 aItSS.Initialize(aMSS);
574 for (; aItSS.More(); aItSS.Next()) {
575 const TopoDS_Shape& aSR=aItSS.Key();
576 const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
577 if (aSSi.Contains(aSSR)) {
578 myImages.Bind(aS, aSR);
582 } //for (i=1; i<=aNbS; ++i)
584 //modified by NIZNHY-PKV Wed Dec 6 17:07:55 2006t
586 //=======================================================================
587 //function :FillInternalShapes
589 //=======================================================================
590 void GEOMAlgo_Builder::FillInternalShapes()
594 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
595 NMTTools_PaveFiller* pPF=myPaveFiller;
596 IntTools_Context& aCtx= pPF->ChangeContext();
598 //Standard_Boolean bHasImage;
599 Standard_Integer i, j, jT, aNbS, aNbSI, aNbSx, aNbSd;
600 TopAbs_ShapeEnum aType, aT[]={ TopAbs_VERTEX, TopAbs_EDGE };
602 TopTools_ListIteratorOfListOfShape aIt, aIt1;
603 TopTools_IndexedDataMapOfShapeListOfShape aMSx;
604 TopTools_IndexedMapOfShape aMx;
605 TopTools_MapOfShape aMSI, aMFence, aMSOr;
606 TopTools_MapIteratorOfMapOfShape aItM;
607 TopTools_ListOfShape aLSI, aLSd;
608 TopoDS_Iterator aItS;
611 // 1. Shapes to process
613 // 1.1 Shapes from pure arguments aMSI
614 // 1.1.1 vertex, edge
615 for (i=0; i<2; ++i) {
616 jT=(Standard_Integer)aT[i];
617 const TopTools_ListOfShape &aLS=myShapes1[jT];
619 for (; aIt.More(); aIt.Next()) {
620 const TopoDS_Shape& aS=aIt.Value();
621 if (aMFence.Add(aS)) {
628 jT=(Standard_Integer)TopAbs_WIRE;
629 const TopTools_ListOfShape &aLW=myShapes1[jT];
631 for (; aIt.More(); aIt.Next()) {
632 const TopoDS_Shape& aW=aIt.Value();
634 for (; aItS.More(); aItS.Next()) {
635 const TopoDS_Shape& aE=aItS.Value();
636 if (aMFence.Add(aE)) {
642 // 1.1.3 theirs images/sources
643 aIt1.Initialize(aLSI);
644 for (; aIt1.More(); aIt1.Next()) {
645 const TopoDS_Shape& aS=aIt1.Value();
646 if (myImages.HasImage(aS)) {
647 const TopTools_ListOfShape &aLSp=myImages.Image(aS);
648 aIt.Initialize(aLSp);
649 for (; aIt.More(); aIt.Next()) {
650 const TopoDS_Shape& aSI=aIt.Value();
661 // 2. Internal vertices, edges from source solids
665 aNbS=aDS.NumberOfShapesOfTheObject();
666 for (i=1; i<=aNbS; ++i) {
667 const TopoDS_Shape& aS=aDS.Shape(i);
668 aType=aS.ShapeType();
669 if (aType==TopAbs_SOLID) {
672 OwnInternalShapes(aS, aMx);
675 for (j=1; j<=aNbSx; ++j) {
676 const TopoDS_Shape& aSI=aMx(j);
677 if (myImages.HasImage(aSI)) {
678 const TopTools_ListOfShape &aLSp=myImages.Image(aSI);
679 aIt.Initialize(aLSp);
680 for (; aIt.More(); aIt.Next()) {
681 const TopoDS_Shape& aSp=aIt.Value();
690 // build aux map from splits of solids
691 if (myImages.HasImage(aS)) {
692 const TopTools_ListOfShape &aLSp=myImages.Image(aS);
693 aIt.Initialize(aLSp);
694 for (; aIt.More(); aIt.Next()) {
695 const TopoDS_Shape& aSp=aIt.Value();
696 if (aMFence.Add(aSp)) {
697 TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
698 TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_FACE, aMSx);
699 TopExp::MapShapesAndAncestors(aSp, TopAbs_EDGE , TopAbs_FACE, aMSx);
705 if (aMFence.Add(aS)) {
706 TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
707 TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_FACE, aMSx);
708 TopExp::MapShapesAndAncestors(aS, TopAbs_EDGE , TopAbs_FACE, aMSx);
713 }//if (aType==TopAbs_SOLID)
718 // 3. Some shapes of aMSI can be already tied with faces of
720 aItM.Initialize(aMSI);
721 for (; aItM.More(); aItM.Next()) {
722 const TopoDS_Shape& aSI=aItM.Key();
723 if (aMSx.Contains(aSI)) {
724 const TopTools_ListOfShape &aLSx=aMSx.FindFromKey(aSI);
738 // 5 Settle internal vertices and edges into solids
740 aIt.Initialize(aLSd);
741 for (; aIt.More(); aIt.Next()) {
742 TopoDS_Solid aSd=TopoDS::Solid(aIt.Value());
744 aItM.Initialize(aMSI);
745 for (; aItM.More(); aItM.Next()) {
746 TopoDS_Shape aSI=aItM.Key();
747 aSI.Orientation(TopAbs_INTERNAL);
749 aState=GEOMAlgo_Tools3D::ComputeStateByOnePoint(aSI, aSd, 1.e-11, aCtx);
750 if (aState==TopAbs_IN) {
752 if(aMSOr.Contains(aSd)) {
757 aItS.Initialize(aSd);
758 for (; aItS.More(); aItS.Next()) {
759 const TopoDS_Shape& aSh=aItS.Value();
765 myImages.Bind(aSd, aSdx);
774 } //if (aState==TopAbs_IN) {
775 }// for (; aItM.More(); aItM.Next()) {
776 }//for (; aIt1.More(); aIt1.Next()) {
778 //=======================================================================
779 //function : OwnInternalShapes
781 //=======================================================================
782 void OwnInternalShapes(const TopoDS_Shape& theS,
783 TopTools_IndexedMapOfShape& theMx)
787 aIt.Initialize(theS);
788 for (; aIt.More(); aIt.Next()) {
789 const TopoDS_Shape& aSx=aIt.Value();
790 if (aSx.ShapeType()!=TopAbs_SHELL) {
797 // 30 - SolidBuilder failed