Salome HOME
Merge branch 'V9_9_BR'
[modules/geom.git] / src / GEOM_I / GEOM_ICurvesOperations_i.cc
index b5109c9bbe65300e268033e1532908662add8d10..219fec627fb816b8b18f400415e936fb59533a46 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2022  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -30,6 +30,9 @@
 #include "GEOM_Engine.hxx"
 #include "GEOM_Object.hxx"
 
+#include <TColStd_HArray1OfByte.hxx>
+#include <TColStd_HArray1OfReal.hxx>
+
 //=============================================================================
 /*!
  *   constructor:
@@ -73,7 +76,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCirclePntVecR
   //if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn();
 
   //Get the arguments
-  Handle(GEOM_Object) aPnt, aVec;
+  Handle(::GEOM_Object) aPnt, aVec;
   if (!CORBA::is_nil(thePnt)) {
     aPnt = GetObjectImpl(thePnt);
     if (aPnt.IsNull()) return aGEOMObject._retn();
@@ -84,7 +87,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCirclePntVecR
   }
 
   // Make Circle
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakeCirclePntVecR(aPnt, aVec, theR);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -107,14 +110,14 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCircleThreePnt
   GetOperations()->SetNotDone();
 
   //Get the reference points
-  Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
-  Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
-  Handle(GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
+  Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
+  Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
+  Handle(::GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
 
   if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn();
 
   // Make Circle
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
       GetOperations()->MakeCircleThreePnt(aPnt1, aPnt2, aPnt3);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -137,14 +140,14 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCircleCenter2Pnt
   GetOperations()->SetNotDone();
 
   //Get the reference points
-  Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
-  Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
-  Handle(GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
+  Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
+  Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
+  Handle(::GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
 
   if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn();
 
   // Make Circle
-  Handle(GEOM_Object) anObject = GetOperations()->MakeCircleCenter2Pnt(aPnt1, aPnt2, aPnt3);
+  Handle(::GEOM_Object) anObject = GetOperations()->MakeCircleCenter2Pnt(aPnt1, aPnt2, aPnt3);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
 
@@ -170,7 +173,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipse
   //if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn();
 
   //Get the arguments
-  Handle(GEOM_Object) aPnt, aVec, aVecMaj;
+  Handle(::GEOM_Object) aPnt, aVec, aVecMaj;
   if (!CORBA::is_nil(thePnt)) {
     aPnt = GetObjectImpl(thePnt);
     if (aPnt.IsNull()) return aGEOMObject._retn();
@@ -181,7 +184,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipse
   }
 
   // Make Ellipse
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakeEllipse(aPnt, aVec, theRMajor, theRMinor, aVecMaj);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -210,7 +213,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipseVec
   //if (thePnt == NULL || theVec == NULL || theVecMaj == NULL) return aGEOMObject._retn();
 
   //Get the arguments
-  Handle(GEOM_Object) aPnt, aVec, aVecMaj;
+  Handle(::GEOM_Object) aPnt, aVec, aVecMaj;
   if (!CORBA::is_nil(thePnt)) {
     aPnt = GetObjectImpl(thePnt);
     if (aPnt.IsNull()) return aGEOMObject._retn();
@@ -225,7 +228,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipseVec
   }
 
   // Make Ellipse
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakeEllipse(aPnt, aVec, theRMajor, theRMinor, aVecMaj);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -249,14 +252,14 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArc
   GetOperations()->SetNotDone();
 
   //Get the reference points
-  Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
-  Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
-  Handle(GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
+  Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
+  Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
+  Handle(::GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
 
   if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn();
 
   // Make Arc
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakeArc(aPnt1, aPnt2, aPnt3);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -282,14 +285,14 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArcCenter
   GetOperations()->SetNotDone();
 
   //Get the reference points
-  Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
-  Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
-  Handle(GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
+  Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
+  Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
+  Handle(::GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
 
   if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn();
 
   // Make ArcCenter
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
       GetOperations()->MakeArcCenter(aPnt1, aPnt2, aPnt3,theSense);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -313,14 +316,14 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArcOfEllipse
   GetOperations()->SetNotDone();
 
   //Get the reference points
-  Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
-  Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
-  Handle(GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
+  Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
+  Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
+  Handle(::GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
 
   if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn();
 
   // Make Arc
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakeArcOfEllipse(aPnt1, aPnt2, aPnt3);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -345,15 +348,15 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline
   //Get the reference point
   int ind = 0;
   int aLen = thePoints.length();
-  std::list<Handle(GEOM_Object)> aPoints;
+  std::list<Handle(::GEOM_Object)> aPoints;
   for (; ind < aLen; ind++) {
-    Handle(GEOM_Object) aPnt = GetObjectImpl(thePoints[ind]);
+    Handle(::GEOM_Object) aPnt = GetObjectImpl(thePoints[ind]);
     if (aPnt.IsNull()) return aGEOMObject._retn();
     aPoints.push_back(aPnt);
   }
 
   // Make Polyline
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakePolyline(aPoints, theIsClosed);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -378,15 +381,15 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineBezier
   //Get the reference point
   int ind = 0;
   int aLen = thePoints.length();
-  std::list<Handle(GEOM_Object)> aPoints;
+  std::list<Handle(::GEOM_Object)> aPoints;
   for (; ind < aLen; ind++) {
-    Handle(GEOM_Object) aPnt = GetObjectImpl(thePoints[ind]);
+    Handle(::GEOM_Object) aPnt = GetObjectImpl(thePoints[ind]);
     if (aPnt.IsNull()) return aGEOMObject._retn();
     aPoints.push_back(aPnt);
   }
 
   // Make Bezier curve
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
       GetOperations()->MakeSplineBezier(aPoints, theIsClosed);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -412,15 +415,15 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolation
   //Get the reference point
   int ind = 0;
   int aLen = thePoints.length();
-  std::list<Handle(GEOM_Object)> aPoints;
+  std::list<Handle(::GEOM_Object)> aPoints;
   for (; ind < aLen; ind++) {
-    Handle(GEOM_Object) aPnt = GetObjectImpl(thePoints[ind]);
+    Handle(::GEOM_Object) aPnt = GetObjectImpl(thePoints[ind]);
     if (aPnt.IsNull()) return aGEOMObject._retn();
     aPoints.push_back(aPnt);
   }
 
   // Make Polyline
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakeSplineInterpolation(aPoints, theIsClosed, theDoReordering);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -428,19 +431,61 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolation
   return GetObject(anObject);
 }
 
+//=============================================================================
+/*!
+ *  MakeSplineInterpolWithTangents
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolWithTangents
+                                              (const GEOM::ListOfGO& thePoints,
+                                               GEOM::GEOM_Object_ptr theFirstVec,
+                                               GEOM::GEOM_Object_ptr theLastVec)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  //Get the reference points
+  int ind = 0;
+  int aLen = thePoints.length();
+  std::list<Handle(::GEOM_Object)> aPoints;
+  for (; ind < aLen; ind++) {
+    Handle(::GEOM_Object) aPnt = GetObjectImpl(thePoints[ind]);
+    if (aPnt.IsNull()) return aGEOMObject._retn();
+    aPoints.push_back(aPnt);
+  }
+
+  //Get the reference vectors
+  Handle(::GEOM_Object) aVec1 = GetObjectImpl(theFirstVec);
+  Handle(::GEOM_Object) aVec2 = GetObjectImpl(theLastVec);
+
+  if (aVec1.IsNull() || aVec2.IsNull()) return aGEOMObject._retn();
+
+  // Make Polyline
+  Handle(::GEOM_Object) anObject =
+    GetOperations()->MakeSplineInterpolWithTangents(aPoints, aVec1, aVec2);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
 //=============================================================================
 /*!
  *  MakeCurveParametric
  */
 //=============================================================================
-GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char* thexExpr, const char* theyExpr, const char* thezExpr, 
-                                                                   double theParamMin, double theParamMax, double theParamStep, 
-                                                                   GEOM::curve_type theCurveType) {
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric
+             (const char* thexExpr, const char* theyExpr, const char* thezExpr,
+              double theParamMin, double theParamMax, double theParamStep,
+              GEOM::curve_type theCurveType)
+{
   GEOM::GEOM_Object_var aGEOMObject;
   //Set a not done flag
   GetOperations()->SetNotDone();
-  
-  GEOMImpl_ICurvesOperations::CurveType aType;
+
+  GEOMImpl_ICurvesOperations::CurveType aType = GEOMImpl_ICurvesOperations::Polyline; // todo: aType must be explicitly initialized to avoid warning
   switch(theCurveType) {
   case GEOM::Polyline:
     aType = GEOMImpl_ICurvesOperations::Polyline;
@@ -453,18 +498,17 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char*
     break;
   default:
     break;
-  }  
-  
+  }
 
   // Make Polyline
-  Handle(GEOM_Object) anObject =
-    GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr, 
-                                          theParamMin, theParamMax, 
-                                          theParamStep, aType);
-  
+  Handle(::GEOM_Object) anObject =
+    GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr,
+                                         theParamMin, theParamMax,
+                                         theParamStep, aType);
+
   if (!GetOperations()->IsDone() || anObject.IsNull())
