X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_PolylineXY.cxx;h=559947e684ce444fb16022fbd976538962c507f5;hb=545854182f0363f61284d5abe34c3627d4f3b088;hp=44076c82ad77fad66ca4d3d54d08e2cdbf6931d3;hpb=83ea0d4154c73d7368c8de9467410fafeac17d07;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_PolylineXY.cxx b/src/HYDROData/HYDROData_PolylineXY.cxx index 44076c82..559947e6 100755 --- a/src/HYDROData/HYDROData_PolylineXY.cxx +++ b/src/HYDROData/HYDROData_PolylineXY.cxx @@ -29,8 +29,11 @@ #include #include #include +#include +#ifndef LIGHT_MODE #include +#endif #include #include @@ -38,6 +41,7 @@ #include #include +#include #include @@ -54,6 +58,7 @@ #include #include +#include #include #include @@ -116,7 +121,8 @@ IMPLEMENT_STANDARD_HANDLE(HYDROData_PolylineXY, HYDROData_IPolyline) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_PolylineXY, HYDROData_IPolyline) HYDROData_PolylineXY::HYDROData_PolylineXY() -: HYDROData_IPolyline() +: HYDROData_IPolyline(), + myIsInCustomFlag( false ) { } @@ -212,6 +218,9 @@ QColor HYDROData_PolylineXY::DefaultWireColor() bool HYDROData_PolylineXY::ImportFromGeomIOR( const TCollection_AsciiString& theIOR ) { +#ifdef LIGHT_MODE + return false; +#else if ( theIOR.IsEmpty() ) return false; @@ -220,6 +229,7 @@ bool HYDROData_PolylineXY::ImportFromGeomIOR( const TCollection_AsciiString& the return false; return ImportShape( aShape ); +#endif } void HYDROData_PolylineXY::SetGeomObjectEntry( const TCollection_AsciiString& theEntry ) @@ -242,17 +252,14 @@ TCollection_AsciiString HYDROData_PolylineXY::GetGeomObjectEntry() const return aRes; } -TopoDS_Shape HYDROData_PolylineXY::GetShape() const -{ - return getPolylineShape(); -} - bool convertEdgeToSection( const TopoDS_Edge& theEdge, NCollection_Sequence& theSectNames, NCollection_Sequence& theSectTypes, NCollection_Sequence& theSectClosures, NCollection_Sequence& theSectPoints, - const bool theIsCanBeClosed ) + bool IsCanBeClosed, + bool IsInterpolationAllowed, + double theDeflection ) { Standard_Real aFirst = 0.0, aLast = 0.0; Handle(Geom_Curve) anEdgeGeomCurve = BRep_Tool::Curve( theEdge, aFirst, aLast ); @@ -265,7 +272,7 @@ bool convertEdgeToSection( const TopoDS_Edge& HYDROData_PolylineXY::SectionType aSectionType = HYDROData_PolylineXY::SECTION_POLYLINE; HYDROData_PolylineXY::PointsList aPointsList; - if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_Line) ) ) + if( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_Line) ) ) { Handle(Geom_Line) aGeomLine = Handle(Geom_Line)::DownCast( anEdgeGeomCurve ); @@ -279,28 +286,22 @@ bool convertEdgeToSection( const TopoDS_Edge& HYDROData_PolylineXY::Point aSectLastPoint( aLastPoint.X(), aLastPoint.Y() ); aPointsList.Append( aSectLastPoint ); } - else if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_BSplineCurve) ) ) + else if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_BSplineCurve) ) || IsInterpolationAllowed ) { aSectionType = HYDROData_PolylineXY::SECTION_SPLINE; - Handle(Geom_BSplineCurve) aGeomSpline = - Handle(Geom_BSplineCurve)::DownCast( anEdgeGeomCurve ); + BRepAdaptor_Curve anAdaptorCurve( theEdge ); + GCPnts_QuasiUniformDeflection aDiscrete( anAdaptorCurve, theDeflection ); - int aNbKnots = aGeomSpline->NbKnots(); + int aNbPoints = aDiscrete.NbPoints(); - TColStd_Array1OfReal aSplineKnots( 1, aNbKnots ); - aGeomSpline->Knots( aSplineKnots ); + // Decrease the number of imported poles because of last one + // pole is the closing point which are the start point + if ( anIsEdgeClosed ) aNbPoints--; - // Decrease the number of imported knots because of last one - // knot is the closing point which are the start point - if ( anIsEdgeClosed ) aNbKnots--; - - for ( int i = 1; i <= aNbKnots; ++i ) + for ( int i = 1; i <= aNbPoints; ++i ) { - const Standard_Real& aKnot = aSplineKnots.Value( i ); - - gp_Pnt aPoint; - aGeomSpline->D0( aKnot, aPoint ); + const gp_Pnt& aPoint = aDiscrete.Value( i ); HYDROData_PolylineXY::Point aSectPoint( aPoint.X(), aPoint.Y() ); aPointsList.Append( aSectPoint ); @@ -323,7 +324,9 @@ bool convertEdgeToSection( const TopoDS_Edge& return true; } -bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape ) +bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape, + bool IsInterpolationAllowed, + double theDeviation ) { if ( theShape.IsNull() ) return false; @@ -340,7 +343,8 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape ) if ( theShape.ShapeType() == TopAbs_EDGE ) { TopoDS_Edge anEdge = TopoDS::Edge( theShape ); - anIsCanBeImported = convertEdgeToSection( anEdge, aSectNames, aSectTypes, aSectClosures, aSectPoints, true ); + anIsCanBeImported = convertEdgeToSection( anEdge, aSectNames, aSectTypes, + aSectClosures, aSectPoints, true, IsInterpolationAllowed, theDeviation ); } else if ( theShape.ShapeType() == TopAbs_WIRE ) { @@ -351,7 +355,8 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape ) for ( int i = 1, n = anEdges.Length(); i <= n && anIsCanBeImported; ++i ) { TopoDS_Edge aWireEdge = TopoDS::Edge( anEdges.Value( i ) ); - anIsCanBeImported = convertEdgeToSection( aWireEdge, aSectNames, aSectTypes, aSectClosures, aSectPoints, false ); + anIsCanBeImported = convertEdgeToSection( aWireEdge, aSectNames, aSectTypes, + aSectClosures, aSectPoints, false, IsInterpolationAllowed, theDeviation ); } } @@ -393,7 +398,7 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape ) if( aProj.IsDone() ) aResult = aProj.Shape(); - setPolylineShape( aResult ); + SetShape( aResult ); } setEditable( anIsCanBeImported ); @@ -428,9 +433,10 @@ TopoDS_Wire HYDROData_PolylineXY::BuildWire( const SectionType& if ( thePoints.Size() > 1 ) { - HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed, LOCAL_SELECTION_TOLERANCE ); + Handle(Geom_BSplineCurve) aCurve = + HYDROData_BSplineOperation::ComputeCurve( thePoints, theIsClosed, LOCAL_SELECTION_TOLERANCE ); - TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aBSpline.Curve() ).Edge(); + TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aCurve ).Edge(); aMakeWire.Add( anEdge ); } aMakeWire.Build(); @@ -466,8 +472,9 @@ void HYDROData_PolylineXY::BuildPainterPath( QPainterPath& } else { - HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed, LOCAL_SELECTION_TOLERANCE ); - aBSpline.ComputePath( thePath ); + Handle(Geom_BSplineCurve) aCurve = + HYDROData_BSplineOperation::ComputeCurve( thePoints, theIsClosed, LOCAL_SELECTION_TOLERANCE ); + HYDROData_BSplineOperation::ComputePath( aCurve, thePath ); } } @@ -476,7 +483,7 @@ void HYDROData_PolylineXY::Update() if ( !IsEditable() ) { // If polyline is not editable we no need to update it wire - SetToUpdate( false ); + ClearChanged(); return; } @@ -487,7 +494,7 @@ void HYDROData_PolylineXY::Update() NCollection_Sequence aSectClosures; GetSections( aSectNames, aSectTypes, aSectClosures ); - BRepBuilderAPI_MakeWire aMakeWire; + //BRepBuilderAPI_MakeWire aMakeWire; TopTools_ListOfShape aSectionWiresList; @@ -513,7 +520,7 @@ void HYDROData_PolylineXY::Update() TopoDS_Wire aSectionWire = BuildWire( aSectionType, anIsSectionClosed, aPoints ); if ( !aSectionWire.IsNull() ) { aSectionWiresList.Append( aSectionWire ); - aMakeWire.Add( aSectionWire ); + //aMakeWire.Add( aSectionWire ); } } // all input wires in the @@ -554,7 +561,7 @@ void HYDROData_PolylineXY::Update() aResult = mkWire.Wire(); } - setPolylineShape( aResult ); + SetShape( aResult ); } bool HYDROData_PolylineXY::IsHas2dPrs() const @@ -655,18 +662,19 @@ double HYDROData_PolylineXY::GetDistance( const int theSectionIndex, aPointToTest = aPoint; } - HYDROData_BSplineOperation aBSpline( aPoints, anIsSectionClosed, LOCAL_SELECTION_TOLERANCE ); + Handle(Geom_BSplineCurve) aCurve = + HYDROData_BSplineOperation::ComputeCurve( aPoints, anIsSectionClosed, LOCAL_SELECTION_TOLERANCE ); - Quantity_Parameter aFirstParam = aBSpline.Curve()->FirstParameter(); - Quantity_Parameter aSecondParam = aBSpline.Curve()->LastParameter(); + Quantity_Parameter aFirstParam = aCurve->FirstParameter(); + Quantity_Parameter aSecondParam = aCurve->LastParameter(); if ( thePointIndex != aSectNbPoints - 1 ) { - GeomAPI_ProjectPointOnCurve aProject( aPointToTest, aBSpline.Curve() ); + GeomAPI_ProjectPointOnCurve aProject( aPointToTest, aCurve ); aSecondParam = aProject.LowerDistanceParameter(); } - GeomAdaptor_Curve anAdap( aBSpline.Curve() ); + GeomAdaptor_Curve anAdap( aCurve ); aResDistance = GCPnts_AbscissaPoint::Length( anAdap, aFirstParam, aSecondParam ); } @@ -701,7 +709,7 @@ void HYDROData_PolylineXY::AddSection( const TCollection_AsciiString& theSectNam aTypesList->Append( theSectionType ); aClosuresList->Append( theIsClosed ); - SetToUpdate( true ); + Changed( Geom_2d ); } TCollection_AsciiString HYDROData_PolylineXY::GetSectionName( const int theSectionIndex ) const @@ -745,8 +753,6 @@ void HYDROData_PolylineXY::SetSectionName( const int theSec TDataStd_ListIteratorOfListOfExtendedString aNamesIter( anOldNamesList ); for ( int i = 0; aNamesIter.More(); aNamesIter.Next(), ++i ) aNamesList->Append( i == theSectionIndex ? aNewSectName : aNamesIter.Value() ); - - SetToUpdate( true ); } HYDROData_PolylineXY::SectionType HYDROData_PolylineXY::GetSectionType( const int theSectionIndex ) const @@ -784,7 +790,7 @@ void HYDROData_PolylineXY::SetSectionType( const int theSectionIndex, for ( int i = 0; aTypesIter.More(); aTypesIter.Next(), ++i ) aTypesList->Append( i == theSectionIndex ? theSectionType : aTypesIter.Value() ); - SetToUpdate( true ); + Changed( Geom_2d ); } bool HYDROData_PolylineXY::IsClosedSection( const int theSectionIndex ) const @@ -822,7 +828,7 @@ void HYDROData_PolylineXY::SetSectionClosed( const int theSectionIndex, for ( int i = 0; aClosuresIter.More(); aClosuresIter.Next(), ++i ) aClosuresList->Append( i == theSectionIndex ? theIsClosed : (bool)aClosuresIter.Value() ); - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::GetSections( NCollection_Sequence& theSectNames, @@ -833,6 +839,11 @@ void HYDROData_PolylineXY::GetSections( NCollection_Sequence( this )->Interpolate(); + } + Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; @@ -904,14 +915,14 @@ void HYDROData_PolylineXY::RemoveSection( const int theSectionIndex ) removePointsLists( theSectionIndex ); } - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::RemoveSections() { removeSectionsLists(); removePointsLists(); - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::AddPoint( const int theSectionIndex, @@ -957,7 +968,7 @@ void HYDROData_PolylineXY::AddPoint( const int theSectionIndex, } } - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::SetPoint( const int theSectionIndex, @@ -1008,7 +1019,7 @@ void HYDROData_PolylineXY::SetPoint( const int theSectionIndex, } } - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::SetPoints( const int theSectionIndex, @@ -1064,13 +1075,18 @@ void HYDROData_PolylineXY::RemovePoint( const int theSectionIndex, } } - SetToUpdate( true ); + Changed( Geom_2d ); } -HYDROData_PolylineXY::PointsList HYDROData_PolylineXY::GetPoints( const int theSectionIndex ) const +HYDROData_PolylineXY::PointsList HYDROData_PolylineXY::GetPoints( const int theSectionIndex, bool IsConvertToGlobal ) const { PointsList aResList; + if( IsCustom() ) + { + const_cast( this )->Interpolate(); + } + Handle(TDataStd_RealList) aListX, aListY; getPointsLists( theSectionIndex, aListX, aListY, false ); if ( aListX.IsNull() || aListY.IsNull() || aListX->IsEmpty() ) @@ -1078,9 +1094,12 @@ HYDROData_PolylineXY::PointsList HYDROData_PolylineXY::GetPoints( const int theS TColStd_ListIteratorOfListOfReal anIterX( aListX->List() ); TColStd_ListIteratorOfListOfReal anIterY( aListY->List() ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( myLab ); for ( ; anIterX.More() && anIterY.More(); anIterX.Next(), anIterY.Next() ) { Point aPoint( anIterX.Value(), anIterY.Value() ); + if (IsConvertToGlobal) + aDoc->Transform( aPoint, false ); aResList.Append( aPoint ); } @@ -1139,7 +1158,7 @@ void HYDROData_PolylineXY::UpdateLocalCS( double theDx, double theDy ) } SetPoints( i, aPoints ); } - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::Transform( const QTransform& theTrsf ) @@ -1162,6 +1181,27 @@ void HYDROData_PolylineXY::Transform( const QTransform& theTrsf ) SetPoints( i, aPoints ); } - SetToUpdate( true ); + Update(); +} + +bool HYDROData_PolylineXY::IsCustom() const +{ + if( myIsInCustomFlag ) + return false; + + bool isNull = GetShape().IsNull(); + int aNbPoints = 0; + + HYDROData_PolylineXY* aThat = const_cast( this ); + aThat->myIsInCustomFlag = true; + for( int i=0, n=NbSections(); imyIsInCustomFlag = false; + + return !isNull && aNbPoints == 0; } +void HYDROData_PolylineXY::Interpolate() +{ + ImportShape( GetShape(), true ); +}