0023892: Missing intersection edge between two faces.
authorjgv <jgv@opencascade.com>
Thu, 3 Apr 2014 12:42:18 +0000 (16:42 +0400)
committerapn <apn@opencascade.com>
Fri, 4 Apr 2014 08:57:33 +0000 (12:57 +0400)
Test case for issue CR23892

src/IntPatch/IntPatch_PrmPrmIntersection.cxx
tests/bugs/modalg_5/bug23892

index 93c6eda..e43ae3b 100644 (file)
@@ -1316,8 +1316,102 @@ void IntPatch_PrmPrmIntersection::Perform (const Handle(Adaptor3d_HSurface)&
   Periods[3] = (Surf2->IsVPeriodic())? Surf2->VPeriod() : 0.;
 
   IntSurf_ListIteratorOfListOfPntOn2S IterLOP1(LOfPnts);
+  if (Surf1->IsUClosed() || Surf1->IsVClosed() ||
+      Surf2->IsUClosed() || Surf2->IsVClosed())
+  {
+    Standard_Real TolPar = Precision::PConfusion();
+    IntSurf_ListOfPntOn2S AdditionalPnts;
+    Standard_Real NewU1, NewV1, NewU2, NewV2;
+    for(; IterLOP1.More(); IterLOP1.Next())
+    {
+      IntSurf_PntOn2S Pnt = IterLOP1.Value();
+      Pnt.Parameters(U1, V1, U2, V2);
+      IntSurf_PntOn2S NewPnt;
+      if (Surf1->IsUClosed())
+      {
+        if (Abs(U1 - Surf1->FirstUParameter()) <= TolPar)
+        {
+          NewU1 = Surf1->LastUParameter();
+          NewPnt.SetValue( NewU1, V1, U2, V2 );
+          AdditionalPnts.Append(NewPnt);
+        }
+        else if (Abs(U1 - Surf1->LastUParameter()) <= TolPar)
+        {
+          NewU1 = Surf1->FirstUParameter();
+          NewPnt.SetValue( NewU1, V1, U2, V2 );
+          AdditionalPnts.Append(NewPnt);
+        }
+      }
+      if (Surf1->IsVClosed())
+      {
+        if (Abs(V1 - Surf1->FirstVParameter()) <= TolPar)
+        {
+          NewV1 = Surf1->LastVParameter();
+          NewPnt.SetValue( U1, NewV1, U2, V2 );
+          AdditionalPnts.Append(NewPnt);
+        }
+        else if (Abs(V1 - Surf1->LastVParameter()) <= TolPar)
+        {
+          NewV1 = Surf1->FirstVParameter();
+          NewPnt.SetValue( U1, NewV1, U2, V2 );
+          AdditionalPnts.Append(NewPnt);
+        }
+      }
+      if (Surf2->IsUClosed())
+      {
+        if (Abs(U2 - Surf2->FirstUParameter()) <= TolPar)
+        {
+          NewU2 = Surf2->LastUParameter();
+          NewPnt.SetValue( U1, V1, NewU2, V2);
+          AdditionalPnts.Append(NewPnt);
+        }
+        else if (Abs(U2 - Surf2->LastUParameter()) <= TolPar)
+        {
+          NewU2 = Surf2->FirstUParameter();
+          NewPnt.SetValue( U1, V1, NewU2, V2);
+          AdditionalPnts.Append(NewPnt);
+        }
+      }
+      if (Surf2->IsVClosed())
+      {
+        if (Abs(V2 - Surf2->FirstVParameter()) <= TolPar)
+        {
+          NewV2 = Surf2->LastVParameter();
+          NewPnt.SetValue( U1, V1, U2, NewV2 );
+          AdditionalPnts.Append(NewPnt);
+        }
+        else if (Abs(V2 - Surf2->LastVParameter()) <= TolPar)
+        {
+          NewV2 = Surf2->FirstVParameter();
+          NewPnt.SetValue( U1, V1, U2, NewV2 );
+          AdditionalPnts.Append(NewPnt);
+        }
+      }
+    }
+    //Cut repeated points
+    for (IterLOP1.Initialize(LOfPnts); IterLOP1.More(); IterLOP1.Next())
+    {
+      IntSurf_PntOn2S aPnt = IterLOP1.Value();
+      aPnt.Parameters(U1, V1, U2, V2);
+      IntSurf_ListIteratorOfListOfPntOn2S iter2(AdditionalPnts);
+      while (iter2.More())
+      {
+        IntSurf_PntOn2S aNewPnt = iter2.Value();
+        aNewPnt.Parameters(NewU1, NewV1, NewU2, NewV2);
+        if (Abs(U1 - NewU1) <= TolPar &&
+            Abs(V1 - NewV1) <= TolPar &&
+            Abs(U2 - NewU2) <= TolPar &&
+            Abs(V2 - NewV2) <= TolPar)
+          AdditionalPnts.Remove(iter2);
+        else
+          iter2.Next();
+      }
+    }
+
+    LOfPnts.Append(AdditionalPnts);
+  }
 
-  for(; IterLOP1.More(); IterLOP1.Next()){
+  for(IterLOP1.Initialize(LOfPnts); IterLOP1.More(); IterLOP1.Next()){
     IntSurf_PntOn2S Pnt = IterLOP1.Value();
     Pnt.Parameters(U1, V1, U2, V2);
     if(U1>UmaxLig1) UmaxLig1=U1;
index 7dca183..11bcb25 100644 (file)
@@ -1,4 +1,3 @@
-puts "TODO OCC23892 ALL: Error : number of surfaces is incorrect. Should be two intersection curves"
 puts "============"
 puts "OCC23892"
 puts "============"
@@ -10,16 +9,17 @@ puts ""
 restore [locate_data_file bug23892_fz33] b1
 restore [locate_data_file bug23892_fz46] b2
 
-mksurface s1 b1
-mksurface s2 b2
+bop b1 b2
+bopsection result
 
-intersect res s1 s2
-decho off
-set info [directory]
-decho on
-set nb [regexp -all {res_} $info]
-if {$nb != 2 } {
-    puts "Error : number of surfaces is incorrect. Should be two intersection curves"
-} else {
-    puts "OK : number of surfaces is correct."
-}
+set nb_v_good 2
+set nb_e_good 2
+set nb_w_good 0
+set nb_f_good 0
+set nb_sh_good 0
+set nb_sol_good 0
+set nb_compsol_good 0
+set nb_compound_good  1
+set nb_shape_good 5
+
+set 2dviewer 1