From: adv Date: Thu, 19 Dec 2013 05:31:06 +0000 (+0000) Subject: Create goups for stream. X-Git-Tag: BR_hydro_v_0_6~35 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=022db67c68258a9ae66601956c5244a9314f60f6;p=modules%2Fhydro.git Create goups for stream. --- diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 63e983ec..cb360328 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -4,6 +4,8 @@ #include "HYDROData_Document.h" #include "HYDROData_PolylineXY.h" #include "HYDROData_Profile.h" +#include "HYDROData_ShapesGroup.h" +#include "HYDROData_ShapesTool.h" #include @@ -135,7 +137,7 @@ Handle(Geom_BSplineCurve) HYDROData_Stream::buildInterpolationCurve( GeomAPI_Interpolate anInterpolator (theArrayOfPnt, Standard_False, 1.0e-5); anInterpolator.Perform() ; if (anInterpolator.IsDone()) - aBSpline = anInterpolator.Curve(); + aBSpline = anInterpolator.Curve(); return aBSpline; } @@ -162,52 +164,51 @@ void HYDROData_Stream::Update() Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( anIter.Value() ); if ( aProfile.IsNull() ) - continue; - const TopoDS_Shape& aProf3d = aProfile->GetShape3D(); + continue; + const TopoDS_Shape& aProf3d = aProfile->GetShape3D(); gp_XY aPnt1, aPnt2; if ( !aProfile->GetLeftPoint( aPnt1 ) || !aProfile->GetRightPoint( aPnt2 ) ) continue; - anArrOfProfiles.SetValue(i,aProfile->GetShape3D());//aProfile->GetTopShape(); - anArrOf2DProfiles.SetValue(i,aProfile->GetTopShape()); + anArrOfProfiles.SetValue(i,aProfile->GetShape3D());//aProfile->GetTopShape(); + anArrOf2DProfiles.SetValue(i,aProfile->GetTopShape()); gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 ), aCurFP; gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 ), aCurLP; - TopoDS_Vertex aV1, aV2; - TopExp::Vertices(TopoDS::Wire(aProf3d), aV1, aV2); - gp_Pnt aP1 = BRep_Tool::Pnt(aV1); - if(aP1.X() == aPnt1.X() && aP1.Y() == aPnt1.Y()) - aCurFP = aP1; - else - aCurLP = aP1; - aP1 = BRep_Tool::Pnt(aV2); - if(aP1.X() == aPnt2.X() && aP1.Y() == aPnt2.Y()) - aCurLP = aP1; - else - aCurFP = aP1; - anArrayOfFPnt->SetValue(i,aCurFP); - anArrayOfLPnt->SetValue(i,aCurLP); + TopoDS_Vertex aV1, aV2; + TopExp::Vertices(TopoDS::Wire(aProf3d), aV1, aV2); + gp_Pnt aP1 = BRep_Tool::Pnt(aV1); + if(aP1.X() == aPnt1.X() && aP1.Y() == aPnt1.Y()) + aCurFP = aP1; + else + aCurLP = aP1; + aP1 = BRep_Tool::Pnt(aV2); + if(aP1.X() == aPnt2.X() && aP1.Y() == aPnt2.Y()) + aCurLP = aP1; + else + aCurFP = aP1; + anArrayOfFPnt->SetValue(i,aCurFP); + anArrayOfLPnt->SetValue(i,aCurLP); } - // Construct of the 3D presentation Handle(Geom_BSplineCurve) aBSpline = buildInterpolationCurve (anArrayOfFPnt); if(aBSpline.IsNull()) - return; + return; TopoDS_Edge anEdgLeft, anEdgRight; BRepBuilderAPI_MakeEdge aMakeEdge(aBSpline); if(aMakeEdge.IsDone()) - anEdgLeft = aMakeEdge.Edge(); + anEdgLeft = aMakeEdge.Edge(); if(anEdgLeft.IsNull()) - return; + return; aBSpline.Nullify(); aBSpline = buildInterpolationCurve (anArrayOfLPnt); if(aBSpline.IsNull()) return; aMakeEdge.Init(aBSpline); if(aMakeEdge.IsDone()) - anEdgRight = aMakeEdge.Edge(); + anEdgRight = aMakeEdge.Edge(); if(anEdgRight.IsNull()) - return; + return; BRep_Builder aBB; TopoDS_Compound aCmp; aBB.MakeCompound(aCmp); @@ -222,18 +223,18 @@ void HYDROData_Stream::Update() #ifdef DEB_UPDATE else { BRepTools::Write(aCmp, "str3d.brep"); - SetShape3D(aCmp); + SetShape3D(aCmp); } #endif // Construct the top presentation for(int i=1;i<= anArrayOfLPnt->Length();i++) { - gp_Pnt aPnt = anArrayOfFPnt->Value(i); - aPnt.SetZ(.0); // make 2d - anArrayOfFPnt->SetValue(i, aPnt); + gp_Pnt aPnt = anArrayOfFPnt->Value(i); + aPnt.SetZ(.0); // make 2d + anArrayOfFPnt->SetValue(i, aPnt); aPnt = anArrayOfLPnt->Value(i); - aPnt.SetZ(.0); - anArrayOfLPnt->SetValue(i, aPnt); + aPnt.SetZ(.0); + anArrayOfLPnt->SetValue(i, aPnt); } aBSpline.Nullify(); aBSpline = buildInterpolationCurve (anArrayOfFPnt); @@ -241,48 +242,50 @@ void HYDROData_Stream::Update() return; aMakeEdge.Init(aBSpline); if(aMakeEdge.IsDone()) - anEdgLeft = aMakeEdge.Edge(); + anEdgLeft = aMakeEdge.Edge(); aBSpline.Nullify(); aBSpline = buildInterpolationCurve (anArrayOfLPnt); if(aBSpline.IsNull()) return; aMakeEdge.Init(aBSpline); if(aMakeEdge.IsDone()) - anEdgRight = aMakeEdge.Edge(); + anEdgRight = aMakeEdge.Edge(); if(anEdgRight.IsNull()) - return; + return; BRepBuilderAPI_MakeEdge aMakeEdge2(anArrayOfFPnt->Value(1),anArrayOfLPnt->Value(1)); TopoDS_Edge aBotEdge, aTopEdge; if(aMakeEdge2.IsDone()) - aBotEdge = aMakeEdge2.Edge(); + aBotEdge = aMakeEdge2.Edge(); BRepBuilderAPI_MakeEdge aMakeEdge3(anArrayOfFPnt->Value(anArrayOfFPnt->Length()),anArrayOfLPnt->Value(anArrayOfLPnt->Length())); if(aMakeEdge3.IsDone()) - aTopEdge = aMakeEdge3.Edge(); + aTopEdge = aMakeEdge3.Edge(); BRepBuilderAPI_MakeWire aMakeWire( aBotEdge, anEdgLeft, aTopEdge,anEdgRight); TopoDS_Wire aSectProfileWire; if(aMakeWire.IsDone()) - aSectProfileWire = aMakeWire.Wire(); + aSectProfileWire = aMakeWire.Wire(); BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); TopoDS_Face aFace; aMakeFace.Build(); if( aMakeFace.IsDone() ) - aFace = aMakeFace.Face(); + aFace = aMakeFace.Face(); aCmp.Nullify(); aBB.MakeCompound(aCmp); aBB.Add(aCmp,aFace); for(int i=1;i <= anArrOf2DProfiles.Length(); i++) - aBB.Add(aCmp,anArrOf2DProfiles.Value(i)); - aCh.Init(aCmp); - if(aCh.IsValid()) + aBB.Add(aCmp,anArrOf2DProfiles.Value(i)); + aCh.Init(aCmp); + if(aCh.IsValid()) SetTopShape(aCmp); #ifdef DEB_UPDATE else { BRepTools::Write(aCmp, "str2d.brep"); - SetTopShape(aCmp); + SetTopShape(aCmp); } #endif + // Create the stream groups + createGroupObjects(); } QColor HYDROData_Stream::DefaultFillingColor() @@ -357,7 +360,7 @@ void HYDROData_Stream::RemoveHydraulicAxis() bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theHydAxis, const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, - Standard_Real& outPar) + Standard_Real& outPar) { if ( theProfile.IsNull() || theHydAxis.IsNull() ) return false; @@ -375,22 +378,22 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theH return false; TopoDS_Vertex aV1, aV2; if(aPrjProfile.ShapeType() == TopAbs_EDGE) - TopExp::Vertices(TopoDS::Edge(aPrjProfile), aV1, aV2); + TopExp::Vertices(TopoDS::Edge(aPrjProfile), aV1, aV2); else if(aPrjProfile.ShapeType() == TopAbs_WIRE) - TopExp::Vertices(TopoDS::Wire(aPrjProfile), aV1, aV2); + TopExp::Vertices(TopoDS::Wire(aPrjProfile), aV1, aV2) else if(aPrjProfile.ShapeType() == TopAbs_COMPOUND){ TopExp_Explorer anExp(aPrjProfile, TopAbs_WIRE); - if(anExp.More()) { - TopExp::Vertices(TopoDS::Wire(anExp.Current()), aV1, aV2); - } else { - anExp.Init(aPrjProfile, TopAbs_EDGE); - if(anExp.More()) { - TopExp::Vertices(TopoDS::Edge(anExp.Current()), aV1, aV2); - } - } + if(anExp.More()) { + TopExp::Vertices(TopoDS::Wire(anExp.Current()), aV1, aV2); + } else { + anExp.Init(aPrjProfile, TopAbs_EDGE); + if(anExp.More()) { + TopExp::Vertices(TopoDS::Edge(anExp.Current()), aV1, aV2); + } + } } if(aV1.IsNull() || aV2.IsNull()) - return false; + return false; gp_Pnt aPnt1 = BRep_Tool::Pnt(aV1); gp_Pnt aPnt2 = BRep_Tool::Pnt(aV2); aPnt1.SetZ(0.0); @@ -413,43 +416,43 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theH outPar = 0.0; anExplo.Init(aHydraulicWire, TopAbs_EDGE); for(Standard_Integer j=1;anExplo.More();anExplo.Next(),j++) { - const TopoDS_Edge& anEdg1 = TopoDS::Edge(anExplo.Current()); - if(anEdg1.IsNull()) - continue; - Standard_Boolean hasSol(false); - aCC.Perform(anEdg1); + const TopoDS_Edge& anEdg1 = TopoDS::Edge(anExplo.Current()); + if(anEdg1.IsNull()) + continue; + Standard_Boolean hasSol(false); + aCC.Perform(anEdg1); if(aCC.IsDone()) { - // find minimal dist + // find minimal dist for(Standard_Integer i=1; i<= aCC.NbExt();i++) if(aCC.SquareDistance(i) < aSqDist) { aSqDist = aCC.SquareDistance(i); anIndx = i; - hasSol = true; - } - } - if(hasSol) { - if(aSqDist <= SquareTolerance) { // hasInt + hasSol = true; + } + } + if(hasSol) { + if(aSqDist <= SquareTolerance) { // hasInt const gp_Pnt& aPnt = aCC.PointOnE1(anIndx); if(aNum > 1) { TopExp::Vertices(anEdg1, aV1, aV2, Standard_True); - outPar += BRep_Tool::Pnt(aV1).Distance(aPnt); - } else { + outPar += BRep_Tool::Pnt(aV1).Distance(aPnt); + } else { Standard_Real aPar = aCC.ParameterOnE1(anIndx); - outPar = aPar; - } - hasInt = true; - break; - } else { - // no ints-n + outPar = aPar; + } + hasInt = true; + break; + } else { + // no ints-n if(aNum > 1) { TopExp::Vertices(anEdg1, aV1, aV2); - outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2)); - } - } - } else if(aNum > 1) { - TopExp::Vertices(anEdg1, aV1, aV2); - outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2)); - } + outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2)); + } + } + } else if(aNum > 1) { + TopExp::Vertices(anEdg1, aV1, aV2); + outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2)); + } } if(hasInt) return true; @@ -457,7 +460,7 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theH } bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, - Standard_Real& outPar ) const + Standard_Real& outPar ) const { Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); @@ -620,9 +623,9 @@ void HYDROData_Stream::updateProfilesOrder() #endif if ( aProfile.IsNull() || !HasIntersection( aProfile, aPlane, aPar ) ) continue; - + aDM.Bind( aPar, aProfile ); - aList.Append( aPar ); + aList.Append( aPar ); } if ( aList.IsEmpty() ) @@ -660,6 +663,114 @@ void HYDROData_Stream::updateProfilesOrder() #endif } +void HYDROData_Stream::createGroupObjects() +{ + TopoDS_Shape aStreamShape = GetTopShape(); + if ( aStreamShape.IsNull() ) + return; + + HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); + if ( aRefProfiles.Length() < 2 ) + return; + + Handle(HYDROData_Profile) aFirstProfile = + Handle(HYDROData_Profile)::DownCast( aRefProfiles.First() ); + Handle(HYDROData_Profile) aLastProfile = + Handle(HYDROData_Profile)::DownCast( aRefProfiles.Last() ); + if ( aFirstProfile.IsNull() || aLastProfile.IsNull() ) + return; + + TopoDS_Shape aBotEdgeShape = aFirstProfile->GetTopShape(); + TopoDS_Shape aTopEdgeShape = aLastProfile->GetTopShape(); + if ( aBotEdgeShape.IsNull() || aBotEdgeShape.ShapeType() != TopAbs_WIRE || + aTopEdgeShape.IsNull() || aTopEdgeShape.ShapeType() != TopAbs_WIRE ) + return; + + TopExp_Explorer aBotEdgeShapeExp( aBotEdgeShape, TopAbs_EDGE ); + TopExp_Explorer aTopEdgeShapeExp( aTopEdgeShape, TopAbs_EDGE ); + if ( !aBotEdgeShapeExp.More() || !aTopEdgeShapeExp.More() ) + return; + + TopoDS_Edge aBotEdge = TopoDS::Edge( aBotEdgeShapeExp.Current() ); + TopoDS_Edge aTopEdge = TopoDS::Edge( aTopEdgeShapeExp.Current() ); + + TopoDS_Vertex aBotFirstVert, aBotLastVert, aTopFirstVert, aTopLastVert; + TopExp::Vertices( aBotEdge, aBotFirstVert, aBotLastVert, true ); + TopExp::Vertices( aTopEdge, aTopFirstVert, aTopLastVert, true ); + + TopExp_Explorer aStreamFaceExp( aStreamShape, TopAbs_FACE ); + if ( !aStreamFaceExp.More() ) + return; + + // Get only face because of 2d profile wires is in compound + TopoDS_Face aStreamFace = TopoDS::Face( aStreamFaceExp.Current() ); + + TopTools_SequenceOfShape aStreamWires; + HYDROData_ShapesTool::ExploreShapeToShapes( aStreamFace, TopAbs_EDGE, aStreamWires ); + + bool anIsLeft = false; + bool anIsRight = false; + + TopTools_SequenceOfShape aLeftEdges, aRightEdges; + for ( int i = 1, n = aStreamWires.Length(); i <= n; ++i ) + { + TopoDS_Edge anEdge = TopoDS::Edge( aStreamWires.Value( i ) ); + if ( HYDROData_ShapesTool::IsEdgesEquals( anEdge, aBotEdge ) || + HYDROData_ShapesTool::IsEdgesEquals( anEdge, aTopEdge ) ) + { + anIsLeft = false; + anIsRight = false; + continue; + } + + if ( !anIsLeft && !anIsRight ) + { + TopoDS_Vertex anEdgeFirstVert, anEdgeLastVert; + TopExp::Vertices( anEdge, anEdgeFirstVert, anEdgeLastVert, true ); + + anIsLeft = HYDROData_ShapesTool::IsVerticesEquals( anEdgeFirstVert, aBotFirstVert ) || + HYDROData_ShapesTool::IsVerticesEquals( anEdgeLastVert, aTopFirstVert ); + + anIsRight = HYDROData_ShapesTool::IsVerticesEquals( anEdgeFirstVert, aTopLastVert ) || + HYDROData_ShapesTool::IsVerticesEquals( anEdgeLastVert, aBotLastVert ); + } + + if ( anIsLeft ) + { + aLeftEdges.Append( anEdge ); + } + else if ( anIsRight ) + { + aRightEdges.Append( anEdge ); + } + } + + // Create edges groups + QString aLeftGroupName = GetName() + "_Left_Bank"; + + Handle(HYDROData_ShapesGroup) aLeftGroup = createGroupObject(); + aLeftGroup->SetName( aLeftGroupName ); + aLeftGroup->SetShapes( aLeftEdges ); + + QString aRightGroupName = GetName() + "_Right_Bank"; + + Handle(HYDROData_ShapesGroup) aRightGroup = createGroupObject(); + aRightGroup->SetName( aRightGroupName ); + aRightGroup->SetShapes( aRightEdges ); + + QString anInGroupName = GetName() + "_Inlet"; + + Handle(HYDROData_ShapesGroup) anInGroup = createGroupObject(); + anInGroup->SetName( anInGroupName ); + anInGroup->AddShape( aBotEdge ); + + QString anOutGroupName = GetName() + "_Outlet"; + + Handle(HYDROData_ShapesGroup) anOutGroup = createGroupObject(); + anOutGroup->SetName( anOutGroupName ); + anOutGroup->AddShape( aTopEdge ); +} + void HYDROData_Stream::setParametersArray( const TColStd_Array1OfReal& theArray ) { if ( theArray.Length() == 0 ) diff --git a/src/HYDROData/HYDROData_Stream.h b/src/HYDROData/HYDROData_Stream.h index 149c2a6f..461b3b4f 100644 --- a/src/HYDROData/HYDROData_Stream.h +++ b/src/HYDROData/HYDROData_Stream.h @@ -148,6 +148,11 @@ protected: */ void updateProfilesOrder(); + /** + * Create all necessary child group objects. + */ + HYDRODATA_EXPORT virtual void createGroupObjects(); + /** * Builds b-spline using interpolation algorithm. */