0024880: Invalid result of pipe creation
authorjgv <jgv@opencascade.com>
Thu, 22 May 2014 13:03:34 +0000 (17:03 +0400)
committerapn <apn@opencascade.com>
Thu, 22 May 2014 13:04:11 +0000 (17:04 +0400)
Modified test case bugs/modalg_5/bug24840 according to new behavior. Added checkshape.

src/BRepFill/BRepFill_Draft.cxx
src/BRepFill/BRepFill_Pipe.cdl
src/BRepFill/BRepFill_Pipe.cxx
src/BRepFill/BRepFill_PipeShell.cxx
src/BRepFill/BRepFill_Sweep.cdl
src/BRepFill/BRepFill_Sweep.cxx
tests/bugs/modalg_5/bug24840

index 739ba7a..a0a0ee8 100644 (file)
@@ -523,7 +523,8 @@ static Standard_Boolean GoodOrientation(const Bnd_Box& B,
   Sweep.SetAngularControl(angmin, angmax);
   TopTools_MapOfShape Dummy;
   BRepFill_DataMapOfShapeHArray2OfShape Dummy2;
-  Sweep.Build(Dummy, Dummy2, myStyle, myCont);
+  BRepFill_DataMapOfShapeHArray2OfShape Dummy3;
+  Sweep.Build(Dummy, Dummy2, Dummy3, myStyle, myCont);
   if (Sweep.IsDone()) {
     myShape = Sweep.Shape();
     myShell = TopoDS::Shell(myShape);
index 7c5dddd..889f850 100644 (file)
@@ -174,6 +174,7 @@ fields
     myEdges   : HArray2OfShape from TopTools;  
     myReversedEdges : MapOfShape from TopTools;  
     myTapes   : DataMapOfShapeHArray2OfShape from BRepFill;
+    myRails   : DataMapOfShapeHArray2OfShape from BRepFill;
     myCurIndexOfSectionEdge : Integer from Standard;
     myFirst   :  Shape  from  TopoDS; 
     myLast    :  Shape  from  TopoDS; 
index 5e0dc6c..046279d 100644 (file)
@@ -518,7 +518,7 @@ TopoDS_Wire BRepFill_Pipe::PipeLine(const gp_Pnt& Point)
  // Sweeping
  BRepFill_Sweep MkSw(Section, myLoc, Standard_True);
  MkSw.SetForceApproxC1(myForceApproxC1);
- MkSw.Build( myReversedEdges, myTapes,
+ MkSw.Build( myReversedEdges, myTapes, myRails,
              BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
  TopoDS_Shape aLocalShape = MkSw.Shape();
  return TopoDS::Wire(aLocalShape);
@@ -645,7 +645,7 @@ TopoDS_Shape BRepFill_Pipe::MakeShape(const TopoDS_Shape& S,
        new (BRepFill_ShapeLaw) (TopoDS::Vertex(TheS));
       BRepFill_Sweep MkSw(Section, myLoc, Standard_True);
       MkSw.SetForceApproxC1(myForceApproxC1);
-      MkSw.Build( myReversedEdges, myTapes,
+      MkSw.Build( myReversedEdges, myTapes, myRails,
                   BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
       result = MkSw.Shape();
 
@@ -666,7 +666,7 @@ TopoDS_Shape BRepFill_Pipe::MakeShape(const TopoDS_Shape& S,
       MkSw.SetBounds(TopoDS::Wire(TheFirst), 
                     TopoDS::Wire(TheLast));
       MkSw.SetForceApproxC1(myForceApproxC1);
-      MkSw.Build( myReversedEdges, myTapes,
+      MkSw.Build( myReversedEdges, myTapes, myRails,
                   BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
       result = MkSw.Shape();
       //Correct <myFirst> and <myLast>
index b1c92ee..a444f96 100644 (file)
@@ -742,7 +742,8 @@ void BRepFill_PipeShell::SetForceApproxC1(const Standard_Boolean ForceApproxC1)
     theContinuity = GeomAbs_C0;
   TopTools_MapOfShape Dummy;
   BRepFill_DataMapOfShapeHArray2OfShape Dummy2;
-  MkSw.Build(Dummy, Dummy2, myTransition, theContinuity);
+  BRepFill_DataMapOfShapeHArray2OfShape Dummy3;
+  MkSw.Build(Dummy, Dummy2, Dummy3, myTransition, theContinuity);
 
   myStatus = myLocation->GetStatus();
   Ok =  (MkSw.IsDone() && (myStatus == GeomFill_PipeOk));
index 937d780..27054d2 100644 (file)
@@ -88,6 +88,7 @@ is
    Build(me : in  out;
          ReversedEdges : in out MapOfShape from TopTools;
         Tapes : in out DataMapOfShapeHArray2OfShape from BRepFill;
+        Rails : in out DataMapOfShapeHArray2OfShape from BRepFill;
          Transition : TransitionStyle  =  BRepFill_Modified;    
          Continuity : Shape  from  GeomAbs   = GeomAbs_C2;
          Approx     : ApproxStyle = GeomFill_Location; 
@@ -121,6 +122,7 @@ is
             Vf,  Vl    : Integer;
            ReversedEdges : in out MapOfShape from TopTools;
            Tapes : in out DataMapOfShapeHArray2OfShape from BRepFill;
+           Rails : in out DataMapOfShapeHArray2OfShape from BRepFill;
             ExtendFirst :  Real  =  0.0; 
             ExtendLast  :  Real  =  0.0)  
    returns Boolean is  private;
index 3cf8fe5..bdd7080 100644 (file)
@@ -1943,6 +1943,7 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
            const Standard_Integer ILast,
             TopTools_MapOfShape& ReversedEdges,
             BRepFill_DataMapOfShapeHArray2OfShape& Tapes,
+            BRepFill_DataMapOfShapeHArray2OfShape& Rails,
            const Standard_Real ExtendFirst,
            const Standard_Real ExtendLast) 
 {
@@ -2079,11 +2080,13 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
     mySec->Init(FirstShape);
     for (isec=1; isec<=NbLaw; isec++) {
       E = mySec->CurrentEdge();
+      TopoDS_Vertex Vfirst, Vlast;
+      TopExp::Vertices(E, Vfirst, Vlast);
       VEdge(isec, 1) = E;
       if (E.Orientation() == TopAbs_REVERSED)
-        Vertex(isec+1, 1) = TopExp::FirstVertex(E);
+        Vertex(isec+1, 1) = Vfirst; //TopExp::FirstVertex(E);
       else 
-        Vertex(isec+1, 1) =  TopExp::LastVertex(E);
+        Vertex(isec+1, 1) = Vlast; //TopExp::LastVertex(E);
       UpdateVertex(IFirst-1, isec+1, 
                    TabErr(isec, 1), Vi(1),  Vertex(isec+1, 1));
 
@@ -2130,6 +2133,23 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
       {
         Handle(TopTools_HArray2OfShape) EmptyArray = new TopTools_HArray2OfShape(1, 6, 1, NbPath+1);
         Tapes.Bind(E, EmptyArray);
+        Standard_Integer j;
+        if (Rails.IsBound(Vfirst))
+        {
+          Standard_Integer ind = (E.Orientation() == TopAbs_REVERSED)? isec+1 : isec;
+          for (j = 1; j <= NbPath; j++)
+            UEdge(ind, j) = Rails(Vfirst)->Value(1, j);
+          for (j = 1; j <= NbPath+1; j++)
+            Vertex(ind, j) = Rails(Vfirst)->Value(2, j);
+        }
+        if (Rails.IsBound(Vlast))
+        {
+          Standard_Integer ind = (E.Orientation() == TopAbs_FORWARD)? isec+1 : isec;
+          for (j = 1; j <= NbPath; j++)
+            UEdge(ind, j) = Rails(Vlast)->Value(1, j);
+          for (j = 1; j <= NbPath+1; j++)
+            Vertex(ind, j) = Rails(Vlast)->Value(2, j);
+        }
       }
     }
     
@@ -2173,7 +2193,7 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
     else {
       if (exuv) {
         u = UFirst;
-          v = VLast;
+        v = VLast;
       }
       else {
         u = ULast;
@@ -2616,7 +2636,7 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
     }
   }
 
-  // (5) Update Tapes
+  // (5) Update Tapes and Rails
   Standard_Integer j;
   if (IFirst == 1 && !Tapes.IsEmpty()) //works only in case of single shell
   {
@@ -2634,6 +2654,26 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
         Tapes(StartEdges(isec))->SetValue(5, j, Vertex(isec+1, j));
       for (j = 1; j <= NbPath; j++)
         Tapes(StartEdges(isec))->SetValue(6, j, myFaces->Value(isec, j));
+      TopoDS_Vertex Vfirst, Vlast;
+      TopExp::Vertices(TopoDS::Edge(StartEdges(isec)), Vfirst, Vlast);
+      if (!Rails.IsBound(Vfirst))
+      {
+        Handle(TopTools_HArray2OfShape) anArray = new TopTools_HArray2OfShape(1, 2, 1, NbPath+1);
+        for (j = 1; j <= NbPath; j++)
+          anArray->SetValue(1, j, myUEdges->Value(isec, j));
+        for (j = 1; j <= NbPath+1; j++)
+          anArray->SetValue(2, j, Vertex(isec, j));
+        Rails.Bind(Vfirst, anArray);
+      }
+      if (!Rails.IsBound(Vlast))
+      {
+        Handle(TopTools_HArray2OfShape) anArray = new TopTools_HArray2OfShape(1, 2, 1, NbPath+1);
+        for (j = 1; j <= NbPath; j++)
+          anArray->SetValue(1, j, myUEdges->Value(isec+1, j));
+        for (j = 1; j <= NbPath+1; j++)
+          anArray->SetValue(2, j, Vertex(isec+1, j));
+        Rails.Bind(Vlast, anArray);
+      }
     }
   }
   
@@ -2646,6 +2686,7 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
 //======================================================================
 void BRepFill_Sweep::Build(TopTools_MapOfShape& ReversedEdges,
                            BRepFill_DataMapOfShapeHArray2OfShape& Tapes,
+                           BRepFill_DataMapOfShapeHArray2OfShape& Rails,
                            const BRepFill_TransitionStyle Transition,
                            const GeomAbs_Shape Continuity,
                            const GeomFill_ApproxStyle Approx,
@@ -2688,7 +2729,7 @@ void BRepFill_Sweep::Build(TopTools_MapOfShape& ReversedEdges,
       isDone = BuildShell(Transition, 
                          1, NbPath+1,
                           ReversedEdges,
-                          Tapes,
+                          Tapes, Rails,
                          Extend, Extend);
     }
     else { //  This is done piece by piece
@@ -2700,7 +2741,7 @@ void BRepFill_Sweep::Build(TopTools_MapOfShape& ReversedEdges,
        isDone = BuildShell(Transition, 
                            IFirst, ILast,
                             ReversedEdges,
-                            Tapes,
+                            Tapes, Rails,
                            EvalExtrapol(IFirst, Transition),
                            EvalExtrapol(ILast,  Transition));
        if (IFirst>1) {
index 721673c..125cf1b 100644 (file)
@@ -10,15 +10,16 @@ restore [locate_data_file bug24840_comp.brep] c
 explode c
 
 pipe result c_1 c_2 1
+checkshape result
 
 set nb_v_good 56
-set nb_e_good 134
+set nb_e_good 130
 set nb_w_good 99
 set nb_f_good 99
 set nb_sh_good 24
 set nb_sol_good 24
 set nb_compsol_good 1
 set nb_compound_good 0
-set nb_shape_good 437
+set nb_shape_good 433
 
 set 2dviewer 1