Minor correction.
Test-cases for issue #26185
Modifications in test-cases according to developer's notes
// MapNodeVertex,VE);
}
+ if (myJoinType == GeomAbs_Intersection)
+ StartOnEdge = EndOnEdge = 0;
+
//---------------------------------------------
// Construction of geometries.
//---------------------------------------------
// Construction of vertices on edges parallel to the spine.
//-----------------------------------------------------------
- Trim.IntersectWith(E [0], E [1], Params);
+ Trim.IntersectWith(E [0], E [1], myJoinType, Params);
for (Standard_Integer s = 1; s <= Params.Length(); s++) {
TopoDS_Vertex VC;
Curve from Geom2d,
Geometry from Geom2d,
SequenceOfPnt from TColgp,
- Curve from Geom2dAdaptor
+ Curve from Geom2dAdaptor,
+ JoinType from GeomAbs
is
Create
IntersectWith( me : in out;
Edge1 , Edge2 : Edge from TopoDS;
+ theJoinType : JoinType from GeomAbs;
Params : in out SequenceOfPnt from TColgp)
is static;
//=======================================================================
void BRepFill_TrimEdgeTool::IntersectWith(const TopoDS_Edge& Edge1,
- const TopoDS_Edge& Edge2,
- TColgp_SequenceOfPnt& Params)
+ const TopoDS_Edge& Edge2,
+ const GeomAbs_JoinType theJoinType,
+ TColgp_SequenceOfPnt& Params)
{
Params.Clear();
}
NbPoints = Params.Length();
+
+ if (NbPoints > 0 && theJoinType == GeomAbs_Intersection)
+ {
+ //Remove all vertices with non-minimal parameter
+ Standard_Integer imin = 1;
+ for (i = 2; i <= NbPoints; i++)
+ if (Params(i).X() < Params(imin).X())
+ imin = i;
+ gp_Pnt Pnt1 = Params(imin);
+ gp_Pnt Pnt2 = Points2(imin);
+ Params.Clear();
+ Points2.Clear();
+ Params.Append(Pnt1);
+ Points2.Append(Pnt2);
+ }
+
+ NbPoints = Params.Length();
for ( i = 1; i <= NbPoints; i++) {
PSeq = Params(i);
PSeq.SetZ((Points2.Value(i)).Y());
Point from Geom2d ,
Pnt2d from gp ,
Vec2d from gp ,
- Integer from Standard
+ Integer from Standard,
+ JoinType from GeomAbs
is
Create returns Bisec from Bisector;
Perform(me : in out ;
- Cu1 : Curve from Geom2d ;
- Cu2 : Curve from Geom2d ;
- P : Pnt2d from gp ;
- V1 : Vec2d from gp ;
- V2 : Vec2d from gp ;
- Sense : Real from Standard ;
- Tolerance : Real from Standard ;
- oncurve : Boolean from Standard = Standard_True );
+ Cu1 : Curve from Geom2d ;
+ Cu2 : Curve from Geom2d ;
+ P : Pnt2d from gp ;
+ V1 : Vec2d from gp ;
+ V2 : Vec2d from gp ;
+ Sense : Real from Standard ;
+ ajointype : JoinType from GeomAbs ;
+ Tolerance : Real from Standard ;
+ oncurve : Boolean from Standard = Standard_True );
--- Purpose : Performs the bisecting line between the curves
-- <Cu1> and <Cu2>.
//===========================================================================
void Bisector_Bisec::Perform(const Handle(Geom2d_Curve)& afirstcurve ,
- const Handle(Geom2d_Curve)& asecondcurve ,
- const gp_Pnt2d& apoint ,
- const gp_Vec2d& afirstvector ,
- const gp_Vec2d& asecondvector ,
- const Standard_Real adirection ,
- const Standard_Real tolerance ,
- const Standard_Boolean oncurve )
+ const Handle(Geom2d_Curve)& asecondcurve ,
+ const gp_Pnt2d& apoint ,
+ const gp_Vec2d& afirstvector ,
+ const gp_Vec2d& asecondvector ,
+ const Standard_Real adirection ,
+ const GeomAbs_JoinType ajointype ,
+ const Standard_Real tolerance ,
+ const Standard_Boolean oncurve )
{
Handle(Standard_Type) Type1 = afirstcurve ->DynamicType();
Handle(Standard_Type) Type2 = asecondcurve->DynamicType();
//------------------------------------------------------------------
// Analytic Bissectrice.
//------------------------------------------------------------------
- Handle(Bisector_BisecAna) BisAna = new Bisector_BisecAna();
- BisAna->Perform(afirstcurve1 ,
- asecondcurve1 ,
- apoint ,
- afirstvector ,
- asecondvector ,
- adirection ,
- tolerance ,
- oncurve );
- UFirst = BisAna->ParameterOfStartPoint();
- ULast = BisAna->ParameterOfEndPoint();
- Bis = BisAna;
+ Handle(Bisector_BisecAna) BisAna = new Bisector_BisecAna();
+ BisAna->Perform(afirstcurve1 ,
+ asecondcurve1 ,
+ apoint ,
+ afirstvector ,
+ asecondvector ,
+ adirection ,
+ ajointype ,
+ tolerance ,
+ oncurve );
+ UFirst = BisAna->ParameterOfStartPoint();
+ ULast = BisAna->ParameterOfEndPoint();
+ Bis = BisAna;
}
else {
Standard_Boolean IsLine = Standard_False;
uses
Shape from GeomAbs,
CurveType from GeomAbs,
+ JoinType from GeomAbs,
Curve from Geom2d,
Geometry from Geom2d,
TrimmedCurve from Geom2d,
Create returns BisecAna;
Perform(me : mutable ;
- Cu1 : Curve from Geom2d ;
- Cu2 : Curve from Geom2d ;
- P : Pnt2d from gp ;
- V1 : Vec2d from gp ;
- V2 : Vec2d from gp ;
- Sense : Real from Standard ;
- Tolerance : Real from Standard ;
- oncurve : Boolean from Standard = Standard_True );
+ Cu1 : Curve from Geom2d ;
+ Cu2 : Curve from Geom2d ;
+ P : Pnt2d from gp ;
+ V1 : Vec2d from gp ;
+ V2 : Vec2d from gp ;
+ Sense : Real from Standard ;
+ jointype : JoinType from GeomAbs ;
+ Tolerance : Real from Standard ;
+ oncurve : Boolean from Standard = Standard_True );
--- Purpose : Performs the bisecting line between the curves
-- <Cu1> and <Cu2>.
Sense : Real from Standard ;
U : out Real from Standard ;
sense : out Boolean from Standard ;
- ok : out Boolean from Standard )
+ ok : out Boolean from Standard ;
+ IsBisecOfTwoLines : Boolean from Standard = Standard_False)
--- Purpose : Returns the distance between the point <P> and
-- the bisecting <Bis>.
const Standard_Real adirection,
Standard_Real& aparameter,
Standard_Boolean& asense,
- Standard_Boolean& astatus)
+ Standard_Boolean& astatus,
+ Standard_Boolean IsBisecOfTwoLines)
{
astatus = Standard_True;
else {
asense = Standard_True;
-// Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 Begin
-// Replacement of -1.E-8 for a tolerance 1.e-4
- Standard_Real aTol = 1.e-4;
-
- if ((afirstdir^secdirrev)*adirection < -0.1) { // input
- if((afirstdir^tangdir)*adirection < aTol &&
- (secdirrev^tangdir)*adirection < aTol) asense = Standard_False;
- }
- else if((afirstdir^secdirrev)*adirection > 0.1) { // output
- if((afirstdir^tangdir)*adirection < aTol ||
- (secdirrev^tangdir)*adirection < aTol) asense = Standard_False;
- }
- else { // flat
- if (afirstdir.Dot(secdirrev) > 0.) { // tangent
- if ((afirstdir^tangdir)*adirection < 0.) asense = Standard_False;
+ if (!IsBisecOfTwoLines)
+ {
+ // Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 Begin
+ // Replacement of -1.E-8 for a tolerance 1.e-4
+ Standard_Real aTol = 1.e-4;
+
+ if ((afirstdir^secdirrev)*adirection < -0.1) { // input
+ if((afirstdir^tangdir)*adirection < aTol &&
+ (secdirrev^tangdir)*adirection < aTol)
+ asense = Standard_False;
}
- else{ // turn back
-// Modified by Sergey KHROMOV - Thu Oct 31 14:16:53 2002
-// if ((afirstdir.Dot(tangdir))*adirection > 0.) asense = Standard_False;
- if (afirstdir.Dot(tangdir) < 0.) asense = Standard_False;
-// Modified by Sergey KHROMOV - Thu Oct 31 14:16:54 2002
+ else if((afirstdir^secdirrev)*adirection > 0.1) { // output
+ if((afirstdir^tangdir)*adirection < aTol ||
+ (secdirrev^tangdir)*adirection < aTol)
+ asense = Standard_False;
}
+ else { // flat
+ if (afirstdir.Dot(secdirrev) > 0.) { // tangent
+ if ((afirstdir^tangdir)*adirection < 0.)
+ asense = Standard_False;
+ }
+ else{ // turn back
+ // Modified by Sergey KHROMOV - Thu Oct 31 14:16:53 2002
+ // if ((afirstdir.Dot(tangdir))*adirection > 0.) asense = Standard_False;
+ if (afirstdir.Dot(tangdir) < 0.) asense = Standard_False;
+ // Modified by Sergey KHROMOV - Thu Oct 31 14:16:54 2002
+ }
+ }
+ // Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 End
}
-// Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 End
}
return distance;
}
const gp_Vec2d& afirstvector ,
const gp_Vec2d& asecondvector ,
const Standard_Real adirection ,
+ const GeomAbs_JoinType ajointype ,
const Standard_Real tolerance ,
const Standard_Boolean oncurve )
{
}
else if (type == GccInt_Par) {
bisectorcurve = new Geom2d_Parabola(TheSol->Parabola());
+ Standard_Real FocalLength = ((Handle(Geom2d_Parabola)&)bisectorcurve)->Focal();
+ Standard_Real secondparameter = Precision::Infinite();
if (!thesense)
+ {
+ if (ajointype == GeomAbs_Intersection &&
+ 4.*FocalLength < firstparameter) //first parameter is too far from peak of parabola
+ secondparameter = 0.;
thebisector = new Geom2d_TrimmedCurve(bisectorcurve,
firstparameter,
- - Precision::Infinite());
+ -secondparameter);
+ }
else
+ {
+ if (ajointype == GeomAbs_Intersection &&
+ firstparameter < -4.*FocalLength) //first parameter is too far from peak of parabola
+ secondparameter = 0.;
thebisector = new Geom2d_TrimmedCurve(bisectorcurve,
firstparameter,
- Precision::Infinite());
+ secondparameter);
+ }
}
}
}
else
distanceptsol = Distance(apoint,solution,
afirstvector,asecondvector,
- adirection,parameter,sense,ok);
+ adirection,parameter,sense,ok, Standard_True);
// Modified by skv - Tue Feb 15 17:51:29 2005 Integration End
if (ok || !oncurve) {
thesense = sense;
#endif
if(type1 != STANDARD_TYPE(Geom2d_CartesianPoint) &&
- type2 != STANDARD_TYPE(Geom2d_CartesianPoint)) {
- bisector.Perform(item1,item2,
- GeomPnt (abisector->IssuePoint()),
- GeomVec (abisector->FirstVector()),
- GeomVec (abisector->SecondVector()),
- theDirection,tolerance,ontheline);
+ type2 != STANDARD_TYPE(Geom2d_CartesianPoint)) {
+ bisector.Perform(item1,item2,
+ GeomPnt (abisector->IssuePoint()),
+ GeomVec (abisector->FirstVector()),
+ GeomVec (abisector->SecondVector()),
+ theDirection,theJoinType,tolerance,ontheline);
}
else if(type1 == STANDARD_TYPE(Geom2d_CartesianPoint) &&
type2 == STANDARD_TYPE(Geom2d_CartesianPoint)) {
Standard_Real EpsDist = MAT2d_TOLCONF*300. ;
Distance = Dist(1);
- for (Standard_Integer i = 1; i <= 4; i++){
if (theJoinType == GeomAbs_Intersection &&
- Precision::IsInfinite(Dist(i)))
- continue;
+ Precision::IsInfinite(Distance))
+ {
+ for (Standard_Integer i = 2; i <= 4; i++)
+ if (!Precision::IsInfinite(Dist(i)))
+ {
+ Distance = Dist(i);
+ break;
+ }
+ }
+ for (Standard_Integer i = 1; i <= 4; i++){
+ if (theJoinType == GeomAbs_Intersection &&
+ Precision::IsInfinite(Dist(i)))
+ continue;
if (Abs(Dist(i) - Distance) > EpsDist) {
Distance = Precision::Infinite();
return Standard_False;
Handle(Bisector_BisecCC) BCC1 = Handle(Bisector_BisecCC)::DownCast(Bisector1->BasisCurve());
Bis.Perform(BCC1->Curve(2), BCC1->Curve(1), P2, VBid, VBid,
- theDirection, Tolerance, Standard_False);
+ theDirection, theJoinType, Tolerance, Standard_False);
Bisector1 = Handle(Geom2d_TrimmedCurve)::DownCast(Bis.Value());
BCC1 = Handle(Bisector_BisecCC) ::DownCast(Bisector1->BasisCurve());
} else {
renamevar resoffset_1 result
- set length 42
+ set length 39.5
set nb_v_good 6
set nb_e_good 7
--- /dev/null
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_wrong2.brep] a
+openoffset res a 1 -5. i
+fit
+set only_screen_axo 1
--- /dev/null
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_newOffset_1.brep] a
+openoffset res a 1 -0.6 i
+fit
+set only_screen_axo 1
--- /dev/null
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_v6_Arcs.brep] a
+mkoffset res a 1 -5. i
+fit
+set only_screen_axo 1
--- /dev/null
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_wrong1.brep] a
+mkoffset res_1 a 1 -5. i
+mkoffset res_2 a 1 5. i
+fit
+set only_screen_axo 1
--- /dev/null
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_offsetcircles.brep] a
+mkoffset res a 2 -2. i
+fit
+set only_screen_axo 1
--- /dev/null
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_linesSet.brep] a
+openoffset res a 10 2. i
+fit
+set only_screen_axo 1
--- /dev/null
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_v6_LineArc.brep] a
+mkoffset res_1 a 1 -5. i
+mkoffset res_2 a 1 5. i
+fit
+set only_screen_axo 1