-    return aGEOMObject._retn();  
-  
+    return aGEOMObject._retn();
+
   return GetObject(anObject);
 }
 
@@ -473,14 +517,16 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char*
  *  MakeCurveParametricNew
  */
 //=============================================================================
-GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew(const char* thexExpr, const char* theyExpr, const char* thezExpr, 
-                                    double theParamMin, double theParamMax, CORBA::Long theParamNbStep, 
-                                    GEOM::curve_type theCurveType) {
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew
+             (const char* thexExpr, const char* theyExpr, const char* thezExpr,
+              double theParamMin, double theParamMax, CORBA::Long theParamNbStep,
+              GEOM::curve_type theCurveType)
+{
   GEOM::GEOM_Object_var aGEOMObject;
   //Set a not done flag
   GetOperations()->SetNotDone();
-  
-  GEOMImpl_ICurvesOperations::CurveType aType;
+
+  GEOMImpl_ICurvesOperations::CurveType aType = GEOMImpl_ICurvesOperations::Polyline; // todo: aType must be explicitly initialized to avoid warning
   switch(theCurveType) {
   case GEOM::Polyline:
     aType = GEOMImpl_ICurvesOperations::Polyline;
@@ -493,18 +539,43 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew(const cha
     break;
   default:
     break;
-  }  
-  
+  }
 
   // Make Polyline
-  Handle(GEOM_Object) anObject =
-    GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr, 
-                       theParamMin, theParamMax, 
+  Handle(::GEOM_Object) anObject =
+    GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr,
+                       theParamMin, theParamMax,
                        0.0, aType, theParamNbStep, true);
-  
+
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
+//=============================================================================
+/*!
+ *  MakeIsoline
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeIsoline
+                                         (GEOM::GEOM_Object_ptr theFace,
+                                          CORBA::Boolean        IsUIsoline,
+                                          double                theParameter)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  Handle(::GEOM_Object) aFace = GetObjectImpl(theFace);
+
+  // Make isoline
+  Handle(::GEOM_Object) anObject =
+    GetOperations()->MakeIsoline(aFace, IsUIsoline, theParameter);
   if (!GetOperations()->IsDone() || anObject.IsNull())
-    return aGEOMObject._retn();  
-  
+    return aGEOMObject._retn();
+
   return GetObject(anObject);
 }
 
@@ -526,7 +597,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcher
     aWorkingPlane.push_back(theWorkingPlane[ind]);
 
   // Make Sketcher
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->MakeSketcher(theCommand, aWorkingPlane);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return GEOM::GEOM_Object::_nil();
@@ -534,6 +605,46 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcher
   return GetObject(anObject);
 }
 
+//=============================================================================
+/*!
+ *  MakeSketcherOnPlane
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcherOnPlane
+                (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane)
+{
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  Handle(::GEOM_Object) aWorkingPlane = GetObjectImpl(theWorkingPlane);
+
+  // Make Sketcher
+  Handle(::GEOM_Object) anObject =
+      GetOperations()->MakeSketcherOnPlane(theCommand, aWorkingPlane);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return GEOM::GEOM_Object::_nil();
+
+  return GetObject(anObject);
+}
+
+//=============================================================================
+/*!
+ *  Make3DSketcherCommand
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcherCommand (const char* theCommand)
+{
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  // Make 3D Sketcher
+  Handle(::GEOM_Object) anObject = GetOperations()->Make3DSketcherCommand(theCommand);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return GEOM::GEOM_Object::_nil();
+
+  return GetObject(anObject);
+}
+
 //=============================================================================
 /*!
  *  Make3DSketcher
@@ -552,7 +663,7 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher
     aCoords.push_back(theCoordinates[ind]);
 
   // Make Sketcher
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->Make3DSketcher(aCoords);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return GEOM::GEOM_Object::_nil();
@@ -562,22 +673,186 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher
 
 //=============================================================================
 /*!
- *  MakeSketcherOnPlane
+ *  MakePolyline2D
  */
 //=============================================================================
-GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcherOnPlane
-                (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane)
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline2D
+                (const GEOM::ListOfListOfDouble &theCoordsList,
+                 const GEOM::string_array       &theNamesList,
+                 const GEOM::short_array        &theTypesList,
+                 const GEOM::ListOfBool         &theClosedList,
+                 const GEOM::ListOfDouble       &theWorkingPlane)
 {
   //Set a not done flag
   GetOperations()->SetNotDone();
 
-  Handle(GEOM_Object) aWorkingPlane = GetObjectImpl(theWorkingPlane);
+  // Convert input data
+  Handle(TColStd_HArray1OfExtendedString) aNames   =
+    ConvertStringArray(theNamesList);
+  Handle(TColStd_HArray1OfByte)           aTypes   =
+    ConvertEnumArray(theTypesList);
+  Handle(TColStd_HArray1OfByte)           aCloseds =
+    ConvertBoolArray(theClosedList);
+  std::list <std::list <double> >         aCoords;
 
-  // Make Sketcher
-  Handle(GEOM_Object) anObject =
-      GetOperations()->MakeSketcherOnPlane(theCommand, aWorkingPlane);
-  if (!GetOperations()->IsDone() || anObject.IsNull())
+  ConvertListListDouble(theCoordsList, aCoords);
+
+  Handle(TColStd_HArray1OfReal) aWorkingPlane;
+  const int                     n = theWorkingPlane.length();
+  int                           i;
+
+  if (n > 0) {
+    aWorkingPlane = new TColStd_HArray1OfReal(1, n);
+
+    for (i = 0; i < n; i++) {
+      aWorkingPlane->SetValue(i + 1, theWorkingPlane[i]);
+    }
+  }
+
+  // Make Polyline
+  Handle(::GEOM_Object) anObject = GetOperations()->MakePolyline2D
+            (aCoords, aNames, aTypes, aCloseds, aWorkingPlane);
+
+  if (!GetOperations()->IsDone() || anObject.IsNull()) {
+    return GEOM::GEOM_Object::_nil();
+  }
+
+  return GetObject(anObject);
+}
+
+//=============================================================================
+/*!
+ *  MakePolylineOnPlane
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline2DOnPlane
+                (const GEOM::ListOfListOfDouble &theCoordsList,
+                 const GEOM::string_array       &theNamesList,
+                 const GEOM::short_array        &theTypesList,
+                 const GEOM::ListOfBool         &theClosedList,
+                 GEOM::GEOM_Object_ptr           theWorkingPlane)
+{
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  // Convert input data
+  Handle(TColStd_HArray1OfExtendedString) aNames        =
+    ConvertStringArray(theNamesList);
+  Handle(TColStd_HArray1OfByte)           aTypes        =
+    ConvertEnumArray(theTypesList);
+  Handle(TColStd_HArray1OfByte)           aCloseds      =
+    ConvertBoolArray(theClosedList);
+  std::list <std::list <double> >         aCoords;
+  Handle(::GEOM_Object)                     aWorkingPlane =
+    GetObjectImpl(theWorkingPlane);
+
+  ConvertListListDouble(theCoordsList, aCoords);
+
+  // Make Polyline
+  Handle(::GEOM_Object) anObject = GetOperations()->MakePolyline2DOnPlane
+            (aCoords, aNames, aTypes, aCloseds, aWorkingPlane);
+
+  if (!GetOperations()->IsDone() || anObject.IsNull()) {
     return GEOM::GEOM_Object::_nil();
+  }
 
   return GetObject(anObject);
 }
+
+//=============================================================================
+/*!
+ *  ConvertEnumArray
+ */
+//=============================================================================
+Handle(TColStd_HArray1OfByte) GEOM_ICurvesOperations_i::ConvertEnumArray
+                (const GEOM::short_array &theInArray)
+{
+  Handle(TColStd_HArray1OfByte) anOutArray;
+  const int                     n = theInArray.length();
+  int                           i;
+
+  if (n <= 0) {
+    return anOutArray;
+  }
+
+  anOutArray = new TColStd_HArray1OfByte(1, n);
+
+  for (i = 0; i < n; i++) {
+    bool                                  isOK = true;
+    GEOMImpl_ICurvesOperations::CurveType aType;
+
+    switch(theInArray[i]) {
+      case GEOM::Polyline:
+        aType = GEOMImpl_ICurvesOperations::Polyline;
+        break;
+      case GEOM::Bezier:
+        aType = GEOMImpl_ICurvesOperations::Bezier;
+        break;
+      case GEOM::Interpolation:
+        aType = GEOMImpl_ICurvesOperations::Interpolation;
+        break;
+      default:
+        isOK = false;
+        break;
+    }
+
+    if (isOK) {
+      anOutArray->SetValue(i + 1, aType);
+    } else {
+      anOutArray.Nullify();
+      break;
+    }
+  }
+
+  return anOutArray;
+}
+
+//=============================================================================
+/*!
+ *  ConvertBoolArray
+ */
+//=============================================================================
+Handle(TColStd_HArray1OfByte) GEOM_ICurvesOperations_i::ConvertBoolArray
+                (const GEOM::ListOfBool &theInArray)
+{
+  Handle(TColStd_HArray1OfByte) anOutArray;
+  const int                     n = theInArray.length();
+  int                           i;
+
+  if (n <= 0) {
+    return anOutArray;
+  }
+
+  anOutArray = new TColStd_HArray1OfByte(1, n);
+
+  for (i = 0; i < n; i++) {
+    anOutArray->SetValue(i + 1, theInArray[i]);
+  }
+
+  return anOutArray;
+}
+
+//=============================================================================
+/*!
+ *  ConvertListListDouble
+ */
+//=============================================================================
+void GEOM_ICurvesOperations_i::ConvertListListDouble
+            (const GEOM::ListOfListOfDouble        &theInList,
+                   std::list <std::list <double> > &theOutList)
+{
+  const int          n = theInList.length();
+  int                i;
+  std::list <double> anEmptyList;
+
+  for (i = 0; i < n; i++) {
+    theOutList.push_back(anEmptyList);
+
+    const int m = theInList[i].length();
+    int       j;
+
+    for (j = 0; j < m; j++) {
+      theOutList.back().push_back(theInList[i][j]);
+    }
+  }
+}