+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 )
+ {
+ removeParametersArray();
+ return;
+ }
+
+ TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray );
+
+ Handle(TDataStd_RealArray) aParamsArray =
+ TDataStd_RealArray::Set( aLabel, theArray.Lower(), theArray.Upper() );
+
+ for ( int i = theArray.Lower(), n = theArray.Upper(); i <= n; ++i )
+ {
+ const Standard_Real& aParam = theArray( i );
+ aParamsArray->SetValue( i, aParam );
+ }
+}
+
+TColStd_Array1OfReal* HYDROData_Stream::getParametersArray() const
+{
+ TColStd_Array1OfReal* anArray = NULL;
+
+ TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false );
+ if ( !aLabel.IsNull() )
+ {
+ Handle(TDataStd_RealArray) aParamsArray;
+ if ( aLabel.FindAttribute( TDataStd_RealArray::GetID(), aParamsArray ) )
+ {
+ anArray = new TColStd_Array1OfReal( aParamsArray->Lower(), aParamsArray->Upper() );
+ for ( int i = aParamsArray->Lower(), n = aParamsArray->Upper(); i <= n; ++i )
+ {
+ const Standard_Real& aParam = aParamsArray->Value( i );
+ anArray->SetValue( i, aParam );
+ }
+ }
+ }
+
+ return anArray;
+}
+
+void HYDROData_Stream::removeParametersArray()
+{
+ TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false );
+ if ( !aLabel.IsNull() )
+ aLabel.ForgetAllAttributes();
+}
+
+int HYDROData_Stream::insertParameter( const Standard_Real& theParam )
+{
+ int aResIndex = -1;
+
+ TColStd_Array1OfReal* anArr = getParametersArray();
+ if ( anArr )
+ {
+ aResIndex = 0;
+
+ TColStd_Array1OfReal aNewArr( anArr->Lower(), anArr->Upper() + 1 );
+
+ bool isInserted = false;
+ for ( int i = anArr->Lower(), j = i, n = anArr->Upper(); i <= n; ++i, ++j )
+ {
+ const Standard_Real& aStoredParam = anArr->Value( i );
+ if ( !isInserted )
+ {
+ if ( theParam > aStoredParam )
+ {
+ aResIndex++;
+ }
+ else
+ {
+ aNewArr( j ) = theParam;
+ isInserted = true;
+ ++j;
+ }
+ }
+
+ aNewArr( j ) = aStoredParam;
+ }
+
+ if ( !isInserted )
+ {
+ aResIndex = -1;
+ aNewArr( aNewArr.Upper() ) = theParam;
+ }
+
+ setParametersArray( aNewArr );
+ delete anArr;
+ }
+ else
+ {
+ TColStd_Array1OfReal aNewArr( 1, 1 );
+ aNewArr.SetValue( 1, theParam );
+ setParametersArray( aNewArr );
+ }
+
+ return aResIndex;
+}
+
+void HYDROData_Stream::removeParameter( const int& theIndex )
+{
+ TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false );
+ if ( aLabel.IsNull() )
+ return;
+
+ Handle(TDataStd_RealArray) aParamsArray;
+ if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), aParamsArray ) )
+ return;
+
+ if ( aParamsArray->Length() == 1 )
+ {
+ removeParametersArray();
+ return;
+ }
+
+ TColStd_Array1OfReal aNewArr( aParamsArray->Lower(), aParamsArray->Upper() - 1 );
+
+ for ( int i = aParamsArray->Lower(), j = i, k = 0, n = aParamsArray->Upper(); i <= n; ++i, ++k )
+ {
+ const Standard_Real& aStoredParam = aParamsArray->Value( i );
+ if ( k == theIndex )
+ continue;
+
+ aNewArr.SetValue( j, aStoredParam );
+ ++j;
+ }
+
+ setParametersArray( aNewArr );
+}