X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Stream.cxx;h=0512e90a24474f6bc725a619338f792daac1ab70;hb=8c70d5cb1e04edf503afb50caf735fa1c4f45b25;hp=111eb9b0255b890bb95dd2aa69397cde57212466;hpb=dadcea132a8b5df65f63168ecdc59b245c374b8b;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 111eb9b0..0512e90a 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -2,8 +2,18 @@ #include "HYDROData_Stream.h" #include "HYDROData_Document.h" +#include "HYDROData_PolylineXY.h" +#include "HYDROData_Profile.h" -#include +#include +#include +#include +#include + +#include +#include +#include +#include #include @@ -46,15 +56,228 @@ QStringList HYDROData_Stream::DumpToPython( MapOfTreatedObjects& theTreatedObjec TopoDS_Shape HYDROData_Stream::GetTopShape() const { - // TODO return getTopShape(); } TopoDS_Shape HYDROData_Stream::GetShape3D() const { - // TODO return getShape3D(); } +void HYDROData_Stream::Update() +{ + removeTopShape(); + removeShape3D(); + + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); + if ( aHydAxis.IsNull() || aRefProfiles.IsEmpty() ) + return; + + TopoDS_Shell a2dShell; + BRep_Builder a2dShellBuilder; + a2dShellBuilder.MakeShell( a2dShell ); + + bool anIsFirst = true; + gp_Pnt aPrevFirstPoint, aPrevLastPoint; + + // Construct the top presentation + HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( anIter.Value() ); + if ( aProfile.IsNull() ) + continue; + + gp_XY aPnt1, aPnt2; + if ( !aProfile->GetFirstPoint( aPnt1 ) || !aProfile->GetLastPoint( aPnt2 ) ) + continue; + + gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 ); + gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 ); + + if ( anIsFirst ) + { + aPrevFirstPoint = aCurFirstPoint; + aPrevLastPoint = aCurLastPoint; + anIsFirst = false; + continue; + } + + BRepBuilderAPI_MakeEdge aFirstEdge( aPrevFirstPoint, aPrevLastPoint ); + BRepBuilderAPI_MakeEdge aSecondEdge( aPrevLastPoint, aCurLastPoint ); + BRepBuilderAPI_MakeEdge aThirdEdge( aCurLastPoint, aCurFirstPoint ); + BRepBuilderAPI_MakeEdge aFourthEdge( aCurFirstPoint, aPrevFirstPoint ); + + BRepBuilderAPI_MakeWire aMakeWire( aFirstEdge.Edge(), aSecondEdge.Edge(), + aThirdEdge.Edge(), aFourthEdge.Edge() ); + + TopoDS_Wire aSectProfileWire = aMakeWire.Wire(); + + BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); + aMakeFace.Build(); + if( aMakeFace.IsDone() ) + { + a2dShellBuilder.Add( a2dShell, aMakeFace.Face() ); + } + + aPrevFirstPoint = aCurFirstPoint; + aPrevLastPoint = aCurLastPoint; + } + + SetTopShape( a2dShell ); + + // Construct the 3D presentation + /// TODO +} + +bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis ) +{ + Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis(); + + if ( theAxis.IsNull() ) + { + RemoveHydraulicAxis(); + return !aPrevAxis.IsNull(); + } + + if ( IsEqual( aPrevAxis, theAxis ) ) + return false; + + TopoDS_Wire aHydraulicWire = TopoDS::Wire( theAxis->GetShape() ); + if ( aHydraulicWire.IsNull() ) + return false; // The polyline must be a single wire + + SetReferenceObject( theAxis, DataTag_HydraulicAxis ); + + // Update the order of profiles + updateProfilesOrder(); + + // Indicate model of the need to update the stream presentation + SetToUpdate( true ); + + return true; +} + +Handle(HYDROData_PolylineXY) HYDROData_Stream::GetHydraulicAxis() const +{ + return Handle(HYDROData_PolylineXY)::DownCast( + GetReferenceObject( DataTag_HydraulicAxis ) ); +} + +void HYDROData_Stream::RemoveHydraulicAxis() +{ + Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis(); + if ( aPrevAxis.IsNull() ) + return; + + ClearReferenceObjects( DataTag_HydraulicAxis ); + + // We remove the reference profiles + RemoveProfiles(); + + // Indicate model of the need to update the stream presentation + SetToUpdate( true ); +} + +bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile ) const +{ + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + if ( theProfile.IsNull() || aHydAxis.IsNull() ) + return false; + + TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); + TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); + if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) + return false; + // TODO + + return true; +} + +bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) +{ + if ( theProfile.IsNull() ) + return false; + + if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile ) ) + return false; // Object is already in reference list or it has no intersection + + insertProfileInToOrder( theProfile ); + + // Indicate model of the need to update the stream presentation + SetToUpdate( true ); + + return true; +} + +HYDROData_SequenceOfObjects HYDROData_Stream::GetProfiles() const +{ + return GetReferenceObjects( DataTag_Profile ); +} + +bool HYDROData_Stream::RemoveProfile( const Handle(HYDROData_Profile)& theProfile ) +{ + if ( theProfile.IsNull() || !HasReference( theProfile, DataTag_Profile ) ) + return false; + + RemoveReferenceObject( theProfile->Label(), DataTag_Profile ); + + // Indicate model of the need to update the stream presentation + SetToUpdate( true ); + + return true; +} + +void HYDROData_Stream::RemoveProfiles() +{ + bool anIsToUpdate = IsMustBeUpdated() || NbReferenceObjects( DataTag_Profile ) > 0; + + ClearReferenceObjects( DataTag_Profile ); + + // Indicate model of the need to update the stream presentation + SetToUpdate( anIsToUpdate ); +} + +void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile ) +{ + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + if ( theProfile.IsNull() || aHydAxis.IsNull() ) + return; + + TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); + TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); + if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) + return; + + // TODO + AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only +} + +void HYDROData_Stream::updateProfilesOrder() +{ + HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); + if ( aRefProfiles.IsEmpty() ) + return; + + // At first we remove all profiles from order + RemoveProfiles(); + + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + if ( aHydAxis.IsNull() ) + return; + + HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( anIter.Value() ); + if ( aProfile.IsNull() || !HasIntersection( aProfile ) ) + continue; + + insertProfileInToOrder( aProfile ); + } +}