From: jfa Date: Mon, 17 Jan 2005 11:54:03 +0000 (+0000) Subject: PAL5249: Problem in Partition algorithm. Fix done by PKV. X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=06137bb35d11d852c43542631dca9c0725acaefa;p=modules%2Fgeom.git PAL5249: Problem in Partition algorithm. Fix done by PKV. --- diff --git a/src/NMTAlgo/NMTAlgo_Splitter1.cxx b/src/NMTAlgo/NMTAlgo_Splitter1.cxx index 260ac90ec..36d711377 100644 --- a/src/NMTAlgo/NMTAlgo_Splitter1.cxx +++ b/src/NMTAlgo/NMTAlgo_Splitter1.cxx @@ -285,12 +285,20 @@ // aNbSd=aMSd.Extent(); if (!aNbSd) { + //modified by NIZNHY-PKV Thu Dec 23 15:07:46 2004 f + Standard_Boolean bFound; + //modified by NIZNHY-PKV Thu Dec 23 15:07:49 2004 t TopoDS_Shape aSd; // const TopoDS_Shape& aFC=myImageShape.Image(aS).First(); - NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd); - // - aMSd.Add(aSd); + //modified by NIZNHY-PKV Thu Dec 23 15:08:17 2004 f + //NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd); + //aMSd.Add(aSd); + bFound=NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd); + if (!aSd.IsNull()) { + aMSd.Add(aSd); + } + //modified by NIZNHY-PKV Thu Dec 23 15:09:02 2004 t } aMCS.Add(aS, aMSd); } //for ( ;aItS.More(); aItS.Next()) diff --git a/src/NMTAlgo/NMTAlgo_Splitter_1.cxx b/src/NMTAlgo/NMTAlgo_Splitter_1.cxx index 2c057d7f0..8461a444b 100644 --- a/src/NMTAlgo/NMTAlgo_Splitter_1.cxx +++ b/src/NMTAlgo/NMTAlgo_Splitter_1.cxx @@ -106,7 +106,13 @@ if (myClosedShapes.Contains(aS)) { // // internal faces compound + //modified by NIZNHY-PKV Thu Dec 23 16:34:05 2004 f + Standard_Integer aNbIF; + // + aNbIF=myInternalFaces.Extent(); + //modified by NIZNHY-PKV Thu Dec 23 16:34:07 2004 t TopoDS_Shape aIFC=FindFacesInside(aS, Standard_True); + aNbIF=myInternalFaces.Extent(); aShellMaker.AddSectionFaces(aIFC); } // @@ -248,15 +254,15 @@ // get data for internal faces search // =================================== // - // compound of split faces of theShape - const TopoDS_Shape& CSF = myImageShape.Image(theShape).First(); - // TopTools_MapOfShape MSE, MFP; TopTools_DataMapOfShapeListOfShape DMSEFP; + TopTools_IndexedDataMapOfShapeListOfShape DMEF; TopTools_MapIteratorOfMapOfShape itm; TopTools_ListOfShape EmptyL; TopTools_ListIteratorOfListOfShape itl; - + // + // compound of split faces of theShape + const TopoDS_Shape& CSF=myImageShape.Image(theShape).First(); // MSE filling: map of new section edges of CSF expl.Init(CSF, TopAbs_EDGE); for (; expl.More(); expl.Next()) { @@ -265,7 +271,6 @@ } // // DMEF: map edge of CSF - faces of CSF - TopTools_IndexedDataMapOfShapeListOfShape DMEF; TopExp::MapShapesAndAncestors(CSF, TopAbs_EDGE, TopAbs_FACE, DMEF); // // Fill @@ -302,75 +307,75 @@ } }//for (;itl.More(); itl.Next()) // - // add tool faces... (is absent) - // // =========================== // find faces inside theShape // =========================== Standard_Boolean skipAlreadyAdded = Standard_False; - Standard_Boolean GoodOri, inside; + Standard_Boolean GoodOri, inside, sameDom1, sameDom2, isSectionE; Standard_Real dot; + TopoDS_Face aFace1, anOrigFace, origF1, origF2; //, anOrigFace2; TopTools_ListOfShape KeepFaces; TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit; - + // // iterate on section edges, check faces of other shapes // sharing section edges and put internal faces to KeepFaces Mapit.Initialize(DMSEFP); for (; Mapit.More() ; Mapit.Next() ) { // a new edge of theShape const TopoDS_Edge& E = TopoDS::Edge (Mapit.Key()); - // an original edge of which E is a split - //const TopoDS_Edge& OrigE = TopoDS::Edge (myImagesEdges.Root(E)); - // does OrigE itself splits a face - Standard_Boolean isSectionE=IsSectionEdge(E);//(OrigE); - + // + isSectionE=IsSectionEdge(E); + // // split faces of other shapes sharing E TopTools_ListOfShape& LSF = DMSEFP.ChangeFind(E); + // itl.Initialize( LSF ); while (itl.More()) { // a split faces of other shape - TopoDS_Face aFace1 = TopoDS::Face(itl.Value()); + aFace1 = TopoDS::Face(itl.Value()); // remove aFace1 form DMSEFP and MFP LSF.Remove( itl ); // == itl.Next(); if (!MFP.Remove( aFace1 )) continue; // was not is MFP ( i.e already checked) + // // check if aFace1 was already added to 2 shells if (!All && myAddedFacesMap.Contains(aFace1) && myAddedFacesMap.Contains(aFace1.Reversed())) { skipAlreadyAdded = Standard_True; - //modified by NIZNHY-PKV Wed Feb 11 16:11:53 2004 f - //continue; - //modified by NIZNHY-PKV Wed Feb 11 16:35:48 2004 t } // // find another face which originates from the same face as aFace1: // usually aFace2 is internal if aFace1 is not and vice versa - TopoDS_Shape anOrigFace = aFace1; + anOrigFace = aFace1; if (myImagesFaces.IsImage(aFace1)){ - anOrigFace = myImagesFaces.Root(aFace1); + anOrigFace = TopoDS::Face(myImagesFaces.Root(aFace1)); } // - TopoDS_Shape aFace2; - if ( !isSectionE ) { - while (itl.More()) { - aFace2 = itl.Value(); + //modified by NIZNHY-PKV Fri Dec 24 10:59:45 2004 f + /* + TopoDS_Face aFace2; + // + if (!isSectionE) { + while (itl.More()) { //#2 + aFace2 = TopoDS::Face(itl.Value()); // - TopoDS_Shape anOrigFace2 = aFace2; + anOrigFace2 = aFace2; if (myImagesFaces.IsImage(aFace2)) { - anOrigFace2 = myImagesFaces.Root(aFace2); + anOrigFace2 = TopoDS::Face(myImagesFaces.Root(aFace2)); } // if (!MFP.Contains( aFace2 )) { LSF.Remove( itl ); continue; } - //if (anOrigFace.IsSame( myImagesFaces.Root( aFace2 ))) + // if (anOrigFace.IsSame(anOrigFace2)) { break; } itl.Next(); - } + }// while (itl.More()) { #2 + // if (itl.More()) { // aFace2 found, remove it from maps LSF.Remove( itl ); MFP.Remove(aFace2); @@ -379,94 +384,91 @@ aFace2.Nullify(); } itl.Initialize( LSF ); - } - + } // if (!isSectionE) { + */ + //modified by NIZNHY-PKV Fri Dec 24 10:59:52 2004 t + // // check that anOrigFace is not same domain with CSF faces it intersects - - const TopTools_ListOfShape& FL = DMEF.FindFromKey(E); //faces of CSF sharing E - - const TopoDS_Shape& origF1 = myImagesFaces.IsImage(FL.First()) ? - myImagesFaces.Root(FL.First()) : FL.First(); - const TopoDS_Shape& origF2 = myImagesFaces.IsImage(FL.Last()) ? - myImagesFaces.Root(FL.Last()) : FL.Last(); // - Standard_Boolean sameDom1 = anOrigFace.IsSame( origF1 ); - Standard_Boolean sameDom2 = anOrigFace.IsSame( origF2 ); - - if (!(sameDom1 || sameDom2) && HasSameDomainF( TopoDS::Face(anOrigFace) )) { - sameDom1 = IsSameDomainF( TopoDS::Face(anOrigFace), TopoDS::Face(origF1)); + //faces of CSF sharing E + // + const TopTools_ListOfShape& FL = DMEF.FindFromKey(E); + const TopoDS_Face& aFE1=TopoDS::Face(FL.First()); + const TopoDS_Face& aFE2=TopoDS::Face(FL.Last()); + // + origF1=aFE1; + if (myImagesFaces.IsImage(aFE1)) { + origF1=TopoDS::Face(myImagesFaces.Root(aFE1)); + } + origF2=aFE2; + if (myImagesFaces.IsImage(aFE2)) { + origF2=TopoDS::Face(myImagesFaces.Root(aFE2)); + } + // + sameDom1 = anOrigFace.IsSame( origF1 ); + sameDom2 = anOrigFace.IsSame( origF2 ); + // + if (!(sameDom1 || sameDom2) && HasSameDomainF(anOrigFace)) { + sameDom1 = IsSameDomainF(anOrigFace, origF1); if (origF1 == origF2) { sameDom2 = sameDom1; } - else{ - IsSameDomainF( TopoDS::Face(anOrigFace), TopoDS::Face(origF2)); - } } + // if (sameDom1 && sameDom2){ continue; } + // if (sameDom1 || sameDom2) { - inside = NMTAlgo_Loop3d::IsInside (E, - TopoDS::Face(FL.First()), - TopoDS::Face(FL.Last()), - 1, dot, GoodOri); - if (inside || (dot + Precision::Angular() >= 1.0)) + inside = NMTAlgo_Loop3d::IsInside (E, aFE1, aFE2, 1, dot, GoodOri); + if (inside || (dot + Precision::Angular() >= 1.0)) { continue; // E is convex between origF1 and origF2 or they are tangent + } } // - // keep one of found faces - + // Keep one of found faces + // //face of CSF sharing E - const TopoDS_Shape& aShapeFace = sameDom1 ? FL.Last() : FL.First(); + const TopoDS_Face& aShapeFace = sameDom1 ? aFE2 : aFE1; // analyse aFace1 state - inside = NMTAlgo_Loop3d::IsInside (E, TopoDS::Face(aShapeFace), aFace1, - 1, dot, GoodOri); -// if (inside && isSectionE) { + inside = NMTAlgo_Loop3d::IsInside (E, aShapeFace, aFace1, 1, dot, GoodOri); if (inside) { //IFV 27.08.04 // aFace1 must be tested with both adjacent faces of CSF - const TopoDS_Shape& aShapeFace2 = sameDom1 ? FL.First() : FL.Last(); + const TopoDS_Face& aShapeFace2 = sameDom1 ? aFE1 : aFE2; if (aShapeFace2 != aShapeFace){ - inside = NMTAlgo_Loop3d::IsInside (E, TopoDS::Face(aShapeFace2), aFace1, - 1, dot, GoodOri); + inside = + NMTAlgo_Loop3d::IsInside(E, aShapeFace2, aFace1, 1, dot, GoodOri); } } // // store internal face - if (inside) - KeepFaces.Append(aFace1); - + if (inside) { + KeepFaces.Append(aFace1); + } + // + //modified by NIZNHY-PKV Fri Dec 24 11:02:55 2004 f + /* else if (!aFace2.IsNull()) { if (dot + Precision::Angular() >= 1.0) { - // aFace2 state is not clear, it will be analysed alone, - // put it back to the maps - MFP.Add( aFace2 ); - LSF.Append( aFace2 ); + // aFace2 state is not clear, it will be analysed alone, put it back to the maps + MFP.Add(aFace2); + LSF.Append(aFace2); } - else - KeepFaces.Append(aFace2); + else { + KeepFaces.Append(aFace2); + } } - } - } - + */ + //modified by NIZNHY-PKV Fri Dec 24 11:03:03 2004 t + }// while (itl.More()) { + }// for (; Mapit.More() ; Mapit.Next() ) { + // // =================================================== // add not distributed faces connected with KeepFaces // =================================================== - // ultimate list of internal faces TopTools_ListOfShape KeptFaces; // - // add to MFP not split tool faces as well, they may be connected with - // tool faces interfering with theShape - /* - itm.Initialize(myMapTools); - for (; itm.More(); itm.Next() ) { - const TopoDS_Shape& aToolFace = itm.Key(); - if (!myImageShape.HasImage(aToolFace)){ - MFP.Add (aToolFace); - } - } - */ - // if (MFP.IsEmpty()) KeptFaces.Append (KeepFaces); //