Salome HOME
6.12.2013.Fix of HasIntersection method.
[modules/hydro.git] / src / HYDROData / HYDROData_Channel.cxx
index 9ad19c9716e70bc452562c8769c18b2d4c74dad0..e1363d79e9db29b016e712ba7efdbaad1ddf84a5 100644 (file)
@@ -7,6 +7,12 @@
 
 #include <TopoDS.hxx>
 #include <TopoDS_Wire.hxx>
+#include <BRepOffsetAPI_MakePipeShell.hxx>
+#include <BRepCheck_Analyzer.hxx>
+//#define DEB_CHANNEL 1
+#ifdef DEB_CHANNEL
+#include <BRepTools.hxx>
+#endif
 
 #include <QStringList>
 
@@ -47,6 +53,21 @@ 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
 {
   return getTopShape();
@@ -59,9 +80,7 @@ TopoDS_Shape HYDROData_Channel::GetShape3D() const
 
 void HYDROData_Channel::Update()
 {
-  removeTopShape();
-  removeShape3D();
-  SetToUpdate( false );
+  HYDROData_ArtificialObject::Update();
 
   Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine();
   Handle(HYDROData_Profile) aProfile = GetProfile();
@@ -69,21 +88,51 @@ void HYDROData_Channel::Update()
     return;
 
   // TODO
+  TopoDS_Wire aPathWire = TopoDS::Wire(aGuideLine->GetShape3D());
+  if(aPathWire.IsNull())
+    return;
+  TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetShape3D() ); 
+  if(aProfileWire.IsNull())
+       return;
+
+  BRepOffsetAPI_MakePipeShell aMkSweep(aPathWire);
+  aMkSweep.Add(aProfileWire,Standard_True, Standard_True);
+  aMkSweep.SetTransitionMode(BRepBuilderAPI_RightCorner);
+  aMkSweep.SetMode(Standard_True);
+  aMkSweep.Build();
+  if(aMkSweep.IsDone())         { 
+       const TopoDS_Shape& aChannel = aMkSweep.Shape();
+    BRepCheck_Analyzer aCheck(aChannel);
+    if(aCheck.IsValid()) 
+       {
+      //BRepTools::Write(aChannel, "ChanV.brep");  
+      SetShape3D( aMkSweep.Shape());
+       } else {
+#ifdef DEB_CHANNEL
+         cout <<"NOT VALID" <<endl;
+         BRepTools::Write(aChannel, "ChanNV.brep");  
+#endif
+       }
+  }
 }
 
 bool HYDROData_Channel::SetGuideLine( const Handle(HYDROData_Polyline3D)& theGuideLine )
 {
-  if ( theGuideLine.IsNull()  )
+  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
 
-  Handle(HYDROData_Polyline3D) aPrevGuideLine = GetGuideLine();
-  if ( IsEqual( aPrevGuideLine, theGuideLine ) )
-    return true;
-
   SetReferenceObject( theGuideLine, DataTag_GuideLine );
 
   // Indicate model of the need to update the chanel presentation
@@ -112,12 +161,16 @@ void HYDROData_Channel::RemoveGuideLine()
 
 bool HYDROData_Channel::SetProfile( const Handle(HYDROData_Profile)& theProfile )
 {
-  if ( theProfile.IsNull()  )
-    return false;
-  
   Handle(HYDROData_Profile) aPrevProfile = GetProfile();
+
+  if ( theProfile.IsNull() )
+  {
+    RemoveProfile();
+    return !aPrevProfile.IsNull();
+  }
+
   if ( IsEqual( aPrevProfile, theProfile ) )
-    return true;
+    return false;
 
   SetReferenceObject( theProfile, DataTag_Profile );