0030346: Modeling Algorithms - BRepPrimAPI_MakeRevol throws "BRepSweep_Translation...
[occt.git] / src / BRepTest / BRepTest_CurveCommands.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 7c0aeda..6bd5a54
@@ -1,8 +1,18 @@
-// File:       DBRep_3.cxx
-// Created:    Thu Jul 22 16:38:58 1993
-// Author:     Remi LEQUETTE
-//             <rle@nonox>
-
+// Created on: 1993-07-22
+// Created by: Remi LEQUETTE
+// Copyright (c) 1993-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 #include <BRepTest.hxx>
 #include <GeometryTest.hxx>
@@ -47,6 +57,7 @@
 #include <Draw_Appli.hxx>
 #include <DrawTrSurf.hxx>
 #include <DrawTrSurf_BSplineCurve2d.hxx>
+#include <DrawTrSurf_Point.hxx>
 
 #include <gp.hxx>
 #include <Precision.hxx>
@@ -57,9 +68,8 @@
 #include <TopOpeBRep_Point2d.hxx>
 #include <TopOpeBRepDS_Transition.hxx>
 
-//#ifdef WNT
 #include <stdio.h>
-#ifdef WNT
+#ifdef _WIN32
 Standard_IMPORT Draw_Viewer dout;
 #endif
 
@@ -69,20 +79,27 @@ Standard_IMPORT Draw_Viewer dout;
 
 static Standard_Integer vertex(Draw_Interpretor& , Standard_Integer n, const char** a)
 {
-  if (n < 4) return 1;
+  if (n < 3) return 1;
   if (n >= 5) {
     DBRep::Set(a[1],
-              BRepBuilderAPI_MakeVertex(gp_Pnt(atof(a[2]),atof(a[3]),atof(a[4]))));
-    }
-  else {
+      BRepBuilderAPI_MakeVertex(gp_Pnt(Draw::Atof(a[2]),Draw::Atof(a[3]),Draw::Atof(a[4]))));
+  }
+  else if (n == 4)
+  {
     TopoDS_Shape S = DBRep::Get(a[3]);
     if (S.IsNull()) return 0;
     if (S.ShapeType() != TopAbs_EDGE) return 0;
     BRepAdaptor_Curve C(TopoDS::Edge(S));
     gp_Pnt P;
-    C.D0(atof(a[2]),P);
+    C.D0(Draw::Atof(a[2]),P);
     DBRep::Set(a[1], BRepBuilderAPI_MakeVertex(P));
   }
+  else
+  {
+    Handle(DrawTrSurf_Point) aP =
+      Handle(DrawTrSurf_Point)::DownCast(Draw::Get(a[2]));
+    DBRep::Set(a[1], BRepBuilderAPI_MakeVertex(aP->Point()));
+  }
   return 0;
 }
 
@@ -97,8 +114,8 @@ static Standard_Integer range(Draw_Interpretor& , Standard_Integer n, const char
   TopoDS_Edge E = TopoDS::Edge(aLocalShape);
 //  TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[1],TopAbs_EDGE));
   if (E.IsNull()) return 1;
-  Standard_Real f = atof(a[n-2]);
-  Standard_Real l = atof(a[n-1]);
+  Standard_Real f = Draw::Atof(a[n-2]);
+  Standard_Real l = Draw::Atof(a[n-1]);
   BRep_Builder B;
   if (n == 4)
     B.Range(E,f,l);
@@ -154,7 +171,7 @@ static Standard_Integer trim(Draw_Interpretor& di, Standard_Integer n, const cha
   }
   else {
     //cout <<"Error creating edge"<<endl;
-    di <<"Error creating edge"<<"\n";
+    di <<"Error creating edge\n";
   }
   return 0;
 }
