mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-29 10:50:35 +05:00
Mantis issue 0020853: EDF 1394 GEOM: Partition fails between 2 faces. A patch by PKV.
This commit is contained in:
parent
882ddc2548
commit
22b9c99081
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
|
||||
// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
|
||||
//
|
||||
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||
@ -19,14 +19,12 @@
|
||||
//
|
||||
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
||||
//
|
||||
// File: NMTTools_PaveFiller_4.cxx
|
||||
// Created: Mon Dec 8 17:08:58 2003
|
||||
// Author: Peter KURNEV
|
||||
|
||||
// File: NMTTools_PaveFiller_4.cxx
|
||||
// Created: Mon Dec 8 17:08:58 2003
|
||||
// Author: Peter KURNEV
|
||||
// <pkv@irinox>
|
||||
//
|
||||
#include <NMTTools_PaveFiller.ixx>
|
||||
//
|
||||
|
||||
#include <stdio.h>
|
||||
#include <Precision.hxx>
|
||||
|
||||
@ -99,7 +97,6 @@
|
||||
#include <NMTTools_CommonBlock.hxx>
|
||||
#include <NMTTools_ListIteratorOfListOfCommonBlock.hxx>
|
||||
|
||||
|
||||
#include <TColStd_ListOfInteger.hxx>
|
||||
#include <TColStd_ListIteratorOfListOfInteger.hxx>
|
||||
#include <BRepBndLib.hxx>
|
||||
@ -108,7 +105,6 @@
|
||||
#include <TColStd_MapOfInteger.hxx>
|
||||
#include <TColStd_MapIteratorOfMapOfInteger.hxx>
|
||||
|
||||
|
||||
static
|
||||
void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI,
|
||||
TopTools_DataMapOfShapeListOfShape& myImages,
|
||||
@ -118,15 +114,16 @@ static
|
||||
void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
TopoDS_Vertex& aNewVertex);
|
||||
|
||||
|
||||
static
|
||||
void VertexParameters(const IntTools_CommonPrt& aCPart,
|
||||
Standard_Real& aT1,
|
||||
Standard_Real& aT2);
|
||||
|
||||
static
|
||||
Standard_Boolean IsOnPave(const Standard_Real& aT1,
|
||||
const IntTools_Range& aRange,
|
||||
const Standard_Real& aTolerance);
|
||||
|
||||
static
|
||||
void EECommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB);
|
||||
|
||||
@ -135,6 +132,7 @@ static
|
||||
const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
|
||||
BOPTools_IMapOfPaveBlock& aProcessedBlocks,
|
||||
BOPTools_IMapOfPaveBlock& aChain);
|
||||
|
||||
static
|
||||
void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
|
||||
NMTTools_ListOfCommonBlock& aLCB);
|
||||
@ -143,7 +141,7 @@ static
|
||||
// function: PerformEE
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::PerformEE()
|
||||
void NMTTools_PaveFiller::PerformEE()
|
||||
{
|
||||
myIsDone=Standard_False;
|
||||
//
|
||||
@ -187,7 +185,6 @@ static
|
||||
//
|
||||
const TopoDS_Edge aE1=TopoDS::Edge(myDS->Shape(nE1));//mpv
|
||||
const TopoDS_Edge aE2=TopoDS::Edge(myDS->Shape(nE2));//mpv
|
||||
|
||||
//
|
||||
if (BRep_Tool::Degenerated(aE1) || BRep_Tool::Degenerated(aE2)){
|
||||
continue;
|
||||
@ -203,7 +200,7 @@ static
|
||||
// Contribution of Samtech www.samcef.com BEGIN
|
||||
aNbLPB1=aLPB1.Extent();
|
||||
aNbLPB2=aLPB2.Extent();
|
||||
|
||||
//
|
||||
//if (aE1.IsSame(aE2) && aNbLPB1==1 && aNbLPB2==1) {
|
||||
// continue;
|
||||
//}
|
||||
@ -219,7 +216,7 @@ static
|
||||
for (anIt2.Initialize(aLPB2); anIt2.More(); anIt2.Next()) {
|
||||
BOPTools_PaveBlock& aPB2=anIt2.Value();
|
||||
const IntTools_ShrunkRange& aShrunkRange2=aPB2.ShrunkRange();
|
||||
|
||||
//
|
||||
const IntTools_Range& aSR2=aShrunkRange2.ShrunkRange();
|
||||
const Bnd_Box& aBB2=aShrunkRange2.BndBox();
|
||||
//
|
||||
@ -244,7 +241,7 @@ static
|
||||
//
|
||||
aEE.SetRange1(anewSR1);
|
||||
aEE.SetRange2(anewSR2);
|
||||
|
||||
//
|
||||
aEE.Perform();
|
||||
//
|
||||
anIndexIn=0;
|
||||
@ -284,6 +281,9 @@ static
|
||||
aR1 = (aEE.Order()) ? anewSR2 : anewSR1;
|
||||
aR2 = (aEE.Order()) ? anewSR1 : anewSR2;
|
||||
//
|
||||
//modified by NIZNHY-PKV Mon Jun 07 11:01:40 2010f
|
||||
aTol=0.8*aTol;
|
||||
//modified by NIZNHY-PKV Mon Jun 07 11:01:43 2010t
|
||||
bIsOnPave1=IsOnPave(aT1, aR1, aTol);
|
||||
bIsOnPave2=IsOnPave(aT2, aR2, aTol);
|
||||
//
|
||||
@ -406,11 +406,6 @@ static
|
||||
} // for (; anIt1.More(); anIt1.Next())
|
||||
}// for (; myDSIt.More(); myDSIt.Next())
|
||||
//
|
||||
//modified by NIZNHY-PKV Thu Mar 19 14:13:34 2009f
|
||||
//
|
||||
//EENewVertices (aMapVI);
|
||||
//EECommonBlocks(aMapCB);
|
||||
|
||||
{
|
||||
NMTTools_ListOfCommonBlock aLCB;
|
||||
//
|
||||
@ -420,18 +415,17 @@ static
|
||||
TreatPaveBlocks(aLCB);
|
||||
ReplaceCommonBlocks(aLCB);
|
||||
}
|
||||
//modified by NIZNHY-PKV Thu Mar 19 14:13:42 2009t
|
||||
//
|
||||
PerformVF1();
|
||||
//
|
||||
myIsDone=Standard_True;
|
||||
}
|
||||
//modified by NIZNHY-PKV Thu Mar 19 14:13:52 2009f
|
||||
|
||||
//=======================================================================
|
||||
// function:TreatPaveBlocks
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::TreatPaveBlocks (NMTTools_ListOfCommonBlock& theLCB)
|
||||
void NMTTools_PaveFiller::TreatPaveBlocks (NMTTools_ListOfCommonBlock& theLCB)
|
||||
{
|
||||
Standard_Boolean bFound;
|
||||
Standard_Integer nE, nV, nVp, iFlag;
|
||||
@ -506,23 +500,24 @@ static
|
||||
}//for (; anItLPB.More(); anItLPB.Next()) {
|
||||
}
|
||||
}
|
||||
//modified by NIZNHY-PKV Thu Mar 19 14:14:13 2009t
|
||||
|
||||
//=======================================================================
|
||||
// function:EECommonBlocks
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::EECommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB)
|
||||
void NMTTools_PaveFiller::EECommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB)
|
||||
{
|
||||
NMTTools_ListOfCommonBlock aLCB;
|
||||
//
|
||||
FindChains(aMapCB, aLCB);
|
||||
ReplaceCommonBlocks(aLCB);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function:EENewVertices
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::EENewVertices (const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI)
|
||||
void NMTTools_PaveFiller::EENewVertices (const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI)
|
||||
{
|
||||
Standard_Integer aNb, aNbVSD, nVnew, nIEE, nE[2], j, iFlag;
|
||||
Standard_Real aT;
|
||||
@ -603,8 +598,8 @@ static
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI,
|
||||
TopTools_DataMapOfShapeListOfShape& myImages,
|
||||
TopTools_DataMapOfShapeShape& myOrigins)
|
||||
TopTools_DataMapOfShapeListOfShape& myImages,
|
||||
TopTools_DataMapOfShapeShape& myOrigins)
|
||||
{
|
||||
Standard_Integer j, i, aNbV, aNbVSD;
|
||||
Standard_Real aTol;
|
||||
@ -775,7 +770,7 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
|
||||
//=======================================================================
|
||||
//function : MakeNewVertex
|
||||
//purpose :
|
||||
@ -822,12 +817,13 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
//
|
||||
aBB.MakeVertex (aNewVertex, aPGC, aDmax);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function:EENewVertices
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::EENewVertices (const TopoDS_Vertex& aNewVertex,
|
||||
const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI)
|
||||
void NMTTools_PaveFiller::EENewVertices (const TopoDS_Vertex& aNewVertex,
|
||||
const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI)
|
||||
{
|
||||
Standard_Integer i, aNewShape, nE1, nE2;
|
||||
Standard_Real aT1, aT2;
|
||||
@ -864,11 +860,12 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
BOPTools_PaveSet& aPaveSet2=myPavePoolNew(myDS->RefEdge(nE2));
|
||||
aPaveSet2.Append(aPave);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: RefinePavePool
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::RefinePavePool()
|
||||
void NMTTools_PaveFiller::RefinePavePool()
|
||||
{
|
||||
Standard_Integer i, aNbNew;
|
||||
|
||||
@ -897,19 +894,20 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: PreparePaveBlocks
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::PreparePaveBlocks(const TopAbs_ShapeEnum aType1,
|
||||
const TopAbs_ShapeEnum aType2)
|
||||
void NMTTools_PaveFiller::PreparePaveBlocks(const TopAbs_ShapeEnum aType1,
|
||||
const TopAbs_ShapeEnum aType2)
|
||||
{
|
||||
myIsDone=Standard_False;
|
||||
//
|
||||
Standard_Boolean bOk1, bOk2, bOk3, bFlag;
|
||||
Standard_Integer i, aNb, nE[2], n1, n2, aNbSplits;
|
||||
TColStd_MapOfInteger aMap;
|
||||
|
||||
//
|
||||
bOk1= (aType1==TopAbs_VERTEX) && (aType2==TopAbs_EDGE) ;
|
||||
bOk2= (aType1==TopAbs_EDGE) && (aType2==TopAbs_EDGE) ;
|
||||
bOk3= (aType1==TopAbs_EDGE) && (aType2==TopAbs_FACE) ;
|
||||
@ -945,11 +943,12 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}// for (; myDSIt.More(); myDSIt.Next())
|
||||
myIsDone=Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: PreparePaveBlocks
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::PreparePaveBlocks(const Standard_Integer nE)
|
||||
void NMTTools_PaveFiller::PreparePaveBlocks(const Standard_Integer nE)
|
||||
{
|
||||
myIsDone=Standard_False;
|
||||
//
|
||||
@ -967,7 +966,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}
|
||||
//
|
||||
BOPTools_PaveSet& aPS=myPavePool(myDS->RefEdge(nE));
|
||||
|
||||
//
|
||||
BOPTools_PaveBlockIterator aPBIt(nE, aPS);
|
||||
for (; aPBIt.More(); aPBIt.Next()) {
|
||||
BOPTools_PaveBlock& aPB=aPBIt.Value();
|
||||
@ -1008,13 +1007,14 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
} //for (; aPBIt.More(); aPBIt.Next())
|
||||
myIsDone=Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: CorrectShrunkRanges
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::CorrectShrunkRanges(const Standard_Integer aSide,
|
||||
const BOPTools_Pave& aPave,
|
||||
IntTools_ShrunkRange& aShrunkRange)
|
||||
void NMTTools_PaveFiller::CorrectShrunkRanges(const Standard_Integer aSide,
|
||||
const BOPTools_Pave& aPave,
|
||||
IntTools_ShrunkRange& aShrunkRange)
|
||||
{
|
||||
BooleanOperations_KindOfInterference aType;
|
||||
Standard_Integer anIndexInterf ;
|
||||
@ -1079,13 +1079,13 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: IsBlocksCoinside
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
Standard_Boolean
|
||||
NMTTools_PaveFiller::IsBlocksCoinside(const BOPTools_PaveBlock& aPB1,
|
||||
const BOPTools_PaveBlock& aPB2) const
|
||||
Standard_Boolean NMTTools_PaveFiller::IsBlocksCoinside(const BOPTools_PaveBlock& aPB1,
|
||||
const BOPTools_PaveBlock& aPB2) const
|
||||
{
|
||||
Standard_Boolean bRetFlag=Standard_True;
|
||||
Standard_Real aTolV11, aTolV12, aTolV21, aTolV22;
|
||||
@ -1128,20 +1128,22 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}
|
||||
return !bRetFlag;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: ReplaceCommonBlocks
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::ReplaceCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
|
||||
void NMTTools_PaveFiller::ReplaceCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
|
||||
{
|
||||
RemoveCommonBlocks(aLCB);
|
||||
SplitCommonBlocks(aLCB);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: SplitCommonBlocks
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::SplitCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
|
||||
void NMTTools_PaveFiller::SplitCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
|
||||
{
|
||||
Standard_Integer nE;
|
||||
NMTTools_ListOfCommonBlock aLCBx;
|
||||
@ -1231,11 +1233,12 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}//for (nE=1; nE<=aNb; ++nE) {
|
||||
// Contribution of Samtech www.samcef.com END
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: RemoveCommonBlocks
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::RemoveCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
|
||||
void NMTTools_PaveFiller::RemoveCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
|
||||
{
|
||||
Standard_Integer nE;
|
||||
NMTTools_ListOfCommonBlock aLCBx;
|
||||
@ -1265,24 +1268,24 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: SplitCommonBlock
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void NMTTools_PaveFiller::SplitCommonBlock(const NMTTools_CommonBlock& aCB,
|
||||
NMTTools_ListOfCommonBlock& aLCBx)
|
||||
void NMTTools_PaveFiller::SplitCommonBlock(const NMTTools_CommonBlock& aCB,
|
||||
NMTTools_ListOfCommonBlock& aLCBx)
|
||||
{
|
||||
Standard_Integer i, j, k, nE, aNbE, aNbSPBx, aNbPB;
|
||||
Standard_Integer i, j,nE, aNbE, aNbSPBx, aNbPB, k;
|
||||
BOPTools_SequenceOfPaveBlock aSPBx;
|
||||
BOPTools_ListIteratorOfListOfPaveBlock anItLPB;
|
||||
BOPTools_ListIteratorOfListOfPave anIt;
|
||||
|
||||
BOPTools_PaveBlockIterator anPBIt;
|
||||
//
|
||||
const BOPTools_ListOfPaveBlock& aLPB=aCB.PaveBlocks();
|
||||
aNbE=aLPB.Extent();
|
||||
//
|
||||
// 1. Whether we realy need to split the common block ?
|
||||
// 1. Checking: Whether we realy need to split the common block ?
|
||||
anItLPB.Initialize(aLPB);
|
||||
for (; anItLPB.More(); anItLPB.Next()) {
|
||||
const BOPTools_PaveBlock& aPB=anItLPB.Value();
|
||||
@ -1352,6 +1355,37 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
aNbSPBx=aSPBx.Length();
|
||||
aNbPB=aNbSPBx/aNbE;
|
||||
//
|
||||
//modified by NIZNHY-PKV Fri Jun 04 14:07:37 2010f
|
||||
//
|
||||
Standard_Integer k1, k2, n11, n12, n21, n22;
|
||||
//
|
||||
for (i=1; i<=aNbPB; ++i) {
|
||||
NMTTools_CommonBlock aCBx;
|
||||
//
|
||||
aCBx.AddFaces(aLF);
|
||||
//
|
||||
const BOPTools_PaveBlock& aPB1=aSPBx(i);
|
||||
n11=aPB1.Pave1().Index();
|
||||
n12=aPB1.Pave2().Index();
|
||||
//
|
||||
aCBx.AddPaveBlock(aPB1);
|
||||
//
|
||||
for (j=2; j<=aNbE; ++j) {
|
||||
k1=(j-1)*aNbPB+1;
|
||||
k2=k1+aNbPB-1;
|
||||
for(k=k1; k<=k2; ++k) {
|
||||
const BOPTools_PaveBlock& aPB2=aSPBx(k);
|
||||
n21=aPB2.Pave1().Index();
|
||||
n22=aPB2.Pave2().Index();
|
||||
if ((n21==n11 && n22==n12) || (n21==n12 && n22==n11)) {
|
||||
aCBx.AddPaveBlock(aPB2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
aLCBx.Append(aCBx);
|
||||
}
|
||||
/*
|
||||
for (i=1; i<=aNbPB; ++i) {
|
||||
NMTTools_CommonBlock aCBx;
|
||||
//
|
||||
@ -1364,6 +1398,8 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
|
||||
}
|
||||
aLCBx.Append(aCBx);
|
||||
}
|
||||
*/
|
||||
//modified by NIZNHY-PKV Fri Jun 04 14:07:42 2010t
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@ -1391,6 +1427,7 @@ void VertexParameters(const IntTools_CommonPrt& aCPart,
|
||||
aT2 = aCPart.VertexParameter2();
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: KeepPave
|
||||
// purpose:
|
||||
@ -1445,6 +1482,7 @@ void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
|
||||
aChain.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function:ProcessBlock
|
||||
// purpose:
|
||||
@ -1469,6 +1507,7 @@ void ProcessBlock(const BOPTools_PaveBlock& aPB,
|
||||
ProcessBlock(aPBx, aMapCB, aProcessedBlocks, aChain);
|
||||
}
|
||||
}
|
||||
|
||||
// Modified to provide VS interference between
|
||||
// vertex as result of EE and a Face of argument
|
||||
// Thu Sep 14 14:35:18 2006
|
||||
|
Loading…
Reference in New Issue
Block a user