#include <IntPatch_CSFunction.hxx>
#include <IntPatch_CurvIntSurf.hxx>
+#include <ElCLib.hxx>
+
#define myInfinite 1.e15 // the same as was in Adaptor3d_TopolTool
static void Recadre(GeomAbs_SurfaceType typeS1,
}
Bnd_Box2d BPLin = PLin.Bounding();
-
- if(SurfaceIsPeriodic) {
- Standard_Real xmin,ymin,xmax,ymax,g;
- BPLin.Get(xmin,ymin,xmax,ymax);
- g = BPLin.GetGap();
- BPLin.SetVoid();
- BPLin.Update(xmin-M_PI-M_PI,ymin,
- xmax+M_PI+M_PI,ymax);
- BPLin.SetGap(g);
- }
- if(SurfaceIsBiPeriodic) {
- Standard_Real xmin,ymin,xmax,ymax,g;
- BPLin.Get(xmin,ymin,xmax,ymax);
- g = BPLin.GetGap();
- BPLin.SetVoid();
- BPLin.Update(xmin,ymin-M_PI-M_PI,
- xmax,ymax+M_PI+M_PI);
- BPLin.SetGap(g);
- }
+ Standard_Real OffsetV = 0.0;
+ Standard_Real OffsetU = 0.0;
switch(arc->GetType())
{
- case GeomAbs_Line: NbEchant=10; break;
+ case GeomAbs_Line:
+ {
+ NbEchant=10;
+
+ Standard_Real aXmin, aYmin, aXmax, aYmax;
+ BPLin.Get(aXmin, aYmin, aXmax, aYmax);
+ gp_Lin2d aLin = arc->Curve2d().Line();
+ const gp_Pnt2d& aLoc = aLin.Location();
+ const gp_Dir2d& aDir = aLin.Direction();
+
+ //Here, we consider rectangular axis-aligned domain only.
+ const Standard_Boolean isAlongU = (Abs(aDir.X()) > Abs(aDir.Y()));
+
+ if(SurfaceIsPeriodic && !isAlongU)
+ {
+ //Shift along U-direction
+ const Standard_Real aNewLocation =
+ ElCLib::InPeriod(aLoc.X(), aXmin, aXmin + M_PI + M_PI);
+ OffsetU = aNewLocation - aLoc.X();
+ }
+ else if(SurfaceIsBiPeriodic && isAlongU)
+ {
+ //Shift along V-direction
+ const Standard_Real aNewLocation =
+ ElCLib::InPeriod(aLoc.Y(), aYmin, aYmin + M_PI + M_PI);
+ OffsetV = aNewLocation - aLoc.Y();
+ }
+ }
+ break;
case GeomAbs_BezierCurve:
{
NbEchant = (3 + arc->NbPoles());
}
}
+ if(SurfaceIsPeriodic) {
+ Standard_Real xmin,ymin,xmax,ymax,g;
+ BPLin.Get(xmin,ymin,xmax,ymax);
+ g = BPLin.GetGap();
+ BPLin.SetVoid();
+ BPLin.Update(xmin-M_PI-M_PI,ymin,
+ xmax+M_PI+M_PI,ymax);
+ BPLin.SetGap(g);
+ }
+ if(SurfaceIsBiPeriodic) {
+ Standard_Real xmin,ymin,xmax,ymax,g;
+ BPLin.Get(xmin,ymin,xmax,ymax);
+ g = BPLin.GetGap();
+ BPLin.SetVoid();
+ BPLin.Update(xmin,ymin-M_PI-M_PI,
+ xmax,ymax+M_PI+M_PI);
+ BPLin.SetGap(g);
+ }
+
IntPatch_PolyArc Brise(arc,NbEchant,PFirst,PLast,BPLin);
Standard_Integer IndiceOffsetBiPeriodic = 0;
- Standard_Integer IndiceOffsetPeriodic = 0;
- Standard_Real OffsetV = 0.0;
- Standard_Real OffsetU = 0.0;
-
+ Standard_Integer IndiceOffsetPeriodic = 0;
+ const Standard_Real aRefOU = OffsetU,
+ aRefOV = OffsetV;
+
do {
if(IndiceOffsetBiPeriodic == 1)
- OffsetV = -M_PI-M_PI;
+ OffsetV = aRefOV - M_PI - M_PI;
else if(IndiceOffsetBiPeriodic == 2)
- OffsetV = M_PI+M_PI;
-
+ OffsetV = aRefOV + M_PI + M_PI;
+
do {
- if(IndiceOffsetPeriodic == 1)
- OffsetU = -M_PI-M_PI;
- else if(IndiceOffsetPeriodic == 2)
- OffsetU = M_PI+M_PI;
-
- Brise.SetOffset(OffsetU,OffsetV);
-
+ if(IndiceOffsetPeriodic == 1)
+ OffsetU = aRefOU - M_PI - M_PI;
+ else if(IndiceOffsetPeriodic == 2)
+ OffsetU = aRefOU + M_PI + M_PI;
+
+ Brise.SetOffset(OffsetU,OffsetV);
+
static int debug_polygon2d =0;
if(debug_polygon2d) {
cout<<" ***** Numero Restriction : "<<NumeroEdge<<" *****"<<endl;
--- /dev/null
+puts "========"
+puts "OCC27664"
+puts "========"
+puts ""
+#################################################
+# Incomplete intersection curve from the attached shapes
+#################################################
+
+set ExpTol 2.0017470228627478e-008
+set GoodNbCurv 2
+set GoodLength 0.6288896355727489
+
+restore [locate_data_file bug27664_pl0.brep] pl0
+restore [locate_data_file bug27664_nsh_8.brep] nsh_8
+explode nsh_8 f
+explode pl0 f
+
+set log [bopcurves pl0_1 nsh_8_4 -2d]
+
+regexp {Tolerance Reached=+([-0-9.+eE]+)\n+([-0-9.+eE]+)} ${log} full Toler NbCurv
+
+if {${NbCurv} != ${GoodNbCurv}} {
+ puts "Error: Number of curves is bad!"
+}
+
+checkreal TolReached $Toler $ExpTol 0.0 0.1
+
+set clen 0.0
+
+for {set ic 1} { $ic <= ${NbCurv} } { incr ic} {
+
+ set le [length c_$ic]
+ regexp "The length c_$ic is +(\[-0-9.+eE\]+)" ${le} full ll
+
+ puts "ll = $ll"
+
+ set clen [expr $clen+$ll]
+}
+
+puts "Summary length = $clen"
+
+checkreal Length $clen $GoodLength 0.0 1.0e-5
+
+smallview
+don c_*
+fit
+display pl0_1 nsh_8_4
+
+xwd ${imagedir}/${test_image}_1.png
+
+top
+don c_*
+fit
+display pl0_1 nsh_8_4
+
+xwd ${imagedir}/${test_image}_2.png
\ No newline at end of file