]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
5.12.2013. Completion of the profiles sorting procedure.
authorszy <szy@opencascade.com>
Thu, 5 Dec 2013 14:02:52 +0000 (14:02 +0000)
committerszy <szy@opencascade.com>
Thu, 5 Dec 2013 14:02:52 +0000 (14:02 +0000)
src/HYDROData/HYDROData_Stream.cxx
src/HYDROData/HYDROData_Stream.h
src/HYDROGUI/HYDROGUI_StreamOp.cxx

index 061fa93576bcd5a669ab101be61c92a85c3c9886..ecdaab9f24c285da97bc0a741b545a837b5ca585 100644 (file)
 #include <gp_Pnt.hxx>
 #include <gp_Pln.hxx>
 #include <gp.hxx>
+#include <Bnd_Box.hxx>
+#include <BRepBndLib.hxx>
+#include <TColStd_Array1OfReal.hxx>
 #include <Precision.hxx>
 #include <QStringList>
 
+#include <NCollection_DataMap.hxx>
+typedef NCollection_DataMap<Standard_Real, Handle(HYDROData_Profile)> HYDROData_DataMapOfRealOfHDProfile;
+//typedef HYDROData_DataMapOfRealOfHDProfile::Iterator HYDROData_DataMapIteratorOfDataMapOfRealOfHDProfile;
+#include <TColStd_ListOfReal.hxx>
+#include <TColStd_ListIteratorOfListOfReal.hxx>
+#include <TCollection_CompareOfReal.hxx>
+#include <SortTools_QuickSortOfReal.hxx>
+//#define DEB_HASINT 1
+#ifdef DEB_HASINT
+#include <BRepTools.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <BRep_Builder.hxx>
+#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
 }
 
index 4c09d9d5e6341a1d0a313909eca7108310f5b97e..a8a08ff29b130d304386d66fd8468fe655b2a731 100644 (file)
@@ -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.
index f23b1c03a614b67907772463e8d9081efa6a05c6..78b1f3a9a4d9d8723d88059ad7d7399d588f10c9 100755 (executable)
@@ -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 =