From 2adadf979b69c2221cdbfdba8dcd3c4f8f398863 Mon Sep 17 00:00:00 2001 From: skv Date: Wed, 13 Nov 2013 06:26:37 +0000 Subject: [PATCH] 0022353: EDF GEOM: Projection on a edge or a wire --- src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx b/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx index ebc0843ed..e8fa499b5 100644 --- a/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx @@ -344,14 +344,36 @@ Standard_Integer GEOMImpl_ProjectionDriver::Execute(TFunction_Logbook& log) cons // Store the valid solution. hasValidSolution = Standard_True; + + // Normalize parameter. + TopoDS_Edge aSupportEdge = TopoDS::Edge(aSupportShape); + Standard_Real aF, aL; + + BRep_Tool::Range(aSupportEdge, aF, aL); + + if (Abs(aL - aF) <= aTolConf) { + Standard_ConstructionError::Raise + ("Projection aborted : degenerated projection edge"); + } + + aParam = (aParam - aF)/(aL - aF); aProj.SetU(aParam); // Compute edge index. - TopTools_IndexedMapOfShape anIndices; - TopExp::MapShapes(aShape, anIndices); - const int anIndex = anIndices.FindIndex(aSupportShape); + TopExp_Explorer anExp(aShape, TopAbs_EDGE); + int anIndex = 0; - aProj.SetIndex(anIndex); + for (; anExp.More(); anExp.Next(), anIndex++) { + if (aSupportShape.IsSame(anExp.Current())) { + aProj.SetIndex(anIndex); + break; + } + } + + if (!anExp.More()) { + Standard_ConstructionError::Raise + ("Projection aborted : Can't define edge index"); + } // Construct a projection vertex. const gp_Pnt &aPntProj = aDistShSh.PointOnShape2(i);