Salome HOME
Insert single profiles in to the stream order. BR_hydro_v_0_4
authoradv <adv@opencascade.com>
Fri, 6 Dec 2013 12:26:42 +0000 (12:26 +0000)
committeradv <adv@opencascade.com>
Fri, 6 Dec 2013 12:26:42 +0000 (12:26 +0000)
src/HYDROData/HYDROData_Stream.cxx
src/HYDROData/HYDROData_Stream.h

index 7f1bce4a11aec8755d3b0cc4aa1f0597fbe27b52..6a95bd0a69a94f730c791e599f126da3344d1cc4 100644 (file)
@@ -10,6 +10,8 @@
 #include <BRepBuilderAPI_MakeWire.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
 
+#include <TDataStd_RealArray.hxx>
+
 #include <TopoDS.hxx>
 #include <TopoDS_Wire.hxx>
 #include <TopoDS_Shell.hxx>
@@ -236,8 +238,6 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf
   if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
     return false;
 
-  // TODO
-  //return true; // temporary
   BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction());
   if(!aProjector.IsDone())
     return false;
@@ -327,21 +327,26 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf
   return false;
 }
 
+
 bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile )
 {
   if ( theProfile.IsNull() )
-    return false;  
+    return false;
+
   Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
   if ( aHydAxis.IsNull() )
-    return false; 
+    return false;
+
   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 );
+  int aProfileIndex = insertParameter( aPar );
+  insertProfileInToOrder( theProfile, aProfileIndex );
   
   // Indicate model of the need to update the stream presentation
   SetToUpdate( true );
@@ -356,11 +361,35 @@ HYDROData_SequenceOfObjects HYDROData_Stream::GetProfiles() const
 
 bool HYDROData_Stream::RemoveProfile( const Handle(HYDROData_Profile)& theProfile )
 {
-  if ( theProfile.IsNull() || !HasReference( theProfile, DataTag_Profile ) )
+  if ( theProfile.IsNull() )
+    return false;
+
+  int aProfileIndex = -1;
+
+  HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
+  HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
+  for ( int i = 0 ; anIter.More(); anIter.Next(), ++i )
+  {
+    Handle(HYDROData_Profile) aProfile =
+      Handle(HYDROData_Profile)::DownCast( anIter.Value() );
+    if ( aProfile.IsNull() )
+      continue;
+
+    if ( IsEqual( theProfile, aProfile ) )
+    {
+      aProfileIndex = i;
+      break;
+    }
+  }
+
+  if ( aProfileIndex == -1 )
     return false;
 
   RemoveReferenceObject( theProfile->Label(), DataTag_Profile );
 
+  // Remove parameter for removed profile
+  removeParameter( aProfileIndex );
+
   // Indicate model of the need to update the stream presentation
   SetToUpdate( true );
 
@@ -373,11 +402,15 @@ void HYDROData_Stream::RemoveProfiles()
 
   ClearReferenceObjects( DataTag_Profile );
 
+  // Remove the parameters array
+  removeParametersArray();
+
   // Indicate model of the need to update the stream presentation
   SetToUpdate( anIsToUpdate );
 }
 
-void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile )
+void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile,
+                                               const int                        theBeforeIndex )
 {
   Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
   if ( theProfile.IsNull() || aHydAxis.IsNull() )
@@ -388,8 +421,10 @@ void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)&
   if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
     return;
 
-  // TODO
-  AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only
+  if ( theBeforeIndex == -1 )
+    AddReferenceObject( theProfile, DataTag_Profile );
+  else
+    InsertReferenceObject( theProfile, DataTag_Profile, theBeforeIndex );
 }
 
 bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis, TopoDS_Face& thePlane) const
@@ -409,6 +444,7 @@ bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis
   thePlane = TopoDS::Face(aMkr.Shape());
   return true;
 }
+
 void HYDROData_Stream::updateProfilesOrder()
 {
   HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
@@ -421,15 +457,19 @@ void HYDROData_Stream::updateProfilesOrder()
   Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
   if ( aHydAxis.IsNull() )
     return; 
+
   TopoDS_Face aPlane;
-  if(!BuildFace(aHydAxis, aPlane))
+  if ( !BuildFace( aHydAxis, aPlane ) )
     return;
-  Standard_Real aPar(.0);
+
+  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 );
@@ -439,33 +479,43 @@ void HYDROData_Stream::updateProfilesOrder()
       Handle(HYDROData_Profile)::DownCast( anIter.Value() );
 #ifdef DEB_HASINT
   TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetTopShape() );
-  aBB.Add( aCmp, aProfileWire);
+  aBB.Add( aCmp, aProfileWire ); 
 #endif
     if ( aProfile.IsNull() || !HasIntersection( aProfile, aPlane, aPar ) )
       continue;
-       aDM.Bind(aPar, aProfile);
-       aList.Append(aPar);
-    //insertProfileInToOrder( aProfile );
+       
+    aDM.Bind( aPar, aProfile );
+         aList.Append( aPar );
   }
-   // 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) {
+  
+  if ( aList.IsEmpty() )
+    return;
+
+  TColStd_Array1OfReal anArr( 1, aList.Extent() );
+
+  TColStd_ListIteratorOfListOfReal it( aList );
+  for ( int j = 1; it.More(); it.Next(), j++ )
+    anArr( j ) = it.Value();
+
+  // sorting
+  if ( aList.Extent() > 1 )
+  {
+    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 );
   } 
 
+  setParametersArray( anArr );
+
 #ifdef DEB_HASINT
   TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
   BRepTools::Write(aHydraulicWire, "Path.brep");
