Salome HOME
untabify
[modules/geom.git] / src / NMTTools / NMTTools_PaveFiller_2.cxx
index a66bbb6102849d2c9a98d4f67d3368d9f0617e74..e400245ca1bd4c9d689e3d41e07000d5582d7f73 100644 (file)
@@ -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
 //             <pkv@irinox>
-
-
+//
 #include <NMTTools_PaveFiller.ixx>
 
 #include <Precision.hxx>
@@ -36,6 +37,7 @@
 #include <TopoDS.hxx>
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Vertex.hxx>
+#include <TopoDS_Iterator.hxx>
 
 #include <BRep_Builder.hxx>
 #include <BRep_Tool.hxx>
 #include <BOPTools_VEInterference.hxx>
 
 #include <BooleanOperations_AncestorsSeqAndSuccessorsSeq.hxx>
-
+#include <NMTDS_Iterator.hxx>
 #include <NMTDS_ShapesDataStructure.hxx>
+#include <NMTDS_InterfPool.hxx>
 //
+// Modified  Thu Sep 14 14:35:18 2006 
+// Contribution of Samtech www.samcef.com BEGIN
 #include <BOPTools_IndexedMapOfCoupleOfInteger.hxx>
 #include <BOPTools_CoupleOfInteger.hxx>
+#include <BooleanOperations_OnceExplorer.hxx>
 
+
+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: 
     }
   }
 }
+
+// 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