Salome HOME
copyrights are updated
[modules/hydro.git] / src / HYDROData / HYDROData_PolylineXY.cxx
index 807c8c3fccedbf1dc0aac89b2eb91d21dde63d05..559947e684ce444fb16022fbd976538962c507f5 100755 (executable)
@@ -29,6 +29,7 @@
 #include <BRepBuilderAPI_MakePolygon.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
 #include <BRepOffsetAPI_NormalProjection.hxx>
+#include <BRepAdaptor_Curve.hxx>
 
 #ifndef LIGHT_MODE
 #include <GEOMBase.h>
@@ -40,6 +41,7 @@
 #include <Geom_BSplineCurve.hxx>
 
 #include <GCPnts_AbscissaPoint.hxx>
+#include <GCPnts_QuasiUniformDeflection.hxx>
 
 #include <ImageComposer_MetaTypes.h>
 
@@ -56,6 +58,7 @@
 #include <TColStd_ListIteratorOfListOfReal.hxx>
 
 #include <TColStd_Array1OfReal.hxx>
+#include <TColgp_Array1OfPnt.hxx>
 
 #include <TDataStd_AsciiString.hxx>
 #include <TDataStd_BooleanList.hxx>
@@ -118,7 +121,8 @@ IMPLEMENT_STANDARD_HANDLE(HYDROData_PolylineXY, HYDROData_IPolyline)
 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_PolylineXY, HYDROData_IPolyline)
 
 HYDROData_PolylineXY::HYDROData_PolylineXY()
-: HYDROData_IPolyline()
+: HYDROData_IPolyline(),
+  myIsInCustomFlag( false )
 {
 }
 
