X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_PolylineXY.cxx;h=0d79dd238678eeb86abac756dc34ea566189eda2;hb=84ec5b92ea05194a9d4d413b9bc896cf68d2e3ca;hp=b97af6d579818a26694cc0dd3ce1e6823217f6fd;hpb=a23fa81dd76041264b4ddd65883ea9bfb7cc67bd;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_PolylineXY.cxx b/src/HYDROData/HYDROData_PolylineXY.cxx index b97af6d5..0d79dd23 100755 --- a/src/HYDROData/HYDROData_PolylineXY.cxx +++ b/src/HYDROData/HYDROData_PolylineXY.cxx @@ -1,25 +1,44 @@ #include "HYDROData_PolylineXY.h" +#include "HYDROData_BSplineOperation.h" +#include "HYDROData_Document.h" #include "HYDROData_Tool.h" +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include + #include #include #include -#include #include #include #include #include -#include #include +#include #include -#include +#include + +#include +#include +#define PYTHON_POLYLINEXY_ID "KIND_POLYLINEXY" IMPLEMENT_STANDARD_HANDLE(HYDROData_PolylineXY, HYDROData_IPolyline) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_PolylineXY, HYDROData_IPolyline) @@ -33,153 +52,295 @@ HYDROData_PolylineXY::~HYDROData_PolylineXY() { } -CurveCreator_ICurve::ListAISObjects HYDROData_PolylineXY::constructWire() const +QStringList HYDROData_PolylineXY::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const { - // TODO - ListAISObjects aProfileObjects; - return aProfileObjects; + QStringList aResList; + + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); + if ( aDocument.IsNull() ) + return aResList; + + QString aDocName = aDocument->GetDocPyName(); + QString aPolylineName = GetName(); + + aResList << QString( "%1 = %2.CreateObject( %3 );" ) + .arg( aPolylineName ).arg( aDocName ).arg( PYTHON_POLYLINEXY_ID ); + aResList << QString( "%1.SetName( \"%1\" );" ).arg( aPolylineName ); + + // Set polilyne data + NCollection_Sequence aSectNames; + NCollection_Sequence aSectTypes; + NCollection_Sequence aSectClosures; + GetSections( aSectNames, aSectTypes, aSectClosures ); + + for ( int i = 1, n = aSectNames.Size(); i <= n; ++i ) + { + const TCollection_AsciiString& aSectName = aSectNames.Value( i ); + const SectionType& aSectType = aSectTypes.Value( i ); + bool aSectClosure = aSectClosures.Value( i ); + + aResList << QString( "%1.AddSection( \"%2\", %3, %4 );" ).arg( aPolylineName ) + .arg( aSectName.ToCString() ).arg( aSectType ).arg( aSectClosure ); + + HYDROData_PolylineXY::PointsList aSectPointsList = GetPoints( i ); + for ( int k = 1, aNbPoints = aSectPointsList.Size(); k <= aNbPoints; ++k ) + { + const Point& aSectPoint = aSectPointsList.Value( k ); + + aResList << QString( "%1.AddPoint( %2, QPointF( %3, %4 ) );" ).arg( aPolylineName ) + .arg( i - 1 ).arg( aSectPoint.X() ).arg( aSectPoint.Y() ); + } + } + + return aResList; } -bool HYDROData_PolylineXY::clear() +QVariant HYDROData_PolylineXY::GetDataVariant() { - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); - - removeSectionsLists(); - removePointsLists(); + QPainterPath aPath = GetPainterPath(); - if ( !anIsOperation ) - commitOperation(); + QVariant aVarData; + aVarData.setValue( aPath ); + + return aVarData; +} - return true; +TopoDS_Shape HYDROData_PolylineXY::GetShape() +{ + return getPolylineShape(); } -bool HYDROData_PolylineXY::join( const int theISectionTo, - const int theISectionFrom ) +TopoDS_Wire HYDROData_PolylineXY::BuildWire( const SectionType& theType, + const bool& theIsClosed, + const NCollection_Sequence& thePoints ) { - Handle(TDataStd_ExtStringList) aNamesList; - Handle(TDataStd_IntegerList) aTypesList; - Handle(TDataStd_BooleanList) aClosuresList; - getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || aNamesList->Extent() <= 1 ) - return false; + BRepBuilderAPI_MakeWire aMakeWire; - bool anIsOperation = myIsOperation; + if( theType == SECTION_POLYLINE ) + { + for( int i = 1, n = thePoints.Size(); i <= n; ++i ) + { + const gp_XYZ& aFirstPoint = thePoints.Value( i ); - if ( theISectionTo == -1 || theISectionFrom == -1 ) + gp_XYZ aLastPoint; + if ( i == n ) + { + if( theIsClosed ) + aLastPoint = thePoints.Value( 1 ); + else + break; + } + else + { + aLastPoint = thePoints.Value( i + 1 ); + } + + gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z() ); + gp_Pnt aPnt2( aLastPoint.X(), aLastPoint.Y(), aLastPoint.Z() ); + + TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aPnt1, aPnt2 ).Edge(); + aMakeWire.Add( anEdge ); + } + } + else //if( theType == PolylineSection::SECTION_SPLINE ) { - // Join all sections to one - if ( !anIsOperation ) - startOperation(); + HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed ); - TCollection_ExtendedString aSectName = aNamesList->First(); - CurveCreator::SectionType aSectType = (CurveCreator::SectionType)aTypesList->First(); - bool anIsClosed = aClosuresList->First(); + TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aBSpline.Curve() ).Edge(); + aMakeWire.Add( anEdge ); + } - aNamesList->Clear(); - aTypesList->Clear(); - aClosuresList->Clear(); - - aNamesList->Append( aSectName ); - aTypesList->Append( aSectType ); - aClosuresList->Append( anIsClosed ); + TopoDS_Wire aWire; + aMakeWire.Build(); + if ( aMakeWire.IsDone() ) + aWire = aMakeWire; - CurveCreator::Coordinates anAllPoints = getPoints(); - removePointsLists(); + return aWire; +} + +QPainterPath HYDROData_PolylineXY::BuildPainterPath( const SectionType& theType, + const bool& theIsClosed, + const NCollection_Sequence& thePoints ) +{ + QPainterPath aPath; + if ( thePoints.IsEmpty() ) + return aPath; + + if ( theType == SECTION_POLYLINE ) + { + aPath.moveTo( thePoints.Value( 1 ).X(), thePoints.Value( 1 ).Y() ); + + for( int i = 2, n = thePoints.Size(); i <= n; ++i ) + { + const gp_XYZ& aSectPoint = thePoints.Value( i ); + + aPath.lineTo( aSectPoint.X(), aSectPoint.Y() ); + } - addPoints( anAllPoints, 0 ); + if( theIsClosed ) + aPath.closeSubpath(); } else { - // Join selected range of sections to one - if ( theISectionFrom >= theISectionTo ) - return false; + HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed ); + aPath = aBSpline.ComputePath(); + } - if ( !anIsOperation ) - startOperation(); + return aPath; +} - TDataStd_ListOfExtendedString anOldNamesList; - anOldNamesList = aNamesList->List(); +void HYDROData_PolylineXY::Update() +{ + NCollection_Sequence aSectNames; + NCollection_Sequence aSectTypes; + NCollection_Sequence aSectClosures; + GetSections( aSectNames, aSectTypes, aSectClosures ); - TColStd_ListOfInteger anOldTypesList; - anOldTypesList = aTypesList->List(); + BRepBuilderAPI_MakeWire aMakeWire; - TDataStd_ListOfByte anOldClosuresList; - anOldClosuresList = aClosuresList->List(); + TopTools_ListOfShape aSectionWiresList; - // Refill the existing lists - aNamesList->Clear(); - aTypesList->Clear(); - aClosuresList->Clear(); + for ( int aSectionId = 1, aNbSects = aSectNames.Size(); aSectionId <= aNbSects; aSectionId++ ) + { + TCollection_AsciiString aSectName = aSectNames.Value( aSectionId ); + SectionType aSectionType = aSectTypes.Value( aSectionId ); + bool anIsSectionClosed = aSectClosures.Value( aSectionId ); - Handle(TDataStd_RealList) aJoinListX, aJoinListY; + PointsList aSectPointsList = GetPoints( aSectionId - 1 ); + if ( aSectPointsList.IsEmpty() ) + continue; + + NCollection_Sequence aPoints; + for( int i = 1, n = aSectPointsList.Size(); i <= n; ++i ) + { + const Point& aSectPoint = aSectPointsList.Value( i ); - TDataStd_ListIteratorOfListOfExtendedString aNamesIter( anOldNamesList ); - TColStd_ListIteratorOfListOfInteger aTypesIter( anOldTypesList ); - TDataStd_ListIteratorOfListOfByte aClosuresIter( anOldClosuresList ); + gp_XYZ aPoint( aSectPoint.X(), aSectPoint.Y(), 0.0 ); + aPoints.Append( aPoint ); + } - int aNbSect = 0; - for ( ; aNamesIter.More() && aTypesIter.More() && aClosuresIter.More(); - aNamesIter.Next(), aTypesIter.Next(), aClosuresIter.Next(), ++aNbSect ) + TopoDS_Wire aSectionWire = BuildWire( aSectionType, anIsSectionClosed, aPoints ); + aSectionWiresList.Append( aSectionWire ); + aMakeWire.Add( aSectionWire ); + } + + TopoDS_Shape aShape; + + if ( aMakeWire.IsDone() ) + { + aShape = aMakeWire.Shape(); + } + else if ( !aSectionWiresList.IsEmpty() ) + { + // build compound + TopoDS_Compound aCompound; + + BRep_Builder aBuilder; + aBuilder.MakeCompound( aCompound ); + + TopTools_ListIteratorOfListOfShape anIter( aSectionWiresList ); + for ( ; anIter.More(); anIter.Next() ) { - if ( aNbSect < theISectionFrom || aNbSect > theISectionTo ) - { - aNamesList->Append( aNamesIter.Value() ); - aTypesList->Append( aTypesIter.Value() ); - aClosuresList->Append( (bool)aClosuresIter.Value() ); - } - else - { - if ( aNbSect == theISectionFrom ) - { - aNamesList->Append( aNamesIter.Value() ); - aTypesList->Append( aTypesIter.Value() ); - aClosuresList->Append( (bool)aClosuresIter.Value() ); - - getPointsLists( aNbSect, aJoinListX, aJoinListY ); - } - else - { - Handle(TDataStd_RealList) aListX, aListY; - getPointsLists( aNbSect, aListX, aListY ); - - TColStd_ListIteratorOfListOfReal anIterX( aListX->List() ); - TColStd_ListIteratorOfListOfReal anIterY( aListY->List() ); - for ( ; anIterX.More() && anIterY.More(); anIterX.Next(), anIterY.Next() ) - { - aJoinListX->Append( anIterX.Value() ); - aJoinListY->Append( anIterY.Value() ); - } - - removePointsLists( aNbSect ); - } - } + aBuilder.Add( aCompound, anIter.Value() ); + } + + aShape = aCompound; + } - // Move the list which are after theISectionTo to correct place - for ( int i = theISectionTo + 1, j = theISectionFrom + 1; i < aNbSect; ++i, j++ ) - { - CurveCreator::Coordinates aPoints = getPoints( i ); - removePointsLists( i ); - addPoints( aPoints, j ); - } + setPolylineShape( aShape ); +} + +/** + * Returns true if polyline is closed + */ +bool HYDROData_PolylineXY::IsClosed() const +{ + NCollection_Sequence aSectNames; + NCollection_Sequence aSectTypes; + NCollection_Sequence aSectClosures; + GetSections( aSectNames, aSectTypes, aSectClosures ); + if( aSectNames.IsEmpty() ) + return false; + + bool anIsClosed = true; + for( int i = 1, n = aSectClosures.Size(); i <= n && anIsClosed; ++i ) + anIsClosed = anIsClosed && aSectClosures.Value( i ); + + return anIsClosed; +} + +double HYDROData_PolylineXY::GetDistance( const int theSectionIndex, + const int thePointIndex ) const +{ + double aResDistance = -1; + if ( theSectionIndex < 0 || theSectionIndex >= NbSections() ) + return aResDistance; + + if ( thePointIndex == 0 ) + return 0.0; + + SectionType aSectionType = GetSectionType( theSectionIndex ); + bool anIsSectionClosed = IsClosedSection( theSectionIndex ); + PointsList aSectPointsList = GetPoints( theSectionIndex ); + if ( thePointIndex < 0 || thePointIndex >= aSectPointsList.Size() ) + return aResDistance; + + if ( aSectionType == SECTION_POLYLINE ) + { + aResDistance = 0.0; + + Point aPrevPoint = aSectPointsList.Value( 1 ); + for ( int i = 2, aNbPoints = aSectPointsList.Size(); i <= aNbPoints; ++i ) + { + const Point& aSectPoint = aSectPointsList.Value( i ); + aResDistance += gp_Pnt2d( aPrevPoint ).Distance( aSectPoint ); + aPrevPoint = aSectPoint; } } + else + { + gp_XYZ aPointToTest; + + int aSectNbPoints = aSectPointsList.Size(); + NCollection_Sequence aPoints; + for( int i = 1 ; i <= aSectNbPoints; ++i ) + { + const Point& aSectPoint = aSectPointsList.Value( i ); - if ( !anIsOperation ) - commitOperation(); + gp_XYZ aPoint( aSectPoint.X(), aSectPoint.Y(), 0.0 ); + aPoints.Append( aPoint ); - return true; + if ( thePointIndex == i - 1 ) + aPointToTest = aPoint; + } + + HYDROData_BSplineOperation aBSpline( aPoints, anIsSectionClosed ); + + Quantity_Parameter aFirstParam = aBSpline.Curve()->FirstParameter(); + Quantity_Parameter aSecondParam = aBSpline.Curve()->LastParameter(); + + if ( thePointIndex != aSectNbPoints - 1 ) + { + GeomAPI_ProjectPointOnCurve aProject( aPointToTest, aBSpline.Curve() ); + aSecondParam = aProject.LowerDistanceParameter(); + } + + GeomAdaptor_Curve anAdap( aBSpline.Curve() ); + + aResDistance = GCPnts_AbscissaPoint::Length( anAdap, aFirstParam, aSecondParam ); + } + + return aResDistance; } -int HYDROData_PolylineXY::getNbSections() const +int HYDROData_PolylineXY::NbSections() const { Handle(TDataStd_ExtStringList) aNamesList; - Handle(TDataStd_IntegerList) aTypesList; - Handle(TDataStd_BooleanList) aClosuresList; + Handle(TDataStd_IntegerList) aTypesList; + Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - return aNamesList.IsNull() ? 0 : aNamesList->Extent(); + return !aClosuresList.IsNull() ? aClosuresList->Extent() : 0; } TCollection_ExtendedString getUniqueSectionName( const Handle(TDataStd_ExtStringList)& theNamesList ) @@ -203,278 +364,236 @@ TCollection_ExtendedString getUniqueSectionName( const Handle(TDataStd_ExtString return aResName; } -int HYDROData_PolylineXY::addSection( const std::string& theName, - const CurveCreator::SectionType theType, - const bool theIsClosed ) +void HYDROData_PolylineXY::AddSection( const TCollection_AsciiString& theSectName, + const SectionType theSectionType, + const bool theIsClosed ) { - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); - Handle(TDataStd_ExtStringList) aNamesList; - Handle(TDataStd_IntegerList) aTypesList; - Handle(TDataStd_BooleanList) aClosuresList; + Handle(TDataStd_IntegerList) aTypesList; + Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList ); - TCollection_ExtendedString aSectName = theName.c_str(); + TCollection_ExtendedString aSectName( theSectName ); if ( aSectName.Length() <= 0 ) aSectName = getUniqueSectionName( aNamesList ); aNamesList->Append( aSectName ); - aTypesList->Append( theType ); + aTypesList->Append( theSectionType ); aClosuresList->Append( theIsClosed ); - - int aSectId = aNamesList->Extent() - 1; - - // Just to create empty data - Handle(TDataStd_RealList) aListX, aListY; - getPointsLists( aSectId, aListX, aListY ); - - if ( !anIsOperation ) - commitOperation(); - - return aSectId; } -bool HYDROData_PolylineXY::removeSection( const int theISection ) +TCollection_AsciiString HYDROData_PolylineXY::GetSectionName( const int theSectionIndex ) const { + TCollection_AsciiString aResName; + Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || aNamesList->IsEmpty() ) - return false; + if ( aNamesList.IsNull() || theSectionIndex >= aNamesList->Extent() ) + return aResName; - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); - - if ( aNamesList->Extent() == 1 ) - { - removeSectionsLists(); - removePointsLists(); - } - else - { - TDataStd_ListOfExtendedString anOldNamesList; - anOldNamesList = aNamesList->List(); - - TColStd_ListOfInteger anOldTypesList; - anOldTypesList = aTypesList->List(); + TDataStd_ListIteratorOfListOfExtendedString aNamesIter( aNamesList->List() ); + for ( int i = 0; aNamesIter.More() && i != theSectionIndex; aNamesIter.Next(), ++i ); - TDataStd_ListOfByte anOldClosuresList; - anOldClosuresList = aClosuresList->List(); + if ( aNamesIter.More() ) + aResName = aNamesIter.Value(); - // Refill the existing lists - aNamesList->Clear(); - aTypesList->Clear(); - aClosuresList->Clear(); + return aResName; +} - TDataStd_ListIteratorOfListOfExtendedString aNamesIter( anOldNamesList ); - TColStd_ListIteratorOfListOfInteger aTypesIter( anOldTypesList ); - TDataStd_ListIteratorOfListOfByte aClosuresIter( anOldClosuresList ); - for ( int i = 0; aNamesIter.More() && aTypesIter.More() && aClosuresIter.More(); - aNamesIter.Next(), aTypesIter.Next(), aClosuresIter.Next(), ++i ) - { - if ( i == theISection ) - continue; // skip index to remove +void HYDROData_PolylineXY::SetSectionName( const int theSectionIndex, + const TCollection_AsciiString& theSectionName ) +{ + Handle(TDataStd_ExtStringList) aNamesList; + Handle(TDataStd_IntegerList) aTypesList; + Handle(TDataStd_BooleanList) aClosuresList; + getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); + if ( aNamesList.IsNull() || theSectionIndex >= aNamesList->Extent() ) + return; - aNamesList->Append( aNamesIter.Value() ); - aTypesList->Append( aTypesIter.Value() ); - aClosuresList->Append( (bool)aClosuresIter.Value() ); - } + TDataStd_ListOfExtendedString anOldNamesList; + anOldNamesList = aNamesList->List(); - // Remove points that belong to removed section - removePointsLists( theISection ); - } + // Refill the existing list + aNamesList->Clear(); - if ( !anIsOperation ) - commitOperation(); + TCollection_ExtendedString aNewSectName = theSectionName; - return true; + TDataStd_ListIteratorOfListOfExtendedString aNamesIter( anOldNamesList ); + for ( int i = 0; aNamesIter.More(); aNamesIter.Next(), ++i ) + aNamesList->Append( i == theSectionIndex ? aNewSectName : aNamesIter.Value() ); } -bool HYDROData_PolylineXY::isClosed( const int theISection ) const +HYDROData_PolylineXY::SectionType HYDROData_PolylineXY::GetSectionType( const int theSectionIndex ) const { Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || theISection >= aNamesList->Extent() ) - return false; + if ( aTypesList.IsNull() || theSectionIndex >= aTypesList->Extent() ) + return SECTION_POLYLINE; - TDataStd_ListIteratorOfListOfByte aClosuresIter( aClosuresList->List() ); - for ( int i = 0; aClosuresIter.More() && i != theISection; aClosuresIter.Next(), ++i ); + TColStd_ListIteratorOfListOfInteger aTypesIter( aTypesList->List() ); + for ( int i = 0; aTypesIter.More() && i != theSectionIndex; aTypesIter.Next(), ++i ); - return aClosuresIter.More() ? (bool)aClosuresIter.Value() : false; + return aTypesIter.More() ? (SectionType)aTypesIter.Value() : SECTION_POLYLINE; } -bool HYDROData_PolylineXY::setClosed( const int theISection, - const bool theIsClosed ) +void HYDROData_PolylineXY::SetSectionType( const int theSectionIndex, + const SectionType theSectionType ) { Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || theISection >= aNamesList->Extent() ) - return false; + if ( aTypesList.IsNull() || theSectionIndex >= aTypesList->Extent() ) + return; - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); - - TDataStd_ListOfByte anOldClosuresList; - anOldClosuresList = aClosuresList->List(); + TColStd_ListOfInteger anOldTypesList; + anOldTypesList = aTypesList->List(); // Refill the existing list - aClosuresList->Clear(); - - TDataStd_ListIteratorOfListOfByte aClosuresIter( anOldClosuresList ); - for ( int i = 0; aClosuresIter.More(); aClosuresIter.Next(), ++i ) - aClosuresList->Append( i == theISection ? theIsClosed : (bool)aClosuresIter.Value() ); - - if ( !anIsOperation ) - commitOperation(); + aTypesList->Clear(); - return true; + TColStd_ListIteratorOfListOfInteger aTypesIter( anOldTypesList ); + for ( int i = 0; aTypesIter.More(); aTypesIter.Next(), ++i ) + aTypesList->Append( i == theSectionIndex ? theSectionType : aTypesIter.Value() ); } -std::string HYDROData_PolylineXY::getSectionName( const int theISection ) const +bool HYDROData_PolylineXY::IsClosedSection( const int theSectionIndex ) const { Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || theISection >= aNamesList->Extent() ) - return ""; - - TDataStd_ListIteratorOfListOfExtendedString aNamesIter( aNamesList->List() ); - for ( int i = 0; aNamesIter.More() && i != theISection; aNamesIter.Next(), ++i ); + if ( aClosuresList.IsNull() || theSectionIndex >= aClosuresList->Extent() ) + return false; - TCollection_AsciiString aResName; - if ( aNamesIter.More() ) - aResName = aNamesIter.Value(); + TDataStd_ListIteratorOfListOfByte aClosuresIter( aClosuresList->List() ); + for ( int i = 0; aClosuresIter.More() && i != theSectionIndex; aClosuresIter.Next(), ++i ); - return aResName.ToCString(); + return aClosuresIter.More() ? (bool)aClosuresIter.Value() : false; } -bool HYDROData_PolylineXY::setSectionName( const int theISection, - const std::string& theName ) +void HYDROData_PolylineXY::SetSectionClosed( const int theSectionIndex, + const bool theIsClosed ) { Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || theISection >= aNamesList->Extent() ) - return false; - - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); + if ( aClosuresList.IsNull() || theSectionIndex >= aClosuresList->Extent() ) + return; - TDataStd_ListOfExtendedString anOldNamesList; - anOldNamesList = aNamesList->List(); + TDataStd_ListOfByte anOldClosuresList; + anOldClosuresList = aClosuresList->List(); // Refill the existing list - aNamesList->Clear(); - - TDataStd_ListIteratorOfListOfExtendedString aNamesIter( aNamesList->List() ); - for ( int i = 0; aNamesIter.More(); aNamesIter.Next(), ++i ) - aNamesList->Append( i == theISection ? theName.c_str() : aNamesIter.Value() ); - - if ( !anIsOperation ) - commitOperation(); + aClosuresList->Clear(); - return true; + TDataStd_ListIteratorOfListOfByte aClosuresIter( anOldClosuresList ); + for ( int i = 0; aClosuresIter.More(); aClosuresIter.Next(), ++i ) + aClosuresList->Append( i == theSectionIndex ? theIsClosed : (bool)aClosuresIter.Value() ); } -CurveCreator::SectionType HYDROData_PolylineXY::getSectionType( const int theISection ) const +void HYDROData_PolylineXY::GetSections( NCollection_Sequence& theSectNames, + NCollection_Sequence& theSectTypes, + NCollection_Sequence& theSectClosures ) const { + theSectNames.Clear(); + theSectTypes.Clear(); + theSectClosures.Clear(); + Handle(TDataStd_ExtStringList) aNamesList; Handle(TDataStd_IntegerList) aTypesList; Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || theISection >= aNamesList->Extent() ) - return CurveCreator::Polyline; + if ( aNamesList.IsNull() || aTypesList.IsNull() || aClosuresList.IsNull() ) + return; + TDataStd_ListIteratorOfListOfExtendedString aNamesIter( aNamesList->List() ); TColStd_ListIteratorOfListOfInteger aTypesIter( aTypesList->List() ); - for ( int i = 0; aTypesIter.More() && i != theISection; aTypesIter.Next(), ++i ); + TDataStd_ListIteratorOfListOfByte aClosuresIter( aClosuresList->List() ); + for ( ; aNamesIter.More() && aTypesIter.More() && aClosuresIter.More(); + aNamesIter.Next(), aTypesIter.Next(), aClosuresIter.Next() ) + { + const TCollection_ExtendedString& aSectName = aNamesIter.Value(); + SectionType aSectType = (SectionType)aTypesIter.Value(); + bool aSectClosures = aClosuresIter.Value(); - return aTypesIter.More() ? (CurveCreator::SectionType)aTypesIter.Value() : CurveCreator::Polyline; + theSectNames.Append( aSectName ); + theSectTypes.Append( aSectType ); + theSectClosures.Append( aSectClosures ); + } } -bool HYDROData_PolylineXY::setSectionType( const int theISection, - const CurveCreator::SectionType theType ) +void HYDROData_PolylineXY::RemoveSection( const int theSectionIndex ) { Handle(TDataStd_ExtStringList) aNamesList; - Handle(TDataStd_IntegerList) aTypesList; - Handle(TDataStd_BooleanList) aClosuresList; + Handle(TDataStd_IntegerList) aTypesList; + Handle(TDataStd_BooleanList) aClosuresList; getSectionsLists( aNamesList, aTypesList, aClosuresList, false ); - if ( aNamesList.IsNull() || theISection >= aNamesList->Extent() ) - return false; - - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); - - TColStd_ListOfInteger anOldTypesList; - anOldTypesList = aTypesList->List(); - - // Refill the existing list - aTypesList->Clear(); + if ( aNamesList.IsNull() || theSectionIndex >= aNamesList->Extent() ) + return; - TColStd_ListIteratorOfListOfInteger aTypesIter( anOldTypesList ); - for ( int i = 0; aTypesIter.More(); aTypesIter.Next(), ++i ) - aTypesList->Append( i == theISection ? theType : aTypesIter.Value() ); - - if ( !anIsOperation ) - commitOperation(); + if ( aNamesList->Extent() == 1 ) + { + removeSectionsLists(); + removePointsLists(); + } + else + { + TDataStd_ListOfExtendedString anOldNamesList; + anOldNamesList = aNamesList->List(); - return true; -} + TColStd_ListOfInteger anOldTypesList; + anOldTypesList = aTypesList->List(); -void addPointsToLists( const CurveCreator::Coordinates& theCoords, - Handle(TDataStd_RealList)& theListX, - Handle(TDataStd_RealList)& theListY, - const bool theIsAppend ) -{ - CurveCreator::Coordinates::const_iterator aBegIter = theCoords.begin(); - CurveCreator::Coordinates::const_iterator anEndIter = theCoords.end(); - while ( aBegIter != anEndIter ) - { - const CurveCreator::TypeCoord& aCoordX = *aBegIter++; - if ( aBegIter == anEndIter ) - break; + TDataStd_ListOfByte anOldClosuresList; + anOldClosuresList = aClosuresList->List(); - const CurveCreator::TypeCoord& aCoordY = *aBegIter++; + // Refill the existing lists + aNamesList->Clear(); + aTypesList->Clear(); + aClosuresList->Clear(); - if ( theIsAppend ) - { - theListX->Append( aCoordX ); - theListY->Append( aCoordY ); - } - else + TDataStd_ListIteratorOfListOfExtendedString aNamesIter( anOldNamesList ); + TColStd_ListIteratorOfListOfInteger aTypesIter( anOldTypesList ); + TDataStd_ListIteratorOfListOfByte aClosuresIter( anOldClosuresList ); + for ( int i = 0; aNamesIter.More() && aTypesIter.More() && aClosuresIter.More(); + aNamesIter.Next(), aTypesIter.Next(), aClosuresIter.Next(), ++i ) { - theListX->Prepend( aCoordX ); - theListY->Prepend( aCoordY ); + if ( i == theSectionIndex ) + continue; // skip index to remove + + aNamesList->Append( aNamesIter.Value() ); + aTypesList->Append( aTypesIter.Value() ); + aClosuresList->Append( (bool)aClosuresIter.Value() ); } + + // Remove points that belongs to removed section + removePointsLists( theSectionIndex ); } } -bool HYDROData_PolylineXY::addPoints( const CurveCreator::Coordinates& theCoords, - const int theISection, - const int theIPnt ) +void HYDROData_PolylineXY::RemoveSections() { - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); + removeSectionsLists(); + removePointsLists(); +} +void HYDROData_PolylineXY::AddPoint( const int theSectionIndex, + const Point& thePoint, + const int thePointIndex ) +{ Handle(TDataStd_RealList) aListX, aListY; - getPointsLists( theISection, aListX, aListY ); + getPointsLists( theSectionIndex, aListX, aListY ); - if ( theIPnt < 0 || theIPnt >= aListX->Extent() ) + if ( thePointIndex < 0 || thePointIndex >= aListX->Extent() ) { - addPointsToLists( theCoords, aListX, aListY, true ); + aListX->Append( thePoint.X() ); + aListY->Append( thePoint.Y() ); } else { @@ -495,51 +614,38 @@ bool HYDROData_PolylineXY::addPoints( const CurveCreator::Coordinates& theCoords double aCoordX = anIterX.Value(); double aCoordY = anIterY.Value(); - if ( i == theIPnt ) + if ( i == thePointIndex ) { - // Insert our new points - addPointsToLists( theCoords, aListX, aListY, true ); + // Insert our new point + aListX->Append( thePoint.X() ); + aListY->Append( thePoint.Y() ); } aListX->Append( aCoordX ); aListY->Append( aCoordY ); } } - - if ( !anIsOperation ) - commitOperation(); - - return true; } -bool HYDROData_PolylineXY::setPoint( const int theISection, - const int theIPnt, - const CurveCreator::Coordinates& theCoords ) +void HYDROData_PolylineXY::SetPoint( const int theSectionIndex, + const Point& thePoint, + const int thePointIndex ) { - if ( theCoords.size() < 2 ) - return false; - - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); - Handle(TDataStd_RealList) aListX, aListY; - getPointsLists( theISection, aListX, aListY ); + getPointsLists( theSectionIndex, aListX, aListY ); - if ( theIPnt < 0 ) + if ( thePointIndex < 0 ) { - addPointsToLists( theCoords, aListX, aListY, false ); + aListX->Prepend( thePoint.X() ); + aListY->Prepend( thePoint.Y() ); } - else if ( theIPnt >= aListX->Extent() ) + else if ( thePointIndex >= aListX->Extent() ) { - addPointsToLists( theCoords, aListX, aListY, true ); + aListX->Append( thePoint.X() ); + aListY->Append( thePoint.Y() ); } else { - CurveCreator::Coordinates::const_iterator aBegIter = theCoords.begin(); - const CurveCreator::TypeCoord& aNewCoordX = *aBegIter++; - const CurveCreator::TypeCoord& aNewCoordY = *aBegIter++; - TColStd_ListOfReal anOldListX; anOldListX = aListX->List(); @@ -557,45 +663,30 @@ bool HYDROData_PolylineXY::setPoint( const int theISectio double aCoordX = anIterX.Value(); double aCoordY = anIterY.Value(); - if ( i == theIPnt ) + if ( i == thePointIndex ) { - // Insert our new points instead of old one - aCoordX = aNewCoordX; - aCoordY = aNewCoordY; + // Insert our new point instead of old one + aCoordX = thePoint.X(); + aCoordY = thePoint.Y(); } aListX->Append( aCoordX ); aListY->Append( aCoordY ); } } - - if ( !anIsOperation ) - commitOperation(); - - return true; -} - -//! Set coordinates of specified points from different sections -bool HYDROData_PolylineXY::setSeveralPoints( const SectionToPointCoordsList &theSectionToPntCoords) -{ - return false; } -bool HYDROData_PolylineXY::removePoint( const int theISection, - const int theIPnt ) +void HYDROData_PolylineXY::RemovePoint( const int theSectionIndex, + const int thePointIndex ) { Handle(TDataStd_RealList) aListX, aListY; - getPointsLists( theISection, aListX, aListY, false ); + getPointsLists( theSectionIndex, aListX, aListY, false ); if ( aListX.IsNull() || aListY.IsNull() || aListX->IsEmpty() ) - return false; - - bool anIsOperation = myIsOperation; - if ( !anIsOperation ) - startOperation(); + return; if ( aListX->Extent() == 1 ) { - removePointsLists( theISection ); + removePointsLists( theSectionIndex ); } else { @@ -613,59 +704,66 @@ bool HYDROData_PolylineXY::removePoint( const int theISection, TColStd_ListIteratorOfListOfReal anIterY( anOldListY ); for ( int i = 0; anIterX.More() && anIterY.More(); anIterX.Next(), anIterY.Next(), ++i ) { - if ( i == theIPnt ) + if ( i == thePointIndex ) continue; // skip index to remove aListX->Append( anIterX.Value() ); aListY->Append( anIterY.Value() ); } } - - if ( !anIsOperation ) - commitOperation(); - - return true; } -//! Remove several points from different sections with given ids -bool HYDROData_PolylineXY::removeSeveralPoints( const SectionToPointList &theSectionToPntIDs) +HYDROData_PolylineXY::PointsList HYDROData_PolylineXY::GetPoints( const int theSectionIndex ) const { - return false; -} + PointsList aResList; -CurveCreator::Coordinates HYDROData_PolylineXY::getPoints( const int theISection ) const -{ - CurveCreator::Coordinates aResList; + Handle(TDataStd_RealList) aListX, aListY; + getPointsLists( theSectionIndex, aListX, aListY, false ); + if ( aListX.IsNull() || aListY.IsNull() || aListX->IsEmpty() ) + return aResList; - if ( theISection < 0 ) + TColStd_ListIteratorOfListOfReal anIterX( aListX->List() ); + TColStd_ListIteratorOfListOfReal anIterY( aListY->List() ); + for ( ; anIterX.More() && anIterY.More(); anIterX.Next(), anIterY.Next() ) { - int aNbSections = getNbSections(); - for ( int i = 0; i < aNbSections; ++i ) - { - CurveCreator::Coordinates aSectCoords = getPoints( i ); - aResList.insert( aResList.end(), aSectCoords.begin(), aSectCoords.end()); - } + Point aPoint( anIterX.Value(), anIterY.Value() ); + aResList.Append( aPoint ); } - else + + return aResList; +} + +QPainterPath HYDROData_PolylineXY::GetPainterPath() const +{ + QPainterPath aPath; + + NCollection_Sequence aSectNames; + NCollection_Sequence aSectTypes; + NCollection_Sequence aSectClosures; + GetSections( aSectNames, aSectTypes, aSectClosures ); + if( aSectNames.IsEmpty() ) + return aPath; + + PointsList aSectPointsList = GetPoints( 0 ); + if( aSectPointsList.IsEmpty() ) + return aPath; + + SectionType aSectionType = aSectTypes.Value( 1 ); + bool anIsSectionClosed = aSectClosures.Value( 1 ); + + NCollection_Sequence aPoints; + for( int i = 1, n = aSectPointsList.Size(); i <= n; ++i ) { - Handle(TDataStd_RealList) aListX, aListY; - getPointsLists( theISection, aListX, aListY, false ); - if ( !aListX.IsNull() && !aListY.IsNull() ) - { - TColStd_ListIteratorOfListOfReal anIterX( aListX->List() ); - TColStd_ListIteratorOfListOfReal anIterY( aListY->List() ); - for ( ; anIterX.More() && anIterY.More(); anIterX.Next(), anIterY.Next() ) - { - const double& aCoordX = anIterX.Value(); - const double& aCoordY = anIterY.Value(); + const Point& aSectPoint = aSectPointsList.Value( i ); - aResList.push_back( aCoordX ); - aResList.push_back( aCoordY ); - } - } + gp_XYZ aPoint( aSectPoint.X(), aSectPoint.Y(), 0.0 ); + aPoints.Append( aPoint ); } - return aResList; + aPath = BuildPainterPath( aSectionType, anIsSectionClosed, aPoints ); + + return aPath; + }