X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_PolylineXY.cxx;h=ea4eaf09f91f4959bbffc31f3c6b3e88f0995aa7;hb=f721b65d07e1b93c5ebc4b7baddd119167466553;hp=32f2ddabdc1d7a21e19920f2f29c3dbb76db9f6f;hpb=f7598de0de5abad3f557c8b2c52d0e0163a0951c;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_PolylineXY.cxx b/src/HYDROData/HYDROData_PolylineXY.cxx old mode 100755 new mode 100644 index 32f2ddab..ea4eaf09 --- 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 ) { } @@ -124,7 +130,8 @@ HYDROData_PolylineXY::~HYDROData_PolylineXY() { } -QStringList HYDROData_PolylineXY::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +QStringList HYDROData_PolylineXY::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects ) const { QStringList aResList = dumpObjectCreation( theTreatedObjects ); QString aPolylineName = GetObjPyName(); @@ -212,6 +219,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 +230,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 +253,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 +273,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 +287,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 +325,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 +344,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 +356,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 +399,7 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape ) if( aProj.IsDone() ) aResult = aProj.Shape(); - setPolylineShape( aResult ); + SetShape( aResult ); } setEditable( anIsCanBeImported ); @@ -428,9 +434,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 +473,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 +484,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 +495,7 @@ void HYDROData_PolylineXY::Update() NCollection_Sequence aSectClosures; GetSections( aSectNames, aSectTypes, aSectClosures ); - BRepBuilderAPI_MakeWire aMakeWire; + //BRepBuilderAPI_MakeWire aMakeWire; TopTools_ListOfShape aSectionWiresList; @@ -513,7 +521,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 @@ -533,7 +541,7 @@ void HYDROData_PolylineXY::Update() aBB.MakeCompound(aCmp); if(aSeqEdges->Length() >1) { - ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges,1E-5,Standard_False,aSeqWires); + ShapeAnalysis_FreeBounds::ConnectEdgesToWires( aSeqEdges, 1E-5, Standard_True, aSeqWires ); if( aSeqWires->Length()==1 ) aResult = aSeqWires->Value( 1 ); @@ -554,7 +562,7 @@ void HYDROData_PolylineXY::Update() aResult = mkWire.Wire(); } - setPolylineShape( aResult ); + SetShape( aResult ); } bool HYDROData_PolylineXY::IsHas2dPrs() const @@ -655,18 +663,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 +710,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 +754,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 +791,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 +829,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 +840,11 @@ void HYDROData_PolylineXY::GetSections( NCollection_Sequence( this )->Interpolate(); + } + Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; @@ -904,14 +916,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 +969,7 @@ void HYDROData_PolylineXY::AddPoint( const int theSectionIndex, } } - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::SetPoint( const int theSectionIndex, @@ -1008,7 +1020,7 @@ void HYDROData_PolylineXY::SetPoint( const int theSectionIndex, } } - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::SetPoints( const int theSectionIndex, @@ -1064,13 +1076,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 +1095,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 +1159,7 @@ void HYDROData_PolylineXY::UpdateLocalCS( double theDx, double theDy ) } SetPoints( i, aPoints ); } - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_PolylineXY::Transform( const QTransform& theTrsf ) @@ -1165,3 +1185,24 @@ void HYDROData_PolylineXY::Transform( const QTransform& theTrsf ) 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 ); +}