]> SALOME platform Git repositories - modules/hydro.git/blobdiff - src/HYDROData/HYDROData_Channel.cxx
Salome HOME
Create goups for stream.
[modules/hydro.git] / src / HYDROData / HYDROData_Channel.cxx
index 0a1d13bd4d8ce2fe4c70412959e51f15135a82f6..7adfcd8d04c118be4935dbb7b119cda89d1d8312 100644 (file)
@@ -2,9 +2,25 @@
 #include "HYDROData_Channel.h"
 
 #include "HYDROData_Document.h"
+#include "HYDROData_Polyline3D.h"
+#include "HYDROData_Profile.h"
+#include "HYDROData_PolylineXY.h"
+#include "HYDROData_Projection.h"
 
-#include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Wire.hxx>
+#include <BRepOffsetAPI_MakePipeShell.hxx>
+#include <BRepOffsetAPI_MakePipe.hxx>
+#include <BRepCheck_Analyzer.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopExp.hxx>
+//#define DEB_CHANNEL 1
+#ifdef DEB_CHANNEL
+#include <BRepTools.hxx>
+#endif
 
+#include <QColor>
 #include <QStringList>
 
 #define PYTHON_CHANNEL_ID "KIND_CHANNEL"
@@ -26,7 +42,7 @@ QStringList HYDROData_Channel::DumpToPython( MapOfTreatedObjects& theTreatedObje
 {
   QStringList aResList;
 
-  Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
+  Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
   if ( aDocument.IsNull() )
     return aResList;
 
@@ -44,17 +60,210 @@ 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;
+
+  // build 3d shape 
+  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
+       }
+  }
+
+  // build 2d shape -- temporary solution!!
+  TopoDS_Face aProj = HYDROData_Projection::MakeProjection( GetShape3D() );
+  SetTopShape( aProj );
+
+  /*
+  //aMkSweep.Generated() - it seems doesn't work
+  //TopoDS_Vertex aV1,aV2;
+  //TopExp::Vertices (aProfileWire, aV1, aV2);
+  //const TopTools_ListOfShape& aList1 = aMkSweep.Generated(aV1);
+  //const TopTools_ListOfShape& aList2 = aMkSweep.Generated(aV2);
+  //cout <<"List1 = " << aList1.Extent() <<endl;
+  //cout <<"List2 = " << aList2.Extent() <<endl;
+  TopoDS_Wire aPathWire2d = TopoDS::Wire(aGuideLine->GetPolylineXY()->GetShape()); 
+  if(aPathWire2d.IsNull())
+    return;
+  TopoDS_Wire aProfileWire2d = TopoDS::Wire( aProfile->GetTopShape() ); 
+  if(aProfileWire2d.IsNull())
+       return;
+  //BRepTools::Write(aPathWire2d, "PathWire2.brep");  
+  //BRepTools::Write(aProfileWire2d, "ProfileWire2.brep");  
+  //BRepOffsetAPI_MakePipeShell aMkSweep2d(aPathWire2d);
+  //aMkSweep2d.Add(aProfileWire2d,Standard_True, Standard_True);
+  //aMkSweep2d.SetTransitionMode(BRepBuilderAPI_RightCorner);
+  //aMkSweep2d.SetMode(Standard_True);
+  //aMkSweep2d.Build();
+   BRepOffsetAPI_MakePipe aMkSweep2d(aPathWire2d, aProfileWire2d);
+   aMkSweep2d.Build();
+  if(aMkSweep2d.IsDone())       { 
+       const TopoDS_Shape& aChannel2d = aMkSweep2d.Shape();
+    BRepCheck_Analyzer aCheck(aChannel2d);
+    if(aCheck.IsValid()) 
+       {
+      //BRepTools::Write(aChannel2d, "Chan2dV.brep");  
+      SetTopShape( aChannel2d);
+       }
+#ifdef DEB_CHANNEL     
+       else {
+         cout <<"NOT VALID" <<endl;
+         BRepTools::Write(aChannel2d, "Chan2dNV.brep");  
+       }
+#endif
+  }*/
+}
+
+QColor HYDROData_Channel::DefaultFillingColor()
+{
+  return QColor( Qt::blue );
+}
+
+QColor HYDROData_Channel::DefaultBorderColor()
+{
+  return QColor( Qt::transparent );
+}
+
+QColor HYDROData_Channel::getDefaultFillingColor() const
+{
+  return DefaultFillingColor();
+}
+
+QColor HYDROData_Channel::getDefaultBorderColor() const
+{
+  return DefaultBorderColor();
+}
+
+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 );
+}