1 // Copyright (C) 2007-2008 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
22 // File: GEOMAlgo_Builder_3.cxx
24 // Author: Peter KURNEV
26 #include <GEOMAlgo_Builder.hxx>
28 #include <TopAbs_State.hxx>
31 #include <TopoDS_Iterator.hxx>
32 #include <TopoDS_Solid.hxx>
33 #include <TopoDS_Shape.hxx>
34 #include <TopoDS_Face.hxx>
35 #include <TopoDS_Solid.hxx>
36 #include <TopoDS_Iterator.hxx>
37 #include <TopoDS_Shell.hxx>
38 #include <TopoDS_Compound.hxx>
41 #include <TopExp_Explorer.hxx>
43 #include <BRep_Builder.hxx>
44 #include <BRepTools.hxx>
45 #include <BRepClass3d_SolidClassifier.hxx>
47 #include <TopTools_ListOfShape.hxx>
48 #include <TopTools_IndexedMapOfShape.hxx>
49 #include <TopTools_ListIteratorOfListOfShape.hxx>
50 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
51 #include <TopTools_IndexedMapOfShape.hxx>
52 #include <TopTools_MapIteratorOfMapOfShape.hxx>
53 #include <TopTools_DataMapOfShapeShape.hxx>
54 #include <TopTools_DataMapOfShapeInteger.hxx>
55 #include <TopTools_DataMapIteratorOfDataMapOfShapeInteger.hxx>
56 #include <TopTools_MapOfShape.hxx>
58 #include <IntTools_Context.hxx>
60 #include <NMTDS_ShapesDataStructure.hxx>
61 #include <NMTTools_PaveFiller.hxx>
63 #include <GEOMAlgo_Tools3D.hxx>
64 #include <GEOMAlgo_BuilderSolid.hxx>
65 #include <GEOMAlgo_ShapeSet.hxx>
66 #include <GEOMAlgo_DataMapOfShapeShapeSet.hxx>
67 #include <GEOMAlgo_DataMapIteratorOfDataMapOfShapeShapeSet.hxx>
72 void OwnInternalShapes(const TopoDS_Shape& ,
73 TopTools_IndexedMapOfShape& );
75 //=======================================================================
76 //function : FillImagesSolids
78 //=======================================================================
79 void GEOMAlgo_Builder::FillImagesSolids()
87 //=======================================================================
88 //function : BuildDraftSolid
90 //=======================================================================
91 void GEOMAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
92 TopoDS_Shape& theDraftSolid,
93 TopTools_ListOfShape& theLIF)
97 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
98 NMTTools_PaveFiller* pPF=myPaveFiller;
99 IntTools_Context& aCtx= pPF->ChangeContext();
101 Standard_Boolean bToReverse;
102 Standard_Integer iFlag;
103 TopAbs_Orientation aOrF, aOrSh, aOrSd;
104 TopoDS_Iterator aIt1, aIt2;
105 TopTools_ListIteratorOfListOfShape aItS;
108 TopoDS_Shape aFSDx, aFx;
110 aOrSd=theSolid.Orientation();
111 theDraftSolid.Orientation(aOrSd);
113 aIt1.Initialize(theSolid);
114 for (; aIt1.More(); aIt1.Next()) {
115 const TopoDS_Shape& aSh=aIt1.Value();
116 if(aSh.ShapeType()!=TopAbs_SHELL) {
117 continue; // mb internal edges,vertices
120 aOrSh=aSh.Orientation();
122 aShD.Orientation(aOrSh);
125 aIt2.Initialize(aSh);
126 for (; aIt2.More(); aIt2.Next()) {
127 const TopoDS_Shape& aF=aIt2.Value();
128 aOrF=aF.Orientation();
130 if (myImages.HasImage(aF)) {
131 const TopTools_ListOfShape& aLSp=myImages.Image(aF);
132 aItS.Initialize(aLSp);
133 for (; aItS.More(); aItS.Next()) {
136 if (mySameDomainShapes.Contains(aFx)) {
137 aFSDx=mySameDomainShapes.FindFromKey(aFx);
139 if (aOrF==TopAbs_INTERNAL) {
140 aFSDx.Orientation(aOrF);
141 theLIF.Append(aFSDx);
144 bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aFSDx, aF, aCtx);
150 aBB.Add(aShD, aFSDx);
152 }// if (mySameDomainShapes.Contains(aFx)) {
154 aFx.Orientation(aOrF);
155 if (aOrF==TopAbs_INTERNAL) {
164 } //if (myImages.HasImage(aF)) {
167 if (aOrF==TopAbs_INTERNAL) {
175 } //for (; aIt2.More(); aIt2.Next()) {
178 aBB.Add(theDraftSolid, aShD);
180 } //for (; aIt1.More(); aIt1.Next()) {
182 //=======================================================================
183 //function : FillIn3DParts
185 //=======================================================================
186 void GEOMAlgo_Builder::FillIn3DParts()
190 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
191 NMTTools_PaveFiller* pPF=myPaveFiller;
192 IntTools_Context& aCtx= pPF->ChangeContext();
194 Standard_Boolean bIsIN, bHasImage;
195 Standard_Integer aNbS, aNbSolids, i, j, aNbFaces, aNbFP, aNbFPx, aNbFIN, aNbLIF;// k,
196 TopAbs_ShapeEnum aType;
198 TopTools_IndexedMapOfShape aMSolids, aMS, aMFaces, aMFIN;
199 TopTools_MapOfShape aMFDone;
200 TopTools_IndexedDataMapOfShapeListOfShape aMEF;
201 TopTools_ListIteratorOfListOfShape aItS;
202 TopoDS_Iterator aIt, aItF;
204 TopoDS_Solid aSolidSp;
207 myDraftSolids.Clear();
209 aNbS=aDS.NumberOfShapesOfTheObject();
210 for (i=1; i<=aNbS; ++i) {
211 const TopoDS_Shape& aS=aDS.Shape(i);
213 aType=aS.ShapeType();
214 if (aType==TopAbs_SOLID) {
215 // all solids from DS
218 else if (aType==TopAbs_FACE) {
219 // all faces (originals from DS or theirs images)
220 if (myImages.HasImage(aS)) {
221 const TopTools_ListOfShape& aLS=myImages.Image(aS);
222 aItS.Initialize(aLS);
223 for (; aItS.More(); aItS.Next()) {
224 const TopoDS_Shape& aFx=aItS.Value();
226 if (mySameDomainShapes.Contains(aFx)) {
227 const TopoDS_Shape& aFSDx=mySameDomainShapes.FindFromKey(aFx);
236 if (mySameDomainShapes.Contains(aS)) {
237 const TopoDS_Shape& aFSDx=mySameDomainShapes.FindFromKey(aS);
247 aNbFaces=aMFaces.Extent();
248 aNbSolids=aMSolids.Extent();
250 for (i=1; i<=aNbSolids; ++i) {
251 const TopoDS_Solid& aSolid=TopoDS::Solid(aMSolids(i));
256 aBB.MakeSolid(aSolidSp);
258 TopTools_ListOfShape aLIF;
260 BuildDraftSolid(aSolid, aSolidSp, aLIF);
261 aNbLIF=aLIF.Extent();
263 // 1 all faces/edges from aSolid [ aMS ]
264 bHasImage=Standard_False;
266 aIt.Initialize(aSolid);
267 for (; aIt.More(); aIt.Next()) {
268 const TopoDS_Shape& aShell=aIt.Value();
270 if (myImages.HasImage(aShell)) {
271 bHasImage=Standard_True;
273 const TopTools_ListOfShape& aLS=myImages.Image(aShell);
274 aItS.Initialize(aLS);
275 for (; aItS.More(); aItS.Next()) {
276 const TopoDS_Shape& aSx=aItS.Value();
278 TopExp::MapShapes(aSx, TopAbs_FACE, aMS);
279 TopExp::MapShapes(aSx, TopAbs_EDGE, aMS);
280 TopExp::MapShapesAndAncestors(aSx, TopAbs_EDGE, TopAbs_FACE, aMEF);
285 TopExp::MapShapes(aShell, TopAbs_FACE, aMS);
286 TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEF);
290 // 2 all faces that are not from aSolid [ aLFP1 ]
291 Standard_Integer aNbEFP;
292 TopTools_IndexedDataMapOfShapeListOfShape aMEFP;
293 TopTools_ListIteratorOfListOfShape aItFP, aItEx;
294 TopTools_MapOfShape aMFence;
295 TopTools_ListOfShape aLFP1, aLFP2, aLFP, aLCBF, aLFIN, aLEx;//*pLFP,
297 // for all non-solid faces build EF map [ aMEFP ]
298 for (j=1; j<=aNbFaces; ++j) {
299 const TopoDS_Shape& aFace=aMFaces(j);
300 if (!aMS.Contains(aFace)) {
301 TopExp::MapShapesAndAncestors(aFace, TopAbs_EDGE, TopAbs_FACE, aMEFP);
305 // among all faces from aMEFP select these that have same edges
306 // with the solid (i.e aMEF). These faces will be treated first
307 // to prevent the usage of 3D classifier.
308 // The full list of faces to process is aLFP1.
309 aNbEFP=aMEFP.Extent();
310 for (j=1; j<=aNbEFP; ++j) {
311 const TopoDS_Shape& aE=aMEFP.FindKey(j);
313 if (aMEF.Contains(aE)) { // !!
314 const TopTools_ListOfShape& aLF=aMEFP(j);
315 aItFP.Initialize(aLF);
316 for (; aItFP.More(); aItFP.Next()) {
317 const TopoDS_Shape& aF=aItFP.Value();
318 if (aMFence.Add(aF)) {
328 aItEx.Initialize(aLEx);
329 for (; aItEx.More(); aItEx.Next()) {
330 const TopoDS_Shape& aE=aItEx.Value();
331 const TopTools_ListOfShape& aLF=aMEFP.FindFromKey(aE);
332 aItFP.Initialize(aLF);
333 for (; aItFP.More(); aItFP.Next()) {
334 const TopoDS_Shape& aF=aItFP.Value();
335 if (aMFence.Add(aF)) {
343 // 3 Process faces aLFP1
344 aNbFP=aLFP1.Extent();
345 aItFP.Initialize(aLFP1);
346 for (; aItFP.More(); aItFP.Next()) {
347 const TopoDS_Shape& aSP=aItFP.Value();
348 if (!aMFDone.Add(aSP)) {
353 // first face to process
354 aFP=TopoDS::Face(aSP);
355 bIsIN= GEOMAlgo_Tools3D::IsInternalFace(aFP, aSolidSp, aMEF, 1.e-14, aCtx);
356 aState=(bIsIN) ? TopAbs_IN : TopAbs_OUT;
358 // collect faces to process [ aFP is the first ]
361 aItS.Initialize(aLFP1);
362 for (; aItS.More(); aItS.Next()) {
363 const TopoDS_Shape& aSk=aItS.Value();
364 if (!aMFDone.Contains(aSk)) {
369 // Connexity Block that spreads from aFP the Bound
370 // or till the end of the block itself
372 GEOMAlgo_Tools3D::MakeConnexityBlock(aLFP, aMS, aLCBF);
374 // fill states for the Connexity Block
375 aItS.Initialize(aLCBF);
376 for (; aItS.More(); aItS.Next()) {
377 const TopoDS_Shape& aSx=aItS.Value();
379 if (aState==TopAbs_IN) {
384 aNbFPx=aMFDone.Extent();
388 }//for (; aItFP.More(); aItFP.Next())
390 // faces Inside aSolid
392 aNbFIN=aMFIN.Extent();
393 if (aNbFIN || aNbLIF) {
394 for (j=1; j<=aNbFIN; ++j) {
395 const TopoDS_Shape& aFIN=aMFIN(j);
399 aItS.Initialize(aLIF);
400 for (; aItS.More(); aItS.Next()) {
401 const TopoDS_Shape& aFIN=aItS.Value();
405 myInParts.Add(aSolid, aLFIN);
407 if (aNbFIN || bHasImage) {
408 myDraftSolids.Add(aSolid, aSolidSp);
410 }//for (i=1; i<=aNbSolids; ++i) { // next solid
412 //=======================================================================
413 //function : BuildSplitSolids
415 //=======================================================================
416 void GEOMAlgo_Builder::BuildSplitSolids()
420 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
421 NMTTools_PaveFiller* pPF=myPaveFiller;
422 IntTools_Context& aCtx= pPF->ChangeContext();
424 Standard_Integer i, aNbS, iErr;
425 TopExp_Explorer aExp;
426 TopTools_ListOfShape aSFS, aLSEmpty;
427 TopTools_MapOfShape aMFence;
428 TopTools_ListIteratorOfListOfShape aIt;
429 GEOMAlgo_BuilderSolid aSB;
430 GEOMAlgo_DataMapIteratorOfDataMapOfShapeShapeSet aItSS;
431 GEOMAlgo_DataMapOfShapeShapeSet aMSS;
432 GEOMAlgo_ShapeSet aSSi;
434 //modified by NIZNHY-PKV Wed Dec 6 17:08:03 2006f
436 // 0. Find same domain solids for non-interferred solids
437 aNbS=aDS.NumberOfShapesOfTheObject();
438 for (i=1; i<=aNbS; ++i) {
439 const TopoDS_Shape& aS=aDS.Shape(i);
440 if (aS.ShapeType()!=TopAbs_SOLID) {
443 if (!aMFence.Add(aS)) {
446 if(myDraftSolids.Contains(aS)) {
451 aSSi.Add(aS, TopAbs_FACE);
454 } //for (i=1; i<=aNbS; ++i)
456 //modified by NIZNHY-PKV Wed Dec 6 17:08:09 2006t
458 // 1. Build solids for interferred source solids
460 aSB.SetContext(aCtx);
461 aNbS=myDraftSolids.Extent();
462 for (i=1; i<=aNbS; ++i) {
463 const TopoDS_Shape& aS =myDraftSolids.FindKey(i);
464 const TopoDS_Shape& aSD=myDraftSolids.FindFromIndex(i);
465 const TopTools_ListOfShape& aLFIN=
466 (myInParts.Contains(aS)) ? myInParts.FindFromKey(aS) : aLSEmpty;
468 // 1.1 Fill Shell Faces Set
471 aExp.Init(aSD, TopAbs_FACE);
472 for (; aExp.More(); aExp.Next()) {
473 const TopoDS_Shape& aF=aExp.Current();
477 aIt.Initialize(aLFIN);
478 for (; aIt.More(); aIt.Next()) {
479 TopoDS_Shape aF=aIt.Value();
481 aF.Orientation(TopAbs_FORWARD);
483 aF.Orientation(TopAbs_REVERSED);
487 Standard_Integer aNbSFS;
488 aNbSFS=aSFS.Extent();
491 // Check whether aSFS contains a subsets of faces
492 // of solids that have been already built.
493 // If yes, shrink aSFS by these subsets.
497 aItSS.Initialize(aMSS);
498 for (; aItSS.More(); aItSS.Next()) {
499 const TopoDS_Shape& aSR=aItSS.Key();
500 const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
501 if (aSSi.Contains(aSSR)) {
502 // the aSR is SD solid for aS
505 if(myImages.HasImage(aS)) {
506 myImages.Add(aS, aSR);
509 myImages.Bind(aS, aSR);
513 mySameDomainShapes.Add(aSR, aSR);
516 const TopTools_ListOfShape& aSFS1=aSSi.GetSet();
517 aNbSFS=aSFS1.Extent();
519 // 1.3 Build new solids
520 aSB.SetShapes(aSFS1);
522 iErr=aSB.ErrorStatus();
524 myErrorStatus=30; // SolidBuilder failed
528 const TopTools_ListOfShape& aLSR=aSB.Areas();
530 // 1.4 Collect resulting solids and theirs set of faces
531 aIt.Initialize(aLSR);
532 for (; aIt.More(); aIt.Next()) {
533 const TopoDS_Shape& aSR=aIt.Value();
536 aExp.Init(aSR, TopAbs_FACE);
537 for (; aExp.More(); aExp.Next()) {
538 const TopoDS_Shape& aF=aExp.Current();
541 aMSS.Bind(aSR, aSSi);
545 if (myImages.HasImage(aS)) {
546 myImages.Add(aS, aLSR);
549 myImages.Bind(aS, aLSR);
551 } // for (i=1; i<=aNbS; ++i) {
552 //modified by NIZNHY-PKV Wed Dec 6 17:07:47 2006f
555 // 2. Find same domain solids for non-interferred solids
556 aNbS=aDS.NumberOfShapesOfTheObject();
557 for (i=1; i<=aNbS; ++i) {
558 const TopoDS_Shape& aS=aDS.Shape(i);
559 if (aS.ShapeType()!=TopAbs_SOLID) {
562 if (!aMFence.Add(aS)) {
565 if(myImages.HasImage(aS)) {
570 aSSi.Add(aS, TopAbs_FACE);
572 aItSS.Initialize(aMSS);
573 for (; aItSS.More(); aItSS.Next()) {
574 const TopoDS_Shape& aSR=aItSS.Key();
575 const GEOMAlgo_ShapeSet& aSSR=aItSS.Value();
576 if (aSSi.Contains(aSSR)) {
577 myImages.Bind(aS, aSR);
581 } //for (i=1; i<=aNbS; ++i)
583 //modified by NIZNHY-PKV Wed Dec 6 17:07:55 2006t
585 //=======================================================================
586 //function :FillInternalShapes
588 //=======================================================================
589 void GEOMAlgo_Builder::FillInternalShapes()
593 const NMTDS_ShapesDataStructure& aDS=*myPaveFiller->DS();
594 NMTTools_PaveFiller* pPF=myPaveFiller;
595 IntTools_Context& aCtx= pPF->ChangeContext();
597 //Standard_Boolean bHasImage;
598 Standard_Integer i, j, jT, aNbS, aNbSI, aNbSx, aNbSd;
599 TopAbs_ShapeEnum aType, aT[]={ TopAbs_VERTEX, TopAbs_EDGE };
601 TopTools_ListIteratorOfListOfShape aIt, aIt1;
602 TopTools_IndexedDataMapOfShapeListOfShape aMSx;
603 TopTools_IndexedMapOfShape aMx;
604 TopTools_MapOfShape aMSI, aMFence, aMSOr;
605 TopTools_MapIteratorOfMapOfShape aItM;
606 TopTools_ListOfShape aLSI, aLSd;
607 TopoDS_Iterator aItS;
610 // 1. Shapes to process
612 // 1.1 Shapes from pure arguments aMSI
613 // 1.1.1 vertex, edge
614 for (i=0; i<2; ++i) {
615 jT=(Standard_Integer)aT[i];
616 const TopTools_ListOfShape &aLS=myShapes1[jT];
618 for (; aIt.More(); aIt.Next()) {
619 const TopoDS_Shape& aS=aIt.Value();
620 if (aMFence.Add(aS)) {
627 jT=(Standard_Integer)TopAbs_WIRE;
628 const TopTools_ListOfShape &aLW=myShapes1[jT];
630 for (; aIt.More(); aIt.Next()) {
631 const TopoDS_Shape& aW=aIt.Value();
633 for (; aItS.More(); aItS.Next()) {
634 const TopoDS_Shape& aE=aItS.Value();
635 if (aMFence.Add(aE)) {
641 // 1.1.3 theirs images/sources
642 aIt1.Initialize(aLSI);
643 for (; aIt1.More(); aIt1.Next()) {
644 const TopoDS_Shape& aS=aIt1.Value();
645 if (myImages.HasImage(aS)) {
646 const TopTools_ListOfShape &aLSp=myImages.Image(aS);
647 aIt.Initialize(aLSp);
648 for (; aIt.More(); aIt.Next()) {
649 const TopoDS_Shape& aSI=aIt.Value();
660 // 2. Internal vertices, edges from source solids
664 aNbS=aDS.NumberOfShapesOfTheObject();
665 for (i=1; i<=aNbS; ++i) {
666 const TopoDS_Shape& aS=aDS.Shape(i);
667 aType=aS.ShapeType();
668 if (aType==TopAbs_SOLID) {
671 OwnInternalShapes(aS, aMx);
674 for (j=1; j<=aNbSx; ++j) {
675 const TopoDS_Shape& aSI=aMx(j);
676 if (myImages.HasImage(aSI)) {
677 const TopTools_ListOfShape &aLSp=myImages.Image(aSI);
678 aIt.Initialize(aLSp);
679 for (; aIt.More(); aIt.Next()) {
680 const TopoDS_Shape& aSp=aIt.Value();
689 // build aux map from splits of solids
690 if (myImages.HasImage(aS)) {
691 const TopTools_ListOfShape &aLSp=myImages.Image(aS);
692 aIt.Initialize(aLSp);
693 for (; aIt.More(); aIt.Next()) {
694 const TopoDS_Shape& aSp=aIt.Value();
695 if (aMFence.Add(aSp)) {
696 TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
697 TopExp::MapShapesAndAncestors(aSp, TopAbs_VERTEX, TopAbs_FACE, aMSx);
698 TopExp::MapShapesAndAncestors(aSp, TopAbs_EDGE , TopAbs_FACE, aMSx);
704 if (aMFence.Add(aS)) {
705 TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_EDGE, aMSx);
706 TopExp::MapShapesAndAncestors(aS, TopAbs_VERTEX, TopAbs_FACE, aMSx);
707 TopExp::MapShapesAndAncestors(aS, TopAbs_EDGE , TopAbs_FACE, aMSx);
712 }//if (aType==TopAbs_SOLID)
717 // 3. Some shapes of aMSI can be already tied with faces of
719 aItM.Initialize(aMSI);
720 for (; aItM.More(); aItM.Next()) {
721 const TopoDS_Shape& aSI=aItM.Key();
722 if (aMSx.Contains(aSI)) {
723 const TopTools_ListOfShape &aLSx=aMSx.FindFromKey(aSI);
737 // 5 Settle internal vertices and edges into solids
739 aIt.Initialize(aLSd);
740 for (; aIt.More(); aIt.Next()) {
741 TopoDS_Solid aSd=TopoDS::Solid(aIt.Value());
743 aItM.Initialize(aMSI);
744 for (; aItM.More(); aItM.Next()) {
745 TopoDS_Shape aSI=aItM.Key();
746 aSI.Orientation(TopAbs_INTERNAL);
748 aState=GEOMAlgo_Tools3D::ComputeStateByOnePoint(aSI, aSd, 1.e-11, aCtx);
749 if (aState==TopAbs_IN) {
751 if(aMSOr.Contains(aSd)) {
756 aItS.Initialize(aSd);
757 for (; aItS.More(); aItS.Next()) {
758 const TopoDS_Shape& aSh=aItS.Value();
764 myImages.Bind(aSd, aSdx);
773 } //if (aState==TopAbs_IN) {
774 }// for (; aItM.More(); aItM.Next()) {
775 }//for (; aIt1.More(); aIt1.Next()) {
777 //=======================================================================
778 //function : OwnInternalShapes
780 //=======================================================================
781 void OwnInternalShapes(const TopoDS_Shape& theS,
782 TopTools_IndexedMapOfShape& theMx)
786 aIt.Initialize(theS);
787 for (; aIt.More(); aIt.Next()) {
788 const TopoDS_Shape& aSx=aIt.Value();
789 if (aSx.ShapeType()!=TopAbs_SHELL) {
796 // 30 - SolidBuilder failed