X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_ImmersibleZone.cxx;h=ae2b7ddd0493a391f831bbfdf64f75f8c9159170;hb=27b1abdc88719c5bce7a8d2f49612cd155e80d21;hp=286cbaa39a9df099166b418d0d2221189f2f7acb;hpb=0d9decc8762a829f1bdc69048fab08122e441ec0;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_ImmersibleZone.cxx b/src/HYDROData/HYDROData_ImmersibleZone.cxx index 286cbaa3..ae2b7ddd 100644 --- a/src/HYDROData/HYDROData_ImmersibleZone.cxx +++ b/src/HYDROData/HYDROData_ImmersibleZone.cxx @@ -1,20 +1,48 @@ +// Copyright (C) 2014-2015 EDF-R&D +// 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_ImmersibleZone.h" -#include "HYDROData_Bathymetry.h" +#include "HYDROData_IAltitudeObject.h" #include "HYDROData_Document.h" -#include "HYDROData_Polyline.h" +#include "HYDROData_ShapesGroup.h" +#include "HYDROData_PolylineXY.h" +#include "HYDROData_ShapesTool.h" #include #include #include #include +#include +#include +#include + +#include +#include +#include + +#include #include #include -#define PYTHON_IMMERSIBLE_ZONE_ID "KIND_IMMERSIBLE_ZONE" +//#define HYDRODATA_IMZONE_DEB 1 IMPLEMENT_STANDARD_HANDLE(HYDROData_ImmersibleZone,HYDROData_NaturalObject) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_ImmersibleZone,HYDROData_NaturalObject) @@ -31,127 +59,222 @@ HYDROData_ImmersibleZone::~HYDROData_ImmersibleZone() QStringList HYDROData_ImmersibleZone::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const { - QStringList aResList; + QStringList aResList = dumpObjectCreation( theTreatedObjects ); + + QString aZoneName = GetObjPyName(); - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this ); - if ( aDocument.IsNull() ) - return aResList; + Handle(HYDROData_IAltitudeObject) aRefAltitude = GetAltitudeObject(); + setPythonReferenceObject( theTreatedObjects, aResList, aRefAltitude, "SetAltitudeObject" ); - QString aDocName = aDocument->GetDocPyName(); - QString aZoneName = GetName(); + Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline(); + setPythonReferenceObject( theTreatedObjects, aResList, aRefPolyline, "SetPolyline" ); - aResList << QString( "%1 = %2.CreateObject( %3 );" ) - .arg( aZoneName ).arg( aDocName ).arg( PYTHON_IMMERSIBLE_ZONE_ID ); - aResList << QString( "%1.SetName( \"%2\" );" ) - .arg( aZoneName ).arg( aZoneName ); aResList << QString( "" ); - QColor aFillingColor = GetFillingColor(); - aResList << QString( "filling_color = QColor( %1, %2, %3, %4 );" ) - .arg( aFillingColor.red() ).arg( aFillingColor.green() ) - .arg( aFillingColor.blue() ).arg( aFillingColor.alpha() ); - aResList << QString( "%1.SetFillingColor( filling_color );" ).arg( aZoneName ); + aResList << QString( "%1.Update();" ).arg( aZoneName ); aResList << QString( "" ); - QColor aBorderColor = GetBorderColor(); - aResList << QString( "border_color = QColor( %1, %2, %3, %4 );" ) - .arg( aBorderColor.red() ).arg( aBorderColor.green() ) - .arg( aBorderColor.blue() ).arg( aBorderColor.alpha() ); - aResList << QString( "%1.SetBorderColor( border_color );" ).arg( aZoneName ); - aResList << QString( "" ); + return aResList; +} - Handle(HYDROData_Bathymetry) aRefBathymetry = GetBathymetry(); - setPythonReferenceObject( theTreatedObjects, aResList, aRefBathymetry, "SetBathymetry" ); +HYDROData_SequenceOfObjects HYDROData_ImmersibleZone::GetAllReferenceObjects() const +{ + HYDROData_SequenceOfObjects aResSeq = HYDROData_NaturalObject::GetAllReferenceObjects(); - Handle(HYDROData_Polyline) aRefPolyline = GetPolyline(); - setPythonReferenceObject( theTreatedObjects, aResList, aRefPolyline, "SetPolyline" ); + Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline(); + if ( !aRefPolyline.IsNull() ) + aResSeq.Append( aRefPolyline ); - return aResList; + return aResSeq; } TopoDS_Shape HYDROData_ImmersibleZone::GetTopShape() const { - Handle(HYDROData_Polyline) aPolyline = GetPolyline(); - if( !aPolyline.IsNull() ) - { - TopoDS_Wire aPolylineWire = TopoDS::Wire( aPolyline->GetTopShape() ); - if( !aPolylineWire.IsNull() ) - { - BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True ); - aMakeFace.Build(); - if( aMakeFace.IsDone() ) - return aMakeFace.Face(); - } - } - return TopoDS_Face(); + return getTopShape(); } -TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const +void HYDROData_ImmersibleZone::Update() { - // TODO - return getTopShape(); + HYDROData_NaturalObject::Update(); + + TopoDS_Shape aResShape = generateTopShape(); + SetTopShape( aResShape ); + + createGroupObjects(); } -QColor HYDROData_ImmersibleZone::DefaultFillingColor() +bool HYDROData_ImmersibleZone::IsHas2dPrs() const { - return QColor( Qt::green ); + return true; } -void HYDROData_ImmersibleZone::SetFillingColor( const QColor& theColor ) +TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const { - return SetColor( theColor, DataTag_FillingColor ); + return generateTopShape( GetPolyline() ); } -QColor HYDROData_ImmersibleZone::GetFillingColor() const +TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape( const Handle(HYDROData_PolylineXY)& aPolyline ) { - return GetColor( DefaultFillingColor(), DataTag_FillingColor ); + TopoDS_Face aResultFace = TopoDS_Face(); + + if( !aPolyline.IsNull() ) + { + TopoDS_Shape aPolylineShape = aPolyline->GetShape(); + TopTools_ListOfShape aWiresList; + + if ( !aPolylineShape.IsNull() && + aPolylineShape.ShapeType() == TopAbs_WIRE ) { + const TopoDS_Wire& aPolylineWire = TopoDS::Wire( aPolylineShape ); + if ( !aPolylineWire.IsNull() ) { + BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True ); + aMakeFace.Build(); + if( aMakeFace.IsDone() ) { + aResultFace = aMakeFace.Face(); + } + } + } else { + TopExp_Explorer anExp( aPolylineShape, TopAbs_WIRE ); + for ( ; anExp.More(); anExp.Next() ) { + if(!anExp.Current().IsNull()) { + const TopoDS_Wire& aWire = TopoDS::Wire( anExp.Current() ); + aWiresList.Append( aWire ); + } + } + if(aWiresList.IsEmpty()) + return aResultFace; + + BRepAlgo_FaceRestrictor aFR; + TopoDS_Face aRefFace; + TopoDS_Shape aS = aWiresList.First(); + BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire(aWiresList.First()), Standard_True ); + aMakeFace.Build(); + if( aMakeFace.IsDone() ) { + aRefFace = aMakeFace.Face(); + } + if(aRefFace.IsNull()) + return aResultFace; + + aFR.Init(aRefFace,Standard_False, Standard_True); + TopTools_ListIteratorOfListOfShape anIt( aWiresList ); + for ( ; anIt.More(); anIt.Next() ) { + TopoDS_Wire& aWire = TopoDS::Wire( anIt.Value() ); + if ( aWire.IsNull() ) + continue; + aFR.Add(aWire); + } + aFR.Perform(); + if (aFR.IsDone()) { + for (; aFR.More(); aFR.Next()) { + aResultFace = aFR.Current(); + break; + } + } + } + } + + if( aResultFace.IsNull() ) + return aResultFace; + + BRepCheck_Analyzer anAnalyzer( aResultFace ); + if( anAnalyzer.IsValid() && aResultFace.ShapeType()==TopAbs_FACE ) + return aResultFace; + else + return TopoDS_Face(); } -QColor HYDROData_ImmersibleZone::DefaultBorderColor() +void HYDROData_ImmersibleZone::createGroupObjects() { - return QColor( Qt::transparent ); + TopoDS_Shape aZoneShape = GetTopShape(); + + // Temporary solution while the restriction for polylines is not implemented + // and shape for zone can be compound and not face only + if ( !aZoneShape.IsNull() && aZoneShape.ShapeType() != TopAbs_FACE ) + { + TopExp_Explorer aZoneFaceExp( aZoneShape, TopAbs_FACE ); + if ( aZoneFaceExp.More() ) + aZoneShape = aZoneFaceExp.Current(); // Take only first face into account + } + + if ( aZoneShape.IsNull() || aZoneShape.ShapeType() != TopAbs_FACE ) + return; + + TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape ); + + TopoDS_Wire aZoneOuterWire = ShapeAnalysis::OuterWire( aZoneFace ); + + // Create outer edges group + QString anOutWiresGroupName = GetName() + "_Outer"; + + Handle(HYDROData_ShapesGroup) anOutWiresGroup = createGroupObject(); + anOutWiresGroup->SetName( anOutWiresGroupName ); + + TopTools_SequenceOfShape anOuterEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( aZoneOuterWire, TopAbs_EDGE, anOuterEdges ); + anOutWiresGroup->SetShapes( anOuterEdges ); + + int anInnerCounter = 1; + TopExp_Explorer aZoneFaceExp( aZoneFace, TopAbs_WIRE ); + for ( ; aZoneFaceExp.More(); aZoneFaceExp.Next() ) + { + TopoDS_Wire aZoneWire = TopoDS::Wire( aZoneFaceExp.Current() ); + if ( aZoneWire.IsEqual( aZoneOuterWire ) ) + continue; // Skip the outer wire + + TopTools_SequenceOfShape anInnerEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( aZoneWire, TopAbs_EDGE, anInnerEdges ); + if ( anInnerEdges.IsEmpty() ) + continue; + + QString anInWiresGroupName = GetName() + "_Inner_" + QString::number( anInnerCounter++ ); + + Handle(HYDROData_ShapesGroup) anInWiresGroup = createGroupObject(); + anInWiresGroup->SetName( anInWiresGroupName ); + + anInWiresGroup->SetShapes( anInnerEdges ); + } } -void HYDROData_ImmersibleZone::SetBorderColor( const QColor& theColor ) +TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const { - return SetColor( theColor, DataTag_BorderColor ); + return getTopShape(); } -QColor HYDROData_ImmersibleZone::GetBorderColor() const +QColor HYDROData_ImmersibleZone::DefaultFillingColor() { - return GetColor( DefaultBorderColor(), DataTag_BorderColor ); + return QColor( Qt::darkBlue ); } -void HYDROData_ImmersibleZone::SetPolyline( const Handle(HYDROData_Polyline)& thePolyline ) +QColor HYDROData_ImmersibleZone::DefaultBorderColor() { - SetReferenceObject( thePolyline, DataTag_Polyline ); + return QColor( Qt::transparent ); } -Handle(HYDROData_Polyline) HYDROData_ImmersibleZone::GetPolyline() const +QColor HYDROData_ImmersibleZone::getDefaultFillingColor() const { - return Handle(HYDROData_Polyline)::DownCast( - GetReferenceObject( DataTag_Polyline ) ); + return DefaultFillingColor(); } -void HYDROData_ImmersibleZone::RemovePolyline() +QColor HYDROData_ImmersibleZone::getDefaultBorderColor() const { - ClearReferenceObjects( DataTag_Polyline ); + return DefaultBorderColor(); } -void HYDROData_ImmersibleZone::SetBathymetry( const Handle(HYDROData_Bathymetry)& theBathymetry ) +void HYDROData_ImmersibleZone::SetPolyline( const Handle(HYDROData_PolylineXY)& thePolyline ) { - SetReferenceObject( theBathymetry, DataTag_Bathymetry ); + SetReferenceObject( thePolyline, DataTag_Polyline ); + SetToUpdate( true ); } -Handle(HYDROData_Bathymetry) HYDROData_ImmersibleZone::GetBathymetry() const +Handle(HYDROData_PolylineXY) HYDROData_ImmersibleZone::GetPolyline() const { - return Handle(HYDROData_Bathymetry)::DownCast( - GetReferenceObject( DataTag_Bathymetry ) ); + return Handle(HYDROData_PolylineXY)::DownCast( + GetReferenceObject( DataTag_Polyline ) ); } -void HYDROData_ImmersibleZone::RemoveBathymetry() +void HYDROData_ImmersibleZone::RemovePolyline() { - ClearReferenceObjects( DataTag_Bathymetry ); + ClearReferenceObjects( DataTag_Polyline ); + SetToUpdate( true ); }