From: szy Date: Tue, 10 Dec 2013 13:17:20 +0000 (+0000) Subject: 10.12.2013. Redesign Update method and 2d presentation. X-Git-Tag: BR_hydro_v_0_5~29 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=5e3bdc5a57c68f336943a1890f263e6f6c7afcc9;p=modules%2Fhydro.git 10.12.2013. Redesign Update method and 2d presentation. --- diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index c1ecbdf4..ec2b1cb9 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -37,7 +37,6 @@ #include typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; -//typedef HYDROData_DataMapOfRealOfHDProfile::Iterator HYDROData_DataMapIteratorOfDataMapOfRealOfHDProfile; #include #include #include @@ -47,11 +46,14 @@ typedef NCollection_DataMap HYDROData_ #include #include #include +#include + +//#define DEB_STREAM 1 +#ifdef DEB_STREAM //#define DEB_HASINT 1 -#ifdef DEB_HASINT +//#define DEB_UPDATE 1 #include #include -#include #endif #define PYTHON_STREAM_ID "KIND_STREAM" @@ -113,7 +115,15 @@ TopoDS_Shape HYDROData_Stream::GetShape3D() const { return getShape3D(); } - + Handle(Geom_BSplineCurve) HYDROData_Stream::buildInterpolationCurve(const Handle(TColgp_HArray1OfPnt)& theArrayOfPnt) +{ + Handle(Geom_BSplineCurve) aBSpline; + GeomAPI_Interpolate anInterpolator (theArrayOfPnt, Standard_False, 1.0e-5); + anInterpolator.Perform() ; + if (anInterpolator.IsDone()) + aBSpline = anInterpolator.Curve(); + return aBSpline; +} void HYDROData_Stream::Update() { HYDROData_NaturalObject::Update(); @@ -122,17 +132,15 @@ void HYDROData_Stream::Update() HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); if ( aHydAxis.IsNull() || aRefProfiles.IsEmpty() ) return; - - TopoDS_Shell a2dShell; - BRep_Builder a2dShellBuilder; - a2dShellBuilder.MakeShell( a2dShell ); - + bool anIsFirst = true; gp_Pnt aPrevFirstPoint, aPrevLastPoint; - Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); - Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); + Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); + Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); TopTools_Array1OfShape anArrOfProfiles(1, aRefProfiles.Length()); - // Construct the top presentation + TopTools_Array1OfShape anArrOf2DProfiles(1, aRefProfiles.Length()); + + // Pre-processing HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); for (int i=1 ; anIter.More(); anIter.Next(),i++ ) { @@ -144,7 +152,8 @@ void HYDROData_Stream::Update() gp_XY aPnt1, aPnt2; if ( !aProfile->GetFirstPoint( aPnt1 ) || !aProfile->GetLastPoint( aPnt2 ) ) continue; - anArrOfProfiles.SetValue(i,aProfile->GetShape3D()); + 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; @@ -162,62 +171,28 @@ void HYDROData_Stream::Update() aCurFP = aP1; anArrayOfFPnt->SetValue(i,aCurFP); anArrayOfLPnt->SetValue(i,aCurLP); - if ( anIsFirst ) - { - aPrevFirstPoint = aCurFirstPoint; - aPrevLastPoint = aCurLastPoint; - anIsFirst = false; - continue; - } - - BRepBuilderAPI_MakeEdge aFirstEdge( aPrevFirstPoint, aPrevLastPoint ); - BRepBuilderAPI_MakeEdge aSecondEdge( aPrevLastPoint, aCurLastPoint ); - BRepBuilderAPI_MakeEdge aThirdEdge( aCurLastPoint, aCurFirstPoint ); - BRepBuilderAPI_MakeEdge aFourthEdge( aCurFirstPoint, aPrevFirstPoint ); - - BRepBuilderAPI_MakeWire aMakeWire( aFirstEdge.Edge(), aSecondEdge.Edge(), - aThirdEdge.Edge(), aFourthEdge.Edge() ); - - TopoDS_Wire aSectProfileWire = aMakeWire.Wire(); - - BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); - aMakeFace.Build(); - if( aMakeFace.IsDone() ) - { - a2dShellBuilder.Add( a2dShell, aMakeFace.Face() ); - } - - aPrevFirstPoint = aCurFirstPoint; - aPrevLastPoint = aCurLastPoint; } - SetTopShape( a2dShell ); - // Construct the 3D presentation - Handle(Geom_BSplineCurve) aBSpline; - GeomAPI_Interpolate anInterpolator (anArrayOfFPnt, Standard_False, 1.0e-5); - anInterpolator.Perform() ; - if (anInterpolator.IsDone()) - aBSpline = anInterpolator.Curve(); - else - return; + // Construct of the 3D presentation + Handle(Geom_BSplineCurve) aBSpline = buildInterpolationCurve (anArrayOfFPnt); if(aBSpline.IsNull()) return; TopoDS_Edge anEdgLeft, anEdgRight; BRepBuilderAPI_MakeEdge aMakeEdge(aBSpline); if(aMakeEdge.IsDone()) anEdgLeft = aMakeEdge.Edge(); - GeomAPI_Interpolate anInterpolator2 (anArrayOfLPnt, Standard_False, 1.0e-5); - anInterpolator2.Perform() ; - if (anInterpolator2.IsDone()) - aBSpline = anInterpolator2.Curve(); - else - return; + if(anEdgLeft.IsNull()) + return; + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfLPnt); if(aBSpline.IsNull()) return; aMakeEdge.Init(aBSpline); if(aMakeEdge.IsDone()) anEdgRight = aMakeEdge.Edge(); + if(anEdgRight.IsNull()) + return; BRep_Builder aBB; TopoDS_Compound aCmp; aBB.MakeCompound(aCmp); @@ -226,8 +201,73 @@ void HYDROData_Stream::Update() aBB.Add(aCmp, anArrOfProfiles.Value(i)); aBB.Add(aCmp,anEdgLeft); aBB.Add(aCmp,anEdgRight); - SetShape3D(aCmp); - //BRepTools::Write(aCmp, "str3d.brep"); + BRepCheck_Analyzer aCh(aCmp); + if(aCh.IsValid()) + SetShape3D(aCmp); +#ifdef DEB_UPDATE + else { + BRepTools::Write(aCmp, "str3d.brep"); + 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); + aPnt = anArrayOfLPnt->Value(i); + aPnt.SetZ(.0); + anArrayOfLPnt->SetValue(i, aPnt); + } + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfFPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgLeft = aMakeEdge.Edge(); + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfLPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgRight = aMakeEdge.Edge(); + if(anEdgRight.IsNull()) + return; + 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(); + + BRepBuilderAPI_MakeWire aMakeWire( aBotEdge, anEdgLeft, aTopEdge,anEdgRight); + 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(); + 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()) + SetTopShape(aCmp); +#ifdef DEB_UPDATE + else { + BRepTools::Write(aCmp, "str2d.brep"); + SetTopShape(aCmp); + } +#endif + } bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis ) diff --git a/src/HYDROData/HYDROData_Stream.h b/src/HYDROData/HYDROData_Stream.h index d0f62028..3ebc441a 100644 --- a/src/HYDROData/HYDROData_Stream.h +++ b/src/HYDROData/HYDROData_Stream.h @@ -4,6 +4,7 @@ #include "HYDROData_NaturalObject.h" #include +#include DEFINE_STANDARD_HANDLE(HYDROData_Stream, HYDROData_NaturalObject) class Handle(HYDROData_PolylineXY); @@ -114,8 +115,7 @@ public: * Removes all reference profile objects from stream. */ HYDRODATA_EXPORT virtual void RemoveProfiles(); - - + protected: /** @@ -129,6 +129,11 @@ protected: * If hydraulic axis is not set all profiles will be removed from order. */ void updateProfilesOrder(); + + /** + * Builds b-spline using interpolation algorithm. + */ + Handle(Geom_BSplineCurve) buildInterpolationCurve(const Handle(TColgp_HArray1OfPnt)& theArrayOfPnt); private: diff --git a/src/HYDROGUI/HYDROGUI_Shape.cxx b/src/HYDROGUI/HYDROGUI_Shape.cxx index 7da7d79c..c53f1d0a 100644 --- a/src/HYDROGUI/HYDROGUI_Shape.cxx +++ b/src/HYDROGUI/HYDROGUI_Shape.cxx @@ -332,7 +332,7 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) Handle(HYDROData_Stream) aStream = Handle(HYDROData_Stream)::DownCast( myObject ); - TopoDS_Shell aStreamShape = TopoDS::Shell( aStream->GetTopShape() ); + TopoDS_Shape aStreamShape = aStream->GetTopShape(); setShape( aStreamShape, false, false );