#include "HYDROData_Channel.h"
#include "HYDROData_Document.h"
-
-#include <TopoDS_Shape.hxx>
+#include "HYDROData_Polyline3D.h"
+#include "HYDROData_Profile.h"
+
+#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>
{
QStringList aResList;
- Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
if ( aDocument.IsNull() )
return aResList;
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
+ 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 )
+{
+ 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 );
+}