X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Stream.cxx;h=3ecb3e779857587c501eccf20aad1fc2705bd0ff;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=518753aa63fd7f0919a95371faa15fdd6025ee30;hpb=a0f46af000e5038df100106897aa04901ad59e49;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 518753aa..3ecb3e77 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -27,6 +27,8 @@ #include "HYDROData_IAltitudeObject.h" #include "HYDROData_IProfilesInterpolator.h" #include "HYDROData_Tool.h" +#include "HYDROData_DTM.h" +#include #include @@ -73,6 +75,10 @@ #include #include +#include +#include +#include +#include #include #include @@ -86,6 +92,8 @@ #include #endif +#include + typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Stream,HYDROData_NaturalObject) @@ -122,6 +130,11 @@ QStringList HYDROData_Stream::DumpToPython( const QString& thePyScriptPath setPythonReferenceObject( thePyScriptPath, theTreatedObjects, aResList, aBottomPolyline, "SetBottomPolyline" ); } + QString aDDZs = QString::number( GetDDZ(), 'f', 3 ); + QString aSSteps = QString::number( GetSpatialStep(), 'f', 3 ); + aResList << QString( "%1.SetDDZ( %2 )" ).arg( aName ).arg( aDDZs ); + aResList << QString( "%1.SetSpatialStep( %2 )" ).arg( aName ).arg( aSSteps ); + aResList << QString( "" ); aResList << QString( "%1.Update()" ).arg( aName ); aResList << QString( "" ); @@ -156,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(); @@ -170,7 +184,11 @@ void HYDROData_Stream::Update() } } - UpdatePrs(); + Handle(HYDROData_DTM) dtm = DTM(); + dtm->Update(); + UpdatePrs( dtm ); + + HYDROData_NaturalObject::Update(); } bool HYDROData_Stream::IsHas2dPrs() const @@ -178,64 +196,58 @@ bool HYDROData_Stream::IsHas2dPrs() const return true; } -bool HYDROData_Stream::CreatePresentations( const Handle(HYDROData_PolylineXY)& theHydAxis, - const HYDROData_SequenceOfObjects& theProfiles, - PrsDefinition& thePrs ) +bool HYDROData_Stream::CreatePresentations( const Handle(HYDROData_DTM)& theDTM, + PrsDefinition& thePrs ) { - if ( theHydAxis.IsNull() || theProfiles.Length() < 2 ) + if ( theDTM.IsNull() ) + return false; + + HYDROData_SequenceOfObjects profiles = theDTM->GetProfiles(); + if( profiles.Length() < 2 ) return false; - Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, theProfiles.Length()); - Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, theProfiles.Length()); - Handle(TopTools_HArray1OfShape) anArrOfProfiles = new TopTools_HArray1OfShape(1, theProfiles.Length()); - Handle(TopTools_HArray1OfShape) anArrOf2DProfiles = new TopTools_HArray1OfShape(1, theProfiles.Length()); + TopoDS_Shape Out3dPres; + TopoDS_Shape Out2dPres; + TopoDS_Shape OutLeftB; + TopoDS_Shape OutRightB; + TopoDS_Shape OutInlet; + TopoDS_Shape OutOutlet; + + 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.myPrs2D = Out2dPres; + thePrs.myPrs3D = Out3dPres; + /*std::vector profiles3d; + profiles3d.reserve(profiles.Length()); // Pre-processing - HYDROData_SequenceOfObjects::Iterator anIter( theProfiles ); + HYDROData_SequenceOfObjects::Iterator anIter( profiles ); for (int i=1 ; anIter.More(); anIter.Next(),i++ ) { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( anIter.Value() ); - if ( aProfile.IsNull() ) - continue; - const TopoDS_Shape& aProf3d = aProfile->GetShape3D(); - gp_XY aPnt1, aPnt2; - if ( !aProfile->GetLeftPoint( aPnt1, false ) || !aProfile->GetRightPoint( aPnt2, false ) ) + if ( aProfile.IsNull() ) continue; - anArrOfProfiles->SetValue(i,aProfile->GetShape3D());//aProfile->GetTopShape(); - anArrOf2DProfiles->SetValue(i,aProfile->GetTopShape()); + const TopoDS_Shape& aProfileShape = aProfile->GetShape3D(); + //TopExp_Explorer exp(aProfileShape, TopAbs_EDGE); + profiles3d.push_back( TopoDS::Wire(aProfileShape) ); + }*/ - gp_Pnt aCurFP, 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); - } - - return CreatePresentations( anArrayOfFPnt, anArrayOfLPnt, anArrOfProfiles, anArrOf2DProfiles, thePrs ); + return true; } -void HYDROData_Stream::UpdatePrs() +void HYDROData_Stream::UpdatePrs( const Handle(HYDROData_DTM)& theDTM ) { HYDROData_NaturalObject::Update(); - - Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); - HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); - + PrsDefinition aResultPrs; - if ( !CreatePresentations( aHydAxis, aRefProfiles, aResultPrs ) ) + if ( !CreatePresentations( theDTM, aResultPrs ) ) return; SetShape3D( aResultPrs.myPrs3D ); @@ -280,7 +292,7 @@ QColor HYDROData_Stream::DefaultBorderColor() const bool HYDROData_Stream::IsValidAsAxis( const Handle(HYDROData_PolylineXY)& theHydAxis ) { if ( theHydAxis.IsNull() ) - return false; + return true; TopoDS_Shape aHydraulicShape = theHydAxis->GetShape(); if ( aHydraulicShape.IsNull() || @@ -315,6 +327,34 @@ TopoDS_Shape HYDROData_Stream::GetOutletShape() const return HYDROData_Tool::getFirstShapeFromGroup( aGroups, 4); } +Handle(HYDROData_DTM) HYDROData_Stream::DTM() const +{ + const_cast( this )->checkAndSetAltitudeObject(); + return Handle(HYDROData_DTM)::DownCast( GetAltitudeObject() ); +} + +double HYDROData_Stream::GetDDZ() const +{ + return DTM()->GetDDZ(); +} + +void HYDROData_Stream::SetDDZ( double theDDZ ) +{ + DTM()->SetDDZ( theDDZ ); + Changed( Geom_3d ); +} + +double HYDROData_Stream::GetSpatialStep() const +{ + return DTM()->GetSpatialStep(); +} + +void HYDROData_Stream::SetSpatialStep( double theSpatialStep ) +{ + DTM()->SetSpatialStep( theSpatialStep ); + Changed( Geom_3d ); +} + bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis ) { if ( !IsValidAsAxis( theAxis ) ) @@ -364,23 +404,32 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf return HasIntersection( aHydAxis, theProfile, thePlane, theOutPar ); } +#include + bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theHydAxis, const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, Standard_Real& theOutPar ) { - if ( theProfile.IsNull() || !IsValidAsAxis( theHydAxis ) ) + if ( theProfile.IsNull() /*|| !IsValidAsAxis( theHydAxis )*/ ) return false; + if (theHydAxis.IsNull()) + return true; //empty h_axis; its's OK + TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); //guide line TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); - if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) + if ( aProfileWire.IsNull() ) return false; - BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction()); - if(!aProjector.IsDone()) + //BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction()); + BRepAlgo_NormalProjection nproj(thePlane); + nproj.Add(aProfileWire); + nproj.SetDefaultParams(); + nproj.Build(); + if(!nproj.IsDone()) return false; - TopoDS_Shape aPrjProfile = aProjector.Shape(); + TopoDS_Shape aPrjProfile = nproj.Projection(); if(aPrjProfile.IsNull()) return false; TopoDS_Vertex aV1, aV2; @@ -471,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 ) ) @@ -505,7 +553,10 @@ bool HYDROData_Stream::SetProfiles( const HYDROData_SequenceOfObjects& theProfil continue; if ( !AddProfile( aProfile ) ) + { + DTM()->SetProfiles( HYDROData_SequenceOfObjects() ); return false; + } } } else // Just store the sequence of objects as is @@ -535,6 +586,7 @@ bool HYDROData_Stream::SetProfiles( const HYDROData_SequenceOfObjects& theProfil Changed( Geom_3d ); } + DTM()->SetProfiles( GetProfiles() ); return true; } @@ -594,13 +646,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 ) @@ -609,25 +661,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 = TopoDS::Face(aMkr.Shape()); - return true; + thePlane = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0,0,0),gp_Dir(0,0,1))).Face(); } void HYDROData_Stream::updateProfilesOrder() @@ -644,8 +680,7 @@ void HYDROData_Stream::updateProfilesOrder() return; TopoDS_Face aPlane; - if ( !BuildFace( aHydAxis, aPlane ) ) - return; + BuildRefFace( aPlane ); Standard_Real aPar( .0 ); @@ -711,7 +746,7 @@ void HYDROData_Stream::updateProfilesOrder() ObjectKind HYDROData_Stream::getAltitudeObjectType() const { - return KIND_STREAM_ALTITUDE; + return KIND_DTM; } void HYDROData_Stream::setParametersArray( const QVector& theArray ) @@ -1013,155 +1048,78 @@ void HYDROData_Stream::CopyTo( const Handle(HYDROData_Entity)& theDestination, } } } - -bool HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) theArrayOfFPnt, +void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) theArrayOfFPnt, const Handle(TColgp_HArray1OfPnt) theArrayOfLPnt, const Handle(TopTools_HArray1OfShape) theArrOfProfiles, - const Handle(TopTools_HArray1OfShape) theArrOf2DProfiles, PrsDefinition& thePrs ) { - if ( theArrayOfFPnt.IsNull() || theArrayOfLPnt.IsNull() || theArrOfProfiles.IsNull() ) { - return false; - } - if ( theArrayOfFPnt->Length() != theArrayOfLPnt->Length() ) { - return false; - } - - // Construct of the 3D presentation - Handle(Geom_BSplineCurve) aBSpline = buildInterpolationCurve (theArrayOfFPnt); - if(aBSpline.IsNull()) - return false; - - TopoDS_Edge anEdgLeft, anEdgRight; - - BRepBuilderAPI_MakeEdge aMakeEdge(aBSpline); - if(aMakeEdge.IsDone()) - anEdgLeft = aMakeEdge.Edge(); - - if(anEdgLeft.IsNull()) - return false; - - aBSpline.Nullify(); - aBSpline = buildInterpolationCurve (theArrayOfLPnt); - if(aBSpline.IsNull()) - return false; - - aMakeEdge.Init(aBSpline); - if(aMakeEdge.IsDone()) - anEdgRight = aMakeEdge.Edge(); - - if(anEdgRight.IsNull()) - return false; - - BRep_Builder aBB; - TopoDS_Compound aCmp; - aBB.MakeCompound(aCmp); - for (int i=1 ; i < theArrOfProfiles->Length() +1; i++ ) - aBB.Add(aCmp, theArrOfProfiles->Value(i)); - - aBB.Add(aCmp,anEdgLeft); - aBB.Add(aCmp,anEdgRight); - BRepCheck_Analyzer aCh(aCmp); - if(aCh.IsValid()) - thePrs.myPrs3D = aCmp; -#ifdef DEB_UPDATE - else { - BRepTools::Write(aCmp, "str3d.brep"); - thePrs.myPrs3D = aCmp; + HYDROData_Bathymetry::AltitudePoints left; + for (int i = theArrayOfLPnt->Lower(); i <= theArrayOfLPnt->Upper(); i++) + { + left.push_back(HYDROData_Bathymetry::AltitudePoint(theArrayOfLPnt->Value(i).X(), + theArrayOfLPnt->Value(i).Y(), + theArrayOfLPnt->Value(i).Z())); } -#endif - // Construct the top presentation - int aNbPoints = theArrayOfFPnt->Length(); - Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aNbPoints); - Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aNbPoints); - for( int i=1; i <= aNbPoints; i++ ) { - gp_Pnt aPnt = theArrayOfFPnt->Value(i); - aPnt.SetZ(.0); // make 2d - anArrayOfFPnt->SetValue(i, aPnt); - aPnt = theArrayOfLPnt->Value(i); - aPnt.SetZ(.0); - anArrayOfLPnt->SetValue(i, aPnt); + HYDROData_Bathymetry::AltitudePoints right; + for (int i = theArrayOfFPnt->Lower(); i <= theArrayOfFPnt->Upper(); i++) + { + right.push_back(HYDROData_Bathymetry::AltitudePoint(theArrayOfFPnt->Value(i).X(), + theArrayOfFPnt->Value(i).Y(), + theArrayOfFPnt->Value(i).Z())); } - aBSpline.Nullify(); - aBSpline = buildInterpolationCurve (anArrayOfFPnt); - if(aBSpline.IsNull()) - return false; - - aMakeEdge.Init(aBSpline); - if(aMakeEdge.IsDone()) - anEdgLeft = aMakeEdge.Edge(); - - aBSpline.Nullify(); - aBSpline = buildInterpolationCurve (anArrayOfLPnt); - if(aBSpline.IsNull()) - return false; - - aMakeEdge.Init(aBSpline); - if(aMakeEdge.IsDone()) - anEdgRight = aMakeEdge.Edge(); - if(anEdgRight.IsNull()) - return false; - - BRepBuilderAPI_MakeEdge aMakeEdge2(anArrayOfFPnt->Value(1),anArrayOfLPnt->Value(1)); - TopoDS_Edge aBotEdge, aTopEdge; - if(aMakeEdge2.IsDone()) - aBotEdge = aMakeEdge2.Edge(); - - BRepBuilderAPI_MakeEdge aMakeEdge3(anArrayOfFPnt->Value(anArrayOfFPnt->Length()),anArrayOfLPnt->Value(anArrayOfLPnt->Length())); - if(aMakeEdge3.IsDone()) - aTopEdge = aMakeEdge3.Edge(); + std::vector dummy; + TopTools_IndexedMapOfOrientedShape ll = HYDROData_DTM::Create3DShape(left, right, dummy); - // Make wire for 2D presentation with updating of corresponding edges - BRepBuilderAPI_MakeWire aMakeWire; - - aMakeWire.Add( aBotEdge ); - thePrs.myInlet = aMakeWire.Edge(); - - aMakeWire.Add( anEdgLeft ); - thePrs.myLeftBank = aMakeWire.Edge(); - - aMakeWire.Add( aTopEdge ); - thePrs.myOutlet = aMakeWire.Edge(); - - aMakeWire.Add( anEdgRight ); - thePrs.myRightBank = aMakeWire.Edge(); - - TopoDS_Wire aSectProfileWire; - if(aMakeWire.IsDone()) - aSectProfileWire = aMakeWire.Wire(); - - BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); - TopoDS_Face aFace; - aMakeFace.Build(); - if( aMakeFace.IsDone() ) - aFace = aMakeFace.Face(); + TopoDS_Shape LB, RB, IL, OL; - TopoDS_Shape aPrs2D; - - if ( !theArrOf2DProfiles.IsNull() ) { - aCmp.Nullify(); - aBB.MakeCompound(aCmp); - aBB.Add(aCmp,aFace); - for(int i=1;i <= theArrOf2DProfiles->Length(); i++) - aBB.Add(aCmp, theArrOf2DProfiles->Value(i)); - - aPrs2D = aCmp; - } else { - aPrs2D = aFace; + if (!ll.IsEmpty()) + { + LB = TopoDS::Wire(ll(1)); + RB = TopoDS::Wire(ll(2)); } - aCh.Init(aPrs2D); - if(aCh.IsValid()) - thePrs.myPrs2D = aPrs2D; -#ifdef DEB_UPDATE - else { - BRepTools::Write(aPrs2D, "str2d.brep"); - thePrs.myPrs2D = aPrs2D; + 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, LB); + BB.Add(newCmp, IL); + BB.Add(newCmp, OL); + 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 ); + +#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 - return true; + thePrs.myLeftBank = TopoDS::Wire(LS(1)); + thePrs.myInlet = TopoDS::Wire(LS(2)); + thePrs.myOutlet = TopoDS::Wire(LS(3)); + thePrs.myRightBank = TopoDS::Wire(LS(4)); + }