#include "HYDROData_Profile.h"
#include "HYDROData_PolylineXY.h"
#include "HYDROData_Projection.h"
+#include "HYDROData_ShapesGroup.h"
+#include "HYDROData_ShapesTool.h"
+#include "HYDROData_Pipes.h"
-#include <TopoDS.hxx>
-#include <TopoDS_Wire.hxx>
#include <BRepOffsetAPI_MakePipeShell.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <BRepCheck_Analyzer.hxx>
+
+#include <TopExp.hxx>
+
+#include <TopoDS.hxx>
+#include <TopoDS_Wire.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Face.hxx>
-#include <TopExp.hxx>
+
//#define DEB_CHANNEL 1
#ifdef DEB_CHANNEL
#include <BRepTools.hxx>
#include <QColor>
#include <QStringList>
-#define PYTHON_CHANNEL_ID "KIND_CHANNEL"
-
IMPLEMENT_STANDARD_HANDLE(HYDROData_Channel,HYDROData_ArtificialObject)
IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Channel,HYDROData_ArtificialObject)
QStringList HYDROData_Channel::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
{
- QStringList aResList;
+ QStringList aResList = dumpObjectCreation( theTreatedObjects );
+ QString aName = GetObjPyName();
- Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
- if ( aDocument.IsNull() )
- return aResList;
+ Handle(HYDROData_Polyline3D) aRefGideLine = GetGuideLine();
+ setPythonReferenceObject( theTreatedObjects, aResList, aRefGideLine, "SetGuideLine" );
- QString aDocName = aDocument->GetDocPyName();
- QString aChannelName = GetName();
+ Handle(HYDROData_Profile) aRefProfile = GetProfile();
+ setPythonReferenceObject( theTreatedObjects, aResList, aRefProfile, "SetProfile" );
- aResList << QString( "%1 = %2.CreateObject( %3 );" )
- .arg( aChannelName ).arg( aDocName ).arg( PYTHON_CHANNEL_ID );
- aResList << QString( "%1.SetName( \"%2\" );" )
- .arg( aChannelName ).arg( aChannelName );
aResList << QString( "" );
-
- // TODO
+ aResList << QString( "%1.Update();" ).arg( aName );
+ aResList << QString( "" );
return aResList;
}
return;
// build 3d shape
- TopoDS_Wire aPathWire = TopoDS::Wire(aGuideLine->GetShape3D());
+ TopoDS_Wire aPathWire = TopoDS::Wire(aGuideLine->GetShape3D());
if(aPathWire.IsNull())
return;
- TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetShape3D() );
+ 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 {
+ return;
+
#ifdef DEB_CHANNEL
- cout <<"NOT VALID" <<endl;
- BRepTools::Write(aChannel, "ChanNV.brep");
+ BRepTools::Write( aPathWire, "guideline.brep" );
+ BRepTools::Write( aProfileWire, "profile.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())
+ HYDROData_Canal3dAnd2d aChannelConstructor( aProfileWire, aPathWire );
+ if( aChannelConstructor.GetStatus() != 0 )
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");
- }
+
+ aChannelConstructor.Create3dPresentation();
+ aChannelConstructor.Create2dPresentation();
+ SetShape3D( aChannelConstructor.Get3dPresentation() );
+ SetTopShape( aChannelConstructor.Get2dPresentation() );
+
+#ifdef DEB_CHANNEL
+ BRepTools::Write( aChannelConstructor.Get2dPresentation(), "channel2d.brep" );
+ BRepTools::Write( aChannelConstructor.Get3dPresentation(), "channel3d.brep" );
#endif
- }*/
+
+ TopAbs_ShapeEnum aType = GetTopShape().ShapeType();
+
+ // Create groups for channel
+ TopoDS_Wire aLeftBank = aChannelConstructor.GetLeftBank();
+ TopoDS_Wire aRightBank = aChannelConstructor.GetRightBank();
+ TopoDS_Wire anInlet = aChannelConstructor.GetInlet();
+ TopoDS_Wire anOutlet = aChannelConstructor.GetOutlet();
+
+#ifdef DEB_CHANNEL
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Top shape edges:", GetTopShape(), TopAbs_EDGE );
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Left bank edges:", aLeftBank, TopAbs_EDGE );
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Right bank edges:", aRightBank, TopAbs_EDGE );
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Inlet edges:", anInlet, TopAbs_EDGE );
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Outlet edges:", anOutlet, TopAbs_EDGE );
+#endif
+
+ TopTools_SequenceOfShape aLeftBankEdges;
+ HYDROData_ShapesTool::ExploreShapeToShapes( aLeftBank, TopAbs_EDGE, aLeftBankEdges );
+
+ TopTools_SequenceOfShape aRightBankEdges;
+ HYDROData_ShapesTool::ExploreShapeToShapes( aRightBank, TopAbs_EDGE, aRightBankEdges );
+
+ TopTools_SequenceOfShape anInletEdges;
+ HYDROData_ShapesTool::ExploreShapeToShapes( anInlet, TopAbs_EDGE, anInletEdges );
+
+ TopTools_SequenceOfShape anOutletEdges;
+ HYDROData_ShapesTool::ExploreShapeToShapes( anOutlet, TopAbs_EDGE, anOutletEdges );
+
+ QString aLeftGroupName = GetName() + "_Left_Bank";
+
+ Handle(HYDROData_ShapesGroup) aLeftGroup = createGroupObject();
+ aLeftGroup->SetName( aLeftGroupName );
+ aLeftGroup->SetShapes( aLeftBankEdges );
+
+ QString aRightGroupName = GetName() + "_Right_Bank";
+
+ Handle(HYDROData_ShapesGroup) aRightGroup = createGroupObject();
+ aRightGroup->SetName( aRightGroupName );
+ aRightGroup->SetShapes( aRightBankEdges );
+
+ QString anInGroupName = GetName() + "_Inlet";
+
+ Handle(HYDROData_ShapesGroup) anInGroup = createGroupObject();
+ anInGroup->SetName( anInGroupName );
+ anInGroup->SetShapes( anInletEdges );
+
+ QString anOutGroupName = GetName() + "_Outlet";
+
+ Handle(HYDROData_ShapesGroup) anOutGroup = createGroupObject();
+ anOutGroup->SetName( anOutGroupName );
+ anOutGroup->SetShapes( anOutletEdges );
}
QColor HYDROData_Channel::DefaultFillingColor()
// Indicate model of the need to update the chanel presentation
SetToUpdate( true );
}
+
+ObjectKind HYDROData_Channel::getAltitudeObjectType() const
+{
+ return KIND_OBSTACLE_ALTITUDE;
+}
+