X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_ImmersibleZone.cxx;h=028e666610c78d9420f8e85a519b81481d8ddd95;hb=5617222a44e709aa05f81f868300462d8a6b30b2;hp=cf4375de071ad75da5cab1d645d7a8bd9077c740;hpb=34310fe4f26db0f23c2edfef1678e5b02f578204;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_ImmersibleZone.cxx b/src/HYDROData/HYDROData_ImmersibleZone.cxx index cf4375de..028e6666 100644 --- a/src/HYDROData/HYDROData_ImmersibleZone.cxx +++ b/src/HYDROData/HYDROData_ImmersibleZone.cxx @@ -1,9 +1,11 @@ #include "HYDROData_ImmersibleZone.h" -#include "HYDROData_Bathymetry.h" +#include "HYDROData_IAltitudeObject.h" #include "HYDROData_Document.h" +#include "HYDROData_ShapesGroup.h" #include "HYDROData_PolylineXY.h" +#include "HYDROData_ShapesTool.h" #include @@ -13,9 +15,13 @@ #include #include #include + #include #include #include + +#include + #include #include @@ -66,8 +72,8 @@ QStringList HYDROData_ImmersibleZone::DumpToPython( MapOfTreatedObjects& theTrea aResList << QString( "%1.SetBorderColor( border_color );" ).arg( aZoneName ); aResList << QString( "" ); - Handle(HYDROData_Bathymetry) aRefBathymetry = GetBathymetry(); - setPythonReferenceObject( theTreatedObjects, aResList, aRefBathymetry, "SetBathymetry" ); + Handle(HYDROData_IAltitudeObject) aRefAltitude = GetAltitudeObject(); + setPythonReferenceObject( theTreatedObjects, aResList, aRefAltitude, "SetAltitudeObject" ); Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline(); setPythonReferenceObject( theTreatedObjects, aResList, aRefPolyline, "SetPolyline" ); @@ -88,9 +94,28 @@ HYDROData_SequenceOfObjects HYDROData_ImmersibleZone::GetAllReferenceObjects() c TopoDS_Shape HYDROData_ImmersibleZone::GetTopShape() const { - TopoDS_Shape aResShape = TopoDS_Face(); + return getTopShape(); +} + +void HYDROData_ImmersibleZone::Update() +{ + HYDROData_NaturalObject::Update(); + + TopoDS_Shape aResShape = generateTopShape(); + SetTopShape( aResShape ); + + createGroupObjects(); +} + +TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const +{ + return generateTopShape( GetPolyline() ); +} + +TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape( const Handle(HYDROData_PolylineXY)& aPolyline ) +{ + TopoDS_Face aResultFace = TopoDS_Face(); - Handle(HYDROData_PolylineXY) aPolyline = GetPolyline(); if( !aPolyline.IsNull() ) { TopoDS_Shape aPolylineShape = aPolyline->GetShape(); @@ -107,65 +132,115 @@ TopoDS_Shape HYDROData_ImmersibleZone::GetTopShape() const } } } 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 aResShape; - 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 aResShape; - 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()) { - TopoDS_Compound aResult; - BRep_Builder aBB; - aBB.MakeCompound(aResult); - for (; aFR.More(); aFR.Next()) { - const TopoDS_Face& aFF = aFR.Current(); - aBB.Add(aResult,aFF); - } - BRepCheck_Analyzer aChecker(aResult); - if(aChecker.IsValid()) - aResShape = aResult; -#ifdef HYDRODATA_IMZONE_DEB - else { - aResShape = aResult; - } -#endif - } - } + 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(); +} + +void HYDROData_ImmersibleZone::createGroupObjects() +{ + 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 } - return aResShape; + + 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 ); + } } TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const { - // TODO return getTopShape(); } QColor HYDROData_ImmersibleZone::DefaultFillingColor() { - return QColor( Qt::green ); + return QColor( Qt::darkBlue ); } QColor HYDROData_ImmersibleZone::DefaultBorderColor() @@ -173,9 +248,20 @@ QColor HYDROData_ImmersibleZone::DefaultBorderColor() return QColor( Qt::transparent ); } +QColor HYDROData_ImmersibleZone::getDefaultFillingColor() const +{ + return DefaultFillingColor(); +} + +QColor HYDROData_ImmersibleZone::getDefaultBorderColor() const +{ + return DefaultBorderColor(); +} + void HYDROData_ImmersibleZone::SetPolyline( const Handle(HYDROData_PolylineXY)& thePolyline ) { SetReferenceObject( thePolyline, DataTag_Polyline ); + SetToUpdate( true ); } Handle(HYDROData_PolylineXY) HYDROData_ImmersibleZone::GetPolyline() const @@ -187,6 +273,7 @@ Handle(HYDROData_PolylineXY) HYDROData_ImmersibleZone::GetPolyline() const void HYDROData_ImmersibleZone::RemovePolyline() { ClearReferenceObjects( DataTag_Polyline ); + SetToUpdate( true ); }