X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Stream.cxx;h=91718cb223d29f341008d5dbf1e439b07c2f80ba;hb=6bcda532ec67940d5c53e70df3b7912a09208c1c;hp=6fbe09f427b49dfd6f0b40f0ff61d6affdb08254;hpb=6a589c2fc1327d7e302d4a8411ed1f50cd64a7d8;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 6fbe09f4..91718cb2 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -77,11 +76,13 @@ #include #include - -#include +#include +#include +#include #include #include +#include //#define DEB_STREAM 1 #ifdef DEB_STREAM @@ -91,9 +92,10 @@ #include #endif +#include + typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; -IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Stream,HYDROData_NaturalObject) @@ -167,7 +169,8 @@ Handle(Geom_BSplineCurve) HYDROData_Stream::buildInterpolationCurve( void HYDROData_Stream::Update() { - updateProfilesOrder(); + if (!GetHydraulicAxis().IsNull()) + updateProfilesOrder(); // Update bottom polyline if exists const Handle(HYDROData_Polyline3D) aBottomPolyline = GetBottomPolyline(); @@ -181,9 +184,11 @@ void HYDROData_Stream::Update() } } - Handle_HYDROData_DTM dtm = DTM(); + Handle(HYDROData_DTM) dtm = DTM(); dtm->Update(); UpdatePrs( dtm ); + + HYDROData_NaturalObject::Update(); } bool HYDROData_Stream::IsHas2dPrs() const @@ -191,7 +196,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() ) @@ -210,10 +215,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; @@ -237,7 +242,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(); @@ -322,7 +327,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() ); @@ -336,6 +341,7 @@ double HYDROData_Stream::GetDDZ() const void HYDROData_Stream::SetDDZ( double theDDZ ) { DTM()->SetDDZ( theDDZ ); + Changed( Geom_3d ); } double HYDROData_Stream::GetSpatialStep() const @@ -346,6 +352,7 @@ double HYDROData_Stream::GetSpatialStep() const void HYDROData_Stream::SetSpatialStep( double theSpatialStep ) { DTM()->SetSpatialStep( theSpatialStep ); + Changed( Geom_3d ); } bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis ) @@ -513,13 +520,12 @@ bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) if ( theProfile.IsNull() ) return false; - Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); - if ( aHydAxis.IsNull() ) - return false; + // Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + // if ( aHydAxis.IsNull() ) + // return false; TopoDS_Face aPlane; - if(!BuildFace(aHydAxis, aPlane)) - return false; + BuildRefFace( aPlane ); Standard_Real aPar(.0); if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile, aPlane, aPar ) ) @@ -527,6 +533,8 @@ bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) int aProfileIndex = insertParameter( aPar ); insertProfileInToOrder( theProfile, aProfileIndex ); + + DTM()->SetProfiles( GetProfiles() ); // Indicate model of the need to update the stream presentation Changed( Geom_3d ); @@ -640,13 +648,13 @@ void HYDROData_Stream::RemoveProfiles() void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile, const int theBeforeIndex ) { - Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); - if ( theProfile.IsNull() || aHydAxis.IsNull() ) + //Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + if ( theProfile.IsNull() ) return; - TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); + //TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); - if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) + if ( aProfileWire.IsNull() ) return; if ( theBeforeIndex == -1 ) @@ -655,25 +663,9 @@ void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& InsertReferenceObject( theProfile, DataTag_Profile, theBeforeIndex ); } -bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis, - TopoDS_Face& thePlane ) +void HYDROData_Stream::BuildRefFace( TopoDS_Face& thePlane ) { - //if ( !IsValidAsAxis( theHydAxis ) ) - // return false; - - //TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); - // - //gp_Ax2 aX2(gp::XOY()); - //gp_Ax3 aX3(aX2); - //gp_Pln aPln(aX3); - //Bnd_Box B; - //BRepBndLib::Add(aHydraulicWire,B); - //Standard_Real axmin,aymin,azmin,axmax,aymax,azmax; - //B.Get(axmin,aymin,azmin,axmax,aymax,azmax); - //BRepBuilderAPI_MakeFace aMkr(aPln, axmin-500., axmax+500., aymin-500., aymax+500.); // to be tuned later according max/ Profile deviation - //if(!aMkr.IsDone() || aMkr.Shape().IsNull()) return false; thePlane = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0,0,0),gp_Dir(0,0,1))).Face(); - return true; } void HYDROData_Stream::updateProfilesOrder() @@ -690,8 +682,7 @@ void HYDROData_Stream::updateProfilesOrder() return; TopoDS_Face aPlane; - if ( !BuildFace( aHydAxis, aPlane ) ) - return; + BuildRefFace( aPlane ); Standard_Real aPar( .0 ); @@ -722,20 +713,21 @@ void HYDROData_Stream::updateProfilesOrder() if ( aList.IsEmpty() ) return; - TColStd_Array1OfReal anArr( 1, aList.Extent() ); + QVector 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 ); } @@ -759,9 +751,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; @@ -769,13 +761,13 @@ 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 ); + 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 ); } } @@ -817,7 +809,7 @@ int HYDROData_Stream::insertParameter( const Standard_Real& theParam ) { aResIndex = 0; - TColStd_Array1OfReal aNewArr( anArr->Lower(), anArr->Upper() + 1 ); + QVector aNewArr( anArr->Upper() ); bool isInserted = false; for ( int i = anArr->Lower(), j = i, n = anArr->Upper(); i <= n; ++i, ++j ) @@ -831,19 +823,19 @@ int HYDROData_Stream::insertParameter( const Standard_Real& theParam ) } else { - aNewArr( j ) = theParam; + aNewArr[j-1] = theParam; isInserted = true; ++j; } } - aNewArr( j ) = aStoredParam; + aNewArr[j-1] = aStoredParam; } if ( !isInserted ) { aResIndex = -1; - aNewArr( aNewArr.Upper() ) = theParam; + aNewArr[aNewArr.size()-1] = theParam; } setParametersArray( aNewArr ); @@ -851,8 +843,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 ); } @@ -875,7 +867,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 ) { @@ -883,7 +875,7 @@ void HYDROData_Stream::removeParameter( const int& theIndex ) if ( k == theIndex ) continue; - aNewArr.SetValue( j, aStoredParam ); + aNewArr[j-1] = aStoredParam; ++j; } @@ -1058,7 +1050,6 @@ void HYDROData_Stream::CopyTo( const Handle(HYDROData_Entity)& theDestination, } } } - void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) theArrayOfFPnt, const Handle(TColgp_HArray1OfPnt) theArrayOfLPnt, const Handle(TopTools_HArray1OfShape) theArrOfProfiles, @@ -1084,26 +1075,58 @@ void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) std::vector dummy; TopTools_IndexedMapOfOrientedShape ll = HYDROData_DTM::Create3DShape(left, right, dummy); + TopoDS_Shape LB, RB, IL, OL; + if (!ll.IsEmpty()) { - thePrs.myLeftBank = TopoDS::Wire(ll(1)); - thePrs.myRightBank = 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); + } } - thePrs.myInlet = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Lower())); //TODO check that - thePrs.myOutlet = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Upper())); + IL = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Lower())); //TODO check that + OL = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Upper())); //make new compound so it's shapes will be in known order to build correct projection BRep_Builder BB; TopoDS_Compound newCmp; BB.MakeCompound(newCmp); - BB.Add(newCmp, thePrs.myLeftBank); - BB.Add(newCmp, thePrs.myInlet); - BB.Add(newCmp, thePrs.myOutlet); - BB.Add(newCmp, thePrs.myRightBank); + BB.Add(newCmp, LB); + BB.Add(newCmp, IL); + BB.Add(newCmp, OL); + BB.Add(newCmp, RB); thePrs.myPrs3D = newCmp; - HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D) ); + TopTools_SequenceOfShape LS; + //HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D), &LS, ind ); + + HYDROData_DTM::GetPlanarFaceFromBanks(TopoDS::Edge(LB), TopoDS::Edge(RB), TopoDS::Face(thePrs.myPrs2D), &LS); -} \ No newline at end of file +#ifndef NDEBUG + TopTools_IndexedMapOfShape EE; + TopExp::MapShapes(thePrs.myPrs2D, TopAbs_EDGE, EE); + int noncontNb = 0; + for (int i = 1; i <= 4; i++) + { + TopoDS_Shape W = LS(i); + TopTools_IndexedMapOfShape EW; + TopExp::MapShapes(W, TopAbs_EDGE, EW); + for (int k = 1; k <= EW.Extent(); k++) + noncontNb += !EE.Contains(EW(k)); + } + //noncontNb > 0 => some problem with edge history + assert(noncontNb == 0); +#endif + + thePrs.myLeftBank = LS(1); + thePrs.myInlet = LS(2); + thePrs.myOutlet = LS(3); + thePrs.myRightBank = LS(4); + +}