#include <BOPTest_DrawableShape.hxx>
#include <BOPTest_Objects.hxx>
+#include <IntSurf_PntOn2S.hxx>
//
static BOPAlgo_PaveFiller* pPF=NULL;
theCommands.Add("bsection", "use bsection r s1 s2 [-n2d/-n2d1/-n2d2] [-na]",
__FILE__, bsection, g);
//
- theCommands.Add("bopcurves", "use bopcurves F1 F2 [-2d/-2d1/-2d2]",
+ theCommands.Add("bopcurves", "use bopcurves F1 F2 [-2d/-2d1/-2d2] [-p u1 v1 u2 v2]",
__FILE__, bopcurves, g);
theCommands.Add("bopnews" , "use bopnews -v[e,f]" , __FILE__, bopnews, g);
theCommands.Add("mkvolume", "make solids from set of shapes.\nmkvolume r b1 b2 ... [-c] [-ni]",
Standard_Boolean aToApproxC3d, aToApproxC2dOnS1, aToApproxC2dOnS2, anIsDone;
Standard_Integer i, aNbCurves, aNbPoints;
Standard_Real anAppTol, aTolR;
+ IntSurf_ListOfPntOn2S aListOfPnts;
TCollection_AsciiString aNm("c_"), aNp("p_");
//
anAppTol = 0.0000001;
aToApproxC3d = Standard_True;
aToApproxC2dOnS1 = Standard_False;
aToApproxC2dOnS2 = Standard_False;
+
//
- if (n > 3) {
- if (!strcasecmp(a[3],"-2d")) {
+ for(Standard_Integer i = 3; i < n; i++)
+ {
+ if (!strcasecmp(a[i],"-2d")) {
aToApproxC2dOnS1 = Standard_True;
aToApproxC2dOnS2 = Standard_True;
}
- else if (!strcasecmp(a[3],"-2d1")) {
+ else if (!strcasecmp(a[i],"-2d1")) {
aToApproxC2dOnS1 = Standard_True;
}
- else if (!strcasecmp(a[3],"-2d2")) {
+ else if (!strcasecmp(a[i],"-2d2")) {
aToApproxC2dOnS2 = Standard_True;
}
+ else if (!strcasecmp(a[i],"-p")) {
+ IntSurf_PntOn2S aPt;
+ const Standard_Real aU1 = Draw::Atof(a[++i]);
+ const Standard_Real aV1 = Draw::Atof(a[++i]);
+ const Standard_Real aU2 = Draw::Atof(a[++i]);
+ const Standard_Real aV2 = Draw::Atof(a[++i]);
+
+ aPt.SetValue(aU1, aV1, aU2, aV2);
+ aListOfPnts.Append(aPt);
+ }
else {
- di << "Wrong key. To build 2d curves use: bopcurves F1 F2 -2d/-2d1/-2d2 \n";
+ di << "Wrong key. To build 2d curves use: bopcurves F1 F2 [-2d/-2d1/-2d2] [-p u1 v1 u2 v2]\n";
return 1;
}
}
+
//
IntTools_FaceFace aFF;
//
aToApproxC2dOnS1,
aToApproxC2dOnS2,
anAppTol);
+ aFF.SetList(aListOfPnts);
//
aFF.Perform (aF1, aF2);
//
Standard_Real& thevmin,
Standard_Real& thevmax);
-static
+static
Standard_Boolean NotUseSurfacesForApprox
(const TopoDS_Face& aF1,
const TopoDS_Face& aF2,
static
Standard_Boolean IsCurveValid(Handle(Geom2d_Curve)& thePCurve);
-static
+static
Standard_Boolean IsPointOnBoundary(const Standard_Real theParameter,
const Standard_Real theFirstBoundary,
const Standard_Real theSecondBoundary,
}
//
const TopoDS_Face& aF = !i ? myFace1 : myFace2;
- aD = FindMaxDistance(aC3D, aFirst, aLast, aF, myContext);
+ aD = FindMaxDistance(aC3D, aFirst, aLast, aF, myContext);
if (aD > aDMax) {
- aDMax = aD;
+ aDMax = aD;
+ }
}
}
- }
//
return aDMax;
}
(aType2==GeomAbs_Plane && aType1==GeomAbs_SurfaceOfExtrusion) ||
(aType1==GeomAbs_Plane && aType2==GeomAbs_BSplineSurface) ||
(aType2==GeomAbs_Plane && aType1==GeomAbs_BSplineSurface) ||
+ (aType1==GeomAbs_Cylinder && aType2==GeomAbs_BSplineSurface) ||
+ (aType2==GeomAbs_Cylinder && aType1==GeomAbs_BSplineSurface)||
!myApprox) {
//
Standard_Real aDMax;
//function : MakeCurve
//purpose :
//=======================================================================
- void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
- const Handle(Adaptor3d_TopolTool)& dom1,
+void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
+ const Handle(Adaptor3d_TopolTool)& dom1,
const Handle(Adaptor3d_TopolTool)& dom2)
{
Standard_Boolean bDone, rejectSurface, reApprox, bAvoidLineConstructor;
return;
}
L = anewL;
-
+
//const Handle(IntPatch_WLine)& aWLineX = Handle(IntPatch_WLine)::DownCast(L);
//DumpWLine(aWLineX);
//
if(!myListOfPnts.IsEmpty()) {
- bAvoidLineConstructor = Standard_True;
+ //char aBuff[10000];
+ //const IntSurf_PntOn2S& aPt = myListOfPnts.First();
+ //Standard_Real u1, v1, u2, v2;
+ //aPt.Parameters(u1, v1, u2, v2);
+
+ //Sprintf(aBuff,"bopcurves f1 f2 -2d");
+ //IntSurf_ListIteratorOfListOfPntOn2S IterLOP1(myListOfPnts);
+ //for(;IterLOP1.More(); IterLOP1.Next())
+ //{
+ // const IntSurf_PntOn2S& aPt = IterLOP1.Value();
+ // Standard_Real u1, v1, u2, v2;
+ // aPt.Parameters(u1, v1, u2, v2);
+
+ // Sprintf(aBuff, "%s -p %+10.20f %+10.20f %+10.20f %+10.20f", aBuff, u1, v1, u2, v2);
+ //}
+
+ //cout << aBuff << endl;
+
+ //bAvoidLineConstructor = Standard_True;
}
Standard_Integer nbp = aWLine->NbPnts();
//
Standard_Real aReachedTol = Precision::Confusion();
bIsDecomposited=DecompositionOfWLine(WL,
- myHS1,
- myHS2,
- myFace1,
- myFace2,
- myLConstruct,
- bAvoidLineConstructor,
- aSeqOfL,
- aReachedTol,
- myContext);
+ myHS1,
+ myHS2,
+ myFace1,
+ myFace2,
+ myLConstruct,
+ bAvoidLineConstructor,
+ aSeqOfL,
+ aReachedTol,
+ myContext);
if ( bIsDecomposited && ( myTolReached3d < aReachedTol ) ) {
myTolReached3d = aReachedTol;
}
// because inside degenerated zone of the surface the approx. algo.
// uses wrong values of normal, etc., and resulting curve will have
// oscillations that we would not like to have.
-
+
static
const Standard_Real theVmin,
const Standard_Real theVmax,
gp_Pnt2d& theNewPoint) {
-
+
gp_Vec2d aVec(theFirstPoint, theLastPoint);
Standard_Integer i = 0, j = 0;
restore [locate_data_file GEN758_nofog.rle] a
-explode a
+explode a f
+
+# see issue #26777
+set GoodNbCurv 1
+
+set log [bopcurves a_1 a_2 -2d -p 0.20639206339545224 0.69260832843385300 0.0 0.017002507022347624]
+regexp {Tolerance Reached=+([-0-9.+eE]+)\n+([-0-9.+eE]+)} ${log} full Tolerance_Reached NbCurv
+
+set expected_Tolerance_Reached 0.00011474465750371152
+set tol_abs_Tolerance_Reached 0.0
+set tol_rel_Tolerance_Reached 1.0e-2
+checkreal "Tolerance Reached" ${Tolerance_Reached} ${expected_Tolerance_Reached} ${tol_abs_Tolerance_Reached} ${tol_rel_Tolerance_Reached}
+
+if {${NbCurv} != ${GoodNbCurv}} {
+ puts "Error: ${GoodNbCurv} curves are expected but ${NbCurv} are found!"
+}
+
+smallview
+clear
+
+if {${NbCurv} == 1} {
+ display c_1
+ fit
+} else {
+ for { set i 1 } { ${i} <= ${NbCurv} } {incr i} {
+ bounds c_$i u1 u2
+ cvalue c_$i u2 xx yy zz
+ point p$i xx yy zz
+ }
+
+ fit
+
+ for { set i 1 } { ${i} <= ${NbCurv} } {incr i} {
+ erase p$i
+ display c_$i
+ }
+}
+
+xwd ${imagedir}/${casename}_curv.png
+
+donly a_1 a_2
+
bsection result a_1 a_2
set length 22.2575
+checksection result
\ No newline at end of file
+puts "TODO OCC26717 ALL: Faulty shapes in variables faulty_1 to faulty_"
+
puts "=========="
puts "BUC60462"
puts "=========="
checkshape result r
set square 94371.7
+checkshape result
set 2dviewer 0
+puts "TODO OCC25917 ALL: Faulty shapes in variables faulty_1 to faulty_"
if { [regexp {Debug mode} [dversion]] } {
puts "TODO OCC25917 ALL: TEST INCOMPLETE"
puts "TODO OCC25917 ALL: Tcl Exception"
--- /dev/null
+puts "============"
+puts "OCC26841"
+puts "============"
+puts ""
+###############################
+## Wrong result obtained by intersection algorithm.
+###############################
+
+restore [locate_data_file bug26841c1-prism.brep] p1
+restore [locate_data_file bug26841c1-deck.brep] a1
+
+bsection result a1 p1 -n2d2
+
+smallview
+donly result
+fit
+display a1 p1
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX : 5
+ EDGE : 5
+ WIRE : 0
+ FACE : 0
+ SHELL : 0
+ SOLID : 0
+ COMPSOLID : 0
+ COMPOUND : 1
+ SHAPE : 11
+"
+
+checknbshapes result -ref ${nbshapes_expected} -t -m "SECTION"
+
+regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance result] full MaxTolerance
+puts "MaxTolerance=$MaxTolerance"
+
+set expected_MaxTolerance 7.0623347214107758e-005
+set tol_abs_MaxTolerance 0.0
+set tol_rel_MaxTolerance 0.01
+checkreal "MaxTolerance" ${MaxTolerance} ${expected_MaxTolerance} ${tol_abs_MaxTolerance} ${tol_rel_MaxTolerance}
+
+set log [checksection result]
+
+if { [string compare -nocase $log " nb alone Vertices : 0\n\n"] } {
+ puts "ERROR: the section is not closed"
+} else {
+ puts "The section is OK"
+}
+
+set only_screen_axo 1
\ No newline at end of file
--- /dev/null
+puts "============"
+puts "OCC26841"
+puts "============"
+puts ""
+###############################
+## Wrong result obtained by intersection algorithm.
+###############################
+
+restore [locate_data_file bug26841c3-prism.brep] p3
+restore [locate_data_file bug26841c3-deck.brep] a3
+
+bsection result a3 p3 -n2d2
+
+smallview
+donly result
+fit
+display a3 p3
+
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX : 10
+ EDGE : 10
+ WIRE : 0
+ FACE : 0
+ SHELL : 0
+ SOLID : 0
+ COMPSOLID : 0
+ COMPOUND : 1
+ SHAPE : 21
+"
+
+checknbshapes result -ref ${nbshapes_expected} -t -m "SECTION"
+
+regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance result] full MaxTolerance
+puts "MaxTolerance=$MaxTolerance"
+
+set expected_MaxTolerance 0.00010145423883977269
+set tol_abs_MaxTolerance 0.0
+set tol_rel_MaxTolerance 0.001
+checkreal "MaxTolerance" ${MaxTolerance} ${expected_MaxTolerance} ${tol_abs_MaxTolerance} ${tol_rel_MaxTolerance}
+
+set log [checksection result]
+
+if { [string compare -nocase $log " nb alone Vertices : 0\n\n"] } {
+ puts "ERROR: the section is not closed"
+} else {
+ puts "The section is OK"
+}
+
+set only_screen_axo 1
\ No newline at end of file