From d5968172f0907790865b19422eb3a2915c52d8f9 Mon Sep 17 00:00:00 2001 From: mzn Date: Fri, 13 Dec 2013 08:10:10 +0000 Subject: [PATCH] Bug #141: show confirmation message on axis change, take the OB selection into account when remove profiles. --- src/HYDROData/HYDROData_Stream.cxx | 19 ++++++++---- src/HYDROData/HYDROData_Stream.h | 10 ++++++- src/HYDROGUI/HYDROGUI_StreamDlg.cxx | 4 +-- src/HYDROGUI/HYDROGUI_StreamOp.cxx | 45 ++++++++++++++++++++++++----- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index e49b2b79..426159b2 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -354,14 +354,15 @@ void HYDROData_Stream::RemoveHydraulicAxis() SetToUpdate( true ); } -bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, - Standard_Real& outPar ) const +bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theHydAxis, + const Handle(HYDROData_Profile)& theProfile, + const TopoDS_Face& thePlane, + Standard_Real& outPar) { - Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); - if ( theProfile.IsNull() || aHydAxis.IsNull() ) + if ( theProfile.IsNull() || theHydAxis.IsNull() ) return false; - TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); //guide line + TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); //guide line TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) return false; @@ -455,6 +456,14 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf return false; } +bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, + Standard_Real& outPar ) const +{ + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + + return HasIntersection( aHydAxis, theProfile, thePlane, outPar ); +} + bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) { diff --git a/src/HYDROData/HYDROData_Stream.h b/src/HYDROData/HYDROData_Stream.h index e7bec195..149c2a6f 100644 --- a/src/HYDROData/HYDROData_Stream.h +++ b/src/HYDROData/HYDROData_Stream.h @@ -92,6 +92,14 @@ public: */ HYDRODATA_EXPORT virtual void RemoveHydraulicAxis(); + /** + * Returns true if profile has the intersection with the given hydraulic axis. + * Returns the parameter of inresection point on axis if axis is presented by one curve, + * if axis presented by set of edges the returns a common length of segments till the intersection point. + */ + HYDRODATA_EXPORT static bool HasIntersection( const Handle(HYDROData_PolylineXY)& theHydAxis, + const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, + Standard_Real& outPar); /** * Returns true if profile has the intersection with reference hydraulic axis. @@ -99,7 +107,7 @@ public: * if axis presented by set of edges the returns a common length of segments till the intersection point. */ HYDRODATA_EXPORT virtual bool HasIntersection( const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, - Standard_Real& outPar) const; + Standard_Real& outPar) const; /** * Builds a planar face diff --git a/src/HYDROGUI/HYDROGUI_StreamDlg.cxx b/src/HYDROGUI/HYDROGUI_StreamDlg.cxx index b1a208a8..31479075 100644 --- a/src/HYDROGUI/HYDROGUI_StreamDlg.cxx +++ b/src/HYDROGUI/HYDROGUI_StreamDlg.cxx @@ -178,7 +178,5 @@ void HYDROGUI_StreamDlg::onRemoveProfiles() } } - if ( !aSelectedProfiles.isEmpty() ) { - emit RemoveProfiles( aSelectedProfiles ); - } + emit RemoveProfiles( aSelectedProfiles ); } diff --git a/src/HYDROGUI/HYDROGUI_StreamOp.cxx b/src/HYDROGUI/HYDROGUI_StreamOp.cxx index 1557a794..5882c2f8 100755 --- a/src/HYDROGUI/HYDROGUI_StreamOp.cxx +++ b/src/HYDROGUI/HYDROGUI_StreamOp.cxx @@ -319,19 +319,39 @@ void HYDROGUI_StreamOp::onRemoveProfiles( const QStringList& theProfilesToRemove return; } + bool isRemoved = false; + + // Take the Object Browser selection into account + HYDROData_SequenceOfObjects aSelectedObjects = HYDROGUI_Tool::GetSelectedObjects( module() ); + for( int i = 1, n = aSelectedObjects.Length(); i <= n; i++ ) { + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( aSelectedObjects.Value( i ) ); + if ( !aProfile.IsNull() && !theProfilesToRemove.contains(aProfile->GetName()) ) { + if ( myEditedObject->RemoveProfile( aProfile ) ) { + isRemoved = true; + } + } + } + // Remove profiles foreach( const QString& aProfileName, theProfilesToRemove ) { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) ); - myEditedObject->RemoveProfile( aProfile ); + if ( myEditedObject->RemoveProfile( aProfile ) ) { + isRemoved = true; + } } - myEditedObject->Update(); - // Update the panel - updatePanelData(); + if ( isRemoved ) { + // Update the edited stream object + myEditedObject->Update(); - // Update preview - createPreview(); + // Update the panel + updatePanelData(); + + // Update preview + createPreview(); + } } void HYDROGUI_StreamOp::onAxisChanged( const QString& theNewAxis ) @@ -344,6 +364,15 @@ void HYDROGUI_StreamOp::onAxisChanged( const QString& theNewAxis ) Handle(HYDROData_PolylineXY) anAxis = Handle(HYDROData_PolylineXY)::DownCast( HYDROGUI_Tool::FindObjectByName( module(), theNewAxis, KIND_POLYLINEXY ) ); + // Prepare data for intersection check + TopoDS_Face aPlane; + if ( anAxis.IsNull() || !myEditedObject->BuildFace(anAxis, aPlane) ) { + // To restore the old axis + updatePanelData(); + return; + } + Standard_Real aPar(.0); + // Get list of profiles which do not intersect the axis QStringList aHasNoIntersectionProfiles; HYDROData_SequenceOfObjects aCurrentProfiles = myEditedObject->GetProfiles(); @@ -351,7 +380,9 @@ void HYDROGUI_StreamOp::onAxisChanged( const QString& theNewAxis ) Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( aCurrentProfiles.Value( anIndex ) ); if ( !aProfile.IsNull() ) { - // TODO check intersection + if ( !HYDROData_Stream::HasIntersection( anAxis, aProfile, aPlane, aPar ) ) { + aHasNoIntersectionProfiles << aProfile->GetName(); + } } } -- 2.39.2