@@ -473,3 +523,127 @@ void HYDROData_Stream::updateProfilesOrder()
 #endif
 }
 
+void HYDROData_Stream::setParametersArray( const TColStd_Array1OfReal& theArray )
+{
+  if ( theArray.Length() == 0 )
+  {
+    removeParametersArray();
+    return;
+  }
+
+  TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray );
+  
+  Handle(TDataStd_RealArray) aParamsArray = 
+    TDataStd_RealArray::Set( aLabel, theArray.Lower(), theArray.Upper() );
+
+  for ( int i = theArray.Lower(), n = theArray.Upper(); i <= n; ++i )
+  {
+    const Standard_Real& aParam = theArray( i );
+    aParamsArray->SetValue( i, aParam );
+  }
+}
+
+TColStd_Array1OfReal* HYDROData_Stream::getParametersArray() const
+{
+  TColStd_Array1OfReal* anArray = NULL;
+
+  TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false );
+  if ( !aLabel.IsNull() )
+  {
+    Handle(TDataStd_RealArray) aParamsArray;
+    if ( aLabel.FindAttribute( TDataStd_RealArray::GetID(), aParamsArray ) )
+    {
+      anArray = new TColStd_Array1OfReal( aParamsArray->Lower(), aParamsArray->Upper() );
+      for ( int i = aParamsArray->Lower(), n = aParamsArray->Upper(); i <= n; ++i )
+      {
+        const Standard_Real& aParam = aParamsArray->Value( i );
+        anArray->SetValue( i, aParam );
+      }
+    }
+  }
+
+  return anArray;
+}
+
+void HYDROData_Stream::removeParametersArray()
+{
+  TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false );
+  if ( !aLabel.IsNull() )
+    aLabel.ForgetAllAttributes();
+}
+
+int HYDROData_Stream::insertParameter( const Standard_Real& theParam )
+{
+  int aResIndex = -1;
+
+  TColStd_Array1OfReal* anArr = getParametersArray();
+  if ( anArr )
+  {
+    aResIndex = 0;
+
+    TColStd_Array1OfReal aNewArr( anArr->Lower(), anArr->Upper() + 1 );
+
+    bool isInserted = false;
+    for ( int i = anArr->Lower(), j = i, n = anArr->Upper(); i <= n; ++i, ++j )
+    {
+      const Standard_Real& aStoredParam = anArr->Value( i );
+      if ( !isInserted )
+      {
+        if ( theParam > aStoredParam )
+        {
+          aResIndex++;
+        }
+        else
+        {
+          aNewArr( j ) = theParam;
+          isInserted = true;
+          ++j;
+        }
+      }
+
+      aNewArr( j ) = aStoredParam;
+    }
+
+    if ( !isInserted )
+    {
+      aResIndex = -1;
+      aNewArr( aNewArr.Upper() ) = theParam;
+    }
+    
+    setParametersArray( aNewArr );
+    delete anArr;
+  }
+  else
+  {
+    TColStd_Array1OfReal aNewArr( 1, 1 );
+    aNewArr.SetValue( 1, theParam );
+    setParametersArray( aNewArr );
+  }
+
+  return aResIndex;
+}
+
+void HYDROData_Stream::removeParameter( const int& theIndex )
+{
+  TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false );
+  if ( aLabel.IsNull() )
+    return;
+
+  Handle(TDataStd_RealArray) aParamsArray;
+  if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), aParamsArray ) )
+    return;
+
+  TColStd_Array1OfReal aNewArr( aParamsArray->Lower(), aParamsArray->Upper() - 1 );
+
+  for ( int i = aParamsArray->Lower(), j = i, k = 0, n = aParamsArray->Upper(); i <= n; ++i, ++k )
+  {
+    const Standard_Real& aStoredParam = aParamsArray->Value( i );
+    if ( k == theIndex )
+      continue;
+
+    aNewArr.SetValue( j, aStoredParam );
+    ++j;
+  }
+
+  setParametersArray( aNewArr );
+}
index a8a08ff29b130d304386d66fd8468fe655b2a731..d0f6202894ccdaaed6bc2eab19bd4ad190603b58 100644 (file)
@@ -8,6 +8,7 @@ DEFINE_STANDARD_HANDLE(HYDROData_Stream, HYDROData_NaturalObject)
 
 class Handle(HYDROData_PolylineXY);
 class Handle(HYDROData_Profile);
+class TColStd_Array1OfReal;
 
 /**\class HYDROData_Stream
  * \brief 
@@ -24,6 +25,7 @@ protected:
     DataTag_First = HYDROData_NaturalObject::DataTag_First + 100, ///< first tag, to reserve
     DataTag_HydraulicAxis,     ///< reference hydraulic axis
     DataTag_Profile,           ///< reference profiles
+    DataTag_ParamsArray        ///< parameters array
   };
 
 public:
@@ -119,7 +121,8 @@ protected:
   /**
    * Insert one profile in to the stream profiles order.
    */
-  void insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile );
+  void insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile,
+                               const int                        theBeforeIndex = -1 );
 
   /**
    * Fully recompute the order of all profiles in accordance with reference hydraulic axis.
@@ -127,6 +130,18 @@ protected:
    */
   void updateProfilesOrder();
 
+private:
+  
+  void setParametersArray( const TColStd_Array1OfReal& theArray );
+
+  TColStd_Array1OfReal* getParametersArray() const;
+
+  void removeParametersArray();
+
+  int insertParameter( const Standard_Real& theParam );
+
+  void removeParameter( const int& theIndex );
+
 protected:
 
   friend class HYDROData_Iterator;