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);
}
//
// 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()) {
}
//
// DMEF: map edge of CSF - faces of CSF
- TopTools_IndexedDataMapOfShapeListOfShape DMEF;
TopExp::MapShapesAndAncestors(CSF, TopAbs_EDGE, TopAbs_FACE, DMEF);
//
// Fill
}
}//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);
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);
//