X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Channel.cxx;h=bf269244d08bd6abe8d4fce10332fff9432d07b7;hb=c7cf59e092fe050003d1e556715e3ac97acf6bd4;hp=0a1d13bd4d8ce2fe4c70412959e51f15135a82f6;hpb=7b9454f8053b968f127bf7981eb05b6749e261f4;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Channel.cxx b/src/HYDROData/HYDROData_Channel.cxx index 0a1d13bd..bf269244 100644 --- a/src/HYDROData/HYDROData_Channel.cxx +++ b/src/HYDROData/HYDROData_Channel.cxx @@ -1,13 +1,53 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #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 "HYDROData_ShapesGroup.h" +#include "HYDROData_ShapesTool.h" +#include "HYDROData_Pipes.h" -#include +#include +#include +#include -#include +#include + +#include +#include +#include + +//#define DEB_CHANNEL 1 +#ifdef DEB_CHANNEL +#include +#endif -#define PYTHON_CHANNEL_ID "KIND_CHANNEL" +#include +#include IMPLEMENT_STANDARD_HANDLE(HYDROData_Channel,HYDROData_ArtificialObject) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Channel,HYDROData_ArtificialObject) @@ -24,37 +64,253 @@ HYDROData_Channel::~HYDROData_Channel() QStringList HYDROData_Channel::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const { - QStringList aResList; + QStringList aResList = dumpObjectCreation( theTreatedObjects ); + QString aName = GetObjPyName(); - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this ); - 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; } +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(); } +bool HYDROData_Channel::CreatePresentations( const Handle(HYDROData_Polyline3D)& theGuideLine, + const Handle(HYDROData_Profile)& theProfile, + PrsDefinition& thePrs ) +{ + if ( theGuideLine.IsNull() || theProfile.IsNull() ) + return false; + + // build 3d shape + TopoDS_Wire aPathWire = TopoDS::Wire( theGuideLine->GetShape3D() ); + TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetShape3D() ); + if ( aPathWire.IsNull() || aProfileWire.IsNull() ) + return false; + +#ifdef DEB_CHANNEL + BRepTools::Write( aPathWire, "guideline.brep" ); + BRepTools::Write( aProfileWire, "profile.brep" ); +#endif + + HYDROData_Canal3dAnd2d aChannelConstructor( aProfileWire, aPathWire ); + if( aChannelConstructor.GetStatus() != 0 ) + return false; + + aChannelConstructor.Create3dPresentation(); + aChannelConstructor.Create2dPresentation(); + thePrs.myPrs3D = aChannelConstructor.Get3dPresentation(); + thePrs.myPrs2D = aChannelConstructor.Get2dPresentation(); + + thePrs.myLeftBank = aChannelConstructor.GetLeftBank(); + thePrs.myRightBank = aChannelConstructor.GetRightBank(); + thePrs.myInlet = aChannelConstructor.GetInlet(); + thePrs.myOutlet = aChannelConstructor.GetOutlet(); + +#ifdef DEB_CHANNEL + BRepTools::Write( thePrs.myPrs2D, "channel2d.brep" ); + BRepTools::Write( thePrs.myPrs3D, "channel3d.brep" ); + HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Top shape edges:", thePrs.myPrs2D, TopAbs_EDGE ); + HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Left bank edges:", thePrs.myLeftBank, TopAbs_EDGE ); + HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Right bank edges:", thePrs.myRightBank, TopAbs_EDGE ); + HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Inlet edges:", thePrs.myInlet, TopAbs_EDGE ); + HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Outlet edges:", thePrs.myOutlet, TopAbs_EDGE ); +#endif + + return true; +} + +void HYDROData_Channel::Update() +{ + HYDROData_ArtificialObject::Update(); + + Handle(HYDROData_Polyline3D) aGuideLine = GetGuideLine(); + Handle(HYDROData_Profile) aProfile = GetProfile(); + + PrsDefinition aResultPrs; + if ( !CreatePresentations( aGuideLine, aProfile, aResultPrs ) ) + return; + + SetShape3D( aResultPrs.myPrs3D ); + SetTopShape( aResultPrs.myPrs2D ); + + // Create groups for channel + TopTools_SequenceOfShape aLeftBankEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( aResultPrs.myLeftBank, TopAbs_EDGE, aLeftBankEdges ); + + TopTools_SequenceOfShape aRightBankEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( aResultPrs.myRightBank, TopAbs_EDGE, aRightBankEdges ); + + TopTools_SequenceOfShape anInletEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( aResultPrs.myInlet, TopAbs_EDGE, anInletEdges ); + + TopTools_SequenceOfShape anOutletEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( aResultPrs.myOutlet, 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 ); +} + +bool HYDROData_Channel::IsHas2dPrs() const +{ + return true; +} + +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 ); +} + +ObjectKind HYDROData_Channel::getAltitudeObjectType() const +{ + return KIND_OBSTACLE_ALTITUDE; +}