X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Stream.cxx;h=4b8e639a92708cc482e6eb376fe1e6ee6e29f3ae;hb=41550a623dca7d2de1b388c9832fe3642d2b8753;hp=9ffb8596baf5fefd6cc93515cf0bf13e63b874ea;hpb=2fcf12a721b77f222a9e597c65dc2cafe35db97c;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 9ffb8596..4b8e639a 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -81,10 +80,9 @@ #include #include -#include - #include #include +#include //#define DEB_STREAM 1 #ifdef DEB_STREAM @@ -94,11 +92,13 @@ #include #endif +#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" + #include typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; -IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Stream,HYDROData_NaturalObject) @@ -187,7 +187,7 @@ void HYDROData_Stream::Update() } } - Handle_HYDROData_DTM dtm = DTM(); + Handle(HYDROData_DTM) dtm = DTM(); dtm->Update(); UpdatePrs( dtm ); @@ -199,7 +199,7 @@ bool HYDROData_Stream::IsHas2dPrs() const return true; } -bool HYDROData_Stream::CreatePresentations( const Handle_HYDROData_DTM& theDTM, +bool HYDROData_Stream::CreatePresentations( const Handle(HYDROData_DTM)& theDTM, PrsDefinition& thePrs ) { if ( theDTM.IsNull() ) @@ -218,10 +218,10 @@ bool HYDROData_Stream::CreatePresentations( const Handle_HYDROData_DTM& theDTM, theDTM->GetPresentationShapes(Out3dPres, Out2dPres, OutLeftB, OutRightB, OutInlet, OutOutlet); - thePrs.myInlet = TopoDS::Wire(OutInlet); - thePrs.myOutlet = TopoDS::Wire(OutOutlet); - thePrs.myLeftBank = TopoDS::Wire(OutLeftB); - thePrs.myRightBank = TopoDS::Wire(OutRightB); + thePrs.myInlet = OutInlet; + thePrs.myOutlet = OutOutlet; + thePrs.myLeftBank = OutLeftB; + thePrs.myRightBank = OutRightB; thePrs.myPrs2D = Out2dPres; thePrs.myPrs3D = Out3dPres; /*std::vector profiles3d; @@ -245,7 +245,7 @@ bool HYDROData_Stream::CreatePresentations( const Handle_HYDROData_DTM& theDTM, return true; } -void HYDROData_Stream::UpdatePrs( const Handle_HYDROData_DTM& theDTM ) +void HYDROData_Stream::UpdatePrs( const Handle(HYDROData_DTM)& theDTM ) { HYDROData_NaturalObject::Update(); @@ -330,7 +330,7 @@ TopoDS_Shape HYDROData_Stream::GetOutletShape() const return HYDROData_Tool::getFirstShapeFromGroup( aGroups, 4); } -Handle_HYDROData_DTM HYDROData_Stream::DTM() const +Handle(HYDROData_DTM) HYDROData_Stream::DTM() const { const_cast( this )->checkAndSetAltitudeObject(); return Handle(HYDROData_DTM)::DownCast( GetAltitudeObject() ); @@ -423,7 +423,10 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theH TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); //guide line TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); if ( aProfileWire.IsNull() ) - return false; + { + DEBTRACE("aProfileWire.IsNull"); + return false; + } //BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction()); BRepAlgo_NormalProjection nproj(thePlane); @@ -431,10 +434,16 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theH nproj.SetDefaultParams(); nproj.Build(); if(!nproj.IsDone()) - return false; + { + DEBTRACE("!nproj.IsDone"); + return false; + } TopoDS_Shape aPrjProfile = nproj.Projection(); if(aPrjProfile.IsNull()) - return false; + { + DEBTRACE("aPrjProfile.IsNull"); + return false; + } TopoDS_Vertex aV1, aV2; if(aPrjProfile.ShapeType() == TopAbs_EDGE) TopExp::Vertices(TopoDS::Edge(aPrjProfile), aV1, aV2); @@ -452,14 +461,20 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theH } } if(aV1.IsNull() || aV2.IsNull()) - return false; + { + DEBTRACE("aV1.IsNull() || aV2.IsNull()"); + return false; + } gp_Pnt aPnt1 = BRep_Tool::Pnt(aV1); gp_Pnt aPnt2 = BRep_Tool::Pnt(aV2); aPnt1.SetZ(0.0); aPnt2.SetZ(0.0); BRepBuilderAPI_MakeEdge aMk(aPnt1, aPnt2); if(!aMk.IsDone()) - return false; + { + DEBTRACE("!aMk.IsDone()"); + return false; + } const TopoDS_Edge& anEdg2 = aMk.Edge();//Section edge Standard_Integer aNum(0); @@ -515,6 +530,7 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theH } if(hasInt) return true; + DEBTRACE("!hasInt " << aPnt1.X() << " " << aPnt1.Y() << " " << aPnt2.X() << " " << aPnt2.Y() << " --- " << aSqDist); return false; } @@ -533,9 +549,11 @@ bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) Standard_Real aPar(.0); if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile, aPlane, aPar ) ) return false; // Object is already in reference list or it has no intersection - + //DEBTRACE("AddProfile - insertParameter " << aPar); int aProfileIndex = insertParameter( aPar ); insertProfileInToOrder( theProfile, aProfileIndex ); + + DTM()->SetProfiles( GetProfiles() ); // Indicate model of the need to update the stream presentation Changed( Geom_3d ); @@ -546,6 +564,7 @@ bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) bool HYDROData_Stream::SetProfiles( const HYDROData_SequenceOfObjects& theProfiles, const bool& theIsToOrder ) { + DEBTRACE(" --- SetProfiles " < anArr( aList.Extent() ); TColStd_ListIteratorOfListOfReal it( aList ); for ( int j = 1; it.More(); it.Next(), j++ ) - anArr( j ) = it.Value(); + anArr[j-1] = it.Value(); // sorting if ( aList.Extent() > 1 ) { - TCollection_CompareOfReal Compar; - SortTools_QuickSortOfReal::Sort( anArr, Compar ); + //TCollection_CompareOfReal Compar; + //SortTools_QuickSortOfReal::Sort( anArr, Compar ); + std::sort( anArr.begin(), anArr.end() ); - for (int j = 1; j <= anArr.Length(); j++) { - const Standard_Real aKey = anArr(j); + for (int j = 1; j <= anArr.size(); j++) { + const Standard_Real aKey = anArr[j-1]; const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey); insertProfileInToOrder( aProfile ); } @@ -751,9 +771,9 @@ ObjectKind HYDROData_Stream::getAltitudeObjectType() const return KIND_DTM; } -void HYDROData_Stream::setParametersArray( const TColStd_Array1OfReal& theArray ) +void HYDROData_Stream::setParametersArray( const QVector& theArray ) { - if ( theArray.Length() == 0 ) + if ( theArray.size() == 0 ) { removeParametersArray(); return; @@ -761,13 +781,14 @@ void HYDROData_Stream::setParametersArray( const TColStd_Array1OfReal& theArray TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray ); + int n = theArray.size(); Handle(TDataStd_RealArray) aParamsArray = - TDataStd_RealArray::Set( aLabel, theArray.Lower(), theArray.Upper() ); - - for ( int i = theArray.Lower(), n = theArray.Upper(); i <= n; ++i ) + TDataStd_RealArray::Set( aLabel, 1, n ); + aParamsArray->SetID(TDataStd_RealArray::GetID()); + for ( int i = 0; i < n; ++i ) { - const Standard_Real& aParam = theArray( i ); - aParamsArray->SetValue( i, aParam ); + const Standard_Real& aParam = theArray[i]; + aParamsArray->SetValue( i+1, aParam ); } } @@ -809,8 +830,7 @@ int HYDROData_Stream::insertParameter( const Standard_Real& theParam ) { aResIndex = 0; - TColStd_Array1OfReal aNewArr( anArr->Lower(), anArr->Upper() + 1 ); - + QVector aNewArr( anArr->Upper() +1 ); bool isInserted = false; for ( int i = anArr->Lower(), j = i, n = anArr->Upper(); i <= n; ++i, ++j ) { @@ -823,19 +843,20 @@ int HYDROData_Stream::insertParameter( const Standard_Real& theParam ) } else { - aNewArr( j ) = theParam; + if (j<=n+1) + aNewArr[j-1] = theParam; isInserted = true; ++j; } } - - aNewArr( j ) = aStoredParam; + if (j<=n+1) + aNewArr[j-1] = aStoredParam; } if ( !isInserted ) { aResIndex = -1; - aNewArr( aNewArr.Upper() ) = theParam; + aNewArr[aNewArr.size()-1] = theParam; } setParametersArray( aNewArr ); @@ -843,8 +864,8 @@ int HYDROData_Stream::insertParameter( const Standard_Real& theParam ) } else { - TColStd_Array1OfReal aNewArr( 1, 1 ); - aNewArr.SetValue( 1, theParam ); + QVector aNewArr( 1 ); + aNewArr[0] = theParam; setParametersArray( aNewArr ); } @@ -867,7 +888,7 @@ void HYDROData_Stream::removeParameter( const int& theIndex ) return; } - TColStd_Array1OfReal aNewArr( aParamsArray->Lower(), aParamsArray->Upper() - 1 ); + QVector aNewArr( aParamsArray->Upper() - 2 ); for ( int i = aParamsArray->Lower(), j = i, k = 0, n = aParamsArray->Upper(); i <= n; ++i, ++k ) { @@ -875,7 +896,7 @@ void HYDROData_Stream::removeParameter( const int& theIndex ) if ( k == theIndex ) continue; - aNewArr.SetValue( j, aStoredParam ); + aNewArr[j-1] = aStoredParam; ++j; } @@ -1079,8 +1100,14 @@ void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) if (!ll.IsEmpty()) { - LB = TopoDS::Wire(ll(1)); - RB = TopoDS::Wire(ll(2)); + TopAbs_ShapeEnum ll1_sht = ll(1).ShapeType(); + TopAbs_ShapeEnum ll2_sht = ll(2).ShapeType(); + if ((ll1_sht == TopAbs_WIRE || ll1_sht == TopAbs_EDGE) && + (ll2_sht == TopAbs_WIRE || ll2_sht == TopAbs_EDGE)) + { + LB = ll(1); + RB = ll(2); + } } IL = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Lower())); //TODO check that @@ -1096,12 +1123,11 @@ void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) BB.Add(newCmp, RB); thePrs.myPrs3D = newCmp; - std::set ind; - ind.insert(1); //inlet ind - ind.insert(2); //outlet ind TopTools_SequenceOfShape LS; - HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D), &LS, ind ); + //HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D), &LS, ind ); + + HYDROData_DTM::GetPlanarFaceFromBanks(TopoDS::Edge(LB), TopoDS::Edge(RB), TopoDS::Face(thePrs.myPrs2D), &LS); #ifndef NDEBUG TopTools_IndexedMapOfShape EE; @@ -1119,9 +1145,9 @@ void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) assert(noncontNb == 0); #endif - thePrs.myLeftBank = TopoDS::Wire(LS(1)); - thePrs.myInlet = TopoDS::Wire(LS(2)); - thePrs.myOutlet = TopoDS::Wire(LS(3)); - thePrs.myRightBank = TopoDS::Wire(LS(4)); + thePrs.myLeftBank = LS(1); + thePrs.myInlet = LS(2); + thePrs.myOutlet = LS(3); + thePrs.myRightBank = LS(4); -} \ No newline at end of file +}