@@ -172,7 +189,7 @@ static Standard_Integer polyline(Draw_Interpretor& , Standard_Integer n, const c
   BRepBuilderAPI_MakePolygon W;
   j = 2;
   for (i = 1; i <= np; i ++) {
-    W.Add(gp_Pnt(atof(a[j]),atof(a[j+1]),atof(a[j+2])));
+    W.Add(gp_Pnt(Draw::Atof(a[j]),Draw::Atof(a[j+1]),Draw::Atof(a[j+2])));
     j += 3;
   }
   DBRep::Set(a[1],W.Wire());
@@ -207,22 +224,56 @@ static Standard_Integer wire(Draw_Interpretor& di, Standard_Integer n, const cha
   if (n < 3) return 1;
   Standard_Integer i;
   BRepBuilderAPI_MakeWire MW;
-  for (i = 2; i < n; i ++) {
-    TopoDS_Shape S = DBRep::Get(a[i]);
-    if (S.IsNull()) continue;
-    if (S.ShapeType() == TopAbs_EDGE)
-      MW.Add(TopoDS::Edge(S));
-    else if (S.ShapeType() == TopAbs_WIRE)
-      MW.Add(TopoDS::Wire(S));
-    else
-      continue;
+  Standard_Boolean IsUnsorted = !strcmp(a[2], "-unsorted");
+
+  if (!IsUnsorted)
+    for (i = 2; i < n; i ++) {
+      TopoDS_Shape S = DBRep::Get(a[i]);
+      if (S.IsNull()) continue;
+      if (S.ShapeType() == TopAbs_EDGE)
+        MW.Add(TopoDS::Edge(S));
+      else if (S.ShapeType() == TopAbs_WIRE)
+        MW.Add(TopoDS::Wire(S));
+      else
+        continue;
+    }
+  else
+  {
+    TopTools_ListOfShape aLE;
+    for (i = 3; i < n; i ++) 
+    {
+      TopoDS_Shape S = DBRep::Get(a[i]);
+      TopExp_Explorer Exp(S, TopAbs_EDGE);
+      for (;Exp.More();Exp.Next())
+      {
+        const TopoDS_Edge& anE = TopoDS::Edge(Exp.Current()); 
+        if (!anE.IsNull())
+          aLE.Append(anE);
+      }
+    }
+    MW.Add(aLE);
   }
+
   if (!MW.IsDone()) {
     //cout << "Wire not done" << endl;
-    di << "Wire not done" << "\n";
-    return 0;
+    di << "Wire not done with an error:\n";
+    switch (MW.Error()) 
+    {
+    case BRepBuilderAPI_EmptyWire:
+      di << "BRepBuilderAPI_EmptyWire\n";
+      break;
+    case BRepBuilderAPI_DisconnectedWire:
+      di << "BRepBuilderAPI_DisconnectedWire\n";
+      break;
+    case BRepBuilderAPI_NonManifoldWire:
+      di << "BRepBuilderAPI_NonManifoldWire\n";
+      break;
+    default:
+      break;
+    }
   }
-  DBRep::Set(a[1],MW);
+  else   
+    DBRep::Set(a[1],MW);
   return 0;
 }
 
@@ -233,15 +284,15 @@ static Standard_Integer wire(Draw_Interpretor& di, Standard_Integer n, const cha
 static Standard_Integer mkedge(Draw_Interpretor& di, Standard_Integer n, const char** a)
 {
   if (n < 3) return 1;
-  
+
   Handle(Geom_Curve)   C   = DrawTrSurf::GetCurve(a[2]);
   Handle(Geom2d_Curve) C2d = DrawTrSurf::GetCurve2d(a[2]);
   if (C.IsNull() && C2d.IsNull()) {
     //cout << a[2] << " is not a curve" << endl;
-    di << a[2] << " is not a curve" << "\n";
+    di << a[2] << " is not a curve\n";
     return 1;
   }
-  
+
   TopoDS_Edge edge;
 
   if (n == 3) {
@@ -260,23 +311,23 @@ static Standard_Integer mkedge(Draw_Interpretor& di, Standard_Integer n, const c
 //    TopoDS_Vertex V1 = TopoDS::Vertex(DBRep::Get(a[3+i],TopAbs_VERTEX));
     if (n == 5+i) {
       if (V1.IsNull()) {
-       if (!C.IsNull())   
-         edge = BRepBuilderAPI_MakeEdge(C,atof(a[3]),atof(a[4]));
-       else if (S.IsNull())              
-         edge = BRepBuilderAPI_MakeEdge2d(C2d,atof(a[3]),atof(a[4]));
-       else
-         edge = BRepBuilderAPI_MakeEdge(C2d,S,atof(a[4]),atof(a[5]));
+        if (!C.IsNull())   
+          edge = BRepBuilderAPI_MakeEdge(C,Draw::Atof(a[3]),Draw::Atof(a[4]));
+        else if (S.IsNull())              
+          edge = BRepBuilderAPI_MakeEdge2d(C2d,Draw::Atof(a[3]),Draw::Atof(a[4]));
+        else
+          edge = BRepBuilderAPI_MakeEdge(C2d,S,Draw::Atof(a[4]),Draw::Atof(a[5]));
       }
       else {
-       aLocalShape = DBRep::Get(a[4+i],TopAbs_VERTEX);
-       TopoDS_Vertex V2 = TopoDS::Vertex(aLocalShape);
-//     TopoDS_Vertex V2 = TopoDS::Vertex(DBRep::Get(a[4+i],TopAbs_VERTEX));
-       if (!C.IsNull())   
-         edge = BRepBuilderAPI_MakeEdge(C,V1,V2);
-       else if (S.IsNull())              
-         edge = BRepBuilderAPI_MakeEdge2d(C2d,V1,V2);
-       else
-         edge = BRepBuilderAPI_MakeEdge(C2d,S,V1,V2);
+        aLocalShape = DBRep::Get(a[4+i],TopAbs_VERTEX);
+        TopoDS_Vertex V2 = TopoDS::Vertex(aLocalShape);
+//  TopoDS_Vertex V2 = TopoDS::Vertex(DBRep::Get(a[4+i],TopAbs_VERTEX));
+        if (!C.IsNull())   
+          edge = BRepBuilderAPI_MakeEdge(C,V1,V2);
+        else if (S.IsNull())              
+          edge = BRepBuilderAPI_MakeEdge2d(C2d,V1,V2);
+        else
+          edge = BRepBuilderAPI_MakeEdge(C2d,S,V1,V2);
       }
     }  
     else if (n == 7+i) {
@@ -284,11 +335,11 @@ static Standard_Integer mkedge(Draw_Interpretor& di, Standard_Integer n, const c
       TopoDS_Vertex V2 = TopoDS::Vertex(aLocalShape);
 //      TopoDS_Vertex V2 = TopoDS::Vertex(DBRep::Get(a[5+i],TopAbs_VERTEX));
       if (!C.IsNull())   
-       edge = BRepBuilderAPI_MakeEdge(C,V1,V2,atof(a[4]),atof(a[6]));
+        edge = BRepBuilderAPI_MakeEdge(C,V1,V2,Draw::Atof(a[4]),Draw::Atof(a[6]));
       else if (S.IsNull())         
-       edge = BRepBuilderAPI_MakeEdge2d(C2d,V1,V2,atof(a[4]),atof(a[6]));
+        edge = BRepBuilderAPI_MakeEdge2d(C2d,V1,V2,Draw::Atof(a[4]),Draw::Atof(a[6]));
       else              
-       edge = BRepBuilderAPI_MakeEdge(C2d,S,V1,V2,atof(a[5]),atof(a[7]));
+        edge = BRepBuilderAPI_MakeEdge(C2d,S,V1,V2,Draw::Atof(a[5]),Draw::Atof(a[7]));
     }
     else
       return 1;
@@ -319,13 +370,13 @@ static Standard_Integer mkcurve(Draw_Interpretor& di, Standard_Integer n, const
   Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(S),L,f,l);
   if (C.IsNull()) {
     //cout << a[2] << " has no 3d curve" << endl;
-    di << a[2] << " has no 3d curve" << "\n";
+    di << a[2] << " has no 3d curve\n";
     return 1;
   }
   C = new Geom_TrimmedCurve(C,f,l);
-  
+
   Draw_Color col,savecol;
-  
+
   if ( DispOrientation) {
     DBRep_WriteColorOrientation ();
     col = DBRep_ColorOrientation(TopoDS::Edge(S).Orientation());
@@ -345,7 +396,7 @@ static Standard_Integer mkcurve(Draw_Interpretor& di, Standard_Integer n, const
 //=======================================================================
 
 static Standard_Integer mkpoint(Draw_Interpretor& , 
-                               Standard_Integer n, const char** a)
+  Standard_Integer n, const char** a)
 {
   if (n < 3) return 1;
 
@@ -353,7 +404,7 @@ static Standard_Integer mkpoint(Draw_Interpretor& ,
   if ( S.IsNull()) return 1;
 
   TopoDS_Vertex V = TopoDS::Vertex(S);
-  
+
   gp_Pnt P = BRep_Tool::Pnt(V);
   DrawTrSurf::Set(a[1],P);
 
@@ -365,33 +416,54 @@ static Standard_Integer mkpoint(Draw_Interpretor& ,
 //=======================================================================
 
 static Standard_Integer mk2dcurve(Draw_Interpretor& di, 
-                                 Standard_Integer na, const char** a)
+  Standard_Integer na, const char** a)
 {
   if (na < 3) return 1;
 
   TopoDS_Shape S;
-  S = DBRep::Get(a[2],TopAbs_EDGE); if (S.IsNull()) return 1;
+  S = DBRep::Get(a[2],TopAbs_EDGE);
+  if (S.IsNull())
+    return 1;
+
   TopoDS_Edge E = TopoDS::Edge(S);
 
   TopLoc_Location L;
-  Standard_Real f,l;
+  Standard_Real f = 0., l = 0.;
   Handle(Geom2d_Curve) C;
   Handle(Geom_Surface) Surf;
-  
+
+  Standard_Boolean hasFace = Standard_False;
+
   if ( na == 3 ) {
     // get the first PCurve connected to edge E
     BRep_Tool::CurveOnSurface(E,C,Surf,L,f,l);
   }
-  else if ( na == 4 ) {
-    S = DBRep::Get(a[3],TopAbs_FACE); if (S.IsNull()) return 1;
-    TopoDS_Face F = TopoDS::Face(S);
-    C = BRep_Tool::CurveOnSurface(E,F,f,l);
+  else if ( na == 4 )
+  {
+    S = DBRep::Get(a[3],TopAbs_FACE);
+    if (S.IsNull())
+    {
+      Standard_Integer ind = Draw::Atoi(a[3]);
+      BRep_Tool::CurveOnSurface(E,C,Surf,L,f,l,ind);
+    }
+    else
+    {
+      hasFace = Standard_True;
+      TopoDS_Face F = TopoDS::Face(S);
+      C = BRep_Tool::CurveOnSurface(E,F,f,l);
+    }
   }
 
   if (C.IsNull()) {
     //cout << a[2] << " has no 2d curve"; if (na == 4) cout << " on " << a[3];
     //cout << endl;
-    di << a[2] << " has no 2d curve"; if (na == 4) di << " on " << a[3];
+    di << a[2] << " has no 2d curve";
+    
+    if (hasFace)
+    {
+      di << " on " << a[3];
+    }
+
     di << "\n";
     return 1;
   }
@@ -412,7 +484,7 @@ static Standard_Integer edge(Draw_Interpretor& , Standard_Integer n, const char*
   TopoDS_Shape V2 = DBRep::Get(a[3],TopAbs_VERTEX);
   if (V1.IsNull() || V2.IsNull()) return 1;
   TopoDS_Edge E = BRepBuilderAPI_MakeEdge(TopoDS::Vertex(V1),
-                                  TopoDS::Vertex(V2));
+    TopoDS::Vertex(V2));
   DBRep::Set(a[1],E);
   return 0;
 }
@@ -426,9 +498,9 @@ static Standard_Integer isoedge(Draw_Interpretor& , Standard_Integer n, const ch
   if (n < 6) return 1;
 
   Standard_Boolean uiso = *a[0] == 'u';
-  Standard_Real p = atof(a[3]);
-  Standard_Real p1 = atof(a[4]);
-  Standard_Real p2 = atof(a[5]);
+  Standard_Real p = Draw::Atof(a[3]);
+  Standard_Real p1 = Draw::Atof(a[4]);
+  Standard_Real p2 = Draw::Atof(a[5]);
   TopoDS_Shape Sh = DBRep::Get(a[2],TopAbs_FACE);
   if (Sh.IsNull()) return 1;
   TopLoc_Location Loc;
@@ -436,14 +508,14 @@ static Standard_Integer isoedge(Draw_Interpretor& , Standard_Integer n, const ch
   Standard_Real UMin,UMax,VMin,VMax;
   BRepTools::UVBounds(TopoDS::Face(Sh),UMin,UMax,VMin,VMax);
   if (uiso) {
-     VMin = Min (VMin , Min (p1,p2));
-     VMax = Max (VMax , Max (p1,p2));
-   }
+    VMin = Min (VMin , Min (p1,p2));
+    VMax = Max (VMax , Max (p1,p2));
+  }
   else{
-     UMin = Min (UMin , Min (p1,p2));
-     UMax = Max (VMax , Max (p1,p2));
-   }
-    
+    UMin = Min (UMin , Min (p1,p2));
+    UMax = Max (VMax , Max (p1,p2));
+  }
+
   Handle(Geom_RectangularTrimmedSurface) TS = new Geom_RectangularTrimmedSurface(S,UMin,UMax,VMin,VMax);
   Handle(Geom_Curve) C;
   Handle(Geom2d_Line) L;
@@ -476,7 +548,7 @@ static Standard_Integer transfert(Draw_Interpretor& , Standard_Integer n, const
   TopoDS_Shape E1 = DBRep::Get(a[1],TopAbs_EDGE);
   TopoDS_Shape E2 = DBRep::Get(a[2],TopAbs_EDGE);
   if (E1.IsNull() || E2.IsNull()) return 1;
-  
+
   BRep_Builder B;
   B.Transfert(TopoDS::Edge(E1),TopoDS::Edge(E2));
   return 0;
@@ -488,8 +560,8 @@ static Standard_Integer transfert(Draw_Interpretor& , Standard_Integer n, const
 //=======================================================================
 
 static Standard_Integer profile(Draw_Interpretor& di,
-                               Standard_Integer n,
-                               const char** a)
+  Standard_Integer n,
+  const char** a)
 {
   // this command build a profile
   // from a moving point
@@ -584,11 +656,11 @@ static Standard_Integer profile(Draw_Interpretor& di,
       i += 2;
       if (i >= n) goto badargs;
       if (!first) {
-       di << "profile: The F instruction must precede all moves";
-       return 1;
+        di << "profile: The F instruction must precede all moves";
+        return 1;
       }
-      x0 = x = atof(a[i-1]);
-      y0 = y = atof(a[i]);
+      x0 = x = Draw::Atof(a[i-1]);
+      y0 = y = Draw::Atof(a[i]);
       stayfirst = Standard_True;
       break;
 
@@ -596,7 +668,7 @@ static Standard_Integer profile(Draw_Interpretor& di,
     case 'o':
       i += 3;
       if (i >= n) goto badargs;
-      P.SetLocation(gp_Pnt(atof(a[i-2]),atof(a[i-1]),atof(a[i])));
+      P.SetLocation(gp_Pnt(Draw::Atof(a[i-2]),Draw::Atof(a[i-1]),Draw::Atof(a[i])));
       stayfirst = Standard_True;
       break;
 
@@ -605,18 +677,18 @@ static Standard_Integer profile(Draw_Interpretor& di,
       i += 6;
       if (i >= n) goto badargs;
       {
-       gp_Vec vn(atof(a[i-5]),atof(a[i-4]),atof(a[i-3]));
-       gp_Vec vx(atof(a[i-2]),atof(a[i-1]),atof(a[i]));
-       if (vn.Magnitude() <= Precision::Confusion()) {
-         di << "profile : null direction";
-         return 1;
-       }
-       if (vx.Magnitude() <= Precision::Confusion()) {
-         di << "profile : null direction";
-         return 1;
-       }
-       gp_Ax2 ax(P.Location(),vn,vx);
-       P.SetPosition(ax);
+        gp_Vec vn(Draw::Atof(a[i-5]),Draw::Atof(a[i-4]),Draw::Atof(a[i-3]));
+        gp_Vec vx(Draw::Atof(a[i-2]),Draw::Atof(a[i-1]),Draw::Atof(a[i]));
+        if (vn.Magnitude() <= Precision::Confusion()) {
+          di << "profile : null direction";
+          return 1;
+        }
+        if (vx.Magnitude() <= Precision::Confusion()) {
+          di << "profile : null direction";
+          return 1;
+        }
+        gp_Ax2 ax(P.Location(),vn,vx);
+        P.SetPosition(ax);
       }
       stayfirst = Standard_True;
       break;
@@ -626,20 +698,20 @@ static Standard_Integer profile(Draw_Interpretor& di,
       i += 1;
       if (i >= n) goto badargs;
       {
-       TopoDS_Shape aLocalShape(DBRep::Get(a[i],TopAbs_FACE));
-       TopoDS_Face Face = TopoDS::Face(aLocalShape);
-//     TopoDS_Face Face = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
-       if (Face.IsNull()) {
-         di << "profile : no face found";
-         return 1;
-       }
-       Surface = BRep_Tool::Surface(Face,TheLocation);
-       Handle(Geom_Plane) Plane = Handle(Geom_Plane)::DownCast(Surface);
-       if ( Plane.IsNull()) {
-         isplanar = Standard_False;
-       }
-       else 
-         P = Plane->Pln();
+        TopoDS_Shape aLocalShape(DBRep::Get(a[i],TopAbs_FACE));
+        TopoDS_Face Face = TopoDS::Face(aLocalShape);
+//  TopoDS_Face Face = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
+        if (Face.IsNull()) {
+          di << "profile : no face found";
+          return 1;
+        }
+        Surface = BRep_Tool::Surface(Face,TheLocation);
+        Handle(Geom_Plane) Plane = Handle(Geom_Plane)::DownCast(Surface);
+        if ( Plane.IsNull()) {
+          isplanar = Standard_False;
+        }
+        else 
+          P = Plane->Pln();
       }
       stayfirst = Standard_True;
       break;
@@ -648,31 +720,31 @@ static Standard_Integer profile(Draw_Interpretor& di,
     case 'x':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       if ((a[i-1][1] == 'X') || (a[i-1][1] == 'x')) {
-       length -= x;
+        length -= x;
       }
       dx = 1; dy = 0;
       move = line;
       break;
-      
+
     case 'Y':
     case 'y':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       if ((a[i-1][1] == 'Y') || (a[i-1][1] == 'y')) {
-       length -= y;
+        length -= y;
       }
       dx = 0; dy = 1;
       move = line;
       break;
-      
+
     case 'L':
     case 'l':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       move = line;
       break;
 
@@ -681,18 +753,18 @@ static Standard_Integer profile(Draw_Interpretor& di,
       i += 2;
       if (i >= n) goto badargs;
       {
-       Standard_Real vx = atof(a[i-1]);
-       Standard_Real vy = atof(a[i]);
-       if ((a[i-2][1] == 'T') || (a[i-2][1] == 't')) {
-         vx -= x;
-         vy -= y;
-       }
-       length = Sqrt(vx*vx+vy*vy);
-       if (length > Precision::Confusion()) {
-         move = line;
-         dx = vx / length;
-         dy = vy / length;
-       }
+        Standard_Real vx = Draw::Atof(a[i-1]);
+        Standard_Real vy = Draw::Atof(a[i]);
+        if ((a[i-2][1] == 'T') || (a[i-2][1] == 't')) {
+          vx -= x;
+          vy -= y;
+        }
+        length = Sqrt(vx*vx+vy*vy);
+        if (length > Precision::Confusion()) {
+          move = line;
+          dx = vx / length;
+          dy = vy / length;
+        }
       }
       break;
 
@@ -700,17 +772,17 @@ static Standard_Integer profile(Draw_Interpretor& di,
     case 'r':
       i++;
       if (i >= n) goto badargs;
-      angle = atof(a[i]) * (M_PI / 180.0);
+      angle = Draw::Atof(a[i]) * (M_PI / 180.0);
       if ((a[i-1][1] == 'R') || (a[i-1][1] == 'r')) {
-       dx = Cos(angle);
-       dy = Sin(angle);
+        dx = Cos(angle);
+        dy = Sin(angle);
       }
       else {
-       Standard_Real c = Cos(angle);
-       Standard_Real s = Sin(angle);
-       Standard_Real t = c * dx - s * dy;
-       dy = s * dx + c * dy;
-       dx = t;
+        Standard_Real c = Cos(angle);
+        Standard_Real s = Sin(angle);
+        Standard_Real t = c * dx - s * dy;
+        dy = s * dx + c * dy;
+        dx = t;
       }
       break;
 
@@ -719,14 +791,14 @@ static Standard_Integer profile(Draw_Interpretor& di,
       i += 2;
       if (i >= n) goto badargs;
       {
-       Standard_Real vx = atof(a[i-1]);
-       Standard_Real vy = atof(a[i]);
-       length = Sqrt(vx*vx+vy*vy);
-       if (length > Precision::Confusion()) {
-         // move = line; DUB
-         dx = vx / length;
-         dy = vy / length;
-       }
+        Standard_Real vx = Draw::Atof(a[i-1]);
+        Standard_Real vy = Draw::Atof(a[i]);
+        length = Sqrt(vx*vx+vy*vy);
+        if (length > Precision::Confusion()) {
+          // move = line; DUB
+          dx = vx / length;
+          dy = vy / length;
+        }
       }
       break;
 
@@ -734,10 +806,10 @@ static Standard_Integer profile(Draw_Interpretor& di,
     case 'c':
       i += 2;
       if (i >= n) goto badargs;
-      radius = atof(a[i-1]);
+      radius = Draw::Atof(a[i-1]);
       if (Abs(radius) > Precision::Confusion()) {
-       angle = atof(a[i]) * (M_PI / 180.0);
-       move = circle;
+        angle = Draw::Atof(a[i]) * (M_PI / 180.0);
+        move = circle;
       }
       break;
 
@@ -745,31 +817,31 @@ static Standard_Integer profile(Draw_Interpretor& di,
     case 'i':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       if ((a[i-1][1] == 'X') || (a[i-1][1] == 'x')) {
-       if (Abs(dx) < Precision::Confusion()) {
-         di << "Profile : cannot intersect, arg " << i-1;
-         return 1;
-       }
-       length = (length - x) / dx;
-       move = line;
+        if (Abs(dx) < Precision::Confusion()) {
+          di << "Profile : cannot intersect, arg " << i-1;
+          return 1;
+        }
+        length = (length - x) / dx;
+        move = line;
       }
       else if ((a[i-1][1] == 'Y') || (a[i-1][1] == 'y')) {
-       if (Abs(dy) < Precision::Confusion()) {
-         di << "Profile : cannot intersect, arg " << i-1;
-         return 1;
-       }
-       length = (length - y) / dy;
-       move = line;
+        if (Abs(dy) < Precision::Confusion()) {
+          di << "Profile : cannot intersect, arg " << i-1;
+          return 1;
+        }
+        length = (length - y) / dy;
+        move = line;
       }
-     
+
       break;
 
     case 'W':
     case 'w':
       face = Standard_False;
       if ((a[i][1] == 'W') || (a[i][1] == 'w')) {
-       close = Standard_False;
+        close = Standard_False;
       }
       i = n-1;
       break;
@@ -779,54 +851,54 @@ static Standard_Integer profile(Draw_Interpretor& di,
       return 1;
     }
 
-  again:
+again:
 
     switch (move) {
-      
+
     case line :
       {
-       if (length < 0) {
-         length = -length;
-         dx = -dx;
-         dy = -dy;
-       }
-       Handle(Geom2d_Line) l = 
-         new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
-       if (isplanar)
-         MW.Add(BRepBuilderAPI_MakeEdge(GeomAPI::To3d(l,P),0,length));
-       else 
-         MW.Add(BRepBuilderAPI_MakeEdge(l,Surface,0,length));
-       x += length*dx;
-       y += length*dy;
+        if (length < 0) {
+          length = -length;
+          dx = -dx;
+          dy = -dy;
+        }
+        Handle(Geom2d_Line) l = 
+          new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
+        if (isplanar)
+          MW.Add(BRepBuilderAPI_MakeEdge(GeomAPI::To3d(l,P),0,length));
+        else 
+          MW.Add(BRepBuilderAPI_MakeEdge(l,Surface,0,length));
+        x += length*dx;
+        y += length*dy;
       }
       break;
 
     case circle :
       {
-       Standard_Boolean sense = Standard_True;
-       if (radius < 0) {
-         radius = -radius;
-         sense = !sense;
-         dx = -dx;
-         dy = -dy;
-       }
-       gp_Ax2d ax(gp_Pnt2d(x-radius*dy,y+radius*dx),gp_Dir2d(dy,-dx));
-       if (angle < 0) {
-         angle = -angle;
-         sense = !sense;
-       }
-       Handle(Geom2d_Circle) c = new Geom2d_Circle(ax,radius,sense);
-       if (isplanar)
-         MW.Add(BRepBuilderAPI_MakeEdge(GeomAPI::To3d(c,P),0,angle));
-       else
-         MW.Add(BRepBuilderAPI_MakeEdge(c,Surface,0,angle));
-       gp_Pnt2d p;
-       gp_Vec2d v;
-       c->D1(angle,p,v);
-       x = p.X();
-       y = p.Y();
-       dx = v.X() / radius;
-       dy = v.Y() / radius;
+        Standard_Boolean sense = Standard_True;
+        if (radius < 0) {
+          radius = -radius;
+          sense = !sense;
+          dx = -dx;
+          dy = -dy;
+        }
+        gp_Ax2d ax(gp_Pnt2d(x-radius*dy,y+radius*dx),gp_Dir2d(dy,-dx));
+        if (angle < 0) {
+          angle = -angle;
+          sense = !sense;
+        }
+        Handle(Geom2d_Circle) c = new Geom2d_Circle(ax,radius,sense);
+        if (isplanar)
+          MW.Add(BRepBuilderAPI_MakeEdge(GeomAPI::To3d(c,P),0,angle));
+        else
+          MW.Add(BRepBuilderAPI_MakeEdge(c,Surface,0,angle));
+        gp_Pnt2d p;
+        gp_Vec2d v;
+        c->D1(angle,p,v);
+        x = p.X();
+        y = p.Y();
+        dx = v.X() / radius;
+        dy = v.Y() / radius;
       }
       break;
 
@@ -846,10 +918,10 @@ static Standard_Integer profile(Draw_Interpretor& di,
       dy = y0-y;
       length = Sqrt(dx*dx+dy*dy);
       if (length > Precision::Confusion()) {
-       move = line;
-       dx = dx / length;
-       dy = dy / length;
-       goto again;
+        move = line;
+        dx = dx / length;
+        dy = dy / length;
+        goto again;
       }
     }
   }
@@ -870,7 +942,7 @@ static Standard_Integer profile(Draw_Interpretor& di,
   else {
     S = MW;
   }
-  
+
   if (!TheLocation.IsIdentity())
     S.Move(TheLocation);
 
@@ -883,7 +955,7 @@ static Standard_Integer profile(Draw_Interpretor& di,
 
   return 0;
 
- badargs:
+badargs:
   di << "profile : bad number of arguments";
   return 1;
 }
@@ -893,8 +965,8 @@ static Standard_Integer profile(Draw_Interpretor& di,
 //=======================================================================
 
 static Standard_Integer bsplineprof(Draw_Interpretor& di,
-                                   Standard_Integer n,
-                                   const char** a)
+  Standard_Integer n,
+  const char** a)
 {
   // this command build a profile
   // from a moving point
@@ -924,11 +996,11 @@ static Standard_Integer bsplineprof(Draw_Interpretor& di,
   }
 
   gp_Pnt2d last_point(0.0e0,
-                    0.0e0) ;
+    0.0e0) ;
   gp_Pnt2d first_point(0.0e0,
-                      0.0e0) ;
-  Standard_Integer i = 2,
-  wait = 1 ;
+    0.0e0) ;
+  Standard_Integer i = 2;
+  Standard_Boolean wait = Standard_True;
 //  Standard_Real x0 = 0, y0 = 0, x = 0, y = 0, dx = 1, dy = 0;
   Standard_Real x = 0, y = 0, dx = 1, dy = 0;
   BRepBuilderAPI_MakeWire MW;
@@ -937,7 +1009,6 @@ static Standard_Integer bsplineprof(Draw_Interpretor& di,
   Standard_Boolean face  = Standard_True;
   Standard_Boolean close = Standard_True;
 //  Standard_Boolean first = Standard_True;
-  Standard_Boolean stayfirst = Standard_False;
   Standard_Boolean isplanar  = Standard_True;
   Standard_Real  length ; 
   TopoDS_Shape S;
@@ -945,44 +1016,43 @@ static Standard_Integer bsplineprof(Draw_Interpretor& di,
   Handle(Geom_Surface) Surface;
   if (n > 2) {
     while (i < n) {
-      
+
       switch (a[i][0]) {
-       
+
       case 'S':
       case 's':
-       i += 1;
-       {
-         TopoDS_Shape aLocalShape(DBRep::Get(a[i],TopAbs_FACE));
-         TopoDS_Face Face = TopoDS::Face(aLocalShape);
-//       TopoDS_Face Face = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
-         if (Face.IsNull()) {
-           di << "profile : no face found";
-           return 1;
-         }
-         Surface = BRep_Tool::Surface(Face,TheLocation);
-         Handle(Geom_Plane) Plane = Handle(Geom_Plane)::DownCast(Surface);
-         if ( Plane.IsNull()) {
-           isplanar = Standard_False;
-         }
-         else 
-           P = Plane->Pln();
-       }
-       stayfirst = Standard_True;
+        i += 1;
+        {
+          TopoDS_Shape aLocalShape(DBRep::Get(a[i],TopAbs_FACE));
+          TopoDS_Face Face = TopoDS::Face(aLocalShape);
+//    TopoDS_Face Face = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
+          if (Face.IsNull()) {
+            di << "profile : no face found";
+            return 1;
+          }
+          Surface = BRep_Tool::Surface(Face,TheLocation);
+          Handle(Geom_Plane) Plane = Handle(Geom_Plane)::DownCast(Surface);
+          if ( Plane.IsNull()) {
+            isplanar = Standard_False;
+          }
+          else 
+            P = Plane->Pln();
+        }
         i += 1 ;
-       break;
-       
+        break;
+
       case 'W':
       case 'w':
-       face = Standard_False;
-       if ((a[i][1] == 'W') || (a[i][1] == 'w')) {
-         close = Standard_False;
-       }
-       i = n-1;
-       break;
+        face = Standard_False;
+        if ((a[i][1] == 'W') || (a[i][1] == 'w')) {
+          close = Standard_False;
+        }
+        i = n-1;
+        break;
 
       default:
-       di <<"profile : unknown code " << a[i];
-       return 1;
+        di <<"profile : unknown code " << a[i];
+        return 1;
       }
     }
   }
@@ -990,109 +1060,109 @@ static Standard_Integer bsplineprof(Draw_Interpretor& di,
 //  to be done : close the profile using the first point of the contour
 //               and the point taken with mouse button 3 
 //
- Handle(Geom2d_BSplineCurve) C ;
- Handle(Geom_Curve) curve3d_ptr ;
- Standard_Integer id, ii;
- Standard_Integer X,Y,b, not_done;
- Standard_Integer num_points = 0  ;
- gp_Pnt2d a_point(  0.0e0,
-                  0.0e0) ;
 Handle(Geom2d_BSplineCurve) C ;
 Handle(Geom_Curve) curve3d_ptr ;
 Standard_Integer id, ii;
 Standard_Integer X,Y,b, not_done;
 Standard_Integer num_points = 0  ;
 gp_Pnt2d a_point(  0.0e0,
+    0.0e0) ;
   Handle(TColgp_HArray1OfPnt2d) points_array_ptr = 
     new TColgp_HArray1OfPnt2d(1, 1);               
   Handle(TColgp_HArray1OfPnt2d) new_points_array_ptr ;
 
   not_done = 1 ;
   while (not_done) {
-   
-   dout.Select(id,X,Y,b,wait);
-   Standard_Real z = dout.Zoom(id);
-   a_point.SetCoord(1,(Standard_Real)X /z) ;
-   a_point.SetCoord(2,(Standard_Real)Y /z) ;
-   if (num_points == 0) {
-     points_array_ptr = 
-       new TColgp_HArray1OfPnt2d(1, 1); 
-     points_array_ptr->ChangeArray1()(1) = a_point ;
-     first_point = a_point ;
-
-   }
-   num_points += 1 ;
-   if (num_points >= 2) {
-     new_points_array_ptr = 
-     new TColgp_HArray1OfPnt2d(1, num_points);
-     for (ii = 1 ; ii <= num_points -1 ; ii++) {
-       new_points_array_ptr->ChangeArray1()(ii) =
-        points_array_ptr->Array1()(ii) ;
-     }
-     new_points_array_ptr->ChangeArray1()(num_points) = a_point ;
-     Geom2dAPI_Interpolate    a2dInterpolator(new_points_array_ptr,
-                                             Standard_False,
-                                             1.0e-5) ;
-     a2dInterpolator.Perform() ;
-     if (a2dInterpolator.IsDone()) { 
-           C = a2dInterpolator.Curve() ;
-            curve3d_ptr =
-            GeomAPI::To3d(C,P) ;
-           DrawTrSurf::Set(a[1], curve3d_ptr);
-           dout.RepaintView(id);
-     }
-     points_array_ptr = new_points_array_ptr ;
-
-   }
-       
-   if (b == 2 || b == 3) {
-     if (num_points == 2)  {
+
+    dout.Select(id,X,Y,b,wait);
+    Standard_Real z = dout.Zoom(id);
+    a_point.SetCoord(1,(Standard_Real)X /z) ;
+    a_point.SetCoord(2,(Standard_Real)Y /z) ;
+    if (num_points == 0) {
+      points_array_ptr = 
+        new TColgp_HArray1OfPnt2d(1, 1); 
+      points_array_ptr->ChangeArray1()(1) = a_point ;
+      first_point = a_point ;
+
+    }
+    num_points += 1 ;
+    if (num_points >= 2) {
+      new_points_array_ptr = 
+        new TColgp_HArray1OfPnt2d(1, num_points);
+      for (ii = 1 ; ii <= num_points -1 ; ii++) {
+        new_points_array_ptr->ChangeArray1()(ii) =
+          points_array_ptr->Array1()(ii) ;
+      }
+      new_points_array_ptr->ChangeArray1()(num_points) = a_point ;
+      Geom2dAPI_Interpolate    a2dInterpolator(new_points_array_ptr,
+        Standard_False,
+        1.0e-5) ;
+      a2dInterpolator.Perform() ;
+      if (a2dInterpolator.IsDone()) { 
+        C = a2dInterpolator.Curve() ;
+        curve3d_ptr =
+          GeomAPI::To3d(C,P) ;
+        DrawTrSurf::Set(a[1], curve3d_ptr);
+        dout.RepaintView(id);
+      }
+      points_array_ptr = new_points_array_ptr ;
+
+    }
+
+    if (b == 2 || b == 3) {
+      if (num_points == 2)  {
         x = last_point.Coord(1) ;
         y = last_point.Coord(2) ;
         dx = a_point.Coord(1) - x ;
         dy = a_point.Coord(2) - y ;
         gp_Vec2d a_vector(dx,
-                          dy) ;
+          dy) ;
         length = a_vector.Magnitude() ;
-       Handle(Geom2d_Line) l = 
-         new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
-       if (isplanar) {
-         MW.Add(BRepBuilderAPI_MakeEdge(GeomAPI::To3d(l,P),0,length));
+        Handle(Geom2d_Line) l = 
+          new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
+        if (isplanar) {
+          MW.Add(BRepBuilderAPI_MakeEdge(GeomAPI::To3d(l,P),0,length));
         }
-       else { 
-         MW.Add(BRepBuilderAPI_MakeEdge(l,Surface,0,length));
+        else { 
+          MW.Add(BRepBuilderAPI_MakeEdge(l,Surface,0,length));
         }
 
       }
-    else if (num_points > 2) {
+      else if (num_points > 2) {
         if (isplanar) {
-         MW.Add(BRepBuilderAPI_MakeEdge(curve3d_ptr,
-                                  curve3d_ptr->FirstParameter(),
-                                  curve3d_ptr->LastParameter()));
+          MW.Add(BRepBuilderAPI_MakeEdge(curve3d_ptr,
+            curve3d_ptr->FirstParameter(),
+            curve3d_ptr->LastParameter()));
         }
-       else { 
-         MW.Add(BRepBuilderAPI_MakeEdge(C,
-                                  Surface,
-                                  C->FirstParameter(),
-                                  C->LastParameter()));
+        else { 
+          MW.Add(BRepBuilderAPI_MakeEdge(C,
+            Surface,
+            C->FirstParameter(),
+            C->LastParameter()));
         }
       }
-     if (num_points >= 2) {
-       last_point = a_point ;
-       points_array_ptr->ChangeArray1()(1) = a_point ;
-       num_points = 1 ;
-       DBRep::Set(a[1], MW.Wire()) ;
-     }      
-    
-  
-   }
-   if (b == 3) {
-     not_done = 0 ; 
-   }
- }
+      if (num_points >= 2) {
+        last_point = a_point ;
+        points_array_ptr->ChangeArray1()(1) = a_point ;
+        num_points = 1 ;
+        DBRep::Set(a[1], MW.Wire()) ;
+      }      
+
+
+    }
+    if (b == 3) {
+      not_done = 0 ; 
+    }
 }
   a_point = first_point ;
   if (close) {
-    
+
     x = last_point.Coord(1) ;
     y = last_point.Coord(2) ;
     dx = a_point.Coord(1) - x ;
     dy = a_point.Coord(2) - y ;
     gp_Vec2d a_vector(dx,
-                     dy) ;
+      dy) ;
     length = a_vector.Magnitude() ;
     Handle(Geom2d_Line) l = 
       new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
@@ -1114,24 +1184,18 @@ static Standard_Integer bsplineprof(Draw_Interpretor& di,
   else {
     S = MW;
   }
-  
+
   if (!TheLocation.IsIdentity())
     S.Move(TheLocation);
-  
+
   if ( !isplanar) {
     Standard_Real Tol = 1.e-5;
     BRepLib::BuildCurves3d(S,Tol);
   }
-  
+
   DBRep::Set(a[1],S);
-  
-  return 0;
 
-#ifdef DEB  
- badargs:
-  di << "profile : bad number of arguments";
-  return 1;
-#endif
+  return 0;
 }
 
 
@@ -1142,8 +1206,8 @@ static Standard_Integer bsplineprof(Draw_Interpretor& di,
 //=======================================================================
 
 static Standard_Integer profile2d(Draw_Interpretor& di, 
-                                 Standard_Integer n, 
-                                 const char** a)
+  Standard_Integer n, 
+  const char** a)
 {
   // this command build a profile with 2d curves.
   // from a moving point
@@ -1224,11 +1288,11 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
       i += 2;
       if (i >= n) goto badargs;
       if (!first) {
-       di << "profile: The F instruction must precede all moves";
-       return 1;
+        di << "profile: The F instruction must precede all moves";
+        return 1;
       }
-      x0 = x = atof(a[i-1]);
-      y0 = y = atof(a[i]);
+      x0 = x = Draw::Atof(a[i-1]);
+      y0 = y = Draw::Atof(a[i]);
       stayfirst = Standard_True;
       break;
 
@@ -1236,31 +1300,31 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
     case 'x':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       if ((a[i-1][1] == 'X') || (a[i-1][1] == 'x')) {
-       length -= x;
+        length -= x;
       }
       dx = 1; dy = 0;
       move = line;
       break;
-      
+
     case 'Y':
     case 'y':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       if ((a[i-1][1] == 'Y') || (a[i-1][1] == 'y')) {
-       length -= y;
+        length -= y;
       }
       dx = 0; dy = 1;
       move = line;
       break;
-      
+
     case 'L':
     case 'l':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       move = line;
       break;
 
@@ -1269,18 +1333,18 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
       i += 2;
       if (i >= n) goto badargs;
       {
-       Standard_Real vx = atof(a[i-1]);
-       Standard_Real vy = atof(a[i]);
-       if ((a[i-2][1] == 'T') || (a[i-2][1] == 't')) {
-         vx -= x;
-         vy -= y;
-       }
-       length = Sqrt(vx*vx+vy*vy);
-       if (length > Precision::Confusion()) {
-         move = line;
-         dx = vx / length;
-         dy = vy / length;
-       }
+        Standard_Real vx = Draw::Atof(a[i-1]);
+        Standard_Real vy = Draw::Atof(a[i]);
+        if ((a[i-2][1] == 'T') || (a[i-2][1] == 't')) {
+          vx -= x;
+          vy -= y;
+        }
+        length = Sqrt(vx*vx+vy*vy);
+        if (length > Precision::Confusion()) {
+          move = line;
+          dx = vx / length;
+          dy = vy / length;
+        }
       }
       break;
 
@@ -1288,17 +1352,17 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
     case 'r':
       i++;
       if (i >= n) goto badargs;
-      angle = atof(a[i]) * (M_PI / 180.0);
+      angle = Draw::Atof(a[i]) * (M_PI / 180.0);
       if ((a[i-1][1] == 'R') || (a[i-1][1] == 'r')) {
-       dx = Cos(angle);
-       dy = Sin(angle);
+        dx = Cos(angle);
+        dy = Sin(angle);
       }
       else {
-       Standard_Real c = Cos(angle);
-       Standard_Real s = Sin(angle);
-       Standard_Real t = c * dx - s * dy;
-       dy = s * dx + c * dy;
-       dx = t;
+        Standard_Real c = Cos(angle);
+        Standard_Real s = Sin(angle);
+        Standard_Real t = c * dx - s * dy;
+        dy = s * dx + c * dy;
+        dx = t;
       }
       break;
 
@@ -1307,14 +1371,14 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
       i += 2;
       if (i >= n) goto badargs;
       {
-       Standard_Real vx = atof(a[i-1]);
-       Standard_Real vy = atof(a[i]);
-       length = Sqrt(vx*vx+vy*vy);
-       if (length > Precision::Confusion()) {
-         // move = line; DUB
-         dx = vx / length;
-         dy = vy / length;
-       }
+        Standard_Real vx = Draw::Atof(a[i-1]);
+        Standard_Real vy = Draw::Atof(a[i]);
+        length = Sqrt(vx*vx+vy*vy);
+        if (length > Precision::Confusion()) {
+          // move = line; DUB
+          dx = vx / length;
+          dy = vy / length;
+        }
       }
       break;
 
@@ -1322,10 +1386,10 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
     case 'c':
       i += 2;
       if (i >= n) goto badargs;
-      radius = atof(a[i-1]);
+      radius = Draw::Atof(a[i-1]);
       if (Abs(radius) > Precision::Confusion()) {
-       angle = atof(a[i]) * (M_PI / 180.0);
-       move = circle;
+        angle = Draw::Atof(a[i]) * (M_PI / 180.0);
+        move = circle;
       }
       break;
 
@@ -1333,24 +1397,24 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
     case 'i':
       i++;
       if (i >= n) goto badargs;
-      length = atof(a[i]);
+      length = Draw::Atof(a[i]);
       if ((a[i-1][1] == 'X') || (a[i-1][1] == 'x')) {
-       if (Abs(dx) < Precision::Confusion()) {
-         di << "Profile : cannot intersect, arg " << i-1;
-         return 1;
-       }
-       length = (length - x) / dx;
-       move = line;
+        if (Abs(dx) < Precision::Confusion()) {
+          di << "Profile : cannot intersect, arg " << i-1;
+          return 1;
+        }
+        length = (length - x) / dx;
+        move = line;
       }
       else if ((a[i-1][1] == 'Y') || (a[i-1][1] == 'y')) {
-       if (Abs(dy) < Precision::Confusion()) {
-         di << "Profile : cannot intersect, arg " << i-1;
-         return 1;
-       }
-       length = (length - y) / dy;
-       move = line;
+        if (Abs(dy) < Precision::Confusion()) {
+          di << "Profile : cannot intersect, arg " << i-1;
+          return 1;
+        }
+        length = (length - y) / dy;
+        move = line;
       }
-     
+
       break;
 
     case 'W':
@@ -1358,63 +1422,63 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
       close = Standard_False;
       i = n-1;
       break;
-      
+
     default:
       di <<"profile : unknown code " << a[i];
       return 1;
     }
 
-  again:
-    
+again:
+
     switch (move) {
-      
+
     case line :
       {
-       if (length < 0) {
-         length = -length;
-         dx = -dx;
-         dy = -dy;
-       }
-       Handle(Geom2d_Line) l = new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
-       Handle(Geom2d_TrimmedCurve) ct = 
-         new Geom2d_TrimmedCurve(l,0,length);
-       NbCurves++;
-       sprintf(name,"%s_%d",a[1],NbCurves);
-       DrawTrSurf::Set(name,ct);
-       di.AppendElement(name);
-       x += length*dx;
-       y += length*dy;
+        if (length < 0) {
+          length = -length;
+          dx = -dx;
+          dy = -dy;
+        }
+        Handle(Geom2d_Line) l = new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
+        Handle(Geom2d_TrimmedCurve) ct = 
+          new Geom2d_TrimmedCurve(l,0,length);
+        NbCurves++;
+        Sprintf(name,"%s_%d",a[1],NbCurves);
+        DrawTrSurf::Set(name,ct);
+        di.AppendElement(name);
+        x += length*dx;
+        y += length*dy;
       }
       break;
 
     case circle :
       {
-       Standard_Boolean sense = Standard_True;
-       if (radius < 0) {
-         radius = -radius;
-         sense = !sense;
-         dx = -dx;
-         dy = -dy;
-       }
-       gp_Ax2d ax(gp_Pnt2d(x-radius*dy,y+radius*dx),gp_Dir2d(dy,-dx));
-       if (angle < 0) {
-         angle = -angle;
-         sense = !sense;
-       }
-       Handle(Geom2d_Circle) c = new Geom2d_Circle(ax,radius,sense);
-       Handle(Geom2d_TrimmedCurve) ct = 
-         new Geom2d_TrimmedCurve(c,0,angle);
-       NbCurves++;
-       sprintf(name,"%s_%d",a[1],NbCurves);
-       DrawTrSurf::Set(name,ct);       
-       di.AppendElement(name);
-       gp_Pnt2d p;
-       gp_Vec2d v;
-       c->D1(angle,p,v);
-       x = p.X();
-       y = p.Y();
-       dx = v.X() / radius;
-       dy = v.Y() / radius;
+        Standard_Boolean sense = Standard_True;
+        if (radius < 0) {
+          radius = -radius;
+          sense = !sense;
+          dx = -dx;
+          dy = -dy;
+        }
+        gp_Ax2d ax(gp_Pnt2d(x-radius*dy,y+radius*dx),gp_Dir2d(dy,-dx));
+        if (angle < 0) {
+          angle = -angle;
+          sense = !sense;
+        }
+        Handle(Geom2d_Circle) c = new Geom2d_Circle(ax,radius,sense);
+        Handle(Geom2d_TrimmedCurve) ct = 
+          new Geom2d_TrimmedCurve(c,0,angle);
+        NbCurves++;
+        Sprintf(name,"%s_%d",a[1],NbCurves);
+        DrawTrSurf::Set(name,ct);      
+        di.AppendElement(name);
+        gp_Pnt2d p;
+        gp_Vec2d v;
+        c->D1(angle,p,v);
+        x = p.X();
+        y = p.Y();
+        dx = v.X() / radius;
+        dy = v.Y() / radius;
       }
       break;
 
@@ -1434,10 +1498,10 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
       dy = y0-y;
       length = Sqrt(dx*dx+dy*dy);
       if (length > Precision::Confusion()) {
-       move = line;
-       dx = dx / length;
-       dy = dy / length;
-       goto again;
+        move = line;
+        dx = dx / length;
+        dy = dy / length;
+        goto again;
       }
     }
   }
@@ -1453,7 +1517,7 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
 
   return 0;
 
- badargs:
+badargs:
   di << "profile : bad number of arguments";
   return 1;
 }
@@ -1466,53 +1530,125 @@ static Standard_Integer profile2d(Draw_Interpretor& di,
 //=======================================================================
 
 Standard_Integer mkoffset(Draw_Interpretor& di, 
-                         Standard_Integer n, const char** a)
+  Standard_Integer n, const char** a)
 {
   if (n < 5) return 1;
   char name[100];
 
-  BRepOffsetAPI_MakeOffset Paral;  
+  BRepOffsetAPI_MakeOffset Paral;
+  GeomAbs_JoinType theJoinType = GeomAbs_Arc;
+  if (n >= 6 && strcmp(a[5], "i") == 0)
+    theJoinType = GeomAbs_Intersection;
+  Paral.Init(theJoinType);
   TopoDS_Shape Base = DBRep::Get(a[2],TopAbs_FACE);
 
-  if ( Base.IsNull()) {
+  if ( Base.IsNull())
+  {
     Base = DBRep::Get(a[2]);
     if (Base.IsNull()) return 1;
-    Paral.Init(GeomAbs_Arc);
+    Paral.Init(theJoinType);
     TopExp_Explorer exp;
-    for (exp.Init(Base,TopAbs_WIRE); exp.More(); exp.Next()) {
+    for (exp.Init(Base,TopAbs_WIRE); exp.More(); exp.Next())
+    {
       TopoDS_Wire aLocalShape = TopoDS::Wire(exp.Current());
       Paral.AddWire(aLocalShape);
-//      Paral.AddWire(TopoDS::Wire(exp.Current()));
     }
   }
-  else {
+  else
+  {
     Base.Orientation(TopAbs_FORWARD);
-//    Base = TopoDS::Face(Base.Oriented(TopAbs_FORWARD));
-    Paral.Init(TopoDS::Face(Base));
+    Paral.Init(TopoDS::Face(Base), theJoinType);
   }
 
   Standard_Real U, dU;
   Standard_Integer Nb;
-  dU = atof(a[4]);
-  Nb = atoi(a[3]);
+  dU = Draw::Atof(a[4]);
+  Nb = Draw::Atoi(a[3]);
 
   Standard_Real Alt = 0.;
-  if ( n == 6) Alt = atof(a[5]);
+  if ( n == 7)
+    Alt = Draw::Atof(a[6]);
+
   Standard_Integer Compt = 1;
 
-  for ( Standard_Integer i = 1; i <= Nb; i++) {
+  for ( Standard_Integer i = 1; i <= Nb; i++)
+  {
     U = i * dU;
     Paral.Perform(U,Alt);
-    if ( !Paral.IsDone()) {
-      //cout << " Parali aux fraises" << endl;
-      di << " Parali aux fraises" << "\n";
+
+    if ( !Paral.IsDone())
+    {
+      di << " Error: Offset is not done.\n";
+      return 1;
     }
-    else {
-      sprintf(name,"%s_%d", a[1], Compt++);
+    else
+    {
+      Sprintf(name,"%s_%d", a[1], Compt++);
       char* temp = name; // portage WNT
       DBRep::Set(temp,Paral.Shape());
     }
   }
+
+  return 0;
+}
+
+//=======================================================================
+//function : openoffset
+//purpose  : 
+//=======================================================================
+
+Standard_Integer openoffset(Draw_Interpretor& di, 
+  Standard_Integer n, const char** a)
+{
+  if (n < 5) return 1;
+  char name[100];
+
+  BRepOffsetAPI_MakeOffset Paral;
+  GeomAbs_JoinType theJoinType = GeomAbs_Arc;
+  if (n == 6 && strcmp(a[5], "i") == 0)
+    theJoinType = GeomAbs_Intersection;
+  Paral.Init(theJoinType, Standard_True);
+  TopoDS_Shape Base = DBRep::Get(a[2] ,TopAbs_FACE);
+
+  if ( Base.IsNull())
+  {
+    Base = DBRep::Get(a[2], TopAbs_WIRE);
+    if (Base.IsNull()) return 1;
+    Paral.AddWire(TopoDS::Wire(Base));
+  }
+  else
+  {
+    Base.Orientation(TopAbs_FORWARD);
+    Paral.Init(TopoDS::Face(Base), theJoinType, Standard_True);
+  }
+
+  Standard_Real U, dU;
+  Standard_Integer Nb;
+  dU = Draw::Atof(a[4]);
+  Nb = Draw::Atoi(a[3]);
+
+  Standard_Real Alt = 0.;
+
+  Standard_Integer Compt = 1;
+
+  for ( Standard_Integer i = 1; i <= Nb; i++)
+  {
+    U = i * dU;
+    Paral.Perform(U,Alt);
+
+    if ( !Paral.IsDone())
+    {
+      di << " Error: Offset is not done.\n";
+      return 1;
+    }
+    else
+    {
+      Sprintf(name,"%s_%d", a[1], Compt++);
+      char* temp = name; // portage WNT
+      DBRep::Set(temp,Paral.Shape());
+    }
+  }
+
   return 0;
 }
 
@@ -1522,15 +1658,15 @@ Standard_Integer mkoffset(Draw_Interpretor& di,
 //=======================================================================
 
 Standard_Integer pickface(Draw_Interpretor& di, 
-                         Standard_Integer , const char** )
+  Standard_Integer , const char** )
 {
   Standard_CString pick_name=".";
-  
+
   TopoDS_Shape S = DBRep::Get(pick_name,TopAbs_FACE);
   if (S.IsNull()) return 1;
-  
+
   char* name = new char[100];
-  sprintf(name,"PickedFace %s",pick_name);
+  Sprintf(name,"PickedFace %s",pick_name);
   DBRep::Set(name,S);
   di.AppendElement(name);
   return 0;
@@ -1538,7 +1674,7 @@ Standard_Integer pickface(Draw_Interpretor& di,
 
 
 Standard_Integer edgeintersector(Draw_Interpretor& di,
-                                Standard_Integer n, const char** a)
+  Standard_Integer n, const char** a)
 {
   if (n < 5) return 1;
 
@@ -1555,7 +1691,7 @@ Standard_Integer edgeintersector(Draw_Interpretor& di,
   TopoDS_Face F  = TopoDS::Face(aLocalShape);
 //  TopoDS_Face F  = TopoDS::Face(DBRep::Get(a[4],TopAbs_FACE));
   if ( F.IsNull()) return 1;
-  
+
   TopOpeBRep_EdgesIntersector EInter;
   char name[100];
   //------------------------------------------------------
@@ -1563,14 +1699,14 @@ Standard_Integer edgeintersector(Draw_Interpretor& di,
   //-----------------------------------------------------
   EInter.SetFaces(F,F);
   Standard_Real TolInter = 1.e-7;
-  if (n == 6) TolInter = atof(a[5]);
+  if (n == 6) TolInter = Draw::Atof(a[5]);
   EInter.ForceTolerances(TolInter,TolInter);
   Standard_Boolean reducesegments = Standard_True;
   EInter.Perform (E[0],E[1],reducesegments);
-  
+
   if (EInter.IsEmpty()) {
     //cout << " No intersection found" << endl;
-    di << " No intersection found" << "\n";
+    di << " No intersection found\n";
     return 0;
   }
 
@@ -1586,7 +1722,7 @@ Standard_Integer edgeintersector(Draw_Interpretor& di,
     gp_Pnt           P    = P2D.Value();
     TopoDS_Vertex    V    = BRepLib_MakeVertex(P);
     NbV ++;
-    sprintf(name,"%s_%d",a[1],NbV);
+    Sprintf(name,"%s_%d",a[1],NbV);
     DBRep::Set(name,V);
     for (Standard_Integer i = 1; i <= 2; i++) {
       //---------------------------------------------------------------
@@ -1594,29 +1730,29 @@ Standard_Integer edgeintersector(Draw_Interpretor& di,
       // it is necessary to code it internally
       //---------------------------------------------------------------
       Standard_Real U = P2D.Parameter(i);
-      
+
       V.Orientation(TopAbs_INTERNAL);
       B.UpdateVertex(V,U,E[i-1],Tol);
-//      B.UpdateVertex(TopoDS::Vertex(V.Oriented(TopAbs_INTERNAL)),
-//                  U,E[i-1],Tol);
+      //      B.UpdateVertex(TopoDS::Vertex(V.Oriented(TopAbs_INTERNAL)),
+      //                    U,E[i-1],Tol);
       //---------------------------------------------------------------
       // Orientation of vertex in the transition.
       //---------------------------------------------------------------
       TopAbs_Orientation OO = TopAbs_REVERSED;
       if (P2D.IsVertex(i)) {
-       OO = P2D.Vertex(i).Orientation();
+        OO = P2D.Vertex(i).Orientation();
       }
       else if (P2D.Transition(i).Before() == TopAbs_OUT) {
-       OO = TopAbs_FORWARD;
+        OO = TopAbs_FORWARD;
       }
       //cout << " Orientation of vertex " << NbV << " on " << a[i+1] << ": ";
       di << " Orientation of vertex " << NbV << " on " << a[i+1] << ": ";
       if (OO == TopAbs_FORWARD) {
-       //cout << "FORWARD" << endl;
-       di << "FORWARD" << "\n";
+        //cout << "FORWARD" << endl;
+        di << "FORWARD\n";
       } else {
-       //cout << "REVERSED" << endl;
-       di << "REVERSED" << "\n";
+        //cout << "REVERSED" << endl;
+        di << "REVERSED\n";
       }
     }
   }
@@ -1624,6 +1760,30 @@ Standard_Integer edgeintersector(Draw_Interpretor& di,
   return 0;
 
 }
+
+//=======================================================================
+//function : concatC0wire
+//purpose  : 
+//=======================================================================
+
+Standard_Integer concatC0wire(Draw_Interpretor&, Standard_Integer n, const char** c)
+{
+  if ( n < 3 ) return 1;                               
+
+  TopoDS_Shape S = DBRep::Get(c[2],TopAbs_WIRE) ;
+
+  if (S.IsNull())
+    return 1;                            //test if the shape is empty
+
+  TopoDS_Wire W = TopoDS::Wire(S) ;
+  TopoDS_Shape res;
+
+
+  res = BRepAlgo::ConcatenateWireC0(W);              //treatment
+  DBRep::Set(c[1], res);
+  return 0;
+}
+
 //=======================================================================
 //function : concatwire
 //purpose  : reduce the multiply degree of the knots to the minimum without
@@ -1631,22 +1791,20 @@ Standard_Integer edgeintersector(Draw_Interpretor& di,
 //=======================================================================
 
 static Standard_Integer concatwire(Draw_Interpretor&, Standard_Integer n, const char** c)
-{ GeomAbs_Shape Option=GeomAbs_C1;
+{
+  GeomAbs_Shape Option=GeomAbs_C1;
+  if ( n < 3 ) return 1;
 
-  if ( n < 3 ) return 1;                               
-  
   if(n==4)                                              //check if it's C1 or G1
-    if (! strcmp(c[3],"G1"))
-      Option=GeomAbs_G1;
-  
+  if (! strcmp(c[3],"G1"))
+    Option=GeomAbs_G1;
+
   TopoDS_Shape S = DBRep::Get(c[2],TopAbs_WIRE) ;
 
   if (S.IsNull()) return 1 ;                            //test if the shape is empty
   
   TopoDS_Wire W = TopoDS::Wire(S) ;
   TopoDS_Wire res;
-
-
   res=BRepAlgo::ConcatenateWire(W,Option);              //processing
   DBRep::Set(c[1],res);
   return 0;
@@ -1658,27 +1816,50 @@ static Standard_Integer concatwire(Draw_Interpretor&, Standard_Integer n, const
 //=======================================================================
 
 Standard_Integer  build3d(Draw_Interpretor& di, 
-                         Standard_Integer n, const char** a)
+  Standard_Integer n, const char** a)
 {
 
   if ( (n <2) || (n>3) ) {
     //cout << " 1 or 2 arguments expected" << endl;
-    di << " 1 or 2 arguments expected" << "\n";
+    di << " 1 or 2 arguments expected\n";
     return 1;
   }
-    
+
   Standard_Boolean Ok;
-  TopoDS_Shape S = DBRep::Get(a[1],TopAbs_FACE);
+  TopoDS_Shape S = DBRep::Get(a[1]);
   if (S.IsNull()) return 1;
-  
+
   if (n==2) { Ok = BRepLib::BuildCurves3d(S); }
-  else      { Ok = BRepLib::BuildCurves3d(S,atof(a[2])); }
+  else      { Ok = BRepLib::BuildCurves3d(S,Draw::Atof(a[2])); }
   //if (!Ok) {cout << " one of the computation failed" << endl;}
-  if (!Ok) {di << " one of the computation failed" << "\n";}
+  if (!Ok) {di << " one of the computation failed\n";}
 
   return 0;
 }
 
+//=======================================================================
+//function : reducepcurves
+//purpose  : remove pcurves that are unused in this shape
+//=======================================================================
+
+Standard_Integer reducepcurves(Draw_Interpretor& di, 
+  Standard_Integer n, const char** a)
+{
+  if (n < 2) return 1;
+
+  Standard_Integer i;
+  for (i = 1; i < n; i++)
+  {
+    TopoDS_Shape aShape = DBRep::Get(a[i]);
+    if (aShape.IsNull())
+      //cout << a[i] << " is not a valid shape" << endl;
+      di << a[i] << " is not a valid shape\n";
+    else
+      BRepTools::RemoveUnusedPCurves(aShape);
+  }
+
+  return 0;
+}
 
 //=======================================================================
 //function : CurveCommands
@@ -1697,100 +1878,113 @@ void  BRepTest::CurveCommands(Draw_Interpretor& theCommands)
   const char* g = "TOPOLOGY Curve topology commands";
 
   theCommands.Add("vertex",
-                 "vertex name [x y z / p edge]",__FILE__,
-                 vertex,g);
+    "vertex name [x y z | p edge | poin]",__FILE__,
+    vertex,g);
 
   theCommands.Add("etrim",
-                 "etrim edge v1 [v2]",__FILE__,
-                 trim,g);
+    "etrim edge v1 [v2]",__FILE__,
+    trim,g);
 
   theCommands.Add("range",
-                 "range edge [face] first last",__FILE__,
-                 range,g);
+    "range edge [face] first last",__FILE__,
+    range,g);
 
   theCommands.Add("polyline",
-                 "polyline name x1 y1 z1 x2 y2 z2 ...",__FILE__,
-                 polyline,g);
+    "polyline name x1 y1 z1 x2 y2 z2 ...",__FILE__,
+    polyline,g);
 
   theCommands.Add("polyvertex",
-                 "polyvertex name v1 v2 ...",__FILE__,
-                 polyvertex,g);
+    "polyvertex name v1 v2 ...",__FILE__,
+    polyvertex,g);
 
   theCommands.Add("wire",
-                 "wire wirename e1/w1 [e2/w2 ...]",__FILE__,
-                 wire,g);
+    "wire wirename [-unsorted] e1/w1 [e2/w2 ...]",__FILE__,
+    wire,g);
 
   theCommands.Add("profile",
-                 "profile, no args to get help",__FILE__,
-                 profile,g);
+    "profile, no args to get help",__FILE__,
+    profile,g);
 
   theCommands.Add("bsplineprof",
-                 "bsplineprof, no args to get help",__FILE__,
-                 bsplineprof,g);
+    "bsplineprof, no args to get help",__FILE__,
+    bsplineprof,g);
 
   theCommands.Add("2dprofile",
-                 "2dprofile, no args to get help",__FILE__,
-                 profile2d,g);
+    "2dprofile, no args to get help",__FILE__,
+    profile2d,g);
 
   theCommands.Add("mkoffset",
-                 "mkoffset result face/compound of wires  nboffset stepoffset [alt]",__FILE__,
-                 mkoffset);
+    "mkoffset result face/compound of wires  nboffset stepoffset [jointype(a/i) [alt]]",__FILE__,
+    mkoffset);
 
+  theCommands.Add("openoffset",
+    "openoffset result face/wire nboffset stepoffset [jointype(a/i)]",__FILE__,
+    openoffset);
 
   theCommands.Add("mkedge",
-                 "mkedge edge curve [surface] [pfirst plast] [vfirst [pfirst] vlast [plast]] ",__FILE__,
-                 mkedge,g);
-  
+    "mkedge edge curve [surface] [pfirst plast] [vfirst [pfirst] vlast [plast]] ",__FILE__,
+    mkedge,g);
+
   theCommands.Add("mkcurve",
-                 "mkcurve curve edge",__FILE__,
-                 mkcurve,g);
+    "mkcurve curve edge",__FILE__,
+    mkcurve,g);
 
   theCommands.Add("mkoricurve",
-                 "mkoricurve curve edge: \n  the curve is colored according to the orientation of the edge",
-                 __FILE__,
-                 mkcurve,g);
+    "mkoricurve curve edge: \n  the curve is colored according to the orientation of the edge",
+    __FILE__,
+    mkcurve,g);
 
   theCommands.Add("mk2dcurve",
-                 "mk2dcurve curve edge [face]",__FILE__,
-                 mk2dcurve,g);
+    "mk2dcurve curve edge [face OR index]",__FILE__,
+    mk2dcurve,g);
 
   theCommands.Add("mkpoint",
-                 "mkpoint point vertex",__FILE__,
-                 mkpoint,g);
+    "mkpoint point vertex",__FILE__,
+    mkpoint,g);
 
   theCommands.Add("uisoedge",
-                 "uisoedge edge face u v1 v2",__FILE__,
-                 isoedge,g);
-  
+    "uisoedge edge face u v1 v2",__FILE__,
+    isoedge,g);
+
   theCommands.Add("edge",
-                 "edge edgename v1 v2",__FILE__,
-                 edge,g);
-  
+    "edge edgename v1 v2",__FILE__,
+    edge,g);
+
   theCommands.Add("visoedge",
-                 "visoedge edge face v u1 u2",__FILE__,
-                 isoedge,g);
+    "visoedge edge face v u1 u2",__FILE__,
+    isoedge,g);
 
   theCommands.Add("transfert",
-                 "transfert edge1 edge2",__FILE__,
-                 transfert,g);
+    "transfert edge1 edge2",__FILE__,
+    transfert,g);
 
   theCommands.Add("pickface",
-                 "pickface",__FILE__,
-                 pickface,g);
+    "pickface",__FILE__,
+    pickface,g);
 
   theCommands.Add("edgeintersector",
-                 "edgeintersector r E1 E2 F [Tol]",__FILE__,
-                 edgeintersector,g);
+    "edgeintersector r E1 E2 F [Tol]",__FILE__,
+    edgeintersector,g);
 
   theCommands.Add("build3d",
-                 "build3d S [tol]",
-                 build3d, g);
+    "build3d S [tol]",
+    build3d, g);
+
+  theCommands.Add("reducepcurves",
+    "reducepcurves shape1 shape2 ...",
+    reducepcurves, g);
+
+  theCommands.Add("concatC0wire",
+    "concatC0wire result wire",
+    __FILE__,
+    concatC0wire,
+    g);
 
   theCommands.Add("concatwire",
-                 "concatwire result wire [option](G1/C1)",
-                 __FILE__,
-                 concatwire,
-                 g);
+    "concatwire result wire [option](G1/C1)",
+    __FILE__,
+    concatwire,
+    g);
 }