{
Standard_Real Cosi = 0., Cosi2 = 0.;
- Standard_Real stepw = pasmax;
+ Standard_Real stepw = pasmax, SaveStepw = 0.;
+ Standard_Boolean IsAlwaysON = Standard_False;
+ Standard_Boolean IsModeON = Standard_False;
Standard_Integer nbp = line->NbPoints();
if(nbp >= 2){ //On reprend le dernier step s'il n est pas trop petit.
if(sens < 0.){
if(bonpoint && line->NbPoints() == 1 && (situ1 != TopAbs_IN || situ2 != TopAbs_IN)){
State = Blend_StepTooLarge;
bonpoint = 0;
+ if (situ1 != TopAbs_OUT && situ2 != TopAbs_OUT) //ON or IN
+ {
+ if (IsModeON)
+ {
+ bonpoint = 1;
+ situ1 = situ2 = TopAbs_IN;
+ State = Blend_OK;
+ }
+ else
+ {
+ if (IsAlwaysON == Standard_False)
+ SaveStepw = stepw;
+ IsAlwaysON = Standard_True;
+ }
+ }
}
if(bonpoint){
w1 = w2 = Bound;
recad2 = Standard_False;
echecrecad = Standard_False;
control = Standard_False;
+ if (IsModeON && situ1 != TopAbs_OUT && situ2 != TopAbs_OUT)
+ situ1 = situ2 = TopAbs_IN;
+
+ if (IsModeON &&
+ (situ1 == TopAbs_OUT || situ2 == TopAbs_OUT))
+ situ1 = situ2 = TopAbs_OUT;
if (situ1 == TopAbs_OUT || situ1 == TopAbs_ON) {
// pb inverse sur surf1
{
stepw = stepw/2.;
if (Abs(stepw) < tolgui) {
- Ext1.SetValue(previousP.PointOnS1(),
- sol(1),sol(2),
- previousP.Parameter(),tolesp);
- Ext2.SetValue(previousP.PointOnS2(),
- sol(3),sol(4),
- previousP.Parameter(),tolesp);
- if (!previousP.IsTangencyPoint()) {
- Ext1.SetTangent(previousP.TangentOnS1());
- Ext2.SetTangent(previousP.TangentOnS2());
- }
- Arrive = Standard_True;
- if (line->NbPoints()>=2) {
- // Indiquer qu on s arrete en cours de cheminement
- }
-// else {
-// line->Clear();
-// }
+ if (IsAlwaysON)
+ {
+ IsModeON = Standard_True;
+ stepw = SaveStepw;
+ param = parprec + sens*stepw; // on ne risque pas de depasser Bound.
+ evalpinit(parinit,previousP,parprec,param,
+ infbound,supbound, clasonS1, clasonS2);
+ }
+ else
+ {
+ Ext1.SetValue(previousP.PointOnS1(),
+ sol(1),sol(2),
+ previousP.Parameter(),tolesp);
+ Ext2.SetValue(previousP.PointOnS2(),
+ sol(3),sol(4),
+ previousP.Parameter(),tolesp);
+ if (!previousP.IsTangencyPoint()) {
+ Ext1.SetTangent(previousP.TangentOnS1());
+ Ext2.SetTangent(previousP.TangentOnS2());
+ }
+ Arrive = Standard_True;
+ if (line->NbPoints()>=2) {
+ // Indiquer qu on s arrete en cours de cheminement
+ }
+ // else {
+ // line->Clear();
+ // }
+ }
}
else {
param = parprec + sens*stepw; // on ne risque pas de depasser Bound.