const TopoDS_Face& aF)
{
Standard_Boolean bIsUPeriodic, bIsVPeriodic, bIsLeft;
- Standard_Real aTol, a, b, anUPeriod, anVPeriod, aT, anU, dU, anU1;
+ Standard_Real anUPeriod = 0., anVPeriod = 0.;
+ Standard_Real aTol, a, b, aT, anU, dU, anU1;
Standard_Real aScPr, anV, dV, anV1;
Standard_Real aUmin, aUmax, aVmin, aVmax;
gp_Pnt2d aP2D;
//
aS->Bounds(aUmin, aUmax, aVmin, aVmax);
//
- bIsUPeriodic=aS->IsUPeriodic();
- bIsVPeriodic=aS->IsVPeriodic();
- //
- anUPeriod = bIsUPeriodic ? aS->UPeriod() : 0.;
- anVPeriod = bIsVPeriodic ? aS->VPeriod() : 0.;
+
+ bIsUPeriodic = aS->IsUClosed();
+ bIsVPeriodic = aS->IsVClosed();
+
+ if (bIsUPeriodic)
+ anUPeriod = aUmax - aUmin;
+ if (bIsVPeriodic)
+ anVPeriod = aVmax - aVmin;
+
//
if (!bIsUPeriodic && !bIsVPeriodic) {
- Standard_Boolean bIsUClosed, bIsVClosed;
- Handle(Geom_BSplineSurface) aBS;
- Handle(Geom_BezierSurface) aBZ;
+
Handle(Geom_RectangularTrimmedSurface) aRTS;
+ aRTS = Handle(Geom_RectangularTrimmedSurface)::DownCast(aS);
//
- bIsUClosed=Standard_False;
- bIsVClosed=Standard_False;
- aBS=Handle(Geom_BSplineSurface)::DownCast(aS);
- aBZ=Handle(Geom_BezierSurface) ::DownCast(aS);
- aRTS=Handle(Geom_RectangularTrimmedSurface)::DownCast(aS);
- //
- if (!aBS.IsNull()) {
- bIsUClosed=aBS->IsUClosed();
- bIsVClosed=aBS->IsVClosed();
- }
- else if (!aBZ.IsNull()) {
- bIsUClosed=aBZ->IsUClosed();
- bIsVClosed=aBZ->IsVClosed();
- }
- else if (!aRTS.IsNull()) {
+ if (aRTS.IsNull())
+ return Standard_False;
+
+ else {
Handle(Geom_Surface) aSB;
//
- aSB=aRTS->BasisSurface();
- bIsUPeriodic=aSB->IsUPeriodic();
- bIsVPeriodic=aSB->IsVPeriodic();
+ aSB = aRTS->BasisSurface();
+ bIsUPeriodic = aSB->IsUPeriodic();
+ bIsVPeriodic = aSB->IsVPeriodic();
//
- if (!(bIsUPeriodic || bIsVPeriodic)) {
- return Standard_False;
- }
- anUPeriod = bIsUPeriodic ? aSB->UPeriod() : 0.;
- anVPeriod = bIsVPeriodic ? aSB->VPeriod() : 0.;
- }
- //
- if (aRTS.IsNull()) {
- if (!bIsUClosed && !bIsVClosed) {
- return Standard_False;
+
+ if (bIsUPeriodic || bIsVPeriodic)
+ {
+ anUPeriod = bIsUPeriodic ? aSB->UPeriod() : 0.;
+ anVPeriod = bIsVPeriodic ? aSB->VPeriod() : 0.;
}
- //
- if (bIsUClosed) {
- anUPeriod=aUmax-aUmin;
+ else
+ {
+ Standard_Boolean bIsUClosed = aSB->IsUClosed();
+ Standard_Boolean bIsVClosed = aSB->IsVClosed();
+ Standard_Real aGlobalUmin, aGlobalUmax, aGlobalVmin, aGlobalVmax;
+ aSB->Bounds(aGlobalUmin, aGlobalUmax, aGlobalVmin, aGlobalVmax);
+
+ if (bIsUClosed &&
+ Abs(aUmin - aGlobalUmin) < aTol &&
+ Abs(aUmax - aGlobalUmax) < aTol)
+ {
+ bIsUPeriodic = Standard_True;
+ anUPeriod = aUmax - aUmin;
+ }
+ if (bIsVClosed &&
+ Abs(aVmin - aGlobalVmin) < aTol &&
+ Abs(aVmax - aGlobalVmax) < aTol)
+ {
+ bIsVPeriodic = Standard_True;
+ anVPeriod = aVmax - aVmin;
+ }
}
- if (bIsVClosed) {
- anVPeriod=aVmax-aVmin;
+
+ if (!(bIsUPeriodic || bIsVPeriodic)) {
+ return Standard_False;
}
- }
+ } //if !RTS.IsNull
}
//
//---------------------------------------------------
--- /dev/null
+puts "TODO CR29596 ALL: Warning: Intersection of pair of shapes has failed"
+
+puts "=========================================="
+puts "0031890: Invalid result of common fuse BOP"
+puts "=========================================="
+puts ""
+
+restore [locate_data_file bug31890_sol.brep] sol
+restore [locate_data_file bug31890_ext.brep] ext
+
+bclearobjects
+bcleartools
+baddobjects sol
+baddtools ext
+
+bfillds
+
+bbuild inv
+checkshape inv
+
+set tolres [checkmaxtol inv]
+
+if { ${tolres} > 6.e-6} {
+ puts "Error: bad tolerance of result"
+}
+
+bbop r_0 0
+bbop r_1 1
+
+checkshape r_0
+checknbshapes r_0 -solid 1 -shell 1 -face 9 -wire 11
+checkprops r_0 -s 58.2381 -v 14.1288
+
+checkshape r_1
+checknbshapes r_1 -solid 1 -shell 1 -face 16 -wire 18
+checkprops r_1 -s 91.6213 -v 39.4973