MPV: fix for nug IPAL13251

"Mandriva64 porting: SIGSEGV during partition"

myDS->Shape and myDS->GetShape methods is very dangerous to use in the equations like the next:

const TopoDS_Face& aFace = TopoDS::Faces(myDS->Shape(anIndex));

because this reference can be invalid after the next command execution:

myDS->InsertShapeAndAncestorsSuccessors(...)

This command some times deletes old shapes from internal array to make bigger array.
This commit is contained in:
mpv 2006-10-03 08:52:10 +00:00
parent f04efe4ef1
commit e47799d70d
6 changed files with 46 additions and 47 deletions

View File

@ -137,14 +137,14 @@
aNb=myDS->NumberOfShapesOfTheObject(); aNb=myDS->NumberOfShapesOfTheObject();
// //
for (i=1; i<=aNb; i++) { for (i=1; i<=aNb; i++) {
const TopoDS_Shape& aF=myDS->Shape(i); const TopoDS_Shape aF=myDS->Shape(i);
if (aF.ShapeType()==TopAbs_FACE) { if (aF.ShapeType()==TopAbs_FACE) {
TopExp::MapShapesAndAncestors (aF, TopAbs_EDGE, TopAbs_FACE, aMEF); TopExp::MapShapesAndAncestors (aF, TopAbs_EDGE, TopAbs_FACE, aMEF);
} }
} }
// //
for (i=1; i<=aNb; i++) { for (i=1; i<=aNb; i++) {
const TopoDS_Shape& aS=myDS->Shape(i); const TopoDS_Shape aS=myDS->Shape(i);
if (aS.ShapeType()==TopAbs_EDGE) { if (aS.ShapeType()==TopAbs_EDGE) {
const TopoDS_Edge& aE=TopoDS::Edge(aS); const TopoDS_Edge& aE=TopoDS::Edge(aS);
@ -306,8 +306,8 @@
// Clear aPaveSet, aSplitEdges // Clear aPaveSet, aSplitEdges
aPaveSet.ChangeSet().Clear(); aPaveSet.ChangeSet().Clear();
// //
const TopoDS_Edge& aDE=TopoDS::Edge(myDS->Shape(nED)); const TopoDS_Edge aDE=TopoDS::Edge(myDS->Shape(nED));
const TopoDS_Face& aDF=TopoDS::Face(myDS->Shape(nFD)); const TopoDS_Face aDF=TopoDS::Face(myDS->Shape(nFD));
// //
// 2D Curve of degenerated edge on the face aDF // 2D Curve of degenerated edge on the face aDF
Handle(Geom2d_Curve) aC2DDE=BRep_Tool::CurveOnSurface(aDE, aDF, aTD1, aTD2); Handle(Geom2d_Curve) aC2DDE=BRep_Tool::CurveOnSurface(aDE, aDF, aTD1, aTD2);
@ -333,7 +333,7 @@
for (; anIt.More(); anIt.Next()) { for (; anIt.More(); anIt.Next()) {
const BOPTools_PaveBlock& aPB=anIt.Value(); const BOPTools_PaveBlock& aPB=anIt.Value();
nE=aPB.Edge(); nE=aPB.Edge();
const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));
Handle(Geom2d_Curve) aC2D=BRep_Tool::CurveOnSurface(aE, aDF, aT1, aT2); Handle(Geom2d_Curve) aC2D=BRep_Tool::CurveOnSurface(aE, aDF, aT1, aT2);
// //
@ -427,8 +427,8 @@
TopoDS_Edge aE, aESplit; TopoDS_Edge aE, aESplit;
TopoDS_Vertex aV1, aV2; TopoDS_Vertex aV1, aV2;
const TopoDS_Edge& aDE=TopoDS::Edge(myDS->Shape(nED)); const TopoDS_Edge aDE=TopoDS::Edge(myDS->Shape(nED));
const TopoDS_Face& aDF=TopoDS::Face(myDS->Shape(nFD)); const TopoDS_Face aDF=TopoDS::Face(myDS->Shape(nFD));
BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aSplitEdges); BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aSplitEdges);

View File

@ -78,8 +78,8 @@
aWith=n2; aWith=n2;
SortTypes(aWhat, aWith); SortTypes(aWhat, aWith);
if (!bJustAddInterference) { if (!bJustAddInterference) {
const TopoDS_Shape& aS1=myDS->GetShape(aWhat); const TopoDS_Shape aS1=myDS->GetShape(aWhat);
const TopoDS_Shape& aS2=myDS->GetShape(aWith); const TopoDS_Shape aS2=myDS->GetShape(aWith);
// //
const TopoDS_Vertex& aV1=TopoDS::Vertex(aS1); const TopoDS_Vertex& aV1=TopoDS::Vertex(aS1);
const TopoDS_Vertex& aV2=TopoDS::Vertex(aS2); const TopoDS_Vertex& aV2=TopoDS::Vertex(aS2);
@ -127,7 +127,7 @@
aNbV=aChain.Extent(); aNbV=aChain.Extent();
for (j=1; j<=aNbV; ++j) { for (j=1; j<=aNbV; ++j) {
aIdV=aChain(j); aIdV=aChain(j);
const TopoDS_Shape& aV=myDS->Shape(aIdV); const TopoDS_Shape aV=myDS->Shape(aIdV);
if (!aM.Contains(aV)) { if (!aM.Contains(aV)) {
aM.Add(aV); aM.Add(aV);
aLV.Append(aV); aLV.Append(aV);

View File

@ -145,8 +145,8 @@ static
continue; continue;
} }
// //
const TopoDS_Edge& aE1=TopoDS::Edge(myDS->Shape(nE1)); const TopoDS_Edge aE1=TopoDS::Edge(myDS->Shape(nE1));
const TopoDS_Edge& aE2=TopoDS::Edge(myDS->Shape(nE2)); const TopoDS_Edge aE2=TopoDS::Edge(myDS->Shape(nE2));
// //
if (BRep_Tool::Degenerated(aE1) || BRep_Tool::Degenerated(aE2)){ if (BRep_Tool::Degenerated(aE1) || BRep_Tool::Degenerated(aE2)){
continue; continue;
@ -468,7 +468,7 @@ static
aNbEdges=aME.Extent(); aNbEdges=aME.Extent();
for (j=1; j<=aNbEdges; ++j) { for (j=1; j<=aNbEdges; ++j) {
nE=aME(j); nE=aME(j);
const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));
// //
aFlag=myContext.ComputeVE (aNewVertex, aE, aT); aFlag=myContext.ComputeVE (aNewVertex, aE, aT);
// //
@ -775,10 +775,10 @@ static
Standard_Real d1121, d1122, d1222, d1221, aTolSum, aCoeff=1.05; Standard_Real d1121, d1122, d1222, d1221, aTolSum, aCoeff=1.05;
gp_Pnt aP11, aP12, aP21, aP22; gp_Pnt aP11, aP12, aP21, aP22;
const TopoDS_Vertex& aV11=TopoDS::Vertex(myDS->Shape(aPB1.Pave1().Index())); const TopoDS_Vertex aV11=TopoDS::Vertex(myDS->Shape(aPB1.Pave1().Index()));
const TopoDS_Vertex& aV12=TopoDS::Vertex(myDS->Shape(aPB1.Pave2().Index())); const TopoDS_Vertex aV12=TopoDS::Vertex(myDS->Shape(aPB1.Pave2().Index()));
const TopoDS_Vertex& aV21=TopoDS::Vertex(myDS->Shape(aPB2.Pave1().Index())); const TopoDS_Vertex aV21=TopoDS::Vertex(myDS->Shape(aPB2.Pave1().Index()));
const TopoDS_Vertex& aV22=TopoDS::Vertex(myDS->Shape(aPB2.Pave2().Index())); const TopoDS_Vertex aV22=TopoDS::Vertex(myDS->Shape(aPB2.Pave2().Index()));
aTolV11=BRep_Tool::Tolerance(aV11); aTolV11=BRep_Tool::Tolerance(aV11);
aTolV12=BRep_Tool::Tolerance(aV12); aTolV12=BRep_Tool::Tolerance(aV12);

View File

@ -138,13 +138,13 @@ static
continue; continue;
} }
// Edge // Edge
const TopoDS_Edge& aE=TopoDS::Edge(myDS->GetShape(nE)); const TopoDS_Edge aE=TopoDS::Edge(myDS->GetShape(nE));
if (BRep_Tool::Degenerated(aE)){ if (BRep_Tool::Degenerated(aE)){
continue; continue;
} }
aTolE=BRep_Tool::Tolerance(aE); aTolE=BRep_Tool::Tolerance(aE);
// Face // Face
const TopoDS_Face& aF=TopoDS::Face(myDS->GetShape(nF)); const TopoDS_Face aF=TopoDS::Face(myDS->GetShape(nF));
aTolF=BRep_Tool::Tolerance(aF); aTolF=BRep_Tool::Tolerance(aF);
const Bnd_Box& aBBF=myDS->GetBoundingBox(nF); const Bnd_Box& aBBF=myDS->GetBoundingBox(nF);
// //
@ -492,7 +492,7 @@ static
aNbEdges=aME.Extent(); aNbEdges=aME.Extent();
for (j=1; j<=aNbEdges; ++j) { for (j=1; j<=aNbEdges; ++j) {
nE=aME(j); nE=aME(j);
const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));
// //
aFlag=myContext.ComputeVE (aNewVertex, aE, aT); aFlag=myContext.ComputeVE (aNewVertex, aE, aT);
// //
@ -575,7 +575,7 @@ static
aNbV=aMVF.Extent(); aNbV=aMVF.Extent();
for (i=1; i<=aNbV; ++i) { for (i=1; i<=aNbV; ++i) {
nVF=aMVF(i); nVF=aMVF(i);
const TopoDS_Vertex& aVF=TopoDS::Vertex(myDS->Shape(nVF)); const TopoDS_Vertex aVF=TopoDS::Vertex(myDS->Shape(nVF));
iFlag=IntTools_Tools::ComputeVV(aNewVertex, aVF); iFlag=IntTools_Tools::ComputeVV(aNewVertex, aVF);
if (!iFlag) { if (!iFlag) {
return nVF; return nVF;

View File

@ -165,8 +165,8 @@ static
continue; continue;
} }
// //
const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1));
const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2));
// //
// FF // FF
bToApproxC3d = mySectionAttribute.Approximation(); bToApproxC3d = mySectionAttribute.Approximation();
@ -254,8 +254,8 @@ static
// //
// Faces // Faces
aFFi.Indices(nF1, nF2); aFFi.Indices(nF1, nF2);
const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1));
const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2));
// //
BOPTools_ListOfPaveBlock aLPB, aLPBC; BOPTools_ListOfPaveBlock aLPB, aLPBC;
// //
@ -377,8 +377,8 @@ static
// Make Section Edge // Make Section Edge
TopoDS_Edge aES; TopoDS_Edge aES;
// //
const TopoDS_Vertex& aV1=TopoDS::Vertex(myDS->Shape(nV1)); const TopoDS_Vertex aV1=TopoDS::Vertex(myDS->Shape(nV1));
const TopoDS_Vertex& aV2=TopoDS::Vertex(myDS->Shape(nV2)); const TopoDS_Vertex aV2=TopoDS::Vertex(myDS->Shape(nV2));
// //
BOPTools_Tools::MakeSectEdge (aIC, aV1, aT1, aV2, aT2, aES); BOPTools_Tools::MakeSectEdge (aIC, aV1, aT1, aV2, aT2, aES);
// //
@ -489,13 +489,13 @@ static
for (j=1; j<=aNbSE; ++j) { for (j=1; j<=aNbSE; ++j) {
const BOPTools_PaveBlock& aPBSE=aMEPB(j); const BOPTools_PaveBlock& aPBSE=aMEPB(j);
nV1=aPBSE.Pave1().Index(); nV1=aPBSE.Pave1().Index();
const TopoDS_Shape& aV1=myDS->Shape(nV1); const TopoDS_Shape aV1=myDS->Shape(nV1);
if (aV1.IsSame(aV)) { if (aV1.IsSame(aV)) {
aMNewOld.Add(i, nV1); aMNewOld.Add(i, nV1);
break; break;
} }
nV2=aPBSE.Pave2().Index(); nV2=aPBSE.Pave2().Index();
const TopoDS_Shape& aV2=myDS->Shape(nV2); const TopoDS_Shape aV2=myDS->Shape(nV2);
if (aV2.IsSame(aV)) { if (aV2.IsSame(aV)) {
aMNewOld.Add(i, nV2); aMNewOld.Add(i, nV2);
break; break;
@ -546,9 +546,9 @@ static
BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq;
// //
nV1=aPBSE.Pave1().Index(); nV1=aPBSE.Pave1().Index();
const TopoDS_Shape& aV1=myDS->Shape(nV1); const TopoDS_Shape aV1=myDS->Shape(nV1);
nV2=aPBSE.Pave2().Index(); nV2=aPBSE.Pave2().Index();
const TopoDS_Shape& aV2=myDS->Shape(nV2); const TopoDS_Shape aV2=myDS->Shape(nV2);
// //
anASSeq.SetNewSuccessor(nV1); anASSeq.SetNewSuccessor(nV1);
anASSeq.SetNewOrientation(aV1.Orientation()); anASSeq.SetNewOrientation(aV1.Orientation());
@ -580,8 +580,8 @@ static
BOPTools_PaveBlock aPB=aIt.Value(); BOPTools_PaveBlock aPB=aIt.Value();
// //
////modified by NIZNHY-PKV Thu Jan 26 10:16:36 2006f ////modified by NIZNHY-PKV Thu Jan 26 10:16:36 2006f
const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1));
const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2));
////modified by NIZNHY-PKV Thu Jan 26 10:16:39 2006t ////modified by NIZNHY-PKV Thu Jan 26 10:16:39 2006t
// //
if (aCBAPI.IsCommonBlock(aPB)) { if (aCBAPI.IsCommonBlock(aPB)) {
@ -617,13 +617,13 @@ static
aT1=aPave1.Param(); aT1=aPave1.Param();
mV1=aPave1.Index(); // index in tDS mV1=aPave1.Index(); // index in tDS
nV1=aMNewOld.FindFromKey(mV1); // index in myDS nV1=aMNewOld.FindFromKey(mV1); // index in myDS
const TopoDS_Shape& aV1=myDS->Shape(nV1); const TopoDS_Shape aV1=myDS->Shape(nV1);
// //
const BOPTools_Pave& aPave2=aPB.Pave2(); const BOPTools_Pave& aPave2=aPB.Pave2();
aT2=aPave2.Param(); aT2=aPave2.Param();
mV2=aPave2.Index(); mV2=aPave2.Index();
nV2=aMNewOld.FindFromKey(mV2); nV2=aMNewOld.FindFromKey(mV2);
const TopoDS_Shape& aV2=myDS->Shape(nV2); const TopoDS_Shape aV2=myDS->Shape(nV2);
// //
if (!aMNewOld.Contains(mE)) { if (!aMNewOld.Contains(mE)) {
// add new SE to the myDS // add new SE to the myDS
@ -684,8 +684,8 @@ static
BOPTools_SSInterference& aFF=aFFs(i); BOPTools_SSInterference& aFF=aFFs(i);
aFF.Indices(nF1, nF2); aFF.Indices(nF1, nF2);
// //
const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); const TopoDS_Face aF1=TopoDS::Face(myDS->Shape(nF1));
const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); const TopoDS_Face aF2=TopoDS::Face(myDS->Shape(nF2));
// //
aF1FWD=aF1; aF1FWD=aF1;
aF1FWD.Orientation(TopAbs_FORWARD); aF1FWD.Orientation(TopAbs_FORWARD);
@ -699,7 +699,7 @@ static
for (; anIt.More(); anIt.Next()) { for (; anIt.More(); anIt.Next()) {
const BOPTools_PaveBlock& aPB=anIt.Value(); const BOPTools_PaveBlock& aPB=anIt.Value();
nE=aPB.Edge(); nE=aPB.Edge();
const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));
BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD);
BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD);
@ -768,7 +768,7 @@ static
// //
//Edge //Edge
nE2=aPBR.Edge(); nE2=aPBR.Edge();
const TopoDS_Edge& aE2=TopoDS::Edge(myDS->GetShape(nE2)); const TopoDS_Edge aE2=TopoDS::Edge(myDS->GetShape(nE2));
// VE // VE
iVM=myContext.ComputeVE(aVM, aE2, aTmp); iVM=myContext.ComputeVE(aVM, aE2, aTmp);
// //
@ -799,8 +799,8 @@ static
aFFi.Indices(nF1, nF2); aFFi.Indices(nF1, nF2);
aTolR3D=aFFi.TolR3D(); aTolR3D=aFFi.TolR3D();
// //
const TopoDS_Face& aF1=TopoDS::Face(myDS->GetShape(nF1)); const TopoDS_Face aF1=TopoDS::Face(myDS->GetShape(nF1));
const TopoDS_Face& aF2=TopoDS::Face(myDS->GetShape(nF2)); const TopoDS_Face aF2=TopoDS::Face(myDS->GetShape(nF2));
// //
bVF=myContext.IsValidPointForFaces (aP1, aF1, aF2, aTolR3D); bVF=myContext.IsValidPointForFaces (aP1, aF1, aF2, aTolR3D);
if (bVF) { if (bVF) {
@ -850,14 +850,13 @@ static
TColStd_ListOfInteger& aTVs=aBC.TechnoVertices(); TColStd_ListOfInteger& aTVs=aBC.TechnoVertices();
aTVs.Append(nV); aTVs.Append(nV);
} }
if (bFound1 && !bFound2) { if (bFound1 && !bFound2) {
nV=aPave1.Index(); nV=aPave1.Index();
aPave.SetIndex(nV); aPave.SetIndex(nV);
aPave.SetParam(aT); aPave.SetParam(aT);
aFFiPS.Append(aPave); aFFiPS.Append(aPave);
// //
const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV));
BOPTools_Tools::UpdateVertex (aIC, aT, aV); BOPTools_Tools::UpdateVertex (aIC, aT, aV);
} }
@ -867,7 +866,7 @@ static
aPave.SetParam(aT); aPave.SetParam(aT);
aCPS.Append(aPave); aCPS.Append(aPave);
// //
const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV));
BOPTools_Tools::UpdateVertex (aIC, aT, aV); BOPTools_Tools::UpdateVertex (aIC, aT, aV);
} }
} }
@ -888,7 +887,7 @@ static
for (; anIt.More(); anIt.Next()) { for (; anIt.More(); anIt.Next()) {
const BOPTools_Pave& aPC=anIt.Value(); const BOPTools_Pave& aPC=anIt.Value();
nV=aPC.Index(); nV=aPC.Index();
const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV));
bIsVertex=IntTools_Tools::IsVertex (aP, aTolPV, aV); bIsVertex=IntTools_Tools::IsVertex (aP, aTolPV, aV);
if (bIsVertex) { if (bIsVertex) {
aPave=aPC; aPave=aPC;
@ -974,7 +973,7 @@ static
const BOPTools_Pave& aPave=anIt.Value(); const BOPTools_Pave& aPave=anIt.Value();
// //
nV=aPave.Index(); nV=aPave.Index();
const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); const TopoDS_Vertex aV=TopoDS::Vertex(myDS->Shape(nV));
// //
Bnd_Box aBBV; Bnd_Box aBBV;
BRepBndLib::Add(aV, aBBV); BRepBndLib::Add(aV, aBBV);

View File

@ -236,7 +236,7 @@
for(i=1; i<=aNbF; ++i) { for(i=1; i<=aNbF; ++i) {
nF=aMF(i); nF=aMF(i);
iRankF=myDS->Rank(nF); iRankF=myDS->Rank(nF);
const TopoDS_Shape& aF=myDS->Shape(nF); const TopoDS_Shape aF=myDS->Shape(nF);
aExp.Init(aF, TopAbs_EDGE); aExp.Init(aF, TopAbs_EDGE);
for(; aExp.More(); aExp.Next()) { for(; aExp.More(); aExp.Next()) {
aE=TopoDS::Edge(aExp.Current()); aE=TopoDS::Edge(aExp.Current());