From bef5b6259214f107ef442f9ee065158c0bd61c71 Mon Sep 17 00:00:00 2001 From: szy Date: Thu, 5 Dec 2013 14:02:52 +0000 Subject: [PATCH] 5.12.2013. Completion of the profiles sorting procedure. --- src/HYDROData/HYDROData_Stream.cxx | 121 +++++++++++++++++++++++------ src/HYDROData/HYDROData_Stream.h | 4 + src/HYDROGUI/HYDROGUI_StreamOp.cxx | 14 ++-- 3 files changed, 107 insertions(+), 32 deletions(-) diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 061fa935..ecdaab9f 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -27,9 +27,26 @@ #include #include #include +#include +#include +#include #include #include +#include +typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; +//typedef HYDROData_DataMapOfRealOfHDProfile::Iterator HYDROData_DataMapIteratorOfDataMapOfRealOfHDProfile; +#include +#include +#include +#include +//#define DEB_HASINT 1 +#ifdef DEB_HASINT +#include +#include +#include +#endif + #define PYTHON_STREAM_ID "KIND_STREAM" IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject) @@ -220,7 +237,7 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf return false; // TODO - return true; // temporary + //return true; // temporary BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction()); if(!aProjector.IsDone()) return false; @@ -270,17 +287,19 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf const TopoDS_Edge& anEdg1 = TopoDS::Edge(anExplo.Current()); if(anEdg1.IsNull()) continue; + Standard_Boolean hasSol(false); aCC.Perform(anEdg1); if(aCC.IsDone()) { + // find minimal dist for(Standard_Integer i=1; i<= aCC.NbExt();i++) if(aCC.SquareDistance(i) < aSqDist) { aSqDist = aCC.SquareDistance(i); anIndx = i; - hasInt = true; + hasSol = true; } } - if(hasInt) { - if(aSqDist <= SquareTolerance) { + if(hasSol) { + if(aSqDist <= SquareTolerance) { // hasInt const gp_Pnt& aPnt = aCC.PointOnE1(anIndx); if(aNum > 1) { TopExp::Vertices(anEdg1, aV1, aV2, Standard_True); @@ -289,33 +308,36 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf Standard_Real aPar = aCC.ParameterOnE1(anIndx); outPar = aPar; } + hasInt = true; break; - } else { + } else { + // no ints-n if(aNum > 1) { TopExp::Vertices(anEdg1, aV1, aV2); outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2)); } } - } + } } - return true; + if(hasInt) + return true; + return false; } bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) { if ( theProfile.IsNull() ) + return false; + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + if ( aHydAxis.IsNull() ) return false; - gp_Ax2 aX2(gp::XOY()); - gp_Ax3 aX3(aX2); - gp_Pln aPln(aX3); - BRepBuilderAPI_MakeFace aMkr(aPln); - if(!aMkr.IsDone()) - return false; - const TopoDS_Face& aPlane = TopoDS::Face(aMkr.Shape()); + TopoDS_Face aPlane; + if(!BuildFace(aHydAxis, aPlane)) + return false; 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 - + insertProfileInToOrder( theProfile ); // Indicate model of the need to update the stream presentation @@ -367,6 +389,23 @@ void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only } +bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis, TopoDS_Face& thePlane) const +{ + if ( theHydAxis.IsNull() ) return false; + TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); + if(aHydraulicWire.IsNull()) return false; + 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; +} void HYDROData_Stream::updateProfilesOrder() { HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); @@ -378,24 +417,56 @@ void HYDROData_Stream::updateProfilesOrder() Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); if ( aHydAxis.IsNull() ) + return; + TopoDS_Face aPlane; + if(!BuildFace(aHydAxis, aPlane)) return; - gp_Ax2 aX2(gp::XOY()); - gp_Ax3 aX3(aX2); - gp_Pln aPln(aX3); - BRepBuilderAPI_MakeFace aMkr(aPln); - if(!aMkr.IsDone()) - return; - const TopoDS_Face& aPlane = TopoDS::Face(aMkr.Shape()); Standard_Real aPar(.0); +#ifdef DEB_HASINT + BRep_Builder aBB; + TopoDS_Compound aCmp; + aBB.MakeCompound(aCmp); +#endif + HYDROData_DataMapOfRealOfHDProfile aDM; + TColStd_ListOfReal aList; HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); - for ( ; anIter.More(); anIter.Next() ) + for (int i = 1 ; anIter.More(); anIter.Next(), i++ ) { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( anIter.Value() ); +#ifdef DEB_HASINT + TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetTopShape() ); + aBB.Add( aCmp, aProfileWire); +#endif if ( aProfile.IsNull() || !HasIntersection( aProfile, aPlane, aPar ) ) continue; - - insertProfileInToOrder( aProfile ); + aDM.Bind(aPar, aProfile); + aList.Append(aPar); + //insertProfileInToOrder( aProfile ); } + // sorting + if(aList.Extent() > 1) { + TColStd_Array1OfReal anArr(1, aList.Extent()); + TColStd_ListIteratorOfListOfReal it(aList); + for (int j=1;it.More();it.Next(), j++) + anArr(j) = it.Value(); + TCollection_CompareOfReal Compar; + SortTools_QuickSortOfReal::Sort( anArr, Compar); + for (int j = 1; j <= anArr.Length(); j++) { + const Standard_Real aKey = anArr(j); + const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey); + insertProfileInToOrder( aProfile ); + } + } else if(aList.Extent() == 1) { + const Standard_Real aKey = aList.Last(); + const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey); + insertProfileInToOrder( aProfile ); + } + +#ifdef DEB_HASINT + TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); + BRepTools::Write(aHydraulicWire, "Path.brep"); + BRepTools::Write(aCmp, "Prof.brep"); +#endif } diff --git a/src/HYDROData/HYDROData_Stream.h b/src/HYDROData/HYDROData_Stream.h index 4c09d9d5..a8a08ff2 100644 --- a/src/HYDROData/HYDROData_Stream.h +++ b/src/HYDROData/HYDROData_Stream.h @@ -88,6 +88,10 @@ public: HYDRODATA_EXPORT virtual bool HasIntersection( const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, Standard_Real& outPar) const; + /** + * Builds a planar face + */ + HYDRODATA_EXPORT virtual bool BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis, TopoDS_Face& thePlane) const; /** * Add new one reference profile object for stream. diff --git a/src/HYDROGUI/HYDROGUI_StreamOp.cxx b/src/HYDROGUI/HYDROGUI_StreamOp.cxx index f23b1c03..78b1f3a9 100755 --- a/src/HYDROGUI/HYDROGUI_StreamOp.cxx +++ b/src/HYDROGUI/HYDROGUI_StreamOp.cxx @@ -245,13 +245,13 @@ void HYDROGUI_StreamOp::onAddProfiles() QStringList anInvalidProfiles, anExistingProfiles, aHasNoIntersectionProfiles; HYDROData_SequenceOfObjects aVerifiedProfiles; - HYDROData_SequenceOfObjects aSelectedProfiles = HYDROGUI_Tool::GetSelectedObjects( module() ); - gp_Ax2 aX2(gp::XOY()); - gp_Ax3 aX3(aX2); - gp_Pln aPln(aX3); - BRepBuilderAPI_MakeFace aMkr(aPln); - if(!aMkr.IsDone()) return; - const TopoDS_Face& aPlane = TopoDS::Face(aMkr.Shape()); + HYDROData_SequenceOfObjects aSelectedProfiles = HYDROGUI_Tool::GetSelectedObjects( module() ); + Handle(HYDROData_PolylineXY) aHydAxis = myEditedObject->GetHydraulicAxis(); + if ( aHydAxis.IsNull() ) + return; + TopoDS_Face aPlane; + if(!myEditedObject->BuildFace(aHydAxis, aPlane)) + return; Standard_Real aPar(.0); for( int i = 1, n = aSelectedProfiles.Length(); i <= n; i++ ) { Handle(HYDROData_Profile) aProfile = -- 2.39.2