From dbbd7a7818b495d666b019c6f5b4faf84d3e0635 Mon Sep 17 00:00:00 2001 From: nds Date: Fri, 20 Dec 2013 08:31:20 +0000 Subject: [PATCH] A fix for a refs #266 - Point insertion in a polyline with type spline --- src/HYDROCurveCreator/CurveCreator_Utils.cxx | 24 ++++++++++++++++--- src/HYDROCurveCreator/CurveCreator_Widget.cxx | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/HYDROCurveCreator/CurveCreator_Utils.cxx b/src/HYDROCurveCreator/CurveCreator_Utils.cxx index 52911526..25371beb 100644 --- a/src/HYDROCurveCreator/CurveCreator_Utils.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Utils.cxx @@ -56,6 +56,8 @@ #include #include +#include +#include #include #include @@ -130,7 +132,10 @@ void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve, aBuilder.Add( aComp, aVertex ); } else if ( aNbPoints > 1 ) { - Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aNbPoints); + Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt(1, aNbPoints); + TColgp_Array1OfVec aTangents(1, aNbPoints); + Handle(TColStd_HArray1OfBoolean) aTangentFlags = new TColStd_HArray1OfBoolean(1, aNbPoints); + gp_Vec aNullVec(0, 0, 0); TopoDS_Edge aPointEdge; TopoDS_Vertex aVertex; @@ -141,18 +146,29 @@ void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve, int aHIndex = 1; aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); aBuilder.Add( aComp, aVertex ); - aHCurvePoints->SetValue(aHIndex++, aPoint); + if ( !isPolyline ) { + aHCurvePoints->SetValue( aHIndex, aPoint ); + aTangents.SetValue( aHIndex, aNullVec ); + aTangentFlags->SetValue( aHIndex, Standard_False ); + aHIndex++; + } + aPrevPoint = aPoint; aPointIt++; for( ; aPointIt != aPointLast; aPointIt++ ) { aPoint = *aPointIt; aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); aBuilder.Add( aComp, aVertex ); - aHCurvePoints->SetValue(aHIndex++, aPoint); if ( isPolyline ) { TopoDS_Edge aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge(); aBuilder.Add( aComp, aPointEdge ); } + else { + aHCurvePoints->SetValue( aHIndex, aPoint ); + aTangents.SetValue( aHIndex, aNullVec ); + aTangentFlags->SetValue( aHIndex, Standard_False ); + aHIndex++; + } aPrevPoint = aPoint; } if( aSectIsClosed && ( aNbPoints > 2 ) ) { @@ -168,6 +184,8 @@ void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve, // compute BSpline Handle(Geom_BSplineCurve) aBSplineCurve; GeomAPI_Interpolate aGBC(aHCurvePoints, aSectIsClosed, gp::Resolution()); + aGBC.Load(aTangents, aTangentFlags); + aGBC.Perform(); if ( aGBC.IsDone() ) aBSplineCurve = aGBC.Curve(); diff --git a/src/HYDROCurveCreator/CurveCreator_Widget.cxx b/src/HYDROCurveCreator/CurveCreator_Widget.cxx index 7680ac14..5880c724 100644 --- a/src/HYDROCurveCreator/CurveCreator_Widget.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Widget.cxx @@ -1203,6 +1203,7 @@ void CurveCreator_Widget::insertPointToSelectedSegment( const int theX, CurveCreator_ICurve::SectionToPointList::const_iterator anIt = aPoints1.begin(), aLast = aPoints1.end(); int aSectionId = -1; + // find the indices of the neighbour point // there can be a case when a new point is added into two sections int aPoint1Id = -1, aPoint2Id = -1; for ( ; anIt != aLast && aSectionId < 0; anIt++ ) { -- 2.39.2