Salome HOME
patch for correct compilation on Linux
[modules/hydro.git] / src / HYDROData / HYDROData_Channel.cxx
index b365008a5280479091ef9e993c304decc98046c6..3aab98b5ac6ea61db8394bc8904aa6fbefc5ddab 100644 (file)
@@ -2,8 +2,11 @@
 #include "HYDROData_Channel.h"
 
 #include "HYDROData_Document.h"
+#include "HYDROData_Polyline3D.h"
+#include "HYDROData_Profile.h"
 
-#include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Wire.hxx>
 
 #include <QStringList>
 
@@ -44,17 +47,121 @@ QStringList HYDROData_Channel::DumpToPython( MapOfTreatedObjects& theTreatedObje
   return aResList;
 }
 
+HYDROData_SequenceOfObjects HYDROData_Channel::GetAllReferenceObjects() const
+{
+  HYDROData_SequenceOfObjects aResSeq = HYDROData_ArtificialObject::GetAllReferenceObjects();
+
+  Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine();
+  if ( !aGuideLine.IsNull() )
+    aResSeq.Append( aGuideLine );
+
+  Handle(HYDROData_Profile) aProfile = GetProfile();
+  if ( !aProfile.IsNull() )
+    aResSeq.Append( aProfile );
+
+  return aResSeq;
+}
+
 TopoDS_Shape HYDROData_Channel::GetTopShape() const
 {
-  // TODO
   return getTopShape();
 }
 
 TopoDS_Shape HYDROData_Channel::GetShape3D() const
 {
-  // TODO
   return getShape3D();
 }
 
+void HYDROData_Channel::Update()
+{
+  HYDROData_ArtificialObject::Update();
+
+  Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine();
+  Handle(HYDROData_Profile) aProfile = GetProfile();
+  if ( aGuideLine.IsNull() || aProfile.IsNull() )
+    return;
+
+  // TODO
+}
+
+bool HYDROData_Channel::SetGuideLine( const Handle(HYDROData_Polyline3D)& theGuideLine )
+{
+  Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
+
+  if ( theGuideLine.IsNull() )
+  {
+    RemoveGuideLine();
+    return !aPrevGuideLine.IsNull();
+  }
+
+  if ( IsEqual( aPrevGuideLine, theGuideLine ) )
+    return false;
+
+  TopoDS_Wire aHydraulicWire = TopoDS::Wire( theGuideLine->GetTopShape() );
+  if ( aHydraulicWire.IsNull() )
+    return false; // The polyline must be a single wire
+
+  SetReferenceObject( theGuideLine, DataTag_GuideLine );
+
+  // Indicate model of the need to update the chanel presentation
+  SetToUpdate( true );
+
+  return true;
+}
+
+Handle(HYDROData_Polyline3D) HYDROData_Channel::GetGuideLine() const
+{
+  return Handle(HYDROData_Polyline3D)::DownCast( 
+           GetReferenceObject( DataTag_GuideLine ) );
+}
+
+void HYDROData_Channel::RemoveGuideLine()
+{
+  Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
+  if ( aPrevGuideLine.IsNull() )
+    return;
+
+  ClearReferenceObjects( DataTag_GuideLine );
+
+  // Indicate model of the need to update the chanel presentation
+  SetToUpdate( true );
+}
+
+bool HYDROData_Channel::SetProfile( const Handle(HYDROData_Profile)& theProfile )
+{
+  Handle(HYDROData_Profile) aPrevProfile = GetProfile();
+
+  if ( theProfile.IsNull() )
+  {
+    RemoveProfile();
+    return !aPrevProfile.IsNull();
+  }
+
+  if ( IsEqual( aPrevProfile, theProfile ) )
+    return false;
+
+  SetReferenceObject( theProfile, DataTag_Profile );
+
+  // Indicate model of the need to update the chanel presentation
+  SetToUpdate( true );
+
+  return true;
+}
+
+Handle(HYDROData_Profile) HYDROData_Channel::GetProfile() const
+{
+  return Handle(HYDROData_Profile)::DownCast( 
+           GetReferenceObject( DataTag_Profile ) );
+}
 
+void HYDROData_Channel::RemoveProfile()
+{
+  Handle(HYDROData_Profile) aPrevProfile = GetProfile();
+  if ( aPrevProfile.IsNull() )
+    return;
 
+  ClearReferenceObjects( DataTag_Profile );
+
+  // Indicate model of the need to update the chanel presentation
+  SetToUpdate( true );
+}