1// Copyright (c) 1995-1999 Matra Datavision 2// Copyright (c) 1999-2014 OPEN CASCADE SAS 3// 4// This file is part of Open CASCADE Technology software library. 5// 6// This library is free software; you can redistribute it and/or modify it under 7// the terms of the GNU Lesser General Public License version 2.1 as published 8// by the Free Software Foundation, with special exception defined in the file 9// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT 10// distribution for complete text of the license and disclaimer of any warranty. 11// 12// Alternatively, this file may be used under the terms of Open CASCADE 13// commercial license or contractual agreement. 14 15/* 16Standard_Boolean Blend_CSWalking::Recadre(Blend_FuncInv& FuncInv, 17 const Standard_Boolean OnFirst, 18 const math_Vector& sol, 19 math_Vector& solrst, 20 Standard_Integer& Indexsol, 21 Standard_Boolean& IsVtx, 22 TheVertex& Vtx) 23 24{ 25 Standard_Integer nbarc; 26 Standard_Boolean ok,yamin; 27 Standard_Real dist,distmin,prm,pmin; 28 gp_Pnt2d pt2d; 29 math_Vector toler(1,4),infb(1,4),supb(1,4),valsol(1,4); 30 31 Handle(TheTopolTool) Iter; 32 TopAbs_State situ; 33 34 yamin = Standard_False; 35 nbarc = 0; 36 distmin = RealLast(); 37 if (OnFirst) { 38 pt2d.SetCoord(sol(1),sol(2)); 39 Iter = domain1; 40 } 41 else { 42 pt2d.SetCoord(sol(3),sol(4)); 43 Iter = domain2; 44 } 45 Iter->Init(); 46 while (Iter->More()) { 47 nbarc++; 48 if (OnFirst) { 49 ok = TheBlendTool::Project(pt2d,surf1,Iter->Value(),prm,dist); 50 } 51 else { 52 ok = TheBlendTool::Project(pt2d,surf2,Iter->Value(),prm,dist); 53 } 54 if (ok) { 55 if (dist<distmin) { 56 yamin = Standard_True; 57 distmin = dist; 58 pmin = prm; 59 Indexsol = nbarc; 60 } 61 } 62 Iter->Next(); 63 } 64 65 IsVtx = Standard_False; 66 if (!yamin) { 67 return Standard_False; 68 } 69 70 Iter->Init(); 71 nbarc = 1; 72 while (nbarc < Indexsol) { 73 nbarc++; 74 Iter->Next(); 75 } 76 77 TheArc thearc = Iter->Value(); 78 Handle(Adaptor2d_HCurve2d) thecur; 79 if (OnFirst) { 80 thecur = TheBlendTool::CurveOnSurf(thearc,surf1); 81 } 82 else { 83 thecur = TheBlendTool::CurveOnSurf(thearc,surf2); 84 } 85 86 FuncInv.Set(OnFirst,thecur); 87 88 FuncInv.GetTolerance(toler,tolesp); 89 FuncInv.GetBounds(infb,supb); 90 solrst(1) = pmin; 91 solrst(2) = param; 92 93 if (OnFirst) { 94 solrst(3) = sol(3); 95 solrst(4) = sol(4); 96 } 97 else { 98 solrst(3) = sol(1); 99 solrst(4) = sol(2); 100 } 101 102 math_FunctionSetRoot rsnld(FuncInv,toler,30); 103 rsnld.Perform(FuncInv,solrst,infb,supb); 104 105 106 107 if (!rsnld.IsDone()) { 108#ifdef OCCT_DEBUG 109 std::cout << "RSNLD not done "<< std::endl << std::endl; 110#endif 111 return Standard_False; 112 } 113 114 // On doit verifier la valeur de la fonction 115 rsnld.Root(solrst); 116 117 if (FuncInv.IsSolution(solrst,tolesp)) { 118 119// if (OnFirst) { 120// situ = TheTopolTool::Classify(surf2,gp_Pnt2d(solrst(3),solrst(4)), 121// Max(toler(3),toler(4))); 122// 123// } 124// else { 125// situ = TheTopolTool::Classify(surf1,gp_Pnt2d(solrst(3),solrst(4)), 126// Max(toler(3),toler(4))); 127// } 128 129 if (OnFirst) { 130 situ = domain2->Classify(gp_Pnt2d(solrst(3),solrst(4)), 131 Min(toler(3),toler(4))); 132 133 } 134 else { 135 situ = domain1->Classify(gp_Pnt2d(solrst(3),solrst(4)), 136 Min(toler(3),toler(4))); 137 } 138 139 140 if ((situ != TopAbs_IN) && (situ != TopAbs_ON)) { 141 return Standard_False; 142 } 143 144 Iter->Initialize(thearc); 145 Iter->InitVertexIterator(); 146 IsVtx = !Iter->MoreVertex(); 147 while (!IsVtx) { 148 Vtx = Iter->Vertex(); 149 if (Abs(TheBlendTool::Parameter(Vtx,thearc)-solrst(1)) <= 150 TheBlendTool::Tolerance(Vtx,thearc)) { 151 IsVtx = Standard_True; 152 } 153 else { 154 Iter->NextVertex(); 155 IsVtx = !Iter->MoreVertex(); 156 } 157 } 158 if (!Iter->MoreVertex()) { 159 IsVtx = Standard_False; 160 } 161 162 return Standard_True; 163 } 164 165 return Standard_False; 166} 167 168*/ 169 170 171void Blend_CSWalking::Transition(const TheArc& A, 172 const Standard_Real Param, 173 IntSurf_Transition& TLine, 174 IntSurf_Transition& TArc) 175{ 176 177 gp_Pnt2d p2d; 178 gp_Vec2d dp2d; 179 180 gp_Pnt pbid; 181 gp_Vec d1u,d1v,normale,tgrst; 182 183 TheArcTool::D1(A,Param,p2d,dp2d); 184 TheSurfaceTool::D1(surf,p2d.X(),p2d.Y(),pbid,d1u,d1v); 185 186 tgrst.SetLinearForm(dp2d.X(),d1u,dp2d.Y(),d1v); 187 normale = d1u.Crossed(d1v); 188 189 IntSurf::MakeTransition(previousP.TangentOnS(),tgrst,normale,TLine,TArc); 190 191} 192 193 194void Blend_CSWalking::MakeExtremity(TheExtremity& Extrem, 195 const Standard_Integer Index, 196 const Standard_Real Param, 197 const Standard_Boolean IsVtx, 198 const TheVertex& Vtx) 199{ 200 201 IntSurf_Transition Tline,Tarc; 202 Standard_Real prm,U,V; 203 Standard_Integer nbarc; 204 Handle(TheTopolTool) Iter; 205 206// Extrem.SetValue(previousP.PointOnS(),sol(1),sol(2),tolesp); 207 previousP.ParametersOnS(U,V); 208 Extrem.SetValue(previousP.PointOnS(),U,V,previousP.Parameter(),tolesp); 209 Iter = domain; 210 211 212 Iter->Init(); 213 nbarc = 1; 214 215 if (!IsVtx) { 216 while (nbarc < Index) { 217 nbarc++; 218 Iter->Next(); 219 } 220 Transition(Iter->Value(),Param,Tline,Tarc); 221 Extrem.AddArc(Iter->Value(),Param,Tline,Tarc); 222 } 223 224 else { 225 226 Extrem.SetVertex(Vtx); 227 while (Iter->More()) { 228 TheArc arc = Iter->Value(); 229 if (nbarc != Index) { 230 Iter->Initialize(arc); 231 Iter->InitVertexIterator(); 232 while (Iter->MoreVertex()) { 233// if (TheTopolTool::Identical(Vtx,Iter.Vertex())) { 234 if (Iter->Identical(Vtx,Iter->Vertex())) { 235 prm = TheBlendTool::Parameter(Vtx,arc); 236 Transition(arc,prm,Tline,Tarc); 237 Extrem.AddArc(arc,prm,Tline,Tarc); 238 } 239 Iter->NextVertex(); 240 } 241 } 242 else { 243 Transition(arc,Param,Tline,Tarc); 244 Extrem.AddArc(arc,Param,Tline,Tarc); 245 } 246 nbarc++; 247 Iter->Next(); 248 } 249 } 250} 251