X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FNMTTools%2FNMTTools_PaveFiller_2.cxx;h=e400245ca1bd4c9d689e3d41e07000d5582d7f73;hb=d2046800b5f3ab6a56c3b9a72766f5d317a235e7;hp=a66bbb6102849d2c9a98d4f67d3368d9f0617e74;hpb=9499b99fe2dcb53e1ea364f97986f8f432b04600;p=modules%2Fgeom.git diff --git a/src/NMTTools/NMTTools_PaveFiller_2.cxx b/src/NMTTools/NMTTools_PaveFiller_2.cxx index a66bbb610..e400245ca 100644 --- a/src/NMTTools/NMTTools_PaveFiller_2.cxx +++ b/src/NMTTools/NMTTools_PaveFiller_2.cxx @@ -1,28 +1,29 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // File: NMTTools_PaveFiller_2.cxx // Created: Mon Dec 8 12:02:56 2003 // Author: Peter KURNEV // - - +// #include #include @@ -36,6 +37,7 @@ #include #include #include +#include #include #include @@ -46,12 +48,137 @@ #include #include - +#include #include +#include // +// Modified Thu Sep 14 14:35:18 2006 +// Contribution of Samtech www.samcef.com BEGIN #include #include +#include + +static + Standard_Boolean Contains(const TopoDS_Edge& aE, + const TopoDS_Vertex& aV); +// Contribution of Samtech www.samcef.com END + +//======================================================================= +// function: PerformVE +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformVE() +{ + myIsDone=Standard_False; + // + Standard_Boolean bJustAdd; + Standard_Integer n1, n2, anIndexIn, aFlag, aWhat, aWith, aNbVEs, aBlockLength, iSDV, nV1; + Standard_Real aT; + TopoDS_Vertex aV1; + TopoDS_Edge aE2; + BOPTools_IndexedMapOfCoupleOfInteger aSnareMap; + BOPTools_CoupleOfInteger aCouple; + // + BOPTools_CArray1OfVEInterference& aVEs=myIP->VEInterferences(); + // + myDSIt->Initialize (TopAbs_VERTEX, TopAbs_EDGE); + // + // BlockLength correction + aNbVEs=myDSIt->BlockLength(); + aBlockLength=aVEs.BlockLength(); + if (aNbVEs > aBlockLength) { + aVEs.SetBlockLength(aNbVEs); + } + // + for (; myDSIt->More(); myDSIt->Next()) { + myDSIt->Current(n1, n2, bJustAdd); + if (!IsSuccessorsComputed(n1, n2)) { + anIndexIn=0; + aWhat=n1; // Vertex + aWith=n2; // Edge + if (myDS->GetShapeType(n1)==TopAbs_EDGE) { + aWhat=n2; + aWith=n1; + } + // + if(bJustAdd) { + //myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexEdge, anIndexIn); + continue; + } + // Edge + aE2=TopoDS::Edge(myDS->Shape(aWith)); + if (BRep_Tool::Degenerated(aE2)){ + continue; + } + // Vertex + nV1=aWhat; + aV1=TopoDS::Vertex(myDS->Shape(aWhat)); + // + iSDV=FindSDVertex(aWhat); + if (iSDV) { + nV1=iSDV; + aV1=TopoDS::Vertex(myDS->Shape(nV1)); + // Modified to find same domain vertex Thu Sep 14 14:35:18 2006 + // Contribution of Samtech www.samcef.com BEGIN + Standard_Integer nVE, iSDVE, iRet; + // + BooleanOperations_OnceExplorer aExp(*myDS); + iRet=0; + aExp.Init(aWith, TopAbs_VERTEX); + for (; aExp.More(); aExp.Next()) { + nVE=aExp.Current(); + iSDVE=FindSDVertex(nVE); + if (iSDVE==iSDV) { + iRet=1; + break; + } + } + if (iRet) { + continue; + } + } + else { + if (Contains(aE2, aV1)) { + continue; + } + // Contribution of Samtech www.samcef.com END + } + // + aFlag=myContext.ComputeVE (aV1, aE2, aT); + // + if (!aFlag) { + // Add Interference to the Pool + BOPTools_VEInterference anInterf (aWhat, aWith, aT); + anIndexIn=aVEs.Append(anInterf); + // + // Add Pave to the Edge's myPavePool + aCouple.SetCouple(nV1, aWith); + if (!aSnareMap.Contains(aCouple)){ + aSnareMap.Add(aCouple); + // + BOPTools_Pave aPave(nV1, aT, BooleanOperations_VertexEdge); + aPave.SetInterference(anIndexIn); + BOPTools_PaveSet& aPaveSet= myPavePool(myDS->RefEdge(aWith)); + aPaveSet.Append(aPave); + } + // + // State for the Vertex in DS; + myDS->SetState (aWhat, BooleanOperations_ON); + // Insert Vertex in Interference Object + BOPTools_VEInterference& aVE=aVEs(anIndexIn); + aVE.SetNewShape(aWhat); + // qqf + { + myIP->Add(aWhat, aWith, Standard_True, NMTDS_TI_VE); + } + // qqt + } + //myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexEdge, anIndexIn); + } + } + myIsDone=Standard_True; +} //======================================================================= // function: PrepareEdges // purpose: @@ -97,134 +224,28 @@ } } } + +// Modified Thu Sep 14 14:35:18 2006 +// Contribution of Samtech www.samcef.com BEGIN //======================================================================= -// function: PerformVE -// purpose: +//function : Contains +//purpose : //======================================================================= - void NMTTools_PaveFiller::PerformVE() +Standard_Boolean Contains(const TopoDS_Edge& aE, + const TopoDS_Vertex& aV) { - myIsDone=Standard_False; - // - Standard_Boolean bJustAddInterference; - Standard_Integer n1, n2, anIndexIn, aFlag, aWhat, aWith, aNbVEs, aBlockLength, iSDV, nV1; - Standard_Real aT; - TopoDS_Vertex aV1; - TopoDS_Edge aE2; - BOPTools_IndexedMapOfCoupleOfInteger aSnareMap; - BOPTools_CoupleOfInteger aCouple; - // - BOPTools_CArray1OfVEInterference& aVEs=myIntrPool->VEInterferences(); + Standard_Boolean bRet; + TopoDS_Iterator aIt; // - myDSIt.Initialize (TopAbs_VERTEX, TopAbs_EDGE); - // - // BlockLength correction - aNbVEs=ExpectedPoolLength(); - aBlockLength=aVEs.BlockLength(); - if (aNbVEs > aBlockLength) { - aVEs.SetBlockLength(aNbVEs); - } - // - for (; myDSIt.More(); myDSIt.Next()) { - myDSIt.Current(n1, n2, bJustAddInterference); - // - if (! myIntrPool->IsComputed(n1, n2)) { - if (! IsSuccesstorsComputed(n1, n2)) { - anIndexIn=0; - aWhat=n1; // Vertex - aWith=n2; // Edge - SortTypes(aWhat, aWith); - // - if(bJustAddInterference) { - myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexEdge, anIndexIn); - continue; - } - // Edge - aE2=TopoDS::Edge(myDS->Shape(aWith)); - // - if (BRep_Tool::Degenerated(aE2)){ - continue; - } - // Vertex - nV1=aWhat; - aV1=TopoDS::Vertex(myDS->Shape(aWhat)); - // - iSDV=FindSDVertex(aWhat); - if (iSDV) { - nV1=iSDV; - aV1=TopoDS::Vertex(myDS->Shape(nV1)); - } - // - aFlag=myContext.ComputeVE (aV1, aE2, aT); - // - if (!aFlag) { - // - // Add Interference to the Pool - BOPTools_VEInterference anInterf (aWhat, aWith, aT); - anIndexIn=aVEs.Append(anInterf); - // - // Add Pave to the Edge's myPavePool - aCouple.SetCouple(nV1, aWith); - if (!aSnareMap.Contains(aCouple)){ - aSnareMap.Add(aCouple); - // - BOPTools_Pave aPave(nV1, aT, BooleanOperations_VertexEdge); - aPave.SetInterference(anIndexIn); - BOPTools_PaveSet& aPaveSet= myPavePool(myDS->RefEdge(aWith)); - aPaveSet.Append(aPave); - } - // - // State for the Vertex in DS; - myDS->SetState (aWhat, BooleanOperations_ON); - // Insert Vertex in Interference Object - BOPTools_VEInterference& aVE=aVEs(anIndexIn); - aVE.SetNewShape(aWhat); - } - myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexEdge, anIndexIn); - } + bRet=Standard_False; + aIt.Initialize(aE); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aVE=aIt.Value(); + if (aVE.IsSame(aV)) { + bRet=!bRet; + break; } } - myIsDone=Standard_True; + return bRet; } - -/* -// A -// - // cto900/M2 - // Some of Edges can be [Semi] Infinite. Such Edges have no - // vertices on correspondant INF ends. So we must provide - // these vertices formally (to obtain Shrunk Ranges for e.g). - // In reality this vertex(-es) does not belong to the INF Edge. - // It just has reference in the DS. - // PKV Tue Apr 23 10:21:45 2002 - { - Standard_Real aT1, aT2, aTolE; - Standard_Boolean bInf1, bInf2; - gp_Pnt aPx; - TopoDS_Vertex aVx; - BRep_Builder aBB; - BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; - // - aTolE=BRep_Tool::Tolerance(aE); - Handle(Geom_Curve) aC3D=BRep_Tool::Curve (aE, aT1, aT2); - bInf1=Precision::IsNegativeInfinite(aT1); - bInf2=Precision::IsPositiveInfinite(aT2); - - if (bInf1) { - aC3D->D0(aT1, aPx); - aBB.MakeVertex(aVx, aPx, aTolE); - myDS->InsertShapeAndAncestorsSuccessors(aVx, anASSeq); - nV=myDS->NumberOfInsertedShapes(); - BOPTools_Pave aPave(nV, aT1); - aPaveSet.Append (aPave); - } - - if (bInf2) { - aC3D->D0(aT2, aPx); - aBB.MakeVertex(aVx, aPx, aTolE); - myDS->InsertShapeAndAncestorsSuccessors(aVx, anASSeq); - nV=myDS->NumberOfInsertedShapes(); - BOPTools_Pave aPave(nV, aT2); - aPaveSet.Append (aPave); - } - } -*/ +// Contribution of Samtech www.samcef.com END