1 Blend_CSWalking::Blend_CSWalking(const TheCurve& Curv,
2 const TheSurface& Surf,
3 const Handle(TheTopolTool)& Domain):
4 done(Standard_False),surf(Surf),
12 void Blend_CSWalking::Perform(Blend_CSFunction& Func,
13 // Blend_CSFuncInv& FuncInv,
14 const Standard_Real Pdep,
15 const Standard_Real Pmax,
16 const Standard_Real MaxStep,
17 const Standard_Real TolGuide,
18 const math_Vector& ParDep,
19 const Standard_Real Tolesp,
20 const Standard_Real Fleche,
21 const Standard_Boolean Appro)
24 done = Standard_False;
25 iscomplete = Standard_False;
26 comptra = Standard_False;
27 line = new TheLine ();
28 Standard_Integer Nbvar = Func.NbVariables();
30 tolgui = Abs(TolGuide);
32 rebrou = Standard_False;
33 pasmax = Abs(MaxStep);
34 math_Vector sol(1,Nbvar);
36 firstsol = new TColStd_HArray1OfReal(1,Nbvar);
38 if (Pmax-Pdep >= 0.) {
46 TheExtremity ptf1,ptf2;
55 // math_Vector tolerance(1,3),infbound(1,3),supbound(1,3);
56 math_Vector tolerance(1,Nbvar),infbound(1,Nbvar),supbound(1,Nbvar);
57 Func.GetTolerance(tolerance,tolesp);
58 Func.GetBounds(infbound,supbound);
59 math_FunctionSetRoot rsnld(Func,tolerance,30);
61 rsnld.Perform(Func,ParDep,infbound,supbound);
63 if (!rsnld.IsDone()) {
68 // situ1 = TheTopolTool::Classify(surf1,gp_Pnt2d(sol(1),sol(2)),
69 // Max(tolerance(1),tolerance(2)));
70 // situ2 = TheTopolTool::Classify(surf2,gp_Pnt2d(sol(3),sol(4)),
71 // Max(tolerance(3),tolerance(4)));
73 situ = domain->Classify(gp_Pnt2d(sol(1),sol(2)),
74 Min(tolerance(1),tolerance(2)));
76 situ = domain->Classify(Func.Pnt2d(),
77 Min(tolerance(1),tolerance(2)));
79 if (situ != TopAbs_IN ) {
87 for (Standard_Integer i=1; i<= Nbvar; i++) {
88 firstsol->ChangeValue(i) = sol(i);
90 State = TestArret(Func,sol,Standard_False,Blend_OK);
91 if (State!=Blend_OK) {
95 if (Blend_GettraceDRAWSECT()){
96 Drawsect(surf,curv,param,Func);
99 // Mettre a jour la ligne.
100 line->Append(previousP);
102 previousP.ParametersOnS(U,V);
103 W = previousP.ParameterOnC();
104 TheExtremity P1(previousP.PointOnS(),U,V,previousP.Parameter(),tolesp);
105 TheExtremity P2(previousP.PointOnC(),W,previousP.Parameter(),tolesp);
107 line->SetStartPoints(P1,P2);
110 line->SetEndPoints(P1,P2);
113 // InternalPerform(Func,FuncInv,Pmax);
114 InternalPerform(Func,sol,Pmax);
116 done = Standard_True;
121 Standard_Boolean Blend_CSWalking::Complete(Blend_CSFunction& Func,
122 // Blend_CSFuncInv& FuncInv,
123 const Standard_Real Pmin)
125 if (!done) {StdFail_NotDone::Raise();}
126 if (iscomplete) {return Standard_True;}
130 previousP = line->Point(1);
133 previousP = line->Point(line->NbPoints());
139 param = previousP.Parameter();
140 previousP.ParametersOnS(sol(1),sol(2));
141 sol(3) = previousP.ParameterOnC();
143 Standard_Integer Nbvar = Func.NbVariables();
144 math_Vector sol(1,Nbvar);
145 for (Standard_Integer i =1; i<= Nbvar; i++) {
146 sol(i) = firstsol->Value(i);
151 // InternalPerform(Func,FuncInv,Pmin);
152 InternalPerform(Func,sol,Pmin);
155 iscomplete = Standard_True;
156 return Standard_True;