From: nbv Date: Fri, 7 Dec 2012 10:12:54 +0000 (+0400) Subject: 0023535: Exception in BSplCLib::BuildCache() X-Git-Tag: V6_6_0_beta~181 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=de8791eebc8fc288c52ac1a993a7ea1c81060e62 0023535: Exception in BSplCLib::BuildCache() Preliminary result. It was tested with spl_2.brep file only. Add "const" Adding test cases for this fix --- diff --git a/src/IntCurve/IntCurve_IntCurveCurveGen.cdl b/src/IntCurve/IntCurve_IntCurveCurveGen.cdl index 5094016fae..0494d9450a 100755 --- a/src/IntCurve/IntCurve_IntCurveCurveGen.cdl +++ b/src/IntCurve/IntCurve_IntCurveCurveGen.cdl @@ -212,7 +212,28 @@ is raises ConstructionError from Standard is static private; - + + + + InternalCompositePerform_noRecurs(me: in out; + NbInterC1: Integer from Standard; + C1: TheCurve; + NumInterC1: Integer from Standard; + Tab1: Array1OfReal from TColStd; + D1: Domain from IntRes2d; + NbInterC2: Integer from Standard; + C2: TheCurve; + NumInterC2: Integer from Standard; + Tab2: Array1OfReal from TColStd; + D2: Domain from IntRes2d; + TolConf,Tol: Real from Standard) + + ---Purpose: Part of InternalCompositePerform function + + raises ConstructionError from Standard + is static private; + + InternalCompositePerform(me: in out; C1: TheCurve; D1: Domain from IntRes2d; diff --git a/src/IntCurve/IntCurve_IntCurveCurveGen.gxx b/src/IntCurve/IntCurve_IntCurveCurveGen.gxx index 976b693441..08003db052 100755 --- a/src/IntCurve/IntCurve_IntCurveCurveGen.gxx +++ b/src/IntCurve/IntCurve_IntCurveCurveGen.gxx @@ -805,6 +805,102 @@ void IntCurve_IntCurveCurveGen::InternalPerform (const TheCurve& C1, } } +void IntCurve_IntCurveCurveGen::InternalCompositePerform_noRecurs( + const Standard_Integer NbInterC1, + const TheCurve& C1, + const Standard_Integer NumInterC1, + const TColStd_Array1OfReal& Tab1, + const IntRes2d_Domain& D1, + const Standard_Integer NbInterC2, + const TheCurve& C2, + const Standard_Integer NumInterC2, + const TColStd_Array1OfReal& Tab2, + const IntRes2d_Domain& D2, + const Standard_Real TolConf, + const Standard_Real Tol) +{ + + + if(NumInterC2>NbInterC2) + return; + + + IntRes2d_Domain DomainC1NumInter; + IntRes2d_Domain DomainC2NumInter; + + //---------------------------------------------------------------------- + //-- Creation du domaine associe a la portion de C1 + //---------------------------------------------------------------------- + Standard_Boolean DomainIsOK = Standard_True; + Standard_Real ParamInf,ParamSup; + + if(NbInterC1>1) { + TheCurveTool::GetInterval(C1,NumInterC1,Tab1,ParamInf,ParamSup); + //-------------------------------------------------------------- + //-- Verification : Domaine Inclu dans Intervalle de Definition + //-------------------------------------------------------------- + + Standard_Real u; + + u = D1.FirstParameter(); + if(ParamInf < u) { ParamInf = u; } + + u = D1.LastParameter(); + if(ParamSup > u) { ParamSup = u; } + + if((ParamSup - ParamInf) > 1e-10) { + DomainC1NumInter.SetValues(TheCurveTool::Value(C1,ParamInf), + ParamInf, + D1.FirstTolerance(), + TheCurveTool::Value(C1,ParamSup), + ParamSup, + D1.LastTolerance()); + } else { + DomainIsOK = Standard_False; + } + } else { + DomainC1NumInter = D1; + } + + //---------------------------------------------------------------------- + //-- Creation du domaine associe a la portion de C2 + //---------------------------------------------------------------------- + if(NbInterC2 > 1) { + TheCurveTool::GetInterval(C2,NumInterC2,Tab2,ParamInf,ParamSup); + //-------------------------------------------------------------- + //-- Verification : Domaine Inclu dans Intervalle de Definition + //-------------------------------------------------------------- + + Standard_Real u; + + u = D2.FirstParameter(); + if(ParamInf < u) { ParamInf = u; } + u = D2.LastParameter(); + + if(ParamSup > u) { ParamSup = u; } + + if((ParamSup - ParamInf) > 1e-10) { + DomainC2NumInter.SetValues(TheCurveTool::Value(C2,ParamInf), + ParamInf, + D2.FirstTolerance(), + TheCurveTool::Value(C2,ParamSup), + ParamSup, + D2.LastTolerance()); + } else { + DomainIsOK = Standard_False; + } + } else { + DomainC2NumInter = D2; + } + + if(DomainIsOK) { + InternalPerform(C2,DomainC2NumInter, + C1,DomainC1NumInter, + TolConf,Tol, + Standard_True); + } +} + @@ -826,115 +922,39 @@ IntCurve_IntCurveCurveGen::InternalCompositePerform(const TheCurve& C1, const Standard_Real Tol, const Standard_Boolean RecursOnC2) { - Standard_Integer NumInterC2=XXXNumInterC2; + Standard_Integer NumInterC2=XXXNumInterC2; Standard_Integer NumInterC1=XXXNumInterC1; // Standard_Boolean Arret=Standard_False; - if(NumInterC2<=NbInterC2) { - if(RecursOnC2) { - for(Standard_Integer i=NumInterC1 ; i<=NbInterC1; i++) { - NumInterC1=i; - InternalCompositePerform(C2,D2,NumInterC2,NbInterC2,Tab2, - C1,D1,NumInterC1,NbInterC1,Tab1, - TolConf,Tol, - Standard_False); - } - if(NumInterC21) { - TheCurveTool::GetInterval(C1,NumInterC1,Tab1,ParamInf,ParamSup); - //-------------------------------------------------------------- - //-- Verification : Domaine Inclu dans Intervalle de Definition - //-------------------------------------------------------------- - Standard_Real u; - - u = D1.FirstParameter(); - if(ParamInf < u) { ParamInf = u; } - - u = D1.LastParameter(); - if(ParamSup > u) { ParamSup = u; } - - if((ParamSup - ParamInf) > 1e-10) { - DomainC1NumInter.SetValues(TheCurveTool::Value(C1,ParamInf), - ParamInf, - D1.FirstTolerance(), - TheCurveTool::Value(C1,ParamSup), - ParamSup, - D1.LastTolerance()); - } - else { - DomainIsOK = Standard_False; - } - } - else { - DomainC1NumInter = D1; - } - - //---------------------------------------------------------------------- - //-- Creation du domaine associe a la portion de C2 - //---------------------------------------------------------------------- - if(NbInterC2 > 1) { - TheCurveTool::GetInterval(C2,NumInterC2,Tab2,ParamInf,ParamSup); - //-------------------------------------------------------------- - //-- Verification : Domaine Inclu dans Intervalle de Definition - //-------------------------------------------------------------- - Standard_Real u; - - u = D2.FirstParameter(); - if(ParamInf < u) { ParamInf = u; } - - u = D2.LastParameter(); - if(ParamSup > u) { ParamSup = u; } - - if((ParamSup - ParamInf) > 1e-10) { - DomainC2NumInter.SetValues(TheCurveTool::Value(C2,ParamInf), - ParamInf, - D2.FirstTolerance(), - TheCurveTool::Value(C2,ParamSup), - ParamSup, - D2.LastTolerance()); - } - else { - DomainIsOK = Standard_False; - } - } - else { - DomainC2NumInter = D2; - } - - if(DomainIsOK) { - InternalPerform(C2,DomainC2NumInter, - C1,DomainC1NumInter, - TolConf,Tol, - Standard_True); - } - } + if(NumInterC2>NbInterC2) + return; + + if(!RecursOnC2){ + InternalCompositePerform_noRecurs(NbInterC1, C1, NumInterC1, Tab1, D1, NbInterC2, C2, NumInterC2, Tab2, D2, TolConf, Tol); + return; + } + + for(Standard_Integer i=NumInterC1 ; i<=NbInterC1; i++) { + NumInterC1=i; + /* + InternalCompositePerform(C2,D2,NumInterC2,NbInterC2,Tab2, + C1,D1,NumInterC1,NbInterC1,Tab1, + TolConf,Tol,Standard_False); + */ + + InternalCompositePerform_noRecurs(NbInterC2,C2,NumInterC2,Tab2,D2,NbInterC1,C1,NumInterC1,Tab1,D1,TolConf,Tol); + } + + if(NumInterC2