diff --git a/src/IntPatch/IntPatch_PrmPrmIntersection.cxx b/src/IntPatch/IntPatch_PrmPrmIntersection.cxx index 4c3a6da6f4..bfd0aeb9d4 100644 --- a/src/IntPatch/IntPatch_PrmPrmIntersection.cxx +++ b/src/IntPatch/IntPatch_PrmPrmIntersection.cxx @@ -1317,8 +1317,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(); + } + } - for(; IterLOP1.More(); IterLOP1.Next()){ + LOfPnts.Append(AdditionalPnts); + } + + for(IterLOP1.Initialize(LOfPnts); IterLOP1.More(); IterLOP1.Next()){ IntSurf_PntOn2S Pnt = IterLOP1.Value(); Pnt.Parameters(U1, V1, U2, V2); if(U1>UmaxLig1) UmaxLig1=U1; diff --git a/tests/bugs/modalg_5/bug23892 b/tests/bugs/modalg_5/bug23892 index 7dca1831c3..11bcb25a4f 100644 --- a/tests/bugs/modalg_5/bug23892 +++ b/tests/bugs/modalg_5/bug23892 @@ -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