@@ -253,7 +257,9 @@ bool convertEdgeToSection( const TopoDS_Edge&
                            NCollection_Sequence<HYDROData_PolylineXY::SectionType>& theSectTypes,
                            NCollection_Sequence<bool>&                              theSectClosures,
                            NCollection_Sequence<HYDROData_PolylineXY::PointsList>&  theSectPoints,
-                           const bool                                               theIsCanBeClosed )
+                           bool                                                     IsCanBeClosed,
+                           bool                                                     IsInterpolationAllowed,
+                           double                                                   theDeflection )
 {
   Standard_Real aFirst = 0.0, aLast = 0.0;
   Handle(Geom_Curve) anEdgeGeomCurve = BRep_Tool::Curve( theEdge, aFirst, aLast );
@@ -266,7 +272,7 @@ bool convertEdgeToSection( const TopoDS_Edge&
   HYDROData_PolylineXY::SectionType aSectionType = HYDROData_PolylineXY::SECTION_POLYLINE;
   HYDROData_PolylineXY::PointsList aPointsList;
 
-  if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_Line) ) )
+  if( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_Line) ) )
   {
     Handle(Geom_Line) aGeomLine = Handle(Geom_Line)::DownCast( anEdgeGeomCurve );
 
@@ -280,28 +286,22 @@ bool convertEdgeToSection( const TopoDS_Edge&
     HYDROData_PolylineXY::Point aSectLastPoint( aLastPoint.X(), aLastPoint.Y() );
     aPointsList.Append( aSectLastPoint );
   }
-  else if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_BSplineCurve) ) )
+  else if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_BSplineCurve) ) || IsInterpolationAllowed )
   {
     aSectionType = HYDROData_PolylineXY::SECTION_SPLINE;
 
-    Handle(Geom_BSplineCurve) aGeomSpline = 
-      Handle(Geom_BSplineCurve)::DownCast( anEdgeGeomCurve );
+    BRepAdaptor_Curve anAdaptorCurve( theEdge );
+    GCPnts_QuasiUniformDeflection aDiscrete( anAdaptorCurve, theDeflection );
 
-    int aNbKnots = aGeomSpline->NbKnots();
+    int aNbPoints = aDiscrete.NbPoints();
 
-    TColStd_Array1OfReal aSplineKnots( 1, aNbKnots );
-    aGeomSpline->Knots( aSplineKnots );
+    // Decrease the number of imported poles because of last one 
+    // pole is the closing point which are the start point
+    if ( anIsEdgeClosed ) aNbPoints--;
 
-    // Decrease the number of imported knots because of last one 
-    // knot is the closing point which are the start point
-    if ( anIsEdgeClosed ) aNbKnots--;
-
-    for ( int i = 1; i <= aNbKnots; ++i )
+    for ( int i = 1; i <= aNbPoints; ++i )
     {
-      const Standard_Real& aKnot = aSplineKnots.Value( i );
-
-      gp_Pnt aPoint;
-      aGeomSpline->D0( aKnot, aPoint );
+      const gp_Pnt& aPoint = aDiscrete.Value( i );
 
       HYDROData_PolylineXY::Point aSectPoint( aPoint.X(), aPoint.Y() );
       aPointsList.Append( aSectPoint );
@@ -324,7 +324,9 @@ bool convertEdgeToSection( const TopoDS_Edge&
   return true;
 }
 
-bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape )
+bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape,
+                                        bool IsInterpolationAllowed,
+                                        double theDeviation )
 {
   if ( theShape.IsNull() )
     return false;
@@ -341,7 +343,8 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape )
   if ( theShape.ShapeType() == TopAbs_EDGE )
   {
     TopoDS_Edge anEdge = TopoDS::Edge( theShape );
-    anIsCanBeImported = convertEdgeToSection( anEdge, aSectNames, aSectTypes, aSectClosures, aSectPoints, true );
+    anIsCanBeImported = convertEdgeToSection( anEdge, aSectNames, aSectTypes,
+      aSectClosures, aSectPoints, true, IsInterpolationAllowed, theDeviation );
   }
   else if ( theShape.ShapeType() == TopAbs_WIRE )
   {
@@ -352,7 +355,8 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape )
     for ( int i = 1, n = anEdges.Length(); i <= n && anIsCanBeImported; ++i )
     {
       TopoDS_Edge aWireEdge = TopoDS::Edge( anEdges.Value( i ) );
-      anIsCanBeImported = convertEdgeToSection( aWireEdge, aSectNames, aSectTypes, aSectClosures, aSectPoints, false );
+      anIsCanBeImported = convertEdgeToSection( aWireEdge, aSectNames, aSectTypes,
+        aSectClosures, aSectPoints, false, IsInterpolationAllowed, theDeviation );
     }
   }
 
@@ -479,7 +483,7 @@ void HYDROData_PolylineXY::Update()
   if ( !IsEditable() )
   {
     // If polyline is not editable we no need to update it wire
-    SetToUpdate( false );
+    ClearChanged();
     return;
   }
 
