From b31235b3a4bce11a88ed18e431c850ccd55362c8 Mon Sep 17 00:00:00 2001 From: adv Date: Wed, 18 Dec 2013 06:57:13 +0000 Subject: [PATCH] Groups for immersible zones has been added (Feature #242). --- src/HYDROData/HYDROData_ImmersibleZone.cxx | 152 +++++++++++++++------ src/HYDROData/HYDROData_ImmersibleZone.h | 8 ++ 2 files changed, 116 insertions(+), 44 deletions(-) diff --git a/src/HYDROData/HYDROData_ImmersibleZone.cxx b/src/HYDROData/HYDROData_ImmersibleZone.cxx index eb3ae966..29bc3a6d 100644 --- a/src/HYDROData/HYDROData_ImmersibleZone.cxx +++ b/src/HYDROData/HYDROData_ImmersibleZone.cxx @@ -3,7 +3,9 @@ #include "HYDROData_Bathymetry.h" #include "HYDROData_Document.h" +#include "HYDROData_ShapesGroup.h" #include "HYDROData_PolylineXY.h" +#include "HYDROData_Tool.h" #include @@ -13,9 +15,13 @@ #include #include #include + #include #include #include + +#include + #include #include @@ -97,6 +103,8 @@ void HYDROData_ImmersibleZone::Update() TopoDS_Shape aResShape = generateTopShape(); SetTopShape( aResShape ); + + createGroupObjects(); } TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const @@ -120,56 +128,112 @@ TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() 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; + 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; - } + else { + aResShape = aResult; + } #endif - } - } + } + } } return aResShape; } +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 + } + + if ( aZoneShape.IsNull() || aZoneShape.ShapeType() != TopAbs_FACE ) + return; + + TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape ); + + TopoDS_Wire aZoneOuterWire = ShapeAnalysis::OuterWire( aZoneFace ); + + TopTools_SequenceOfShape anInnerEdges; + + 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 anEdges; + HYDROData_Tool::ExploreShapeToShapes( aZoneWire, TopAbs_EDGE, anEdges ); + anInnerEdges.Append( anEdges ); + } + + // Create outer edges group + QString anOutWiresGroupName = GetName() + "_Outer_Wire"; + + Handle(HYDROData_ShapesGroup) anOutWiresGroup = createGroupObject(); + anOutWiresGroup->SetName( anOutWiresGroupName ); + + TopTools_SequenceOfShape anEdges; + HYDROData_Tool::ExploreShapeToShapes( aZoneOuterWire, TopAbs_EDGE, anEdges ); + anOutWiresGroup->SetShapes( anEdges ); + + // Create group for inner edges only if edges is not empty + if ( !anInnerEdges.IsEmpty() ) + { + QString anInWiresGroupName = GetName() + "_Inner_Wires"; + + Handle(HYDROData_ShapesGroup) anInWiresGroup = createGroupObject(); + anInWiresGroup->SetName( anInWiresGroupName ); + + anInWiresGroup->SetShapes( anInnerEdges ); + } +} + TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const { return getTopShape(); diff --git a/src/HYDROData/HYDROData_ImmersibleZone.h b/src/HYDROData/HYDROData_ImmersibleZone.h index e71a5017..6370cf45 100644 --- a/src/HYDROData/HYDROData_ImmersibleZone.h +++ b/src/HYDROData/HYDROData_ImmersibleZone.h @@ -97,8 +97,16 @@ protected: private: + /** + * Generate the zone face. + */ TopoDS_Shape generateTopShape() const; + /** + * Create all necessary child group objects. + */ + HYDRODATA_EXPORT virtual void createGroupObjects(); + protected: friend class HYDROData_Iterator; -- 2.30.2