@@ -705,7 +709,7 @@ void HYDROData_PolylineXY::AddSection( const TCollection_AsciiString& theSectNam
   aTypesList->Append( theSectionType );
   aClosuresList->Append( theIsClosed );
 
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 TCollection_AsciiString HYDROData_PolylineXY::GetSectionName( const int theSectionIndex ) const
@@ -749,8 +753,6 @@ void HYDROData_PolylineXY::SetSectionName( const int                      theSec
   TDataStd_ListIteratorOfListOfExtendedString aNamesIter( anOldNamesList );
   for ( int i = 0; aNamesIter.More(); aNamesIter.Next(), ++i )
     aNamesList->Append( i == theSectionIndex ? aNewSectName : aNamesIter.Value() );
-
-  SetToUpdate( true );
 }
 
 HYDROData_PolylineXY::SectionType HYDROData_PolylineXY::GetSectionType( const int theSectionIndex ) const
@@ -788,7 +790,7 @@ void HYDROData_PolylineXY::SetSectionType( const int         theSectionIndex,
   for ( int i = 0; aTypesIter.More(); aTypesIter.Next(), ++i )
     aTypesList->Append( i == theSectionIndex ? theSectionType : aTypesIter.Value() );
 
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 bool HYDROData_PolylineXY::IsClosedSection( const int theSectionIndex ) const
@@ -826,7 +828,7 @@ void HYDROData_PolylineXY::SetSectionClosed( const int  theSectionIndex,
   for ( int i = 0; aClosuresIter.More(); aClosuresIter.Next(), ++i )
     aClosuresList->Append( i == theSectionIndex ? theIsClosed : (bool)aClosuresIter.Value() );
 
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 void HYDROData_PolylineXY::GetSections( NCollection_Sequence<TCollection_AsciiString>& theSectNames,
@@ -837,6 +839,11 @@ void HYDROData_PolylineXY::GetSections( NCollection_Sequence<TCollection_AsciiSt
   theSectTypes.Clear();
   theSectClosures.Clear();
 
+  if( IsCustom() )
+  {
+    const_cast<HYDROData_PolylineXY*>( this )->Interpolate();
+  }
+
   Handle(TDataStd_ExtStringList) aNamesList;
   Handle(TDataStd_IntegerList) aTypesList;
   Handle(TDataStd_BooleanList) aClosuresList;
@@ -908,14 +915,14 @@ void HYDROData_PolylineXY::RemoveSection( const int theSectionIndex )
     removePointsLists( theSectionIndex );
   }
 
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 void HYDROData_PolylineXY::RemoveSections()
 {
   removeSectionsLists();
   removePointsLists();
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 void HYDROData_PolylineXY::AddPoint( const int    theSectionIndex,
@@ -961,7 +968,7 @@ void HYDROData_PolylineXY::AddPoint( const int    theSectionIndex,
     }
   }
 
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 void HYDROData_PolylineXY::SetPoint( const int    theSectionIndex,
@@ -1012,7 +1019,7 @@ void HYDROData_PolylineXY::SetPoint( const int    theSectionIndex,
     }
   }
 
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 void HYDROData_PolylineXY::SetPoints( const int         theSectionIndex,
@@ -1068,7 +1075,7 @@ void HYDROData_PolylineXY::RemovePoint( const int theSectionIndex,
     }
   }
 
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 HYDROData_PolylineXY::PointsList HYDROData_PolylineXY::GetPoints( const int theSectionIndex, bool IsConvertToGlobal ) const
@@ -1077,7 +1084,7 @@ HYDROData_PolylineXY::PointsList HYDROData_PolylineXY::GetPoints( const int theS
 
   if( IsCustom() )
   {
-    //TODO: make interpolation to fill the list
+    const_cast<HYDROData_PolylineXY*>( this )->Interpolate();
   }
  
   Handle(TDataStd_RealList) aListX, aListY;
@@ -1151,7 +1158,7 @@ void HYDROData_PolylineXY::UpdateLocalCS( double theDx, double theDy )
     }
     SetPoints( i, aPoints );
   }
-  SetToUpdate( true );
+  Changed( Geom_2d );
 }
 
 void HYDROData_PolylineXY::Transform( const QTransform& theTrsf )
@@ -1179,12 +1186,22 @@ void HYDROData_PolylineXY::Transform( const QTransform& theTrsf )
 
 bool HYDROData_PolylineXY::IsCustom() const
 {
+  if( myIsInCustomFlag )
+    return false;
+
   bool isNull = GetShape().IsNull();
   int aNbPoints = 0;
 
-  //TODO: to check if there is no points
-  //for( int i=0, n=NbSections(); i<n; i++ )
-  //  aNbPoints += NbPoints( i );
+  HYDROData_PolylineXY* aThat = const_cast<HYDROData_PolylineXY*>( this );
+  aThat->myIsInCustomFlag = true;
+  for( int i=0, n=NbSections(); i<n; i++ )
+    aNbPoints += NbPoints( i );
+  aThat->myIsInCustomFlag = false;
 
   return !isNull && aNbPoints == 0;
 }
+
+void HYDROData_PolylineXY::Interpolate()
+{
+  ImportShape( GetShape(), true );
+}