return;
   }
   // Temporary: computation of myVal
-  //  myVal = Abs(geom_lin1->Lin().Angle( geom_lin2->Lin())); // Pb avec les angles JPR
+  //  myVal = Abs(geom_lin1->Lin().Angle( geom_lin2->Lin())); // Pb with angles JPR
 
   if (copyOfMyExtShape != 0) myExtShape = copyOfMyExtShape;  
 
 #endif
 
 
-  // Traitement du cas ou les 2 droites sont paralleles
+  // Processing in  case of 2 parallel straight lines
   if (lin1_2d->Lin2d().Direction()
       .IsParallel(lin2_2d->Lin2d().Direction(),Precision::Angular())) {    
     ComputeTwoEdgesNullAngle(aPresentation,
                             isInfinite1,isInfinite2);
   }
   
-  // Traitement du cas ou les 2 droites ne sont pas paralleles
+  // Processing in case of 2 non-parallel straight lines
   else {
     ComputeTwoEdgesNotNullAngle(aPresentation,
                                geom_lin1,
     Standard_Real par = ElCLib::Parameter(circle,curpos);
     curpos = ElCLib::Value(par,circle);    
 
-    // un petit offset comme LengthDimension
+    // small offset like in LengthDimension
     gp_Vec transl(myCenter, curpos);
     transl*= 0.3;
     curpos.Translate(transl);
   }
 
   else {
-  // on projette le point dans le plan
+  // point is projected on the plane
     gp_Pnt2d pointOnPln(ProjLib::Project(myPlane->Pln(),myPosition));
     myPosition = BRepAdaptor_Surface(BRepBuilderAPI_MakeFace(myPlane->Pln()).Face()).Value(pointOnPln.X(),pointOnPln.Y());
     curpos = myPosition;
       curpos.SetXYZ(curpos.XYZ()+delta);
       dist = curpos.Distance(myCenter);
     }
-    // Pour savoir si on doit prendre la distance -dist ou non
-    // il faut savoir si on est dans le secteur oppose a l'angle
-    // ou non : on est dans le secteur oppose si les coordonnees
-    // de curpos dans le repere (d1,d2) sont negatives
+    // To learn if it is necessary to take distance -dist or not
+    // it is necessary to know if we are in the sector opposite to the angle
+    // if not : we are in the opposite sector if the coordinates
+    // of curpos in point (d1,d2) are negative
     gp_Ax2 ax(myCenter,myFDir.Crossed(mySDir),myFDir);
     gp_Circ circle(ax,dist);
 #ifdef DEB
     Standard_Real ufin = uc2;
     if (uco > ufin) {
       if (Abs(myVal)<PI) {
-       // test si uco est dans le secteur oppose 
+       // test if uco is in the opposite sector 
        if (uco > udeb+PI && uco < ufin+PI){
          dist = -dist;
        }
   gp_Lin gpl2 = l2->Lin();
 
   //------------------------------------------------------------
-  //                Calcul de myCenter
-  // -> Point situe sur la ligne mediane des 2 droites,
-  //    calcule comme etant le milieu des 2 points les plus
-  //    proches de chaque droite.
+  //                Computation of myCenter
+  // -> Point located on the median of 2 straight lines,
+  //    is calculated as located between 2 closest points 
+  //    of each straight line.
   //-----------------------------------------------------------
-     //   theLength : rayon du futur cercle
+     //   theLength : radius of the future circle
   Standard_Real theLength = gpl1.Distance(gpl2.Location());
-  // traitement du cas particulier ou les 2 droites sont confondues
+  // processing of the particular case when 2 straight lines are coincident
   Standard_Boolean SameLines(Standard_False);
   if ( theLength <= Precision::Confusion()) {
     SameLines = Standard_True;
     if ( V1.CrossMagnitude(V2) < 0 ) theaxis.Reverse();
   }
 
-  gp_Pnt curpos; // position du curseur
+  gp_Pnt curpos; // cursor position
   TColStd_Array1OfReal tabdist(1,4);
-  gp_Pnt P1, P2; // points d'intersection du cercle avec les 2 droites
+  gp_Pnt P1, P2; // points at intersection of the circle with 2 straight lines
  
   if (myAutomaticPosition) {
     if (!isInfinite1) {
 
       myCenter.Translate(gp_Vec(d1)*theLength);
 
-      // calcul des points d'attache de la cote 
-      //  -> ils sont != des points d'intersection si les 
-      //     intersection sont en dehors des limites des edges
+      // calculate attachments of the face 
+      //  -> they are points of intersection if  
+      //     intersection is outside of the edges
       Standard_Real pparam = ElCLib::Parameter(gpl1,myFAttach);
       Standard_Real pparam1 = ElCLib::Parameter(gpl1,ptat11);
       Standard_Real pparam2 = ElCLib::Parameter(gpl1,ptat12);
       Handle(Geom_Circle)  circle = new Geom_Circle(AX,theLength);
       Handle(Geom2d_Curve) geoCurve = GeomAPI::To2d(circle,myPlane->Pln());
       Handle(Geom2d_Circle) c2d = *((Handle(Geom2d_Circle)*)& geoCurve);
-      // calcul du point d'intersection du cercle avec l1
-      Standard_Real pparam; // parametre du point d'intersection sur l1
+      // calculate the intersection of circle with l1
+      Standard_Real pparam; // parameter of the point of intersection on l1
       IntAna2d_AnaIntersection inter(l1_2d->Lin2d(),c2d->Circ2d());
       gp_Pnt2d pint1(inter.Point(1).Value());
       gp_Pnt2d pint2(inter.Point(2).Value());
     gp_Lin Media(myCenter, gpl1.Direction());
     Standard_Real pcurpos = ElCLib::Parameter(Media, curpos);
     myCenter =  ElCLib::Value(pcurpos, Media);
-    // on translate le centre de facon a avoir un rayon constant!
+    // the centre is translated to avoid a constant radius!
     myCenter.Translate(-theLength*gp_Vec(gpl1.Direction()));
     gp_Ax2 AX(myCenter,theaxis,gpl1.Direction());
     Handle(Geom_Circle)  circle = new Geom_Circle(AX,theLength);
 
-    // remise a jour de curpos
+    // re-update curpos
     pcurpos = ElCLib::Parameter(circle->Circ(), curpos);
     curpos = ElCLib::Value(pcurpos, circle->Circ());
 
     Handle(Geom2d_Curve) geoCurve = GeomAPI::To2d(circle,myPlane->Pln());
     Handle(Geom2d_Circle) c2d = *((Handle(Geom2d_Circle)*)& geoCurve);
-    // calcul du point d'intersection du cercle avec l1
+    // calculate the point of intersection of circle with l1
     IntAna2d_AnaIntersection inter(l1_2d->Lin2d(),c2d->Circ2d());
     gp_Pnt2d pint1(inter.Point(1).Value());
     gp_Pnt2d pint2(inter.Point(2).Value());
     else myFAttach = Int2;
     P1 = myFAttach;
     
-    // calcul du point d'intersection du cercle avec l2
-    // -> c'est la projection car le cercle a son centre
-    //    au milieu de l1 et l2
+    // calculate the point of intersection of circle with l2
+    // -> this is the projection because the centre of circle
+    //    is in the middle of l1 and l2
     Standard_Real pparam = ElCLib::Parameter(gpl2,myFAttach);
     mySAttach = ElCLib::Value(pparam, gpl2);
 
 
 //=======================================================================
 //function : Compute2DSelection
-//purpose  : calcule les zones de selection sur une cote d'angle entre 2
-//           edges
-//            Traitement particulier pour les angles nuls!
+//purpose  : compute zones of selection on a side of angle between 2 edges
+//           Special processing of zero angles!
 //=======================================================================
 
 void AIS_AngleDimension::Compute2DSelection(const Handle(SelectMgr_Selection)& aSelection)
   }
   
   //----------------------------------------------------------
-  //  Cas classique ( angle != 0 )
+  //  Classic case  ( angle != 0 )
   else {
 
     if (myFDir.IsParallel(mySDir,Precision::Angular())) {
       
       if (uco > ufin) {
        if (Abs(myVal)<PI) {
-         // test si uco est dans le secteur oppose 
+         // test if uco is in the opposing sector 
          if (uco > udeb+PI && uco < ufin+PI){
            udeb = udeb + PI;
          ufin = ufin + PI;
       p1   = ElCLib::Value(udeb,cer);
       p2   = ElCLib::Value(ufin,cer);
       
-      //Creation des 2 owners pour chaque partie de la fleche
+      //Create 2 owners for each part of the arrow
       Handle(AIS_DimensionOwner) own1 = new AIS_DimensionOwner(this,7);
       Handle(AIS_DimensionOwner) own2 = new AIS_DimensionOwner(this,7);
       if (myExtShape != 0) {
 
   if (uco > ufin) {
     if (Abs(myVal)<PI) {
-      // test si uco est dans le secteur oppose 
+      // test if uco is in the opposing sector 
       if (uco > udeb+PI && uco < ufin+PI){
        udeb = udeb + PI;
        ufin = ufin + PI;
     }
   }
 
-  //Creation des 2 owners pour chaque partie de la fleche
+  //Create 2 owners for each part of the arrow
   Handle(AIS_DimensionOwner) own1 = new AIS_DimensionOwner(this,7);
   Handle(AIS_DimensionOwner) own2 = new AIS_DimensionOwner(this,7);
   if (myExtShape != 0) {
     aSelection->Add(scurv);
   }
   else {
-    // on trace un bout de segment pour permettre la selection
+    // find end of segment to allow selection
     gp_Vec VTrans(myFDir.Crossed(Norm));
     Handle(Select3D_SensitiveSegment) seg1;
     seg1 = new Select3D_SensitiveSegment(own1, 
 
   
   myCenter = gcirc1->Location();
   
-  // on choisit le rayon egal a 1/5 ieme du rayon du plus petit des
-  // 2 cercles. On impose une borne sup au rayon( 0.02 au hasard)
+  // choose the radius equal to 1/5 of the smallest radius of 
+  // 2 circles. Limit is imposed ( 0.02 by chance)
   Standard_Real rad1 = gcirc1->Radius();
   Standard_Real rad2 = gcirc2->Radius();
   myRad = (rad1 > rad2 ) ? rad2 : rad1;
   if (myRad > 15.) myRad =15.;
   
   
-  //Calcul d'un point du cercle de rayon myRad
+  //Calculate a point of circle of radius myRad
   gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() );
   gp_Vec vectrans(vec);
   myPnt = myCenter.Translated(vectrans.Multiplied(myRad));
 {
   Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
   
-  //Creation de 2 sensitives cercles
-     // le plus grand
+  //Creation of 2 sensitive circles
+     // the greater
   gp_Ax2 ax(myCenter, myDir);
   Handle(Geom_Circle) Circ = new Geom_Circle(ax, myRad) ;
   Handle(Select3D_SensitiveCircle) 
     sensit = new Select3D_SensitiveCircle (own,
                                           Circ);
   aSelection->Add(sensit);
-     // le plus petit
+     // the smaller
   Circ->SetRadius(myRad/2);
   sensit = new Select3D_SensitiveCircle (own,
                                         Circ);
   aSelection->Add(sensit);
 
-  //Creation de 2 segments sensitifs pour la croix
+  //Creation of 2 segments sensitive for the cross
   Handle(Select3D_SensitiveSegment) seg;
   gp_Pnt otherPnt = myPnt.Mirrored(myCenter);
   seg = new Select3D_SensitiveSegment(own,
 
 void AIS_ConnectedInteractive::
 Connect(const Handle(AIS_InteractiveObject)& anotherIObj)
 {
-  // Pour Avoir le temps de faire le Disconnect en dessous, 
-  // on garde l'ancien un peu. SMO. 
+  // To have the time to Disconnect below, 
+  // the old is kept for a while. 
   if(myReference==anotherIObj) return;
   myOldReference = myReference;
 //Disconnect();
   if(myLocation!=aLocation)
     myLocation = aLocation;
   if(myReference!=anotherIobj) {
-    myOldReference = myReference; // necessaire pour pouvoir faire le disconnect en dessous..
+    myOldReference = myReference; // necessary to disconnect below..
 //  Disconnect();
     myReference = anotherIobj;}
   
 
       Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
       defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
 
-      // traitement HLRAngle et HLRDeviationCoefficient()
+      // process HLRAngle and HLRDeviationCoefficient()
       Standard_Real prevangl = myDrawer->HLRAngle();
       Standard_Real newangl = defdrawer->HLRAngle();
       if (Abs(newangl- prevangl) > Precision::Angular()) {
 {
   UpdateShape();
   aSelection->Clear();
-  // On regarde s'il n'y a pas des choses a faire sur la reference,
-  // du type mise a jour...
+  // It is checked if there is nothing to do with the reference
+  // of type update...
   
   if(!myReference->HasSelection(aMode))
     myReference->UpdateSelection(aMode);
   if(RefSel->UpdateStatus()==SelectMgr_TOU_Full)
     myReference->UpdateSelection(aMode);
 
-  //suivant le type de decomposition, on deduit les primitives connectees.
-  // il faut suivre l'ordre de creation de StdSelect_BRepSelectionTool...
+  // depending on the type of decomposition, connected primitives are subtracted
+  // it is necessary to follow the order of creation of StdSelect_BRepSelectionTool...
   
   TopAbs_ShapeEnum TheType = AIS_Shape::SelectionType(aMode);
   Handle(StdSelect_BRepOwner) OWNR;
   case TopAbs_SHAPE:
   default:
     {
-      // Dans ce cas on n'a qu'un seul proprietaire pour l'ensemble des
-      // primitives sensibles...
+      // In case if there is only one owner of the set of
+      // sensible primitives...
       OWNR = new StdSelect_BRepOwner(myOwnSh,this);
       Standard_Boolean FirstIncr(Standard_True);
       for(RefSel->Init();RefSel->More();RefSel->Next()){
 {
   if(myReference.IsNull()) return;
 
-  // attention grosse ligne...
+  // attention great line...
   if(myReference->Type()!=AIS_KOI_Shape) return;
 
   Standard_Integer Sig = myReference->Signature();
 
     Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );
   }
 
-  // recherche points attache
+  // find attach points
   if (!isInfinite1) {
     if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12;
     else FirstAttach = ptat11;
   // computation of Val
   Val = FirstAttach.Distance(SecondAttach);
   
-  //Display des morceaux de raccordement vers la curve si elle
-  // n'est pas dans le WP
+  //Display the pieces of attached to the curve if it is not 
+  // in the WP
   if (!isOnPlanEdge) { // add presentation of projection of the edge in WP
       AIS::ComputeProjEdgePresentation(aPresentation,aDrawer,theedge,aCurve,ptonedge1,ptonedge2);
       }
 
   if(IO.IsNull()) 
     return Standard_False;
 
-  // le type de l'ais n'est pas dans la map...
+  // type of AIS is not in the map...
   if(!myStoredTypes.IsBound(IO->Type()))
     return myIsExclusionFlagOn ;
-  // le type de l'ais est dans la map et il n'y a pas de signature precisee
+  // type of AIS is not in the map and there is no signature indicated
   if(myStoredTypes(IO->Type()).IsEmpty())
     return !myIsExclusionFlagOn ;
-  // il y a une ou des signatures precisees...
+  // one or several signatures are indicated...
   if(IsSignatureIn(IO->Type(),IO->Signature()))
     return !myIsExclusionFlagOn;
   
 
 {
   aPresentation->Clear();
 
-  // Calcul du point de positionnement du symbole et du
-  // point d'attache du segment de raccord sur la shape
+  // Calculate position of the symbol and
+  // point of attach of the segment on the shape
   gp_Pnt curpos;
   if (myFShape.ShapeType() == TopAbs_VERTEX)
     ComputeVertex(TopoDS::Vertex(myFShape), curpos);
   const gp_Dir& nor = myPlane->Axis().Direction();
 
   
-  // calcul de la presentation
-  //definition de la taille du symbole
+  // calculate presentation
+  // definition of the symbol size
 #ifdef BUC60915
   if( !myArrowSizeIsDefined )
 #endif
     myArrowSize = 5.;
 
-    //creation du presentable
+    //creation of the presentation
   DsgPrs_FixPresentation::Add(aPresentation,
                              myDrawer,
                              myPntAttach,
 {
   Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
 
-  // creation d'un segment sensible pour le segment de raccordement 
-  // de la shape fixe au symbole 'Fix'
+  // creation of segment sensible for the linked segment  
+  // of the shape fixed to symbol 'Fix'
   Handle(Select3D_SensitiveSegment) seg;
   seg = new Select3D_SensitiveSegment(own,
                                      myPntAttach,
                                      myPosition);
   aSelection->Add(seg);
   
-  // Creation de la zone sensible du symbole 'Fix'
+  // Creation of the sensible zone of symbol 'Fix'
   gp_Dir norm = myPlane->Axis().Direction();
     
   gp_Vec dirac(myPntAttach,myPosition);
                                        const gp_Pnt& lastp2) const 
 {
   //---------------------------------------------------------
-  // calcul du point d'attache
+  // calculate the point of attach
   //---------------------------------------------------------
   gp_Pnt curpos;
 
                                        const gp_Pnt& lastp) const 
 {
   //---------------------------------------------------------
-  // calcul du point d'attache
+  // calculate the point of attach
   //---------------------------------------------------------
   gp_Pnt curpos;
 
   //---------------------------------------------------------
   // calcul du point de positionnement du symbole 'fix'
   //---------------------------------------------------------
-        //--> Dans le cas d'une droite
+        //--> In case of a straight line
   if (curEdge->IsKind(STANDARD_TYPE(Geom_Line))){
     gp_Lin glin = Handle(Geom_Line)::DownCast(curEdge)->Lin();
     Standard_Real pfirst(ElCLib::Parameter(glin,ptbeg));
     ComputeLinePosition(glin, curpos, pfirst, plast);
   }
   
-        //--> Dans le cas d'un cercle
+        //--> In case of a circle
   else if (curEdge->IsKind(STANDARD_TYPE(Geom_Circle))) {
     gp_Circ  gcirc = Handle(Geom_Circle)::DownCast(curEdge)->Circ();
     Standard_Real pfirst, plast;
                                          Standard_Real& plast)
 {
   if (myAutomaticPosition) {
-    // le point d'attache est choisi comme milieu du segment
+    // point of attach is chosen as middle of the segment
     myPntAttach = ElCLib::Value((pfirst+ plast)/2, glin);
     
     gp_Dir norm = myPlane ->Axis().Direction();
     pos = myPosition;
     Standard_Real linparam = ElCLib::Parameter(glin, pos);
 
-    //cas ou la projection de position se situe entre les 2 vertex
+    // case if the projection of position is located between 2 vertices
     // de l'edge
     if ( (linparam >= pfirst) && (linparam <= plast) )
       myPntAttach = ElCLib::Value(linparam,glin);
     
-    // cas ou la projection de Position est en dehors des limites
-    // de l'edge : alors on choisit comme point d'attache le point
-    // le plus proche de la projection
+    // case if the projection of Position is outside of the limits
+    // of the edge : the point closest to the projection is chosen 
+    // as the attach point
     else {
       Standard_Real pOnLin;
       if (linparam > plast)
        Standard_Real& pfirst, 
        Standard_Real& plast)
 {
-  // reajustement des parametres sur le cercle
+  // readjust parametres on the circle
   if (plast > 2*PI ) {
     Standard_Real nbtours = Floor(plast / (2*PI));
     plast -= nbtours*2*PI;
   }
 
   if (myAutomaticPosition) {
-    // le point d'attache est le "milieu" du segment (par rapport
-    // aux parametres des vertex de debut et de fin de l'edge
+    // the point attach is the "middle" of the segment (relatively
+    // to the parametres of start and end vertices of the edge
     
     Standard_Real circparam = (pfirst + plast)/2.;
 
   } // if (myAutomaticPosition)
 
   else {
-    // cas ou la projection de myPosition est en dehors des 2
-    // vertex de l'edge. Dans ce cas on reajuste le parametre
-    // dans la portion valable du cercle
+    // case if the projection of myPosition is outside of 2
+    // vertices of the edge. In this case the parameter is readjusted
+    // in the valid part of the circle
     pos = myPosition;
 
     Standard_Real circparam = ElCLib::Parameter(gcirc, pos);
 
 //           "identic" presentation
 // note    : if we are in the case of lines, we create a segment between
 //           myFAttach and mySAttach. In the case of Circles, we create
-//           an arc of circle between the sames points.We Add a segment
+//           an arc of circle between the sames points. We Add a segment
 //           to link Position to its projection on the curve described
 //           before.
 //=======================================================================
              seg = new Select3D_SensitiveSegment(own, myFAttach, mySAttach);
              aSelection->Add(seg);
              
-             //attach = projection de Position() sur la curve;
+             //attach = projection of Position() on the curve;
              gp_Vec v1 (myFAttach, mySAttach);
              gp_Vec v2 (myFAttach, myPosition);
              if ( v1.IsParallel(v2, Precision::Angular()) )
   //  Treatement of the case of circles
   else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) && curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) {
     //gp_Pnt curpos;
-    isCircle = Standard_True; // usefull for ComputeSelection
+    isCircle = Standard_True; // useful for ComputeSelection
     const Handle(Geom_Circle)& thecirc = (Handle(Geom_Circle)&) curv1;
     ComputeTwoCirclesPresentation(aPrs, thecirc, firstp1, lastp1, firstp2, lastp2);
   }
   else
     return;
 
- // Calcul de la presentation des edges projettees
+ // Calculate presentation of projected edges
  if ( (myExtShape != 0) &&  !extCurv.IsNull()) {
    if (myExtShape == 1 )
      ComputeProjEdgePresentation(aPrs, TopoDS::Edge(myFShape), curv1, firstp1, lastp1);
                                  vals,
                                  myFAttach,
                                  curpos);
-  // Calcul de la projection du vertex
+  // Calculate the projection of vertex
   if ( myExtShape == 1)
     ComputeProjVertexPresentation(aPrs,FVertex,myFAttach);
   else if ( myExtShape == 2)
 //function : ComputeDirection
 //purpose  : Compute a direction according to the different geometric
 //           elements connected to the vertex <VERT>, in way to not have
-//            overlap between the symbol and them.
+//           overlap between the symbol and them.
 //=======================================================================
 Standard_Boolean AIS_IdenticRelation::ComputeDirection(const TopoDS_Wire& aWire, 
                                                       const TopoDS_Vertex& VERT, 
   if (myFShape.ShapeType() == TopAbs_VERTEX) {
     V = TopoDS::Vertex(myFShape);
     E = TopoDS::Edge(mySShape);
-    numedge = 2;// edge = 2 iem shape
+    numedge = 2;// edge = 2nd shape
   }
   else {
     V = TopoDS::Vertex(mySShape);
     E   = TopoDS::Edge(myFShape);
-    numedge = 1;  // edge = 1 ere shape
+    numedge = 1;  // edge = 1st shape
   }
   gp_Pnt ptonedge1,ptonedge2;
   Handle(Geom_Curve) aCurve;
   aPrs->SetInfiniteState(isInfinite);
   AIS::ComputeGeometry(V, myFAttach, myPlane, isOnPlanVertex);
 
-  // on considere que seule la courbe peut etre projetee 
+  // only the curve can be projected 
   if (!isOnPlanEdge && !isOnPlanVertex) return;
 
   if (!isOnPlanEdge) {
                                  myFAttach,
                                  curpos);
   if (myExtShape != 0) {
-    if (!extCurv.IsNull()) { // c'est l'edge qui n'est pas dans le WP
+    if (!extCurv.IsNull()) { // the edge is not in the WP
      ComputeProjEdgePresentation(aPrs,E,(Handle(Geom_Line)&) aCurve,ptonedge1,ptonedge2);
     }
   }
 
   if(myObjects.IsBound(anIObj)) return Standard_False;
   if(WhichContext!=-1 && !myLocalContexts.IsBound(WhichContext)) return Standard_False;
   
-  // Protection : si on essaye de conserver un objet temporaire
-  // qui n'est pas dans le contexte local actif... rob 11-06-97
+  // Protection : if one tries to preserve a temporary object
+  // which is not in the local active context... rob 11-06-97
 
   Standard_Integer IsItInLocal = myCurLocalIndex;
   Standard_Boolean Found(Standard_False);
       Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
       // ENDCLE
 #ifndef OCC4373      
-      // l'objet interactif n'avait pas de mode propre : OldMode = Mode Session
-      //                    avait deja un mode propre  : OldMode = ancien mode Propre
+      // the interactive object has no mode : OldMode = Mode Session
+      //                    already has a mode : OldMode = old mode Propre
 
       Standard_Integer OldMode = anIObj->HasDisplayMode() ?  anIObj->DisplayMode(): myDisplayMode;
       
   if(!anIObj->HasInteractiveContext())
     anIObj->SetContext(this);
 
-  // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+  // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
   if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
   if(anIObj->Signature()!=0) return;
   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationCoefficient(aCoefficient);
  
   if(!anIObj->HasInteractiveContext())
     anIObj->SetContext(this);
-  // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+  // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
   if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
   if(anIObj->Signature()!=0) return;
   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationCoefficient(aCoefficient);
  
   if(!anIObj->HasInteractiveContext())
     anIObj->SetContext(this);
-  // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
   if(anIObj->Type()!=AIS_KOI_Shape) return;
   if(anIObj->Signature()!=0) return;
   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationAngle(anAngle);
   if(!anIObj->HasInteractiveContext())
     anIObj->SetContext(this);
 
-    // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
   if(anIObj->Type()!=AIS_KOI_Shape) return;
   if(anIObj->Signature()!=0) return;
   (*((Handle(AIS_Shape)*)&anIObj))->SetAngleAndDeviation(anAngle);
    if(!anIObj->HasInteractiveContext())
     anIObj->SetContext(this);
 
-    // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
   if(anIObj->Type()!=AIS_KOI_Shape) return;
   if(anIObj->Signature()!=0) return;
   (*((Handle(AIS_Shape)*)&anIObj))->SetHLRAngleAndDeviation(anAngle);
  
   if(!anIObj->HasInteractiveContext())
     anIObj->SetContext(this);
-    // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
   if( anIObj->Type()!=AIS_KOI_Shape) return;
   if(anIObj->Signature()!=0) return;
   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationAngle(anAngle);
                                                    Standard_Integer& TheIndex) const 
 {
   if(anIObj.IsNull()) return Standard_False;
-  // s'il existe au point neutre on retourne l'index 0
+  // if it exists at neutral point 0 index is returned
   if(myObjects.IsBound(anIObj)) {
     TheIndex = 0;
     return Standard_False;
   HLA->SetWidth(1);
   HLA->SetTypeOfLine(Aspect_TOL_DASH);
 
-  // tolerance a 4 pixels...
+  // tolerance to 4 pixels...
 #ifdef BUC60688
   SetSensitivity();
 #else
 
         if ( !myLocalContexts( myCurLocalIndex )->Filter()->IsOk( selector->OnePicked() ) )
           return AIS_SOD_AllBad;
     
-    // si c'est le meme qu'au coup precedent -> fin
+ 
     // Does nothing if previously detected object is equal to the current one
     if ( selector->OnePicked()->Selectable() == myLastPicked )
       return AIS_SOD_OnlyOneDetected;
-    //si le precedent est un objet courant, on ne le desilighte pas, sinon si
-    
+ 
     // Previously detected object is unhilighted if it is not selected or hilighted 
     // with selection color if it is selected. Such highlighting with selection color 
     // is needed only if myToHilightSelected flag is true. In this case previously detected
       myLastinMain = myLastPicked;
     else 
       myLastinColl = myLastPicked;
-    // si l'objet detecte n'est pas courant, on le hilighte...
 #ifdef IMP191001
     // Highlight detected object if it is not selected or myToHilightSelected flag is true
     if ( !myLastPicked.IsNull() && 
                                                const Handle(V3d_View)& aView,
                                                const Standard_Boolean updateviewer)
 {
-  // on prend  tous les objets detectes par le selecteur, on vide les precedents objets courants,
-  // on met les nouveaux...
+  // all objects detected by the selector are taken, previous current objects are emptied,
+  // new objects are put...
 
   if(HasOpenedContext())
     return myLocalContexts(myCurLocalIndex)->Select(XPMin,YPMin,XPMax,YPMax,aView,updateviewer);
                                                const Handle(V3d_View)& aView,
                                                const Standard_Boolean updateviewer)
 {
-  // on prend  tous les objets detectes par le selecteur, on vide les precedents objets courants,
-  // on met les nouveaux...
+  // all objects detected by the selector are taken, previous current objects are emptied,
+  // new objects are put...
 
   if(HasOpenedContext())
     return myLocalContexts(myCurLocalIndex)->Select(aPolyline,aView,updateviewer);
     if(myWasLastMain)
       return myLocalContexts(myCurLocalIndex)->Select(updateviewer);
     else
-      // on a picke dans le collecteur, il faut faire un traitement special...
+      // picking was done in the collector, special processing is required...
       {
        myLocalContexts(myCurLocalIndex)->SetSelected(myLastPicked,updateviewer);
        return AIS_SOP_OneSelected;
 void AIS_InteractiveContext::SetCurrentObject(const Handle(AIS_InteractiveObject)& anIObj,
                                              const Standard_Boolean updateviewer)
 {
-  // traitement d'un cas singulier...
+  // single case processing...
   if(NbCurrents()==1 && anIObj->State()==1){
     Quantity_NameOfColor HiCol;
     Standard_Boolean HasHiCol;
       sel->Next();
     }
     
-    // ajout pour ne pas faire d'updateviewer intempestif...
+    // added to avoid untimely viewer update...
     AIS_Selection::ClearAndSelect(anIObj);
     anIObj->State(1);
     Quantity_NameOfColor HiCol;
 
 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
 #include <AIS_Selection.hxx>
 
+
+static TColStd_ListIteratorOfListOfInteger ItL;
 //=======================================================================
 //function : OpenLocalContext
 //purpose  : 
                  const Standard_Boolean /*BothViewers*/)
 {
 
-  // on dehilighte les eventuelles entitees detectees juste avant l'ouverture
-  // du contexte...
+  // the entities eventually detected just before the context was opened are unhighlighted...
   if(!IsCurrent(myLastPicked)){
     if(!myLastPicked.IsNull()){
       Standard_Integer HiMod = myLastPicked->HasHilightMode()?myLastPicked->HilightMode():0;
       myLocalContexts(myCurLocalIndex)->UnhilightLastDetected(mylastmoveview);
   }
   
-  // on met a 0 les entites liees a la selection dynamique au point neutre.
+  // entities connected to dynamic selection at neutral point are set to 0.
   
   myLastinMain.Nullify();
   myLastinColl.Nullify();
                                                           UseDisplayedObjects,
                                                           AllowShapeDecomposition,
                                                           AcceptEraseOfTemporary);
-  NewLocal->MainSelector()->Set ((myLocalContexts.Extent() > 0)
-    ? myLocalContexts (untilnow)->MainSelector()->Projector()
-    : myMainSel->Projector());
-
+  
+  // rob 16/04/97 Problems of asynchronous orders
+  if(myLocalContexts.Extent()>0){
+    const Select3D_Projector& Prj = myLocalContexts(untilnow)->MainSelector()->Projector();
+    NewLocal->MainSelector()->Set(Prj);
+  }
+  else{
+    const Select3D_Projector& Prj = myMainSel->Projector();
+    NewLocal->MainSelector()->Set(Prj);
+  }
+  
   NewLocal->MainSelector()->UpdateConversion();
-
+  
   myLocalContexts.Bind(myCurLocalIndex,NewLocal);
 
+
 #ifdef DEB
   cout<<"\tOpen Local Context No "<<myCurLocalIndex<<endl;
   if(UseDisplayedObjects){
     cout<<"\t\tNo Objects Were Loaded "<<endl;
 #endif
   return myCurLocalIndex;
+  
 }
 
 //=======================================================================
    return;
  }
  
- // On va fermer le seul contexte local ouvert...
+ // the only open local context is closed...
  if(myLocalContexts.Extent()==1 && GoodIndex == myCurLocalIndex){
    
    Standard_Boolean updateproj = !(myLocalContexts(myCurLocalIndex)->HasSameProjector(myMainSel->Projector()));
      cout<<"No More Opened Local Context "<<endl;
  }
  
- // Sinon on aura encore un contexte local d'ouvert apres la fermeture du courant
+ // Otherwise the local context will be still open after the current is closed
  else{
    Handle(StdSelect_ViewerSelector3d) VS = myLocalContexts(GoodIndex)->MainSelector();
    myLocalContexts(GoodIndex)->Terminate();
    myLocalContexts.UnBind(GoodIndex);
-   // on ferme le courant...
+   // the current is closed...
    if(GoodIndex==myCurLocalIndex){
      myCurLocalIndex = HighestIndex();
      const Handle(AIS_LocalContext)& LocCtx = myLocalContexts(myCurLocalIndex);
 {
   if(!HasOpenedContext()){
     if(!myObjects.IsBound(anIObj)) return;
-    TColStd_ListIteratorOfListOfInteger ItL;
     for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
         ItL.More();
         ItL.Next()){
 ActivatedModes(const Handle(AIS_InteractiveObject)& anIObj, 
                TColStd_ListOfInteger& theList) const 
 {
-  TColStd_ListIteratorOfListOfInteger ItL;
   if(!HasOpenedContext()){
     if(myObjects.IsBound(anIObj)){
+      //ItL is a static variable... 
       for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
           ItL.More();
           ItL.Next())
     if(myObjects.IsBound(anIObj)){
       const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
       STAT->SubIntensityOn();
-      TColStd_ListIteratorOfListOfInteger ItL;
       for (ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
         myMainPM->Color(anIObj,mySubIntensity,ItL.Value());
     }
     if(myObjects.IsBound(anIObj)){
       const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
       STAT->SubIntensityOff();
-      TColStd_ListIteratorOfListOfInteger ItL;
       for (ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
         myMainPM->Unhighlight(anIObj,ItL.Value());
       if(STAT->IsHilighted())
 //=======================================================================
 void AIS_InteractiveContext::SubIntensityOff(const Standard_Boolean updateviewer)
 {
+  
   if(!HasOpenedContext()) return;
-
+  
   AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
-  TColStd_ListIteratorOfListOfInteger ItL;
+  
   for(;It.More();It.Next()){
     const Handle(AIS_GlobalStatus)& STAT = It.Value();
     if(STAT->IsSubIntensityOn())
     for(ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
       myMainPM->Unhighlight(It.Key());
   }
-
+  
   if(updateviewer) myMainVwr->Update();
 }
 
     Standard_Address Add = G->Owner();
     if(Add==NULL){
       G->Erase();
-      G->Clear();// ca veut dire qu'elle n'est pas reference comme une presentation d'un InterfactiveObject...
+      G->Clear();// it means that it is not referenced as a presentation of InterfactiveObject...
       NbCleared++;
     }
     Handle(AIS_InteractiveObject) IO = (AIS_InteractiveObject*)Add;
 {
   Standard_Boolean upd_main(Standard_False),upd_col(Standard_False);
   TColStd_ListIteratorOfListOfInteger itl;
-
+  
   for (AIS_DataMapIteratorOfDataMapOfIOStatus it(myObjects);it.More();it.Next()){
     const Handle(AIS_InteractiveObject)& iobj = it.Key();
     const Handle(AIS_GlobalStatus)& STAT = it.Value();
     case AIS_DS_Displayed:{
       upd_main = Standard_True;
       
-      // partie display...
+      // part display...
       for(itl.Initialize(STAT->DisplayedModes());itl.More();itl.Next())
         myMainPM->Display(iobj,itl.Value());
       if(STAT->IsHilighted()){
         else
           Hilight(iobj,Standard_False);
       }
-      //partie selection
+      //part selection
       for(itl.Initialize(STAT->SelectionModes());itl.More();itl.Next()){
         if(itl.Value()!=-1)
           mgrSelector->Activate(iobj,itl.Value(),myMainSel);
 
 
 //=======================================================================
 //function : Constructor
-//purpose  : TwoFacesLength dimension  (avec position et texte)
+//purpose  : TwoFacesLength dimension  (with position and text)
 //=======================================================================
 
 AIS_LengthDimension::AIS_LengthDimension(const TopoDS_Face& aFirstFace,
 
 //=======================================================================
 //function : AIS_LengthDimension
-//purpose  : Distance Face - Edge pour chamfrein 3D
-//           Ajout Jean-Claude Vauthier le 17/06/98
+//purpose  : Distance Face - Edge for chamfer 3D
 //=======================================================================
 
 AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Face& Face,const TopoDS_Edge& Edge,const Standard_Real Val,const TCollection_ExtendedString& Text)
     switch (myFShape.ShapeType()) {
     case TopAbs_FACE:
       {
-        // cas longueur sur une face
+        // case length on a face
         ComputeOneFaceLength(aPresentation);
       }
       break;
     case TopAbs_EDGE:
       {
-        // cas longueur d'un edge
+        // case length of an edge
         ComputeOneEdgeLength(aPresentation);
       }
       break;
     case TopAbs_FACE:
       {
        if (mySShape.ShapeType () == TopAbs_FACE) {
-         // cas longueur entre deux faces
+         // case length between two faces
          ComputeTwoFacesLength(aPresentation);
        }
        else if (mySShape.ShapeType () == TopAbs_EDGE) {
                                        mySymbolPrs );
         }
         else if (mySShape.ShapeType() == TopAbs_EDGE) {
-          // cas longueur entre deux edges
+          // case length between two edges
 #ifdef BUC60915
          if( !myArrowSizeIsDefined ) 
 #endif
       myDrawer->LengthAspect()->Arrow1Aspect()->SetLength( myArrowSize );
       myDrawer->LengthAspect()->Arrow2Aspect()->SetLength( myArrowSize );
 
-      // Recherche du texte de la cote
+      // Find text of the face
 
       DsgPrs_LengthPresentation::Add( aPresentation,
                                      myDrawer,
     else {
       curpos.SetXYZ((l1.Location().XYZ()+l2.Location().XYZ())/2.);
     }
-    // offset pour eviter confusion Edge et Dimension
+    // offset to avoid confusion Edge and Dimension
     gp_Vec offset(DirAttach);
     offset = offset*ArrowSize*(-10.);
     curpos.Translate(offset);
     Position = curpos;
   }
-  else {    // on projette le point dans le plan
+  else {    // the point is projected in the plane
     // it is patch!
     Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );
   }
 
-  // recherche points attache
+  // find attachment points 
   if (!isInfinite1) {
     if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12;
     else FirstAttach = ptat11;
   if (FirstShape.ShapeType() == TopAbs_VERTEX) {
     thevertex = TopoDS::Vertex(FirstShape);
     theedge   = TopoDS::Edge(SecondShape);
-    numedge = 2;// edge = 2 iem shape
+    numedge = 2;// edge = 2nd shape
   }
   else {
     thevertex = TopoDS::Vertex(SecondShape);
     theedge   = TopoDS::Edge(FirstShape);
-    numedge = 1;  // edge = 1 ere shape
+    numedge = 1;  // edge = 1st shape
   }
 
   gp_Pnt ptonedge1,ptonedge2;
   aPresentation->SetInfiniteState(isInfinite);
   AIS::ComputeGeometry(thevertex, FirstAttach, Plane, isOnPlanVertex);
 
-  // on considere que seule la courbe peut etre projetee 
+  // take into consideration that only the curve can be projected 
   if (!isOnPlanEdge && !isOnPlanVertex)
     return;
 
   if (AutomaticPos) {
     gp_Pnt p = ElCLib::Value(ElCLib::Parameter(l,FirstAttach),l);
     gp_Pnt curpos((FirstAttach.XYZ()+p.XYZ())/2.);
-    // offset pour eviter confusion Edge et Dimension
+    // offset to avoid confusion Edge and Dimension
     gp_Vec offset(DirAttach);
     offset = offset*ArrowSize*(-10.);
     curpos.Translate(offset);
     Position = curpos;
   }
-  else {    // on projette le point dans le plan
+  else {    // the point is projected in the plane
     // it is patch!
     Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );
 
   if (AutomaticPos) {
    if (!samePoint) {
      gp_Pnt curpos((FirstAttach.XYZ()+SecondAttach.XYZ())/2.);
-     // offset pour eviter confusion Edge et Dimension
+     // offset to avoid confusion Edge and Dimension
      gp_Vec offset(DirAttach);
      offset = offset*ArrowSize*(-10.);
      curpos.Translate(offset);
   arr = la->Arrow2Aspect();
   arr->SetLength(ArrowSize);
 
-  // Type des fleches
+  // Type of arrows
   if ( ExtShape == 1) SymbolPrs = DsgPrs_AS_FIRSTPT_LASTAR;
   else if (ExtShape == 2) SymbolPrs = DsgPrs_AS_FIRSTAR_LASTPT;
 
                                  Position,
                                  SymbolPrs);
 
-  // Calcul de la projection du vertex
+  // Calculate the projection of the vertex
   if ( ExtShape == 1)
     AIS::ComputeProjVertexPresentation(aPresentation, aDrawer, FirstVertex, FirstAttach);
   else if ( ExtShape == 2)
 void AIS_LengthDimension::ComputeEdgeVertexSelection(const Handle(SelectMgr_Selection)& aSelection)
 {
   //  ********** NB ->
-  // dans le cas d'une contrainte par rapport au bord d'une face 
-  // seule la shape de ce contour est valide
+  // in the case of a constraint relatively to the border of a face 
+  // only the shape of this contour is valid
 
-  // Creation de 2 owner pour permettre l'edition de contraintes  
+  // Create 2 owner for edition of constraints  
   Handle(AIS_DimensionOwner) own1 = new AIS_DimensionOwner(this,7);
   Handle(AIS_DimensionOwner) own2 = new AIS_DimensionOwner(this,7);  
 
 
   if (!Proj1.IsEqual(Proj2,confusion)) L3 = gce_MakeLin(Proj1,Proj2);
   else { 
-    // cas ou la dimension est nulle
-    // on choisit le own1 par defaut
+    // cas of zero dimension
+    // own1 is chosen by default
     L3 = gce_MakeLin(Proj1,myDirAttach);
     Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6));
     Handle(Select3D_SensitiveBox) box = new Select3D_SensitiveBox(own1,myPosition.X(),myPosition.Y(),myPosition.Z(),
 
       Att->SetDecomposition(Standard_True);
     else 
       Att->SetDecomposition(Standard_False);
-    // statut temporaire ou non
+    // status temporary or not
     if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
        myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
       Att->SetTemporary(Standard_True);
   
   TColStd_ListIteratorOfListOfInteger It;
   Standard_Boolean jobdone(Standard_False);
-  // on regarde quel etaient ses attributs temporaires et on
-  // remet tout a 0
+  // it is checked which were the temporary attributes 
+  // and they are set to 0
 
-  // desactiver les modes stantard
+  // desactivate standard modes
   if(Att->Decomposed()){
     for(It.Initialize(myListOfStandardMode);It.More();It.Next()){
       mySM->Deactivate(aSelectable,It.Value(),myMainVS);
     }
   }
   
-  // si objet ou presentations temporaires...
+  // if object or temporary presentations...
   if(Att->IsTemporary())
     {
       if(Att->IsSubIntensityOn())
        myMainPM->Unhighlight(aSelectable,Att->HilightMode());
       
-      // enlever quand bug sur clear corrige...
+      // remove if bug on clear correct...
       myMainPM->Erase(aSelectable,Att->DisplayMode());
       myMainPM->Clear(aSelectable,Att->DisplayMode());
       if(myMainPM->IsDisplayed(aSelectable,Att->HilightMode()))
       //       myMainPM->Clear(aSelectable,Att->HilightMode());
       jobdone = Standard_True;
     }
-  // si sous intensite
+  // if below intensity
   else
     {
       if(Att->IsSubIntensityOn())
        myCTX->SubIntensityOff(aSelectable);
     }
-  // desactiver les modes propres stockes
+  // desactivate stored proper modes
   for(It.Initialize(Att->SelectionModes());It.More();It.Next()){
     mySM->Deactivate(aSelectable,It.Value(),myMainVS);
   }
-// pop : si je laisses cela plantes dans les elements de construction  
-//       alors a toi de jouer ROB
 //  RemoveSelected(aSelectable);
 
   if(IsSelected(aSelectable))
 void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
 {
   
-  //on verifie qu'il n'esiste pas deja dans la liste
+  //check if it is not in the list
   TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
   for(;It.More();It.Next())
     if(It.Value()==aType)  return;
   Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
   
 
-  // on cree de facon cachee un filtre repondant ok au type 
-  //sauf :
-  // si le type est shape...
-  // si des filtres agissent deja sur le  type <aType>
+  // create a hidden filter answering ok to the type except for :
+  // if the type is shape...
+  // if the filters already impact at the type <aType>
   if(aType != TopAbs_SHAPE){
     if(myStdFilters[IMode].IsNull())
       myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
       myFilters->Add(myStdFilters[IMode]);
   }
   
-  // on active le mode pour tous les objets de type Shape 
-  // acceptant la decomposition en mode standard.
+  // the mode is activated for all objects of type Shape 
+  // accepting the decomposition in standard mode.
   myListOfStandardMode.Append(IMode);
   
   AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
 
 void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
 {
-  // on regarde si le filtre agit sur un type de sous shape 
-  // active pour lequel on aurait deja mis un filtre de type...
+  // it is checked if the filter impacts at the type of active sub-shape 
+  // for which a filter of type has been already implemented...
 
   TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
   
 {
   if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
   
-  // on regarde si le filtre concernait un type standard active.
-  // si oui , on regarde s'il en existe de semblables encore
-  //      parmi les filtres restant..
-  //     s'il n'en reste pas , on remet le filtre standard
-  //     permettant de continuer a selectionner les modes
-  //     actifs...
+  // it is checked if the filter for type standard is active.
+  // if yes, it is checked there are still similarities among the
+  // remaining filters...
+  //     otherwise, the standard filter is restored to
+  //     continu selecting active modes...
   TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
   TopAbs_ShapeEnum SE;
   for(;It.More();It.Next()){
 
 
 
-Standard_Boolean AIS_LocalContext::HasSameProjector(const Handle(Select3D_Projector)& thePrj) const
+Standard_Boolean AIS_LocalContext::HasSameProjector(const Select3D_Projector& aPrj) const
 {
-  const Handle(Select3D_Projector)& aCurPrj = myMainVS->Projector();
-  if (aCurPrj->Perspective() != thePrj->Perspective())
-    return Standard_False;  
-  if (aCurPrj->Perspective() && aCurPrj->Focus() != thePrj->Focus())
-    return Standard_False;
-  const gp_GTrsf& aCurTrsf = aCurPrj->Transformation();
-  const gp_GTrsf& aPrjTrsf = thePrj->Transformation();
-
-  for (Standard_Integer i = 1; i <= 3; ++i)
-  {
-    for (Standard_Integer j = 1; j <= 3 ; ++j)
-    {
-      if (aCurTrsf.Value (i, j) != aPrjTrsf.Value (i, j))
-        return Standard_False;
+  const Select3D_Projector& CurPrj = myMainVS->Projector();
+  if(CurPrj.Perspective()!=aPrj.Perspective()) return Standard_False;  
+  if(CurPrj.Perspective())
+    if(CurPrj.Focus()!=aPrj.Focus()) return Standard_False;
+  gp_GTrsf CurTrsf(CurPrj.Transformation());
+  gp_GTrsf PrjTrsf(aPrj.Transformation());
+  
+  for(Standard_Integer i=1;i<=3;i++){
+    for(Standard_Integer j=1;j<=3;j++){
+      if(CurTrsf.Value(i,j)!=PrjTrsf.Value(i,j)) 
+       return Standard_False;
     }
   }
-
+  
   return Standard_True;
 }
 
   myMapOfOwner.Clear();
   
   mylastindex=0;
-  // nettoyons le selecteur...
+  // clear the selector...
   myMainVS->Clear();
   myCTX->SelectionManager()->Remove(myMainVS);
   
 {
   if(!myActiveObjects.IsBound(anObject)) return;
   
-  // pour voir si d'aventure l'objet est quelque part ailleurs...
+  // chieck if by hazard the object is somewhere else...
   Standard_Integer Indx;
   Standard_Boolean IsSomeWhereElse  = 
     myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
       
       const Handle(AIS_LocalStatus)& CurAtt = It.Value();
       //TColStd_ListIteratorOfListOfInteger ItL;
-      // si objet temporaire on efface ses presentations geree par myMainPM
+      // if object is temporary the presentations managed by myMainPM are removed
       AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
       
       if(TheDS != AIS_DS_Displayed){
 
                                               const Standard_Integer Ypix,
                                               const Handle(V3d_View)& aview)
 {
-  // d'abord voir ce que le ViewerSelector donne 
+  // check that ViewerSelector gives 
   if(aview->Viewer()== myCTX->CurrentViewer()) {
 #ifdef IMP160701
     //Nullify class members storing information about detected AIS objects.
       EO = myMainVS->Picked(i_detect);
       if(!EO.IsNull()){
        if(myFilters->IsOk(EO)) {
-         myDetectedSeq.Append(i_detect); // normalement ils sont deja ranges dans le bon ordre...
+         myDetectedSeq.Append(i_detect); // normallly they are already arranged in correct order...
 #ifdef IMP160701
         Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(EO->Selectable());
         if(!Handle(AIS_Shape)::DownCast(anObj).IsNull())
     }
     }
     
-    //resultat des courses..
+    //result of  courses..
     if(had_nothing || myDetectedSeq.IsEmpty()){
       if(mylastindex !=0 && mylastindex <= myMapOfOwner.Extent()){
 
       return (had_nothing ? AIS_SOD_Nothing : AIS_SOD_AllBad);
     }
     
-    // quelque chose...
-    // on passe tous les proprietaires detectes par le selecteur 
-    // aux filtres et on garde les bons..
+    // all owners detected by the selector are passed to the 
+    // filters and correct ones are preserved...
     myCurDetected = 1;
     EO = myMainVS->Picked(myDetectedSeq(myCurDetected));
     
     for(myMainVS->Init();myMainVS->More();myMainVS->Next()){
       const Handle(SelectMgr_EntityOwner)& OWNR = myMainVS->Picked();
       if(myFilters->IsOk(OWNR)){
-       // rangeons ce proprietaire au chaud, il pourrait servir...
+       // it can be helpfil to classify this owner immediately...
 #ifdef BUC60569
          Standard_Integer state = OWNR->State();
          if( state < 1 ){
   return AIS_SOP_Error;
 }
 //==================================================
-// Function: les objets deja selectionnes sont deselectionnes
-// Purpose : les autres sont selectionnes.
+// Function: the already selected objects are unselected
+// Purpose : others are selected.
 //==================================================
 AIS_StatusOfPick AIS_LocalContext::ShiftSelect(const Standard_Integer XPMin,
                                   const Standard_Integer YPMin,
 #ifdef BUC60774
       return LastExt == 0 ? AIS_SOP_NothingSelected:AIS_SOP_Removed;
 #else
-      return AIS_SOP_NothingSelected; // aucun effet si on a clique dans le vide
+      return AIS_SOP_NothingSelected; // no effet if click on empty space
 #endif
 
     AIS_Selection::SetCurrentSelection(mySelName.ToCString());
     for(myMainVS->Init();myMainVS->More();myMainVS->Next()){
       const Handle(SelectMgr_EntityOwner)& OWNR = myMainVS->Picked();
       if(myFilters->IsOk(OWNR)){
-       // rangeons ce proprietaire au chaud, il pourrait servir...
+       // it can be helpfil to classify this owner immediately...
 #ifdef BUC60953
         Standard_Integer state = OWNR->State();
         if( state < 1 ){
   Handle (PrsMgr_PresentationManager3d) PM = myMainPM;
   SelectMgr_DataMapOfObjectOwners aMap;
   
-  // pour eviter les Pbs quand on est dans une boucle de recherche des objets selectionnes....
+  // to avoid problems when there is a loop searching for selected objects...
 #if !defined OCC189 && !defined USE_MAP
   const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
   for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++)
 
 //=======================================================================
 //function : UpdateSelection
-//purpose  : devrait disparaitre ...
+//purpose  : should disappear...
 //=======================================================================
 void AIS_LocalContext::UpdateSelected(const Standard_Boolean updateviewer)
 {
   if(!IsValidForSelection(anIObj)) return;
   UnhilightPicked(Standard_False);
   
-  //1er cas , on trouve un proprietaire qui a deja <anIObj> comme proprietaire 
-  // et qui ne soit pas decompose...
+  //1st case, owner already <anIObj> as owner  
+  // and not separated is found...
 
   Handle(AIS_Selection) sel = AIS_Selection::Selection(mySelName.ToCString());
   //Standard_Boolean found(Standard_False);
   Handle(Standard_Transient) Tr;
   Handle(SelectMgr_EntityOwner) EO = FindSelectedOwnerFromIO(anIObj);
   if(EO.IsNull()){
-    //regardons s'il a dans sa selection numero 0 un proprietaire qu'on pourrait triturer...
+    //check if in selection number 0 there is an owner that can be triturated...
     if(anIObj->HasSelection(0)){
       const Handle(SelectMgr_Selection)& SIOBJ = anIObj->Selection(0);
       SIOBJ->Init();
 {
   if(!IsValidForSelection(anIObj)) return;
   UnhilightPicked(Standard_False);
-  // d'abord regardons s'il est selectionne...
+  // first check if it is selected...
   Handle(SelectMgr_EntityOwner) EO;
 
   EO = FindSelectedOwnerFromIO(anIObj);
 
 //=======================================================================
 //function : AddOrRemoveSelected
-//purpose  :  A revoir...
+//purpose  : To check...
 //=======================================================================
 void AIS_LocalContext::AddOrRemoveSelected(const TopoDS_Shape& Sh,
                                           const Standard_Boolean updateviewer)
   // OK...
   if(okStatus){
     //=======================================================================================================
-    // 2 cas : a- l'objet est dans la map des pickes:
-    //             1. c'est le meme index que le dernier detecte: ->On ne fait rien
-    //             2. sinon :
-    //                  - si lastindex = 0 (aucun objet detecte au dernier move)
-    //                    on hilighte la prs de l'objet et on met lastindex = index(objet)
-    //                  - sinon : 
-    //                           on "desighlighte" la prs de l'objet correspondant a lastindex
-    //                           voire on l'efface si l'objet n'est pas visualise mais juste actif
-    //                           puis on hilighte la Prs de l'objet detecte ici et on met lastindex = index(objet)
-    //         b- l'objet n'est pas dans la map des objets pickes
-    //                  - si lastindex != 0 (objet detecte au dernier move) on desighlighte ...
-    //            si l'objet a ete decompose, on cree une prs pour la shape detectee et on ajoute
-    //            le couple (Proprietaire,Prs) dans la map.
-    //           sinon on met dans la map le couple(proprietaire, NullPrs) et on hilighte l'objet interactif
-    //           lui meme.
+    // 2 cases : a- object is in the map of picks:
+    //             1. this is the same index as the last detected: -> Do nothing
+    //             2. otherwise :
+    //                  - if lastindex = 0 (no object was detected at the last step)
+    //                    the object presentation is highlighted and lastindex = index(objet)
+    //                  - othrwise : 
+    //                           the presentation of the object corresponding to lastindex is "unhighlighted" 
+    //                           it is removed if the object is not visualized but only active
+    //                           then the presentation of the detected object is highlighted and lastindex = index(objet)
+    //         b- the object is not in the map of picked objects
+    //                  - if lastindex != 0 (object detected at the last step) it is unhighlighted ...
+    //            if the object was decomposed, presentation is created for the detected shape and the couple
+    //             (Proprietaire,Prs)is added in the map.
+    //           otherwise the couple(proprietaire, NullPrs) is placed in the map and the interactive object 
+    //           itself is highlighted.
     //                              
     //=======================================================================================================
 
 {
   const Handle(SelectMgr_EntityOwner)& OWN = myMapOfOwner.FindKey(PickedIndex);
   Handle(SelectMgr_SelectableObject) aSel  = OWN->Selectable();
-  if (myActiveObjects.IsBound (aSel)) { // debug de jmi
+  if (myActiveObjects.IsBound (aSel)) { // debug of jmi
     const Handle(AIS_LocalStatus)& Stat      = myActiveObjects(aSel);    
     return Stat->Decomposed();
   }
 
 Standard_Integer AIS_LocalContext::HilightNextDetected(const Handle(V3d_View)& V)
 {
-  // on va jusqu'au prochain proprietaire
+  // go to the next owner
 
   if(myDetectedSeq.IsEmpty()) return Standard_False;
   Standard_Integer L = myDetectedSeq.Length();
 
 //=======================================================================
 //function : FindSelectedOwnerFromIO
-//purpose  : on regarde si l''un des proprietaires selectionnes represente
-//           effectivement IObj
+//purpose  : it is checked if one of the selected owners really presents IObj
 //=======================================================================
 Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromIO
                           (const Handle(AIS_InteractiveObject)& anIObj) const 
 
 //=======================================================================
 //function : FindSelectedOwnerFromShape
-//purpose  : on regarde si l''un des proprietaires selectionnes represente effectivement IObj
+//purpose  : it is checked if one of the selected owners really presents IObj
 //=======================================================================
 Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromShape(const TopoDS_Shape& sh) const 
 {
 
   else if (aMode == 1){
     if (!myIsXYZPlane){
       ComputeFrame();
-      // a mettre ailleurs sans doute...
       Handle(Prs3d_PlaneAspect) theaspect = myDrawer->PlaneAspect();
       Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation);
       gp_Pnt p1;
 void AIS_Plane::SetSize(const Standard_Real aXLength,
                        const Standard_Real aYLength)
 {
-  //si le plan a deja une couleur ou une taille propre, 
-  //il y a deja un PlaneAspect et un DatumAspect specifique 
+  //if the plane already has a proper color or size, 
+  //there is already a specific PlaneAspect and DatumAspect 
     
   Handle(Prs3d_PlaneAspect) PA; 
   Handle(Prs3d_DatumAspect) DA;
 
 //=======================================================================
 //function : UnsetSize
-//purpose  : S'il ya une couleur, on recupere la taille du drawer du context...
+//purpose  : If there is a color, the size is restaured from the drawer of the context...
 //=======================================================================
 void AIS_Plane::UnsetSize()
 {
 void AIS_Plane::SetColor(const Quantity_Color &aCol)
 #endif
 {
-  // si le plan a deja sa propre taille, il y a un deja planeaspect cree
+  // if the plane already has its proper size, there is an already created planeaspect 
 //  Standard_Boolean yenadeja = hasOwnColor || myHasOwnSize;
   Handle(Prs3d_PlaneAspect) PA; 
   Handle(Prs3d_DatumAspect) DA;
 
   DA->SecondAxisAspect()->SetColor(col);
   DA->SetDrawFirstAndSecondAxis(Standard_True);
   DA->SetDrawThirdAxis(Standard_False);
-  myDrawer->SetDatumAspect(DA); // odl - on en cree un specifique puisqu'on le modifie
+  myDrawer->SetDatumAspect(DA); // odl - specific is created because it is modified
   myShapes[0] = Position();
   myShapes[1] = XAxis();
   myShapes[2] = YAxis();
 
 #define MaxSizeOfResult 100000
 #endif
 
-// beurk mais moins qu''avant.... rob
 static void AIS_Sel_CurrentSelection (Handle(AIS_Selection)& InputSel)     
 {
   static Handle(AIS_Selection) theCurrentSelection;
 //=======================================================================
 Standard_Boolean AIS_Selection::SetCurrentSelection (const Standard_CString aName) 
 {  
-  AIS_Selection::CreateSelection(aName); // juste pour voir... ?????????????
+  AIS_Selection::CreateSelection(aName); 
 
 
   Handle(AIS_Selection) anAISSelection = AIS_Selection::Selection(aName) ;
     if(arr(i)==anObject)
       Found=i;
   }
-  // Il n''est pas dedans, on le rajoute....
+  // If it is not inside, it is added...
 
 #ifdef BUC60953
   if ( !selected || Found == -1 ) {
 #endif  
     if((S->myNb)+1>arr.Length()){
       Handle(TColStd_HArray1OfTransient) NiouTab = new TColStd_HArray1OfTransient(1,arr.Length()+MaxSizeOfResult);
-      // oui bon, mais...
       for(i=arr.Lower();i<=S->myNb;i++){
        const Handle(Standard_Transient)& T = S->myresult->Value(i);
        NiouTab->SetValue(i,T);
     S->myresult->SetValue(S->myNb,anObject);
     return AIS_SS_Added;
   }
-  // il etait dedans on l''enleve...
+  // it was inside and it is removed...
   for(i=Found;i<=S->myNb;i++)
     arr(i)=arr(i+1);
   S->myNb--;
   Standard_Integer i;
   if((S->myNb)+1>arr.Length()){
       Handle(TColStd_HArray1OfTransient) NiouTab = new TColStd_HArray1OfTransient(1,arr.Length()+MaxSizeOfResult);
-      // oui bon, mais...
       for(i=arr.Lower();i<=S->myNb;i++){
        const Handle(Standard_Transient)& T = S->myresult->Value(i);
        NiouTab->SetValue(i,T);
 
 // Created:    Fri Dec 20 17:18:37 1996
 // Author:     Robert COUBLANC
 //             <rob@robox.paris1.matra-dtv.fr>
-// Modified:    Christiane ARMAND: 5/05/97: dans le compute on prend en 
-//              compte le cas des objets infinis     
-//              ROB : introduction des primitives connectees
-//                    Pour le calcul des faces sensibles...
-//   oct-03-97  ROB : en fonction du type de shapes, on change les coeffs de polygonisation...
-//                    (correction du Pb des cercles pas assez discretises...)
 
 #define BUC60577       //GG_191099 Draw correct bounding box and Menage ...
 
   }
   
   
-  if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //pas de prise en compte lors du FITALL
+  if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //not taken in account duting FITALL
   switch (aMode) {
   case 0:{
     try { OCC_CATCH_SIGNALS  StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer); }
       cout << "AIS_Shape::Compute()  failed"<< endl;
 #endif
       cout << "a Shape should be incorrect : No Compute can be maked on it  "<< endl;     
-// on calcule une presentation de la boite englobante
+// presentation of the bounding box is calculated
 //      Compute(aPresentationManager,aPrs,2);
     }
     break;
          BRepTools::Clean(myshape);
        }
       
-      //shading seulement a partir de face...
+      //shading only on face...
       if ((Standard_Integer) myshape.ShapeType()>4)
        StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
       else {
     }
   case 2:
     {
-      // boite englobante
+      // bounding box
       if (IsInfinite()) StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
       else DisplayBox(aPrs,BoundingBox(),myDrawer);
     }
   Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
   defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
 
-// coefficients pour le calcul
+// coefficients for calculation
 
   Standard_Real prevangle, newangle ,prevcoeff,newcoeff ; 
   if (OwnHLRDeviationAngle(newangle,prevangle) || OwnHLRDeviationCoefficient(newcoeff, prevcoeff))
 #else
     TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
 #endif
-    if (!anExplor.More()) // Shape vide -> Assemblage vide.
+    if (!anExplor.More()) // empty Shape -> empty Assembly.
       return;
   }
 
   }
 #endif
 
-// POP on protege contre un plantage dans les couches basses
+// POP protection against crash in low layers
 
   Standard_Real aDeflection = myDrawer->MaximalChordialDeviation();
   if (myDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE)
   {
-    // On calcule la fleche en fonction des min max globaux de la piece:
+    // Vector is calculated depending on global min max of the part:
     Bnd_Box aBndBox; //= BoundingBox(); ?
     BRepBndLib::Add (shape, aBndBox);
     if (!aBndBox.IsVoid())
   myOwnColor  = aCol; 
   if(!myDrawer->HasShadingAspect()){
     Handle(Prs3d_ShadingAspect) asp = new Prs3d_ShadingAspect();
-// recuperons le materiau reference...
+// retrieve the reference materials...
     if(myDrawer->HasLink()){
       const Handle(Prs3d_Drawer)& refdr = myDrawer->Link();
       Graphic3d_MaterialAspect theRefMat = 
   myDrawer->SetUnFreeBoundaryAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
   myDrawer->SetSeenLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
 
-  // modif du shading rapide...
+  // fast shading modification...
   if(!GetContext().IsNull()){
     if( GetContext()->MainPrsMgr()->HasPresentation(this,1)){
       Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
 #else
       a4bis->SetInteriorColor(Quantity_Color(aCol)); // Already done above in SetColor(...)    
 
-//***test rob : pour avoir la vraie couleur demandee en shading ***
-// mais du coup, le shading est "plat" ...****
-//      Graphic3d_MaterialAspect FMAT = a4bis->FrontMaterial();
-//      FMAT.SetColor(Quantity_Color(aCol));
-//      a4bis->SetFrontMaterial(FMAT);
-//******
-
       P->SetPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
       G->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
 #endif
 
 void AIS_Shape::UnsetColor()
 {
-  // Evitons les stupidites...
   if(!HasColor() ){  myToRecomputeModes.Clear();
                     return;}
   
 #endif    
   }
   myOwnWidth = W;
-  LoadRecomputable(0); // signifier qu'il faut recalculer uniquement le wireframe....
-  LoadRecomputable(2); // et la boite englobante...
+  LoadRecomputable(0); // means that it is necessary to recompute only the wireframe....
+  LoadRecomputable(2); // and the bounding box...
   
 }
 
       G->SetGroupPrimitivesAspect(a4bis);
     }
   }
-  myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+  myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
   myToRecomputeModes.Clear();  
 }
 //=======================================================================
     G->SetGroupPrimitivesAspect(a4bis);
   }
 }
-  myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+  myRecomputeEveryPrs =Standard_False; // no mode to recalculate  :only viewer update
   myToRecomputeModes.Clear();  
 }
 
       G->SetGroupPrimitivesAspect(a4bis);
     }
   }
-  myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+  myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
   myToRecomputeModes.Clear();  
   
 }
       G->SetGroupPrimitivesAspect(a4bis);
     }
   }
-  myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+  myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
   myToRecomputeModes.Clear();  
   
 }
 #endif
     }
   }
-  myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+  myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
   myToRecomputeModes.Clear();  
 }
 
 #else
     TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
 #endif
-    if (!anExplor.More()) { // Shape vide -> Assemblage vide.
+    if (!anExplor.More()) { // empty Shape  -> empty Assembly.
       myBB.SetVoid();      
       return myBB;
     }
 
     }
 
   gp_Vec theVector;
-  gp_Pnt pint3d; // le point de tangence
-  gp_Dir theDir; // la direction de la tangente
+  gp_Pnt pint3d; // tangency point
+  gp_Dir theDir; // tangency direction
   Standard_Real par_inter = 0.0; // parameter of tangency point
 
   if (found)
       pint3d = BRep_Tool::Pnt(VCom);
     }
 
-  //Sinon, on le cherche comme si on savait que les 2 curves
-  // sont tangentes ( ce qui dooit etre le cas, tant pis pour les autres)
+  // Otherwise it is found as if it was known that 2 curves
+  // are tangents (which must be the cases)
   switch (typArg)
     {
-    case 12: // line circle
-      {
+    case 12: // circle line      
+       {
        const Handle(Geom_Line)& line = (Handle(Geom_Line)&) copy1;
        const Handle(Geom_Circle)& circle = (Handle(Geom_Circle)&) copy2;
 
        if ( !found )
          {
-           // il suffit de projeter le centre du cercle sur la droite
+           // it is enough to project the circus  center on the straight line 
            par_inter = ElCLib::Parameter(line->Lin(), circle->Location());
            pint3d = ElCLib::Value(par_inter, line->Lin());
          }
       
        if (!found)
          {
-           // il suffit de projeter le centre du cercle sur la droite
+           // it is enough to project the circus  center on the straight line 
            par_inter = ElCLib::Parameter(line->Lin(), circle->Location());
            pint3d = ElCLib::Value(par_inter, line->Lin());
          }
 
        BRepTools::Update(myshape);
 
        Handle(Graphic3d_StructureManager) aStrucMana = GetContext()->MainPrsMgr()->StructureManager();
-         {  
-           Handle(Prs3d_ShadingAspect) aPrs3d_ShadingAspect = new Prs3d_ShadingAspect;
-           myAspect = aPrs3d_ShadingAspect->Aspect();
-         }
+
+       myAspect = (new Prs3d_ShadingAspect())->Aspect();
        if (!DoMapTexture)
          {
            myAspect->SetTextureMapOff();
            dVmax = (Vmax - Vmin);
            Handle(Graphic3d_Group) mygroup = Prs3d_Root::CurrentGroup(aPrs);
 
-           Standard_Integer nnn = myT->NbTriangles();                                  // nnn : nombre de triangles
-           Standard_Integer nt, n1, n2, n3 = 0;                                                // nt  : triangle courant
-           // ni  : sommet i du triangle courant
+           Standard_Integer nnn = myT->NbTriangles();                                  // nnn : number of triangles
+           Standard_Integer nt, n1, n2, n3 = 0;                                                // nt  : current triangle
+           // ni  : top i of the current triangle
            for (nt = 1; nt <= nnn; nt++)                                       
              {
 #ifdef DEBUG
                cout << "On traite actuellement le triangle : "<< nt <<"\n";
 #endif                                         
-               if (SST.Orientation(myFace) == TopAbs_REVERSED)                 // si la face est "reversed"
-                 triangles(nt).Get(n1,n3,n2);                                          // le triangle est n1,n3,n2
+               if (SST.Orientation(myFace) == TopAbs_REVERSED)                 // if the face is "reversed"
+                 triangles(nt).Get(n1,n3,n2);                                          // the triangle is n1,n3,n2
                else 
-                 triangles(nt).Get(n1,n2,n3);                                          // le triangle est n1,n2,n3
+                 triangles(nt).Get(n1,n2,n3);                                          // the triangle is n1,n2,n3
 
                if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
-                 {     // Associates a vertexNT to each node
+                 {     // Associates vertexNT to each node
                    Graphic3d_Array1OfVertexNT Points(1,3);
                    Aspect_Array1OfEdge aretes(1,3);
 
 
 
 //=======================================================================
 //function : UnsetSize
-//purpose  : si l'objet a 1 couleur, on reprend la taille
-//           du drawer par defaut. sinon on nullifie le DatumAspect
+//purpose  : if the object has 1 color, the default size of the 
+//           drawer is reproduced, otherwise DatumAspect becomes null
 //=======================================================================
 
 void AIS_Trihedron::UnsetSize()
 {
   aPresentation->Clear();
 
-  //CTS16254 : pas de prise en compte des axes lors du FITALL (fpo 18/07)
   aPresentation->SetInfiniteState (Standard_True);
   switch(aMode){
   case 0: 
 void AIS_Trihedron::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
                                      const Standard_Integer aMode)
 {
-  // recuperation des points extremites du triedre.
+  // retrieve the tops of the trihedron.
   Standard_Integer Prior;
   Handle(SelectMgr_EntityOwner) eown;
   TColgp_Array1OfPnt PP(1,4),PO(1,4);
   ExtremityPoints(PP);
   switch (aMode) {
   case 0:
-    {   // triedre complet 1 seul proprietaire : this... priorite 5 (meme que faces)
+    {   // complete triedron only 1 owner : this... priority 5 (same as faces)
       Prior = 5;
       eown = new SelectMgr_EntityOwner(this,Prior);
       for (Standard_Integer i=1; i<=3;i++)
       break;
     }
   case 1:
-    {  //origine : 
+    {  //origin : 
       Prior = 8;
       eown= new SelectMgr_EntityOwner(myShapes[0],Prior);
       
       break;
     }
   case 2:
-    {  //axes ... priorite 7
+    {  //axes ... priority 7
       Prior = 7;
       for (Standard_Integer i=1; i<=3;i++){
        eown= new SelectMgr_EntityOwner(myShapes[i],Prior);
     }
     
   case 3:
-    {  // plans principaux priorite 6
+    {  // main planes priority 6
 //      PO(1) = PP(1);
 //      PO(4) = PP(1);
       Prior =5;
 
   myState = myPClassifier->State();
   const TopoDS_Shape& fres = myPClassifier->Face();
   if (fres.IsNull()) {
-    // NYI : en cas d'elimination des faces EXTERNAL et INTERNAL par le
-    // classifier BRepClass3d_SolidClassifier, traiter quand meme ces faces
-    // pour generer l'etat ON/Solid quand le point est IN/face INTERNAL ou EXTERNAL 
+    // NYI : in case of removal of EXTERNAL and INTERNAL faces by the
+    // classifier BRepClass3d_SolidClassifier, process these faces
+    // to generate state ON/Solid when the point is IN/face INTERNAL or EXTERNAL 
     return myState;
   }
   
 
 
 //=======================================================================
 //function : MakeNeighboursList
-//purpose  : recherche des edges connexes a Earg par Varg 
+//purpose  : find edges connected to Earg by Varg 
 //=======================================================================
   const TopTools_ListOfShape & BOP_WireEdgeSet::MakeNeighboursList(const TopoDS_Shape& Earg,
                                                                   const TopoDS_Shape& Varg)
     if (newn >= 2 ) {
 
       const TopoDS_Face& F = myFace;
-      // plusieurs aretes de couture connexes a E par V et telles que :
-      // orientation de V dans E # orientation de V dans ces aretes.
-      // on ne garde,parmi les aretes de couture connexes,
-      // que l'arete A qui verifie tg(E) ^ tg(A) > 0
+      // several sewing edges connected to E by V such as :
+      // orientation of V in E # orientation of V in its edges.
+      // one leaves among the connected sewing edges,
+      // only edge A that checks tg(E) ^ tg(A) > 0
 
       TopAbs_Orientation Eori;
       gp_Vec2d d1E; gp_Pnt2d pE;
                              ( (cross < 0) && oVE == TopAbs_FORWARD );
 
        if ( t2 ) { //-- t1
-         // c'est la bonne IsClosed,on ne garde qu'elle parmi les IsClosed 
+         // this is proper IsClosed, only it is preserved among IsClosed 
          lclo.Next();
        }
        else {
-         // on vire l'arete IsClosed 
+         // edge IsClosed is suspended
          myCurrentShapeNeighbours.Remove(lclo);
        }
       }// end of while (lclo.More())
   Standard_Boolean resu = Standard_False;
   TopAbs_Orientation o1,o2;
 
-  // SSCONNEX = False ==> on selectionne E2 de facon a creer ulterieurement
-  // (defaut)             autant de faces que de composantes connexes en UV.
-  // SSCONNEX = True ==> on prend toute arete E2 qui partage V avec E1
-  //                     et telle que orientation(V/E1) # orientation(V/E2)
-  //                     ==> face de part et d'autre des coutures
+  // SSCONNEX = False ==> E2 is  selected to create as many 
+  // (default)           faces as there are components connected in UV.
+  // SSCONNEX = True ==> the entire edge E2 sharing V with E1 is taken
+  //                     so that orientation(V/E1) # orientation(V/E2)
+  //                     ==> face of part and other sewings
   if ((c1 && c2)) {
     Standard_Boolean u1 = c1 ? IsUClosed(E1) : Standard_False; 
     Standard_Boolean v1 = c1 ? IsVClosed(E1) : Standard_False; 
     resu = VertexConnectsEdges(V,E1,E2,o1,o2);
   }
   else { 
-    // cto 012 O2 arete de couture de face cylindrique
-    // chainage des composantes splitees ON et OUT de meme orientation
+    // cto 012 O2 sewing edge of cylindric face
+    // chain of components split ON and OUT of the same orientation
     TopAbs_Orientation oe1 = E1.Orientation();
     TopAbs_Orientation oe2 = E2.Orientation();
     Standard_Boolean iseq = E1.IsEqual(E2);
 
     --          Edge/Face  and  evolutif  radius        
 
     class SurfRstConstRad;
-    ---Purpose:  Copie de CSConstRad mais avec une pcurve sur surface 
-    --           comme support. 
+    ---Purpose: Copy of CSConstRad with pcurve on surface 
+    --          as support. 
 
     class RstRstEvolRad;
     ---Purpose: Function  to approximate by AppSurface  for  
     --          Edge/Edge  and  evolutif  radius
     --          
     class RstRstConstRad;
-    ---Purpose:  Copie de CSConstRad mais avec une pcurve sur surface 
-    --           comme support. 
+    ---Purpose: Copy of CSConstRad with a pcurve on surface 
+    --          as support. 
 
     class SurfPointConstRadInv;
-    ---Purpose: Fonction de recadrage entre  un  point et une surface.
+    ---Purpose: Function of reframing between a point and a surface.
 
     class SurfCurvConstRadInv;
-    ---Purpose: Fonction de recadrage entre une restriction surface de
-    --          la surface et une courbe.
+    ---Purpose: Function of reframing between a restriction surface of the
+    --          surface and a curve.
 
     class SurfPointEvolRadInv;
-    ---Purpose: Fonction de recadrage entre  un  point et une surface.
+    ---Purpose: Fonction of reframing between a point and a surface.
 
     class CurvPointRadInv;
-    ---Purpose: Fonction de recadrage entre  un  point et une courbe.
-    --          valable dans les cas rsyon constant et rayon evolutif
+    ---Purpose: Function of reframing between a point and a curve.
+    --          valid in cases of constant and progressive radius
     class SurfCurvEvolRadInv;
-    ---Purpose: Fonction de recadrage entre une restriction surface de
-    --          la surface et une courbe.
+    ---Purpose: Function of reframing between a surface restriction 
+    --          of the surface and a curve.
 
     class SurfRstLineBuilder;
-    ---Purpose: Construction d'une BRepBlend_Line entre une surface et
-    --          une   pcurve sur surface a  partir   d'une solution de
-    --          depart approchee.   Les entrees sorties  de ce builder
-    --          sont  de  meme     nature  que  celle  d'un    walking
-    --          traditionnel, mais les  exigences sur la Line  ne sont
-    --          pas    les   memes.   Si l'on   garanti    toujours la
-    --          determination du  range de  validite,  on ne  respecte
-    --          plus les criteres de bonne repartition des sections en
-    --          vue d'un lissage. En  resume la Line resultat est f(t)
-    --          oriented.
+    ---Purpose: Construction of a BRepBlend_Line between a surface and
+    --          a pcurve on surface from an approached
+    --          starting solution. The output entries of this builder
+    --          are of the same nature as of the traditional walking
+    --          but the requirements on the Line are not the same
+    --          If the determination of validity range is always
+    --          guaranteed, the criteria of correct repartition of sections 
+    --          before smoothing are not respected. The resulting Line
+    --          is f(t) oriented.
 
     class RstRstLineBuilder;
-    ---Purpose: Construction d'une BRepBlend_Line entre deux pcurves a
-    --           partir d'une   solution de  depart  approchee.    Les
-    --          entrees sorties de ce builder sont  de meme nature que
-    --          celle d'un  walking  traditionnel, mais les  exigences
-    --          sur la Line  ne sont pas  les memes.  Si l'on  garanti
-    --          toujours la determination du range  de validite, on ne
-    --          respecte plus les criteres   de bonne repartition  des
-    --          sections  en  vue  d'un  lissage. En  resume  la  Line
-    --          resultat est f(t) oriented.
+    ---Purpose: Construction of a BRepBlend_Line between two pcurves
+    --          from an approached starting solution. The output
+    --          entries of this builder are of the same nature 
+    --          as of a traditional walking, but the requirements 
+    --          to the Line are not the same. If the determination of validity range is always
+    --          guaranteed, the criteria of correct repartition of sections 
+    --          before smoothing are not respected. The resulting Line
+    --          is f(t) oriented.          
 end BRepBlend;
 
     if (myTolerance(ii)>Tol2d) { myTolerance(ii) = Tol2d;}
   }
   
-  //  Tableaux
+  //  Tables
   Func.GetShape( NbPoles, NbKnots, Degree, NbPoles2d);
   
-  // Calcul du BaryCentre (cas rationnel).
+  // Calculation of BaryCentre (rationnal case).
   if (Func.IsRational()) {
     Standard_Real Xmax =-1.e100, Xmin = 1.e100, 
     Ymax =-1.e100, Ymin = 1.e100, 
 
 //================================================================================ 
 // Function: D0
-// Purpose : Calcul de la section pour v = Param, si le calcul echoue on rend
-//           Standard_False. 
+// Purpose : Calculation of section for v = Param, if calculation fails
+//           Standard_False is raised. 
 //================================================================================
 Standard_Boolean BRepBlend_AppFuncRoot::D0(const Standard_Real Param,
                                           const Standard_Real First,
 
 //================================================================================ 
 // Function: D1
-// Purpose : Calcul de la derive partiel de la section par rapport a v
-//           pour v = Param, si le calcul echoue on rend Standard_False.
+// Purpose : Calculation of the partial derivative of the section corresponding to v
+//           for v = Param, if the calculation fails Standard_False is raised.
 //================================================================================ 
 Standard_Boolean BRepBlend_AppFuncRoot::D1(const Standard_Real Param,
                                           const Standard_Real First,
 
 //=========================================================================== 
 // Function: D2
-// Purpose : Calcul de la derive et seconde partiel de la 
-//           section par rapport a v.
-//           Pour v = Param, si le calcul echoue on rend Standard_False.  
+// Purpose : Calculation of the derivative and second partial of the 
+//           section corresponding to v.
+//           For v = Param, if the calculation fails Standard_False is raised.  
 //=========================================================================== 
 Standard_Boolean BRepBlend_AppFuncRoot::D2(const Standard_Real Param,
                                           const Standard_Real First,
 //
 // Function : SearchPoint
 //
-// Purpose : Recherche du point solution au parametre Param (sur 2 Surfaces)
+// Purpose : Find point solution with parameter Param (on 2 Surfaces)
 //
-// Algorithme : 
-//     1) On recheche une solution approximative a partir des Points dejas calcules
-//     2) On Converge par une methode de type Newton
+// Algorithm : 
+//     1) Approximative solution is found from already calculated Points
+//     2) Convergence is done by a method of type Newton
 // 
-// Causes possibles d'echecs : 
-//        - Singularite sur les surfaces.
-//        - Manquent d'information dans la "line"issue du cheminement. 
+// Possible causes of fails : 
+//        - Singularity on surfaces.
+//        - no information oin the "line" resulting from processing. 
 //            
 //================================================================================  
 
 {
   Standard_Boolean Trouve;
   Standard_Integer dim = Func.NbVariables();
-  // (1) Recherche d'un point d'init
+  // (1) Find a point of init
   Standard_Integer I1=1, I2=myLine->NbPoints(), Index;
   Standard_Real t1, t2;
   
-  //  (1.a) On verifie que c'est a l'interieur
+  //  (1.a) It is checked if it is inside
   if (Param < myLine->Point(I1).Parameter()) {return Standard_False;}
   if (Param > myLine->Point(I2).Parameter()) {return Standard_False;}
   
-  //  (1.b) On recheche l'intervalle
+  //  (1.b) Find the interval
   Trouve = SearchLocation(Param, I1, I2, Index);
   
-  //  (1.c) Si le point est dejas calcule on le recupere
+  //  (1.c) If the point is already calculated it is returned
   if (Trouve) {
     Pnt = myLine->Point(Index);
     Vec(XInit,Pnt);
   }
   else {
-    //  (1.d) Intialisation par interpolation lineaire
+    //  (1.d) Intialisation by linear interpolation
     Pnt = myLine->Point(Index);
     Vec(X1,Pnt);
     t1 = Pnt.Parameter();
     }
   }
 
-  // (2) Calcul effectif de la solution ------------------------
+  // (2) Calculation of the solution ------------------------
   Func.Set(Param);
   Func.GetBounds(X1, X2);
   math_FunctionSetRoot rsnld(Func, myTolerance, 30);
   }
   rsnld.Root(Sol);
   
-  // (3) Stockage du point
+  // (3) Storage of the point
   Point(Func,Param,Sol,Pnt);
 
-  // (4) Insertion du point si le cacul semble long.
+  // (4) Insertion of the point if the calculation seems long.
   if ((!Trouve)&&(rsnld.NbIterations()>3)) {
 #ifdef DEB
-    cout << "Evaluation en t = " <<  Param << "donne" << endl;
+    cout << "Evaluation in t = " <<  Param << "given" << endl;
     rsnld.Dump(cout);
 #endif
     myLine->InsertBefore(Index+1, Pnt);
 //
 // Function : SearchLocation
 //
-// Purpose : Recherche dichotomiqique du rang de l'intervalle parametrique contenant
-//           Param dans la liste de points calcule (myline)
-//           si le point de parametre Param est deja stocker dans la liste on rend
-//           True et ParamIndex correspond au rang du Point.
-//           La complexite de cet algorithme est de log(n)/log(2)
+// Purpose : Binary search of the line of the parametric interval containing
+//           Param in the list of calculated points (myline)
+//           if the point of parameter Param is already stored in the list
+//           True is raised and ParamIndex corresponds to line of Point.
+//           Complexity of this algorithm is log(n)/log(2)
 //================================================================================ 
 Standard_Boolean BRepBlend_AppFuncRoot::SearchLocation(const Standard_Real Param,
                                                       const Standard_Integer FirstIndex,
 
   if (Abs(valsol(1)) <= Tol &&
       Abs(valsol(2)) <= Tol ) {
     
-    // Calcul des tangentes
+    // Calculation of tangents
     prmrst1  = Sol(1);    
     pt2drst1 = rst1->Value(prmrst1);
     prmrst2  = Sol(2);
     Sina = nplan.Dot(n1.Crossed(n2));
 
     if (choix%2 != 0) {
-      Sina = -Sina;  //nplan est change en -nplan
+      Sina = -Sina;  //nplan is changed into -nplan
     }
     
     Angle = ACos(Cosa);
 
   rstref1->Value(Sol(1)).Coord(u, v);
   surfref1->D1(u, v,PtTmp1,d1u,d1v);
-  // Normale a la surface de reference 1
+  // Normal to the reference surface 1
   NRst1     = d1u.Crossed(d1v);  
   rstref2->Value(Sol(2)).Coord(u, v);
   surfref2->D1(u, v, PtTmp2, d1u, d1v);
-  // Normale a la surface de reference 2
+  // Normal to the reference surface 2
   NRst2     = d1u.Crossed(d1v);
 
   Standard_Boolean IsCenter;
     TgRst2.Reverse();
   }
 
-  // On retourne les vecteurs 
+  // The vectors are returned 
   if (NRst1InPlane.Dot(TgRst1) > -1.e-10) {
     if (NRst2InPlane.Dot(TgRst2) < 1.e-10) {
       return Blend_DecrochBoth;
 
 //=======================================================================
 //function : CenterCircleRst1Rst2
-//purpose  : Calculer le centre du cercle passant par les deux points des restrictions
+//purpose  : Calculate the center of the circle passing by two points of restrictions
 //=======================================================================
 Standard_Boolean  BRepBlend_RstRstConstRad::CenterCircleRst1Rst2(const gp_Pnt&       PtRst1,
                                                                 const gp_Pnt&       PtRst2,
 {  
   
   gp_Vec rst1rst2(PtRst1, PtRst2);
-  gp_Vec   vdmedNor; //,NRst1;    vdmedNor  vecteur directeur de la Mediatrice  
+  gp_Vec   vdmedNor; //,NRst1;    vdmedNor directong vector of the perpendicular bisector  
   Standard_Real norm2;
-  Standard_Real Dist;// distance entre le milieu de PtRst1,PtRst2 et Center
+  Standard_Real Dist;// distance between the middle of PtRst1,PtRst2 and Center
 
-  // Calcul du centre du cercle 
+  // Calculate the center of the circle 
   VdMed = rst1rst2.Crossed(np); 
   norm2 = rst1rst2.SquareMagnitude();
   Dist  = ray * ray - 0.25 * norm2;
   Pdeb = 0; //ElCLib::Parameter(C, pts);
   Pfin = ElCLib::Parameter(C, ptrst2);
 
-  // Test des angles negatif et quasi null : Cas Singulier
+  // Test of angles negative and almost null : Special Case
   if (Pfin > 1.5 * PI) {
     np.Reverse();
     C.SetPosition(gp_Ax2(Center, np, ns));
 void BRepBlend_RstRstConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const 
 {
   BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
-  // On suppose que cela ne depend pas du Rayon! 
+  // It is supposed that it does not depend on the Radius! 
 }
 
 //=======================================================================
 
 //=======================================================================
 //function : GetTolerance
-//purpose  : Determine les Tolerance a utiliser dans les approximations.
+//purpose  : Determine Tolerances to be used in approximations.
 //=======================================================================
 
 void BRepBlend_RstRstConstRad::GetTolerance(const Standard_Real BoundTol, 
   Poles2d(Poles2d.Lower()).SetCoord(pt2d1.X(),pt2d1.Y());
   Poles2d(Poles2d.Upper()).SetCoord(pt2d2.X(),pt2d2.Y());
   
-  // Cas Linear
+  // Linear case
   if (mySShape == BlendFunc_Linear) {
     Poles(low)   = ptrst1;
     Poles(upp)   = ptrst2;
     return;
   }
 
-  // Calcul du centre du cercle
+  // Calculate the center of the circle
   Standard_Boolean IsCenter;
   IsCenter = CenterCircleRst1Rst2(ptrst1, ptrst2, nplan, Center, NotUsed);
 
-  // normales a la section aux points 
+  // normals to the section with points 
   ns  = gp_Vec(Center, ptrst1).Normalized();  
   ns2 = gp_Vec(Center, ptrst2).Normalized();
 
   n2.Normalize();
 
   if (!istgt) {
-    // secmember contient les derivees des parametres sur les courbes
-    // par rapport a t  
+    // secmember contains derivatives of parameters on curves
+    // compared to t  
     tgrst1 = secmember(1) * d11;
     tgrst2 = secmember(2) * d21;
 
     if (Dist >  1.E-07) { 
       gp_Vec d1P1P2CrosNp, dmed;
       d1P1P2CrosNp = d1rst1rst2.Crossed(nplan) + rst1rst2.Crossed(dnplan);
-      // derivee de la mediatrice
+      // derivative of the perpendicular bisector
       dmed = d1P1P2CrosNp - med.Dot(d1P1P2CrosNp) * med;
       dmed /= normmed; 
       Dist = sqrt(Dist);
         dmed.Reverse();
       }
 
-      // on met dans dmed la derivee du coefficient Dist
+      // the derivative of coefficient Dist is located in dmed
       dmed.SetLinearForm(Dist, dmed, d1Dist, med);
       d1rst1rst2 *= 0.5;   
-      // derivee de la Normale a la courbe en P1    
+      // derivative of the Normal to the curve in P1    
       d1n1 = - (dmed + d1rst1rst2) / ray;
 
-      // derivee de la Normale a la courbe en P2
+      // derivative of the Normal to the curve in P2
       d1n2 = (d1rst1rst2 - dmed) / ray; 
     }
     else {
       d1rst1rst2 *= 0.5;
-      // Normale a la courbe en P1    
+      // Normal to the curve in P1    
       d1n1 = - d1rst1rst2 / ray;
 
-      // Normale a la courbe en P2
+      // Normal to the curve in P2
       d1n2 = d1rst1rst2 / ray;       
     }   
   }
   
-  // Les poles 2d
+  // Tops 2d
   
   Poles2d(Poles2d.Lower()).SetCoord(pt2drst1.X(), pt2drst1.Y());
   Poles2d(Poles2d.Upper()).SetCoord(pt2drst2.X(), pt2drst2.Y());
     DPoles2d(Poles2d.Upper()).SetCoord(a, b);
   }
   
-  // Cas Linear
+  // Linear case
   if (mySShape == BlendFunc_Linear) {
     Poles(low)   = ptrst1;
     Poles(upp)   = ptrst2;
     return (!istgt);
   }
   
-  // Cas du cercle
-  // tangente au centre du cercle
+  // Case of the circle
+  // tangent to the center of the circle
   if (!istgt) {
     tgct.SetLinearForm(-ray, d1n1, tgrst1);
   }
 
 {
   Standard_Integer ind1=1, ind2=1;
   Standard_Real    Epspar = Precision::PConfusion()*0.99;
-  // en suposant que le positionement fonctionne a PConfusion()/2
+  // supposed that the positioning works with PConfusion()/2
   Standard_Real    v1, v2;
-// Initialisations : les IND1 et IND2 pointent sur le 1er element
-// de chacune des 2 tables a traiter.INDS pointe sur le dernier
-// element cree de TABSOR
+// Initialisations : IND1 and IND2 point the 1st element
+// of each of 2 tables to be processed. INDS points at the last
+// created element of TABSOR
 
 
-//--- On remplit TABSOR en parcourant TABLE1 et TABLE2 simultanement ---
-//------------------ en eliminant les occurrences multiples ------------
+//--- TABSOR is filled by parsing TABLE1 and TABLE2 simultaneously ---
+//------------------ and removing multiple occurrencies ------------
 
  while ((ind1<=I1.Upper()) && (ind2<=I2.Upper())) {
       v1 = I1(ind1);
       v2 = I2(ind2);
       if (Abs(v1-v2)<= Epspar) {
-// Ici les elements de I1 et I2 conviennent .
+// elements of I1 and I2 fit here
          Seq.Append((v1+v2)/2);
         ind1++;
          ind2++;
        }
       else if (v1 < v2) {
-       // Ici l' element de I1 convient.
+       // element of I1 fits here.
          Seq.Append(v1);
          ind1++;
        }
       else {
-// Ici l' element de TABLE2 convient.
+// element of TABLE2 fits here.
         Seq.Append(v2);
         ind2++;
        }
     }
 
   if (ind1>I1.Upper()) { 
-//----- Ici I1 est epuise, on complete avec la fin de TABLE2 -------
+//----- Here I1 is exhausted, completed using the end of TABLE2 -------
 
     for (; ind2<=I2.Upper(); ind2++) {
       Seq.Append(I2(ind2));
   }
 
   if (ind2>I2.Upper()) { 
-//----- Ici I2 est epuise, on complete avec la fin de I1 -------
+//----- Here I2 is exhausted, completed using the end of I1 -------
 
     for (; ind1<=I1.Upper(); ind1++) {
       Seq.Append(I1(ind1));
   if (Abs(valsol(1)) <= Tol &&
       Abs(valsol(2)) <= Tol ) {
     
-    // Calcul des tangentes
+    // Calculation of tangents
     prmrst1  = Sol(1);    
     pt2drst1 = rst1->Value(prmrst1);
     prmrst2  = Sol(2);
 
   rstref1->Value(Sol(1)).Coord(u, v);
   surfref1->D1(u, v,PtTmp1,d1u,d1v);
-  // Normale a la surface de reference 1
+  // Normal to the reference surface 1
   NRst1     = d1u.Crossed(d1v);  
   rstref2->Value(Sol(2)).Coord(u, v);
   surfref2->D1(u, v, PtTmp2, d1u, d1v);
-  // Normale a la surface de reference 2
+  // Normal to the reference surface 2
   NRst2     = d1u.Crossed(d1v);
 
   Standard_Boolean IsCenter;
     TgRst2.Reverse();
   }
 
-  // On retourne les vecteurs 
+  // Vectors are returned 
   if (NRst1InPlane.Dot(TgRst1) > -1.e-10) {
     if (NRst2InPlane.Dot(TgRst2) < 1.e-10) {
       return Blend_DecrochBoth;
 
 //=======================================================================
 //function : CenterCircleRst1Rst2
-//purpose  : Calculer le centre du cercle passant par les deux points des restrictions
+//purpose  : Calculate the center of circle passing by two points of restrictions
 //=======================================================================
 Standard_Boolean  BRepBlend_RstRstEvolRad::CenterCircleRst1Rst2(const gp_Pnt&       PtRst1,
                                                                const gp_Pnt&       PtRst2,
 {  
   
   gp_Vec rst1rst2(PtRst1, PtRst2);
-  gp_Vec   vdmedNor; //,NRst1;  vdmedNor  vecteur directeur de la Mediatrice  
+  gp_Vec   vdmedNor; //,NRst1;  vdmedNor  vector director of the perpendicular bisector  
   Standard_Real norm2;
-  Standard_Real Dist;// distance entre le milieu de PtRst1,PtRst2 et Center
+  Standard_Real Dist;// distance between the middle of PtRst1,PtRst2 and Center
 
-  // Calcul du centre du cercle 
+  // Calculate the center of the circle 
   VdMed = rst1rst2.Crossed(np); 
   norm2  = rst1rst2.SquareMagnitude();
   Dist  = ray * ray - 0.25 * norm2;
   Pdeb = 0; //ElCLib::Parameter(C, pts);
   Pfin = ElCLib::Parameter(C, ptrst2);
 
-  // Test des angles negatif et quasi null : Cas Singulier
+  // Test negative and quasi null angles: Special case
   if (Pfin > 1.5 * PI) {
     np.Reverse();
     C.SetPosition(gp_Ax2(Center, np, ns));
 void BRepBlend_RstRstEvolRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const 
 {
   BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
-  // On suppose que cela ne depend pas du Rayon! 
+  // It is supposed that it does not depend on the Radius! 
 }
 
 //=======================================================================
 
 //=======================================================================
 //function : GetTolerance
-//purpose  : Determine les Tolerance a utiliser dans les approximations.
+//purpose  : Determine the Tolerance to be used in approximations.
 //=======================================================================
 
 void BRepBlend_RstRstEvolRad::GetTolerance(const Standard_Real BoundTol, 
   Poles2d(Poles2d.Lower()).SetCoord(pt2d1.X(),pt2d1.Y());
   Poles2d(Poles2d.Upper()).SetCoord(pt2d2.X(),pt2d2.Y());
   
-  // Cas Linear
+  // Linear Case
   if (mySShape == BlendFunc_Linear) {
     Poles(low)   = ptrst1;
     Poles(upp)   = ptrst2;
     return;
   }
 
-  // Calcul du centre du cercle
+  // Calculate the center of the circle
   Standard_Boolean IsCenter;
   IsCenter = CenterCircleRst1Rst2(ptrst1, ptrst2, nplan, Center, NotUsed);
 
-  // normales a la section aux points 
+  // normals to the section with points 
   n1  = gp_Vec(Center, ptrst1).Normalized();  
   n2  = gp_Vec(Center, ptrst2).Normalized();
 
   gp_Vec n1(Center, ptrst1), n2(Center, ptrst2);
 
   if (!istgt) {
-    // secmember contient les derivees des parametres sur les courbes
-    // par rapport a t  
+    // secmember contains derivatives of parameters on curves
+    // corresponding to t  
     tgrst1 = secmember(1) * d11;
     tgrst2 = secmember(2) * d21;
 
     if (Dist >  1.E-07) { 
       gp_Vec d1P1P2CrosNp, dmed;
       d1P1P2CrosNp = d1rst1rst2.Crossed(nplan) + rst1rst2.Crossed(dnplan);
-      // derivee de la mediatrice
+      // derivative of the bisector 
       dmed = d1P1P2CrosNp - med.Dot(d1P1P2CrosNp) * med;
       dmed /= normmed; 
       Dist = sqrt(Dist);
         dmed.Reverse();
       }
 
-      // on met dans dmed la derivee du coefficient Dist
+      // derivative of the coefficient Dist is located in dmed
       dmed.SetLinearForm(Dist, dmed, d1Dist, med);
       d1rst1rst2 *= 0.5;   
-      // derivee de la Normale a la courbe en P1    
+      // derivative of the Normal to the curve in P1    
       d1n1 = - (d1rst1rst2 + dmed + Invdray * n1) / ray;
 
-      // derivee de la Normale a la courbe en P2
+      // derivative of the Normal to the curve in P2
       d1n2 = (d1rst1rst2 - dmed - Invdray * n2) / ray; 
     }
     else {
   n1.Normalize();
   n2.Normalize();
   
-  // Les poles 2d
+  // Tops 2D
   
   Poles2d(Poles2d.Lower()).SetCoord(pt2drst1.X(), pt2drst1.Y());
   Poles2d(Poles2d.Upper()).SetCoord(pt2drst2.X(), pt2drst2.Y());
     DPoles2d(Poles2d.Upper()).SetCoord(a, b);
   }
   
-  // Cas Linear
+  // Linear Case
   if (mySShape == BlendFunc_Linear) {
     Poles(low)   = ptrst1;
     Poles(upp)   = ptrst2;
     return (!istgt);
   }
   
-  // Cas du cercle
-  // tangente au centre du cercle
+  // Case of the circle
+  // tangent to the center of the circle
   if (!istgt) {
     tgct.SetLinearForm(-ray, d1n1, -dray, n1, tgrst1);
   }
 
 extern Standard_Boolean Blend_GettraceDRAWSECT(); 
 
 //-----------------------------------------------------
-// Pour debug : visualisation de la section
+// For debug : visualisation of the section
 static Standard_Boolean BBPP(const Standard_Real param,
                             Blend_RstRstFunction& Func,
                             const math_Vector& sol,
   Standard_Real scal = 1./ (param1 - param2);
 
   cout<<endl;
-  cout<<"controle des derivees au point : "<<param1<<endl;
+  cout<<"control of derivatives at point : "<<param1<<endl;
 
   for(i = 1; i <= hp; i++){
     cout<<endl;
     cout<<"point : "<<i<<endl;
-    cout<<"dx calcule : "<<TDP1(i).X()<<endl;
-    cout<<"dx estime  : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
-    cout<<"dy calcule : "<<TDP1(i).Y()<<endl;
-    cout<<"dy estime  : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
-    cout<<"dz calcule : "<<TDP1(i).Z()<<endl;
-    cout<<"dz estime  : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
-    cout<<"dw calcule : "<<TDW1(i)<<endl;
-    cout<<"dw estime  : "<<scal*(TW1(i)-TW2(i))<<endl;
+    cout<<"dx calculated : "<<TDP1(i).X()<<endl;
+    cout<<"dx estimated  : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
+    cout<<"dy calculated : "<<TDP1(i).Y()<<endl;
+    cout<<"dy estimated  : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
+    cout<<"dz calculated : "<<TDP1(i).Z()<<endl;
+    cout<<"dz estimated  : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
+    cout<<"dw calculated : "<<TDW1(i)<<endl;
+    cout<<"dw estimated  : "<<scal*(TW1(i)-TW2(i))<<endl;
   }
   for(i = 1; i <= hp2d; i++){
     cout<<endl;
     cout<<"point 2d : "<<i<<endl;
-    cout<<"dx calcule : "<<TDP2d1(i).X()<<endl;
-    cout<<"dx estime  : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
-    cout<<"dy calcule : "<<TDP2d1(i).Y()<<endl;
-    cout<<"dy estime  : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
+    cout<<"dx calculated : "<<TDP2d1(i).X()<<endl;
+    cout<<"dx estimated  : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
+    cout<<"dy calculated : "<<TDP2d1(i).Y()<<endl;
+    cout<<"dy estimated  : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
   }
 }
 
 
 //=======================================================================
 //function : Perform
-//purpose  : lance le processus de cheminement
+//purpose  : launch the processing
 //=======================================================================
 
 void BRepBlend_RstRstLineBuilder::Perform(Blend_RstRstFunction&   Func,
     Drawsect(param, Func);
   }
 #endif
-  // Mettre a jour la ligne.
+  // Update the line.
   line->Append(previousP);
   Standard_Real U, V;
   U = previousP.ParameterOnC1();
 
 //=======================================================================
 //function : PerformFirstSection
-//purpose  : Creation de la premiere section
+//purpose  : Creation of the first section
 //=======================================================================
 
 Standard_Boolean BRepBlend_RstRstLineBuilder::PerformFirstSection
   if (!recadrst1 && !recadp1 && !recadrst2 && !recadp2) return Standard_False;
 
 
-  // on regarde si on a decroche ou sorti du domaine 1
+  // it is checked if the contact was lost or domain 1 was left
   if (recadp1 && recadrst1) {
-    if (sens * (wrst1 - wp1) > tolgui){ //on sort du domaine d abord
+    if (sens * (wrst1 - wp1) > tolgui){ //at first one leaves the domain
       wrst1     = wp1;
       trst12    = solinvp1(2);
       trst11    = BRepBlend_BlendTool::Parameter(Vtxp1, rst1);
       Vtxrst2   = Vtxp1;
       recadrst1 = Standard_False;
     }
-    else { // on a decroche
+    else { // the contact is lost
       trst11  = solinvrst1(3);
       trst12  = solinvrst1(2);
       recadp1 = Standard_False;
     trst12  = solinvrst1(2);
   }
 
-  // on regarde si on a decrocher ou sortie du domaine 2
+  // it is checked if the contact was lost or domain 2 was left
   if (recadp2 && recadrst2) {
-    if (sens * (wrst2 - wp2) > tolgui) { //on sort du domaine d abord
+    if (sens * (wrst2 - wp2) > tolgui) { //at first one leaves the domain
       wrst2     = wp2;
       trst21    = solinvp2(2);
       trst22    = BRepBlend_BlendTool::Parameter(Vtxp2, rst2);
     trst21  = solinvrst2(2);
   }
 
-  // on regarde sur laquelle des courbes on decroche en premier
+  // it is checked on which curve the contact is lost earlier
   if (recadrst1 && recadrst2) {
     if (Abs(wrst1 - wrst2) < tolgui) {
       State    = Blend_OnRst12;
       sol(2)   = trst22;
     }
     else if (sens * (wrst1 - wrst2) < 0) {
-      // on decroche sur Rst1
+      // contact lost on Rst1
       State   = Blend_OnRst1;
       param   = wrst1;
       sol(1)  = trst11;
       sol(2)  = trst12;
     }
     else {
-      // on decroche sur rst2
+      // contact lost on rst2
       State   = Blend_OnRst2;
       param   = wrst2;
       sol(1)  = trst21;
   Func.Set(param);
   }
   else if (recadrst1) {
-    // sol sur rst1
+    // ground on rst1
     State   = Blend_OnRst1;
     param   = wrst1;
     sol(1)  = trst11;
     Func.Set(param);
   }
   else if (recadrst2) {
-    // sol sur rst2
+    // ground on rst2
     State   = Blend_OnRst2;
     param   = wrst2;
     sol(1)  = trst21;
     sol(2)  = trst22;
     Func.Set(param);
   }
-  // on regarde sur laquelle des courbes on sort en premier
+  // it is checked on which curves one leaves first
   else if (recadp1 && recadp2) {
     if (Abs(wrst1 - wrst2) < tolgui) {
       State  = Blend_OnRst12;
       sol(2) = trst22;
     }
     else if (sens * (wrst1 - wrst2) < 0) {
-      // sol sur Rst1
+      // sol on Rst1
       State  = Blend_OnRst1;
       param  = wrst1;
       sol(1) = trst11;
       sol(2) = trst12;
     }
     else {
-      // sol sur rst2
+      // ground on rst2
       State  = Blend_OnRst2;
       param  = wrst2;
       sol(1) = trst21;
     Func.Set(param);
   }
   else if (recadp1) {
-    // sol sur rst1
+    // ground on rst1
     State  = Blend_OnRst1;
     param  = wrst1;
     sol(1) = trst11;
     Func.Set(param);
   }
   else if (recadp2) {
-    // sol sur rst2
+    // ground on rst2
     State  = Blend_OnRst2;
     param  = wrst2;
     sol(1) = trst21;
 
 //=======================================================================
 //function : InternalPerform
-//purpose  : algorithme de cheminement sauf aux extremites
+//purpose  : algorithm of processing without extremities
 //=======================================================================
 
 void BRepBlend_RstRstLineBuilder::InternalPerform(Blend_RstRstFunction&   Func,
 {
   Standard_Real stepw  = pasmax;
   Standard_Integer nbp = line->NbPoints();
-  if(nbp >= 2){ //On reprend le dernier step s il n est pas trop petit.
+  if(nbp >= 2){ //The last step is redone if it is not too small.
     if(sens < 0.){
       stepw = (line->Point(2).Parameter() - line->Point(1).Parameter());
     }
       recadp1 = recadp2 = recadrst1 = recadrst2 = Standard_False;
       echecrecad = Standard_False;
       if (situonc1 != TopAbs_IN) {
-       // pb inverse rst/rst
+       // pb inversion rst/rst
        recadp1 = Recadre1(FinvP1, solinvp1, IsVtxp1, Vtxp1);
        if (recadp1) {
          wp1 = solinvp1(1);
       }
 
       if (situonc2 != TopAbs_IN) {
-       // pb inverse point/surf
+       // pb inversion point/surf
        recadp2 = Recadre2(FinvP2, solinvp2, IsVtxp2, Vtxp2);
        if (recadp2) {
          wp2 = solinvp2(1);
       }
 
       if (decroch == Blend_DecrochRst1 || decroch == Blend_DecrochBoth) {
-       // pb inverse rst1/surf1
+       // pb inversion rst1/surf1
        recadrst1 = Recadre1(Func, Finv1, solinvrst1, IsVtxrst1, Vtxrst1);
        if (recadrst1) {
          wrst1 = solinvrst1(1);
       if (recadp1 || recadp2 || recadrst1 || recadrst2) echecrecad = Standard_False;
  
       if (!echecrecad) {
-        // on regarde si on a decroche ou sorti du domaine 1
+        // it is checked if the contact was lost or domain 1 was left
         if (recadp1 && recadrst1) {
-          if (sens * (wrst1 - wp1) > tolgui){ //on sort du domaine d abord
+          if (sens * (wrst1 - wp1) > tolgui){ //first one leaves the domain
             wrst1     = wp1;
            trst12    = solinvp1(2);
            trst11    = BRepBlend_BlendTool::Parameter(Vtxp1, rst1);
            Vtxrst2   = Vtxp1;
             recadrst1 = Standard_False;
          }
-         else { // on a decroche
+         else { // contact is lost
            trst11  = solinvrst1(3);
            trst12  = solinvrst1(2);
             recadp1 = Standard_False;
          trst12  = solinvrst1(2);
        }
 
-       // on regarde si on a decrocher ou sortie du domaine 2
+       // it is checked if the contact was lost or domain 2 was left
        if (recadp2 && recadrst2) {
-         if (sens * (wrst2 - wp2) > tolgui) { //on sort du domaine d abord
+         if (sens * (wrst2 - wp2) > tolgui) { //first one leaves the domain
            wrst2     = wp2;
            trst21    = solinvp2(2);
            trst22    = BRepBlend_BlendTool::Parameter(Vtxp2, rst2);
          trst21  = solinvrst2(2);
        }
 
-        // on regarde sur laquelle des courbes on decroche en premier
+        // it is checked on which curve the contact is lost earlier
        if (recadrst1 && recadrst2) {
          if (Abs(wrst1 - wrst2) < tolgui) {
             State    = Blend_OnRst12;
            sol(2)   = trst22;
          }
          else if (sens * (wrst1 - wrst2) < 0) {
-           // on decroche sur Rst1
+           // contact is lost on Rst1
             State   = Blend_OnRst1;
            decroch = Blend_DecrochRst1; 
            param   = wrst1;
            sol(2)  = trst12;
          }
          else {
-           // on decroche sur rst2
+           // contact is lost on rst2
             State   = Blend_OnRst2;
            decroch = Blend_DecrochRst2;
            param   = wrst2;
          Func.Set(param);
        }
        else if (recadrst1) {
-         // sol sur rst1
+         // ground on rst1
          State   = Blend_OnRst1;
           decroch = Blend_DecrochRst1;
          param   = wrst1;
          Func.Set(param);
        }
        else if (recadrst2) {
-         // sol sur rst2
+         // ground on rst2
          State   = Blend_OnRst2;
           decroch = Blend_DecrochRst2;
          param   = wrst2;
          sol(2)  = trst22;
          Func.Set(param);
        }
-       // on regarde sur laquelle des courbes on sort en premier
+       //  it is checked on which curve the contact is lost earlier
        else if (recadp1 && recadp2) {
          if (Abs(wrst1 - wrst2) < tolgui) {
            State  = Blend_OnRst12;
            sol(2) = trst22;
          }
          else if (sens * (wrst1 - wrst2) < 0) {
-           // sol sur Rst1
+           // ground on Rst1
            State  = Blend_OnRst1;
            param  = wrst1;
            sol(1) = trst11;
            sol(2) = trst12;
          }
          else {
-           // sol sur rst2
+           // ground on rst2
            State  = Blend_OnRst2;
            param  = wrst2;
            sol(1) = trst21;
          Func.Set(param);
        }
        else if (recadp1) {
-         // sol sur rst1
+         // ground on rst1
          State  = Blend_OnRst1;
          param  = wrst1;
          sol(1) = trst11;
          Func.Set(param);
        }
        else if (recadp2) {
-         // sol sur rst2
+         // ground on rst2
          State  = Blend_OnRst2;
          param  = wrst2;
          sol(1) = trst21;
        State = TestArret(Func, Standard_True, State);
       }
       else{
-       // echec recadrage. On sort avec PointsConfondus
-       cout<<"echec recadrage"<<endl;
+       // reframing failed. Leave with PointsConfondus
+       cout<<"reframing failed"<<endl;
        State = Blend_SamePoints;
       }
     }
          Drawsect(param, Func);
        }
 #endif
-       // Mettre a jour la ligne.
+       // Update the line.
        if (sens > 0.) {
          line->Append(previousP);
        }
                           previousP.ParameterOnC1(),
                           previousP.Parameter(), tolesp);
          MakeExtremity(Extrst2, Standard_False, rst2, sol(2), IsVtxrst2, Vtxrst2);
-         // Indiquer que fin sur Bound.
+         // Show that end is on Bound.
        }
        else {
          param = param + sens * stepw;
                           previousP.Parameter(), tolesp);
          Arrive = Standard_True;
          if (line->NbPoints()>=2) {
-           // Indiquer qu on s arrete en cours de cheminement
-           cout<<"On n avance plus dans le cheminement"<<endl;
+           // Show that there is a stop during processing 
+           cout<<"No more advancement in the processing"<<endl;
          }
        }
        else {
-         param = parprec + sens * stepw;  // on ne risque pas de depasser Bound.
+         param = parprec + sens * stepw;  // there is no risk to exceed Bound.
        }
       }
       break;
          Drawsect(param,Func);
        }
 #endif
-       // Mettre a jour la ligne.
+       // Update the line.
        if (sens > 0.) {
          line->Append(previousP);
        }
                           previousP.ParameterOnC1(),
                           previousP.Parameter(), tolesp);
          MakeExtremity(Extrst2, Standard_False, rst2, sol(2), IsVtxrst2, Vtxrst2);
-         // Indiquer que fin sur Bound.
+         // Indicate that end is on Bound.
        }
        else {
          param = param + sens * stepw;
       
     case Blend_SamePoints :
       {
-       // On arrete
-       cout << " Points confondus dans le cheminement" << endl;
+       // Stop
+       cout << " Mixed points in the processing" << endl;
        Extrst1.SetValue(previousP.PointOnC1(),
                         previousP.ParameterOnC1(),
                         previousP.Parameter(), tolesp);
 
 //=======================================================================
 //function : Recadre1
-//purpose  : On a decroche en 1
+//purpose  : Contact lost on 1
 //=======================================================================
 
 Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre1(Blend_RstRstFunction&    Func,
   Solinv(2) = sol(2);
   Solinv(3) = sol(1);
  
-  // On recherche le point de non decrochement
+  // The point where contact is not lost is found
   math_FunctionSetRoot rsnld(Finv, toler, 30);
   rsnld.Perform(Finv, Solinv, infb, supb);
   if (!rsnld.IsDone()) {
 
   rsnld.Root(Solinv);
 
-  // On doit verifier la valeur de la fonction est bien
-  //  sur la seconde restriction
+  // It is necessary to check if the function value meets the
+  // second restriction
   if (Finv.IsSolution(Solinv, tolesp)) {
     Standard_Real w = Solinv(2);
     if(w < rst2->FirstParameter() - toler(2)||
       return Standard_False;
     }
  
-    // on regarde si on n est pas sur un Vertex
+    // it is checked if it is on a Vertex
     domain1->Initialize(rst1);
     domain1->InitVertexIterator();
     IsVtx = !domain1->MoreVertex();
     if (!domain1->MoreVertex()) {
       IsVtx = Standard_False;
     }
-    // On recalcule la section par resolution directe, sinon, on se recupere 
-    // des incoherences entre le parametre et sol dues au baillement.
+    // The section is recalculated by direct solution, otherwise return 
+    // incoherences between the parameter and the ground caused by yawn.
 
     math_Vector infbound(1, 2), supbound(1, 2);
     math_Vector parinit(1, 2), tolerance(1, 2);
 
 //=======================================================================
 //function : Recadre2
-//purpose  : On a decroche sur Rst2
+//purpose  : Contact lost on Rst2
 //=======================================================================
 
 Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre2(Blend_RstRstFunction&    Func,
 
   rsnld.Root(Solinv);
 
-  // On doit verifier la valeur de la fonction
+  // It is necessary to check the value of the function
   if (Finv.IsSolution(Solinv, tolesp)) {
     Standard_Real w = Solinv(2);
     if(w < rst1->FirstParameter() - toler(2)||
     if (!domain2->MoreVertex()) {
       IsVtx = Standard_False;
     }
-    // On recalcule la section par resolution directe, sinon, on se recupere 
-    // des incoherences entre le parametre et sol dues au baillement.
-
+    // The section is recalculated by direct solution, otherwise return 
+    // incoherences between the parameter and the ground caused by yawn.
+   
     math_Vector infbound(1, 2), supbound(1, 2);
     math_Vector parinit(1,2), tolerance(1,2);
     Func.GetTolerance(tolerance, tolesp);
 
 //=======================================================================
 //function : Recadre
-//purpose  : On est en fin de la courbe rst1
+//purpose  : This is the end of curve rst1
 //=======================================================================
 
 Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre1(Blend_CurvPointFuncInv&  FinvP,
                                                       Standard_Boolean&        IsVtx,
                                                       Handle(Adaptor3d_HVertex)& Vtx) 
 {
-  // On se place sur le dernier ou le premier point, suivant le
-  // sens de cheminement.
+  // One is located on the last or the first point, following the
+  // direction of processing.
   gp_Pnt2d p2drst1;
   Standard_Real firstrst1 = rst1->FirstParameter();
   Standard_Real lastrst1  = rst1->LastParameter();
 
 //=======================================================================
 //function : Recadre2
-//purpose  : On est en fin de la courbe rst2
+//purpose  : This is the end of curve rst2
 //=======================================================================
 
 Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre2(Blend_CurvPointFuncInv&  FinvP,
                                                       Standard_Boolean&        IsVtx,
                                                       Handle(Adaptor3d_HVertex)& Vtx) 
 {
-  // On se place sur le dernier ou le premier point, suivant le
-  // sens de cheminement.
+  // One is located on the last or the first point, following the 
+  // direction of processing.
   gp_Pnt2d p2drst2;
   Standard_Real firstrst2 = rst2->FirstParameter();
   Standard_Real lastrst2  = rst2->LastParameter();
 
 //=======================================================================
 //function : MakeExtremity
-//purpose  : fabrique l extremite d une courbe
+//purpose  : produce the extremity of a curve
 //=======================================================================
 
 void BRepBlend_RstRstLineBuilder::MakeExtremity(BRepBlend_Extremity&            Extrem,
 
 Blend_Status BRepBlend_RstRstLineBuilder::CheckDeflectionOnRst1(const Blend_Point& CurPoint)
 {
-  //Controles 3d du Blend_CSWalking.
+  //Controls 3d of Blend_CSWalking.
 
-  // regle par tests dans U4 correspond a 11.478 d
+  // rule by tests in U4 corresponds to 11.478 
   const Standard_Real CosRef3D = 0.98;
   Standard_Real Cosi, Cosi2;
   Standard_Boolean curpointistangent  = CurPoint.IsTangencyPoint();
   if (!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
 
   if (Norme <= tolesp * tolesp) {
-    // il faudra peut etre  forcer meme point
+    // it can be necessary to force the same point
     return Blend_SamePoints;
   }
   if(!prevpointistangent){
       return Blend_SamePoints;
     }
     Cosi = sens * Corde * prevTg;
-    if (Cosi < 0.) { // angle 3d>pi/2. --> retour arriere
+    if (Cosi < 0.) { // angle 3d>pi/2. --> return back
       return Blend_Backward;
     }
     
   }
   
   if(!curpointistangent){
-    // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+    // Check if it is necessary to control the sign of prevtg*Tgsurf
     Cosi = sens * Corde * Tgsurf;
     Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
     if (Cosi2 < CosRef3D || Cosi < 0.) { 
   }  
 
   if (!curpointistangent && !prevpointistangent) {
-    // Estimation de la fleche courante
+    // Estimation of the current arrow
     Standard_Real FlecheCourante = 
       (prevTg.Normalized().XYZ() - Tgsurf.Normalized().XYZ()).SquareModulus() * Norme / 64.;
     
       return Blend_StepTooSmall;
     }
     if (FlecheCourante > fleche * fleche) {
-      // pas trop grand : commentaire interessant
+      // not too great
       return Blend_StepTooLarge;
     }
   }
 
 Blend_Status BRepBlend_RstRstLineBuilder::CheckDeflectionOnRst2(const Blend_Point& CurPoint)
 {
-  //Controles 3d du Blend_CSWalking.
+  //3D Controls of Blend_CSWalking.
 
-  // regle par tests dans U4 correspond a 11.478 d
+  // rule by tests in U4 corresponding to 11.478 d
   const Standard_Real CosRef3D = 0.98;
   Standard_Real Cosi, Cosi2;
   Standard_Boolean curpointistangent  = CurPoint.IsTangencyPoint();
   if (!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
 
   if (Norme <= tolesp * tolesp){
-    // il faudra peut etre  forcer meme point
+    // it can be necessary to force the same point
     return Blend_SamePoints;
   }
   if (!prevpointistangent) {
       return Blend_SamePoints;
     }
     Cosi = sens * Corde * prevTg;
-    if (Cosi < 0.) { // angle 3d>pi/2. --> retour arriere
+    if (Cosi < 0.) { // angle 3d>pi/2. --> return back
       return Blend_Backward;
     }
     
   }
   
   if (!curpointistangent) {
-    // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+    // Check if it is necessary to control the sign of prevtg*Tgsurf
     Cosi  = sens * Corde * Tgsurf;
     Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
     if (Cosi2 < CosRef3D || Cosi < 0.) { 
   }  
 
   if(!curpointistangent && !prevpointistangent){
-    // Estimation de la fleche courante
+    // Estimation of the current arrow
     Standard_Real FlecheCourante = 
       (prevTg.Normalized().XYZ() - Tgsurf.Normalized().XYZ()).SquareModulus() * Norme/64.;
     
       return Blend_StepTooSmall;
     }
     if (FlecheCourante > fleche * fleche) {
-      // pas trop grand : commentaire interessant
+      // not too great
       return Blend_StepTooLarge;
     }
   }
   math_Vector tolerance(1, 2);
   Func.GetTolerance(tolerance, tolesp);
 
-  //cote pcurve 1.
+  //face pcurve 1.
   Standard_Real v = sol(1);
   if(v < rst1->FirstParameter() - tolerance(2)||
      v > rst1->LastParameter() + tolerance(2)){
   }
   else SituOnC1 = TopAbs_ON;
 
-  //cote pcurve 2.
+  //face pcurve 2.
   v = sol(2);
   if(v < rst2->FirstParameter() - tolerance(2)||
      v > rst2->LastParameter() + tolerance(2)){
   else SituOnC2 = TopAbs_ON;
 
 
-  //decrochage
+  //lost contact
   gp_Vec tgrst1, norst1, tgrst2, norst2;
   Decroch = Func.Decroch(sol,tgrst1, norst1, tgrst2, norst2);
 
 
   vref.Divide(norm);
   vref.SetLinearForm(ray,vref,gp_Vec(ptrst,pts));
   
-  // Derivee par rapport a u1
+  // Derivative by u1
   temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
   D(3,1) = D(3,1) * 2.;
   
   
-  // Derivee par rapport a v1
+  // Derivative by v1
   temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
   
   temp = vref/ray;
 //  F(3) = vref.SquareMagnitude() - ray*ray;
-  F(3) = (temp.SquareMagnitude() - 1)*ray*ray; // plus stable numeriquement
+  F(3) = (temp.SquareMagnitude() - 1)*ray*ray; // more stable numerically
   
-  // Derivee par rapport a u1
+  // Derivative by u1
   temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
 
   
   
-  // Derivee par rapport a v1
+  // Derivative by v1
   temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
       Abs(valsol(2)) <= Tol &&
       Abs(valsol(3)) <= 2*Tol*Abs(ray) ) {
     
-    // Calcul des tangentes
+    // Calculation of tangents
     
     pt2ds  = gp_Pnt2d(Sol(1),Sol(2));
     prmrst = Sol(3);
       tg2drst.SetCoord(a,b);
     }
 
-    // mise a jour de maxang
+    // update of maxang
     if(ray>0.) ns.Reverse();
     ns2 = -resul.Normalized();
     
     Cosa = ns.Dot(ns2);
     Sina = nplan.Dot(ns.Crossed(ns2));
     if (choix%2 != 0) {
-      Sina = -Sina;  //nplan est change en -nplan
+      Sina = -Sina;  //nplan is changed to -nplan
     }
     
     Angle = ACos(Cosa);
   Standard_Real dot, NT = NRstInPlane.Magnitude();
   NT *= TgRst.Magnitude();
   if (Abs(NT) < 1.e-7) {
-    return Standard_False; // Singularite ou Incoherence.
+    return Standard_False; // Singularity or Incoherence.
   }
   dot = NRstInPlane.Dot(TgRst);
   dot /= NT;
   Pdeb = 0; //ElCLib::Parameter(C,pts);
   Pfin = ElCLib::Parameter(C,ptrst);
 
-  // Test des angles negatif et quasi null : Cas Singulier
+  // Test negative and almost null angles : Special case
   if (Pfin>1.5*PI) {
     np.Reverse();
     C.SetPosition(gp_Ax2(Center,np,ns));
 void BRepBlend_SurfRstConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const 
 {
   BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
-  // On suppose que cela ne depend pas du Rayon! 
+  // It is supposed that it does not depend on the Radius! 
 }
 
 //=======================================================================
 
 //=======================================================================
 //function : GetTolerance
-//purpose  : Determine les Tolerance a utiliser dans les approximations.
+//purpose  : Find Tolerance to be used in approximations.
 //=======================================================================
 
 void BRepBlend_SurfRstConstRad::GetTolerance(const Standard_Real BoundTol, 
   nplan  = d1gui.Normalized();
   
   P.ParametersOnS(u1,v1);
-  w = P.ParameterOnC(); //jlr : point sur courbe pas sur surface
+  w = P.ParameterOnC(); //jlr : point on curve not on surface
   gp_Pnt2d  pt2d = rst->Value(w);
 
   surf->D1(u1,v1,pts,d1u1,d1v1);
   Poles2d(Poles2d.Lower()).SetCoord(u1,v1);
   Poles2d(Poles2d.Upper()).SetCoord(pt2d.X(),pt2d.Y());
   
-  // Cas Linear
+  // Linear Case
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts;
     Poles(upp) = ptrst;
   ndotns = nplan.Dot(ns);
   norm = ncrossns.Magnitude();
   if (norm < Eps)  {
-    norm = 1; // Insufisant, mais il ne faut pas planter
+    norm = 1; // Not enough, but it is not necessary to stop
 #if DEB
-    cout << " SurfRstConstRad : Surface singuliere " << endl;
+    cout << " SurfRstConstRad : Singular Surface " << endl;
 #endif
   }  
   
-  // Derivee de n1 par rapport a w
+  // Derivative of n1 corresponding to w
   
   grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
   dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
   
   temp.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
   resul.SetLinearForm(ray,temp,gp_Vec(ptrst,pts));
-  secmember(3) = dnw.Dot(resul); // jag 950105 il manquait ray
-  secmember(3) = -2.*ray*secmember(3); // jag 950105 il manquait ray
+  secmember(3) = dnw.Dot(resul); 
+  secmember(3) = -2.*ray*secmember(3);
   
   math_Gauss Resol(gradsol, 1.e-9);
 
     tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
     tgrst = secmember(3)*d1;
     
-    // Derivee de n1 par rapport a u1
+    // Derivative of n1 corresponding to u1
     temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
     grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
     resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
                         grosterme/norm,ns,
                         -1./norm,temp);
     
-    // Derivee de n1 par rapport a v1
+    // Derivative of n1 corresponding to v1
     temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
     grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
     resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
     ns2 = -resul.Normalized();
   }
   
-  // Les poles 2d
+  // Tops 2D
   
   Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
   Poles2d(Poles2d.Upper()).SetCoord(pt2drst.X(),pt2drst.Y());
     DPoles2d(Poles2d.Upper()).SetCoord(a,b);
   }
   
-  // Cas Linear
+  // Linear Case
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts;
     Poles(upp) = ptrst;
     return (!istgt);
   }
   
-  // Cas du cercle
+  // Case of the circle
   Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
   if (!istgt) {
     tgct = tgs.Added(ray*dnw);
 
 {
   Standard_Integer ind1=1, ind2=1;
   Standard_Real    Epspar = Precision::PConfusion()*0.99;
-  // en suposant que le positionement fonctionne a PConfusion()/2
+  // it is supposed that positioning works with PConfusion()/2
   Standard_Real    v1, v2;
-// Initialisations : les IND1 et IND2 pointent sur le 1er element
-// de chacune des 2 tables a traiter.INDS pointe sur le dernier
-// element cree de TABSOR
+// Initialisation : IND1 and IND2 point at the first element
+// of each of 2 tables to be processed. INDS points at the last
+// element created by TABSOR
 
 
-//--- On remplit TABSOR en parcourant TABLE1 et TABLE2 simultanement ---
-//------------------ en eliminant les occurrences multiples ------------
+//--- TABSOR is filled by parsing TABLE1 and TABLE2 simultaneously ---
+//------------------ and eliminating multiple occurrencies ------------
 
  while ((ind1<=I1.Upper()) && (ind2<=I2.Upper())) {
       v1 = I1(ind1);
       v2 = I2(ind2);
       if (Abs(v1-v2)<= Epspar) {
-// Ici les elements de I1 et I2 conviennent .
+// Here the elements of I1 and I2 fit.
          Seq.Append((v1+v2)/2);
         ind1++;
          ind2++;
        }
       else if (v1 < v2) {
-       // Ici l' element de I1 convient.
+       // Here the element of I1 fits.
          Seq.Append(v1);
          ind1++;
        }
       else {
-// Ici l' element de TABLE2 convient.
+// Here the element of TABLE2 fits.
         Seq.Append(v2);
         ind2++;
        }
     }
 
   if (ind1>I1.Upper()) { 
-//----- Ici I1 est epuise, on complete avec la fin de TABLE2 -------
+//----- Here I1 is exhausted, completed with the end of TABLE2 -------
 
     for (; ind2<=I2.Upper(); ind2++) {
       Seq.Append(I2(ind2));
   }
 
   if (ind2>I2.Upper()) { 
-//----- Ici I2 est epuise, on complete avec la fin de I1 -------
+//----- Here I2 is exhausted, completed with the end of I1 -------
 
     for (; ind1<=I1.Upper(); ind1++) {
       Seq.Append(I1(ind1));
 
 //=======================================================================
 //function : BRepBlend_SurfRstEvolRad
-//purpose  : Contructeur
+//purpose  : Contructor
 //=======================================================================
 BRepBlend_SurfRstEvolRad::BRepBlend_SurfRstEvolRad
 (const Handle(Adaptor3d_HSurface)& Surf,
   vref.Divide(norm);
   vref.SetLinearForm(ray,vref,gp_Vec(ptrst,pts));
   
-  // Derivee par rapport a u1
+  // Derivative corresponding to u1
   temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
   D(3,1) = 2.*(resul.Dot(vref));
   
   
-  // Derivee par rapport a v1
+  // Derivative corresponding to v1
   temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
   F(3) = vref.SquareMagnitude() - ray*ray;
   
   
-  // Derivee par rapport a u1
+  // Derivative corresponding to u1
   temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
   D(3,1) = 2.*(resul.Dot(vref));
   
   
-  // Derivee par rapport a v1
+  // Derivative corresponding to v1
   temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
   grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
   resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
 
 //=======================================================================
 //function : 
-//purpose  : Segmente la courbe a sa partie utile.
-//           La precision est prise arbitrairement petite !?
+//purpose  : Segments the curve in its useful part.
+//           Precision is taken arbitrary small !?
 //=======================================================================
  void BRepBlend_SurfRstEvolRad::Set
 (const Standard_Real First,
       Abs(valsol(2)) <= Tol &&
       Abs(valsol(3)) <= 2*Tol*Abs(ray) ) {
     
-    // Calcul des tangentes
+    // Calculation of tangents
     
     pt2ds  = gp_Pnt2d(Sol(1),Sol(2));
     prmrst = Sol(3);
     else {
       istangent = Standard_True;
     }
-    // mise a jour de maxang
+    // update of maxang
     if(ray>0.) ns.Reverse();
     ns2 = -resul.Normalized();
     
     Cosa = ns.Dot(ns2);
     Sina = nplan.Dot(ns.Crossed(ns2));
     if (choix%2 != 0) {
-      Sina = -Sina;  //nplan est change en -nplan
+      Sina = -Sina;  //nplan is changed into -nplan
     }
     
     Angle = ACos(Cosa);
   Standard_Real dot, NT = NRstInPlane.Magnitude();
   NT *= TgRst.Magnitude();
   if (Abs(NT) < 1.e-7) {
-    return Standard_False; // Singularite ou Incoherence.
+    return Standard_False; // Singularity or Incoherence.
   }
   dot = NRstInPlane.Dot(TgRst);
   dot /= NT;
   Pdeb = 0.; //ElCLib::Parameter(C,pts);
   Pfin = ElCLib::Parameter(C,ptrst);
 
-  // Test des angles negatif et quasi null : Cas Singulier
+  // Test negative and almost null angles : Single Case
   if (Pfin>1.5*PI) {
     np.Reverse();
     C.SetPosition(gp_Ax2(Center,np,ns));
  void BRepBlend_SurfRstEvolRad::GetMinimalWeight(TColStd_Array1OfReal& Weigths) const
 {
   BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weigths );
-  // On suppose que cela ne depend pas du Rayon! 
+  // It is supposed that it does not depend on the Radius! 
 }
 
 //=======================================================================
   ndotns = nplan.Dot(ns);
   norm = ncrossns.Magnitude();
   if (norm < Eps)  {
-    norm = 1; // Insufisant, mais il ne faut pas planter
+    norm = 1; // Not enough, but it is not necessary to stop
 #if DEB
-    cout << " SurfRstEvolRad : Surface singuliere " << endl;
+    cout << " SurfRstEvolRad : Surface single " << endl;
 #endif
   }
   
-  // Derivee de n1 par rapport a w
+  // Derivative of n1 corresponding to w
   
   grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
   dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
 
     tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
     tgrst = secmember(3)*d1;
-    // Derivee de n1 par rapport a u1
+    // Derivative of n1 corresponding to u1
     temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
     grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
     resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
                         grosterme/norm,ns,
                         -1./norm,temp);
     
-    // Derivee de n1 par rapport a v1
+    // Derivative of n1 corresponding to v1
     temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
     grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
     resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
     istgt = Standard_True;
   }
   
-  // Les poles 2d
+  // Tops 2D
   
   Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
   Poles2d(Poles2d.Upper()).SetCoord(pt2drst.X(),pt2drst.Y());
     DPoles2d(Poles2d.Upper()).SetCoord(a,b);
   }
   
-  // Cas Linear
+  // Linear Case
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts;
     Poles(upp) = ptrst;
     return (!istgt);
   }
   
-  // Cas du cercle
+  // Case of the circle
   Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
   if (!istgt) {
     tgct.SetLinearForm(ray,dnw,dray,ns,tgs);
     dnplan.Reverse();
   }
   if (!istgt) {
-    if (ray < 0.) { // pour eviter la connerie Abs(dray) qques lignes plus bas
+    if (ray < 0.) { // to avoid Abs(dray) some lines below
       rayprim = -dray;
     }
     else rayprim = dray;
   nplan  = d1gui.Normalized();
   
   P.ParametersOnS(u1,v1);
-  w = P.ParameterOnC(); //jlr : point sur courbe pas sur surface
+  w = P.ParameterOnC(); //jlr : point on curve not on surface
   gp_Pnt2d  pt2d = rst->Value(w);
 
   surf->D1(u1,v1,pts,d1u1,d1v1);
   Poles2d(Poles2d.Lower()).SetCoord(u1,v1);
   Poles2d(Poles2d.Upper()).SetCoord(pt2d.X(),pt2d.Y());
   
-  // Cas Linear
+  // Linear case
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts;
     Poles(upp) = ptrst;
 
 #endif
 static Standard_Integer IndexOfSection = 0;
 extern Standard_Boolean Blend_GettraceDRAWSECT(); 
-// Pour debug : visualisation de la section
+// for debug : visualisation of the section
 static Standard_Boolean BBPP(const Standard_Real param,
                             Blend_SurfRstFunction& Func,
                             const math_Vector& sol,
   Standard_Real scal = 1./(param1-param2);
 
   cout<<endl;
-  cout<<"controle des derivees au point : "<<param1<<endl;
+  cout<<"control derivatives at point : "<<param1<<endl;
 
   for(i = 1; i <= hp; i++){
     cout<<endl;
     cout<<"point : "<<i<<endl;
-    cout<<"dx calcule : "<<TDP1(i).X()<<endl;
-    cout<<"dx estime  : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
-    cout<<"dy calcule : "<<TDP1(i).Y()<<endl;
-    cout<<"dy estime  : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
-    cout<<"dz calcule : "<<TDP1(i).Z()<<endl;
-    cout<<"dz estime  : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
-    cout<<"dw calcule : "<<TDW1(i)<<endl;
-    cout<<"dw estime  : "<<scal*(TW1(i)-TW2(i))<<endl;
+    cout<<"dx calculated : "<<TDP1(i).X()<<endl;
+    cout<<"dx estimated  : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
+    cout<<"dy calculated : "<<TDP1(i).Y()<<endl;
+    cout<<"dy estimated  : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
+    cout<<"dz calculated : "<<TDP1(i).Z()<<endl;
+    cout<<"dz estimated  : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
+    cout<<"dw calculated : "<<TDW1(i)<<endl;
+    cout<<"dw estimated  : "<<scal*(TW1(i)-TW2(i))<<endl;
   }
   for(i = 1; i <= hp2d; i++){
     cout<<endl;
     cout<<"point 2d : "<<i<<endl;
-    cout<<"dx calcule : "<<TDP2d1(i).X()<<endl;
-    cout<<"dx estime  : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
-    cout<<"dy calcule : "<<TDP2d1(i).Y()<<endl;
-    cout<<"dy estime  : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
+    cout<<"dx calculated : "<<TDP2d1(i).X()<<endl;
+    cout<<"dx estimated  : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
+    cout<<"dy calculated : "<<TDP2d1(i).Y()<<endl;
+    cout<<"dy estimated  : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
   }
 }
 
 
 //=======================================================================
 //function :  ArcToRecadre
-//purpose  : Cherche un arc candidat
-//           PrevIndex est utilise pour rejeter un arc deja teste
+//purpose  : Find a suitable arc
+//           PrevIndex is used to reject an already tested arc
 //=======================================================================
 
 Standard_Integer BRepBlend_SurfRstLineBuilder::
     Drawsect(param,Func);
   }
 #endif
-  // Mettre a jour la ligne.
+  // Update the line.
   line->Append(previousP);
   Standard_Real U,V;
   previousP.ParametersOnS(U,V);
   }
   if (!recads && !recadp && !recadrst) return Standard_False;
   if (recadp && recadrst) {
-    if(sens*(wrst-wp) > tolgui){ //on sort du domaine d abord
+    if(sens*(wrst-wp) > tolgui){ //first one leaves the domain
       wrst = wp;
       U = solinvp(2);
       V = solinvp(3);
       sol(3) = solinvs(2);
     }
     else if(sens*(ws-wrst)<0){
-      // sol sur surf
+      // ground on surf
       State = Blend_OnRst1;
       param = ws;
       Arc->Value(solinvs(3)).Coord(U,V);
       sol(3) = solinvs(2);
     }
     else{
-      // sol sur rst
+      // ground on rst
       State = Blend_OnRst2;
       param = wrst;
       sol(1) = U;
     Func.Set(param);
   }
   else if(recads){
-    // sol sur surf
+    // ground on surf
     State = Blend_OnRst1;
     param = ws;
     Arc->Value(solinvs(3)).Coord(U,V);
     Func.Set(param);
   }
   else if(recadrst){
-    // sol sur rst
+    // ground on rst
     State = Blend_OnRst2;
     param = wrst;
     sol(1) = U;
 {
   Standard_Real stepw = pasmax;
   Standard_Integer nbp = line->NbPoints();
-  if(nbp >= 2){ //On reprend le dernier step s il n est pas trop petit.
+  if(nbp >= 2){ //The last step is reproduced if it is not too small.
     if(sens < 0.){
       stepw = (line->Point(2).Parameter() - line->Point(1).Parameter());
     }
        recads = Recadre(FinvC,solinvs,Arc,IsVtxs,Vtxs);
        if (recads) {
          ws = solinvs(1);
-         // Il faut reevaluer le decrochage (BUC60360)
+         // It is necessary to reevaluate the deviation (BUC60360)
          gp_Vec t, n;
          Func.Set(ws);
          Arc->Value(solinvs(3)).Coord(U,V);
       if(recadp || recads || recadrst) echecrecad = Standard_False; 
       if (!echecrecad) {
        if (recadp && recadrst) {
-         if(sens*(wrst-wp) > tolgui){ //on sort du domaine d abord
+         if(sens*(wrst-wp) > tolgui){ //first one leaves the domain
            wrst = wp;
            U = solinvp(2);
            V = solinvp(3);
            sol(3) = solinvs(3);
          }
          else if(sens*(ws-wrst)<0){
-           // sol sur surf
+           // ground on surf
            decroch = 0;
            State = Blend_OnRst1;
            param = ws;
            sol(3) = solinvs(2);
          }
          else{
-           // sol sur rst
+           // ground on rst
            State = Blend_OnRst2;
            param = wrst;
            sol(1) = U;
          Func.Set(param);
        }
        else if(recads){
-         // sol sur surf
+         // ground on surf
          State = Blend_OnRst1;
          param = ws;
          Arc->Value(solinvs(3)).Coord(U,V);
          Func.Set(param);
        }
        else if(recadrst){
-         // sol sur rst
+         // ground on rst
          State = Blend_OnRst2;
          param = wrst;
          sol(1) = U;
        State = TestArret(Func,Standard_True,State);
       }
       else{
-       // echec recadrage. On sort avec PointsConfondus
+       // Failed reframing. Leave with PointsConfondus
 #if DEB
-       cout<<"SurfRstLineBuilder : echec recadrage"<<endl;
+       cout<<"SurfRstLineBuilder : failed reframing"<<endl;
 #endif
        State = Blend_SamePoints;
       }
          Drawsect(param,Func);
        }
 #endif
-       // Mettre a jour la ligne.
+       // Update the line.
        if (sens>0.) {
          line->Append(previousP);
        }
                        sol(1),sol(2),
                        previousP.Parameter(),tolesp);
          MakeExtremity(Extrst,Standard_False,rst,sol(3),IsVtxrst,Vtxrst);
-         // Indiquer que fin sur Bound.
+         // Indicate end on Bound.
        }
        else {
          param = param + sens*stepw;
                          previousP.Parameter(),tolesp);
          Arrive = Standard_True;
          if (line->NbPoints()>=2) {
-           // Indiquer qu on s arrete en cours de cheminement
+           // Indicate that one stops during the processing
 #if DEB
-           cout<<"SurfRstLineBuilder :On n avance plus dans le cheminement"<<endl;
+           cout<<"SurfRstLineBuilder : No advancement in the processing"<<endl;
 #endif
          }
        }
        else {
-         param = parprec + sens*stepw;  // on ne risque pas de depasser Bound.
+         param = parprec + sens*stepw;  // no risk to exceed Bound.
        }
       }
       break;
          Drawsect(param,Func);
        }
 #endif
-       // Mettre a jour la ligne.
+       // Update the line.
        if (sens>0.) {
          line->Append(previousP);
        }
          Exts.SetValue(previousP.PointOnS(),sol(1),sol(2),
                        previousP.Parameter(),tolesp);
          MakeExtremity(Extrst,Standard_False,rst,sol(3),IsVtxrst,Vtxrst);
-         // Indiquer que fin sur Bound.
+         // Indicate end on Bound.
        }
        else {
          param = param + sens*stepw;
       
     case Blend_SamePoints :
       {
-       // On arrete
+       // Stop
 #if DEB
-       cout << "SurfRstLineBuilder Points confondus dans le cheminement" << endl;
+       cout << "SurfRstLineBuilder Points mixed in the processing" << endl;
 #endif
        previousP.ParametersOnS(U,V);
        Exts.SetValue(previousP.PointOnS(),U,V,
 
 //=======================================================================
 //function : Recadre
-//purpose  : Recadre une section Surface / Restriction
+//purpose  : Reframe section Surface / Restriction
 //=======================================================================
 
 Standard_Boolean BRepBlend_SurfRstLineBuilder::Recadre(Blend_SurfCurvFuncInv&    FinvC,
 #endif
   }
   else {
-      // On doit verifier la valeur de la fonction
+      // It is necessary to check the value of the function
     rsnld.Root(Solinv);
     recadre = FinvC.IsSolution(Solinv,tolesp);
   }
 
-  // En cas d'echecs, on regarde si un autre arc 
-  // peut faire l'affaire (cas des sorties a proximite d'un vertex)
+  // In case of fail, it is checked if another arc 
+  // can be useful (case of output at the proximity of a vertex)
   if (!recadre) {
 
     IndexSol =  ArcToRecadre(sol, IndexSol, 
                             lastpt2d, pt2d, pmin);
     if (IndexSol == 0) {
-      return Standard_False; // Pas d'autre solution
+      return Standard_False; // No other solution
     }
 
     domain1->Init();
 #endif
     }
     else {
-      // On doit verifier la valeur de la fonction
+      // It is necessary to check the value of the function
       rsnld.Root(Solinv);
       recadre = FinvC.IsSolution(Solinv,tolesp);
     }
     if (!domain2->MoreVertex()) {
       IsVtx = Standard_False;
     }
-    // On recalcule la section par resolution directe, sinon, on se recupere 
-    // des incoherences entre le parametre et sol dues au baillement.
+    // The section is recalculated by direct resolution, otherwise 
+    // incoherences between the parameter and the ground caused by yawn are returned.
 
     math_Vector infbound(1,3),supbound(1,3);
     math_Vector parinit(1,3),tolerance(1,3);
 
 Blend_Status BRepBlend_SurfRstLineBuilder::CheckDeflectionOnSurf(const Blend_Point& CurPoint)
 {
-  //Controles 3d du Blend_CSWalking.
+  //Controls 3d of Blend_CSWalking.
 
-  // regle par tests dans U4 correspond a 11.478 d
+  // rule by tests in U4 corresponds to 11.478 d
   const Standard_Real CosRef3D = 0.98;
   Standard_Real Cosi=0, Cosi2=0;
   Standard_Boolean curpointistangent = CurPoint.IsTangencyPoint();
   if(!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
 
   if (Norme <= tolesp*tolesp){
-    // il faudra peut etre  forcer meme point
+    // it can be necessary to force same point
     return Blend_SamePoints;
   }
   if(!prevpointistangent){
       return Blend_SamePoints;
     }
     Cosi = sens*Corde*prevTg;
-    if (Cosi <0.) { // angle 3d>pi/2. --> retour arriere
+    if (Cosi <0.) { // angle 3d>pi/2. --> return back
       return Blend_Backward;
     }
     
   }
   
   if(!curpointistangent){
-    // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+    // Check if it is necessary to control the sign of prevtg*Tgsurf
     Cosi = sens*Corde*Tgsurf;
     Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
     if (Cosi2 < CosRef3D || Cosi < 0.) { 
   }  
 
   if(!curpointistangent && !prevpointistangent){
-    // Estimation de la fleche courante
+    // Estimation of the current arrow
     Standard_Real FlecheCourante = 
       (prevTg.Normalized().XYZ()-Tgsurf.Normalized().XYZ()).SquareModulus()*Norme/64.;
     
       return Blend_StepTooSmall;
     }
     if (FlecheCourante > fleche*fleche) {
-      // pas trop grand : commentaire interessant
+      // not too great : 
       return Blend_StepTooLarge;
     }
   }
 
 Blend_Status BRepBlend_SurfRstLineBuilder::CheckDeflectionOnRst(const Blend_Point& CurPoint)
 {
-  //Controles 3d du Blend_CSWalking.
+  //Controls 3D of Blend_CSWalking.
 
-  // regle par tests dans U4 correspond a 11.478 d
+  // rule by tests in U4 corresponds to 11.478 d
   const Standard_Real CosRef3D = 0.98;
   Standard_Real Cosi, Cosi2;
   Standard_Boolean curpointistangent = CurPoint.IsTangencyPoint();
   if(!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
 
   if (Norme <= tolesp*tolesp){
-    // il faudra peut etre  forcer meme point
+    // it can be necessary to force same point
     return Blend_SamePoints;
   }
   if(!prevpointistangent){
       return Blend_SamePoints;
     }
     Cosi = sens*Corde*prevTg;
-    if (Cosi <0.) { // angle 3d>pi/2. --> retour arriere
+    if (Cosi <0.) { // angle 3d>pi/2. --> return back
       return Blend_Backward;
     }
     
   }
   
   if(!curpointistangent){
-    // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+    // Check if it is necessary to control the sign of prevtg*Tgsurf
     Cosi = sens*Corde*Tgsurf;
     Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
     if (Cosi2 < CosRef3D || Cosi < 0.) { 
   }  
 
   if(!curpointistangent && !prevpointistangent){
-    // Estimation de la fleche courante
+    // Estimation of the current arrow
     Standard_Real FlecheCourante = 
       (prevTg.Normalized().XYZ()-Tgsurf.Normalized().XYZ()).SquareModulus()*Norme/64.;
     
       return Blend_StepTooSmall;
     }
     if (FlecheCourante > fleche*fleche) {
-      // pas trop grand : commentaire interessant
+      // not too great
       return Blend_StepTooLarge;
     }
   }
 {
   math_Vector tolerance(1,3);
   Func.GetTolerance(tolerance,tolesp);
-  //cote pcurve.
+  //face pcurve.
   Standard_Real w = sol(3);
   if(w < rst->FirstParameter() - tolerance(3)||
      w > rst->LastParameter() + tolerance(3)){
   }
   else SituOnC = TopAbs_ON;
 
-  //cote surface
+  //face surface
   gp_Pnt2d p2d(sol(1),sol(2));
   SituOnS = domain1->Classify(p2d,Min(tolerance(1),tolerance(2)),0);
 
-  //decrochage
+  //lost contact
   gp_Vec tgs,nors;
   Decroch = Func.Decroch(sol,tgs,nors);
 
 
 // Author:    Jacques GOUSSARD
 // Copyright: OPEN CASCADE 1993
 
-// Modified 09/09/1996 PMN Ajout de Nb(Intervalls), IsRationnal
-//                         Optimisation, utilisation de GetCircle
-// Modified 20/02/1998 PMN Gestion des surfaces singulieres
+// Modified 09/09/1996 PMN Adde Nb(Intervalls), IsRationnal
+//                         Optimisation, use of GetCircle
+// Modified 20/02/1998 PMN Singular surfaces management
 
 #include <BlendFunc_ConstRad.ixx>
 
                                  distmin(RealLast()),
                                  mySShape(BlendFunc_Rational)
 { 
-// Initialisaton des variables de controle du cache.
+// Initialisaton of cash control variables.
   tval = -9.876e100;
   xval.Init(-9.876e100);
   myXOrder = -1;
 
 //=======================================================================
 //function : ComputeValues
-//purpose  : Passage OBLIGATOIRE pour tous les calculs
-//           Cette methode gere les positionemment sur Surfaces et Courbe
-//           Calcul les equation et leurs derives partielle
-//           Stock certains resultat intermediaire dans les champs pour etre
-//           utiliser dans d'autre methodes.
+//purpose  : OBLIGATORY passage for all calculations
+//           This method manages positioning on Surfaces and Curves
+//           Calculate the equations and their partial derivates
+//           Stock certain intermediate results in fields to 
+//           use in other methods.
 //=======================================================================
 
 Standard_Boolean BlendFunc_ConstRad::ComputeValues(const math_Vector& X,
                                                    const Standard_Boolean byParam,
                                                    const Standard_Real Param)
 {
- // declaration statique afin d'eviter la realloc systematique
+ // static declaration to avoid systematic reallocation
  
  static gp_Vec d3u1,d3v1,d3uuv1,d3uvv1,d3u2,d3v2,d3uuv2,d3uvv2; 
  static gp_Vec d1gui, d2gui, d3gui;
  static Standard_Real invnormtg, dinvnormtg;
  Standard_Real T =  Param, aux;
 
- // Cas du parametre implicite
+ // Case of implicite parameter
  if ( !byParam) { T = param;}
 
- // Le travail est il dejas fait ?
+ // Is the work already done ?
  Standard_Boolean myX_OK = (Order<=myXOrder) ;
  for (Standard_Integer ii=1; ((ii<=X.Length()) && myX_OK); ii++) {
    myX_OK = ( X(ii) == xval(ii) );
    return Standard_True;
  }
 
- // Traitement de t
+ // Processing of t
  if (!t_OK) {
    tval = T;
    if (byParam) { myTOrder = Order;}
    else         { myTOrder = 0;}
-   //----- Positionement sur la courbe ----------------
+   //----- Positioning on the curve ----------------
    switch (myTOrder) {
    case 0 :
      {
    }
  }
 
- // Traitement de X
+ // Processing of X
  if (!myX_OK) {
    xval = X;
    myXOrder = Order;
-   //-------------- Positionement sur les surfaces -----------------
+   //-------------- Positioning on surfaces -----------------
    switch (myXOrder) {
    case 0 :
      {
    default:
      return Standard_False;
    }
-   // Cas des surfaces degeneree
+   // Case of degenerated surfaces
    if (nsurf1.Magnitude() < Eps ) {
      //gp_Vec normal;
      gp_Pnt2d P(X(1), X(2)); 
    }
  }
 
- // -------------------- Positionement a l'ordre 0 ---------------------
+ // -------------------- Positioning of order 0 ---------------------
  Standard_Real invnorm1, invnorm2, ndotns1, ndotns2, theD;
  gp_Vec ncrossns1,ncrossns2,resul,temp;
 
 
  if (invnorm1 > Eps) invnorm1 = ((Standard_Real) 1) /invnorm1;
  else {
-   invnorm1 = 1; // Insufisant, mais il ne faut pas planter
+   invnorm1 = 1; // Unsatisfactory, but it is not necessary to crash
 #if DEB
    cout << " ConstRad : Surface singuliere " << endl;
 #endif
  }
  if (invnorm2 > Eps) invnorm2 = ((Standard_Real) 1) /invnorm2;
  else {
-   invnorm2 = 1; // Insufisant, mais il ne faut pas planter
+   invnorm2 = 1; //  Unsatisfactory, but it is not necessary to crash
 #if DEB
    cout << " ConstRad : Surface singuliere " << endl;
 #endif
  E(3) = resul.Y();
  E(4) = resul.Z();
 
- // -------------------- Positionement a l'ordre 1 ---------------------
+ // -------------------- Positioning of order 1 ---------------------
  if (Order >= 1) {
    Standard_Real  grosterme, cube, carre;
   
    DEDX(1,4) = nplan.Dot(d1v2)/2;
 
    cube =invnorm1*invnorm1*invnorm1;
-   // Derivee par rapport a u1
+   // Derived in relation to u1
    grosterme = - ncrossns1.Dot(nplan.Crossed(dns1u1))*cube;
    dndu1.SetLinearForm( grosterme*ndotns1
                      + invnorm1*nplan.Dot(dns1u1), nplan,
    DEDX(3,1) = resul.Y();
    DEDX(4,1) = resul.Z();
 
-   // Derivee par rapport a v1
+   // Derived in relation to v1
 
    grosterme = - ncrossns1.Dot(nplan.Crossed(dns1v1))*cube;
    dndv1.SetLinearForm( grosterme*ndotns1
    DEDX(4,2) = resul.Z();
 
    cube = invnorm2*invnorm2*invnorm2;
-   // Derivee par rapport a u2
+   // Derived in relation to u2
    grosterme = - ncrossns2.Dot(nplan.Crossed(dns1u2))*cube;
    dndu2.SetLinearForm( grosterme*ndotns2
                       +invnorm2*nplan.Dot(dns1u2), nplan,
    DEDX(3,3) = resul.Y();
    DEDX(4,3) = resul.Z();
 
-   // Derivee par rapport a v2
+   // Derived in relation to v2
    grosterme = -ncrossns2.Dot(nplan.Crossed(dns1v2))*cube;
    dndv2.SetLinearForm( grosterme*ndotns2
                       +invnorm2*nplan.Dot(dns1v2), nplan,
 
    if (byParam) {
      temp.SetXYZ( (pts1.XYZ()+pts2.XYZ())/2 - ptgui.XYZ());
-     // Derivee de n1 par rapport a w     
+     // Derived from n1 in relation to w     
      grosterme = ncrossns1.Dot(dnplan.Crossed(nsurf1))*invnorm1*invnorm1;
      dn1w.SetLinearForm((dnplan.Dot(nsurf1)-grosterme*ndotns1)*invnorm1, nplan,
                         ndotns1*invnorm1,dnplan,
                         grosterme*invnorm1,nsurf1);
   
-     // Derivee de n2 par rapport a w
+     // Derivee from n2 in relation to w
      grosterme = ncrossns2.Dot(dnplan.Crossed(nsurf2))*invnorm2*invnorm2;
      dn2w.SetLinearForm((dnplan.Dot(nsurf2)-grosterme*ndotns2)*invnorm2,nplan,
                        ndotns2*invnorm2,dnplan,
      DEDT(3) =  ray1*dn1w.Y() - ray2*dn2w.Y();
      DEDT(4) =  ray1*dn1w.Z() - ray2*dn2w.Z();
    }
-   // ------   Positionemement a l'ordre 2  -----------------------------
+   // ------   Positioning of order 2  -----------------------------
    if (Order == 2) {
 //     gp_Vec d2ndu1,  d2ndu2, d2ndv1, d2ndv2, d2nduv1, d2nduv2;
      gp_Vec d2ns1u1,  d2ns1u2, d2ns1v1, d2ns1v2, d2ns1uv1, d2ns1uv2;
                                // ================
      carre = invnorm1*invnorm1;
      cube  = carre*invnorm1;
-     // Derivee double par rapport a u1       
-       // Derivation de la norme
+     // Derived double compared to u1       
+       // Derived from the norm
      d2ns1u1.SetLinearForm(1, d3u1.Crossed(d1v1),
                           2, d2u1.Crossed(d2uv1),
                           1, d1u1.Crossed(d3uuv1));
      D2EDX2(3,1,1) = resul.Y();
      D2EDX2(4,1,1) = resul.Z();
 
-     // Derivee double par rapport a u1, v1       
-       // Derivation de la norme
+     // Derived double compared to u1, v1       
+       // Derived from the norm
      d2ns1uv1 =  (d3uuv1.Crossed(d1v1))
               +  (d2u1  .Crossed(d2v1))
              +  (d1u1  .Crossed(d3uvv1));
      DSecn = (nplan.Crossed(dns1v1)).Dot(nplan.Crossed(dns1u1))
            +  ncrossns1.Dot(nplan.Crossed(d2ns1uv1));
      grosterme  = (3*uterm*vterm*carre-DSecn)*cube;
-     uterm *= -cube; //et seulement maintenant
+     uterm *= -cube; //and only now
      vterm *= -cube;
        
      p1 = nplan.Dot(dns1u1);
      D2EDX2(3,2,1) = D2EDX2(3,1,2) = resul.Y();
      D2EDX2(4,2,1) = D2EDX2(4,1,2) = resul.Z();    
 
-     // Derivee double par rapport a v1       
-       // Derivation de la norme
+     // Derived double compared to v1       
+       // Derived from the norm
      d2ns1v1.SetLinearForm(1, d1u1.Crossed(d3v1),
                           2, d2uv1.Crossed(d2v1),
                           1, d3uvv1.Crossed(d1v1));
                                // ================
      carre = invnorm2*invnorm2;
      cube  = carre*invnorm2;
-     // Derivee double par rapport a u2       
-       // Derivation de la norme
+     // Derived double compared to u2       
+       // Derived from the norm
      d2ns1u2.SetLinearForm(1, d3u2.Crossed(d1v2),
                           2, d2u2.Crossed(d2uv2),
                           1, d1u2.Crossed(d3uuv2));
      D2EDX2(3,3,3) = resul.Y();
      D2EDX2(4,3,3) = resul.Z();
 
-     // Derivee double par rapport a u2, v2       
-       // Derivation de la norme
+     // Derived double compared to u2, v2       
+       // Derived from the norm
      d2ns1uv2 =  (d3uuv2.Crossed(d1v2))
               +  (d2u2  .Crossed(d2v2))
              +  (d1u2  .Crossed(d3uvv2));
      DSecn = (nplan.Crossed(dns1v2)).Dot(nplan.Crossed(dns1u2))
            +  ncrossns2.Dot(nplan.Crossed(d2ns1uv2));
      grosterme  = (3*uterm*vterm*carre-DSecn)*cube;
-     uterm *= -cube; //et seulement maintenant
+     uterm *= -cube; //and only now
      vterm *= -cube;
        
      p1 = nplan.Dot(dns1u2);
      D2EDX2(3,4,3) = D2EDX2(3,3,4) = resul.Y();
      D2EDX2(4,4,3) = D2EDX2(4,3,4) = resul.Z();    
 
-     // Derivee double par rapport a v2       
-       // Derivation de la norme
+     // Derived double compared to v2       
+       // Derived from the norm
      d2ns1v2.SetLinearForm(1, d1u2.Crossed(d3v2),
                           2, d2uv2.Crossed(d2v2),
                           1, d3uvv2.Crossed(d1v2));
 
      if (byParam) {
        Standard_Real tterm;
-        //  ---------- Derivation double en t, X --------------------------
+        //  ---------- Derivation double in t, X --------------------------
        D2EDXDT(1,1) = dnplan.Dot(d1u1)/2;
        D2EDXDT(1,2) = dnplan.Dot(d1v1)/2;
        D2EDXDT(1,3) = dnplan.Dot(d1u2)/2;
 
        carre = invnorm1*invnorm1;
        cube = carre*invnorm1;
-       //--> Derivee par rapport a u1 et t
+       //--> Derived compared to u1 and t
        tterm =  ncrossns1.Dot(dnplan.Crossed(nsurf1));
        smallterm  = - tterm*cube;
-       // Derivation de la norme
+       // Derived from the norm
        uterm =  ncrossns1.Dot(nplan. Crossed(dns1u1));
        DSecn = (nplan.Crossed(dns1u1)).Dot(dnplan.Crossed(nsurf1))
              + ncrossns1.Dot(dnplan.Crossed(dns1u1));
        D2EDXDT(3,1) = resul.Y();
        D2EDXDT(4,1) = resul.Z();
 
-       //--> Derivee par rapport a v1 et t
-       // Derivation de la norme
+       //--> Derived compared to v1 and t
+       // Derived from the norm
        uterm =  ncrossns1.Dot(nplan. Crossed(dns1v1));
        DSecn = (nplan. Crossed(dns1v1)).Dot(dnplan.Crossed(nsurf1))
              + ncrossns1.Dot(dnplan.Crossed(dns1v1));
 
        carre = invnorm2*invnorm2;
        cube = carre*invnorm2;
-       //--> Derivee par rapport a u2 et t
+       //--> Derived compared to u2 and t
        tterm =  ncrossns2.Dot(dnplan.Crossed(nsurf2));
        smallterm = -tterm*cube;
-       // Derivation de la norme
+       // Derived from the norm
        uterm =  ncrossns2.Dot(nplan. Crossed(dns1u2));
        DSecn = (nplan. Crossed(dns1u2)).Dot(dnplan.Crossed(nsurf2))
             + ncrossns2.Dot(dnplan.Crossed(dns1u2));
        D2EDXDT(3,3) = resul.Y();
        D2EDXDT(4,3) = resul.Z();
 
-       //--> Derivee par rapport a v2 et t
-       // Derivation de la norme
+       //--> Derived compared to v2 and t
+       // Derived from the norm
        uterm =  ncrossns2.Dot(nplan. Crossed(dns1v2));
        DSecn = (nplan.Crossed(dns1v2)).Dot(dnplan.Crossed(nsurf2))
             +  ncrossns2.Dot(dnplan.Crossed(dns1v2)); 
        D2EDXDT(4,4) = resul.Z();     
 
 
-        //  ---------- Derivation double en t -----------------------------
-    // Derivee de n1 par rapport a w
+        //  ---------- Derivation double in t -----------------------------
+    // Derived from n1 compared to w
        carre = invnorm1*invnorm1;
        cube = carre*invnorm1;
-       // Derivation de la norme
+       // Derived from the norm
        DPrim =  ncrossns1.Dot(dnplan.Crossed(nsurf1));
        smallterm = - 2*DPrim*cube;
        DSecn     = (dnplan.Crossed(nsurf1)).SquareMagnitude()
                             ndotns1*invnorm1,   d2nplan);
        d2n1w += temp;
   
-     // Derivee de n2 par rapport a w
+     // Derived from n2 compared to w
        carre = invnorm2*invnorm2;
        cube = carre*invnorm2;
-       // Derivation de la norme
+       // Derived from the norm
        DPrim =  ncrossns2.Dot(dnplan.Crossed(nsurf2));
        smallterm = - 2*DPrim*cube;
        DSecn     = (dnplan.Crossed(nsurf2)).SquareMagnitude()
 
 //=======================================================================
 //function : Set
-//purpose  : Segmente la courbe a sa partie utile.
-//           La prcision est prise arbitrairement petite !?
+//purpose  : Segmentation of the useful part of the curve
+//           Precision is taken at random and small !?
 //=======================================================================
 
 void BlendFunc_ConstRad::Set(const Standard_Real First, const Standard_Real Last)
   if (Abs(E(1)) <= Tol &&
       E(2)*E(2) + E(3)*E(3) +  E(4)*E(4) <= Tol*Tol) { 
 
-    // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+    // ns1, ns2 and  np are copied locally to avoid crushing the fields !
     gp_Vec ns1,ns2,np;
     ns1 = nsurf1;
     ns2 = nsurf2;
   
     norm = nplan.Crossed(ns1).Magnitude();
     if (norm < Eps)  {
-      norm = 1; // Insufisant, mais il ne faut pas planter
+      norm = 1; // Unsatisfactory, but it is not necessary to stop
     }
     ns1.SetLinearForm(nplan.Dot(ns1)/norm,nplan, -1./norm, ns1);
 
     norm = nplan.Crossed(ns2).Magnitude();
     if (norm < Eps)  {
-      norm = 1; // Insufisant, mais il ne faut pas planter
+      norm = 1; // Unsatisfactory, but it is not necessary to stop
     }
     ns2.SetLinearForm(nplan.Dot(ns2)/norm,nplan, -1./norm, ns2);   
 
       tg22d.SetCoord(solution(3),solution(4));
     }
  
-  // mise a jour de maxang
+  // update of maxang
 
     if (ray1 > 0.) {
       ns1.Reverse();
     Cosa = ns1.Dot(ns2);
     Sina = np.Dot(ns1.Crossed(ns2));
     if (choix%2 != 0) {
-      Sina = -Sina;  //nplan est change en -nplan
+      Sina = -Sina;  //nplan is changed in -nplan
     }
 
     if(Cosa > 1.) {Cosa = 1.; Sina = 0.;}
     Angle = ACos(Cosa);
 
- // Recadrage sur ]-pi/2, 3pi/2]
+ // Reframing on  ]-pi/2, 3pi/2]
     if (Sina <0.) {
       if (Cosa > 0.) Angle = -Angle;
       else           Angle =  2.*PI - Angle;
   Standard_Real  norm1;
   norm1 = nplan.Crossed(ns1).Magnitude();
   if (norm1 < Eps)  {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
   }   
   ns1.SetLinearForm(nplan.Dot(ns1)/norm1,nplan, -1./norm1,ns1);
   Center.SetXYZ(pts1.XYZ()+ray1*ns1.XYZ());
 
-// on oriente ns1 du centre vers pts1,
+// ns1 is oriented from the center to pts1,
 
   if (ray1 > 0.) {
     ns1.Reverse();
   C.SetPosition(gp_Ax2(Center,np,ns1));
   Pdeb = 0.;
   Pfin = ElCLib::Parameter(C,pts2);
-  // Test des angles negatif et quasi null : Cas Singulier
+  // Test negative and almost null angles : Singular Case
   if (Pfin>1.5*PI) {
     np.Reverse();
     C.SetPosition(gp_Ax2(Center,np,ns1));
 void BlendFunc_ConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weigths) const 
 {
   BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weigths );
-  // On suppose que cela ne depend pas du Rayon!
+  // It is supposed that it does not depend on the Radius!
 }
 
 //=======================================================================
 
 //=======================================================================
 //function : GetTolerance
-//purpose  : Determine les Tolerances a utiliser dans les approximations.
+//purpose  : Determine Tolerances used for approximations.
 //=======================================================================
 void BlendFunc_ConstRad::GetTolerance(const Standard_Real BoundTol, 
                                      const Standard_Real SurfTol, 
   Ok = ComputeValues(X, 0, Standard_True, prm);
   distmin = Min (distmin, pts1.Distance(pts2));
 
-  // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+  // ns1, ns2, np are copied locally to avoid crushing the fields !
   ns1 = nsurf1;
   ns2 = nsurf2;
   np = nplan;
   norm1 = nplan.Crossed(ns1).Magnitude();
   norm2 = nplan.Crossed(ns2).Magnitude();
   if (norm1 < Eps)  {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 //#if DEB
 //    cout << " ConstRad : Surface singuliere " << endl;
 //#endif
   }
   if (norm2 < Eps) {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 //#if DEB
 //    cout << " ConstRad : Surface singuliere " << endl;
 //#endif
 
   Center.SetXYZ(pts1.XYZ()+ray1*ns1.XYZ());
 
-// on oriente ns1 (resp. ns2) du centre vers pts1 (resp. pts2),
-// et on rend direct le triedre ns1,ns2,nplan.
+// ns1 (resp. ns2) is oriented from center to pts1 (resp. pts2),
+// and the triedron ns1,ns2,nplan is made direct.
 
   if (ray1 > 0.) {
     ns1.Reverse();
   P.ParametersOnS1(sol(1),sol(2));
   P.ParametersOnS2(sol(3),sol(4));
 
-  // Calculs des equations
+  // Calculation of equations
   ComputeValues(sol, 1, Standard_True, prm);
   distmin = Min (distmin, pts1.Distance(pts2));
 
-  // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+  // ns1, ns2, np are copied locally to avoid crushing the fields !
   ns1 = nsurf1;
   ns2 = nsurf2;
   np = nplan;
 
   if ( ! pts1.IsEqual(pts2, 1.e-4)) {
 
-    // Calcul des derives Traitement Normal
+    // Calculation of derivates Processing Normal
     math_Gauss Resol(DEDX, 1.e-9);
 
     if (Resol.IsDone()) {  
   }
 
 
-  // Les poles 2d  
+  // Tops 2d  
   Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
   Poles2d(Poles2d.Upper()).SetCoord(sol(3),sol(4));
   if (!istgt) {
     DPoles2d(Poles2d.Upper()).SetCoord(secmember(3),secmember(4));
   }
 
-  // on traite le cas linear...
+  // the linear case is processed...
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts1;
     Poles(upp) = pts2;
     return (!istgt);
   }
 
-  // Cas du cercle
+  // Case of the circle
   norm1 = nplan.Crossed(ns1).Magnitude();
   norm2 = nplan.Crossed(ns2).Magnitude();
   if (norm1 < Eps) {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " ConstRad : Surface singuliere " << endl;
 #endif
   }
   if (norm2 < Eps) {
-   norm2 = 1; // Insufisant, mais il ne faut pas planter
+   norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
    cout << " ConstRad : Surface singuliere " << endl;
 #endif
     tgc.SetLinearForm(ray1,dnorm1w,tg1); //  = tg1.Added(ray1*dn1w);
   }
 
-  // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
-  // et on rend le triedre ns1,ns2,nplan direct
+  // ns1 is oriented from the center to pts1, and ns2 from the center to pts2
+  // and the trihedron ns1,ns2,nplan is made direct
 
   if (ray1 > 0.) {
     ns1.Reverse();
 # endif 
 */
 
-  // Calculs des equations
+  // Calculation of equations
   ComputeValues(X, 2, Standard_True, prm);
   distmin = Min (distmin, pts1.Distance(pts2));
 
 
 #endif
 */
-  // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+  // ns1, ns2, np are copied locally to avois crushing the fields !
   ns1 = nsurf1;
   ns2 = nsurf2;
   np  = nplan;
   dnp = dnplan;
   d2np = d2nplan;
 
-  // Calcul des derives
+  // Calculation of derivatives
 
 
   if ( ! pts1.IsEqual(pts2, 1.e-4)) {
-    math_Gauss Resol(DEDX, 1.e-9); // !Tol a affiner !!!!! 
-    // Calcul des derives Traitement Normal
+    math_Gauss Resol(DEDX, 1.e-9); // Precise tolerance !!!!! 
+    // Calculation of derivatives Processing Normal
     if (Resol.IsDone()) {  
       Resol.Solve(-DEDT, sol);
       D2EDX2.Multiply(sol, D2DXdSdt);    
     d2norm2w.SetLinearForm(secmember(3),dndu2, secmember(4),dndv2, temp);
   }
 
-  // Les poles 2d  
+  // Tops 2d  
   Poles2d(Poles2d.Lower()).SetCoord(X(1),X(2));
   Poles2d(Poles2d.Upper()).SetCoord(X(3),X(4));
   if (!istgt) {
     D2Poles2d(Poles2d.Upper()).SetCoord(secmember(3), secmember(4));    
   }
 
-  // on traite le cas linear...
+  // linear case is processed...
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts1;
     Poles(upp) = pts2;
     return (!istgt);
   }
 
-  // Cas du cercle
+  // Case of circle
   norm1 = nplan.Crossed(ns1).Magnitude();
   norm2 = nplan.Crossed(ns2).Magnitude();
   if (norm1 < Eps) {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " ConstRad : Surface singuliere " << endl;
 #endif
   }
   if (norm2 < Eps) {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " ConstRad : Surface singuliere " << endl;
 #endif
     dtgc.SetLinearForm(ray1, d2norm1w, dtg1);
   }
 
-  // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
-  // et on rend le triedre ns1,ns2,nplan direct
+  // ns1 is oriented from the center to pts1 and ns2 from the center to pts2
+  // trihedron ns1,ns2,nplan is made direct
 
   if (ray1 > 0.) {
     ns1.Reverse();
     axrot.SetDirection(dirax);
   }
   else {
-    axrot.SetDirection(np);  // Pour ne pas planter
+    axrot.SetDirection(np);  // To avoid stop
   }
   if (dnp.Magnitude() >= gp::Resolution()) {
     oriax.SetXYZ(ptgui.XYZ()+
 
 //#endif
   }
   if (norm2 < Eps)  {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 //#if DEB
 //    cout << " ConstRadInv : Surface singuliere " << endl;
 //#endif
   norm1 = ncrossns1.Magnitude();
   norm2 = ncrossns2.Magnitude();
   if (norm1 < Eps)  {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " ConstRadInv : Surface singuliere " << endl;
 #endif
   }
   if (norm2 < Eps)  {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " ConstRadInv : Surface singuliere " << endl;
 #endif
   ndotns1 = nplan.Dot(ns1);
   ndotns2 = nplan.Dot(ns2);
 
-  // Derivee par rapport a u1
+  // Derived compared to u1
 
   temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
   grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
                       d1u1);
 
 
-  // Derivee par rapport a v1
+  // Derived compared to v1
 
   temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
   grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
   }
 
 
-  // derivee par rapport a w (parametre sur ligne guide)
-  // On considere ici que le rayon est constant
+  // derived compared to w (parameter on guideline)
+  // It is assumed that the radius is constant
 
   grosterme = ncrossns1.Dot(dnplan.Crossed(ns1))/norm1/norm1;
   resul1.SetLinearForm(-ray1/norm1*(grosterme*ndotns1-dnplan.Dot(ns1)),nplan,
 
 
 
-  // Derivee par rapport a u2
+  // Derived compared to u2
   temp = d2u2.Crossed(d1v2).Added(d1u2.Crossed(d2uv2));
   grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
   resul1.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
                       ray2/norm2,temp);
   resul1.Subtract(d1u2);
 
-  // Derivee par rapport a v2
+  // Derived compared to v2
   temp = d2uv2.Crossed(d1v2).Added(d1u2.Crossed(d2v2));
   grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
   resul2.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
   norm1 = ncrossns1.Magnitude();
   norm2 = ncrossns2.Magnitude();
   if (norm1 < Eps)  {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " ConstRadInv : Surface singuliere " << endl;
 #endif
   }
   if (norm2 < Eps)  {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " ConstRadInv : Surface singuliere " << endl;
 #endif
   F(3) = resul1.Y();
   F(4) = resul1.Z();
 
-  // Derivee par rapport a u1
+  // Derived compared to u1
 
   temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
   grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
                       d1u1);
 
 
-  // Derivee par rapport a v1
+  // Derived compared to v1
 
   temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
   grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
     D(4,4) = resul2.Z();
   }
 
-  // derivee par rapport a w (parametre sur ligne guide)
-  // On considere ici que le rayon est constant
+  // derived compared to w (parameter on guideline)
+  // It is assumed that the raduis is constant
 
   grosterme = ncrossns1.Dot(dnplan.Crossed(ns1))/norm1/norm1;
   resul1.SetLinearForm(-ray1/norm1*(grosterme*ndotns1-dnplan.Dot(ns1)),nplan,
 
 
 
-  // Derivee par rapport a u2
+  // Derived compared to u2
   temp = d2u2.Crossed(d1v2).Added(d1u2.Crossed(d2uv2));
   grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
   resul1.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
                       ray2/norm2,temp);
   resul1.Subtract(d1u2);
 
-  // Derivee par rapport a v2
+  // Derived compared to v2
   temp = d2uv2.Crossed(d1v2).Added(d1u2.Crossed(d2v2));
   grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
   resul2.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
 
 
 class Corde from BlendFunc
 
-       ---Purpose: Cette fonction calcule le point pts sur la courbe intersection
-       --          entre la normale  a  une courbe (guide) en un parametre choisi
-       --          et une surface  (surf), tel que pts soit a une distance
-       --          donnee de guide.
-       --          X(1),X(2) sont les parametres U,V de pts sur surf.
+       ---Purpose: This function calculates point (pts) on the curve of
+       --          intersection between the normal to a curve (guide)
+       --          in a chosen parameter and a surface  (surf), so
+       --          that pts was at a given distance from the guide.
+       --          X(1),X(2) are the parameters U,V of pts on surf.
 
  
 uses Vector   from math,
 
            
     DerFguide(me: in out; Sol : Vector from math; DerF : out Vec2d from gp);
-       ---Purpose: Derivee de la fonction par rapport au parametre 
-       --          de la ligne guide
+       ---Purpose: Derived of the function compared to the parameter
+       -- of the guideline
                        
                        
     IsSolution(me : in out;
 
     secmember(2) = 2.*d1gui.Dot(temp);
 
 //  gradsol*der = secmember
-//  avec der(1) = dU/dW, der(2) = dU/dW, W est le parametre de guide
+//  with  der(1) = dU/dW, der(2) = dU/dW, W is the guide parameter
 
     math_Gauss Resol(gradsol);
     if (Resol.IsDone()) {
 
 // Author:    Jacques GOUSSARD
 // Copyright: OPEN CASCADE 1993
 
-// Modified 10/09/1996 PMN Ajout de (Nb)Intervalles, IsRationnal 
-//                         + Optimisation.
-// Modified 26/04/1997 PMN Traitement des Singularites
-// Modified 23/06/1997 PMN Pb de division par 0
-// Modified 20/02/1998 PMN Gestion des surfaces singulieres
 
 #include <BlendFunc_EvolRad.ixx>
 
 {
   Standard_Integer ind1=1, ind2=1;
   Standard_Real    Epspar = Precision::PConfusion()*0.99;
-  // en suposant que le positionement fonctionne a PConfusion()/2
+// supposed that positioning works with PConfusion()/2
   Standard_Real    v1, v2;
-// Initialisations : les IND1 et IND2 pointent sur le 1er element
-// de chacune des 2 tables a traiter.INDS pointe sur le dernier
-// element cree de TABSOR
+// Initialisation : IND1 and IND2 point at the 1st element
+// of each of 2 tables to be processed. INDS points at the last
+// element of TABSOR
 
 
-//--- On remplit TABSOR en parcourant TABLE1 et TABLE2 simultanement ---
-//------------------ en eliminant les occurrences multiples ------------
+//--- TABSOR is filled by parsing TABLE1 and TABLE2 simultaneously ---
+//------------------ by removing multiple occurrencies ------------
 
  while ((ind1<=I1.Upper()) && (ind2<=I2.Upper())) {
       v1 = I1(ind1);
       v2 = I2(ind2);
       if (Abs(v1-v2)<= Epspar) {
-// Ici les elements de I1 et I2 conviennent .
+// Here elements of I1 and I2 are suitable.
          Seq.Append((v1+v2)/2);
         ind1++;
          ind2++;
        }
       else if (v1 < v2) {
-       // Ici l' element de I1 convient.
+       // Here the element of I1 is suitable.
          Seq.Append(v1);
          ind1++;
        }
       else {
-// Ici l' element de TABLE2 convient.
+// Here the element of TABLE2 is suitable.
         Seq.Append(v2);
         ind2++;
        }
     }
 
   if (ind1>I1.Upper()) { 
-//----- Ici I1 est epuise, on complete avec la fin de TABLE2 -------
+//----- Here I1 is empty, to be completed with the end of TABLE2 -------
 
     for (; ind2<=I2.Upper(); ind2++) {
       Seq.Append(I2(ind2));
   }
 
   if (ind2>I2.Upper()) { 
-//----- Ici I2 est epuise, on complete avec la fin de I1 -------
+//----- Here I2 is empty, to be completed with the end of I1 -------
 
     for (; ind1<=I1.Upper(); ind1++) {
       Seq.Append(I1(ind1));
   fevol = Law;
   tevol = Law;
 
-// Initialisaton des variables de controle du cache.
+// Initialisaton of cash control variables.
   tval = -9.876e100;
   xval.Init(-9.876e100);
   myXOrder = -1;
 
 //=======================================================================
 //function : ComputeValues
-//purpose  : Passage OBLIGATOIRE pour tous les calculs
-//           Cette methode gere les positionemment sur Surfaces et Courbe
-//           Calcul les equation et leurs derives partielle
-//           Stock certains resultat intermediaire dans les champs pour etre
-//           utiliser dans d'autre methodes.
+//purpose  : OBLIGATORY passage for all computations
+//           This method manages the positioning on Surfaces and Curves
+//           Partial calculation of equations and their derivatives
+//           Storage of some intermediary results in fields to be 
+//           used in other methods.
 //=======================================================================
 
 Standard_Boolean BlendFunc_EvolRad::ComputeValues(const math_Vector& X,
                                                   const Standard_Boolean byParam,
                                                   const Standard_Real Param)
 {
- // declaration statique afin d'eviter la realloc systematique
+ // static declaration to avoid systematic realloc 
  
  static gp_Vec d3u1,d3v1,d3uuv1,d3uvv1,d3u2,d3v2,d3uuv2,d3uvv2; 
  static gp_Vec d1gui, d2gui, d3gui;
  static Standard_Real invnormtg, dinvnormtg;
  Standard_Real T =  Param, aux;
 
- // Cas du parametre implicite
+ // Case of implicit parameter
  if ( !byParam) { T = param;}
 
- // Le travail est il dejas fait ?
+ // The work is done already?
  Standard_Boolean lX_OK =  (Order<=myXOrder);
  Standard_Integer ii;
  for (ii=1; ((ii<=X.Length()) && lX_OK); ii++) {
    return Standard_True;
  }
 
- // Traitement de t
+ // Processing of t
  if (!t_OK) {
    tval = T;
    if (byParam) { myTOrder = Order;}
    else         { myTOrder = 0;}
-   //----- Positionement sur la courbe et la loi----------------
+   //----- Positioning on the curve and the law----------------
    switch (myTOrder) {
    case 0 :
      {
    }
  }
 
- // Traitement de X
+ // Processing of X
  if (!lX_OK) {
    xval = X;
    myXOrder = Order;
-   //-------------- Positionement sur les surfaces -----------------
+   //-------------- Positioning on surfaces -----------------
    switch (myXOrder) {
    case 0 :
      {
    default:
      return Standard_False;
    }
-   // Cas des surfaces degeneree
+   // Case of degenerated surfaces 
    if (nsurf1.Magnitude() < Eps ) {
 //     gp_Vec normal;
      gp_Pnt2d P(X(1), X(2)); 
    }
  }
  
- // -------------------- Positionement a l'ordre 0 ---------------------
+ // -------------------- Positioning of order 0 ---------------------
  Standard_Real invnorm1, invnorm2, ndotns1, ndotns2, theD;
  Standard_Real ray1 = sg1*ray;
  Standard_Real ray2 = sg2*ray;
 
  if (invnorm1 > Eps) invnorm1 = ((Standard_Real) 1) /invnorm1;
   else {
-    invnorm1 = 1; // Insufisant, mais il ne faut pas planter
+    invnorm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
   }
   if (invnorm2 > Eps) invnorm2 = ((Standard_Real) 1) /invnorm2;
   else {
-    invnorm2 = 1; // Insufisant, mais il ne faut pas planter
+    invnorm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
  E(3) = resul.Y();
  E(4) = resul.Z();
 
- // -------------------- Positionement a l'ordre 1 ---------------------
+ // -------------------- Positioning of order 1 ---------------------
  if (Order >= 1) {
    Standard_Real  grosterme, cube, carre;  
 
    DEDX(1,4) = nplan.Dot(d1v2)/2;
 
    cube =invnorm1*invnorm1*invnorm1;
-   // Derivee par rapport a u1
+   // Derived compared to u1
    grosterme = - ncrossns1.Dot(nplan.Crossed(dns1u1))*cube;
    dndu1.SetLinearForm( grosterme*ndotns1
                      + invnorm1*nplan.Dot(dns1u1), nplan,
    DEDX(3,1) = resul.Y();
    DEDX(4,1) = resul.Z();
 
-   // Derivee par rapport a v1
+   // Derived compared to v1
    grosterme = - ncrossns1.Dot(nplan.Crossed(dns1v1))*cube;
    dndv1.SetLinearForm( grosterme*ndotns1
                       +invnorm1*nplan.Dot(dns1v1), nplan,
    DEDX(3,3) = resul.Y();
    DEDX(4,3) = resul.Z();
 
-   // Derivee par rapport a v2
+   // Derived compared to v2
    grosterme = -ncrossns2.Dot(nplan.Crossed(dns1v2))*cube;
    dndv2.SetLinearForm( grosterme*ndotns2
                       +invnorm2*nplan.Dot(dns1v2), nplan,
 
    if (byParam) {
      temp.SetXYZ( (pts1.XYZ()+pts2.XYZ())/2 - ptgui.XYZ());
-     // Derivee de n1 par rapport a w     
+     // Derived from n1 compared to w     
      grosterme = ncrossns1.Dot(dnplan.Crossed(nsurf1))*invnorm1*invnorm1;
      dn1w.SetLinearForm((dnplan.Dot(nsurf1)-grosterme*ndotns1)*invnorm1, nplan,
                         ndotns1*invnorm1,dnplan,
                         grosterme*invnorm1,nsurf1);
   
-     // Derivee de n2 par rapport a w
+     // Derived from n2 compared to w
      grosterme = ncrossns2.Dot(dnplan.Crossed(nsurf2))*invnorm2*invnorm2;
      dn2w.SetLinearForm((dnplan.Dot(nsurf2)-grosterme*ndotns2)*invnorm2,nplan,
                        ndotns2*invnorm2,dnplan,
      DEDT(3) = resul.Y(); 
      DEDT(4) = resul.Z();
    }
-   // ------   Positionemement a l'ordre 2  -----------------------------
+   // ------   Positioning of order 2  -----------------------------
    if (Order == 2) {
 //     gp_Vec d2ndu1,  d2ndu2, d2ndv1, d2ndv2, d2nduv1, d2nduv2;
      gp_Vec d2ns1u1,  d2ns1u2, d2ns1v1, d2ns1v2, d2ns1uv1, d2ns1uv2;
                                // ================
      carre = invnorm1*invnorm1;
      cube  = carre*invnorm1;
-     // Derivee double par rapport a u1       
-       // Derivation de la norme
+     // Derived double compared to u1       
+       // Derived from the norm
      d2ns1u1.SetLinearForm(1, d3u1.Crossed(d1v1),
                           2, d2u1.Crossed(d2uv1),
                           1, d1u1.Crossed(d3uuv1));
      D2EDX2(3,1,1) = resul.Y();
      D2EDX2(4,1,1) = resul.Z();
 
-     // Derivee double par rapport a u1, v1       
-       // Derivation de la norme
+     // Derived double compared to u1, v1       
+       // Derived from the norm
      d2ns1uv1 =  (d3uuv1.Crossed(d1v1))
               +  (d2u1  .Crossed(d2v1))
              +  (d1u1  .Crossed(d3uvv1));
      DSecn = (nplan.Crossed(dns1v1)).Dot(nplan.Crossed(dns1u1))
            +  ncrossns1.Dot(nplan.Crossed(d2ns1uv1));
      grosterme  = (3*uterm*vterm*carre-DSecn)*cube;
-     uterm *= -cube; //et seulement maintenant
+     uterm *= -cube; //and only now
      vterm *= -cube;
        
      p1 = nplan.Dot(dns1u1);
      D2EDX2(3,2,1) = D2EDX2(3,1,2) = resul.Y();
      D2EDX2(4,2,1) = D2EDX2(4,1,2) = resul.Z();    
 
-     // Derivee double par rapport a v1       
-       // Derivation de la norme
+     // Derived double compared to v1       
+       // Derived from the norm
      d2ns1v1.SetLinearForm(1, d1u1.Crossed(d3v1),
                           2, d2uv1.Crossed(d2v1),
                           1, d3uvv1.Crossed(d1v1));
                                // ================
      carre = invnorm2*invnorm2;
      cube  = carre*invnorm2;
-     // Derivee double par rapport a u2       
-       // Derivation de la norme
+     // Derived double compared to u2       
+     // Derived from the norm
      d2ns1u2.SetLinearForm(1, d3u2.Crossed(d1v2),
                           2, d2u2.Crossed(d2uv2),
                           1, d1u2.Crossed(d3uuv2));
      D2EDX2(3,3,3) = resul.Y();
      D2EDX2(4,3,3) = resul.Z();
 
-     // Derivee double par rapport a u2, v2       
-       // Derivation de la norme
+     // Derived double compared to u2, v2       
+     // Derived from the norm
      d2ns1uv2 =  (d3uuv2.Crossed(d1v2))
               +  (d2u2  .Crossed(d2v2))
              +  (d1u2  .Crossed(d3uvv2));
      DSecn = (nplan.Crossed(dns1v2)).Dot(nplan.Crossed(dns1u2))
            +  ncrossns2.Dot(nplan.Crossed(d2ns1uv2));
      grosterme  = (3*uterm*vterm*carre-DSecn)*cube;
-     uterm *= -cube; //et seulement maintenant
+     uterm *= -cube; //and only now
      vterm *= -cube;
        
      p1 = nplan.Dot(dns1u2);
      D2EDX2(3,4,3) = D2EDX2(3,3,4) = resul.Y();
      D2EDX2(4,4,3) = D2EDX2(4,3,4) = resul.Z();    
 
-     // Derivee double par rapport a v2       
-       // Derivation de la norme
+     // Derived double compared to v2       
+       // Derived from the norm
      d2ns1v2.SetLinearForm(1, d1u2.Crossed(d3v2),
                           2, d2uv2.Crossed(d2v2),
                           1, d3uvv2.Crossed(d1v2));
 
      if (byParam) {
        Standard_Real tterm;
-        //  ---------- Derivation double en t, X --------------------------
+        //  ---------- Double Derivation on t, X --------------------------
        D2EDXDT(1,1) = dnplan.Dot(d1u1)/2;
        D2EDXDT(1,2) = dnplan.Dot(d1v1)/2;
        D2EDXDT(1,3) = dnplan.Dot(d1u2)/2;
 
        carre = invnorm1*invnorm1;
        cube = carre*invnorm1;
-       //--> Derivee par rapport a u1 et t
+       //--> Derived compared to u1 and t
        tterm =  ncrossns1.Dot(dnplan.Crossed(nsurf1));
        smallterm  = - tterm*cube;
-       // Derivation de la norme
+       // Derived from the norm
        uterm =  ncrossns1.Dot(nplan. Crossed(dns1u1));
        DSecn = (nplan.Crossed(dns1u1)).Dot(dnplan.Crossed(nsurf1))
              + ncrossns1.Dot(dnplan.Crossed(dns1u1));
        D2EDXDT(3,1) = resul.Y();
        D2EDXDT(4,1) = resul.Z();
 
-       //--> Derivee par rapport a v1 et t
-       // Derivation de la norme
+       //--> Derived compared to v1 and t
+       // Derived from the norm
        uterm =  ncrossns1.Dot(nplan. Crossed(dns1v1));
        DSecn = (nplan. Crossed(dns1v1)).Dot(dnplan.Crossed(nsurf1))
              + ncrossns1.Dot(dnplan.Crossed(dns1v1));
 
        carre = invnorm2*invnorm2;
        cube = carre*invnorm2;
-       //--> Derivee par rapport a u2 et t
+       //--> Derived compared to u2 and t
        tterm =  ncrossns2.Dot(dnplan.Crossed(nsurf2));
        smallterm = -tterm*cube;
-       // Derivation de la norme
+       // Derived from the norm
        uterm =  ncrossns2.Dot(nplan. Crossed(dns1u2));
        DSecn = (nplan. Crossed(dns1u2)).Dot(dnplan.Crossed(nsurf2))
             + ncrossns2.Dot(dnplan.Crossed(dns1u2));
        D2EDXDT(3,3) = resul.Y();
        D2EDXDT(4,3) = resul.Z();
 
-       //--> Derivee par rapport a v2 et t
-       // Derivation de la norme
+       //--> Derived compared to v2 and t
+       // Derived from the norm
        uterm =  ncrossns2.Dot(nplan. Crossed(dns1v2));
        DSecn = (nplan.Crossed(dns1v2)).Dot(dnplan.Crossed(nsurf2))
             +  ncrossns2.Dot(dnplan.Crossed(dns1v2)); 
        D2EDXDT(4,4) = resul.Z();     
 
 
-        //  ---------- Derivation double en t -----------------------------
-    // Derivee de n1 par rapport a w
+        //  ---------- Double derivation on t -----------------------------
+    // Derived from n1 compared to w
        carre = invnorm1*invnorm1;
        cube = carre*invnorm1;
-       // Derivation de la norme
+       // Derived from the norm
        DPrim =  ncrossns1.Dot(dnplan.Crossed(nsurf1));
        smallterm = - 2*DPrim*cube;
        DSecn     = (dnplan.Crossed(nsurf1)).SquareMagnitude()
                             ndotns1*invnorm1,   d2nplan);
        d2n1w += temp;
   
-     // Derivee de n2 par rapport a w
+     // Derived from n2 compared to w
        carre = invnorm2*invnorm2;
        cube = carre*invnorm2;
-       // Derivation de la norme
+       // Derived from the norm
        DPrim =  ncrossns2.Dot(dnplan.Crossed(nsurf2));
        smallterm = - 2*DPrim*cube;
        DSecn     = (dnplan.Crossed(nsurf2)).SquareMagnitude()
 
 //=======================================================================
 //function : Set
-//purpose  : Segmente la courbe a sa partie utile.
-//           La precision est prise arbitrairement petite !?
+//purpose  : Segments curve in its useful part.
+//           Small precision is taken at random
 //=======================================================================
 
 void BlendFunc_EvolRad::Set(const Standard_Real First,
   if (Abs(E(1)) <= Tol &&
       E(2)*E(2) + E(3)*E(3) +  E(4)*E(4) <= Tol*Tol) { 
 
-    // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+    // ns1, ns2, np are copied locally to avoid crushing the fields !
     gp_Vec ns1, ns2, np;
     ns1 = nsurf1;
     ns2 = nsurf2;
 
     norm = nplan.Crossed(ns1).Magnitude();
     if (norm < Eps)  {
-      norm = 1; // Insufisant, mais il ne faut pas planter
+      norm = 1; // Unsatisfactory, but it is not necessary to stop
     }    
     ns1.SetLinearForm(nplan.Dot(ns1)/norm,nplan, -1./norm, ns1);
 
     norm = nplan.Crossed(ns2).Magnitude();
     if (norm < Eps)  {
-      norm = 1; // Insufisant, mais il ne faut pas planter
+      norm = 1; // Unsatisfactory, but it is not necessary to stop
     }
     ns2.SetLinearForm(nplan.Dot(ns2)/norm,nplan, -1./norm, ns2);     
 
     else {
       istangent = Standard_True;
     }
-    // mise a jour de maxang
+    // update of maxang
 
     if (sg1 > 0.) { // sg1*ray
       ns1.Reverse();
     Cosa = ns1.Dot(ns2);
     Sina = nplan.Dot(ns1.Crossed(ns2));
     if (choix%2 != 0) {
-      Sina = -Sina;  //nplan est change en -nplan
+      Sina = -Sina;  //nplan is changed into -nplan
     }
 
     if(Cosa > 1.) {Cosa = 1.; Sina = 0.;}
     Angle = ACos(Cosa);
-    // Recadrage sur ]-pi/2, 3pi/2]
+    // Reframing on ]-pi/2, 3pi/2]
     if (Sina <0.) {
       if (Cosa > 0.) Angle = -Angle;
       else           Angle =  2.*PI - Angle;
   Standard_Real  norm1;
   norm1 = nplan.Crossed(ns1).Magnitude();
   if (norm1 < Eps)  {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
   }  
   ns1.SetLinearForm(nplan.Dot(ns1)/norm1,nplan, -1./norm1,ns1);
 
   Center.SetXYZ(pts1.XYZ()+sg1*ray*ns1.XYZ());
 
-// on oriente ns1 du centre vers pts1 
+// ns1 is oriented from the center to pts1 
   if (sg1 > 0.) {
     ns1.Reverse();
   }
   C.SetPosition(gp_Ax2(Center,np,ns1));
   Pdeb = 0.;
   Pfin = ElCLib::Parameter(C,pts2);
-  // Test des angles negatif et quasi null : Cas Singulier
+  // Test of negative and almost null angles : Single Case
   if (Pfin>1.5*PI) {
     np.Reverse();
     C.SetPosition(gp_Ax2(Center,np,ns1));
 
 //=======================================================================
 //function : GetTolerance
-//purpose  : Determine les Tolerance a utiliser dans les approximations.
+//purpose  : Determine the Tolerance to be used in approximations.
 //=======================================================================
 void BlendFunc_EvolRad::GetTolerance(const Standard_Real BoundTol, 
                                      const Standard_Real SurfTol, 
                                      math_Vector& Tol1d) const
 {
  Standard_Integer low = Tol3d.Lower() , up=Tol3d.Upper();
- Standard_Real rayon = lengthmin/maxang; // on deduit un rayon
+ Standard_Real rayon = lengthmin/maxang; // a radius is subtracted
  Standard_Real Tol;
  Tol= GeomFill::GetTolerance(myTConv, maxang, rayon,
                              AngleTol, SurfTol);
   P.ParametersOnS1(X(1), X(2));
   P.ParametersOnS2(X(3), X(4));
 
-  // Calcul et stokage de la distmin
+  // Calculation and storage of distmin
   Ok = ComputeValues(X, 0, Standard_True, prm);
   distmin = Min (distmin, pts1.Distance(pts2));
 
-  // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+  // ns1, ns2, np are copied locally to avoid crashing the fields !
   ns1 = nsurf1;
   ns2 = nsurf2;
   np = nplan;
   norm1 = nplan.Crossed(ns1).Magnitude();
   norm2 = nplan.Crossed(ns2).Magnitude();
   if (norm1 < Eps) {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
   }
   if (norm2 < Eps) {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
   Center.SetXYZ(pts1.XYZ()+sg1*ray*ns1.XYZ());
 
 
-// on oriente ns1 (resp. ns2) du centre vers pts1 (resp. pts2),
-// et on rend direct le triedre ns1,ns2,nplan.
+// ns1 (resp. ns2) is oriented from center to pts1 (resp. pts2),
+// and the trihedron ns1,ns2,nplan is made direct.
 
   if (sg1 > 0.) {
     ns1.Reverse();
   P.ParametersOnS1(sol(1),sol(2));
   P.ParametersOnS2(sol(3),sol(4));
 
-  // Calculs des equations
+  // Calculation of equations
   ComputeValues(sol, 1, Standard_True, prm);
   distmin = Min (distmin, pts1.Distance(pts2));
 
-  // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+  // ns1, ns2, np are copied locally to avoid crashing fields !
   ns1 = nsurf1;
   ns2 = nsurf2;
   np = nplan;
   rayprim = dray;
 
   if ( ! pts1.IsEqual(pts2, 1.e-4)) {  
-    // Calcul des derives  Traitement Normal
+    // Calculation of derived  Normal processing
     math_Gauss Resol(DEDX, 1.e-9);
 
     if (Resol.IsDone()) {    
   }
 
 
-  // Les poles 2d  
+  // Tops 2D  
   Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
   Poles2d(Poles2d.Upper()).SetCoord(sol(3),sol(4));
   if (!istgt) {
     DPoles2d(Poles2d.Upper()).SetCoord(secmember(3),secmember(4));
   }
 
-  // on traite le cas linear...
+  // the linear case is processed...
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts1;
     Poles(upp) = pts2;
     return (!istgt);
   }
 
-  // Cas du cercle
+  // Case of the circle
   norm1 = nplan.Crossed(ns1).Magnitude();
   norm2 = nplan.Crossed(ns2).Magnitude();
   if (norm1 < Eps)  {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
   }
   if (norm2 < Eps) {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
                      tg1);
   }
 
-  // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
-  // et on rend le triedre ns1,ns2,nplan direct
+  // ns1 is oriented from center to pts1, and  ns2 from center to pts2
+  // and the trihedron ns1,ns2,nplan is made direct
 
   if (sg1 > 0.) {
     ns1.Reverse();
     dnp.Reverse();
   }
   
-  if (ray < 0.) { // pour eviter la connerie Abs(dray) qques lignes plus bas
+  if (ray < 0.) { // to avoid Abs(dray) some lines below
     rayprim = -rayprim;
   }
 
 #endif
 */
 
-  // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+  // ns1, ns2, np are copied locally to avoid crashing the fields
   ns1 = nsurf1;
   ns2 = nsurf2;
   np  = nplan;
   raysecn = d2ray;
 
   if ( ! pts1.IsEqual(pts2, 1.e-4)) {
-    math_Gauss Resol(DEDX, 1.e-9); // !Tol a affiner !!!!! 
-    // Calcul des derives Traitement Normal
+    math_Gauss Resol(DEDX, 1.e-9); // Tolerance to precise 
+    // Calculation of derived Normal Processing
     if (Resol.IsDone()) {  
       Resol.Solve(-DEDT, sol);
       D2EDX2.Multiply(sol, D2DXdSdt);    
     d2norm2w.SetLinearForm(secmember(3),dndu2, secmember(4),dndv2, temp);
   }
 
-  // Les poles 2d  
+  // Tops 2d  
   Poles2d(Poles2d.Lower()).SetCoord(X(1),X(2));
   Poles2d(Poles2d.Upper()).SetCoord(X(3),X(4));
   if (!istgt) {
     D2Poles2d(Poles2d.Upper()).SetCoord(secmember(3), secmember(4));    
   }
 
-  // on traite le cas linear...
+  // the linear is processed...
   if (mySShape == BlendFunc_Linear) {
     Poles(low) = pts1;
     Poles(upp) = pts2;
     return (!istgt);
   }
 
-  // Cas du cercle
+  // Case of the circle
   norm1 = nplan.Crossed(ns1).Magnitude();
   norm2 = nplan.Crossed(ns2).Magnitude();
   if (norm1 < Eps)  {
-    norm1 = 1; // Insufisant, mais il ne faut pas planter
+    norm1 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
   }
   if (norm2 < Eps)  {
-    norm2 = 1; // Insufisant, mais il ne faut pas planter
+    norm2 = 1; // Unsatisfactory, but it is not necessary to stop
 #if DEB
     cout << " EvolRad : Surface singuliere " << endl;
 #endif
     dtgc += dtg1;
   }
 
-  // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
-  // et on rend le triedre ns1,ns2,nplan direct
+  // ns1 is oriented from the center to pts1, and ns2 from the center to pts2
+  // and the trihedron ns1,ns2,nplan is made direct
 
   if (sg1 > 0.) {
     ns1.Reverse();
     d2np.Reverse();
   }
    
-  if (ray < 0.) { // pour eviter la connerie Abs(dray) qques lignes plus bas
+  if (ray < 0.) { // to avoid Abs(dray) several lines below
     rayprim = -rayprim;
     raysecn = -raysecn;
   }
 
   if (status == ChFi2d_ConnexionError) return commonVertex;
 
   TopoDS_Edge basisEdge1, basisEdge2, E1, E2;
-  // E1 and E2 are the adjacentes edges to Fillet
+  // E1 and E2 are the adjacent edges to Fillet
 
   if (adjEdge1.IsSame(Fillet)) E1 = adjEdge2;
   else E1 = adjEdge1;
       newEdge1.Location(E1.Location());
     } // if (firstVertex ...
     else if (lastVertex.IsSame(connectionE1Fillet)) { 
-//  syntaxe invalide sur NT
+//  syntax wrong on NT
 //      const Handle(Geom_Curve)& curve = 
 //     BRep_Tool::Curve(E1, loc, first, last);   
       Handle(Geom_Curve) curve = BRep_Tool::Curve(E1, loc, first, last);   
   else {
     // It means the edge support one fillet on each end.
     if (firstVertex.IsSame(connectionE2Fillet)) {
-//  syntaxe invalide sur NT
+//  syntax wrong on NT
 //      const Handle(Geom_Curve)& curve = 
 //     BRep_Tool::Curve(E2, loc, first, last);   
       Handle(Geom_Curve) curve = BRep_Tool::Curve(E2, loc, first, last);
       newEdge2.Location(E2.Location());
     } // if (firstVertex ...
     else if (lastVertex.IsSame(connectionE2Fillet)) {
-//  syntaxe invalide sur NT
+//  syntax wrong on NT
 //      const Handle(Geom_Curve)& curve = 
 //     BRep_Tool::Curve(E2, loc, first, last);   
       Handle(Geom_Curve) curve = BRep_Tool::Curve(E2, loc, first, last);
   gp_Pnt Pnew = BRep_Tool::Pnt(NewExtr);
   Standard_Boolean PonctualEdge = Standard_False;
   Standard_Real Tol = Precision::Confusion();
-//  syntaxe invalide sur NT
+//  syntax wrong on NT
 //      const Handle(Geom_Curve)& curve = 
 //     BRep_Tool::Curve(E1, first, last);   
   Handle(Geom_Curve) curve = BRep_Tool::Curve(E1, first, last);   
   TopoDS_Vertex V4 = TopExp::LastVertex(E2);
 
   //========================================================================
-  //    On a trouve un premier arc.                                        +
+  //    The first arc is found.                                        +
   //========================================================================
 
   TopAbs_Orientation O1,O2;
   Standard_Real param1,param2,param3,param4;
   
   //========================================================================
-  //    Sauvegarde des parties non modifiees sur les aretes touchees.      +
+  //    Save non-modified parts of edges concerned.      +
   //========================================================================
 
   if (V1.IsSame(V)) {
   }
   
   //========================================================================
-  //    Recuperation des supports geometriques.                            +
+  //    Restore geometric supports.                            +
   //========================================================================
 
   Handle(Geom2d_Curve) C1,C2; 
   C2 = BRep_Tool::CurveOnSurface(E2,newFace,ufirst2,ulast2);
 
   //========================================================================
-  //   Determination du cote pour le conge.                                +
+  //   Determination of the face for fillet.                                +
   //========================================================================
 
   gp_Pnt2d p;
   Ve3 = Ve1;
   Ve4 = Ve2;
 
-  // traitement des point de tangence ou de rebroussement
+  // processing of tangency or downcast point 
   if (Ve1.IsParallel(Ve2,Precision::Angular())) {
-    // Ve1 et Ve2 sont paralleles : on met cross a 0
+    // Ve1 and Ve2 are parallel : cross at 0
     cross = 0.;
     if (param1<param2) {
       Ve3 = -Ve1;
     }
 
     if (! Ve4.IsOpposite(Ve3,Precision::Angular())) {
-      // Il y a un vrai point de tangence, on arrete
+      // There is a true tangency point and the calculation is stopped
       status = ChFi2d_TangencyError;
       return filletEdge;
     }
-      // Sinon, c'est un point de rebroussement, on continue
+      // Otherwise this is a downcast point, and the calculation is continued
   }
 
   GccEnt_Position Qual1,Qual2;
        Fillet.Tangency2(nsol,PPU1,PPU2,Ptg2);
         dist = Ptg2.Distance(p);
         inside = (PPU2<param3 && PPU2>param4) || (PPU2<param4 && PPU2>param3);
-        //  cas de l'arc de cercle passant sur la couture
+        //  case of arc of circle passing on the sewing
         if ( ( basisC2->DynamicType() == STANDARD_TYPE(Geom2d_Circle) ) && 
             ( (2*PI<param3 && 2*PI>param4) || (2*PI<param4 && 2*PI>param3) ) ) {
         //  cas param3<param4
     Fillet.Tangency1(numsol,U1,U2,Ptg1);
     Fillet.Tangency2(numsol,Vv1,Vv2,Ptg2);
 
-    // verification de la validite des parametres
+    // check the validity of parameters
     inside = (U2<param1 && U2>param2) || (U2<param2 && U2>param1);
     if ( (basisC1->DynamicType() == STANDARD_TYPE(Geom2d_Circle))
       &&  ( (2*PI<param1 && 2*PI>param2) || (2*PI<param2 && 2*PI>param1) ) ) {
-      // arc de cercle contenant l'origine du cercle
-      //  cas param1<param2
+      // arc of circle containing the circle origin
+      //  case param1<param2
       inside = (param1<U2 && U2<2*PI) || (0<=U2 && U2<param2-2*PI);
-      //  cas param2<param1
+      //  case param2<param1
       inside = inside || (param2<U2 && U2<2*PI) || (0<=U2 && U2<param1-2*PI);
     }
     if (!inside) {
     inside = (Vv2<param3 && Vv2>param4) || (Vv2<param4 && Vv2>param3);
     if ( (basisC2->DynamicType() == STANDARD_TYPE(Geom2d_Circle))
       &&  ( (2*PI<param3 && 2*PI>param4) || (2*PI<param4 && 2*PI>param3) ) ) {
-      // arc de cercle contenant l'origine du cercle
+    // arc of circle containing the circle origin
       //  cas param3<param4
       inside = (param3<Vv2 && Vv2<2*PI) || (0<=Vv2 && Vv2<param4-2*PI);
       //  cas param4<param3
     }
 
     //=======================================================================
-    //   Mise a jour des sommets du conge.                                  +
+    //   Update tops of the fillet.                                  +
     //=======================================================================
     gp_Pnt Pntbid;
     gp_Pnt2d sommet;
 
 
 //=======================================================================
 //function : ConcaveSide
-//purpose  : calcule le cote concave au voisinage de la frontiere
-//           de 2 faces.
+//purpose  : calculate the concave face at the neighborhood of the border of
+//           2 faces.
 //=======================================================================
 
 Standard_Integer ChFi3d::ConcaveSide(const BRepAdaptor_Surface& S1, 
     }
   }
   else { 
-    //les faces sont localement tangentes on bidouille!!
+    //the faces are locally tangent - this is fake!
     if(dint1.Dot(dint2) < 0.){
-      //ici c'est une regularite oubliee
+      //This is a forgotten regularity
       gp_Vec DDU, DDV, DDUV;
       S1.D2(p2d1.X(),p2d1.Y(),pt1,DU1,DV1,DDU,DDV,DDUV);
       DU1 += ( DU1 * dint1 < 0) ? -DDU : DDU;
       }
       else {
 #ifdef DEB
-        cout<<"ConcaveSide : pas de cote concave"<<endl;
+        cout<<"ConcaveSide : no concave face"<<endl;
 #endif
-       //ce 10 montre que la face en bout est dans le prolongement de l'une des deux faces d'appui
+       //This 10 shows that the face at end is in the extension of one of two base faces
        return 10;
       }
     }
     else {
-      //ici ca rebrousse, on prend des points dans les faces
-      //ni trop pres ni trop loin, comme on peut.
+      //here it turns back, the points are taken in faces
+      //neither too close nor too far as much as possible.
       Standard_Real u,v;
 #ifdef DEB
 //      Standard_Real deport = 1000*BRep_Tool::Tolerance(E);
 
 
 is
 
-    -- Construction et donnees generales.
+    -- Construction and general data.
     -------------------------------------
 
     Delete(me:out) is virtual;
                  AngularTolerance   : Real);
 
 
-    -- Acquisition et interrogation concernant les trajets.
+    -- Acquisition and questioning on trajectories.
     -------------------------------------------------------
 
     Remove(me : in out; E : Edge from TopoDS) 
     is static; 
     
     
-    -- Le calcul et la recuperation des resultats.
+    -- Calculation and the restoration of results.
     ----------------------------------------------
 
     Compute(me : in out)
-    ---Purpose: calculation general 
-    --          -geometrie sur l ensemble des aretes,
-    --          -reconstruction topologique
+    ---Purpose: general calculation of geometry on all edges,
+    --          topologic reconstruction.
     is static;
 
     IsDone(me) returns Boolean from Standard is static;
     ---Purpose: returns True if the computation  is  success
     
     Shape(me) returns Shape from TopoDS 
-    ---Purpose: if (Isdone()) rend le resultat.
+    ---Purpose: if (Isdone()) makes the result.
     raises NoSuchObject from Standard
     ---Purpose: if (!Isdone())
     is static;
                Intf,Intl   : in out Boolean from Standard)
 
     returns Boolean from Standard is static;   
-    ---Purpose: Methode, implementee dans les heritants, calculant
-    --          les elements de construction de la surface (conge
-    --          ou chanfrein). 
+    ---Purpose: Method, implemented in the inheritants, calculates
+    --          the elements of construction of the surface (fillet or
+    --          chamfer). 
   
     CallPerformSurf(me          : in out;  
                Stripe          : in out Stripe from ChFiDS;
                 Intf,Intl       : in out Boolean from Standard)
     returns  Boolean
     is deferred protected;     
-    ---Purpose: Methode, implementee dans les heritants, calculant
-    --          les elements de construction de la surface (conge
-    --          ou chanfrein).  
+    ---Purpose: Method, implemented in the inheritants, calculating
+    --          elements of construction of the surface (fillet or
+    --          chamfer).  
 
     PerformSurf(me                   : in out; 
                 Data                 : out SequenceOfSurfData from ChFiDS;
                Forward          : Boolean from Standard;
                 RecP1, RecRst1   : Boolean from Standard;
                 RecP2, RecRst2   : Boolean from Standard)
-    ---Purpose: Calculated a Line of contact edge/edge.
+    ---Purpose: Calculates a Line of contact edge/edge.
     returns Boolean from Standard is static protected;
 
 
 
 fields
 
--- La piece d entree
+-- Input part
 myShape        : Shape from TopoDS;
 
--- Donnees numeriques (tolerances) REMARQUE : il faut virer les tol2d!!!
-angular        : Real from Standard;              -- tangence entre aretes
-tolappangle    : Real from Standard is protected; -- approx angulaire      
+-- Numeric data (tolerances) NOTE : suspend tol2d!!!
+angular        : Real from Standard;              -- tangency of edges
+tolappangle    : Real from Standard is protected; -- angular approximation      
 tolesp         : Real from Standard is protected; -- confusion 3d          : def 1.e-4
 tol2d          : Real from Standard is protected; -- confusion 2d          : def 1.e-5
 tolapp3d       : Real from Standard is protected; -- approx 3d             : def 1.e-4
 tolapp2d       : Real from Standard is protected; -- approx 2d             : def 1.e-5
-fleche         : Real from Standard is protected; -- fleche du walking     : def 1.e-6
+fleche         : Real from Standard is protected; -- vector of walking     : def 1.e-6
 
--- Continuite pour la geometrie approximee
+-- Continuity for the approximated geometry
 myConti        : Shape from GeomAbs is protected;
 
--- Maps de pointeurs arrieres pour travailler
+-- Maps of back-pointers to work
 myEFMap        : Map from ChFiDS is protected;
 myESoMap       : Map from ChFiDS is protected;
 myEShMap       : Map from ChFiDS is protected;
 myVFMap        : Map from ChFiDS is protected;
 myVEMap        : Map from ChFiDS is protected;
 
--- Les outils de stockage et de reconstruction
+-- Tools of storage and reconstruction
 myDS           : HDataStructure from TopOpeBRepDS is protected;
 myCoup         : HBuilder from TopOpeBRepBuild is protected;
 
--- Les outils de stockage interne
+-- Tools of internal storage
 myListStripe   : ListOfStripe from ChFiDS is protected;
 myVDataMap     : StripeMap from ChFiDS is protected;
 myRegul        : Regularities from ChFiDS is protected;
 
--- Les stripes dont le calcul a plante
+-- Stripes the calculation which of hangs
 badstripes     : ListOfStripe from ChFiDS is protected;
 
--- Les vertex au voisinage desquels la finition a plante
+-- Vertexes in the neighborhood which of the finition hangs
 badvertices    : ListOfShape from TopTools is protected;
 
--- donnees calculees pendant le compute pour l historique 
+-- Data calculated during the computation for the history 
 myGenerated    : ListOfShape from TopTools;
 myEVIMap       : DataMapOfShapeListOfInteger from TopTools is protected;
 
--- flag si tout s est bien passe
+-- flag if all has passed well
 done           : Boolean from Standard is protected;
 
--- le resultat
+-- result
 myShapeResult  : Shape from TopoDS;
 
--- flag si il y a un resultat partiel(badshape)
+-- flag there is partial result (badshape)
 hasresult      : Boolean from Standard is protected;
 
--- resultat partiel eventuel
+-- eventual partial result
 badShape       : Shape from TopoDS;
 
 
 
 #ifdef DEB
 #include <OSD_Chronometer.hxx>
 
-// variables pour les performances 
+// variables for performances 
 
 
 OSD_Chronometer cl_total,cl_extent,cl_perfsetofsurf,cl_perffilletonvertex,
   TestTopOpe::Shapes(myShape,bids);
 #endif
   
-  // remplissage de myVDatatMap
+  // filling of myVDatatMap
   ChFiDS_ListIteratorOfListOfStripe itel;
   
   for (itel.Initialize(myListStripe);itel.More(); itel.Next()) {
     else if (itel.Value()->Spine()->LastStatus() == ChFiDS_FreeBoundary)
       ExtentOneCorner(itel.Value()->Spine()->LastVertex(),itel.Value());
   }
-  // preanalyse pour  evaluer les prolongements.
+  // preanalysis to evaluate the extensions.
   ExtentAnalyse();
   
   
   ChFi3d_InitChron(cl_perfsetofsurf);
 #endif
   
-  // Construction de la bande de conge sur chaque stripe.
+  // Construction of the stripe of fillet on each stripe.
   for (itel.Initialize(myListStripe);itel.More(); itel.Next()) {
     itel.Value()->Spine()->SetErrorStatus(ChFiDS_Ok);
     try {
   ChFi3d_InitChron(cl_perffilletonvertex);
 #endif 
   
-  //construire les conges sur chaque vertex +alimenter la Ds
+  //construct fillets on each vertex + feed the Ds
   if (done) {
    //Standard_Integer nbresult=0;
 //    for (Standard_Integer j=1;j<=myVDataMap.Extent();j++) {
     if (done) {
       BRep_Builder B1;
       CompleteDS(DStr,myShape);
-      //Update des tolerances sur vertex au max des aretes adjacentes ou
-      //Update des tolerances sur arete degeneree au max des vertex adjacents.
+      //Update tolerances on vertex to max adjacent edges or
+      //Update tolerances on degenerated edge to max of adjacent vertexes.
       TopOpeBRepDS_CurveExplorer cex(DStr);
       for(;cex.More();cex.Next()){
        TopOpeBRepDS_Curve& c = *((TopOpeBRepDS_Curve*)(void*)&(cex.Curve()));
          its = myCoup->Merged(curshape,TopAbs_IN);
        if(!its.More()) B1.Add(myShapeResult,curshape);
        else {
-         //Si l'ancien type est du Shape est un Shell, on mettre un Shell et non un Solid, Il reste neanmoins un pbleme pour compound de Shell ouvert.
+         //If the old type of Shape is Shell, Shell is placed instead of Solid, 
+          //However there is a problem for compound of open Shell.
          while (its.More()) {
            const TopAbs_ShapeEnum letype = curshape.ShapeType();
            if (letype == TopAbs_SHELL){
       ChFi3d_InitChron(cl_setregul);
 #endif
       
-      // On code les regularites apres coup.
+      // Regularities are coded after cutting.
       SetRegul();
       
       
 #endif
       
   
-  // affichage des temps pour les perfs 
+  // display of time for perfs 
   
 #ifdef DEB  
   cout<<endl; 
 
 //=======================================================================
 //function : PerformSingularCorner
-//purpose  : Charge le vertex et les aretes degeneree.
+//purpose  : Load vertex and degenerated edges.
 //=======================================================================
 
 void ChFi3d_Builder::PerformSingularCorner
 #endif
   for (It.Initialize(myVDataMap(Index)), i=0; It.More(); It.Next(),i++){
     stripe = It.Value(); 
-    // la SurfData en cause et ses CommonPoints,
+    // SurfData concerned and its CommonPoints,
     Standard_Integer sens = 0;
     Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
     Standard_Boolean isfirst = (sens == 1);
     Fd =  stripe->SetOfSurfData()->Sequence().Value(num);
     const ChFiDS_CommonPoint& CV1 = Fd->Vertex(isfirst,1);
     const ChFiDS_CommonPoint& CV2 = Fd->Vertex(isfirst,2);
-    // Est ce toujours degenere ?
+    // Is it always degenerated ?
     if ( CV1.Point().IsEqual( CV2.Point(), 0) ) { 
-      // si oui on stoke le vertex dans la stripe
-      // et on fabrique l'arete en bout
+      // if yes the vertex is stored in the stripe
+      // and the edge at end is created
       if (i==0) Ivtx = ChFi3d_IndexPointInDS(CV1, DStr);
       Standard_Real tolreached;
       Standard_Real Pardeb, Parfin; 
   for (It.Initialize(myVDataMap(Index)), i=0; It.More(); It.Next(),i++){
     stripe = It.Value(); 
     sp = stripe->Spine();
-    // la SurfData en cause et ses CommonPoints,
+    // SurfData and its CommonPoints,
     Standard_Integer sens = 0;
     Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
     isfirst = (sens == 1);
     Fd =  stripe->SetOfSurfData()->Sequence().Value(num);
     const ChFiDS_CommonPoint& CV1 = Fd->Vertex(isfirst,1);
     const ChFiDS_CommonPoint& CV2 = Fd->Vertex(isfirst,2);
-    // Est ce toujours degenere ?
+    // Is it always degenerated ?
     if ( CV1.Point().IsEqual( CV2.Point(), 0) )  
       nondegenere = Standard_False;
     else  toujoursdegenere = Standard_False;
   nba=nba/2;*/
   Standard_Integer nba = ChFi3d_NumberOfEdges(Vtx, myVEMap);
 
-  if (nondegenere) { // Traitement normal
+  if (nondegenere) { // Normal processing
     switch (i) {
     case 1 : 
       {
       }
     }
   }
-  else { // Traitement des cas singulier
+  else { // Single case processing
     if (toujoursdegenere) PerformSingularCorner(Index);
-    else                  PerformMoreThreeCorner(Index, i);//Derniere chance...
+    else                  PerformMoreThreeCorner(Index, i);//Last chance...
   }              
 }
 
 
 
 #include <ChFi3d_Builder_0.hxx>
 
+//#define DRAW
+#ifdef DRAW
+#include <Draw_Appli.hxx>
+#include <Draw.hxx>
+#include <Draw_Marker3D.hxx>
+#include <Draw_Marker2D.hxx>
+#include <DrawTrSurf.hxx>
+#include <DBRep.hxx>
+static Standard_Integer NbSp = 1;
+static Standard_Integer NbelFa = 1;
+#endif
+
 #ifdef DEB
 #include <OSD_Chronometer.hxx>
 extern Standard_Boolean ChFi3d_GetcontextFORCEBLEND(); 
 #include <GeomAdaptor_HCurve.hxx>
 #include <BRepAdaptor_HSurface.hxx>
 
-//=======================================================================
-//function : ChFi3d_InPeriod
-//purpose  : 
-//=======================================================================
 Standard_Real ChFi3d_InPeriod(const Standard_Real U, 
                               const Standard_Real UFirst, 
                               const Standard_Real ULast,
   if ( u < UFirst) u = UFirst;
   return u;
 }
+
 //=======================================================================
-//function : Boite 
-//purpose  : Calcul des min/max uv du conge a intersecter.
+//function : Box 
+//purpose  : Calculation of min/max uv of the fillet to intersect.
 //=======================================================================
+
 void ChFi3d_Boite(const gp_Pnt2d& p1,const gp_Pnt2d& p2,
                   Standard_Real& mu,Standard_Real& Mu,
                   Standard_Real& mv,Standard_Real& Mv)
   mu = Min(p1.X(),p2.X()); Mu = Max(p1.X(),p2.X());
   mv = Min(p1.Y(),p2.Y()); Mv = Max(p1.Y(),p2.Y());
 }
+
 //=======================================================================
-//function : Boite 
-//purpose  : Calcul des min/max uv du conge a intersecter.
+//function : Box
+//purpose  : Calculation of min/max uv of the fillet to intersect.
 //=======================================================================
+
 void ChFi3d_Boite(const gp_Pnt2d& p1,const gp_Pnt2d& p2,
                   const gp_Pnt2d& p3,const gp_Pnt2d& p4,
                   Standard_Real& Du,Standard_Real& Dv,
   Du = Mu - mu;
   Dv = Mv - mv;
 }
+
 //=======================================================================
-//function : EnlargeBox et ses amis.
+//function : EnlargeBox and its friends.
 //purpose  : 
 //=======================================================================
+
 static Handle(Adaptor3d_HSurface) Geometry(TopOpeBRepDS_DataStructure& DStr,
                                            const Standard_Integer      ind)
 {
     return new GeomAdaptor_HSurface(S);
   }
 }
-//=======================================================================
-//function : ChFi3d_SetPointTolerance
-//purpose  : 
-//=======================================================================
+
 void ChFi3d_SetPointTolerance(TopOpeBRepDS_DataStructure& DStr,
                               const Bnd_Box&              box,
                               const Standard_Integer      IP)
   box.Get(a,b,c,d,e,f); 
   d-=a; e-=b; f-=c; 
   d*=d; e*=e; f*=f;
-  vtol = sqrt(d + e + f) * 1.5;// on prend un petit rab.
+  vtol = sqrt(d + e + f) * 1.5;
   DStr.ChangePoint(IP).Tolerance(vtol);
 }
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose  : 
-//=======================================================================
+
 void ChFi3d_EnlargeBox(const Handle(Geom_Curve)& C,
                        const Standard_Real       wd,
                        const Standard_Real       wf,
   box1.Add(C->Value(wd));
   box2.Add(C->Value(wf));
 }
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose  : 
-//=======================================================================
+
 void ChFi3d_EnlargeBox(const Handle(Adaptor3d_HSurface)& S,
                        const Handle(Geom2d_Curve)&     PC,
                        const Standard_Real             wd,
   PC->Value(wf).Coord(u,v);
   box2.Add(S->Value(u,v));
 }
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose  : 
-//=======================================================================
+
 void ChFi3d_EnlargeBox(const TopoDS_Edge&           E,
                        const TopTools_ListOfShape&  LF,
                        const Standard_Real          w,
     }
   }
 }
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose  : 
-//=======================================================================
+
 void ChFi3d_EnlargeBox(TopOpeBRepDS_DataStructure&    DStr,
                        const Handle(ChFiDS_Stripe)&   st, 
                        const Handle(ChFiDS_SurfData)& sd,
     }
   }
 }
+
 //=======================================================================
 //function : conexfaces
 //purpose  : 
 //=======================================================================
+
 void ChFi3d_conexfaces(const TopoDS_Edge& E,
                        TopoDS_Face&       F1,
                        TopoDS_Face&       F2,
     }
   }  
 }
+
 //=======================================================================
 //function : EdgeState
-//purpose  : examun des concavites pour les sommets a 3 aretes.
+//purpose  : check concavities for the tops with 3 edges.
 //=======================================================================
+
 ChFiDS_State ChFi3d_EdgeState(TopoDS_Edge* E,
                               const ChFiDS_Map&  EFMap)
 {
   }
   return sst;
 }
+
 //=======================================================================
 //function : evalconti
-//purpose  : Methode tres rapide, a la limite de l imposture pour
-//           coder les regularites CN. Il faudra affiner le traitement
-//           quand le bug reviendra.
+//purpose  : Method very fast to code regularities CN. It is necessary to 
+//           refine the processing.
 //=======================================================================
+
 GeomAbs_Shape ChFi3d_evalconti(const TopoDS_Edge& /*E*/,
                                const TopoDS_Face& F1,
                                const TopoDS_Face& F2)
      typ != GeomAbs_Torus) return cont;
   return GeomAbs_CN;
 }
-//modified by NIZNHY-PKV Wed Dec 15 11:22:35 2010f
+
 //=======================================================================
 //function : KParticular
 //purpose  : 
 //=======================================================================
-Standard_Boolean ChFi3d_KParticular (const Handle(ChFiDS_Spine)& Spine,
-                                    const Standard_Integer      IE,
-                                    const BRepAdaptor_Surface&  S1,
-                                    const BRepAdaptor_Surface&  S2)
+
+Standard_Boolean ChFi3d_KParticular
+(const Handle(ChFiDS_Spine)& Spine,
+ const Standard_Integer      IE,
+ const BRepAdaptor_Surface&  S1,
+ const BRepAdaptor_Surface&  S2)
 {
-  Standard_Boolean bRet;
-  //
-  bRet=Standard_True;
-  //
+#ifdef DEB
+  if(ChFi3d_GetcontextFORCEBLEND()) return Standard_False; 
+#endif
   Handle(ChFiDS_FilSpine) fs = Handle(ChFiDS_FilSpine)::DownCast(Spine);
-  if(!fs.IsNull() && !fs->IsConstant(IE)) {
-    return !bRet;
-  }
-  //
-  Standard_Boolean bIsPlane1, bIsPlane2;
-  Standard_Real aPA;
-  GeomAbs_CurveType aCT;
-  GeomAbs_SurfaceType aST1, aST2;
-  //
-  aST1=S1.GetType();
-  aST2=S2.GetType();
-  bIsPlane1=(aST1==GeomAbs_Plane);
-  bIsPlane2=(aST2==GeomAbs_Plane);
-  if (!(bIsPlane1 || bIsPlane2)) {
-    return !bRet;
-  }
-  //
-  const BRepAdaptor_Surface& aS1=(bIsPlane1)? S1 : S2;
-  const BRepAdaptor_Surface& aS2=(bIsPlane1)? S2 : S1;
-  aST1=aS1.GetType();
-  aST2=aS2.GetType();
-  //
-  if (!(aST2==GeomAbs_Plane || aST2==GeomAbs_Cylinder || aST2==GeomAbs_Cone)) {
-    return !bRet;
-  } 
-  //
+  if(!fs.IsNull() && !fs->IsConstant(IE)) return Standard_False;
   const BRepAdaptor_Curve& bc = Spine->CurrentElementarySpine(IE);
-  aCT = bc.GetType();
-  if (!(aCT==GeomAbs_Line || aCT==GeomAbs_Circle)) {
-    return !bRet;
-  }
-  //
-  aPA=Precision::Angular();
-  //
-  if (aST2==GeomAbs_Plane){
-    if (aCT==GeomAbs_Line) { 
-      return bRet;
+  GeomAbs_CurveType ctyp = bc.GetType();
+  
+  switch (S1.GetType()) {
+    
+  case GeomAbs_Plane :
+    
+    switch(S2.GetType()) {
+      
+    case GeomAbs_Plane :
+      
+      if (ctyp == GeomAbs_Line) return Standard_True;
+      else return Standard_False;
+      
+    case GeomAbs_Cylinder :
+      
+      if (ctyp == GeomAbs_Line && 
+         (S1.Plane().Axis().Direction().
+          IsNormal(S2.Cylinder().Axis().Direction(),
+                   Precision::Angular())))
+       return Standard_True;
+      else if (ctyp == GeomAbs_Circle && 
+              (S1.Plane().Axis().Direction().
+               IsParallel(S2.Cylinder().Axis().Direction(),
+                          Precision::Angular())))
+       return Standard_True;
+      else return Standard_False;
+      
+    case GeomAbs_Cone :
+      
+      if (ctyp != GeomAbs_Circle) return Standard_False;
+      else if (S1.Plane().Axis().Direction().
+              IsParallel(S2.Cone().Axis().Direction(),
+                         Precision::Angular()))
+       return Standard_True;
+      else return Standard_False;
+      
+    case GeomAbs_Sphere :
+      /*
+        if (!Constant) return Standard_False;
+        else if (S1.Plane().Axis().Direction().
+        IsParallel(S2.Sphere().Position().Axis().Direction(),
+        Precision::Angular()))
+        return Standard_True;
+        else return Standard_False;
+        */
+      return Standard_False;
+    case GeomAbs_Torus :
+      /*
+        if (!Constant) return Standard_False;
+        else if (S1.Plane().Axis().Direction().
+        IsParallel(S2.Torus().Axis().Direction(),
+        Precision::Angular()))
+        return Standard_True;
+        else return Standard_False;;
+        */
+      return Standard_False;;
+    default:
+      
+      return Standard_False;
     }
-  }
-  else if (aST2==GeomAbs_Cylinder) {
-    const gp_Dir& aD1=aS1.Plane().Axis().Direction();
-    const gp_Dir& aD2=aS2.Cylinder().Axis().Direction();
-    //
-    if (aCT==GeomAbs_Line && aD1.IsNormal(aD2, aPA)) {
-      return bRet;
+  case GeomAbs_Cylinder :
+    
+    if (S2.GetType() == GeomAbs_Plane) {
+      if (ctyp == GeomAbs_Line && 
+         (S2.Plane().Axis().Direction().
+          IsNormal(S1.Cylinder().Axis().Direction(),
+                   Precision::Angular())))
+       return Standard_True;
+      else if (ctyp == GeomAbs_Circle && 
+              (S2.Plane().Axis().Direction().
+               IsParallel(S1.Cylinder().Axis().Direction(),
+                          Precision::Angular())))
+       return Standard_True;
+      else return Standard_False;
     }
-    else if (aCT==GeomAbs_Circle && aD1.IsParallel(aD2, aPA)) {
-      return bRet;
+    else return Standard_False;
+    
+  case GeomAbs_Cone :
+    
+    if (S2.GetType() == GeomAbs_Plane) {
+      if (ctyp != GeomAbs_Circle) return Standard_False;
+      else if (S2.Plane().Axis().Direction().
+              IsParallel(S1.Cone().Axis().Direction(),
+                         Precision::Angular()))
+       return Standard_True;
+      else return Standard_False;
+      
     }
+    else return Standard_False;
+    
+  case GeomAbs_Sphere :
+    /*
+       if (S2.GetType() == GeomAbs_Plane) {
+       if (!Constant) return Standard_False;
+       else if (S2.Plane().Axis().Direction().
+       IsParallel(S1.Sphere().Position().Axis().Direction(),
+       Precision::Angular()))
+       return Standard_True;
+       else return Standard_False;
+       }
+       else return Standard_False;
+       */
+    return Standard_False;
+  case GeomAbs_Torus :
+    /*
+       if (S2.GetType() == GeomAbs_Plane) {
+       if (!Constant) return Standard_False;
+       else if (S2.Plane().Axis().Direction().
+       IsParallel(S1.Torus().Axis().Direction(),
+       Precision::Angular()))
+       return Standard_True;
+       else return Standard_False;
+       }
+       else return Standard_False;
+       */
+    return Standard_False;
+  default:
+    return Standard_False;
   }
-  else if(aST2==GeomAbs_Cone) {
-    const gp_Dir& aD1=aS1.Plane().Axis().Direction();
-    const gp_Dir& aD2=aS2.Cone().Axis().Direction();
-    if (aCT == GeomAbs_Circle && aD1.IsParallel(aD2, aPA)) {
-      return bRet;
-    }
-  }  
-  return !bRet;    
+  return Standard_False;
 }
-//modified by NIZNHY-PKV Wed Dec 15 11:22:43 2010t
+
+
 //=======================================================================
 //function : BoundFac
-//purpose  : Resize les bornes d une surface au voisinage de la boite 
-//           donnee. Utile pour les intersections dont on connait les
-//           extremites. 
+//purpose  : Resize the limits of surface adjacent to the given box 
+//           Useful for intersections with known extremities. 
 //=======================================================================
+
 void ChFi3d_BoundFac(BRepAdaptor_Surface& S,
                      const Standard_Real uumin,
                      const Standard_Real uumax,
 }
 //=======================================================================
 //function : ChFi3d_BoundSrf
-//purpose  : Resize les bornes d une surface au voisinage de la boite 
-//           donnee. Utile pour les intersections dont on connait les
-//           extremites. 
+//purpose  : Resize the limits of surface adjacent to the given box 
+//           Useful for intersections with known extremities.
 //=======================================================================
+
 void ChFi3d_BoundSrf(GeomAdaptor_Surface& S,
                      const Standard_Real uumin,
                      const Standard_Real uumax,
   Standard_Real peru=0, perv=0;
   if(surface->IsUPeriodic()) {
     peru = surface->UPeriod();
+//     if((umax - umin) > (0.5 * peru)) {
+//       umin = uumax - peru;
+//       umax = peru - (uumax - uumin);
+//     }
   }
   if(surface->IsVPeriodic()) {
     perv = surface->VPeriod();
+//     if((vmax - vmin) > (0.5 * perv)) {
+//       vmin = vvmax - perv;
+//       vmax = perv - (vvmax - vvmin);
+//     }
   }
   Standard_Real Stepu = umax - umin;
   Standard_Real Stepv = vmax - vmin;
 
-  //On table sur le fait que la boite uv est non nulle dans
-  //une des directions au moins.
+  //It is supposed that box uv is not null in at least 
+  //one direction.
   Standard_Real scalu = S.UResolution(1.);
   Standard_Real scalv = S.VResolution(1.);
 
   }
   S.Load(surface,uu1,uu2,vv1,vv2);
 }
+
 //=======================================================================
 //function : ChFi3d_InterPlaneEdge
 //purpose  : 
 //=======================================================================
+
 Standard_Boolean  ChFi3d_InterPlaneEdge (Handle(Adaptor3d_HSurface)& Plan,
                                          Handle(Adaptor3d_HCurve)&  C,
                                          Standard_Real& W,
          isol = iip; W = CW;
        }
        else {
-         if      ( Sens && CW < W) {
-           W = CW; isol = iip;
-         }
-         else if (!Sens && CW > W) {
-           W = CW; isol = iip;
-         }
+         if      ( Sens && CW < W) {W = CW; isol = iip;}
+         else if (!Sens && CW > W) {W = CW; isol = iip;}
        }
       }
     }
   if(isol == 0) return Standard_False;
   return Standard_True;
 }
+
 //=======================================================================
 //function : ExtrSpineCarac
 //purpose  : 
 //=======================================================================
+
 void ChFi3d_ExtrSpineCarac(const TopOpeBRepDS_DataStructure& DStr,
                           const Handle(ChFiDS_Stripe)& cd,
                           const Standard_Integer i,
                           const Standard_Integer sens,
                           gp_Pnt& P,
                           gp_Vec& V,
-                          Standard_Real& R) 
-     //voir s il ne faudrait pas rajouter D1,D2 et DR
+                          Standard_Real& R) //check if it is necessary to add D1,D2 and DR
 {
-  // Attention pour les surfaces approximees on assume que
-  // le parametrage de la pcurve est le meme que celui de 
-  // l elspine qui a servi a la construction.
+  // Attention for approximated surfaces it is assumed that e
+  // the parameters of the pcurve are the same as of  
+  // elspine used for its construction.
   const Handle(Geom_Surface)& fffil = 
     DStr.Surface(cd->SetOfSurfData()->Value(i)->Surf()).Surface();
   gp_Pnt2d pp = cd->SetOfSurfData()->Value(i)->Interference(jf).
   V.Normalize();
   if(sens == 1) V.Reverse();
 }
+
 //=======================================================================
 //function : ChFi3d_CircularSpine
-//purpose  : Calcule une ligne guide ciculaire pour le du coin a partir 
-//           des points et vecteurs tangents calcules aux extremites des
-//           lignes guides des conges deb et fin.
+//purpose  : Calculate a cicular guideline for the corner created from  
+//           tangent points and vectors calculated at the extremities 
+//           of guidelines of start and end fillets.
 //=======================================================================
 Handle(Geom_Circle) ChFi3d_CircularSpine(Standard_Real&      WFirst,
                                         Standard_Real&      WLast,
     WLast = dddeb.Angle(ddfin);
     return new Geom_Circle(ccc);
   }
-
+#ifdef DEB
+  else {
+    cout <<"Construction de la ligne guide du coin impossible"<<endl;
+  }
+#endif
   return Handle(Geom_Circle)();
 }
+
 //=======================================================================
 //function : ChFi3d_Spine
-//purpose  : Calcule les poles de la ligne guide du coin a partir des
-//           points et vecteurs tangents calcules aux extremites des
-//           lignes guides des conges deb et fin.
+//purpose  : Calculates the poles of the guideline for the corner from
+//           tangent points and vectors calculated at the extremities of
+//           guidelines of start and end fillets.
 //=======================================================================
+
 Handle(Geom_BezierCurve) ChFi3d_Spine(const gp_Pnt&       pd,
                                       gp_Vec&             vd,
                                       const gp_Pnt&       pf,
   pol(3).SetCoord(pf.X()+vf.X(),pf.Y()+vf.Y(),pf.Z()+vf.Z());
   return new Geom_BezierCurve(pol);
 }
+
 //=======================================================================
 //function : IsInFront
-//purpose  : regarde si les surfdata i1 et i2 sont en vis a vis
+//purpose  : Checks if surfdata i1 and i2 are face to face
 //=======================================================================
+
 Standard_Boolean ChFi3d_IsInFront(TopOpeBRepDS_DataStructure& DStr,
                                   const Handle(ChFiDS_Stripe)& cd1, 
                                   const Handle(ChFiDS_Stripe)& cd2,
     OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
     visavis = Standard_True;
     sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
-    // On ne detrompe plus a l'aide des parametres de l'autre cote ca posait des problemes.
+    // The parameters of the other side are not used for orientation. This would raise problems
     Standard_Integer kf1 = jf1, kf2 = jf2;
     Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
     Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
     OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
     visavis = Standard_True;
     sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
-    // On ne detrompe plus a l'aide des parametres de l'autre cote ca posait des problemes.
+    // The parameters of the other side are not used for orientation. This would raise problems
     Standard_Integer kf1 = jf1, kf2 = jf2;
     Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
     Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
        u1 = p1; u2 = p2; ss = sameside; j1 = jf1; j2 = jf2; ff = face;
       }
     }
-    //on rajoute ces re-initialisations au cas ou p1,... auraient pris des valeurs fausses
+    //the re-initialization is added in case p1,... take wrong values
     else if (ok) {
       p1 = u1; p2 = u2; sameside = ss; jf1 = j1; jf2 = j2; face = ff;
     }
     OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
     visavis = Standard_True;
     sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
-    // On ne detrompe plus a l'aide des parametres de l'autre cote.
+    // The parameters of the other side are not used for orientation.
     Standard_Integer kf1 = jf1, kf2 = jf2;
     Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
     Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
        u1 = p1; u2 = p2; ss = sameside; j1 = jf1; j2 = jf2; ff = face;
       }
     }
-    //on rajoute ces re-initialisations au cas ou p1,... auraient pris des valeurs fausses
+    //the re-initialization is added in case p1,... take wrong values
     else if (ok) {
       p1 = u1; p2 = u2; sameside = ss; jf1 = j1; jf2 = j2; face = ff;
     }
     OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
     visavis = Standard_True;
     sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
-    // On ne detrompe plus a l'aide des parametres de l'autre cote.
+    // The parameters of the other side are not used for orientation.
     Standard_Integer kf1 = jf1, kf2 = jf2;
     Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
     Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
        u1 = p1; u2 = p2; ss = sameside; j1 = jf1; j2 = jf2; ff = face;
       }
     }
-    //on rajoute ces re-initialisations au cas ou p1,... auraient pris des valeurs fausses
+    //the re-initialization is added in case p1,... take wrong values
     else if (ok) {
       p1 = u1; p2 = u2; sameside = ss; jf1 = j1; jf2 = j2; face = ff;
     }
   }
   return ok;
+
 }
-//=======================================================================
-//function : recadre
-//purpose  : 
-//=======================================================================
+
 static Standard_Real recadre(const Standard_Real p,
                              const Standard_Real ref,
                              const Standard_Integer sens,
   const Standard_Real pp = p + (sens > 0 ? (first - last) : (last - first));
   return ((Abs(pp - ref) < Abs(p - ref))? pp : p);
 }
-//=======================================================================
-//function : ChFi3d_IntTraces
-//purpose  : 
-//=======================================================================
+
 Standard_Boolean ChFi3d_IntTraces(const Handle(ChFiDS_SurfData)& fd1,
                                  const Standard_Real            pref1,
                                  Standard_Real&                 p1,
 {
   Geom2dAdaptor_Curve C1;
   Geom2dAdaptor_Curve C2;
-  // on aggrandit les pcurves pour etre sur qu'il y a intersection
-  // par ailleurs on prend la totalite des courbes periodiques, on
-  // triera les points sur celles-ci avec un critere specifique.
+  // pcurves are enlarged to be sure that there is intersection
+  // additionally all periodic curves are taken and points on 
+  // them are filtered using a specific criterion.
 
   Standard_Real first,last,delta = 0.;
   first = fd1->Interference(jf1).FirstParameter();
     if (!Intersection.IsEmpty()) {
       nbseg = Intersection.NbSegments();
       if ( nbseg > 0 ) { 
+#ifdef DEB
+       cout<< "segments of intersection on restrictions"<<endl; 
+#endif
       }
       nbpt = Intersection.NbPoints();
       if ( nbpt >= 1 ) {
-       // On manque de billes pour trier les points trouves de facon
-        // rigoureuse. On adopte donc deux criteres differents un peu
-        // arbitraires :
-       // - courbes periodiques : le plus proche de la borne.
-       // - courbes non periodiques : le plus a gauche sur les 2 courbes
-       //                             modulo sens1 et sens2
+       // The criteria sets to filter the found points in a strict way 
+        // are missing. Two different criterions chosen somewhat randomly 
+        // are used :
+       // - periodic curves : closest to the border.
+       // - non-periodic curves : the closest to the left of 2 curves
+       //                             modulo sens1 and sens2
        int2d = Intersection.Point(1);
        p2d = int2d.Value();
        p1 = int2d.ParamOnFirst();
              p2 = int2d.ParamOnSecond();
              p2d = int2d.Value();
            }
-           //  Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
+//  Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
            else if (Check2dDistance &&
                     RefP2d.Distance(int2d.Value()) < RefP2d.Distance(p2d)) {
              Standard_Real pp2 = int2d.ParamOnSecond();
              p2  = pp2;
              p2d = int2d.Value();
            }
-           //  Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
+//  Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
          }
          else if(isper2) {
            Standard_Real pp2 = int2d.ParamOnSecond();
              p1 = int2d.ParamOnFirst();
              p2d = int2d.Value();
            }
-           //  Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
+//  Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
            else if (Check2dDistance &&
                     RefP2d.Distance(int2d.Value()) < RefP2d.Distance(p2d)) {
              Standard_Real pp1 = int2d.ParamOnFirst();
              p2  = pp2;
              p2d = int2d.Value();
            }
-           //  Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
+//  Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
          }
          else if(((int2d.ParamOnFirst() - p1)*sens1 < 0.) &&
                  ((int2d.ParamOnSecond() - p2)*sens2 < 0.)) {
   }
   else { return Standard_False; }
 } 
+
 //=======================================================================
 //function : Coefficient
 //purpose  : 
   DU = (DD*CC-EE*BB)/Delta;
   DV = (AA*EE-BB*DD)/Delta;
 }
+
 //=======================================================================
 //function : ReparamPcurv
 //purpose  : Dans le cas ou la pcurve est une BSpline on verifie 
 //           ses parametres et on la reparametre eventuellement.
 //=======================================================================
+
 void ChFi3d_ReparamPcurv(const Standard_Real Uf, 
                          const Standard_Real Ul, 
                          Handle(Geom2d_Curve)& Pcurv) 
   }
   Pcurv = pc;
 }
+
 //=======================================================================
 //function : ProjectPCurv
-//purpose  : Calcul la pcurve correspondant a une ligne d intersection
-//           3d. Ne doit etre appele que dans les cas analytiques.
+//purpose  : Calculation of the pcurve corresponding to a line of intersection
+//           3d. Should be called only in analytic cases.
 //=======================================================================
+
 void ChFi3d_ProjectPCurv(const Handle(Adaptor3d_HCurve)&   HCg, 
                         const Handle(Adaptor3d_HSurface)& HSg, 
                         Handle(Geom2d_Curve)&           Pcurv,
     }
   }
 }
+
 //=======================================================================
 //function : CheckSameParameter
-//purpose  : Controle a posteriori que sameparameter a bien fait son boulot
+//purpose  : Controls a posteriori that sameparameter worked well
 //=======================================================================
-Standard_Boolean ChFi3d_CheckSameParameter (const Handle(Adaptor3d_HCurve)&   C3d,
-                                           Handle(Geom2d_Curve)&           Pcurv,
-                                           const Handle(Adaptor3d_HSurface)& S,
-                                           const Standard_Real             tol3d,
-                                           Standard_Real&                  tolreached)
+
+Standard_Boolean ChFi3d_CheckSameParameter 
+(const Handle(Adaptor3d_HCurve)&   C3d,
+ Handle(Geom2d_Curve)&           Pcurv,
+ const Handle(Adaptor3d_HSurface)& S,
+ const Standard_Real             tol3d,
+ Standard_Real&                  tolreached)
 {
   tolreached = 0.;
   Standard_Real f = C3d->FirstParameter();
   tolreached = Max(tolreached,Precision::Confusion());
   return Standard_True;
 }
+
 //=======================================================================
 //function : SameParameter
-//purpose  : Encapsulation de Sameparameter
+//purpose  : Encapsulation of Sameparameter
 //=======================================================================
+
 Standard_Boolean ChFi3d_SameParameter(const Handle(Adaptor3d_HCurve)&   C3d,
                                       Handle(Geom2d_Curve)&           Pcurv,
                                       const Handle(Adaptor3d_HSurface)& S,
   Approx_SameParameter sp(C3d,Pcurv,S,tol3d);
   if(sp.IsDone() && !sp.IsSameParameter()) Pcurv = sp.Curve2d();
   else if(!sp.IsDone() && !sp.IsSameParameter()) {
+#ifdef DEB
+    cout<<"echec SameParameter"<<endl;
+#endif  
     return Standard_False;
   }
   tolreached = sp.TolReached();
+  if(tolreached > 1.1*tol3d) {
+#ifdef DEB
+    cout<<"SameParameter : Tol non atteinte!!!"<<endl;
+    cout<<"tol visee : "<<tol3d<<" tol obtenue : "<<tolreached<<endl;
+#endif  
+  }
   return Standard_True;
 }
+  
 //=======================================================================
 //function : SameParameter
 //purpose  : Encapsulation de Sameparameter
 //=======================================================================
+
 Standard_Boolean ChFi3d_SameParameter(const Handle(Geom_Curve)&   C3d,
                                       Handle(Geom2d_Curve)&       Pcurv,
                                       const Handle(Geom_Surface)& S,
   /*szv:static*/ Handle(GeomAdaptor_HCurve) hc(new GeomAdaptor_HCurve(C3d,Pardeb,Parfin));
   return ChFi3d_SameParameter(hc,Pcurv,hs,tol3d,tolreached);
 }
+
 //=======================================================================
 //function : ComputePCurv 
-//purpose  : Calcule une droite eventuellement sous forme de BSpline 
-//           pour garantir le range et le parametrage identique
-//           a une courbe 3d de reference.
+//purpose  : Calculates a straight line in form of BSpline 
+//           to guarantee the same range and parameters as of the 
+//           reference 3D curve.
 //=======================================================================
+
 void ChFi3d_ComputePCurv(const Handle(Adaptor3d_HCurve)&   C3d,
                         const gp_Pnt2d&                 UV1,
                         const gp_Pnt2d&                 UV2,
                         const Standard_Boolean          reverse)
 {
   ChFi3d_ComputePCurv(UV1,UV2,Pcurv,Pardeb,Parfin,reverse);
+
+#ifdef DEB   
+  OSD_Chronometer ch;
+  ChFi3d_InitChron(ch);//initial improvement for ChFi3d_SameParameter 
+#endif
+
   ChFi3d_SameParameter(C3d,Pcurv,S,tol3d,tolreached);
+
+#ifdef DEB    
+  ChFi3d_ResultChron(ch ,t_sameparam); // resulting improvement for ChFi3d_SameParameter
+#endif 
+ 
 }
+
 //=======================================================================
 //function : ComputePCurv 
-//purpose  : Calcule une droite eventuellement sous forme de BSpline 
-//           pour garantir le range et le parametrage identique
-//           a une courbe 3d de reference.
+//purpose  : Calculates a straight line in form of BSpline 
+//           to guarantee the same range and parameters as of the 
+//           reference 3D curve.
 //=======================================================================
+
 void ChFi3d_ComputePCurv(const Handle(Geom_Curve)&   C3d,
                          const gp_Pnt2d&             UV1,
                          const gp_Pnt2d&             UV2,
   /*szv:static*/ Handle(GeomAdaptor_HCurve) hc(new GeomAdaptor_HCurve(C3d,Pardeb,Parfin));
   ChFi3d_ComputePCurv(hc,UV1,UV2,Pcurv,hs,Pardeb,Parfin,tol3d,tolreached,reverse);
 }
+
 //=======================================================================
 //function : ComputePCurv 
-//purpose  : Calcule une droite eventuellement sous forme de BSpline 
-//           pour garantir le range.
+//purpose  : Calculates a straight line in form of BSpline 
+//           to guarantee the same range.
 //=======================================================================
+
 void ChFi3d_ComputePCurv(const gp_Pnt2d& UV1,
                          const gp_Pnt2d& UV2,
                          Handle(Geom2d_Curve)& Pcurv,
   }
   Pcurv = new Geom2d_TrimmedCurve(Pcurv,Pardeb,Parfin);
 }
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose  : 
-//=======================================================================
+
 Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& Fac,
                                          Handle(Geom2d_Curve)& curv, 
                                          const Standard_Integer sens1,
   curv = ChFi3d_BuildPCurve(Fac,pfac1,v1,pfac2,v2,Standard_False);
   return ChFi3d_mkbound(Fac,curv,t3d,ta);
 }
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose  : 
-//=======================================================================
+
 Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& Surf,
                                          Handle(Geom2d_Curve)& curv,
                                          const Standard_Integer sens1,
   curv = ChFi3d_BuildPCurve(Surf,p1,v1,p2,v2);
   return ChFi3d_mkbound(Surf,curv,t3d,ta);
 }
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose  : 
-//=======================================================================
+
 Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Geom_Surface)& s,
                                          const gp_Pnt2d& p1,
                                          const gp_Pnt2d& p2,
   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface(s);
   return ChFi3d_mkbound(HS,p1,p2,t3d,ta,isfreeboundary);
 }
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose  : 
-//=======================================================================
+
 Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& HS,
                                          const gp_Pnt2d& p1,
                                          const gp_Pnt2d& p2,
   Handle(Geom2d_Curve) curv = new Geom2d_BezierCurve(pol);
   return ChFi3d_mkbound(HS,curv,t3d,ta,isfreeboundary);
 }
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose  : 
-//=======================================================================
+
 Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& HS,
                                          const Handle(Geom2d_Curve)& curv,
                                          const Standard_Real t3d,
   }
   return new GeomFill_BoundWithSurf(COnS,t3d,ta);
 }
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose  : 
-//=======================================================================
+
 Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& Fac,
                                          Handle(Geom2d_Curve)& curv, 
                                          const gp_Pnt2d& p1,
   curv = new Geom2d_BezierCurve(pol);
   return ChFi3d_mkbound(Fac,curv,t3d,ta,isfreeboundary);
 }
-//=======================================================================
-//function : ChFi3d_BuildPCurve
-//purpose  : 
-//=======================================================================
+
 Handle(Geom2d_Curve) ChFi3d_BuildPCurve(const gp_Pnt2d& p1,
                                        gp_Dir2d& d1,
                                        const gp_Pnt2d& p2,
   Lambda2 = Max(0.5*mref*Lambda2,1.e-5);
   pol(3)=gp_Pnt2d(p2.XY()+Lambda2*d2.XY());
   return new Geom2d_BezierCurve(pol);
+
+/*
+  //essai avec batten
+  Standard_Real h =  0.005*mref;
+  Standard_Real ang1,ang2;
+  ang1=dref.Angle(d1);
+  if (dref.Angle(d2) > 0) ang2=PI-dref.Angle(d2);
+  else ang2=-PI-dref.Angle(d2);
+  Standard_Real angmax = 0.5*PI;
+  if((Abs(ang1)>angmax)||(Abs(ang2)>angmax)) {
+    //On fait une cubique a la mords moi le noeud
+    TColgp_Array1OfPnt2d pol(1,4);
+    pol(1)=p1;
+    pol(4)=p2;
+    Standard_Real Lambda1 = Max(Abs(d2.Dot(d1)),Abs(dref.Dot(d1)));
+    Lambda1 = Max(0.5*mref*Lambda1,1.e-5);
+    pol(2) = gp_Pnt2d(p1.XY()+Lambda1*d1.XY());
+    Standard_Real Lambda2 = Max(Abs(d1.Dot(d2)),Abs(dref.Dot(d2)));
+    Lambda2 = Max(0.5*mref*Lambda2,1.e-5);
+    pol(3)=gp_Pnt2d(p2.XY()+Lambda2*d2.XY());
+    return new Geom2d_BezierCurve(pol);
+  }
+  else{
+    //On lance un Batten
+#ifdef DEB
+    OSD_Chronometer ch;
+    ChFi3d_InitChron(ch);// init performances pour les batten  
+#endif  
+    FairCurve_Batten Bat(p1,p2,h);
+    Bat.SetFreeSliding (Standard_True);
+    Bat.SetAngle1(ang1);
+    Bat.SetAngle2(ang2);
+    FairCurve_AnalysisCode Iana; 
+    Standard_Real tol = 1.e-3;
+    Standard_Integer nbit;
+    Standard_Boolean ok;
+//    nbit = 5;
+//    ok = Bat.Compute(Iana,nbit,tol);
+    nbit = 25;
+    ok = Bat.Compute(Iana,nbit,tol);
+#ifdef DEB
+    ChFi3d_ResultChron( ch,t_batten);  // result performances pour les batten 
+#endif
+    if(!ok) Standard_Failure::Raise("Echec Batten"); 
+    return Bat.Curve();
+  } 
+*/
 }
-//=======================================================================
-//function : ChFi3d_BuildPCurve
-//purpose  : 
-//=======================================================================
+
 Handle(Geom2d_Curve) ChFi3d_BuildPCurve(const Handle(Adaptor3d_HSurface)& Surf,
                                        const gp_Pnt2d&                 p1,
                                        const gp_Vec2d&                 v1,
   }
   return pc;
 }
-//=======================================================================
-//function : ChFi3d_BuildPCurve
-//purpose  : 
-//=======================================================================
+
 Handle(Geom2d_Curve) ChFi3d_BuildPCurve(const Handle(Adaptor3d_HSurface)& Surf,
                                        const gp_Pnt2d&                 p1,
                                        const gp_Vec&                   v1,
   }
   return ChFi3d_BuildPCurve(Surf,p1,vv1,p2,vv2,0);
 }
+
 //=======================================================================
 //function : ComputeArete
 //purpose  : 
-// pour les remplissages en s.d. un conge avec ces pcurves est construit ainsi
-// firstpoint sur S1 -------------edge:courbe3d/pcurves--->lastpoint sur S1
+// to fill with s.d. a fillet with pcurves constructed as follows
+// firstpoint on S1 -------------edge:curve3d/pcurves--->lastpoint on S1
 //  |                                                              |
 //  |                                                              |
 //  |                                                              |
-// edge:courbe 3d/pcurves           conge                        edge
-//  |         attention il faut tester l orientation du conge avant|
-//  |         de determiner les transitions pcurves/conge          |
+// edge:curve 3d/pcurves           fillet                         edge
+//  |         attention it is necessary to test orientation of the fillet before|
+//  |         determining the transitions pcurves/fillet           |
 //  |                                                              |
 //  \/                                                             \/
 // firstpoint sur S2 -------------edge:courbe3d/pcurves--->lastpoint sur S2
 //
 //=======================================================================
+
 void  ChFi3d_ComputeArete(const ChFiDS_CommonPoint&   P1,
                          const gp_Pnt2d&             UV1,
                          const ChFiDS_CommonPoint&   P2,
   else if (IFlag == 0) {
 
     if (P1.IsVertex() || P2.IsVertex() || !P1.IsOnArc() || !P2.IsOnArc()) {
-    // On construit une droite pour ne pas se tromper 
-    // d'arc et donc de tangente.
+    // A straight line is constructed to avoid  
+    // arc and tangent.
       TColgp_Array1OfPnt2d qoles(1,2);
       qoles(1)=UV1;
       qoles(2)=UV2;
       C1.D1(P2.ParameterOnArc(),Pp,Vv2);
       hs->ChangeSurface().Load(Surf);
       Pcurv = ChFi3d_BuildPCurve(hs,UV1,Vv1,UV2,Vv2,Standard_True); 
-      // Il y a des cas ou la PCurve ainsi construite sort de la 
-      // surface, en particulier lorsque celle-ci provient d un 
-      // prolongement. On fait donc un controle a posteriori et
-      // si ca sort on la remplace par la droite UV1 UV2, tant
-      // pis pour la tangence avec les arcs voisins!!!
+      // There are some cases when PCurve constructed in this way  
+      // leaves the surface, in particular if it results from an 
+      // extension. A posteriori checking is required and if
+      // the curve leaves the surface it is replaced by straight line UV1 UV2
+      // non regarding the tangency with neighboring arcs!
       Bnd_Box2d bs;
       Standard_Real umin,umax,vmin,vmax;
       Surf->Bounds(umin,umax,vmin,vmax);
     }
   }
 }
+
 //=======================================================================
 //function : FilCurveInDS
 //purpose  : 
 //=======================================================================
+
+
 Handle(TopOpeBRepDS_SurfaceCurveInterference)  ChFi3d_FilCurveInDS
 (const Standard_Integer Icurv,
  const Standard_Integer Isurf,
                                                  Pcurv);
   return SC1;
 }
+
 //=======================================================================
 //function : TrsfTrans
 //purpose  : 
 //=======================================================================
 TopAbs_Orientation ChFi3d_TrsfTrans(const IntSurf_TypeTrans T1) 
 {
-  switch (T1)  {
+  switch (T1)
+  {
     case IntSurf_In:  return TopAbs_FORWARD;
     case IntSurf_Out: return TopAbs_REVERSED;
   }
   return TopAbs_INTERNAL;
 }
+
 //=======================================================================
 //function : FilCommonPoint
-//purpose  : Chargement du common point
-//           gestion du fait que l'on est deja sur un vertex existant
+//purpose  : Loading of the common point
+//           management of the case when it happens on already existing vertex.
 //=======================================================================
+
 Standard_EXPORT void ChFi3d_FilCommonPoint(const BRepBlend_Extremity& SP,
                                           const IntSurf_TypeTrans TransLine,
                                           const Standard_Boolean Start,
 //  BRep_Tool Outil;
   Standard_Real Dist, maxtol = Max(Tol,CP.Tolerance());
 
-  CP.SetPoint(SP.Value()); // On commence par le point, le vecteur
+  CP.SetPoint(SP.Value()); // One starts with the point and the vector
   if (SP.HasTangent()) {
     if (Start) {
-      CP.SetVector(SP.Tangent().Reversed()); // On oriente la tangente vers la sortie
+      CP.SetVector(SP.Tangent().Reversed()); // The tangent is oriented to the exit
     }
     else {
       CP.SetVector(SP.Tangent());
     }
   }
   
-  CP.SetParameter(SP.ParameterOnGuide()); //et le parametre de la spine
+  CP.SetParameter(SP.ParameterOnGuide()); // and the parameter of the spine
 
-  if (SP.IsVertex()) { // On charge le Vertex si besoin est
-                       // (A l'interieur d'une face)
+  if (SP.IsVertex()) { // the Vertex is loaded if required
+                       // (inside of a face)
     TopoDS_Vertex V =  
       Handle(BRepTopAdaptor_HVertex)::DownCast(SP.Vertex())->Vertex();
   
     //////////////////////////////////////////////
     CP.SetPoint(BRep_Tool::Pnt(V));
     
-    //la sequence d arcs l information est connu par le vertex (ancestor)
-    //dans ce cas on ne calculera pas les transitions c est a ce programme
-    //de le faire
+    //the sequence of arcs the information is known by thee vertex (ancestor)
+    //in this case the transitions are not computed, it is done by this program
   }
   
-  if (SP.NbPointOnRst() != 0) { //  On charge un arc, et/ou un vertex
+  if (SP.NbPointOnRst() != 0) { //  An arc, and/or a vertex is loaded
 
     const BRepBlend_PointOnRst& PR = SP.PointOnRst(1);
     Handle(BRepAdaptor_HCurve2d) 
                         Dist = DistL; }
 
       if (Dist <= maxtol + BRep_Tool::Tolerance(V[Index_min]) ) { 
-       // On tombe sur un vertex prexistant
-        CP.SetVertex(V[Index_min]); //On Charge l'ancien vertex
+       // a prexisting vertex has been met
+        CP.SetVertex(V[Index_min]); //the old vertex is loaded
          CP.SetPoint( BRep_Tool::Pnt(V[Index_min]) );
          maxtol = Max(BRep_Tool::Tolerance(V[Index_min]),maxtol);
         //// modified by jgv, 18.09.02 for OCC571 ////
         //////////////////////////////////////////////
          LeParamAmoi = BRep_Tool::Parameter(V[Index_min], E);    
       }
-      else {   // Creation d'un arc seul
+      else {   // Creation of an arc only
        maxtol = Max(BRep_Tool::Tolerance(E),maxtol);
        maxtol = Max(SP.Tolerance(),maxtol);
        LeParamAmoi = PR.ParameterOnArc();
       }
 
-      // Definition de l'arc
+      // Definition of the arc
       TopAbs_Orientation Tr;
       TopAbs_Orientation Or = E.Orientation();
       if (Start) {
       CP.SetArc(maxtol, E, LeParamAmoi, Tr);
     }
   }
-  CP.SetTolerance(maxtol); // On finit par la tolerance.
+  CP.SetTolerance(maxtol); // Finally, the tolerance.
 }
 
 //=======================================================================
 //function : SolidIndex
 //purpose  : 
 //=======================================================================
+
 Standard_Integer ChFi3d_SolidIndex(const Handle(ChFiDS_Spine)&  sp,
                                   TopOpeBRepDS_DataStructure&  DStr,
                                   ChFiDS_Map&                  MapESo,
   const Standard_Integer solidindex = DStr.AddShape(shellousolid);
   return solidindex;
 }
+
 //=======================================================================
 //function : IndexPointInDS
 //purpose  : 
 //=======================================================================
+
 Standard_Integer  ChFi3d_IndexPointInDS(const ChFiDS_CommonPoint& P1,
                                        TopOpeBRepDS_DataStructure& DStr) 
 {
   if (P1.IsVertex()) {
     // --------------------------------->  !*!*!* 
-    // Attention : On se permet d'ecrabouiller la tolerance
-    // il faudrait prevoir un mecanimse propre.
+    // Attention : it is necessary ti implement a mechanism 
+    // controlling tolerance.
     BRep_Builder B;
     B.UpdateVertex(P1.Vertex(), P1.Point(), P1.Tolerance());
     return DStr.AddShape(P1.Vertex());
   }
   return DStr.AddPoint(TopOpeBRepDS_Point(P1.Point(),P1.Tolerance()));
 }
+
 //=======================================================================
 //function : FilPointInDS
 //purpose  : 
 //=======================================================================
-Handle(TopOpeBRepDS_CurvePointInterference) 
-     ChFi3d_FilPointInDS(const TopAbs_Orientation Et,
-                        const Standard_Integer Ic,
-                        const Standard_Integer Ip,
-                        const Standard_Real Par,
-                        const Standard_Boolean IsVertex)
+
+Handle(TopOpeBRepDS_CurvePointInterference) ChFi3d_FilPointInDS
+(const TopAbs_Orientation Et,
+ const Standard_Integer Ic,
+ const Standard_Integer Ip,
+ const Standard_Real Par,
+ const Standard_Boolean IsVertex)
 {
   Handle(TopOpeBRepDS_CurvePointInterference) CP1;
   if (IsVertex)    
                                                   TopOpeBRepDS_POINT,Ip,Par);
   return CP1;
 }
+
 //=======================================================================
 //function : FilVertexInDS
 //purpose  : 
 //=======================================================================
-Handle(TopOpeBRepDS_CurvePointInterference) 
-     ChFi3d_FilVertexInDS(const TopAbs_Orientation Et,
-                         const Standard_Integer Ic,
-                         const Standard_Integer Ip,
-                         const Standard_Real Par)
+
+Handle(TopOpeBRepDS_CurvePointInterference) ChFi3d_FilVertexInDS
+(const TopAbs_Orientation Et,
+ const Standard_Integer Ic,
+ const Standard_Integer Ip,
+ const Standard_Real Par)
 {
   
   Handle(TopOpeBRepDS_CurvePointInterference) CP1 = new
                                         TopOpeBRepDS_VERTEX,Ip,Par);
   return CP1;
 }
+
 //=======================================================================
 //function : Orientation
-//purpose  : retourne l'orientation d'une interference (la premiere trouvee
-//           dans la liste).
+//purpose  : returns the orientation of the interference (the first found
+//           in the list).
 //=======================================================================
 
-static Standard_Boolean
-  ChFi3d_Orientation(const TopOpeBRepDS_ListOfInterference& LI,
-                    const Standard_Integer                 igros,
-                    const Standard_Integer                 ipetit,
-                    TopAbs_Orientation&                    Or,
-                    const Standard_Boolean                 isvertex = Standard_False,
-                    const Standard_Boolean                 aprendre = Standard_False)
+static Standard_Boolean ChFi3d_Orientation
+(const TopOpeBRepDS_ListOfInterference& LI,
+ const Standard_Integer                 igros,
+ const Standard_Integer                 ipetit,
+ TopAbs_Orientation&                    Or,
+ const Standard_Boolean                 isvertex = Standard_False,
+ const Standard_Boolean                 aprendre = Standard_False)
 {
-  //Dans le cas, ou on veux inserer un point/vertex, on desire savoir
-  // si c'est un point ou un vertex, car leur index peuvent etre les memes.
+  //In case, when it is necessary to insert a point/vertex, it should be 
+  //known if this is a point or a vertex, because their index can be the same.
   TopOpeBRepDS_Kind typepetit;
   if (isvertex)
     typepetit =  TopOpeBRepDS_VERTEX;
   return Standard_False;
 }
 
-//=======================================================================
+//====================================================================
 //function : Contains
-//purpose  : Verifie qu une interference n existe pas deja.
-//=======================================================================
-static Standard_Boolean 
-  ChFi3d_Contains(const TopOpeBRepDS_ListOfInterference& LI,
-                 const Standard_Integer                 igros,
-                 const Standard_Integer                 ipetit,
-                 const Standard_Boolean                 isvertex = Standard_False,
-                 const Standard_Boolean                 aprendre = Standard_False)                             
+//purpose  : Check if the interference does not already exist.
+//====================================================================
+
+static Standard_Boolean ChFi3d_Contains
+(const TopOpeBRepDS_ListOfInterference& LI,
+ const Standard_Integer                 igros,
+ const Standard_Integer                 ipetit,
+ const Standard_Boolean                 isvertex = Standard_False,
+ const Standard_Boolean                 aprendre = Standard_False)                             
 {
   TopAbs_Orientation bidOr;
   return ChFi3d_Orientation(LI,igros,ipetit,bidOr,isvertex,aprendre);
 }
-//=======================================================================
-//function : QueryAddVertexInEdge
-//purpose  : 
-//=======================================================================
-static void QueryAddVertexInEdge(TopOpeBRepDS_ListOfInterference& LI,
-                                const Standard_Integer                 IC,
-                                const Standard_Integer                 IV,
-                                const Standard_Real                    par,
-                                const TopAbs_Orientation               Or)
+
+static void QueryAddVertexInEdge
+(      TopOpeBRepDS_ListOfInterference& LI,
+ const Standard_Integer                 IC,
+ const Standard_Integer                 IV,
+ const Standard_Real                    par,
+ const TopAbs_Orientation               Or)
 {
   TopOpeBRepDS_ListIteratorOfListOfInterference it(LI);
   for (; it.More(); it.Next() ) {
   LI.Append(interf);
 }
 
-//=======================================================================
-//function : CutEdge
-//purpose  : 
-//=======================================================================
 static void CutEdge(const TopoDS_Vertex&           V,
                    const Handle(ChFiDS_SurfData)& SD,
                    TopOpeBRepDS_DataStructure&    DStr,
-                   const Standard_Boolean         ,
+                   const Standard_Boolean         /*isfirst*/,
                    const Standard_Integer         ons)
 {
   if(!SD->IsOnCurve(ons)) return;
   E.Orientation(TopAbs_FORWARD);
   TopExp_Explorer ex;
 
-  // les traiter tous en verifiant que ce n est pas 
-  // deja fait.
+  // process them checking that it has not been done already.
   for(ex.Init(E,TopAbs_VERTEX);ex.More();ex.Next()) {
     const TopoDS_Vertex& vv = TopoDS::Vertex(ex.Current());
     if(vv.IsSame(V)) {
     }
   }
 }
+
 //=======================================================================
 //function : findIndexPoint
 //purpose  : returns in <ipon> index of point bounding a courve interfering
 //           with <Fd> and coinciding with last common point on <OnS> face
 //=======================================================================
-static Standard_Boolean 
-  findIndexPoint(const TopOpeBRepDS_DataStructure& DStr,
-                const Handle(ChFiDS_SurfData)&    Fd,
-                const Standard_Integer            OnS,
-                Standard_Integer&                 ipoin)
+
+static Standard_Boolean findIndexPoint(const TopOpeBRepDS_DataStructure& DStr,
+                                      const Handle(ChFiDS_SurfData)&    Fd,
+                                      const Standard_Integer            OnS,
+                                      Standard_Integer&                 ipoin)
 {
   ipoin = 0;
   gp_Pnt P = Fd->Vertex(Standard_False,OnS).Point();
   }
   return Standard_False;
 }
+// *******************************************************************
 //=======================================================================
 //function : FilDS
 //purpose  : 
 //=======================================================================
+// *******************************************************************
+
 void  ChFi3d_FilDS(const Standard_Integer       SolidIndex,
                   const Handle(ChFiDS_Stripe)& CorDat,
                   TopOpeBRepDS_DataStructure&  DStr,
   TopOpeBRepDS_ListOfInterference& SolidInterfs = 
     DStr.ChangeShapeInterferences(SolidIndex);
 
-  ChFiDS_Regul regcout; // pour les CD closed and tangent
-  ChFiDS_Regul regfilfil; // pour les joints Surf/Surf
+  ChFiDS_Regul regcout; // for closed and tangent CD
+  ChFiDS_Regul regfilfil; // for connections Surf/Surf
 
   ChFiDS_CommonPoint V3;
   ChFiDS_CommonPoint V4;
        if (FiLen > Precision::PConfusion()) continue;
        TopOpeBRepDS_Curve& cc = DStr.ChangeCurve(IcFil1);
        cc.ChangeCurve().Nullify();
-
+#ifdef DEB
+       cout << "Nullify degenerated FI of SurfData " << j <<" on S" << onS << endl;
+#endif
        // care of CommonPoint, eap occ354
        if (j!=1 && j!=SeqFil.Length()) continue;
        Standard_Boolean isfirst = (j==1);
       isInDS1 = isInDS1 || SeqFil.Length()-j+1 < CorDat->IsInDS(Standard_False);
     }
     
-    // creation de la SolidSurfaceInterference
+    // creation of SolidSurfaceInterference
     
     Handle(TopOpeBRepDS_SolidSurfaceInterference) 
       SSI = new TopOpeBRepDS_SolidSurfaceInterference
     const ChFiDS_CommonPoint& V1 = Fd->VertexFirstOnS1();
     const ChFiDS_CommonPoint& V2 = Fd->VertexFirstOnS2();
 
-    // Un petit traitement pour gerer les interference doubles
+    // Processing to manage double interferences
     if (j>1) {
       if (V1.IsOnArc() && V3.IsOnArc() && V1.Arc().IsSame(V3.Arc())) {
-       //on initialise Iarc1
+       //Iarc1 is initialized
        //Iarc1 = DStr.AddShape(V1.Arc());
        if (ChFi3d_Contains(DStr.ShapeInterferences(Iarc1),Iarc1,Ipoin1) && 
            (V1.TransitionOnArc() != V3.TransitionOnArc()) ) {
       }
 
       if (V2.IsOnArc() && V4.IsOnArc() && V2.Arc().IsSame(V4.Arc())) {
-       //on initialise Iarc2
+       //Iarc2 is initialized
        //Iarc2 = DStr.AddShape(V2.Arc());
        if ( ChFi3d_Contains(DStr.ShapeInterferences(Iarc2),Iarc2,Ipoin2)  && 
            (V2.TransitionOnArc() != V4.TransitionOnArc()) ) {
     
     ET1 = TopAbs::Reverse(trafil1);
     
-    // Un petit paragraphe pour traiter les contacts aretes qui touchent 
-    // un vertex de l'obstacle.
+    // A small paragraph to process contacts of edges, which touch 
+    // a vertex of the obstacle.
     if(V1.IsVertex() && Fd->IsOnCurve1()) {
       const TopoDS_Vertex& vv1 = V1.Vertex();
       CutEdge(vv1,Fd,DStr,1,1);
       Singulier_en_Bout =  (V1.Point().IsEqual(V2.Point(), 0));
       
       if (Singulier_en_Bout) {
-         // Queue de Billard
          if ((!V1.IsVertex()) || (!V2.IsVertex())) {
-
+#if DEB
+          cout << "Singularity at end out of vertex " << endl;
+#endif
         }
         else {
-          isVertex1 = isVertex2 = Standard_True; //precaution...
-          // On elimine l'arete de la spine debouchant sur ce vertex.
+          isVertex1 = isVertex2 = Standard_True; //caution...
+          // The edge is removed from spine starting on this vertex.
           TopoDS_Edge Arcspine = spine->Edges(1);
           BoutdeVtx = V1.Vertex();
           Standard_Integer IArcspine = DStr.AddShape(Arcspine);
           Standard_Integer IVtx = CorDat->IndexFirstPointOnS1();
-
-          TopAbs_Orientation OVtx = TopAbs_FORWARD;;
-
+#ifndef DEB
+          TopAbs_Orientation OVtx = TopAbs_FORWARD;
+#else
+          TopAbs_Orientation OVtx;
+#endif
           for(ex.Init(Arcspine.Oriented(TopAbs_FORWARD),TopAbs_VERTEX); 
               ex.More(); ex.Next()) {
             if(BoutdeVtx.IsSame(ex.Current())) {
          TCurv.SetSCI(Interfc1,bidinterf);         
        }
       }
-    } // Fin du Traitement Initial (j==1)
+    } // End of the Initial Processing (j==1)
     else {
-      // ---- Interference entre Conges ------
+      // ---- Interference between Fillets ------
       
       if (!isInDS1) {// eap, Apr 29 2002, occ 293 
        
         if (Degene && isVertex1) {
-          // On elimine l'arete de la spine debouchant sur ce vertex.
-          NumEdge++; // On a dejas trouve l'arete precedente du vertex
+          // The edge is removed from the spine starting on this vertex.
+          NumEdge++; // The previous edge of the vertex has already been found.
           TopoDS_Edge Arcspine = spine->Edges(NumEdge);
           Standard_Integer IArcspine = DStr.AddShape(Arcspine);
           Standard_Integer IVtx = DStr.AddShape(BoutdeVtx);
+#ifndef DEB
           TopAbs_Orientation OVtx = TopAbs_FORWARD;
+#else
+          TopAbs_Orientation OVtx;
+#endif
           for(ex.Init(Arcspine.Oriented(TopAbs_FORWARD),TopAbs_VERTEX); 
               ex.More(); ex.Next()) {
             if(BoutdeVtx.IsSame(ex.Current())) {
           Handle(TopOpeBRepDS_CurvePointInterference) 
             interfv = ChFi3d_FilVertexInDS(OVtx,IArcspine,IVtx,parVtx);
           DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
-        } // Fin de l'elimination
+        } // End of the removal
 
         gp_Pnt2d UV1 = Fd->InterferenceOnS1().PCurveOnSurf()->
           Value(Fd->InterferenceOnS1().FirstParameter());
           Value(Fd->InterferenceOnS2().FirstParameter());
         TopOpeBRepDS_Curve& TCurv = DStr.ChangeCurve(Icurv);
         if (Degene) {
-          // on associe la pcurve via la SCI a la TopOpeBRepDSCurve.
+          // pcurve is associated via SCI to TopOpeBRepDSCurve.
           ChFi3d_ComputePCurv(UV1,UV2,PCurv,Pardeb,Parfin);       
           Interfc1= ChFi3d_FilCurveInDS (Icurv,Isurf,PCurv,ET1);
           DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc1);
           DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc1);
         }
       }
-    } // Fin Interference entre conges 
+    } // End of Interference between fillets 
    
-    // ---- Interference Conges / Faces
+    // ---- Interference Fillets / Faces
     IcFil1 = Fi1.LineIndex();
     
     if (IcFil1!=0 ) {
                                     Fi1.PCurveOnSurf(),trafil1);
       DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc3);
       Ishape1 = Fd->IndexOfS1();
-      // Cas d arete degeneree : on associe la pcurve via la SCI 
-      // a la TopOpeBRepDSCurve.
+      // Case of degenerated edge : pcurve is associated via SCI 
+      // to TopOpeBRepDSCurve.
       TopOpeBRepDS_Curve& cc = DStr.ChangeCurve(IcFil1);
       if(cc.Curve().IsNull()) {
        Handle(TopOpeBRepDS_Interference) bidinterf;
        }
        reglist.Append(regon1);
       }
-      // Indice et type du point en Fin
+      // Indice and type of the point at End
       Standard_Integer ipoin;
       Standard_Boolean isVertex = Fd->VertexLastOnS1().IsVertex();
       if (j == SeqFil.Length()) ipoin = CorDat->IndexLastPointOnS1();
                  SeqFil(1)->VertexFirstOnS1().Point(), 1.e-7)) ||
                  (Fd->VertexLastOnS1().Point().IsEqual(
                  SeqFil(SeqFil.Length())->VertexLastOnS1().Point(), 1.e-7))) )
-       // Cas des SurfData coupe de facon "Triangulaire"   
+       // Case of SurfData cut in "Triangular" way.   
        ipoin=CorDat->IndexLastPointOnS1();
 
       // eap, Apr 29 2002, occ 293
       else if (isInDS2 && findIndexPoint(DStr, Fd, 1, ipoin)) {
-
+#ifdef DEB
+       cout << "ChFi3d_FilDS: point " << ipoin <<" is found in DS" << endl;
+#endif
       }
       else ipoin = ChFi3d_IndexPointInDS(Fd->VertexLastOnS1(),DStr);
       
       TopOpeBRepDS_ListOfInterference& Li = DStr.ChangeCurveInterferences(IcFil1);
-
+#ifdef DEB
+      if (!Li.IsEmpty()) 
+       cout<<"FilDS : Tangency line on several SurfData"<< endl;
+#endif
       if (!ChFi3d_Contains(Li,IcFil1,Ipoin1)) { 
        
        Interfp1 = ChFi3d_FilPointInDS(TopAbs_FORWARD,IcFil1,Ipoin1,
                                   Fi2.PCurveOnSurf(),trafil2);
       DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc4);
       Ishape2 = Fd->IndexOfS2();
-      // Cas d arete degeneree : on associe la pcurve via la SCI 
-      // a la TopOpeBRepDSCurve.
+      // Case of degenerated edge : pcurve is associated via SCI 
+      // to TopOpeBRepDSCurve.
       TopOpeBRepDS_Curve& cc = DStr.ChangeCurve(IcFil2);
       if(cc.Curve().IsNull()) {
        Handle(TopOpeBRepDS_Interference) bidinterf;
        }
        reglist.Append(regon2);
       }
-      // Indice et type du point en Fin
+      // Indice and type of the point in End
       Standard_Integer ipoin;
       Standard_Boolean isVertex = Fd->VertexLastOnS2().IsVertex();
       if (j == SeqFil.Length() ) ipoin = CorDat->IndexLastPointOnS2();
        isVertex = isVertex2;
       }
       else if(Fd->VertexLastOnS2().Point().IsEqual(
-             Fd->VertexLastOnS1().Point(), 0) ) {  //Pincement !!
+             Fd->VertexLastOnS1().Point(), 0) ) {  //Pinch !!
        ipoin = Ipoin1;
        isVertex = isVertex1;
       }
                  SeqFil(1)->VertexFirstOnS2().Point(), 1.e-7)) ||
                  (Fd->VertexLastOnS2().Point().IsEqual(
                  SeqFil(SeqFil.Length())->VertexLastOnS2().Point(), 1.e-7))) )
-       // Cas des SurfData coupe de facon "Triangulaire"    
+       // Case of SurfData cut in "Triangular" way.   
        ipoin=CorDat->IndexLastPointOnS2();
 
       // eap, Apr 29 2002, occ 293
       else if (isInDS2 && findIndexPoint(DStr, Fd, 2, ipoin)) {
-
+#ifdef DEB
+       cout << "ChFi3d_FilDS: point " << ipoin <<" is found in DS" << endl;
+#endif
       }
       else ipoin = ChFi3d_IndexPointInDS(Fd->VertexLastOnS2(),DStr);
       
       TopOpeBRepDS_ListOfInterference& Li = DStr.ChangeCurveInterferences(IcFil2);
-
+#ifdef DEB
+      if (!Li.IsEmpty()) 
+       cout<<"FilDS : Tangency line on several SurfData"<< endl;
+#endif
       if (!ChFi3d_Contains(Li,IcFil2,Ipoin2)) { 
        Interfp2 = ChFi3d_FilPointInDS(TopAbs_FORWARD,IcFil2,Ipoin2,
                                       Fi2.FirstParameter(), isVertex2);
    
     Degene = V3.Point().IsEqual(V4.Point(), 0);
 
-    // Traitement des cas degenere     
+    // Processing of degenerated case     
     if (Degene) {
-      // Queue de Billard
       Standard_Boolean Vertex = (V3.IsVertex()) && (V4.IsVertex());
       if (!Vertex) {
-
+#if DEB
+       if (j == SeqFil.Length()) {
+         cout << " Singularity at the end is out of vertex " << endl;
+       }
+#endif
       }
       else {
-       // On elimine l'arete de la spine debouchant sur ce vertex.
+       // The edge of the spine starting on this vertex is removed.
        Standard_Boolean Trouve = Standard_False;
        TopoDS_Edge Arcspine;
+#ifndef DEB
        TopAbs_Orientation OVtx = TopAbs_FORWARD;
+#else
+       TopAbs_Orientation OVtx;
+#endif
        BoutdeVtx = V3.Vertex();
            
        while (NumEdge<= spine->NbEdges() && !Trouve) { 
               else Trouve = Standard_True;
            }
          }
-         if (!Trouve) NumEdge++; // On passe a l'arete suivante
+         if (!Trouve) NumEdge++; // Go to the next edge
        }
        Standard_Integer IArcspine = DStr.AddShape(Arcspine);
        Standard_Integer IVtx;
          interfv = ChFi3d_FilVertexInDS(OVtx,IArcspine,IVtx,parVtx);
        DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
       }
-    } // fin du cas Degene
+    } // end of degenerated case
     else if (!(Closed && j == SeqFil.Length())) {
-      // Traitement des interference Point / Edges
+      // Processing of interference Point / Edges
       if (V3.IsOnArc()) {
        if(!(V3.IsVertex() && Fd->IsOnCurve1())) {
          Iarc1 = DStr.AddShape(V3.Arc());
     }
   }
 }
+
 //=======================================================================
 //function : StripeEdgeInter
 //purpose  : This function examines two stripes for an intersection 
 //           this function will become useless.
 //author   : akm, 06/02/02. Against bug OCC119.
 //=======================================================================
+
 void ChFi3d_StripeEdgeInter (const Handle(ChFiDS_Stripe)& theStripe1,
                             const Handle(ChFiDS_Stripe)& theStripe2,
                             TopOpeBRepDS_DataStructure&  /*DStr*/,
 //function : IndexOfSurfData
 //purpose  : 
 //=======================================================================
+
 Standard_Integer ChFi3d_IndexOfSurfData(const TopoDS_Vertex& V1,
                                        const Handle(ChFiDS_Stripe)& CD,
                                        Standard_Integer& sens)
   }
   return Index; 
 }  
+
 //=======================================================================
 //function : EdgeFromV1
 //purpose  : 
     }
   return E;
 }
+
+#ifdef DRAW
+//=======================================================================
+//function : drawline
+//purpose  : 
+//=======================================================================
+
+static void drawline(const Handle(IntSurf_LineOn2S)& lin)
+{
+  Handle(Draw_Marker3D) p3d;
+  Handle(Draw_Marker2D) p2d;
+  Handle(Draw_Marker2D) p2d2;
+  
+  for(Standard_Integer i = 1; i <= lin->NbPoints(); i++) {
+    const IntSurf_PntOn2S& pt = lin->Value(i);
+    gp_Pnt point = pt.Value();
+    Standard_Real u,v,uu,vv;
+    pt.ParametersOnS1(u,v);
+    gp_Pnt2d point2d(u,v);
+    pt.ParametersOnS2(uu,vv);
+    gp_Pnt2d point2d2(uu,vv);
+    if(i == 1 || i == lin->NbPoints()) {
+      p3d = new Draw_Marker3D(point,Draw_Square,Draw_rouge);
+      p2d = new Draw_Marker2D(point2d,Draw_Square,Draw_rouge);
+      p2d2 = new Draw_Marker2D(point2d2,Draw_Square,Draw_rouge);
+    }
+    else {
+      p3d = new Draw_Marker3D(point,Draw_Square,Draw_jaune);
+      p2d = new Draw_Marker2D(point2d,Draw_Square,Draw_jaune);
+      p2d2 = new Draw_Marker2D(point2d2,Draw_Square,Draw_jaune);
+    }
+    dout<<p3d;
+    dout<<p2d;
+    dout<<p2d2;
+    
+    dout.Flush();
+  }
+}
+#endif
+
 //=======================================================================
 //function : ConvTol2dToTol3d
-//purpose  : Comme son nom l indique.
+//purpose  : 
 //=======================================================================
 
 Standard_Real ChFi3d_ConvTol2dToTol3d(const Handle(Adaptor3d_HSurface)& S,
   Standard_Real vresto3d = 1.e-7*tol2d/vres;
   return Max(uresto3d,vresto3d);
 }
+
 //=======================================================================
 //function : EvalTolReached
-//purpose  : Comme son nom l indique la fonction ci dessus etant trop
-//           dure lorsque le parametrage des surfaces n est pas homogene.
+//purpose  : The function above is too hard because 
+//           parametrization of surfaces is not homogenous.
 //=======================================================================
 
 Standard_Real ChFi3d_EvalTolReached(const Handle(Adaptor3d_HSurface)& S1,
 //function : trsfsurf
 //purpose  : 
 //=======================================================================
+
 Handle(Geom_Surface) trsfsurf(const Handle(Adaptor3d_HSurface)& HS,
                              Handle(Adaptor3d_TopolTool)&      /*dom*/)
 {
-  //Pour l utilisation des domaines voir avec BUBUCH!!
   Handle(Geom_Surface) res;
   Handle(BRepAdaptor_HSurface) hbs = Handle(BRepAdaptor_HSurface)::DownCast(HS);
   Handle(GeomAdaptor_HSurface) hgs = Handle(GeomAdaptor_HSurface)::DownCast(HS);
   Standard_Real U1 = HS->FirstUParameter(), U2 = HS->LastUParameter();
   Standard_Real V1 = HS->FirstVParameter(), V2 = HS->LastVParameter();
   if(!res.IsNull()) {
-  // Blindage contre les Construction Error intempestifs
+  // Protection against Construction Errors
     Standard_Real u1, u2, v1, v2;
     res->Bounds( u1, u2, v1, v2);
     if (!res->IsUPeriodic()) {
 //  dom = new Adaptor3d_TopolTool(temp);
   return res;
 }
+
 //=======================================================================
 //function : CurveCleaner
-//purpose  : Rend une BSpline le plus continue possible
-//           a une tolerance donne
+//purpose  : Makes a BSpline as much continued as possible
+//           at a given tolerance
 //=======================================================================
 static void CurveCleaner(Handle(Geom_BSplineCurve)& BS, 
                         const Standard_Real Tol,
   const Standard_Integer NbK=BS->NbKnots();
   
   for (Mult = BS->Degree(); Mult > MultMin; Mult--) {
-    tol *= 0.5; // Reduction progressive
+    tol *= 0.5; // Progressive reduction
     for (ii=NbK; ii>1; ii--) {
       if (BS->Multiplicity(ii) == Mult)
         BS->RemoveKnot(ii, Mult-1, tol);
     }
   }
 }
+
 //=======================================================================
 //function : ComputeCurves
-//purpose  : Calcule une intersection bornee entre deux HSurfaces.
-//           Il faut connaitre les extremites de l intersection et 
-//           les surfaces doivent avoir ete retouchees en entree 
-//           pour encadrer au mieux (ni trop pres ni trop loin) les
-//           points de debut et fin de l intersection.
-//           Les intersections analytiques sont traitees a part.
-//           <wholeCurv> means that resulting curve is restricted by
+//purpose  : Calculates intersection between two HSurfaces.
+//           It is necessary to know the extremities of intersection and  
+//           the surfaces should be processed at input 
+//           to fit as good as possible (neither too close nor too far) 
+//           the points of beginning and end of the intersection.
+//           The analytic intersections are processed separately.
+//           <wholeCurv> means that the resulting curve is restricted by
 //           boundaries of input surfaces (eap 30 May occ354)
 //=======================================================================
+
 Standard_Boolean ChFi3d_ComputeCurves(Handle(Adaptor3d_HSurface)&   S1,
                                      Handle(Adaptor3d_HSurface)&   S2,
                                      const TColStd_Array1OfReal& Pardeb,
   gp_Pnt pdeb2 = S2->Value(Pardeb(3),Pardeb(4));
   gp_Pnt pfin2 = S2->Value(Parfin(3),Parfin(4));
 
-  Standard_Real distrefdeb = pdeb1.Distance(pdeb2);//mesure la solidite
-  Standard_Real distreffin = pfin1.Distance(pfin2);//des donnees d entree
+  Standard_Real distrefdeb = pdeb1.Distance(pdeb2);//checks the worthiness 
+  Standard_Real distreffin = pfin1.Distance(pfin2);//of input data
   if(distrefdeb < tol3d) distrefdeb = tol3d;
   if(distreffin < tol3d) distreffin = tol3d;
 
   if(distref < distrefdeb) distref = distrefdeb;
   if(distref < distreffin) distref = distreffin;
 
-  //On traite a part quelques cas analytiques.
-  //Pour reorienter eventuellement le resultat de l intersection
-  //analytique, on postule que la tangente en debut doit etre dans
-  //le sens de la corde deb/fin.
+  //Some analytic cases are processed separately.
+  //To reorientate the result of the analythic intersection,
+  //it is stated that the beginning of the tangent should be
+  //in the direction of the start/end line.
   gp_Vec Vint, Vref(pdeb,pfin);
   gp_Pnt Pbid;
   Standard_Real Udeb,Ufin;
     }
   }
   else {
-    // ici on attaque GeomInt.
-    //Pour l utilisation des domaines voir avec BUBUCH!!
+    // here GeomInt is approached.
     Handle(Adaptor3d_TopolTool) dom1,dom2;
     Handle(Geom_Surface) gs1 = trsfsurf(S1,dom1);
     Handle(Geom_Surface) gs2 = trsfsurf(S2,dom2);
 #if defined(IRIX) || defined(__sgi)
         if(nbl==0) {
 
-//  solution de rattrapage pour SGI 
-//  si l'intersection de gs1 avec gs2 ne marche pas alors on  tente 
-// l'intersection de gs2 avec gs1 
+//  solution of adjustment for SGI 
+//  if the intersection of gs1 with gs2 doesnot worke 
+//  then the intersection of gs2 with gs1 is attempted.
 
           inter.Perform(gs2,gs1,tolap,1,1,1);
 //          inter.Perform(gs2,dom2,gs1,dom1,tolap,1,1,1);
           if(!inter.IsDone()) return Standard_False; 
          nbl = inter.NbLines(); 
 
-//  si GeomInt ne rend pas d'intersection on ne tente pas la solution de 
-//  rattrapage 
+//  if GeomInt does not make the intersection the solution of adjustment 
+//  is not attempted 
             if (nbl==0) return Standard_False;
         }
 #endif
            C3d = new Geom_TrimmedCurve(C3d,Uf,Ul);
            Pc1 = new Geom2d_TrimmedCurve(Pc1,Uf,Ul);
            Pc2 = new Geom2d_TrimmedCurve(Pc2,Uf,Ul);
-           //faut il renverser ?
+           //is it necesary to invert ?
            Standard_Real distdeb = ptestdeb.Distance(pdeb);
            Standard_Real distfin = ptestfin.Distance(pfin);
            if(distdeb > distref || distfin > distref) {
       }
     }
   }
+#ifdef DEB
+  cout<<"fail intersection surf/surf adjustment at the main is attempted"<<endl;
+#endif
   
-  // A ce stade : 
-  // les intersections classiques ont echouees on attaque le
-  // cheminement du desespoir.
+  // At this stage : 
+  // classic intersections have failed, the path is approached in vain.
 //  Standard_Real Step = 0.1;
   while(1) {
-    //Attention les parametres de fleche pour le cheminement et 
-    //de tolerance pour l'approx ne peuvent etre pris comme ceux 
-    //du Builder, on les reestime donc comme on peut.
+    //Attention the parameters of arrow for the path and
+    //the tolerance for the approximation can't be taken as those of the  
+    //Builder, so they are reestimated as much as possible.
     Standard_Real fleche = 1.e-3 * pdeb.Distance(pfin);
     Standard_Real tolap = 1.e-7;
     IntPatch_ThePWalkingInter
       IntKK(S1,S2,tol3d,tol3d,fleche,Step);
     
-    //On connait les extremites de l intersection (Pardeb,Parfin),
-    //on essaye de trouver un point de depart franchement au
-    //milieu pour ne pas embrouiller le cheminement.
+    //The extremities of the intersection (Pardeb,Parfin) are known,
+    //one tries to find the start point at the 
+    //middle to avoid obstacles on the path.
     Standard_Boolean depok = Standard_False;
     IntSurf_PntOn2S pintdep;
     TColStd_Array1OfReal depart(1,4);
       depok = IntKK.PerformFirstPoint(depart,pintdep);
     } 
     if(!depok) {
+#ifdef DEB 
+      cout<<"intersection surf/surf : failed to compute the start point"<<endl;
+#endif
       return Standard_False;
     }
     pintdep.Parameters(depart(1),depart(2),depart(3),depart(4));
     if (IntKK.NbPoints() <= 30) {
       Step *= 0.5;
       if (Step <= 0.0001) {
+#ifdef DEB 
+       cout<<"intersection surf/surf : not enough points"<<endl;
+#endif
        return Standard_False;
       }
     }
     else{
-      // A ce stade on a une LineOn2S presentable, on la tronque entre les 
-      // points les plus proches des extremites connues on en fait une 
-      // WLine et on lance l approx.
-      // On retouche ensuite le resultat pour avoir les bons points debut 
-      // et fin.
+      // At this stage there is a presentable LineOn2S, it is truncated  
+      // between the points closest to known  extremites 
+      // in fact there is a WLine and the approximation is launched.
+      // Then the result is corrected to get proper start and end points.
       const Handle(IntSurf_LineOn2S)& L2S = IntKK.Line();
       
       gp_Pnt codeb1 = S1->Value(Pardeb(1),Pardeb(2));
       Standard_Real ddeb = Precision::Infinite(); 
       Standard_Real dfin = Precision::Infinite();
       Standard_Real dd;
+#ifndef DEB
       Standard_Integer indd = 0, indf = 0;
+#else
+      Standard_Integer indd, indf;
+#endif
       for(i = 1; i <= nbp; i++) {
        dd = L2S->Value(i).Value().Distance(pntd);
        if(dd < ddeb) { ddeb = dd; indd = i;}
       for (i = indf + 1; i <= nbp; i++) { L2S->RemovePoint(indf + 1); }
       nbp = indf;
       if(nbp==1) return Standard_False;
-      //On insere les extremites dans la ligne si les points extremites de
-      //celle-ci en sont trop eloignes et si pardeb et parfin sont bons.
+      //The extremities are inserted in the line if the extremity points on it 
+      //are too far and if pardeb and parfin are good.
       if(ddeb >= tol3d && bondeb) {
        IntSurf_PntOn2S p1 = L2S->Value(1);
        IntSurf_PntOn2S p2 = L2S->Value(2);
        }
        dfin = 0.;
       }      
-      //
-      Handle(IntPatch_WLine)   WL = new IntPatch_WLine(L2S,Standard_False);
+#ifdef DRAW
+      ChFi3d_SettraceDRAWINT(Standard_True);
+      if(ChFi3d_GettraceDRAWINT()) drawline(L2S);
+#endif
+      Handle(IntPatch_WLine) 
+       WL = new IntPatch_WLine(L2S,Standard_False);
       
       GeomInt_WLApprox approx;
       approx.SetParameters(tolap,tol2d,4,8,0,1);
-      // gerer ici les approx inutiles sur les plans!!!!!!!!!!!
+      // manage here the approximations that are not useful on planes!
       approx.Perform(S1,S2,WL,
                     Standard_True,Standard_True,Standard_True,
                     1,nbp);
       mbs.Curve(2,pol2d1);
       TColgp_Array1OfPnt2d pol2d2(1,nbpol);
       mbs.Curve(3,pol2d2);
-      // On recale les extremites de l intersection sur les points connus.
+      // The extremities of the intersection are reset on known points.
       if(ddeb >= tol1) {
        pol3d(1) = pntd;
        pol2d1(1).SetCoord(Pardeb(1),Pardeb(2));
 
 //=======================================================================
 //function : IntCS
-//purpose  : Calcul rapide de l intersection courbe surface.
+//purpose  : Fast calculation of the intersection curve surface.
 //
 //=======================================================================
 
   IntCurveSurface_IntersectionPoint pint;
   Intersection.Perform(C,S);
   Standard_Boolean keepfirst = (wc < -1.e100), keeplast = (wc > 1.e100);
+#ifndef DEB
   Standard_Real temp = 0.;
+#else
+  Standard_Real temp;
+#endif
   if(keepfirst) temp = 1.e100;
   if(keeplast) temp = -1.e100;
   Standard_Real dist = 2.e100;
 
 //=======================================================================
 //function : ComputesIntPC
-//purpose  : Intersection de deux PCurves de type FaceInterference
-//           les parametres sur les pcurves du point solution sont 
+//purpose  : Intersection of two PCurves of type FaceInterference
+//           the parameters of the pcurves at the solution point are 
 //           UInt1,UInt2
 //=======================================================================
 
   ChFi3d_ComputesIntPC(Fi1,Fi2,HS1,HS2,UInt1,UInt2,bid);
 }
 
-//=======================================================================
-//function : ChFi3d_ComputesIntPC
-//purpose  : 
-//=======================================================================
 void ChFi3d_ComputesIntPC (const ChFiDS_FaceInterference&      Fi1,
                           const ChFiDS_FaceInterference&      Fi2,
                           const Handle(GeomAdaptor_HSurface)& HS1,
                           Standard_Real&                      UInt2,
                           gp_Pnt&                             P)
 {    
-  // Une seule intersection a realiser, on prend tout de meme
-  // le soin de valider les extremites par un extrema c3d/c3d
-  // realise sur les pcurveonsurf des conges.
+  // Only one intersection to be carried out, however, the effort
+  // is taken to check the extremities by an extrema c3d/c3d
+  // created on pcurveonsurf of fillets.
   
   Standard_Real x,y,distref2;
   Fi1.PCurveOnSurf()->Value(UInt1).Coord(x,y);
   gp_Pnt p3d2 = HS2->Value(x,y);
   distref2 = p3d1.SquareDistance(p3d2);
   P.SetXYZ(0.5*(p3d1.XYZ() + p3d2.XYZ()));
-  // recalcul de l'extrema
+  // recalculation of the extremums
   Standard_Real delt1 = 
     Min(0.1,0.05*(Fi1.LastParameter() - Fi1.FirstParameter()));
   Handle(Geom2dAdaptor_HCurve) hc2d1 = 
 //           SurfData Fd1 and trims it to allow the intersection computation
 
 //=======================================================================
+
 Handle(GeomAdaptor_HSurface) ChFi3d_BoundSurf(TopOpeBRepDS_DataStructure&    DStr,
                                              const Handle(ChFiDS_SurfData)& Fd1,
                                              const Standard_Integer&        IFaCo1,
                                              const Standard_Integer&        IFaArc1)
 {
-  //rmq : comme en fait les 2 interferences de Fd1 ne servent qu'a donner les 
-  //      bornes, les indices  IFaCo1 et IFaArc1 sont inutiles.
-  //      On les garde ici en option au cas ou il faudrait borner de facon plus
-  //      restrictive (avec des points d'intersection en argument en plus).
+  //rmq : as in fact 2 interferences of Fd1 serve only to set limits 
+  //      indexes IFaCo1 and IFaArc1 are not useful.
+  //      They are preserver here as an option in case it will be necessary to set 
+  //      more restrictive limits (with intersection points as additional argument).
   
   Handle(GeomAdaptor_HSurface) HS1 = new GeomAdaptor_HSurface();
   GeomAdaptor_Surface& S1 = HS1->ChangeSurface();
     S1.Load(DStr.Surface(Fd1->Surf()).Surface(),
            mu,Mu,mv-Dv,Mv+Dv);
   }
-  //Dans le cas d'un tore ou cone, il ne faut pas que l'agrandissement des bounds engendrent une surface avec une periode plus grande que 2PI. lvt
+  //In the case of a torus or cone, it is not necessary that the bounds create a surface with period more than 2PI. 
   else if (styp == GeomAbs_Torus ||
           styp == GeomAbs_Cone) {
     Du = Min(PI-0.5*Du,0.1*Du);
   }
   return HS1;
 }
+
+
+
 //=======================================================================
 //function : SearchPivot
 //purpose  : 
                                    Standard_Real u[3][3],
                                    const Standard_Real t)
 {
-  //Cette fonction recherche comme pivot une cd dont les sections 
-  //ne se croisent pas sur la face opposee. 
-  //         - il y aura peut etre des cas suffisamment asymetriques
-  //           pour qu aucun des trois conges ne convienne!! A VOIR.
-  //         - dans le cas ou plusieurs conviennent on prend le 
-  //           premier qui n est pas forcement le meilleur, prevoir 
-  //           d affiner cela en comparant les parametres sur les
-  //           lignes guide et (/ou) les rayons.
+  //           This function finds as pivot a cd the sections which of
+  //           do not cross on the opposite face. 
+  //         - probably there will be cases asymmetric to the point that
+  //           none of tree fillets will match! To be SEEN.
+  //         - in case when several fillets match the 
+  //           first one taken is not inevitably the best 
+  //           it should be refined by comparing the parameters on 
+  //           guide lines and (/or) radiuses.
   
   Standard_Boolean bondeb,bonfin;
   for(Standard_Integer i = 0; i <= 2; i++) {
                      const gp_Pnt& LastP,
                      Handle(Geom_TrimmedCurve)& gtc)
 {
+#ifndef DEB
   Standard_Real uf = 0.,ul = 0.;
+#else
+  Standard_Real uf,ul;
+#endif
   GeomAdaptor_Curve gac(gc);
   switch ( gac.GetType() ) {
   case GeomAbs_Line :
   gtc = new Geom_TrimmedCurve(gc,uf,ul);
 }
 
-
-
 //=======================================================================
-//function : GoodExt
+//function : PerformElSpine
 //purpose  : 
 //=======================================================================
+
 static Standard_Boolean GoodExt(const Handle(Geom_Curve)& C,
                                const gp_Vec&             V,
                                const Standard_Real       f,
   }
   return Standard_True;
 }
-//=======================================================================
-//function : PerformElSpine
-//purpose  : 
-//=======================================================================
-Standard_EXPORT 
-  void ChFi3d_PerformElSpine(Handle(ChFiDS_HElSpine)& HES,
-                            Handle(ChFiDS_Spine)&    Spine,
-                            const GeomAbs_Shape      continuity,
-                            const Standard_Real      tol) 
+
+Standard_EXPORT void ChFi3d_PerformElSpine(Handle(ChFiDS_HElSpine)& HES,
+                                          Handle(ChFiDS_Spine)&    Spine,
+                                          const GeomAbs_Shape      continuity,
+                                          const Standard_Real      tol) 
 {
-  
-  Standard_Boolean periodic, Bof, checkdeb, cepadur,bIsSmooth;
-  Standard_Integer IEdge,IF,IL,nbed, iToApproxByC2;
-  Standard_Real WF, WL, Wrefdeb, Wreffin,nwf,nwl,period,pared,tolpared;
-  Standard_Real First, Last, epsV, urefdeb, tolrac;
-  GeomAbs_Shape aContinuity;
-  gp_Pnt PDeb, PFin, Bout;
-  gp_Vec VrefDeb, VrefFin;
-  Handle(Geom_Curve) Cv;
-  Handle(Geom_BoundedCurve) TC;
-  Handle(Geom_BSplineCurve) BS, BSpline;
-  TopoDS_Edge E, Eold;
-  TopoDS_Vertex V;
-    //
   ChFiDS_ElSpine& ES = HES->ChangeCurve();
-  WF = ES.FirstParameter();
-  WL = ES.LastParameter();
-  Wrefdeb = WF;
-  Wreffin = WL;
-  nwf = WF;
-  nwl = WL;
-  nbed = Spine->NbEdges();
-  periodic = Spine->IsPeriodic();
+  
+  Standard_Real WF = ES.FirstParameter();
+  Standard_Real WL = ES.LastParameter();
+  Standard_Real Wrefdeb = WF;
+  Standard_Real Wreffin = WL;
+  Standard_Integer IF,IL;
+  Standard_Boolean periodic = Spine->IsPeriodic();
+  Standard_Real nwf = WF, nwl = WL,period;
+  Standard_Integer nbed = Spine->NbEdges();
+  Standard_Real pared,tolpared;
+  Handle(Geom_BSplineCurve) BSpline;
+  Handle(Geom_BezierCurve) Bezier;
+  
   if(periodic) {
     period = Spine->Period();
     nwf = ElCLib::InPeriod(WF,-tol,period-tol);
     Wrefdeb = Max(Spine->FirstParameter(IF),WF);
     Wreffin = Min(Spine->LastParameter(IL),WL);
   }
-  //
+  
+  gp_Pnt PDeb, PFin, Bout;
+  gp_Vec VrefDeb, VrefFin;
   Spine->D1(WF,PDeb,VrefDeb);
   Spine->D1(WL,PFin,VrefFin);
   VrefDeb.Normalize();
   VrefFin.Normalize();
-  //
+  
+  Standard_Boolean   Bof;
+  Standard_Integer IEdge;
+  
+  Standard_Real  First, Last, epsV;
   TColgp_Array1OfPnt ExtrapPole(1, 5);
   TColgp_Array1OfPnt ExtraCoeffs(1, 5);
   TColgp_Array1OfXYZ Cont(1,5);
-  // Attention on segmente eventuellement la premiere et la
-  // derniere arete.
-  // Traitment de la premiere arete
-  cepadur = 0;
-  E=Spine->Edges(IF);
-  Bof=BRepLib::BuildCurve3d(E);
+  
+  TopoDS_Edge E, Eold;
+  TopoDS_Vertex V;
+  
+  // Attention, the first and the last edge are segmented
+    
+  // Processing of the first edge
+  E = Spine->Edges(IF);
+  Bof = BRepLib::BuildCurve3d(E);
   const BRepAdaptor_Curve& edc = Spine->CurrentElementarySpine(IF);
   tolpared = edc.Resolution(tol);
-  Cv = BRep_Tool::Curve(E, First, Last);
-  urefdeb = Spine->FirstParameter(IF);
-  checkdeb = (nwf > urefdeb);
-  if(checkdeb) {
-    Spine->Parameter(IF,nwf,pared,0);
-  }
-  //
+  Handle(Geom_Curve) Cv = BRep_Tool::Curve(E, First, Last);
+  Standard_Real urefdeb = Spine->FirstParameter(IF);
+  Standard_Boolean checkdeb = (nwf > urefdeb),cepadur = 0;
+  if(checkdeb) Spine->Parameter(IF,nwf,pared,0);
   if(E.Orientation() == TopAbs_REVERSED) {
     Standard_Real sov = First;
     First = Cv->ReversedParameter(Last);
     Last = Cv->ReversedParameter(sov);
-    if(checkdeb) {
-      pared = Cv->ReversedParameter(pared);
-    }
-    else{
-      pared = First;
-    }
-    if(First < pared) {
-      First = pared; 
-    }
+    if(checkdeb) pared = Cv->ReversedParameter(pared);
+    else pared = First;
+    if(First < pared) First = pared; 
     if(IL == IF) {
       Standard_Real ureffin = Spine->LastParameter(IL);
       Standard_Boolean checkfin = (nwl < ureffin);
        Spine->Parameter(IL,nwl,pared,0);
        pared = Cv->ReversedParameter(pared);
       }
-      else {
-       pared = Last;
-      }
-      if(pared < Last) {
-       Last = pared; 
-      }
+      else pared = Last;
+      if(pared < Last) Last = pared; 
     }
     Cv = Cv->Reversed();
-  }//if(E.Orientation() == TopAbs_REVERSED) 
-  else {//#1
-    if(!checkdeb) {
-      pared = First;
-    }
-    if(First < pared) {
-      First = pared; 
-    }
+  }
+  else{
+    if(!checkdeb) pared = First;
+    if(First < pared) First = pared; 
     if(IL == IF) {
       Standard_Real ureffin = Spine->LastParameter(IL);
       Standard_Boolean checkfin = (nwl < ureffin);
-      if(checkfin) {
-       Spine->Parameter(IL,nwl,pared,0);
-      }
-      else {
-       pared = Last;
-      }
-      if(pared < Last) {
-       Last = pared; 
-      }
+      if(checkfin) Spine->Parameter(IL,nwl,pared,0);
+      else pared = Last;
+      if(pared < Last) Last = pared; 
     }
-  }// else {//#1
-  //
-  if(Abs(Last-First) < tolpared) {
-    cepadur = 1;
   }
-  //
-  //Petite veru pour les cas ou un KPart a bouffe l arete
-  //sans parvenir a terminer. On tire une droite.
+
+  if(Abs(Last-First) < tolpared) cepadur = 1;
+
+  //In case when KPart consumes an edge
+  //and cannot stop. A line is drawn.
   if(cepadur) {
     Handle(Geom_Line) L;
     gp_Pnt ptemp; gp_Vec vtemp;
       L = new Geom_Line(olin,d);
       ES.SetCurve(L);
     }
-    return;// => 
+#ifdef DRAW
+    ChFi3d_SettraceDRAWSPINE(1);
+    if (ChFi3d_GettraceDRAWSPINE()) {
+//      POP for NT
+//      char name[100];
+      char* name = new char[100];
+      sprintf(name,"elspine_%d",NbSp++);
+      Handle(Geom_Curve) bid = new Geom_TrimmedCurve(L,WF,WL);
+      DrawTrSurf::Set(name,bid);
+    }
+#endif
+    return;
   }
-  //
-  TC = new (Geom_TrimmedCurve)(Cv, First, Last);
-  BS=GeomConvert::CurveToBSplineCurve(TC);
+  Handle(Geom_BoundedCurve) TC = new (Geom_TrimmedCurve)(Cv, First, Last);
+  Handle(Geom_BSplineCurve) BS;
+  BS = GeomConvert::CurveToBSplineCurve(TC);
   CurveCleaner(BS, Abs(WL-WF)*1.e-4, 0);
-  //
   //Smoothing of the curve
-  iToApproxByC2=0;
-  aContinuity=TC->Continuity();
-  bIsSmooth=ChFi3d_IsSmooth(TC);
-  if (aContinuity < GeomAbs_C2 && !bIsSmooth) {
-    ++iToApproxByC2;
-    BS = ChFi3d_ApproxByC2(TC);
-    TC=BS;
-  }
-  //
-  //  Concatenation des aretes suivantes
+  if (TC->Continuity() < GeomAbs_C2 && !ChFi3d_IsSmooth( TC ))
+    {
+      BS = ChFi3d_ApproxByC2( TC );
+      TC = BS;
+    }
+
+  //  Concatenation of following edges
   GeomConvert_CompCurveToBSplineCurve Concat( TC, Convert_QuasiAngular );
-  //
   Eold = E;
-  for (IEdge=IF+1; IEdge<=IL; ++IEdge) {
+  
+  for (IEdge=IF+1; IEdge<=IL; IEdge++) {
     Standard_Integer iloc = IEdge;
-    if(periodic) {
-      iloc = (IEdge - 1)%nbed + 1;
-    }
-    //
+    if(periodic) iloc = (IEdge - 1)%nbed + 1;
     E = Spine->Edges(iloc);
-    if (BRep_Tool::Degenerated(E)) {
-      continue;
-    }
-    //  
-    epsV = tol;
-    Bof = TopExp::CommonVertex(Eold, E, V);
-    if (Bof) {
-      epsV = BRep_Tool::Tolerance(V);
-    }
-    //
-    Bof = BRepLib::BuildCurve3d(E);
-    if (!Bof) {
-      Standard_ConstructionError::Raise("PerformElSpine : BuildCurve3d error");
-    }
-    //
-    Cv = BRep_Tool::Curve(E, First, Last);
-    if(IEdge == IL) {
-      Standard_Real ureffin = Spine->LastParameter(iloc);
-      Standard_Boolean checkfin = (nwl < ureffin);
-      if(checkfin) {
-       Spine->Parameter(iloc,nwl,pared,0);
-      }
-      else {
-       pared = Last;
-      }
-      if(E.Orientation() == TopAbs_REVERSED) {
-       Standard_Real sov = First;
-       First = Cv->ReversedParameter(Last);
-       Last = Cv->ReversedParameter(sov);
-       if(checkfin) {
-         pared = Cv->ReversedParameter(pared);
+    if (! BRep_Tool::Degenerated(E)) {
+      Bof = TopExp::CommonVertex(Eold, E, V);
+      if (Bof) {epsV = BRep_Tool::Tolerance(V);}
+      else {epsV = tol;}
+      Bof = BRepLib::BuildCurve3d(E);
+      if (!Bof) {Standard_ConstructionError::
+                  Raise("PerformElSpine : BuildCurve3d error");}
+      Cv = BRep_Tool::Curve(E, First, Last);
+      if(IEdge == IL) {
+       Standard_Real ureffin = Spine->LastParameter(iloc);
+       Standard_Boolean checkfin = (nwl < ureffin);
+       if(checkfin) Spine->Parameter(iloc,nwl,pared,0);
+       else pared = Last;
+       if(E.Orientation() == TopAbs_REVERSED) {
+         Standard_Real sov = First;
+         First = Cv->ReversedParameter(Last);
+         Last = Cv->ReversedParameter(sov);
+         if(checkfin) pared = Cv->ReversedParameter(pared);
+         else pared = Last;
+         Cv = Cv->Reversed();
        }
-       else{
-         pared = Last;
-       }
-       Cv = Cv->Reversed();
+       if(pared < Last) Last = pared; 
       }
-      if(pared < Last) {
-       Last = pared; 
+      TC = new (Geom_TrimmedCurve)(Cv, First, Last);
+      BS = GeomConvert::CurveToBSplineCurve(TC);
+      CurveCleaner(BS, Abs(WL-WF)*1.e-4, 0);
+      //Smoothing of the curve
+      if (TC->Continuity() < GeomAbs_C2 && !ChFi3d_IsSmooth( TC ))
+       {
+         BS = ChFi3d_ApproxByC2( TC );
+         TC = BS;
+       }
+      Standard_Real tolrac = Min(tol,epsV);
+      Bof = Concat.Add( TC, 2*tolrac, Standard_True );
+      // if the adding does not go well, it is attempted to increase the tolerance
+      if (!Bof) {
+       Bof = Concat.Add( TC, 2*epsV, Standard_True );
       }
-    }
-    //
-    TC = new (Geom_TrimmedCurve)(Cv, First, Last);
-    BS = GeomConvert::CurveToBSplineCurve(TC);
-    CurveCleaner(BS, Abs(WL-WF)*1.e-4, 0);
-    //
-    //Smoothing of the curve
-    aContinuity=TC->Continuity();
-    bIsSmooth=ChFi3d_IsSmooth(TC);
-    if (aContinuity < GeomAbs_C2 && !bIsSmooth) {
-      ++iToApproxByC2;
-      BS = ChFi3d_ApproxByC2( TC );
-      TC = BS;
-    }
-    //
-    tolrac = Min(tol, epsV);
-    Bof = Concat.Add( TC, 2.*tolrac, Standard_True );
-    // si l'ajout ne s'est pas bien passe on essai d'augmenter la tolerance
-    if (!Bof) {
-      Bof = Concat.Add( TC, 2.*epsV, Standard_True );
-    }
-    if (!Bof) {
-      Bof = Concat.Add( TC, 200.*epsV, Standard_True );
       if (!Bof) {
-       Standard_ConstructionError::Raise("PerformElSpine: spine merged error");
-       }
+       Bof = Concat.Add( TC, 200*epsV, Standard_True );
+#ifdef DEB
+       cout << "Tolerance of chain is not respected" << endl;
+#endif
+       if (!Bof) {Standard_ConstructionError::
+                    Raise("PerformElSpine: spine merged error");}
+      }
     }
     Eold = E;
-  }// for (IEdge=IF+1; IEdge<=IL; ++IEdge) {
-  //
-  // On a la portion d elspine calculee sans prolongements sur la partie 
-  // valide des aretes du chemin.
+  }
+  
+  // The portion of elspine is calculated without extension  
+  // on the valid part of edges of the path.
   BSpline = Concat.BSplineCurve();
-  // On reparametre ici pour coller au mieux a l abscisse des aretes.
+  // There is a reparametrisation to maximally connect the abscissas of edges.
   TColStd_Array1OfReal BSNoeuds (1, BSpline->NbKnots());
   BSpline->Knots(BSNoeuds);
   BSplCLib::Reparametrize (Wrefdeb, Wreffin, BSNoeuds);
   BSpline->SetKnots(BSNoeuds);
-  //
-  // Traitement des Extremites
-  Standard_Integer caredeb, carefin;
-  Standard_Real LocalWL, LocalWF, Angle;
+
+  // Processing of Extremities
+  Standard_Real LocalWL = WL;
+  Standard_Real LocalWF = WF; 
   GeomAdaptor_Curve gacurve;
+  Standard_Integer caredeb = 0, carefin = 0;
   Handle(Geom_BSplineCurve) newc;
-  //
-  caredeb = 0;
-  carefin = 0;
-  Angle = PI*0.75;
-  LocalWL = WL;
-  LocalWF = WF;
+  Standard_Real Angle = PI*0.75;
   if (!ES.IsPeriodic() && !PDeb.IsEqual(BSpline->Pole(1), tol) ) {
-    // Prolongement C3 au debut
-    // afin d'eviter des pts d'inflexions dans la partie utile de la
-    // spine le prolongement se fait jusqu'a un point eloigne.
-    if(BSpline->IsRational()) {
-      caredeb = 1;
-    }
-    //
+    // Extension of C3 at the beginning
+    // to avoid inflexion points in the useful part of the 
+    // spine the extension is done till the distant point.
+    if(BSpline->IsRational()) caredeb = 1;
     Standard_Real rabdist = Wrefdeb - WF;
     Bout = PDeb.Translated(-20*rabdist * VrefDeb);
     Standard_Boolean goodext = 0;
        goodext = GoodExt(newc,VrefDeb,Wrefdeb,WF,Angle);
       }
     }
-    if(caredeb) {
-      caredeb = newc->NbKnots() - BSpline->NbKnots();
-    }
+    if(caredeb) caredeb = newc->NbKnots() - BSpline->NbKnots();
     BSpline = newc;
     LocalWF = BSpline->FirstParameter();
   }
-  //
+  
   if (!ES.IsPeriodic() && !PFin.IsEqual(BSpline->Pole(BSpline->NbPoles()), tol) ) {
-    // Prolongement C3 en fin
-    if(BSpline->IsRational()) {
-      carefin = 1;
-    }
+    // Extension of C3 at the end
+    if(BSpline->IsRational()) carefin = 1;
     Standard_Real rabdist = WL - Wreffin;
     Bout = PFin.Translated(20*rabdist * VrefFin);
     Standard_Boolean goodext = 0;
        goodext = GoodExt(newc, VrefFin, Wreffin,WL,Angle);
       }
     }
-    if(carefin) {
-      carefin = newc->NbKnots() - BSpline->NbKnots();
-    }
+    if(carefin) carefin = newc->NbKnots() - BSpline->NbKnots();
     BSpline = newc;
     LocalWL = BSpline->LastParameter(); 
   }
-  //
-  //Reparametrisation et segmentation sur le domaine de la Spine.
-  if(Abs(BSpline->FirstParameter() - WF)<tol) {
-    WF = BSpline->FirstParameter();
-  }
-  if(Abs(BSpline->LastParameter() - WL)<tol) {
-    WL = BSpline->LastParameter();
-  }
-  //
-  if ( (LocalWF<WF) ||  (LocalWL>WL)) {   // pour eviter des pb avec segment!
+  
+  //Reparametrization and segmentation on the domain of the Spine.
+  if(Abs(BSpline->FirstParameter() - WF)<tol) WF = BSpline->FirstParameter();
+  if(Abs(BSpline->LastParameter() - WL)<tol) WL = BSpline->LastParameter();
+  if ( (LocalWF<WF) ||  (LocalWL>WL)) {   // to avoid problems with segment!
     BSpline->Segment(WF, WL);
     ES.FirstParameter(WF);
     ES.LastParameter(WL);
   }
-  //
   if (BSpline->IsRational()) {
     Handle(Geom_BSplineCurve) C1;
     C1 =  Handle(Geom_BSplineCurve)::DownCast(BSpline->Copy());
     GeomConvert::C0BSplineToC1BSplineCurve(C1, tol, 0.1);
-    // Il faut s'assurer que l'origine n'a pas bouge (cts21158)
-    if (C1->FirstParameter() == BSpline->FirstParameter()) {
-      BSpline = C1;
-    }
+    // It is necessary to make sure that the origin didn't move (cts21158)
+    if (C1->FirstParameter() == BSpline->FirstParameter()) BSpline = C1;
     else {
-      //cout << "Attention : Echec de C0BSplineToC1 !" << endl;
+#if DEB
+      cout << "Attention : Fail of C0BSplineToC1 !" << endl;
+#endif
     }
   }
-  //
-  Standard_Integer fk, lk, MultMax, ii;
-  // Deformation eventuelle pour rendre la spine C2.
-  // ou C3 pour des approx C2
-  if((caredeb || carefin) && BSpline->Degree() < 8) {
-    BSpline->IncreaseDegree(8);
-  }
-  //
-  fk = 2;
-  lk = BSpline->NbKnots()-1;
-  if(BSpline->IsPeriodic()) {
-    fk = 1;
-  }
-  if(caredeb) {
-    fk += caredeb;
-  }
-  if(carefin) {
-    lk -= carefin;
-  }
-  //
+  
+  // Deformation eventual to render spine C2
+  // or C3 for approx C2
+  if((caredeb || carefin) && BSpline->Degree() < 8) BSpline->IncreaseDegree(8);
+  Standard_Integer fk = 2, lk = BSpline->NbKnots()-1;
+  if(BSpline->IsPeriodic()) fk = 1;
+  if(caredeb) fk += caredeb;
+  if(carefin) lk -= carefin;
+  Standard_Integer   MultMax, ii; 
   if (continuity == GeomAbs_C3) {
-    if (BSpline->Degree() < 7) {
-      BSpline->IncreaseDegree(7);
-    }
+    if (BSpline->Degree() < 7) BSpline->IncreaseDegree(7);
     MultMax = BSpline->Degree() - 3;
   }
   else {
-    if (BSpline->Degree() < 5) {
-      BSpline->IncreaseDegree(5);
-    }
+    if (BSpline->Degree() < 5) BSpline->IncreaseDegree(5);
     MultMax = BSpline->Degree() - 2;
   }
-  // correction C2 ou C3 (si possible)
+  // correction C2 or C3 (if possible)
   CurveCleaner(BSpline, Abs(WL-WF)*1.e-4, 1);
   CurveCleaner(BSpline, Abs(WL-WF)*1.e-2, MultMax);
   Standard_Integer MultMin = Max(BSpline->Degree() - 4, 1);
     if( BSpline->Multiplicity(ii) > MultMax ) {
       Bof = BSpline->RemoveKnot(ii, MultMax, Abs(WL-WF)/10);
     }
-    // Voir C4
+    // See C4
     if( BSpline->Multiplicity(ii) > MultMin ) {
       Bof = BSpline->RemoveKnot(ii, MultMin, Abs(WL-WF)*1.e-4);
     }       
   }
-  // elspine periodique => BSpline Periodique
+  // elspine periodic => BSpline Periodic
   if(ES.IsPeriodic()) {
     if(!BSpline->IsPeriodic()) {
       BSpline->SetPeriodic();
-      //modified by NIZNHY-PKV Fri Dec 10 12:20:22 2010ft
-      if (iToApproxByC2) {
-       Bof = BSpline->RemoveKnot(1, MultMax, Abs(WL-WF)/10);
-      }
-      //Bof = BSpline->RemoveKnot(1, MultMax, Abs(WL-WF)/10);
-      //modified by NIZNHY-PKV Mon Dec 13 14:12:54 2010t
+      Bof = BSpline->RemoveKnot(1, MultMax, Abs(WL-WF)/10);
     }
   }
   else { 
-    // Sinon faut il bouger les poles pour les adapter 
-    // aux nouvelles tangentes ?
+    // Otherwise is it necessary to move the poles to adapt 
+    // them to new tangents ?
     Standard_Boolean adjust = Standard_False; 
     gp_Pnt P1, P2;
     gp_Vec V1, V2;
     ES.FirstPointAndTgt(PDeb,VrefDeb);
     Standard_Real scaldeb = VrefDeb.Dot(V1);
     Standard_Real disdeb = PDeb.Distance(P1);
-    if((Abs(WF-LocalWF) < 1.e-12) && 
-       ((scaldeb <= 0.9999999) || disdeb >= tol)) {   
-      // Oui s'il n'y as pas eu de prolongement et que la tangente n'est pas
-      // la bonne.
+    if((Abs(WF-LocalWF) < 1.e-12) &&
+       ((scaldeb <= 0.9999999) ||
+       disdeb >= tol)) {   
+      // Yes if there was no extension and the tangent is not the good one.
       adjust = Standard_True;
     } 
     BSpline->D1(WL, P2, V2);
     Standard_Real scalfin = VrefFin.Dot(V2); 
     Standard_Real disfin = PFin.Distance(P2);
     if((Abs(WL-LocalWL) < 1.e-12) && 
-       ((scalfin <= 0.9999999) || disfin >= tol)) {
-      // de meme a la fin
+       ((scalfin <= 0.9999999)||
+       disfin >= tol)) {
+      // the same at the end
       adjust = Standard_True;
     }
-    if(adjust) {
-      GeomLib::AdjustExtremity(BSpline, PDeb, PFin, VrefDeb, VrefFin);
-    }
+    if(adjust) GeomLib::AdjustExtremity(BSpline, PDeb, PFin, VrefDeb, VrefFin);
   }
 
-  // Le Resultat       
+  // The result       
+#if DEB
+  if (! BSpline->IsCN(2)) cout << "Attention Spine non C2 !" << endl;
+#endif
+
   ES.SetCurve(BSpline);
+#ifdef DRAW
+  ChFi3d_SettraceDRAWSPINE(1);
+  if (ChFi3d_GettraceDRAWSPINE()) {
+    char name[100];
+    sprintf(name,"elspine_%d",NbSp++);
+    char* Temp = name;
+    DrawTrSurf::Set(Temp,BSpline);
+//    DrawTrSurf::Set(name,BSpline);
+  }
+#endif
 }
 
 //=======================================================================
 //function : cherche_face1
-//purpose  : cherche la face F differente de F1 dans la map.
-// La map  contient  les deux faces adjacentes a une edge 
+//purpose  : find face F different from F1 in the map.
+// The map contains two faces adjacent to an edge 
 //=======================================================================
 void ChFi3d_cherche_face1 (const TopTools_ListOfShape & map,
                           const TopoDS_Face & F1,
 } 
 //=======================================================================
 //function : cherche_element
-//purpose  : cherche l'edge E  de F1 differente de E1 et contenant le vertex V
-// Vtx est l'autre vertex de E 
+//purpose  : find edge E of F1 other than E1 and containing vertex V
+// Vtx is the other vertex of E 
 //=======================================================================
+
 void ChFi3d_cherche_element(const TopoDS_Vertex & V,
                            const TopoDS_Edge & E1,
                            const TopoDS_Face & F1,
 } 
 //=======================================================================
 //function : cherche_edge
-//purpose  : cherche l'edge E  de F1 differente de la liste d'edges E1 et
-//            contenant le vertex V  Vtx est l'autre vertex de E 
+//purpose  : find edge E of F1 other than the list of edges E1 and
+//           containing vertex V  Vtx is the other vertex of E. 
 //=======================================================================
+ 
 void ChFi3d_cherche_edge(const TopoDS_Vertex & V,
                            const  TopTools_Array1OfShape & E1,
                            const TopoDS_Face & F1,
 
 //=======================================================================
 //function : nbface
-//purpose  : calcule le nombre de faces communes a un vertex
+//purpose  : calculates the number of faces common to a vertex
 //           
 //=======================================================================
 Standard_Integer  ChFi3d_nbface (const TopTools_ListOfShape & mapVF )
 
 //=======================================================================
 //function : edge_common_faces 
-//purpose  :  determine les deux faces partageant une edge.
-//            F1 =F2 si on a une arete de couure 
+//purpose  :  determines two faces sharing an edge.
+//            F1 = F2 if there is an edge to parce 
 //=======================================================================
+
 void ChFi3d_edge_common_faces (const TopTools_ListOfShape & mapEF,
                                TopoDS_Face & F1,
                                TopoDS_Face &  F2)   
 }
 
 /***********************************************************/
-// donne l'angle entre les edges E1 et E2 . Vtx est le vertex
-// commun aux edges
+// gives the angle between edges E1 and E2 . Vtx is the 
+// vertex common to the edges
 /************************************************************/
 Standard_Real ChFi3d_AngleEdge (const TopoDS_Vertex & Vtx,
                                   const TopoDS_Edge&  E1,
 
 //==================================================================
 // ChercheBordsLibres
-// determine si le vertex V1 a des aretes de bords libres
-// edgelibre1 et edgelibre2 .
-// On suppose qu'un sommet ne peut avoir que 2 aretes de bords libres
+// determines if vertex V1 has edges on free borders 
+// edgelibre1 and edgelibre2 .
+// It is supposed that a top can have only 2 edges on free borders
 //===================================================================
 void ChFi3d_ChercheBordsLibres(const  ChFiDS_Map & myVEMap,
                               const TopoDS_Vertex & V1,
 
 //=======================================================================
 //function : NbNotDegeneratedEdges
-//purpose  : calcule le nb d'aretes non degenerees de la Map VEMap(Vtx)
-// Attention les aretes de jointures sont comptees deux fois
+//purpose  : calculate the number of non-degenerated edges of Map VEMap(Vtx)
+// Attention the edges of junctions are taken into account twice
 //=======================================================================
 Standard_Integer ChFi3d_NbNotDegeneratedEdges (const TopoDS_Vertex& Vtx,
                                      const ChFiDS_Map& VEMap)
 
 //=======================================================================
 //function : NumberOfEdges
-//purpose  : calcule le nombre d'aretes arrivant au sommet Vtx
-// les aretes degenerees ne sont pas comptees. 
+//purpose  : calculate the number of edges arriving to the top Vtx
+// degenerated edges are not taken into account. 
 //=======================================================================
 Standard_Integer ChFi3d_NumberOfEdges(const TopoDS_Vertex& Vtx,
                                      const ChFiDS_Map& VEMap)
   else  nba=nba/2;
   return nba;
 }
-//=======================================================================
-//function : ChFi3d_cherche_vertex
-//purpose  : function cherche_vertex
-//           cherche le vertex commun entre deux edges 
-//=======================================================================
+//=====================================================
+// function cherche_vertex
+// finds common vertex between two edges 
+//=====================================================
+
 void ChFi3d_cherche_vertex (const TopoDS_Edge & E1,
                            const TopoDS_Edge & E2,
                            TopoDS_Vertex & vertex,
     }
   }
 }      
-//=======================================================================
-//function : ChFi3d_Couture
-//purpose  : determine si F a une arete de couture
-//=======================================================================
+//============================================================
+// determines if F has an edge of sewing
+//=============================================================
 void ChFi3d_Couture( const TopoDS_Face & F,
                      Standard_Boolean & couture,
                      TopoDS_Edge & edgecouture)
     }
 }
 
-//=======================================================================
-//function : ChFi3d_CoutureOnVertex
-//purpose  : 
-//=======================================================================
 void ChFi3d_CoutureOnVertex( const TopoDS_Face & F,
                             const TopoDS_Vertex & V,
                             Standard_Boolean & couture,
       } 
     }
 }
-//=======================================================================
-//function : ChFi3d_IsPseudoSeam
-//purpose  : 
-//=======================================================================
+
 Standard_Boolean ChFi3d_IsPseudoSeam( const TopoDS_Edge& E,
-                                    const TopoDS_Face& F )
+                                     const TopoDS_Face& F )
 {
   if (! BRep_Tool::IsClosed( E, F ))
     return Standard_False;
   return NeighborSeamFound;
 }
 
-//=======================================================================
-//function : ChFi3d_ApproxByC2
-//purpose  : 
-//=======================================================================
 Handle(Geom_BSplineCurve) ChFi3d_ApproxByC2( const Handle(Geom_Curve)& C )
 {
   Standard_Real First = C->FirstParameter(), Last = C->LastParameter();
   Handle(Geom_BSplineCurve) BS = Approx.Curve();
   return BS;
 }
-//=======================================================================
-//function : ChFi3d_IsSmooth
-//purpose  : 
-//=======================================================================
+
 Standard_Boolean ChFi3d_IsSmooth( const Handle(Geom_Curve)& C )
 {
   GeomAdaptor_Curve GAC( C );
   gp_Pnt P1, P2;
   Standard_Integer Discretisation = 30;
   
+//   Standard_Real t = TI(1);
+//   LProp.SetParameter(t);
+//   if (!LProp.IsTangentDefined())
+//     return Standard_False;
+//   C->D0(t, P1);
+//   LProp.CentreOfCurvature(P2);
+//   gp_Vec PrevVec(P1, P2);
+
   gp_Vec PrevVec;
   Standard_Boolean prevVecFound = Standard_False;
   Standard_Integer intrvFound = 0;
 
 
 //=======================================================================
 //function : ChFi3d_FaceTangency
-//purpose  : determiner si les faces en vis a vis des edges sont tangents
-//           pour aller des faces en vis a vis sur e0 vers les faces en vis
-//a vis sur e1 ,considerer l ensemble des faces partant du sommet commun
+//purpose  : determine if the faces opposing to edges are tangent
+//           to go from opposing faces on e0 to opposing faces 
+//           on e1, consider all faces starting at a common top.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::FaceTangency(const TopoDS_Edge& E0,
   Standard_Integer Nbf;
   TopoDS_Face F[2];
 
-  //On verifie qu on ne chaine pas sur une arete de regularite.
+  //It is checked if the connection is not on a regular edge.
   for (It.Initialize(myEFMap(E1)), Nbf= 0 ;It.More();It.Next(), Nbf++) {
     if (Nbf>1) 
       Standard_ConstructionError::Raise("ChFi3d_Builder:only 2 faces");
 
 //=======================================================================
 //function : TangentExtremity
-//purpose  : Test si 2 face sont tangentes en bout d'une edge
+//purpose  : Test if 2 faces are tangent at the end of an edge
 //=======================================================================
 static Standard_Boolean TangentExtremity(const TopoDS_Vertex&                V,
                                         const TopoDS_Edge&                  E,
     n1.SetXYZ(theProp1.Normal().XYZ());
     if (O1 == TopAbs_REVERSED) n1.Reverse();
   }
-  else return Standard_False; // On ne sait pas ...
+  else return Standard_False; // It is not known...
 
  
   Handle(Geom2d_Curve) pc2 = BRep_Tool::CurveOnSurface(e2,f2,f,l);
     n2.SetXYZ(theProp2.Normal().XYZ());
     if(O2 == TopAbs_REVERSED) n2.Reverse();
   }
-  else return Standard_False; // On ne sait pas ...
+  else return Standard_False; //  It is not known...
 
   return (n1.Angle(n2) < tang);
 }
 
 //=======================================================================
 //function : TangentOnVertex
-//purpose  : Test si les faces support d'une edge sont tangente en bout.
+//purpose  : Test if support faces of an edge are tangent at end.
 //=======================================================================
 static Standard_Boolean TangentOnVertex(const TopoDS_Vertex&    V,
                                        const TopoDS_Edge&      E,
 
 //=======================================================================
 //function : PerformExtremity
-//purpose  : Dans le cas ou PerformElement a renvoye BreakPoint 
-//           a l une ou l autre des extremites, on essaye de raffiner
-//           en fonction des concavite entres les faces voisines du 
-//           sommet.
+//purpose  : In case if PerformElement returned BreakPoint at one or  
+//           another extremity, it is attempted to refine 
+//           depending on concavities between neighbour faces of the top.
 //=======================================================================
 
 void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine) 
       E[0] = Spine->Edges(iedge);
       V = Spine->LastVertex();
     }
-    //On verifie avant tout que l on ne meurt pas en tangence.
+    //Before all it is checked if the tangency is not dead.
     E[0] = Spine->Edges(iedge);
     ConexFaces (Spine,iedge,0,hs1,hs2);
     if(TangentExtremity(V,E[0],hs1,hs2,angular)){
          }
          else{
 #ifdef DEB
-           cout<<"sommet a plus de 3 aretes"<<endl;
+           cout<<"top has more than 3 edges"<<endl;
 #endif
            sommetpourri = Standard_True;
            break;
     }
   }
   
-  //petite verue pour debug avec MPS.
   if (!Spine->IsPeriodic()) {
     TopTools_ListIteratorOfListOfShape It,Jt;
     Standard_Integer nbf = 0, jf = 0;
     if(nbf>3) {
       Spine->SetFirstStatus(ChFiDS_BreakPoint);
 #if DEB
-      cout<<"sommet a : "<<nbf<<" faces."<<endl;
+      cout<<"top has : "<<nbf<<" faces."<<endl;
 #endif
     }
     nbf = 0, jf = 0;
     if(nbf>3) {
       Spine->SetLastStatus(ChFiDS_BreakPoint);
 #if DEB
-      cout<<"sommet a : "<<nbf<<" faces."<<endl;
+      cout<<"top has : "<<nbf<<" faces."<<endl;
 #endif
     }
   }
 
 //=======================================================================
 //function : PerformElement
-//purpose  :  rechercher l ensemble des edges tangents entre eux ;
-// Chaque edge retenu a 2 faces en vis
-// a vis pour 2 edges adjacents tangents il faut que les faces en vis a vis 
-// soient tangentes
+//purpose  :  find all mutually tangent edges ;
+// Each edge has 2 opposing faces. For 2 adjacent tangent edges it is required that 
+// the opposing faces were tangent.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::PerformElement(const Handle(ChFiDS_Spine)& Spine) 
   TopoDS_Vertex Ve1,VStart,FVEc,LVEc,FVEv,LVEv;
   TopoDS_Edge Ev,Ec(Spine->Edges(1));
   if(BRep_Tool::Degenerated(Ec)) return 0;
-  //on controle que l arete est bien une arete de cassure
+  //it is checked if the edge is a cut edge
   TopoDS_Face ff1,ff2;
   ChFi3d_conexfaces(Ec,ff1,ff2,myEFMap);
   if(ff1.IsNull() || ff2.IsNull()) return 0;
 #else
   ChFiDS_State CurSt;
 #endif
-  if (VStart.IsSame(LVEc)) {//cas ou un seul edge ferme
+  if (VStart.IsSame(LVEc)) {//case if only one edge is closed
     CEc.Initialize(Ec);
     Wl = BRep_Tool::Parameter(VStart,Ec);
     CEc.D1(Wl,P2,V1);
     Spine->SetLastStatus(CurSt);
     Spine->SetFirstStatus(CurSt);
   }
-  else { // Progression aval
+  else { // Downstream progression
     FVEc = VStart;
     TopAbs_Orientation Or1;
     while (!Fini) {
          Standard_Boolean rev = (Or1 != curor);    
          Standard_Boolean OnAjoute = Standard_False;
          if (FaceTangency(Ec,Ev,FVEv)) {
-           //il n'y a pas besoin  de tolerance
-           // pour se decider (PRO9486) la regularite suffit.
-            // On verifie quand meme le non rebrousement (PRO9810)
+           // there is no need of tolerance
+           // to make a decision (PRO9486) the regularity is enough.
+            // However, the abcense of turn-back is checked (PRO9810)
            OnAjoute = ((!rev && av1v2 < PI/2) 
                        ||(rev && av1v2 > PI/2));
-            // Il faut faire Attention au cas singulier (cf CTS21610_1)
+            // mate attention to the single case (cf CTS21610_1)
             if (OnAjoute && (degeneOnEc || 
                 TangentOnVertex(LVEc, Ev,myEFMap, ta)) )
              OnAjoute=((!rev && av1v2 < ta) || (rev && (PI - av1v2) < ta));
          }
          if (OnAjoute) {
-           Fini = Standard_False; // Si Si cela peut etre util (Cf PRO14713)
+           Fini = Standard_False; // If this can be useful (Cf PRO14713)
            Ec = Ev; 
 //         Ec = TopoDS::Edge(Ev); 
            Ec.Orientation(Or1);
                 Nbface++) {}
            if (Nbface> 1) CurSt = ChFiDS_BreakPoint;
            Fini = ((!rev && av1v2 < ta) || (rev && (PI - av1v2) < ta)); 
-           //attention dans le cas ou sur un vertex il part 3 edges dont l edge courant
-           //+un edge bord libre et un edge cassure le status sera au pif 
          }
        } 
       } 
     if (CurSt == ChFiDS_Closed) {
       Spine->SetFirstStatus(CurSt);
     }
-    else {// Progression amont
+    else {// Upstream progression
       Fini = Standard_False;
       Ec = Spine->Edges(1);
       curor = Ec.Orientation();
                  Nbface++) {}
              if (Nbface> 1) CurSt = ChFiDS_BreakPoint;
              Fini = ((!rev && av1v2 < ta) || (rev && (PI - av1v2) < ta));
-             //attention dans le cas ou sur un vertex il part 3 edges dont l edge courant
-             //+un edge bord libre et un edge cassure le status sera au pif 
            }
          } 
        } 
 
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:08:19 2001 End
 
 //===================================================================
-//   Finition par un plan   
+//   Definition by a plane   
 //
-// On considere P1 et P2 les points associes aux commonpoints compoint1 et
-// compoint2 ainsi que  E1 et E2 les edges  qui contiennent P1 et P2.
-// On determine (s'il existe) le plan contenant les 
-// trois directions D12 T1 T2  ou  D12 represente la direction formee 
+// It is considered that P1 and P2 are points associated to commonpoints compoint1 and
+// compoint2, while E1 and E2 are edges containing P1 and P2.
+// The plane containing three directions D12 T1 T2  ou  D12 represente la direction formee 
 // par les points P1 et P2, T1 la tangente de E1 en P1 et T2 la tangente de 
-// E2 en P2. 
-// On fait ensuite l'intersection du conge HConge par ce plan 
-// pour determiner la courbe 3d C3d et la courbe 2d associee 
+// E2 en P2 is found (if exists). 
+// Then fillet HConge is intersected by this plane 
+// to find associated curve 3d C3d and the curve 2d. 
 // 
 //====================================================================
 static void ChFi3d_CoupeParPlan (const ChFiDS_CommonPoint & compoint1,
 
 //=======================================================================
 //function : Projection
-//purpose  : Projete un point sur une courbe
+//purpose  : Projects a point on a curve
 //=======================================================================
 
 static Standard_Boolean Projection(Extrema_ExtPC&       PExt, 
   Standard_Real Dist2, daux2;
   Dist2 =  C.Value(W).SquareDistance(P);
 
-  // On verifie que ce n'est pas dejas solution
+  // It is checked if it is not already a solution
   if (Dist2 < Tol * Tol) 
     return Standard_True;
 
     }  
   }
   
-  // Resolution global
+  // Global resolution
   PExt.Perform(P);
   if ( PExt.IsDone() ) {
     for (Standard_Integer ii=1; ii<= PExt.NbExt(); ii++) {
 
 //=======================================================================
 //function : IsInput
-//purpose  : Verifie si un vecteur "entre dans une Face
+//purpose  : Checks if a vector belongs to a Face
 //=======================================================================
 
 Standard_Boolean IsInput(const gp_Vec&          Vec,
   gp_Vec Vec3d[2];
   gp_Pnt Point;
 
-  // Recherche des aretes et calcul des vecteurs 3d
+  // Find edges and compute 3D vectors
   for ( ; (FaceExp.More() && (Trouve<2)); FaceExp.Next()) {
     W = TopoDS::Wire(FaceExp.Current());
     for (Trouve=0, WireExp.Init(W) ; 
     }
   }
   if (Trouve < 2) return Standard_False;
-  // Calcul de la normal et des angles dans le plan vectoriel asssocie
+  // Calculate the normal and the angles in the asssociated vector plane
   gp_Vec Normal;
   Normal = Vec3d[0] ^ Vec3d[1];
-  if (Normal.SquareMagnitude() < Precision::Confusion()) {//Cas colineaire
+  if (Normal.SquareMagnitude() < Precision::Confusion()) {//Colinear case
     return (Vec.IsParallel(Vec3d[0],Precision::Confusion())); 
   }
 
   }
   else amin = 0;
 
-  // Projection du vecteur
+  // Projection of the vector
   gp_Ax3 Axe(Point, Normal, Vec3d[0]);  
   gp_Trsf Transf;
   Transf.SetTransformation (Axe);
   Transf.Transforms(coord);
   gp_Vec theProj(coord); 
 
-  // et enfin ...
+  // and finally...
   Standard_Real Angle = theProj.AngleWithRef(Vec3d[0], Normal);
   return ( (Angle >= amin) && (Angle<=amax));
 } 
 
 //=======================================================================
 //function : IsG1
-//purpose  : Cherche un voisin G1 par une arrete
+//purpose  : Find a neighbor G1 by an edge
 //=======================================================================
 
 Standard_Boolean IsG1(const ChFiDS_Map&         TheMap,
                      TopoDS_Face&              FVoi) 
 {
   TopTools_ListIteratorOfListOfShape It;    
-  // On cherche une voisine de E differente de FRef (cas general).
+  // Find a neighbor of E different from FRef (general case).
   for(It.Initialize(TheMap(E));It.More();It.Next()) {
     if (!TopoDS::Face(It.Value()).IsSame(FRef)) {
       FVoi = TopoDS::Face(It.Value());
       }
     }
   }
-  // Si on ne l a pas trouvee on regarde si E est un edge de couture,
-  // au quel cas on renvoie FVoi = FRef (cas moins frequent).
+  // If is was not found it is checked if E is a cutting edge,
+  // in which case FVoi = FRef is returned (less frequent case).
   TopExp_Explorer Ex;
   Standard_Boolean orset = Standard_False;
 #ifndef DEB
 
 //=======================================================================
 //function : SearchFaceOnV
-//purpose  : Trouve  le(s) face(s) de sortie d'un cheminement par un vertex
-//           Les criteres a respecter sont les suivants
-//         -1 : La face partage une aretes de regularite avec FRef 
-//              (condition trop forte qu'il faudrait revoir
-//         -2 : Le vecteur sortant du CommonPoint "entre" dans la face
+//purpose  : Finds the output face(s) of the path by a vertex
+//           The following criteria should be followed
+//         -1 : The face shares regular edges with FRef 
+//              (too hard condition that should be reconsidered)
+//         -2 : The vector starting in CommonPoint "belongs" to the face
 //========================================================================
 static Standard_Integer SearchFaceOnV(const ChFiDS_CommonPoint&    Pc,
                                      const TopoDS_Face&           FRef,
                                      TopoDS_Face&                 F1,
                                      TopoDS_Face&                 F2)
 {
-  // on verifie que l'on sort bien de la face courante.
+  // it is checked that it leaves the current face.
   Standard_Boolean FindFace = IsInput(Pc.Vector(), Pc.Vertex(), FRef);
   if (FindFace) {
     FindFace = IsInput(Pc.Vector().Reversed(), Pc.Vertex(), FRef);
   }
-  // Si l'on ne sort pas, c'est fini
+  // If it does not leave, it is finished
   if (FindFace) {
     F1 = FRef;
     return 1;
 
 //=======================================================================
 //function : ChangeTransition
-//purpose  : Change la transition du second common Point, quand la surface
-//           ne traverse pas l'arc
-//           Comme on suppose que les Faces d'appuis sont les memes, il suffit
-//           de regarder le cas des aretes de coutures
+//purpose  : Changes the transition of the second common Point, when the surface
+//           does not cross the arc
+//           As it is supposed that the support Faces are the same, it is enough
+//           to examine the cas of cutting edges.
 //========================================================================
 static void ChangeTransition(const ChFiDS_CommonPoint&    Precedant,
                             ChFiDS_CommonPoint&          Courant,
   PCurve2 = BRep_Tool::CurveOnSurface(TopoDS::Edge(aLocalShape), F, f, l);
 //  PCurve2 = BRep_Tool::CurveOnSurface(TopoDS::Edge(Arc.Reversed()), F, f, l);
   if (PCurve1 != PCurve2) { 
-    // C'est une arete de couture, on doit faire un petit test Geometrique
+    // This is a cutting edge, it is necessary to make a small Geometric test
     gp_Vec tgarc;
     gp_Pnt P;
     BRepAdaptor_Curve AC(Arc);
 
 //=======================================================================
 //function : CallPerformSurf
-//purpose  : Encapsule l'appel a PerformSurf/SimulSurf
+//purpose  : Encapsulates call to PerformSurf/SimulSurf
 //========================================================================
 
 void ChFi3d_Builder::
   Handle(BRepAdaptor_HSurface) HSon1, HSon2;
   HSon1 = HS1;
   HSon2 = HS2;
-  // Definition du domaine de cheminement It1, It2
+  // Definition of the domain of path It1, It2
   It1->Initialize(HS1);
   It2->Initialize(HS2);
 
   else{
        
 #ifdef DEB  
-    ChFi3d_InitChron(ch1);//init perf  pour PerformSurf
+    ChFi3d_InitChron(ch1);//initial perform for PerformSurf
 #endif
        
     isdone = PerformSurf(SeqSD,HGuide,Spine,Choix,HS1,It1,HS2,It2,
                          First,Last,Inside,Inside,forward,
                          RecOnS1,RecOnS2,Soldep,intf,intl);
 #ifdef DEB   
-    ChFi3d_ResultChron(ch1,t_performsurf);// result perf pour   PerformSurf   
+    ChFi3d_ResultChron(ch1,t_performsurf);// result perf for PerformSurf   
 #endif
   }
 
- // Cas d'echecs
+ // Case of error
  if (!isdone) {
    First = thef;
    Last = thel;
      else{
        
 #ifdef DEB  
-       ChFi3d_InitChron(ch1);//init perf  pour PerformSurf
+       ChFi3d_InitChron(ch1);//init perf for PerformSurf
 #endif
        
        isdone = PerformSurf(SeqSD,HGuide,Spine,Choix,HSon1,It1,HSon2,It2,
                             First,Last,Inside,Inside,forward,
                             RecOnS1,RecOnS2,Soldep,intf,intl);
 #ifdef DEB   
-       ChFi3d_ResultChron(ch1,t_performsurf);// result perf pour   PerformSurf   
+       ChFi3d_ResultChron(ch1,t_performsurf);// result perf for PerformSurf   
 #endif
      }
    }
 
 //=======================================================================
 //function : StripeOrientation
-//purpose  : Calcul des orientations de reference determinant le
-//           cote concave pour la construction du conge.
+//purpose  : Calculates the reference orientation determining the
+//           concave face for construction of the fillet.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::StripeOrientations
 
 //=======================================================================
 //function : StartSol
-//purpose  : Calcul d une solution de depart approchee :
-//           - on commence par essayer une dizaine de points sur la
-//             spine,
-//           - en cas d'echec on recherche la solution dans les faces
-//             voisines; section plane des aretes de la face adjacente
-//             et identication de la face par connexite a cette arete.
+//purpose  : Calculates a starting solution :
+//           - one starts by parsing about ten points on the spine,
+//           - in case of fail one finds the solution on neighbor faces;
+//             section plane of edges of the adjacent face 
+//             and identication of the face by connection to that edge.
 //=======================================================================
 
 void ChFi3d_Builder::StartSol(const Handle(ChFiDS_Stripe)&      Stripe,
   Standard_Integer nbessaimax = 3*nbed;
   if (nbessaimax < 10) nbessaimax = 10;
   Standard_Real unsurnbessaimax = 1./nbessaimax;
-  //On bruite un peu les bouts, plus par superstition qu autre chose.
   Standard_Real wf = 0.9981 * Spine->FirstParameter(1) +
     0.0019 * Spine->LastParameter(1);
   Standard_Real wl = 0.9973 * Spine->LastParameter(nbed) +
     PC = BRep_Tool::CurveOnSurface(cured,f1forward,Uf,Ul);
     I1->Initialize(HS1);
     PC->D1(woned, P1, derive);
-    // On des points sur le bord, on cherche des point internes
+    // There are ponts on the border, and internal points are found
     if (derive.Magnitude() > Precision::PConfusion()) {
       derive.Normalized();
       derive.Rotate(PI/2);
       return;
     }
   }
-  // On a trouve aucune solution sur les faces adjacentes au trajet
-  // on essaye donc les voisines.
+  // No solution was found for the faces adjacent to the trajectory.
+  // Now one tries the neighbor faces.
   iedge = 0;
   for(nbessai = 0; nbessai <= nbessaimax; nbessai++){
     Standard_Real t = nbessai*unsurnbessaimax;
       NewF.Orientation(F.Orientation());
       pons.SetCoord(0.,0.);
       HS->ChangeSurface().Initialize(NewF);
-      return; // c'est tout bon !
+      return; // everything is good !
     }
   }
   Standard_Failure::Raise("ChFi3d_BuildPlane : echec .");
 
 //=======================================================================
 //function : StartSol
-//purpose  : La spec provisoire de StarSol est : lbo 28/03/97
-//           Si le commonpoint n est pas OnArc on renvoie la face
-//              d entree et on met a jour le point 2d,
-//           si il est OnArc
-//              si on decroche on renvoie la face d entree et on met 
-//                 a jour le point 2d,
-//              sinon
-//                 ou bien il y a une face voisine tangente et on la renvoie
-//                         avec le point 2d recalcule
-//                 ou bien il n y en a pas 
-//                         si l Arc reference Vref (extremite de la spine)
-//                            on est en bout et on renvoie la face d entree 
-//                         sinon c est un obstacle et on met a jour HC.
+//purpose  : If the commonpoint is not OnArc the input face
+//           is returned and 2D point is updated,
+//           if it is OnArc
+//              if it is detached  the input face
+//              is returned and 2D point is updated,
+//              otherwise
+//                 either there is a neighbor tangent face and it is returned
+//                         with recalculated 2D point
+//                 or if there is no face 
+//                         if the reference arc is Vref (extremity of the spine)
+//                            this is the end and the input face is returned 
+//                         otherwise this is an obstacle and HC is updated.
 //=======================================================================
 
 Standard_Boolean  
 ChFi3d_Builder::StartSol(const Handle(ChFiDS_Spine)&    Spine,
-                        Handle(BRepAdaptor_HSurface)&  HS, // Nouvelle face
-                        gp_Pnt2d&                      pons,// " Localisation
-                        Handle(BRepAdaptor_HCurve2d)&  HC, // Reprentation de l'obstacle
+                        Handle(BRepAdaptor_HSurface)&  HS, // New face
+                        gp_Pnt2d&                      pons,// " Localization
+                        Handle(BRepAdaptor_HCurve2d)&  HC, // Representation of the obstacle
                         Standard_Real&                 W,
                         const Handle(ChFiDS_SurfData)& SD,
                         const Standard_Boolean         isfirst,
                         const Standard_Integer         ons,
-                        Handle(BRepAdaptor_HSurface)&  HSref, // L'autre representation
-                        Handle(BRepAdaptor_HCurve2d)&  HCref, // de l'obstacle    
+                        Handle(BRepAdaptor_HSurface)&  HSref, // The other representation
+                        Handle(BRepAdaptor_HCurve2d)&  HCref, // of the obstacle          
                         Standard_Boolean&              RecP,
                         Standard_Boolean&              RecS,
                         Standard_Boolean&              RecRst,
                         Standard_Boolean&              c1obstacle,
-                        Handle(BRepAdaptor_HSurface)&  HSBis, // Face de secoure       
-                        gp_Pnt2d&                      PBis,  // et son point
+                        Handle(BRepAdaptor_HSurface)&  HSBis, // Face of support       
+                        gp_Pnt2d&                      PBis,  // and its point
                         const Standard_Boolean         decroch,
                         const TopoDS_Vertex&           Vref) const 
 {
     if (ons == 1)  notons = 2;
     else           notons = 1;
     const ChFiDS_CommonPoint& CPbis = SD->Vertex(isfirst,notons);
-    if (CPbis.IsOnArc()) { // On verifie que l'on est pas dans une zone 
-                  // de prolongement. Car dans ce cas CP n'est pas
-                  // au bout de la surfdata et il ne faut pas en tenir compte
-                  // sauf cas singuliers (ie pointus) ...
-      //ts et tns etaient avant CP.Parameter() et CPbis.Parameter, mais qques fois, ils n'avaient pas de valeurs.
+    if (CPbis.IsOnArc()) { // It is checked if it is not the extension zone 
+                  // In case CP is not at the end of surfdata and it is not necesary to take it into account
+                  // except for separate cases (ie pointus) ...
+      //ts and tns were earlier CP.Parameter() and CPbis.Parameter, but sometimes they had no values.
       Standard_Real ts=SD->Interference(ons).Parameter(isfirst), tns=SD->Interference(notons).Parameter(isfirst);
       Standard_Boolean isExtend;
-      // Test arbitraire (a raffiner)
+      // Arbitrary test (to precise)
       if (isfirst) isExtend = (ts-tns > 100*tolesp); 
       else         isExtend = (tns-ts > 100*tolesp);
       if (isExtend && !CP.Point().IsEqual(CPbis.Point(), 0) ) {
-       //  on garde l'etat et on renvoi False (prolongement par plan attendu).
+       //  the state is preserved and False is returned (extension by the expected plane).
        HS->ChangeSurface().Initialize(F);
        pc = SD->Interference(ons).PCurveOnFace();
-       // Le point 2d est donne par la trace sur la surface support
+       // The 2nd point is given by its trace on the support surface
         RecS = Standard_False;
        pons = pc->Value(tns);
        return Standard_False;
   }  
   
   if (CP.IsVertex() && !HC.IsNull() && !decroch){
-    //On change d'arete et on met a jour le parametre et
-    //eventuellement la face d'appui et(ou) la face de 
-    //reference.
+    //The edge is changed, the parameter is updated and
+    //eventually the support face and(or) the reference face.
     TopoDS_Vertex VCP = CP.Vertex();
     TopoDS_Edge EHC = HC->ChangeCurve2d().Edge();
-    //On commence par chercher dans Fref une autre arete 
-    //referencant VCP.
+    //One starts by searching in Fref another edge referencing VCP.
     TopExp_Explorer ex1,ex2;
     TopoDS_Edge newedge, edgereg;
     TopoDS_Face bidface = Fref, facereg;
       }
     }
     if(newedge.IsNull()){
-      //On regarde si EHC n'est pas un edge ferme.
+      //It is checked if EHC is not a closed edge.
       TopoDS_Vertex V1,V2;
       TopExp::Vertices(EHC,V1,V2);
       if(V1.IsSame(V2)){
        return 1;
       }
       else if(!edgereg.IsNull()){
-       // on change d arete et de face de reference.
+       // the reference edge and face are changed.
        Fref = facereg;
        HSref->ChangeSurface().Initialize(Fref);
        for(ex1.Init(facereg,TopAbs_EDGE); ex1.More() && newedge.IsNull(); ex1.Next()){
        }
       }
     }
-    // il faut ici identifier la nouvelle face d'appui du conge : 
-    // connexe a FRef le long de newedge.
+    // it is necessary to find the new support face of the fillet : 
+    // connected to FRef along the newedge.
     if(newedge.IsNull()) {
       Standard_Failure::Raise
-       ("StartSol : chainage impossible,nouvel obstacle non trouve");
+       ("StartSol : chain is not possible, new obstacle not found");
     }
     if(IsG1(myEFMap,newedge,Fref,Fv)){
       Standard_Failure::Raise
-       ("StartSol : chainage impossible, config non traitee");
+       ("StartSol : chain is not possible, config non processed");
     }
     else if(Fv.IsNull()){
       Standard_Failure::Raise
-       ("StartSol : chainage impossible, nouvel obstacle non trouve");
+       ("StartSol : chain is not possible, new obstacle not found");
     }
     else{
       HS->ChangeSurface().Initialize(Fv);
     }
     RecP = c1obstacle = 1;
     return 1;
-  } // Fin du Cas Vertex && Obstacle 
+  } // End of Case Vertex && Obstacle 
 
   else if (CP.IsOnArc() && !HC.IsNull() && !decroch){
-    //On ne change rien, on met juste a jour le parametre.
+    //Nothing is changed, the parameter is only updated.
     W = CP.ParameterOnArc();
     c1obstacle = 1;
     return 1;
       HS->ChangeSurface().Initialize(Fv);
       RecS = 1;
       if (CP.IsVertex()) { 
-       // On passe directement par le Vertex
+       // One goes directly by the Vertex
        Standard_Integer Nb;
        TopoDS_Face aux;
-        // Et l'on verifie qu'il n'y a pas d'autres candidats
+        // And it is checked that there are no other candidates
        Nb = SearchFaceOnV(CP, F, myVEMap, myEFMap, Fv, aux);
 
        pons = BRep_Tool::Parameters(CP.Vertex(), Fv);
        }
        return 1;
       }
-      // sinon on transite par l'arc...
+      // otherwise one passes by the arc...
       if(!Fv.IsSame(F)){
        Fv.Orientation(TopAbs_FORWARD);
        TopoDS_Edge newedge;
          }
        }
        //gp_Vec Varc, VSurf;
-        // En cas de sortie Tangente, la face courante devient la face de secour
+        // In cas of Tangent output, the current face becomes the support face
        if (SortieTangente(CP, F, SD, ons, 0.1)) { 
          pc = BRep_Tool::CurveOnSurface(CP.Arc(),F,Uf,Ul);
          HSBis = new (BRepAdaptor_HSurface)(F);
        return Standard_False;
       }
     }
-    else{ // il n'y a pas de face Voisine, on garde l'etat et on renvoi False.
+    else{ // there is no neighbor face, the state is preserved and False is returned.
       HS->ChangeSurface().Initialize(F);
       W = CP.ParameterOnArc();
       pc = BRep_Tool::CurveOnSurface(E,F,Uf,Ul);
   FVoi.Nullify();
   TopoDS_Edge E;
   if (Pc.IsVertex()){
-    // attention il faut analyser lensemble des faces qui tournent autour du vertex
-    // voir cahier pour les cas a traiter
+    // attention it is necessary to analyze all faces that turn around of the vertex
 #if DEB
-    cout<<"Commonpoint sur vertex on va au carton"<<endl;
+    cout<<"Commonpoint on vertex, the process hangs up"<<endl;
 #endif
-    if (Pc.HasVector()) { //Traitement general
+    if (Pc.HasVector()) { //General processing
       TopoDS_Face Fbis;
       Standard_Integer nb_faces;
       nb_faces = SearchFaceOnV(Pc,  FRef, myVEMap, myEFMap, FVoi, Fbis);
       return ( nb_faces > 0);
     }
-    else { // Traitement utilisant la spine
+    else { // Processing using the spine
       Standard_Boolean  FindFace=Standard_False;
       gp_Pnt Point;
       gp_Vec VecSpine;
       Spine->D1(Pc.Parameter(), Point, VecSpine);
     
-      // on verifie que l'on sort bien de la face courante.
+      // It is checked if one leaves from the current face.
       FindFace = IsInput(VecSpine, Pc.Vertex(), FRef);
       if (FindFace) {
        VecSpine.Reverse();
        FindFace = IsInput(VecSpine, Pc.Vertex(), FRef);
       }
-      // Si l'on ne sort pas, c'est fini
+      // If one does not leave, it is ended
       if (FindFace) {
        FVoi = FRef;
        return Standard_True;
       }
     
-      // Sinon, on cherche la suivante parmis les Faces partages 
-      // par une arete communes G1
+      // Otherwise one finds the next among shared Faces 
+      // by a common edge G1
       TopTools_ListIteratorOfListOfShape ItE, ItF;
       for(ItE.Initialize(myVEMap(Pc.Vertex()));
          ItE.More() && (!FindFace); ItE.Next()) {
            return Standard_False;
          }
        
-         // On verifie que la face Selectionnee a bien une des arretes de la spine
-         // contenant le vertex dans sa frontierre
-         // Ce traitement ne devrait marcher que si le Vertex appartient a la spine
-         //  Cas singulier, pour d'autre vertex il faudrait faire autre chose
+         // It is checked if the selected face actually possesses edges of the spine
+         // containing the vertex on its front
+         // This processing should go only if the Vertex belongs to the spine
+         // This is a single case, for other vertexes it is required to do other things
          Trouve=Standard_False;
          for (Standard_Integer IE=1;//, Trouve=Standard_False;                   15.11.99  SVV
               (IE<=Spine->NbEdges()) && (!Trouve); IE++) {
 
 //=======================================================================
 //function : ChFi3d_SingularExtremity
-//purpose  : chargement du vertex dans la DS et calcul de la pcurve 
-//           pour une extremite dans le cas freeboundary singulier
-//           ou periodic et singulier a la couture.
+//purpose  : load the vertex in the DS and calculate the pcurve 
+//           for an extremity in case of singular freeboundary 
+//           or periodic and singular at the cut.
 //=======================================================================
 static void ChFi3d_SingularExtremity( Handle(ChFiDS_Stripe)&     stripe,
                                     TopOpeBRepDS_DataStructure& DStr,
   Handle(Geom_Curve) C3d;
   Handle(Geom2d_Curve) PCurv;
   TopOpeBRepDS_Curve Crv;
-  // la SurfData en cause et ses CommonPoints,
+  // SurfData and its CommonPoints,
   Standard_Integer Ivtx, Icurv;
   Standard_Boolean isfirst;
   
  
   const ChFiDS_CommonPoint& CV1 = Fd->Vertex(isfirst,1);
   const ChFiDS_CommonPoint& CV2 = Fd->Vertex(isfirst,2);
-  // Est ce toujours degenere ?
+  // Is it always degenerated ?
   if ( CV1.Point().IsEqual( CV2.Point(), 0) ) { 
     Ivtx = ChFi3d_IndexPointInDS(CV1, DStr);
     if (isfirst) {
     stripe->SetIndexPoint(Ivtx, isfirst, 2);
 
     if (stripe->Spine()->IsPeriodic()) { 
-      // cas periodique : On renouvelle l'operation
-      // on ne partage pas la courbe 3d.
-      // On fabrique 2 aretes degenere confondus en 3d
+      // periodic case : The operation is renewed
+      // the curve 3d is not shared.
+      // 2 degenerated edges coinciding in 3d
       isfirst = Standard_False;
       Fd = stripe->SetOfSurfData()->Sequence().Last();
       VOnS1 = Fd->InterferenceOnS1().PCurveOnSurf()->
 
 //=======================================================================
 //function : ChFi3d_MakeExtremities
-//purpose  : calcul des Courbes3d et pcurves des extremites dans les
-//           cas periodiques et freeboundary.
+//purpose  : calculate Curves3d and pcurves of extremities in
+//           periodic and freeboundary cases.
 //=======================================================================
 static Standard_Boolean IsFree(const TopoDS_Shape& E,
                               const ChFiDS_Map&   EFMap)
        ChFi3d_SetPointTolerance(DStr,b2,Stripe->IndexFirstPointOnS2());
     }
     else {
-      // Cas de l'extremite singuliere
+      // Case of the single extremity
       if (CV1.IsVertex()) { 
        ChFi3d_SingularExtremity(Stripe, DStr, CV1.Vertex(), tol3d, tol2d);
       }
 # if DEB
-      else { cout << "MakeExtremities : Singularite hors Vertex !!" << endl; }
+      else { cout << "MakeExtremities : Singularity out of Vertex !!" << endl; }
 # endif
     }
     return;
                          Value(SDdeb->InterferenceOnS1().FirstParameter());     
       UV2=SDdeb->InterferenceOnS2().PCurveOnSurf()->
                          Value(SDdeb->InterferenceOnS2().FirstParameter());
-// On essaie l'intersection du conge par un plan
+// The intersection of the fillet by a plane is attempted
 
       Handle(GeomAdaptor_HSurface) HConge=ChFi3d_BoundSurf(DStr,SDdeb,1,2);
       ChFi3d_CoupeParPlan(cpdeb1,cpdeb2,HConge,UV1,UV2,
       if (!cpdeb2.IsVertex())
        ChFi3d_SetPointTolerance(DStr,b2,Stripe->IndexFirstPointOnS2());
     }
-    else { // Cas de l'extremite singuliere
+    else { // Case of a singular extremity
       if (cpdeb1.IsVertex()) { 
        ChFi3d_SingularExtremity(Stripe, DStr, cpdeb1.Vertex(), tol3d, tol2d);
       }
 # if DEB
-      else { cout << "MakeExtremities : Singularite hors Vertex !!" << endl; }
+      else { cout << "MakeExtremities : Singularity out of Vertex !!" << endl; }
 # endif
     }
   }
                          Value(SDfin->InterferenceOnS1().LastParameter());     
       UV2=SDfin->InterferenceOnS2().PCurveOnSurf()->
                          Value(SDfin->InterferenceOnS2().LastParameter());
-// On essaie l'intersection du conge par un plan
+// Intersection of the fillet by a plane is attempted
 
       Handle(GeomAdaptor_HSurface) HConge=ChFi3d_BoundSurf(DStr,SDfin,1,2);
       ChFi3d_CoupeParPlan(cpfin1,cpfin2,HConge,UV1,UV2,
       if (!cpfin2.IsVertex())
        ChFi3d_SetPointTolerance(DStr,b2,Stripe->IndexLastPointOnS2());
     }
-    else { // Cas de l'extremite singuliere
+    else { // Case of the single extremity
       if (cpfin1.IsVertex()) { 
        ChFi3d_SingularExtremity(Stripe, DStr, cpfin1.Vertex(), tol3d, tol2d);
       }
 # if DEB
-      else { cout << "MakeExtremities : Singularite hors Vertex !!" << endl; }
+      else { cout << "MakeExtremities : Singularity out of Vertex !!" << endl; }
 # endif
     }
   }
                          Standard_Boolean&         intf,
                          Standard_Boolean&         intl)
 {
-  if (isfirst) intf = 1; else intl = 1; // Fini.
+  if (isfirst) intf = 1; else intl = 1; // End.
   Standard_Integer opp = 3-ons;
   if (!SD->Vertex(isfirst,opp).IsOnArc() || 
       SD->TwistOnS1() || SD->TwistOnS2() ) {
 #ifdef DEB
-    cout<<"ChFi3d_Purge : Pas de sortie sur prolongement."<<endl;
+    cout<<"ChFi3d_Purge : No output on extension."<<endl;
 #endif
     ChFiDS_SequenceOfSurfData& Seq = 
       Stripe->ChangeSetOfSurfData()->ChangeSequence();
 
 //=======================================================================
 //function : InsertAfter
-//purpose  : insert Item apres ref dans Seq. Si ref est null item est
-//           insere en tete.
+//purpose  : insert Item after ref in Seq. If ref is null, the item is
+//           inserted at the beginning.
 //=======================================================================
 
 static void InsertAfter (Handle(ChFiDS_Stripe)&   Stripe,
                         Handle(ChFiDS_SurfData)& Item)
 {
   if (Ref == Item) 
-    Standard_Failure::Raise("InsertAfter : 2fois la meme surfdata.");
+    Standard_Failure::Raise("InsertAfter : twice the same surfdata.");
   
   ChFiDS_SequenceOfSurfData& Seq = 
     Stripe->ChangeSetOfSurfData()->ChangeSequence();
 
 //=======================================================================
 //function : InsertBefore
-//purpose  : Insert item avant ref dans Seq. Si ref est null item est
-//           insere en queue.
+//purpose  : Insert item before ref in Seq. If ref is null, the item is
+//           inserted in the queue.
 //=======================================================================
 
 static void InsertBefore (Handle(ChFiDS_Stripe)&   Stripe,
                          Handle(ChFiDS_SurfData)& Item)
 {
   if (Ref == Item) 
-    Standard_Failure::Raise("InsertBefore : 2fois la meme surfdata.");
+    Standard_Failure::Raise("InsertBefore : twice the same surfdata.");
   
   ChFiDS_SequenceOfSurfData& Seq = 
     Stripe->ChangeSetOfSurfData()->ChangeSequence();
   Standard_Real wl = Guide.LastParameter();
   Standard_Real locfleche = (wl - wf) * fleche;
   Standard_Real wfsav = wf, wlsav = wl;
-  //Maintenant on elargit artificiellement l ElSpine 
-  //pour aider rsnld.
+  //Now the ElSpine is artificially extended to help rsnld.
   Standard_Real prab = 0.01;
   Guide.FirstParameter(wf-prab*(wl-wf));
   Guide.LastParameter (wl+prab*(wl-wf));
   math_Vector SoldepCS(1,3);
   math_Vector SoldepCC(1,2);
   
-  // Recuperation d un KPart voisin.
-  // Si pas de voisin calcul point de depart. 
+  // Restore a neighboring KPart.
+  // If no neighbor calculation start point. 
   Standard_Boolean forward = Standard_True;
   Standard_Boolean Inside  = Standard_False;
   Standard_Real    First   = wf;
   Standard_Real    Last    = wl;
   Standard_Boolean Ok1 = 1,Ok2 = 1;
-  // Recuperation du KPart suivant si il existe
+  // Restore the next KPart if it exists
   TopoDS_Vertex Vref;
   if(ref.IsNull() && raf.IsNull()){
     //sinon solution approchee.
     Inside = Standard_True;
     
 #ifdef DEB  
-    ChFi3d_InitChron(ch1);// init perf pour  StartSol 
+    ChFi3d_InitChron(ch1);// init perf for StartSol 
 #endif
     
     StartSol(Stripe,HGuide,HS1,HS2,It1,It2,pp1,pp2,First);
     
 #ifdef DEB 
-    ChFi3d_ResultChron(ch1,t_startsol); // result perf pour  StartSol  
+    ChFi3d_ResultChron(ch1,t_startsol); // result perf for StartSol  
 #endif 
     
     Last = wf;
     if(Guide.IsPeriodic()) {
       Last = First - Guide.Period();
       Guide.FirstParameter(Last);
-      Guide.LastParameter (First * 1.1);//Extension pour aider rsnld.
+      Guide.LastParameter (First * 1.1);//Extension to help rsnld.
     }
   }
   else{
     }
     
 #ifdef DEB  
-    ChFi3d_InitChron(ch1);// init perf pour   startsol 
+    ChFi3d_InitChron(ch1);// init perf for startsol 
 #endif
     
     
     HC2.Nullify();
     
 #ifdef DEB   
-    ChFi3d_ResultChron(ch1,t_startsol); // result perf pour startsol  
+    ChFi3d_ResultChron(ch1,t_startsol); // result perf for startsol  
 #endif
     
     
     if(Spine->IsPeriodic() && (indl < indf)) indl += nbed;
     nbed = indl-indf+1;
   }
-  // Pas Max a la louche : 20 points par arete en moyenne en prenant soin 
-  // de ne pas comptabiliser les prolongements.
+  // No Max at the touch : 20 points by edge at average without  
+  // counting the extensions.
 
   Standard_Real bidf = wf, bidl = wl;
   if(!Spine->IsPeriodic()) {
     bidf = Max(0.,wf);
     bidl = Min(wl,Spine->LastParameter(Spine->NbEdges()));
-    // PMN 20/07/98 : Attention au cas ou il n'y a que du prolongement
+    // PMN 20/07/98 : Attention in case if there is only extension
     if  ((bidl-bidf) < 0.01 * Spine->LastParameter(Spine->NbEdges())) {
        bidf = wf;
        bidl = wl;
 #endif
   Standard_Boolean      intf = 0, intl = 0;
   while(!fini){
-    // sont-ce les bouts (pas de prolongement sur les periodiques).
+    // are these the ends (no extension on periodic).
     Ok1 = 1,Ok2 = 1;
     if(!Spine->IsPeriodic()){
       if(wf < tolesp && (complete == Inside)){
     if(!ref.IsNull()){
       
 #ifdef DEB  
-      ChFi3d_InitChron(ch1);// init perf pour StartSol 
+      ChFi3d_InitChron(ch1);// init perf for StartSol 
 #endif
       
       Ok1 = StartSol(Spine,HS1,pp1,HC1,w1,ref,!forward,1,
                     HS4,pp4,decroch2,Vref);
       
 #ifdef DEB   
-      ChFi3d_ResultChron(ch1,t_startsol); // result perf pour StartSol  
+      ChFi3d_ResultChron(ch1,t_startsol); // result perf for StartSol  
 #endif 
       
     }
     
-    // Plus de face connexe. Construction du plan tangent pour continuer le cheminement 
-    // jusqu a sortie sur l autre face.
+    // No more connected faces. Construction of the tangent plane to continue the path 
+    // till the output on the other face.
     if ((!Ok1 && HC1.IsNull()) || (!Ok2 && HC2.IsNull())) {
       if ((intf && !forward) || (intl && forward)) {
        if (!Ok1) ChFi3d_BuildPlane (DStr,HS1,pp1,ref,!forward,1);
        if(forward) Guide.FirstParameter(wf);
        else Guide.LastParameter(wl);
       }
-      else Standard_Failure::Raise("PerformSetOfSurfOnElSpine : Chainage impossible.");
+      else Standard_Failure::Raise("PerformSetOfSurfOnElSpine : Chaining is impossible.");
     }
     
-    // Definition du domaine de cheminement It1, It2
+    // Definition of the domain of path It1, It2
     It1->Initialize(HS1);
     It2->Initialize(HS2);
     
-    // Calcul d'une (plusieur si singularite) SurfaData
+    // Calculate one (several if singularity) SurfaData
     SD = new ChFiDS_SurfData();
     ChFiDS_SequenceOfSurfData SeqSD;
     SeqSD.Append(SD);
                                                Stripe->Choix());
 
 
-      // Calcul du critere de Choix arete / arete
+      // Calculate the criterion of Choice edge / edge
       if (Choix%2 == 0) Choix = 4;
       else Choix = 1;
 
       }
       else{
 #ifdef DEB   
-       ChFi3d_InitChron(ch1); // init perf pour  PerformSurf 
+       ChFi3d_InitChron(ch1); // init perf for PerformSurf 
 #endif
        PerformSurf(SeqSD,HGuide,Spine,Choix,
                    HS1,It1,HC1,HSref1,HCref1,decroch1,Or1,
                    MaxStep,locfleche,tolesp,First,Last,Inside,Inside,forward,
                    RecP1,RecRst1,RecP2,RecRst2,SoldepCC);
 #ifdef DEB  
-       ChFi3d_ResultChron(ch1,t_performsurf); //result  perf pour  PerformSurf 
+       ChFi3d_ResultChron(ch1,t_performsurf); //result  perf for PerformSurf 
 #endif 
       }
       SD->ChangeIndexOfS1(DStr.AddShape(HS1->ChangeSurface().Face()));
       }
       else{
 #ifdef DEB  
-       ChFi3d_InitChron(ch1); // init perf pour  PerformSurf
+       ChFi3d_InitChron(ch1); // init perf for PerformSurf
 #endif
        PerformSurf(SeqSD,HGuide,Spine,Choix,HS1,It1,HC1,HSref1,HCref1,decroch1,
                    HS2,It2,Or2,MaxStep,locfleche,tolesp,First,Last,
                    Inside,Inside,forward,RecP1,RecS2,RecRst1,SoldepCS);
 #ifdef DEB  
-       ChFi3d_ResultChron(ch1,t_performsurf);//result  perf pour  PerformSurf  
+       ChFi3d_ResultChron(ch1,t_performsurf);//result  perf for PerformSurf  
 #endif 
       }
       SD->ChangeIndexOfS1(DStr.AddShape(HS1->ChangeSurface().Face()));
       }
       else{
 #ifdef DEB   
-       ChFi3d_InitChron(ch1); // init perf pour  PerformSurf 
+       ChFi3d_InitChron(ch1); // init perf for PerformSurf 
 #endif
        PerformSurf(SeqSD,HGuide,Spine,Choix,HS1,It1,Or1,
                    HS2,It2,HC2,HSref2,HCref2,decroch2,MaxStep,locfleche,tolesp,
                    First,Last,Inside,Inside,forward,RecP2,RecS1,RecRst2,SoldepCS);
 #ifdef DEB  
-       ChFi3d_ResultChron(ch1,t_performsurf); //result  perf pour  PerformSurf 
+       ChFi3d_ResultChron(ch1,t_performsurf); //result  perf for PerformSurf 
 #endif 
       }
       SD->ChangeIndexOfS1(DStr.AddShape(HS1->ChangeSurface().Face()));
       decroch1 = decroch2 = 0;
     }
 
-    if(!done) { // Cas d'echec
+    if(!done) { // Case of fail
       if ((!Ok1 && !obstacleon1) || (!Ok2 && !obstacleon2)) {
-       //Echec dans une partie de prolongement ce n'est pas grave
-       //On s'arrete la.
+       //Fail in a part of extension is not serious
+       //Here one stops.
        done = Standard_True;
        Inside = Standard_False;
        if (forward) intl = 1;
        else         intf = 1;
       }
-      else { // Sinon invalidation de la stripe.
+      else { // Otherwise invalidation of the stripe.
         Spine->SetErrorStatus(ChFiDS_WalkingFailure);
-       Standard_Failure::Raise("CallPerformSurf : Echec cheminement!");
+       Standard_Failure::Raise("CallPerformSurf : Path failed!");
       }
     }
     
       } 
     
       if (!Ok1 && !obstacleon1) 
-       // nettoyage des infos sur le plan de prolongement.
+       // clean infos on the plane of extension.
        ChFi3d_Purge (Stripe,SD,ref->Vertex(!forward,1),!forward,1,intf,intl);
       
       if (!Ok2 && !obstacleon2) 
-       // nettoyage des infos sur le plan de prolongement.
+       // clean infos on the plane of extension.
        ChFi3d_Purge (Stripe,SD,ref->Vertex(!forward,2),!forward,2,intf,intl);
     
-      // C'est fini on change la reference       
+      // The end. The reference is changed.      
       ref = refbis;  
     }  
     
-    if(Inside){// on a des solutions de depart pour les suivants.
+    if(Inside){// There are starting solutions for the next.
       Inside = Standard_False;
       Firstsov = First;
       if(Guide.IsPeriodic()) {
     }
     if(forward){
       fini = ((wl - Last) <= 10.*tolesp || 
-             (intl && !(obstacleon1 || obstacleon2))); //Cas general
+             (intl && !(obstacleon1 || obstacleon2))); //General case
 
       if (!fini && Guide.IsPeriodic() && 
          ((wl - Last)< Guide.Period()*1.e-3)) {
-       // On test si les recadrage extremes se font sur la meme edge
-        // Condition de bouclage
+       // It is tested if reframing of extremes is done at the same edge
+        // Loop Condition
        Handle(ChFiDS_SurfData) thefirst, thelast;
        thefirst = Stripe->SetOfSurfData()->Sequence().First();
        thelast =  Stripe->SetOfSurfData()->Sequence().Last();
            (thelast->VertexLastOnS2().Arc());
 
        if (fini) 
-         return; //C'est fini !!
+         return; //It is ended!
       }
 
       if(fini && complete) {
-       // on repart dans l autre sens.
+       // restart in the opposite direction.
        ref  = Stripe->SetOfSurfData()->Sequence().First();
        forward = Standard_False;
        fini = Standard_False;
       Last = wf;
     }
   }
-  // On remet l etat dans les wc ou on l a trouve.
+  // The initial state is restored
   if(!Guide.IsPeriodic()){
     Guide.FirstParameter(wfsav);
     Guide.LastParameter (wlsav);
   TopAbs_Orientation           Or1,Or2,RefOr1,RefOr2;
   Standard_Integer             Choix,RefChoix;
   
-  // initialisation du stripe.
+  // initialization of the stripe.
   Stripe->Reset();
   Handle(ChFiDS_HData)&  HData  = Stripe->ChangeSetOfSurfData();
   HData =  new ChFiDS_HData();
   Standard_Real WEndPeriodic = Spine->LastParameter(Spine->NbEdges());
   Spine->D1(WEndPeriodic,PEndPeriodic,TEndPeriodic);
   
-  // Construction des cas particuliers.
+  // Construction of particular cases.
   
   for (Standard_Integer iedge = 1; iedge <= Spine->NbEdges(); iedge++){
     
       
       if(!ChFiKPart_ComputeData::Compute(DStr,SD,HS1,HS2,Or1,Or2,Spine,iedge)){
 #ifdef DEB
-       cout<<"echec calcul KPart"<<endl;
+       cout<<"failed calculation KPart"<<endl;
 #endif
       }
       else if(!SplitKPart(SD,LSD,Spine,iedge,HS1,It1,HS2,It2,intf,intl)){
 #ifdef DEB
-       cout<<"echec calcul KPart"<<endl;
+       cout<<"failed calculation KPart"<<endl;
 #endif
        LSD.Clear();
       }
       else iedgelastkpart = iedge;
-      if(Spine->IsPeriodic()){//debug provisoire pour les SD qui arrivent dans le desordre.
+      if(Spine->IsPeriodic()){//debug provisory for SD that arrive in desorder.
        Standard_Integer nbsd = LSD.Length();
        Standard_Real period = Spine->Period();
        Standard_Real wfp = WStartPeriodic, wlp = WEndPeriodic;
        TgtKP(LSD.Value(j),Spine,iedge,1,PFirst,TFirst);
        TgtKP(LSD.Value(j),Spine,iedge,0,PLast,TLast);
        
-       // Determination des portions a approximer
+       // Determine the sections to approximate
        if(!YaKPart){
          if(Spine->IsPeriodic()){
            WStartPeriodic = WFirst;
            Spine->SetLastParameter(WEndPeriodic);
          }
          else if(!intf || (iedge > 1)){
-           // portion debut -> premier KPart
-           // mise a jour du prolongement.
+           // start section -> first KPart
+           // update of extension.
            Spine->SetFirstTgt(Min(0.,WFirst));
            CurrentHE->ChangeCurve().LastParameter (WFirst);
            CurrentHE->ChangeCurve().SetLastPointAndTgt(PFirst,TFirst);
        }
        else {
          if (WFirst - CurrentHE->FirstParameter() > tolesp) {
-           // portion entre deux KPart
+           // section between two KPart
            CurrentHE->ChangeCurve().LastParameter(WFirst);
            CurrentHE->ChangeCurve().SetLastPointAndTgt(PFirst,TFirst);
            Spine->AppendElSpine(CurrentHE);
   }
   
   if (!intl || (iedgelastkpart < Spine->NbEdges())) {
-    // portion dernier KPart(ou debut du spine) -> Fin du spine.
-    // mise a jour du prolongement.
+    // section last KPart(or start of the spine) -> End of the spine.
+    // update of the extension.
     
     if(Spine->IsPeriodic()){
       if(WEndPeriodic - WLast > tolesp){
     Standard_Integer last = len, i;
     Standard_Boolean periodic = Spine->IsPeriodic();
     if(periodic) last++;
-    // On essaye de reprendre les carreaux qui vrillent.
+    // It is attempted to reprocess the squares that bore.
     for(i = 1; i <= len; i++){
       Handle(ChFiDS_SurfData)& cursd = SeqSurf.ChangeValue(i);
       Standard_Boolean tw1 = cursd->TwistOnS1();
        else inext = 0;
       }
 
-      // Pour l instant on ne corrige que les surfaces ou le twist est 
-      // detecte au cheminement, il faudra prevoir un controle plus 
-      // subtile des traces moches ( taille, courbure, inflexion... ) 
+      // For the moment only the surfaces where the twist is 
+      // detected at the path are corrected, it is necessary to control  
+      // more subtly the ugly traces (size, curvature, inflexion... ) 
       if(!tw1 && !tw2) continue;
       
-      // On decide (assez arbitrairement) si la surface incriminee se prete 
-      // a un remplissage.
+      // It is decided (fairly at random) if the extended surface is ready for the filling.
       ChFiDS_FaceInterference& intf1 = cursd->ChangeInterferenceOnS1();
       ChFiDS_FaceInterference& intf2 = cursd->ChangeInterferenceOnS2();
       Standard_Integer cursurf1 = cursd->IndexOfS1();
       Standard_Boolean possibleon2 = (don2 < 2*(ddeb + dfin));
       if((tw1 && !possibleon1) || (tw2 && !possibleon2)) {
         Spine->SetErrorStatus(ChFiDS_TwistedSurface);
-       Standard_Failure::Raise("rattrapage en retouchant les points non ecrit");
+       Standard_Failure::Raise("adjustment by reprocessing the non-written points");
       }
       
-      // On regarde si il y a des voisins presentables
+      // It is checked if there are presentable neighbors
       Standard_Boolean yaprevon1 = 0, yaprevon2 = 0;
       Standard_Boolean samesurfon1 = 0, samesurfon2 = 0;
       if(iprev){
        yanexton2 = !nextsd->TwistOnS2();
        if(samesurfon2) samesurfon2 = (nextsd->IndexOfS2() == cursurf2);
       }
-      // On construit un contour de remplissage
+      // A contour of filling is constructed
       Handle(Geom2d_Curve) PC1 = intf1.PCurveOnFace();
       Handle(Geom2d_Curve) PC2 = intf2.PCurveOnFace();
       Handle(BRepAdaptor_HSurface) S1 = new BRepAdaptor_HSurface();
        if(!yaprevon1 || !yanexton1){
           Spine->SetErrorStatus(ChFiDS_TwistedSurface);
          Standard_Failure::Raise
-           ("rattrapage en retouchant les points non ecrit : pas de voisin");
+           ("adjustment by reprocessing the non-written points: no neighbor");
        }
        ChFiDS_FaceInterference& previntf1 = prevsd->ChangeInterferenceOnS1();
        ChFiDS_FaceInterference& nextintf1 = nextsd->ChangeInterferenceOnS1();
        Standard_Real prevpar1 = previntf1.LastParameter();
        Standard_Real nextpar1 = nextintf1.FirstParameter();
        if(samesurfon1){
-         // On regarde si on peut intersecter les traces des voisins
-         // pour faire un pointu.
+         // It is checked if it is possible to intersect traces of neighbors
+         // to create a sharp end.
          Handle(Geom2d_Curve) pcprev1 = previntf1.PCurveOnFace();
          Handle(Geom2d_Curve) pcnext1 = nextintf1.PCurveOnFace();
          Standard_Real nprevpar1,nnextpar1;
          }
        }
        else{
-         //ici on se fonde sur les tangentes 3d des voisins.
+         //here the base is on 3D tangents of neighbors.
          const Handle(Geom_Curve)& c3dprev1 = 
            DStr.Curve(previntf1.LineIndex()).Curve();
          const Handle(Geom_Curve)& c3dnext1 = 
       if(tw2){
        if(!yaprevon2 || !yanexton2){
          Standard_Failure::Raise
-           ("rattrapage en retouchant les points non ecrit : pas de voisin");
+           ("adjustment by reprocessing the non-written points: no neighbor");
        }
        ChFiDS_FaceInterference& previntf2 = prevsd->ChangeInterferenceOnS2();
        ChFiDS_FaceInterference& nextintf2 = nextsd->ChangeInterferenceOnS2();
        Standard_Real prevpar2 = previntf2.LastParameter();
        Standard_Real nextpar2 = nextintf2.FirstParameter();
        if(samesurfon2){
-         // On regarde si on peut intersecter les traces des voisins
-         // pour faire un pointu.
+         // It is checked if it is possible to intersect traces of neighbors
+         // to create a sharp end.
          Handle(Geom2d_Curve) pcprev2 = previntf2.PCurveOnFace();
          Handle(Geom2d_Curve) pcnext2 = nextintf2.PCurveOnFace();
          Standard_Real nprevpar2,nnextpar2;
          }
        }
        else{
-         //ici on se fonde sur les tangentes 3d des voisins.
+        //here the base is on 3D tangents of neighbors.
          const Handle(Geom_Curve)& c3dprev2 = 
            DStr.Curve(previntf2.LineIndex()).Curve();
          const Handle(Geom_Curve)& c3dnext2 = 
       else{
        Bon2 = ChFi3d_mkbound(S2,PC2,tolesp,2.e-4);
       }
-      // Les parametres des traces des voisins sont a jour, on tire donc des 
-      // droites uv.
+      // The parameters of neighbor traces are updated, so 
+      // straight lines uv are pulled.
       const Handle(Geom_Surface)& 
        sprev = DStr.Surface(prevsd->Surf()).Surface();
       const Handle(Geom_Surface)& 
       Handle(Geom_Surface) newsurf = fil.Surface();
 #ifdef DEB
 #ifdef DRAW
-      //POP pour NT
+      //POP for NT
       char* pops = "newsurf";
       DrawTrSurf::Set(pops,newsurf);
 #endif
 #endif
       if(pointuon1) {
-       newsurf->VReverse(); // on se ramene au sens 1 vers 2;
+       newsurf->VReverse(); // we return to direction 1 from  2;
        done = CompleteData(cursd,newsurf,S1,PC1,S2,PC2,
                            F2.Orientation(),0,0,0,0,0);
        cursd->ChangeIndexOfS1(0);
        nextsd->ChangeVertexFirstOnS2().SetPoint(cpf2.Point());
       }
     }
-    // On met a jour la tolerance des points.
+    // The tolerance of points is updated.
     for(i = 1; i < last; i++){
       Standard_Integer j = i%len + 1;
       Standard_Integer curs1, curs2;
       if(!curp1.IsOnArc() && nextp1.IsOnArc()){ 
        curp1 = nextp1;
        if ( (curs1 == nexts1) && !nextsd->IsOnCurve1()) 
-         // Cas ou l'on passe par la frontiere sans sortir
+         // Case when it is not possible to pass along the border without leaving
          ChangeTransition(nextp1, curp1, nexts1, myDS);
       }
       else if(curp1.IsOnArc() && !nextp1.IsOnArc()) { 
       curp1.SetTolerance(tol1); nextp1.SetTolerance(tol1); 
       curp2.SetTolerance(tol2); nextp2.SetTolerance(tol2); 
     }
-    // On met a jour les liens edge/nouvelles faces.
+    // The connections edge/new faces are updated.
     for (ILES.Initialize(ll) ; ILES.More(); ILES.Next()) {
       const Handle(ChFiDS_HElSpine)& curhels = ILES.Value();
       const ChFiDS_ElSpine& curels = curhels->ChangeCurve();
        IL = Spine->Index(WL,0);
       }
       if(IF == IL) {
-       //traitement rapide
+       //fast processing
        Standard_Integer IFloc = IF;
        if(periodic) IFloc = (IF - 1)%nbed + 1;
        const TopoDS_Edge& Ej = Spine->Edges(IFloc);
       else if(IF < IL){
        TColStd_Array1OfReal wv(IF,IL - 1);
 #ifdef  DEB
-       cout<<"longueur du trajet : "<<(WL-WF)<<endl;
+       cout<<"length of the trajectory : "<<(WL-WF)<<endl;
 #endif
        for(i = IF; i < IL; i++){
          Standard_Integer iloc = i;
          }
          else {
 #ifdef DEB
-           cout<<"echec projection vertex ElSpine!!!"<<endl;
+           cout<<"fail of projection vertex ElSpine!!!"<<endl;
 #endif
          }
        }
   
 #ifdef DEB   
   OSD_Chronometer ch;
-  ChFi3d_InitChron(ch);// init perf pour PerformSetOfKPart
+  ChFi3d_InitChron(ch);// init perf for PerformSetOfKPart
 #endif
   
   const Handle(ChFiDS_Spine)& sp = Stripe->Spine();
   
 #ifdef DEB   
   ChFi3d_ResultChron(ch ,t_perfsetofkpart); // result perf PerformSetOfKPart(
-  ChFi3d_InitChron(ch); // init perf pour  PerformSetOfKGen
+  ChFi3d_InitChron(ch); // init perf for  PerformSetOfKGen
 #endif
   
   PerformSetOfKGen(Stripe,Simul);
   
 #ifdef DEB   
   ChFi3d_ResultChron(ch, t_perfsetofkgen);//result perf PerformSetOfKGen 
-  ChFi3d_InitChron(ch); // init perf pour ChFi3d_MakeExtremities
+  ChFi3d_InitChron(ch); // init perf for ChFi3d_MakeExtremities
 #endif
   
   if(!Simul) ChFi3d_MakeExtremities(Stripe,DStr,myEFMap,tolesp,tol2d);
 
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 
 #ifdef DEB
-// Pour les mesures.
+// For measurements.
 #include <OSD_Chronometer.hxx>
 //static OSD_Chronometer appclock;
 #endif
                      const Standard_Real  preftg)
 {
   Standard_Boolean found = 0;
-  //(1) On verifie si les paramtres fournies sont bon
-  //    cas ou les pcurves sont paramtres comme la spine.
+  //(1) It is checked if the provided parameters are good 
+  //    if pcurves have the same parameters as the spine.
   gp_Pnt2d point = Carc.Value(prefarc);
   Standard_Real distini = point.Distance(Ctg->Value(preftg));
   if (distini <= Precision::PConfusion()) {
     found = Standard_True;
   }
   else {
-    //(2) On intersecte
+    //(2) Intersection
 #ifdef DEB
-    cout<< "CompParam : mauvais parametres on intersecte"<<endl; 
+    cout<< "CompParam : bad intersection parameters"<<endl; 
 #endif
     IntRes2d_IntersectionPoint int2d;
     Geom2dInt_GInter Intersection;
        nbseg = Intersection.NbSegments();
        if ( nbseg > 0 ){ 
 #ifdef DEB
-         cout<< "segments d intersection sur les restrictions"<<endl; 
+         cout<< "segments of intersection on the restrictions"<<endl; 
 #endif  
        }
        nbpt = Intersection.NbPoints();
   }
   
   if(!found){
-    // (3) On projette...
+    // (3) Projection...
 #ifdef DEB
-    cout<<"CompParam : echec intersection PC, on projette."<<endl;
+    cout<<"CompParam : failed intersection PC, projection is created."<<endl;
 #endif
     parc = prefarc;
     Geom2dAPI_ProjectPointOnCurve projector(point,Ctg);
 
     if(projector.NbPoints() == 0){
-      // Cela arrive parfois dans les cas singuliers ou l'on sort 
-      // en bout de spine sur vertex...
+      // This happens in some cases when there is a vertex 
+      // at the end of spine...
       ptg = preftg; 
 #ifdef DEB
-      cout<<"CompParam :  echec proj p2d/c2d, on prend l'extremite!" <<endl;
+      cout<<"CompParam : failed proj p2d/c2d, the extremity is taken!" <<endl;
 #endif
     }
     else  {
-      // On controle que l'on n'as pas calculer n'importe quoi (EDC402 C2)
+      // It is checked if everything was calculated correctly (EDC402 C2)
       if  (projector.LowerDistance() < distini) 
        ptg = projector.LowerDistanceParameter();
       else  ptg = preftg;
 
 //=======================================================================
 //function : CompBlendPoint
-//purpose  : fabrique le BlendPoint correspondant a une tangence sur Vertex
-// pmn : 15/10/1997 : renvoi false, si l'on n' a pas de pcurve    
+//purpose  : create BlendPoint corresponding to a tangency on Vertex
+// pmn : 15/10/1997 : returns false, if there is no pcurve    
 //=======================================================================
 
 static Standard_Boolean CompBlendPoint(const TopoDS_Vertex& V,
 
 //=======================================================================
 //function :  UpdateLine
-//purpose  : Met a jour les extremites apres une invalidation partiel   
+//purpose  : Updates extremities after a partial invalidation   
 //=======================================================================
 
 static void UpdateLine(Handle(BRepBlend_Line)& Line, 
 
 //=======================================================================
 //function : CompleteData
-//purpose  : Calcule les courbes et les CommonPoints a partir des donnees
-//           calculees par remplissage.
+//purpose  : Calculates curves and CommonPoints from the data
+//           calculated by filling.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::CompleteData
   if(!Gf1) Data->ChangeVertexLastOnS1().SetPoint(Surfcoin->Value(ULast,VFirst));
   if(!Gf2) Data->ChangeVertexLastOnS2().SetPoint(Surfcoin->Value(ULast,VLast));
 
-  //calcul des courbes cote S1
+  //calculate curves side S1
   Handle(Geom_Curve) Crv3d1;
   if(!PC1.IsNull()) Crv3d1= Surfcoin->VIso(VFirst);
   gp_Pnt2d pd1(UFirst,VFirst), pf1(ULast,VFirst);
   Fint1.SetFirstParameter(UFirst);
   Fint1.SetLastParameter(ULast);
   Fint1.SetInterference(Index1OfCurve,tra1,c2dtrim,PCurveOnSurf);
-  //calcul des courbes cote S2
+  //calculate curves side S2
   Handle(Geom_Curve) Crv3d2;
   if(!PC2.IsNull()) Crv3d2 = Surfcoin->VIso(VLast);
   gp_Pnt2d pd2(UFirst,VLast), pf2(ULast,VLast);
 
 //=======================================================================
 //function : CompleteData
-//purpose  : Calcule la surface les courbes et eventuellement les
-//           CommonPoints a partir des donnees calculees dans 
-//           ComputeData.
+//purpose  : Calculates the surface of curves and eventually 
+//           CommonPoints from the data calculated in ComputeData.
 //
-//  11/08/1996 : Utilisation de F(t)
+//  11/08/1996 : Use of F(t)
 //
 //=======================================================================
 
 
 //=======================================================================
 //function : CompleteData
-//purpose  : Nouvelle surcharge pour les fonctions surf/rst
+//purpose  : New overload for functions surf/rst
 // jlr le 28/07/97 branchement F(t)
 //=======================================================================
 
                               myConti);  
  if (!approx.IsDone()) {
 #ifdef DEB
-    cout << "Approximation non faite !!!" << endl;
+    cout << "Approximation is not done!" << endl;
 #endif  
     return Standard_False;
   }
 
 //=======================================================================
 //function : CompleteData
-//purpose  : Nouvelle surcharge pour les fonctions rst/rst
+//purpose  : New overload for functions rst/rst
 // jlr le 28/07/97 branchement F(t)
 //=======================================================================
 
 
 //=======================================================================
 //function : StoreData
-//purpose  : Recopie d un resultat d approx dans une SurfData.
+//purpose  : Copy of an approximation result in SurfData.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::StoreData(Handle(ChFiDS_SurfData)& Data,
                                           const Standard_Boolean Gf2,
                                           const Standard_Boolean Reversed)
 {
-  // Petits outils pour les controles.
+  // Small control tools.
   static Handle(GeomAdaptor_HCurve) checkcurve;
   if(checkcurve.IsNull()) checkcurve = new GeomAdaptor_HCurve();
   GeomAdaptor_Curve& chc = checkcurve->ChangeCurve();
   }
 
   TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
-  // On rend l espace parametric de la surface carre a defaut de pouvoir
-  // parametrer en U par # R*teta // a revoir lbo 29/08/97
+  // By default parametric space is created using a square surface
+  // to be able to parameterize in U by # R*teta // a revoir lbo 29/08/97
   const TColStd_Array1OfReal& ku = approx.SurfUKnots();
   const TColStd_Array1OfReal& kv = approx.SurfVKnots();
   Standard_Real larg = (kv(kv.Upper())-kv(kv.Lower()));
                            kku,kv,
                            approx.SurfUMults(),approx.SurfVMults(),
                            approx.UDegree(),approx.VDegree());
-// prolongement de la surface 
+// extension of the surface 
 
   Standard_Real length1,length2;
   length1=Data->FirstExtensionValue();
   Standard_Integer ion1 = 1, ion2 = 2;
   if(Reversed) { Uon1 = ULast; Uon2 = UFirst; ion1 = 2; ion2 = 1; }
   
-  // On remplit la SurfData pour ce qui concerne S1,
+  // The SurfData is filled in what concerns S1,
   Handle(Geom_Curve) Crv3d1 = Surf->UIso(Uon1);
   gp_Pnt2d pori1(Uon1,0.);
   gp_Lin2d lfil1(pori1,gp::DY2d());
    
  if(!ChFi3d_CheckSameParameter(checkcurve,PCurveOnFace,S1,tolC1,tolcheck)){
 #ifdef DEB
-   cout<<"tol approx sous evaluee : "<<tolC1<<" pour "<<tolcheck<<endl;
+   cout<<"aaproximate tolerance under-valued : "<<tolC1<<" for "<<tolcheck<<endl;
 #endif 
     tolC1 = tolcheck;
   }
   else TraOn1 = ChFi3d_TrsfTrans(lin->TransitionOnS1());
   Fint1.SetInterference(Index1OfCurve,TraOn1,PCurveOnFace,PCurveOnSurf);
   
-  // on remplit la SurfData pour ce qui concerne S2,
+  // SurfData is filled in what concerns S2,
   Handle(Geom_Curve) Crv3d2 = Surf->UIso(Uon2);
   gp_Pnt2d pori2(Uon2,0.);
   gp_Lin2d lfil2(pori2,gp::DY2d());
     chc.Load(Crv3d2,par1,par2);
    if(!ChFi3d_CheckSameParameter(checkcurve,PCurveOnFace,S2,tolC2,tolcheck)){
 #ifdef DEB
-      cout<<"tol approx sous evaluee : "<<tolC2<<" pour "<<tolcheck<<endl;
+      cout<<"approximate tolerance under-evaluated : "<<tolC2<<" for "<<tolcheck<<endl;
 #endif 
       tolC2 = tolcheck;
     }
       (Index2OfCurve,TopAbs_FORWARD,bidpc,PCurveOnSurf);
   }
 
-  // on calcule l orientation du conge par rapport aux faces,
+  // the orientation of the fillet in relation to the faces is evaluated,
 
   Handle(Adaptor3d_HSurface) Sref = S1;
   PCurveOnFace = Fint1.PCurveOnFace();
   if(!Gf2 && !S2.IsNull())
     ChFi3d_FilCommonPoint(lin->EndPointOnSecond(),lin->TransitionOnS2(),
                          Standard_False, Data->ChangeVertex(0,ion2),tolC2);
-  // Les parametres sur l ElSpine
+  // Parameters on ElSpine
   Standard_Integer nbp = lin->NbPoints();
   Data->FirstSpineParam(lin->Point(1).Parameter());
   Data->LastSpineParam(lin->Point(nbp).Parameter());
 
 //=======================================================================
 //function : ComputeData
-//purpose  : Chapeau du cheminement edge/face pour le contournement
-//           d obstacle.
+//purpose  : Head of the path edge/face for the bypass of obstacle.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::ComputeData
 #else
   Standard_Integer Nbpnt;
 #endif
-  // on recadre la solution de depart a la demande.
+  // the initial solution is reframed if necessary.
   math_Vector ParSol(1,3);
   Standard_Real NewFirst = PFirst;
   if(RecP || RecS || RecRst){
                                    tolesp,TolGuide,RecRst,RecP,RecS,
                                    NewFirst,ParSol)){
 #ifdef DEB
-      cout<<"ChFi3d_Builder::ComputeData : echec calcul first section"<<endl;
+      cout<<"ChFi3d_Builder::ComputeData : calculation fail first section"<<endl;
 #endif
       return Standard_False;
     }
 
     if (!TheWalk.IsDone()) {
 #ifdef DEB
-      cout << "Cheminement non fait" << endl;
+      cout << "Path not created" << endl;
 #endif  
       return Standard_False;
     }
     if (reverse) {
       if (!TheWalk.Complete(Func,FInv,FInvP,FInvC,SpLast)) {
 #ifdef DEB
-       cout << "Complement non fait" << endl;
+       cout << "Not completed" << endl;
 #endif
       }
     }  
     if (Nbpnt <= 1 && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+      cout <<"one point of the path MS/50 is attempted."<<endl;
 #endif  
       MS = MS/50.; Target = Targetsov;
     }
     else if (Nbpnt<=nbptmin && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+      cout <<"Number of points is too small, the step is reduced"<<endl;
 #endif  
       Standard_Real u1 = Lin->Point(1).Parameter();
       Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
     }
     else if(Nbpnt<=nbptmin){
 #ifdef DEB
-      cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+      cout <<"Number of points is still too small, quit"<<endl;
 #endif  
       return Standard_False;
     }
 
 //=======================================================================
 //function : ComputeData
-//purpose  : Chapeau du cheminement edge/edge pour le contournement
-//           d obstacle.
+//purpose  : Heading of the path edge/edge for the bypass of obstacle.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::ComputeData
 #else
   Standard_Integer Nbpnt;
 #endif
-  // on recadre la solution de depart a la demande.
+  // the initial solution is reframed if necessary.
   math_Vector ParSol(1,2);
   Standard_Real NewFirst = PFirst;
   if (RecP1 || RecRst1 || RecP2 || RecRst2) {
                                     tolesp, TolGuide, RecRst1, RecP1, RecRst2, RecP2,
                                     NewFirst, ParSol)){
 #ifdef DEB
-      cout<<"ChFi3d_Builder::ComputeData : echec calcul first section"<<endl;
+      cout<<"ChFi3d_Builder::ComputeData : fail calculation first section"<<endl;
 #endif
       return Standard_False;
     }
 
     if (!TheWalk.IsDone()) {
 #ifdef DEB
-      cout << "Cheminement non fait" << endl;
+      cout << "Path not done" << endl;
 #endif  
       return Standard_False;
     }
     if (reverse) {
       if (!TheWalk.Complete(Func, FInv1, FInvP1, FInv2, FInvP2, SpLast)) {
 #ifdef DEB
-       cout << "Complement non fait" << endl;
+       cout << "Not completed" << endl;
 #endif
       }
     }  
     if (Nbpnt <= 1 && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+      cout <<"one point of path MS/50 is attempted."<<endl;
 #endif  
       MS = MS/50.; Target = Targetsov;
     }
     else if (Nbpnt<=nbptmin && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+      cout <<"Number of points is too small, the step is reduced"<<endl;
 #endif  
       Standard_Real u1 = Lin->Point(1).Parameter();
       Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
     }
     else if(Nbpnt<=nbptmin){
 #ifdef DEB
-      cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+      cout <<"Number of points is still too small, quit"<<endl;
 #endif  
       return Standard_False;
     }
 
 //=======================================================================
 //function : SimulData
-//purpose  : Chapeau du cheminement edge/face pour le contournement
-//           d obstacle en mode simulation.
+//purpose  : Heading of the path edge/face for the bypass of obstacle in simulation mode.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::SimulData
 #else
   Standard_Integer Nbpnt; 
 #endif
-  // on recadre la solution de depart a la demande.
+  // the starting solution is reframed if needed.
   math_Vector ParSol(1,3);
   Standard_Real NewFirst = PFirst;
   if(RecP || RecS || RecRst){
                                    NewFirst,ParSol)){
 #ifdef DEB
 
-      cout<<"ChFi3d_Builder::SimulData : echec calcul first section"<<endl;
+      cout<<"ChFi3d_Builder::SimulData : fail calculate first section"<<endl;
 #endif
       return Standard_False;
     }
                     MS,TolGuide,ParSol,tolesp,Fleche,Appro);
     if (!TheWalk.IsDone()) {
 #ifdef DEB
-      cout << "Cheminement non fait" << endl;
+      cout << "Path not done" << endl;
 #endif
       return Standard_False;
     }
     if (reverse) {
       if (!TheWalk.Complete(Func,FInv,FInvP,FInvC,SpLast)) {
 #ifdef DEB
-       cout << "Complement non fait" << endl;
+       cout << "Not completed" << endl;
 #endif
       }
     }  
     if (Nbpnt <= 1 && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+      cout <<"one point of path MS/50 is attempted."<<endl;
 #endif
       MS = MS/50.; Target = Targetsov;
     }
     else if (Nbpnt <= NbSecMin && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+      cout <<"Number of points is too small, the step is reduced"<<endl;
 #endif
       Standard_Real u1 = Lin->Point(1).Parameter();
       Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
     }
     else if(Nbpnt<=NbSecMin){
 #ifdef DEB
-      cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+      cout <<"Number of points is still too small, quit"<<endl;
 #endif
       return Standard_False;
     }
 
 //=======================================================================
 //function : SimulData
-//purpose  : Chapeau du cheminement edge/edge pour le contournement
-//           d obstacle en mode simulation.
+//purpose  : Heading of path edge/edge for the bypass
+//           of obstacle in simulation mode.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::SimulData
 #else
   Standard_Integer Nbpnt; 
 #endif
-  // on recadre la solution de depart a la demande.
+  // The initial solution is reframed if necessary.
   math_Vector ParSol(1,2);
   Standard_Real NewFirst = PFirst;
   if (RecP1 || RecRst1 || RecP2 || RecRst2) {
                                    NewFirst,ParSol)){
 #ifdef DEB
 
-      cout<<"ChFi3d_Builder::SimulData : echec calcul first section"<<endl;
+      cout<<"ChFi3d_Builder::SimulData : calculation fail first section"<<endl;
 #endif
       return Standard_False;
     }
                     MS, TolGuide, ParSol, tolesp, Fleche, Appro);
     if (!TheWalk.IsDone()) {
 #ifdef DEB
-      cout << "Cheminement non fait" << endl;
+      cout << "Path not created" << endl;
 #endif
       return Standard_False;
     }
     if (reverse) {
       if (!TheWalk.Complete(Func, FInv1, FInvP1, FInv2, FInvP2, SpLast)) {
 #ifdef DEB
-       cout << "Complement non fait" << endl;
+       cout << "Not completed" << endl;
 #endif
       }
     }  
     if (Nbpnt <= 1 && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+      cout <<"only one point of path MS/50 is attempted."<<endl;
 #endif
       MS = MS/50.; Target = Targetsov;
     }
     else if (Nbpnt <= NbSecMin && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+      cout <<"Number of points is too small, the step is reduced"<<endl;
 #endif
       Standard_Real u1 = Lin->Point(1).Parameter();
       Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
     }
     else if(Nbpnt<=NbSecMin){
 #ifdef DEB
-      cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+      cout <<"Number of points is still too small, quit"<<endl;
 #endif
       return Standard_False;
     }
 
 //=======================================================================
 //function : ComputeData
-//purpose  : Construction d un conge elementaire par cheminement.
+//purpose  : Construction of elementary fillet by path.
 //
 //=======================================================================
 
  const Standard_Boolean RecOnS1,
  const Standard_Boolean RecOnS2)
 {
-  //Les prolongements en cas de sortie des deux domaines sont faits
-  //de facon directe et non plus par cheminement ( trop hasardeux ).
+  //The extrensions are created in case of output of two domains
+  //directly and not by path ( too hasardous ).
   Data->FirstExtensionValue(0);
   Data-> LastExtensionValue(0);
 
-  //On recupere les faces eventuelles pour les tests de saut d edge.
+  //The eventual faces are restored to test the jump of edge.
   TopoDS_Face F1, F2;
   Handle(BRepAdaptor_HSurface) HS = Handle(BRepAdaptor_HSurface)::DownCast(S1); 
   if(!HS.IsNull()) F1 = HS->ChangeSurface().Face();
   HS = Handle(BRepAdaptor_HSurface)::DownCast(S2); 
   if(!HS.IsNull()) F2 = HS->ChangeSurface().Face();
   
-  // Variables d'encadrement du cheminement
+  // Path framing variables
   Standard_Real TolGuide=tolguide, TolEsp = tolesp;
   Standard_Integer nbptmin = 4;
 
   BRepBlend_Walking TheWalk(S1,S2,I1,I2);
 
-  //Debut du carnage, on eteint les controles 2d du cheminement
-  //qui s'accomodent mal des surfaces a parametrages non homogenes
-  //en u et en v.
+  //Start of removal, 2D path controls 
+  //that qui s'accomodent mal des surfaces a parametrages non homogenes
+  //en u et en v are extinguished.
   TheWalk.Check2d(0);
   
   Standard_Real MS = MaxStep;
   Standard_Real SpFirst = HGuide->FirstParameter();
   Standard_Real SpLast =  HGuide->LastParameter();
 
-  // Lorsque le point de depart est interne, on chemine 
-  // d abord a gauche afin de determiner le Last pour les
-  // periodiques.
+  // When the start point is inside, the path goes first to the left  
+  // to determine the Last for the periodicals.
   Standard_Boolean reverse = (!Forward || Inside);
   Standard_Real Target;
   if(reverse){
     if(!intl) Target = Last;
   }
 
-  // Dans le cas de singularite pre-determinee,
-  // on en informe le cheminement
+  // In case if the singularity is pre-determined,
+  // the path is indicated.
   if (!Spine.IsNull()){
     if (Spine->IsTangencyExtremity(Standard_True)) {
       TopoDS_Vertex V = Spine->FirstVertex();
     }
   }
 
-  //On recadre la solution de depart a la demande.
+  //The starting solution is reframed if necessary.
   //**********************************************//
   math_Vector ParSol(1,4);
   Standard_Real NewFirst = PFirst;
                                    tolesp,TolGuide,RecOnS1,RecOnS2,
                                    NewFirst,ParSol)){
 #ifdef DEB
-      cout<<"ChFi3d_Builder::ComputeData : echec calcul first section"<<endl;
+      cout<<"ChFi3d_Builder::ComputeData : calculation fail first section"<<endl;
 #endif
       return Standard_False;
     }
     ParSol = Soldep;
   }
 
-  //On calcule d abord la partie valide, sans souci des prolongements.
+  //First the valid part is calculate, without caring for the extensions.
   //******************************************************************//
   Standard_Integer again = 0;
   Standard_Boolean tchernobyl = 0;
   Standard_Real u1sov, u2sov;
 #endif
   TopoDS_Face bif;
-  //Un pas max coherent, mais grand, on compte sur la fleche pour detecter
-  //les vrillages.
+  //Max step is relevant, but too great, the vector is required to detect
+  //the twists.
   if( (Abs(Last-First) <= MS * 5.) &&
       (Abs(Last-First) >= 0.01*Abs(NewFirst-Target)) ){ 
     MS = Abs(Last-First)*0.2; 
   }
 
   while(again < 3){
-    //On chemine. 
+    //Path. 
     if(!again && (MS < 5*TolGuide)) MS = 5*TolGuide;
     else {
       if (5*TolGuide > MS) TolGuide = MS/5;
                    ParSol,TolEsp,Fleche,Appro);
     if (!TheWalk.IsDone()) {
 #ifdef DEB
-      cout << "Cheminement non fait" << endl;
+      cout << "Path is not created" << endl;
 #endif
       return Standard_False;
     }
     if (Inside)  complmnt = TheWalk.Complete(Func,FInv,SpLast);
     if(!complmnt){
 #ifdef DEB
-      cout << "Complement non fait" << endl;
+      cout << "Not completed" << endl;
 #endif
       return Standard_False;
     }
     
-    //On controle le resultat avec deux criteres :
-    //- y a-t-il assez de points,
-    //- est-on alle assez loin.
+    //The result is controlled using two criterions :
+    //- if there is enough points,
+    //- if one has gone far enough.
     Nbpnt = Lin->NbPoints();
     if (Nbpnt == 0){
 #ifdef DEB
-      cout <<"0 point de cheminement on sort."<<endl;
+      cout <<"0 point of path, quit."<<endl;
 #endif
       return Standard_False;
     }
       okfin = (narc1 > 0 || narc2 > 0 || (Last-lpointpar) < 10*TolGuide);
     }
     if(!okdeb || !okfin || Nbpnt == 1){
-      //Ca frotte, on eteint les controles on espere evaluer un pas max
-      //satisfaisant, et on serre les fesses!!!. Si c est deja fait on
-      //sort.
+      //It drags, the controls are extended, it is  expected to evaluate a
+      //satisfactory maximum step. If it already done, quit.
       if(tchernobyl){
 #ifdef DEB
-       cout <<"Ca frotte meme sans controle, on sort."<<endl;
+       cout <<"If it drags without control, quit."<<endl;
 #endif
        return Standard_False;
       }
       TheWalk.Check(0);
       if (Nbpnt == 1){
 #ifdef DEB
-       cout <<"1 seul point de cheminement on essaye MS/100"<<endl;
-       cout <<"et on eteint les controles."<<endl;
+       cout <<"only one point of path MS/100 is attempted"<<endl;
+       cout <<"and the controls are extended."<<endl;
 #endif
        MS *= 0.01;
       }
       else{
 #ifdef DEB
-       cout <<"Ca frotte on eteint les controles."<<endl;
+       cout <<"It drags, the controls are extended."<<endl;
 #endif
        MS = (lpointpar-fpointpar)/Nbpnt; //EvalStep(Lin);
       }
     else if (Nbpnt < nbptmin){
       if(again == 0){
 #ifdef DEB
-       cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+       cout <<"Number of points is too small, the step is reduced"<<endl;
 #endif
        u1sov = fpointpar;
        u2sov = lpointpar;
        if(Abs(fpointpar-u1sov)>=TolGuide || 
           Abs(lpointpar-u2sov)>=TolGuide){
 #ifdef DEB
-         cout <<"Nombre de points encore insuffisant on reduit le pas"<<endl;
+         cout <<"Number of points is still too small, the step is reduced"<<endl;
 #endif  
          MS = (lpointpar - fpointpar) * factor;
        }
        else{
 #ifdef DEB
-         cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+         cout <<"Number of points is still too small, quit"<<endl;
 #endif  
          return Standard_False;
        }
   if(TheWalk.TwistOnS1()){
     Data->TwistOnS1(Standard_True);
 #ifdef DEB
-    cout<<"Cheminement complet mais VRILLE sur S1"<<endl;
+    cout<<"Path completed, but TWIST on S1"<<endl;
 #endif
   }
   if(TheWalk.TwistOnS2()){
     Data->TwistOnS2(Standard_True);
 #ifdef DEB
-    cout<<"Cheminement complet mais VRILLE sur S2"<<endl;
+    cout<<"Parh completed, but TWIST on S2"<<endl;
 #endif
   }
 
 
-  //Ici on a un resultat plus ou moins presentable mais qui recouvre 
-  //la zone minimum visee.
-  //On attaque les prolongements.
+  //Here there is a more or less presentable result 
+  //however it covers a the minimum zone.
+  //The extensions are targeted.
   //*****************************//
 
   Gd1 = Gd2 = Gf1 = Gf2 = Standard_False;
                            Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
       debarc1 = Standard_True;
       if(!SearchFace(Spine,Data->VertexFirstOnS1(),F1,bif)){
-       //On regarde si ce n'est pas un obstacle.
+       //It is checked if there is not an obstacle.
        debcas1 = Standard_True;
        if(!Spine.IsNull()){
          if(Spine->IsPeriodic()){
                            Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
       debarc2 = Standard_True;
       if(!SearchFace(Spine,Data->VertexFirstOnS2(),F2,bif)){
-       //On regarde si ce n'est pas un obstacle.
+       //It is checked if it is not an obstacle.
        debcas2 = Standard_True;
        if(!Spine.IsNull()){
          if(Spine->IsPeriodic()){
     if(oncontinue) {
       TheWalk.ClassificationOnS1(!debarc1);
       TheWalk.ClassificationOnS2(!debarc2);
-      TheWalk.Check2d(Standard_True); // Il faut etre severe (PMN)
+      TheWalk.Check2d(Standard_True); // It should be strict (PMN)
       TheWalk.Continu(Func,FInv,Target);
       TheWalk.ClassificationOnS1(Standard_True);
       TheWalk.ClassificationOnS2(Standard_True);
                                Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
          debarc1 = Standard_True;
          if(!SearchFace(Spine,Data->VertexFirstOnS1(),F1,bif)){
-           //On regarde si ce n'est pas un obstacle.
+           //It is checked if it is not an obstacle.
            debcas1 = Standard_True;
 //         if(!Spine.IsNull()) {
 //           if(Spine->IsPeriodic()){
                                 Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
           debarc2 = Standard_True;
           if(!SearchFace(Spine,Data->VertexFirstOnS2(),F2,bif)){
-            //On regarde si ce n'est pas un obstacle.
+           //It is checked if it is not an obstacle.
             debcas2 = Standard_True;
 //             if(!Spine.IsNull()){
 //               if(Spine->IsPeriodic()){
                            Standard_False, Data->ChangeVertexLastOnS1(),tolesp);
       finarc1 = Standard_True;
       if(!SearchFace(Spine,Data->VertexLastOnS1(),F1,bif)){
-       //On regarde si ce n'est pas un obstacle.
+             //It is checked if it is not an obstacle.
        fincas1 = Standard_True;
        if(!Spine.IsNull()){
          finobst1 = IsObst(Data->VertexLastOnS1(),
                            Standard_False, Data->ChangeVertexLastOnS2(),tolesp);
       finarc2 = Standard_True;
       if(!SearchFace(Spine,Data->VertexLastOnS2(),F2,bif)){
-       //On regarde si ce n'est pas un obstacle.
+        //It is checked if it is not an obstacle.
        fincas2 = Standard_True;
        if(!Spine.IsNull()){
          finobst2 = IsObst(Data->VertexLastOnS2(),
     if(oncontinue){
       TheWalk.ClassificationOnS1(!finarc1);
       TheWalk.ClassificationOnS2(!finarc2);
-      TheWalk.Check2d(Standard_True); // Il faut etre severe (PMN)
+      TheWalk.Check2d(Standard_True); // It should be strict (PMN)
       TheWalk.Continu(Func,FInv,Target);
       TheWalk.ClassificationOnS1(Standard_True);
       TheWalk.ClassificationOnS2(Standard_True);
                                Standard_False, Data->ChangeVertexLastOnS1(),tolesp);
          finarc1 = Standard_True;
          if(!SearchFace(Spine,Data->VertexLastOnS1(),F1,bif)){
-           //On regarde si ce n'est pas un obstacle.
+             //It is checked if it is not an obstacle.
            fincas1 = Standard_True;
 //         if(!Spine.IsNull()){
 //           finobst1 = IsObst(Data->VertexLastOnS1(),
     Gd1 = debcas1/* && !debobst1*/; // skv(occ67)
     Gd2 = debcas2/* && !debobst2*/; // skv(occ67)
     if ((debarc1^debarc2) && !unseulsuffitdeb && (First!=SpFirst)) {
-      // Cas de cheminement incomplet, cela finit surement mal : 
-      // on tronque le resultat au lieu de sortie.
+      // Case of incomplete path, of course this ends badly : 
+      // the result is truncated instead of exit.
       Standard_Real sortie;
       Standard_Integer ind;
       if (debarc1)  sortie = Data->VertexFirstOnS1().Parameter();
       || backwContinueFailed; // eap
     else if (intf && unseulsuffitdeb && (intf<5)) {
       intf = (Gd1 || Gd2);
-      // On controle qu'il n'y pas de nouvelle face.
+      // It is checked if there is no new face.
       if (intf && 
          ((!debcas1 && debarc1) || (!debcas2 && debarc2)) ) intf = 0;  
     }
     Gf1 = fincas1/* && !finobst1*/; // skv(occ67)
     Gf2 = fincas2/* && !finobst2*/; // skv(occ67)
     if ((finarc1 ^finarc2) && !unseulsuffitfin && (Last!=SpLast)) {
-      // Cas de cheminement incomplet, cela finit surement mal : 
-      // on tronque le resultat au lieu de sortie.
+      // Case of incomplete path, of course, this ends badly : 
+      // the result is truncated instead of exit.
       Standard_Real sortie;
       Standard_Integer ind;
       if (finarc1)  sortie = Data->VertexLastOnS1().Parameter();
       }
     }
     else if ((intl>=5) && !finarc1 && !finarc2 && (Last!=SpLast) ) {
-      // Idem dans le cas ou toute la "Lin" constitue un prolongement
+      // The same in case when the entire "Lin" is an extension
       Standard_Real sortie = (First+2*Last)/3;
       Standard_Integer ind;
       if (Last - sortie > tolesp) {
     if (intl && !unseulsuffitfin) intl = (Gf1 && Gf2)//;
       || forwContinueFailed;  // eap
     else if (intl && unseulsuffitfin && (intl<5)) {
-      intl = (Gf1 || Gf2);// On controle qu'il n'y pas de nouvelle face.
+      intl = (Gf1 || Gf2);// It is checked if there is no new face.
       if (intl && 
          ((!fincas1 && finarc1) || (!fincas2 && finarc2)) ) intl = 0;  
     }
                                    tolesp,TolGuide,RecOnS1,RecOnS2,
                                    NewFirst,ParSol)){
 #ifdef DEB
-      cout<<"ChFi3d_Builder::SimulData : echec calcul first section"<<endl;
+      cout<<"ChFi3d_Builder::SimulData : calculation fail first section"<<endl;
 #endif
       return Standard_False;
     }
   }
   Standard_Integer again = 0;
   while(again < 3){
-    // Lorsque le point de depart est interne, on chemine 
-    // d abord a gauche afin de determiner le Last pour les
-    // periodiques.
+     // When the start point is inside, the path goes first to the left  
+     // to determine the Last for the periodicals.
     if(!again && (MS < 5*TolGuide)) MS = 5*TolGuide;
     else  {
       if (5*TolGuide > MS) TolGuide = MS/5;
     
     if (!TheWalk.IsDone()) {
 #ifdef DEB
-      cout << "Cheminement non fait" << endl;
+      cout << "Path not created" << endl;
 #endif
       return Standard_False;
     }
       if (Inside)  complmnt = TheWalk.Complete(Func,FInv,SpLast);
       if(!complmnt){
 #ifdef DEB
-       cout << "Complement non fait" << endl;
+       cout << "Not completed" << endl;
 #endif
        return Standard_False;
       }
     Standard_Real factor =  1./(NbSecMin + 1);
     if (Nbpnt == 0){
 #ifdef DEB
-      cout <<"0 point de cheminement on sort."<<endl;
+      cout <<"0 point of path, quit."<<endl;
 #endif
       return Standard_False;
     }
     else if (Nbpnt == 1 && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"1 seul point de cheminement on essaye MS/100."<<endl;
+      cout <<"only one point of path, MS/100 is attempted."<<endl;
 #endif
       MS *= 0.01; Target = Targetsov;
       u1sov = u2sov = Lin->Point(1).Parameter();
     else if (Nbpnt< NbSecMin && again == 0)  {
       again++;
 #ifdef DEB
-      cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+      cout <<"Number of points is too small, the step is reduced"<<endl;
 #endif
       Standard_Real u1 = u1sov = Lin->Point(1).Parameter();
       Standard_Real u2 = u2sov = Lin->Point(Nbpnt).Parameter();
       if(Abs(u1-u1sov)>=TolGuide || Abs(u2-u2sov)>=TolGuide){
        again++;
 #ifdef DEB
-       cout <<"Nombre de points encore insuffisant on reduit le pas"<<endl;
+       cout <<"Number of points is still too small, the step is reduced"<<endl;
 #endif
        MS /= 100;
        Target = Targetsov;
       }
       else{
 #ifdef DEB
-       cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+       cout <<"Number of points is still too small, quit"<<endl;
 #endif
        return Standard_False;
       }
     }
     else if(Nbpnt < NbSecMin){
 #ifdef DEB
-      cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+      cout <<"Number of points is still too small, quit"<<endl;
 #endif
       return Standard_False;
     }
 
 
 //=======================================================================
 //function : Update
-//purpose  : Calcul de l intersection entre la face en bout et la ligne
-//           de tangence pour mise a jour du CommonPoint et de son
-//           parametre dans la FaceInterference.
+//purpose  : Calculate the intersection of the face at the end of 
+//           the tangency line to update CommonPoint and its 
+//           parameter in FaceInterference.
 //=======================================================================
 
 static Standard_Boolean Update(Handle(Adaptor3d_HSurface)& fb,
                               Standard_Real&            wop)
 {
   IntCurveSurface_HInter Intersection;
-  //verifier que dans les  KPart les bornes de la ligne de tangence
-  //sont deja en place a ce stade.
-  //Modif de lvt : on recadre les cas periodiques surtout si on a rien trouve.
+  //check if in KPart the limits of the tangency line 
+  //are already in place at this stage.
+  //Modif lvt : the periodic cases are reframed, espercially if nothing was found.
   Standard_Real w,uf = ct->FirstParameter(),ul = ct->LastParameter();
 #ifndef DEB
   Standard_Real  wbis = 0.;
                                           gp_Pnt2d&                     FprolUV,
                                           Standard_Real&                c3dU)
 {
-  // rajouter ici des criteres plus ou moins restrictifs pour
-  // decider si on fait l intersection avec la face en bout
-  // etendue ou si on aiguille sur bouchon.
+  // add more or less restrictive criterions to
+  // decide if the intersection is done with the face at 
+  // extended end or if the end is sharp.
   Standard_Real uf = FIop.FirstParameter();
   Standard_Real ul = FIop.LastParameter();
   Handle(GeomAdaptor_HCurve) Hc3df;
 
 //=======================================================================
 //function : Update
-//purpose  : Calcul de l extrema curveonsurf/curveonsurf pour privilegier
-//           les valeurs concernant la trace on surf et la pcurve sur la
-//           face en bout.
+//purpose  : Calculate the extrema curveonsurf/curveonsurf to prefer 
+//           the values concerning the trace on surf and the pcurve on the
+//           face at end.
 //=======================================================================
 
 static Standard_Boolean Update(Handle(Adaptor3d_HSurface)& face,
 
 //=======================================================================
 //function : ComputeCurve2d
-//purpose  : calcule le 2d de la courbe Ct sur la face Face
+//purpose  : calculate the 2d of the curve Ct on face Face
 //=======================================================================
 
 static void  ComputeCurve2d (Handle(Geom_Curve )& Ct,
 }
 //=======================================================================
 //function : PerformOneCorner
-//purpose  : Calcul d un coin a trois aretes incidentes et un conge
-//           incident.
-//           3 cas distincts : (22/07/94 seul le 1er est traite)
+//purpose  : Calculate a corner with three edges and a fillet.
+//           3 separate case: (22/07/94 only 1st is implemented)
 //
-//           - meme concavite sur les trois edges, intersection avec la
-//             face en bout,
-//           - concavite des 2 edges de sortie opposee a celle du conge,
-//             si la face en bout s y prete, idem cas 1 sur face etendue,
-//             sinon on fait un petit bouchon avec GeomFill,
-//           - un seul edge de sortie de concavite opposee a celle du
-//             conge et du troisieme edge, on relie le sommet au coin
-//             dans le vide du conge et on bouche, soit en agrandissant
-//             la face en bout si celle ci est plane et orthogonale a
-//             l edge guide, soit par un bouchon type GeomFill.
+//           - same concavity on three edges, intersection with the
+//             face at end,
+//           - concavity of 2 outgoing edges is opposite to the one of the fillet,
+//             if the face at end is ready for that, the same in  case 1 on extended face,
+//             otherwise a small cap is done with GeomFill,
+//           - only one outgoing edge has concavity opposed to the edge of the
+//             fillet and the third edge, the top of the corner is reread
+//             in the empty of the fillet and closed, either by extending the face 
+//             at end if it is plane and orthogonal to the
+//             guiding edge, or by a cap of type GeomFill.
 //
 //           <thePrepareOnSame> means that only needed thing is redefinition
 //           of intersection pameter of OnSame-Stripe with <Arcprol>
   TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
 
 #ifdef DEB
-  OSD_Chronometer ch;// init perf pour PerformSetOfKPart
+  OSD_Chronometer ch;// init perf for PerformSetOfKPart
 #endif
-  // le sommet,
+  // the top,
   const TopoDS_Vertex& Vtx = myVDataMap.FindKey(Index);
-  // On recupere le conge concerne,
+  // The fillet is returned,
   ChFiDS_ListIteratorOfListOfStripe StrIt;
   StrIt.Initialize(myVDataMap(Index));
   if ( ! ChFi3d_SelectStripe (StrIt, Vtx, thePrepareOnSame)) return;
   const Handle(ChFiDS_Spine) spine = stripe->Spine();
   ChFiDS_SequenceOfSurfData& SeqFil =
     stripe->ChangeSetOfSurfData()->ChangeSequence();
-  // la SurfData en cause et ses CommonPoints,
+  // SurfData and its CommonPoints,
   Standard_Integer sens = 0;
 
-  // Choisit la bonne SurfData
+  // Choose proper SurfData
   Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
   Standard_Boolean isfirst = (sens == 1);
   if (isfirst) {
     for (; num<SeqFil.Length() && (
         (SeqFil.Value(num)->IndexOfS1()==0) ||
         (SeqFil.Value(num)->IndexOfS2()==0) ); ) {
-      SeqFil.Remove(num); // On elimine le surplus
+      SeqFil.Remove(num); // The surplus is removed
     }
   }
   else {
    for (; num>1 && (
         (SeqFil.Value(num)->IndexOfS1()==0) ||
         (SeqFil.Value(num)->IndexOfS2()==0) ); ) {
-     SeqFil.Remove(num);// On elimine le surplus
+     SeqFil.Remove(num);// The surplus is removed
      num--;
     }
   }
   Handle(ChFiDS_SurfData)& Fd = SeqFil.ChangeValue(num);
   ChFiDS_CommonPoint& CV1 = Fd->ChangeVertex(isfirst,1);
   ChFiDS_CommonPoint& CV2 = Fd->ChangeVertex(isfirst,2);
-  //Pour evaluer la boule des nouveaux points.
+  //To evaluate the new points.
   Bnd_Box box1,box2;
 
-  // On traite separement les cas bouchon des cas intersection.
+  // The cases of cap and intersection are processed separately.
   // ----------------------------------------------------------
   ChFiDS_State stat;
   if (isfirst) stat = spine->FirstStatus();
     if (!CV1.IsOnArc() && !CV2.IsOnArc())
       Standard_Failure::Raise("Corner OnSame : no point on arc");
     else if (CV1.IsOnArc() && CV2.IsOnArc()) {
-      // on explore pour detromper les KPart qui seraient sortis
-      // au diable.
-      Standard_Boolean sur1 = 0, sur2 = 0;
+       Standard_Boolean sur1 = 0, sur2 = 0;
       for(ex.Init(CV1.Arc(),TopAbs_VERTEX); ex.More(); ex.Next()) {
        if (Vtx.IsSame(ex.Current())) {
          sur1 = 1;
     Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
     Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
     TopTools_ListIteratorOfListOfShape It;
-    // On recupere la face en bout sans controle de son unicite.
+    // The face at end is returned without check of its unicity.
     for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
       if (!Fad.IsSame(It.Value())) {
        Fv = TopoDS::Face(It.Value());
       }
     }
 
-    // est-ce que la face en bout contient le Vertex ?
+    // Does the face at bout contain the Vertex ?
     Standard_Boolean isinface = Standard_False;
     for (ex.Init(Fv,TopAbs_VERTEX); ex.More(); ex.Next()) {
       if (ex.Current().IsSame(Vtx)) {
       Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
       Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
       //TopTools_ListIteratorOfListOfShape It;
-      // On recupere la face en bout sans controle de son unicite.
+     // The face at end is returned without check of its unicity.
       for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
        if (!Fad.IsSame(It.Value())) {
          Fv = TopoDS::Face(It.Value());
     }
 
     if (Fv.IsNull()) StdFail_NotDone::Raise
-      ("OneCorner : face en bout non trouvee");
+      ("OneCorner : face at end not found");
 
     Fv.Orientation(TopAbs_FORWARD);
     Fad.Orientation(TopAbs_FORWARD);
     Fop.Orientation(TopAbs_FORWARD);
 
-    // On recupere de meme l edge qui sera a prolonger.
+    // The edge that will be extended is returned.
     for(It.Initialize(myVEMap(Vtx));It.More() && Arcprol.IsNull();It.Next()) {
       if (!Arcpiv.IsSame(It.Value())) {
        for(ex.Init(Fv,TopAbs_EDGE); ex.More(); ex.Next()) {
     Bad.Initialize(Fad);
     Bop.Initialize(Fop);
   }
-  //dans le cas OnSame on va devoir modifier le CommonPoint
-  //dans le vide et son parametre dans la FaceInterference.
-  //On les recupere donc tous deux dans des references
-  //non const. Attention les modifs se font dans le dos
+  //in case of OnSame it is necessary to modify the CommonPoint
+  //in the empty and its parameter in the FaceInterference.
+  //They are both returned in non const references. Attention the modifications are done behind
   //de CV1,CV2,Fi1,Fi2.
   ChFiDS_CommonPoint& CPopArc = Fd->ChangeVertex(isfirst,IFopArc);
   ChFiDS_FaceInterference& FiopArc = Fd->ChangeInterference(IFopArc);
   ChFiDS_CommonPoint& CPadArc = Fd->ChangeVertex(isfirst,IFadArc);
   ChFiDS_FaceInterference& FiadArc = Fd->ChangeInterference(IFadArc);
-  //on initialise le parametre du vertex en l air a la valeur de son
-  //copain d en face (point sur arc).
+  //the parameter of the vertex in the air is initialiced with the value of 
+  //its opposite (point on arc).
   Standard_Real wop = Fd->ChangeInterference(IFadArc).Parameter(isfirst);
   Handle(Geom_Curve) c3df;
   Handle(GeomAdaptor_HSurface)
     Udeb = Cc->FirstParameter();
     Ufin = Cc->LastParameter();
 
-    // on determine si la courbe a une intersection avec l'arete de couture
+    //  determine if the curve has an intersection with edge of sewing
 
     ChFi3d_Couture(Fv,couture,edgecouture);
 
   stripe->SetIndexPoint(ChFi3d_IndexPointInDS(CV2,DStr),isfirst,2);
 
   if (!intcouture) {
-// il n'y a pas d'intersection avec l'arete de couture
-// on stocke la courbe Cc dans la stripe
-// le stockage dans la DS se fera par FILDS.
+// there is no intersection with the sewing edge
+// the curve Cc is stored in the stripe
+// the storage in the DS is not done by FILDS.
 
     TopOpeBRepDS_Curve Tc(Cc,tolreached);
     ICurve = DStr.AddCurve(Tc);
     stripe->SetParameters(isfirst,Udeb,Ufin);
   }
   else {
-// on stocke les courbes curv1 et curv2 dans la DS
-// ces courbes ne seront pas reconstruites par FILDS car
-// on met stripe->InDS(isfirst);
+// curves curv1 are curv2 stored in the DS
+// these curves will not be reconstructed by FILDS as
+// one places stripe->InDS(isfirst);
 
-    // interferences de curv1 et curv2 sur Fv
+    // interferences of curv1 and curv2 on Fv
     ComputeCurve2d(curv1,Fv,c2d1);
     Handle(TopOpeBRepDS_SurfaceCurveInterference) InterFv;
     InterFv = ChFi3d_FilCurveInDS(Icurv1,IShape,c2d1,Et);
     ComputeCurve2d(curv2,Fv,c2d2);
     InterFv = ChFi3d_FilCurveInDS(Icurv2,IShape,c2d2,Et);
     DStr.ChangeShapeInterferences(IShape).Append(InterFv);
-     // interferences de curv1 et curv2 sur Isurf
+     // interferences of curv1 and curv2 on Isurf
     if (Fd->Orientation()== Fv.Orientation()) Et=TopAbs::Reverse(Et);
     c2d1=new Geom2d_TrimmedCurve(Ps,Udeb,par2);
     InterFv = ChFi3d_FilCurveInDS(Icurv1,Isurf,c2d1,Et);
        InterFv = ChFi3d_FilCurveInDS(Icurv2,Isurf,c2d2,Et);
     DStr.ChangeSurfaceInterferences(Isurf).Append(InterFv);
 
-      // limitation de l'arete de couture
+      // limitation of the sewing edge
     Standard_Integer Iarc=DStr.AddShape(edgecouture);
     Handle(TopOpeBRepDS_CurvePointInterference) Interfedge;
     TopAbs_Orientation ori;
     Interfedge = ChFi3d_FilPointInDS(ori,Iarc,indpt,par1);
     DStr.ChangeShapeInterferences(Iarc).Append(Interfedge);
 
-    // creation des CurveInterferences de Icurv1 et Icurv2
+    // creation of CurveInterferences from Icurv1 and Icurv2
     stripe->InDS(isfirst);
     Standard_Integer ind1= stripe->IndexPoint(isfirst,1);
     Standard_Integer ind2= stripe->IndexPoint(isfirst,2);
 
   if (onsame && inters) {
     // VARIANT 1:
-    // On rajoute le petit bout de courbe qui manque pour l extension
-    // de la face en bout et la limitation de la face opposee.
+    // A small missing end of curve is added for the extension
+    // of the face at end and the limitation of the opposing face.
 
     //   VARIANT 2 : extend Arcprol, not create new small edge
     //   To do: modify for intcouture
     const Standard_Boolean variant1 = Standard_True;
 
-    // Tout d abord on coupe les ponts avec l arete de la spine.
+    // First of all the ponts are cut with the edge of the spine.
     Standard_Integer IArcspine = DStr.AddShape(Arcspine);
     Standard_Integer IVtx = DStr.AddShape(Vtx);
 #ifndef DEB
       interfv = ChFi3d_FilVertexInDS(OVtx,IArcspine,IVtx,parVtx);
     DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
 
-    // On construit maintenant les courbes qui manquent.
+    // Now the missing curves are constructed.
     TopoDS_Vertex V2;
     for(ex.Init(Arcprol.Oriented(TopAbs_FORWARD),TopAbs_VERTEX);
        ex.More(); ex.Next()) {
     TopOpeBRepDS_Curve Zob(zob3d,tolreached);
     Standard_Integer IZob = DStr.AddCurve(Zob);
 
-// on determine si Fop a une arete de couture
-// on determine si la courbe a une intersection avec l'arete de couture
+// it is determined if Fop has an edge of sewing 
+// it is determined if the curve has an intersection with the edge of sewing
 
     //TopoDS_Edge edgecouture;
     //Standard_Boolean couture;
     }
     if (intcouture) {
 
-// interference de curv1 et curv2 sur Ishape
+// interference of curv1 and curv2 on Ishape
       Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolv));
       ComputeCurve2d(curv1,Fop,c2d1);
       Handle(TopOpeBRepDS_SurfaceCurveInterference)
       InterFv = ChFi3d_FilCurveInDS(Icurv2,IShape,/*zob2dv*/c2d2,Et);
       DStr.ChangeShapeInterferences(IShape).Append(InterFv);
 
-      // limitation de l'arete de couture
+      // limitation of the sewing edge
       Standard_Integer Iarc=DStr.AddShape(edgecouture);
       Handle(TopOpeBRepDS_CurvePointInterference) Interfedge;
       TopAbs_Orientation ori;
       Interfedge = ChFi3d_FilPointInDS(ori,Iarc,indpt,par1);
       DStr.ChangeShapeInterferences(Iarc).Append(Interfedge);
 
-    //  interference de curv1 et curv2 sur Iop
+    //  interference of curv1 and curv2 on Iop
       Standard_Integer Iop = DStr.AddShape(Fop);
       Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolop));
       Handle(TopOpeBRepDS_SurfaceCurveInterference)  Interfop;
 
 //=======================================================================
 //function : cherche_face
-//purpose  : recherche  de la face F  appartenant a la map , differente des faces
-//           F1  F2 F3 et contenant l'edge E
+//purpose  : find face F belonging to the map, different from faces
+//           F1  F2 F3 and containing edge E
 //=======================================================================
 
 static void cherche_face (const TopTools_ListOfShape & map,
 
 //=======================================================================
 //function : cherche_edge1
-//purpose  : cherche l'edge commune entre les faces F1 et F2
+//purpose  : find common edge between faces F1 and F2
 //=======================================================================
 
 static void cherche_edge1 (const TopoDS_Face & F1,
 
 //=======================================================================
 //function : containV
-//purpose  : renvoie vrai si le vertex V appartient a F1
+//purpose  : return true if vertex V belongs to F1
 //=======================================================================
 
 static Standard_Boolean  containV(const TopoDS_Face & F1,
 
 //=======================================================================
 //function : containE
-//purpose  : renvoie vrai si le l'edge  E appartient a F1
+//purpose  : return true if edge E belongs to F1
 //=======================================================================
 
 static Standard_Boolean  containE(const TopoDS_Face & F1,
 void ChFi3d_Builder::PerformIntersectionAtEnd(const Standard_Integer Index)
 {
 
-  //intersection en bout d'un conge avec au moins deux faces
-  // traite les cas suivants:
-  // - sommet a n (n>3) aretes adjacentes
-  // - sommet a 3 aretes dont le conge sur une des aretes arrive sur plus
-  //   d'une face
+  // intersection at end of fillet with at least two faces
+  // process the following cases:
+  // - top has n (n>3) adjacent edges
+  // - top has 3 edges and fillet on one of edges touches
+  //   more than one face
 
 #ifdef DEB
   OSD_Chronometer ch;// init perf
   //Standard_Integer sense;
   TopoDS_Edge edgelibre1,edgelibre2,EdgeSpine;
   Standard_Boolean bordlibre;
-  // determination du nombre de faces et d'aretes
+  // determine the number of faces and edges
   TopTools_Array1OfShape tabedg(0,nn);
   TopoDS_Face F1,F2;
   Standard_Integer nface=ChFi3d_nbface(myVFMap(Vtx));
   ChFi3d_ChercheBordsLibres(myVEMap,Vtx,bordlibre,edgelibre1,edgelibre2);
   if (bordlibre) nbarete=(nbarete-2)/2 +2;
   else           nbarete=nbarete/2;
-  // on determine s'il y a une arete de couture, l'arete de couture
-  // et la face qui a une arete de couture
+  // it is determined if there is an edge of sewing and it face
 
   TopoDS_Face facecouture;
   TopoDS_Edge edgecouture;
     if (couture)
       facecouture=fcur;
   }
-  // on determine si l'une des aretes adjacente au conge est reguliere
+  // it is determined if one of edges adjacent to the fillet is regular
   Standard_Boolean reg1,reg2;
   TopoDS_Edge Ecur,Eadj1,Eadj2;
   TopoDS_Face Fga,Fdr;
     reg2=isTangentFaces(Eadj2,Fga,Fdr);
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:58:24 2001 End
 
-// on cherche les deux faces communes a l'edge
+// two faces common to the edge are found
     if (reg1 || reg2) {
       Standard_Boolean compoint1=Standard_False;
       Standard_Boolean compoint2=Standard_False;
       }
     }
   }
-// on a une seule face en bout  si FindFace est vrai et si la face
-// n'est pas la face avec arete de couture
+// there is only one face at end if FindFace is true and if the face
+// is not the face with sewing edge
   TopoDS_Face face;
   Handle(ChFiDS_SurfData) Fd = SeqFil.ChangeValue(num);
   ChFiDS_CommonPoint& CV1 = Fd->ChangeVertex(isfirst,1);
     SDprev = SeqFil(num1);
     IsurfPrev = SDprev->Surf();
   }
-  // calcul de l' orientation  orcourbe  des courbes en bout
+  // calculate the orientation of curves at end
 
   Standard_Real tolpt=1.e-4;
   Standard_Real tolreached;
   }
 
   /***********************************************************************/
-  //  recherche des faces a intersecter avec le conge et des edges servant
-  // a limiter ces intersections
-  //  nbface est le nb de faces a intersecter, Face[i] contient les faces
-  // a intersecter (i=0.. nbface-1). Edge[i] contient les edges limitant
-  // les intersections (i=0 ..nbface)
+  //  find faces intersecting with the fillet and edges limiting intersections
+  //  nbface is the nb of faces intersected, Face[i] contais the faces
+  // to intersect (i=0.. nbface-1). Edge[i] contains edges limiting
+  // the intersections (i=0 ..nbface)
   /**********************************************************************/
 
   Standard_Integer nb = 1,nbface;
   Edge[nbface]=CV2.Arc();
   tabedg.SetValue(0,Edge[0]);
   tabedg.SetValue(nbface,Edge[nbface]);
-  // traitement d'un conge arrivant sur un vertex
-  // l'edge contenue dans CV.Arc n'est pas forcement la bonne
-  // on cherche l'edge concernee par l'intersection
+  // processing of a fillet arriving on a vertex
+  // edge contained in CV.Arc is not inevitably good
+  // the edge concerned by the intersection is found
 
   Standard_Real dist1,dist2;
   if (CV1.IsVertex()) {
     }
   }
   if (!onecorner) {
-    // Lorsqu'il y a une arete de regularite les faces adjacentes a l'edge
-    // ne sont pas dans Fd->IndexOfS1 ou Fd->IndexOfS2
+    // If there is a regular edge, the faces adjacent to it 
+    // are not in Fd->IndexOfS1 or Fd->IndexOfS2
 
 //     TopoDS_Face Find1 ,Find2;
 //     if (isfirst)
 //       }
 //     }
 
-    // si nface =3 on a un sommet a trois arete avec un conge incident
-    // dont les commons points sont sur des faces differentes
-    // sinon on est dans le cas d'un sommet  a plus de 3 aretes
+    // if nface =3 there is a top with 3 edges and a fillet 
+    // and their common points are on different faces 
+    // otherwise there is a case when a top has more than 3 edges
 
     if (nface==3) {
       if (CV1.IsVertex ()) findonf1=Standard_True;
        }
       }
 
-      // findonf1 findonf2 indiquent si F1 et ou F2 sont adajacentes
-      // a plusieurs faces en bout
-      // on determine ces faces en bout ainsi que les edges concernees par
-      // les intersections
+      // findonf1 findonf2 show if F1 and/or F2 are adjacent
+      // to many faces at end
+      // the faces at end and intersected edges are found
 
       if (findonf1 && !isOnSame1) {
        if (CV1.TransitionOnArc()==TopAbs_FORWARD)
          cherche_edge1(Face[nb-1],Face[nb],Edge[nb]);
          nb++;
          if (nb>=nn) Standard_Failure::Raise
-           ("IntersectionAtEnd : nb de faces limites atteint");
+           ("IntersectionAtEnd : the max number of faces reached");
        }
        if (!findonf2)  Edge[nb]=CV2.Arc();
       }
          cherche_edge1(Face[nb-1],Face[nb],Edge[nb]);
          nb++;
          if (nb>=nn) Standard_Failure::Raise
-           ("IntersectionAtEnd : nb de faces limites atteint");
+           ("IntersectionAtEnd : the max number of faces reached");
        }
        Edge[nb]=CV2.Arc();
       }
 
     else {
 
-//  on est dans le cas d'un sommet a plus de trois aretes
-//  on determine les faces et les aretes concernees
+//  this is the case when a top has more than three edges
+//  the faces and edges concerned are found
       Standard_Boolean /*trouve,*/possible1, possible2;
       trouve = possible1 = possible2 = Standard_False;
       TopExp_Explorer ex;
        return;
       }
       if (nbarete==4) {
-       // si deux edges consecutives sont G1 on a une seule face d'intersection
+       // if two consecutive edges are G1 there is only one face of intersection
        Standard_Real ang1=0.0;
         TopoDS_Vertex Vcom;
         trouve=Standard_False;
   Standard_Boolean extend=Standard_False;
   Handle(Geom_Surface) Sfacemoins1,Sface;
   /***************************************************************************/
-  // calcul de l'intersection  entre le conge et chaque face
-  // et stockage dans la DS
+  // calculate intersection of the fillet and each face
+  // and storage in the DS
   /***************************************************************************/
   for (nb=1;nb<=nbface;nb++) {
     prolface[nb-1]=0;
     Handle(Geom_Curve) cint;
     Handle(Geom2d_Curve) C2dint1, C2dint2,cface,cfacemoins1;
 
-    //////////////////////////////////////////////////////////////////////
-    // determination des intersections entre les  edges et le conge
-    // pour trouver les limitations des intersections face - conge
-    //////////////////////////////////////////////////////////////////////
+    ///////////////////////////////////////////////////////
+    // determine intersections of edges and the fillet
+    // to find limitations of intersections face - fillet
+    ///////////////////////////////////////////////////////
 
     if (nb==1) {
       Hc1 = BRep_Tool::CurveOnSurface(Edge[0],Face[0],Ubid,Ubid);
       }
       else {
         if (Hc1.IsNull()) {
-          // on a pas  trouve de courbe 2d . On etend Sfacemoins1  et on y projette
+          // curve 2d not found. Sfacemoins1 is extended and projection is done there
           // CV1.Point ()
           ChFi3d_ExtendSurface(Sfacemoins1,prolface[0]);
           if (prolface[0]) {
     else {
       Hc2 = BRep_Tool::CurveOnSurface(E2,Face[nbface-1],Ubid,Ubid);
       if (Hc2.IsNull()) {
-        // on a pas trouve de courbe 2d ,  on etend Sfacemoins1
-        // on y projette CV2.Point()
+        // curve 2d is not found,  Sfacemoins1 is extended CV2.Point() is projected there
 
         ChFi3d_ExtendSurface(Sfacemoins1,prolface[0]);
         if (prolface[0]) {
     if (prolface[nb-1]) Bs.Initialize(faceprol[nb-1]);
     else                Bs.Initialize(Face[nb-1]);
 
-    // decalage des parametres s'ils ne sont pas dans
-    // la meme periode
+    // offset of parameters if they are not in the same period
 
     // commented by eap 30 May 2002 occ354
     // the following code may cause trimming a wrong part of periodic surface
 
 
     //////////////////////////////////////////////////////////////////////
-    // calcul des intersections face - conge
+    // calculate intersections face - fillet
     //////////////////////////////////////////////////////////////////////
 
     if (!ChFi3d_ComputeCurves(HGs,HBs,Pardeb,Parfin,Cc,
       PerformMoreThreeCorner (Index,1);
       return;
     }
-    // stockage des informations  dans la structure de donnees
+    // storage of information in the data structure
 
-    // eval tolerances
+    // evaluate tolerances
     p1=Cc->FirstParameter();
     p2=Cc->LastParameter();
     Standard_Real to1,to2;
 
 
     //////////////////////////////////////////////////////////////////////
-    // stokage dans la DS de la courbe d'intersection
+    // storage in the DS of the intersection curve
     //////////////////////////////////////////////////////////////////////
 
     Standard_Boolean Isvtx1=0;
     DStr.ChangeCurveInterferences(indcurve[nb-1]).Append(Interfp2);
 
     //////////////////////////////////////////////////////////////////////
-    // stockage pour la face
+    // storage for the face
     //////////////////////////////////////////////////////////////////////
 
 #ifndef DEB
     orface=Face[nb-1].Orientation();
     if (orface==orsurfdata ) orien = TopAbs::Reverse(orcourbe);
     else                     orien = orcourbe ;
-    // limitation des edges des faces
+    // limitation of edges of faces
     if (nb==1) {
       Standard_Integer Iarc1= DStr.AddShape(Edge[0]);
       Interfedge[0]= ChFi3d_FilPointInDS(CV1.TransitionOnArc(),Iarc1,
 
 //=======================================================================
 //function : PerformMoreSurfdata
-//purpose  :  determine les intersections en bout sur plusieurs
-//            surfdata
+//purpose  :  determine intersections at end on several surfdata
 //=======================================================================
 void ChFi3d_Builder::PerformMoreSurfdata(const Standard_Integer Index)
 {
 }
 //  Modified by Sergey KHROMOV - Thu Apr 11 12:23:40 2002 End
 
-//=======================================================================
+//==============================================================
 //function : FindFace
-//purpose  : attention ne marche que si une seule face en commun entre
-//           P1,P2,V
+//purpose  : attention it works only if there is only one common face 
+//           between P1,P2,V
 //===========================================================
 
 
 {
   if (P1.IsVertex() || P2.IsVertex()) {
 #ifdef DEB
-    cout<<"changement de face sur vertex plantatoire"<<endl;
+    cout<<"change of face on vertex"<<endl;
 #endif
   }
   if (!(P1.IsOnArc() && P2.IsOnArc())) {
   }
 #ifdef DEB
   if(!ContainsV){
-    cout<<"FindFace : l extremite de la spine n est pas dans la face en bout"<<endl;
+    cout<<"FindFace : the extremity of the spine is not in the end face"<<endl;
   }
 #endif
   return Found;
 
 //=======================================================================
 //function : MoreSurfdata
-//purpose  :  detecte si l'intersection en bout concerne plusieurs Surfdata
+//purpose  : detects if the intersection at end concerns several Surfdata
 //=======================================================================
 Standard_Boolean ChFi3d_Builder::MoreSurfdata(const Standard_Integer Index) const
 {
-  // l'intersection en bout se fait sur plusieurs surfdata si :
-  // -le nb de surfdata concernant le vertex est superieur a 1 .
-  // -et si l'avant derniere surfdata a un de ses commonpoints sur un des
-  // deux arcs qui constituent les intersections de la face en bout et du conge
+  // intersection at end is created on several surfdata if :
+  // - the number of surfdata concerning the vertex is more than 1.
+  // - and if the last but one surfdata has one of commonpoints on one of 
+  // two arcs, which constitute the intersections of the face at end and of the fillet
 
   ChFiDS_ListIteratorOfListOfStripe It;
   It.Initialize(myVDataMap(Index));
   TopoDS_Face Fv;
   Standard_Boolean inters,oksurf;
   nbsurf= stripe->SetOfSurfData()->Length();
-  // Fv est la face en bout
+  // Fv is the face at end
   inters = FindFace(Vtx,CV1,CV2,Fv);
   if (sens==1)  {
     num1=1;
 
   if (nbsurf!=1 && inters) {
 
-    // determination de arc1 et arc2 intersection du conge et de la face en bout
+    // determination of arc1 and arc2 intersection of the fillet and the face at end
 
     TopoDS_Edge arc1,arc2;
     TopTools_ListIteratorOfListOfShape ItE;
 }
 
 
-//Cas des conges sur sommet a 4 aretes avec une aretes sur la meme geometrie que l'arete du conge
+//Case of fillets on top with 4 edges, one of them is on the same geometry as the edgeof the fillet
 
 
 void ChFi3d_Builder::IntersectMoreCorner(const Standard_Integer Index)
 #ifdef DEB
   OSD_Chronometer ch;// init perf pour PerformSetOfKPart
 #endif
-  // On recupere le conge concerne,
+  // The fillet is returned,
   ChFiDS_ListIteratorOfListOfStripe StrIt;
   StrIt.Initialize(myVDataMap(Index));
   Handle(ChFiDS_Stripe) stripe = StrIt.Value();
   const Handle(ChFiDS_Spine) spine = stripe->Spine();
   ChFiDS_SequenceOfSurfData& SeqFil =
     stripe->ChangeSetOfSurfData()->ChangeSequence();
-  // le sommet,
+  // the top,
   const TopoDS_Vertex& Vtx = myVDataMap.FindKey(Index);
-  // la SurfData en cause et ses CommonPoints,
+  // the SurfData concerned and its CommonPoints,
   Standard_Integer sens = 0;
 
-  // Choisit la bonne SurfData
+  // Choose the proper SurfData
   Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
   Standard_Boolean isfirst = (sens == 1);
   if (isfirst) {
     for (; num<SeqFil.Length() && (
         (SeqFil.Value(num)->IndexOfS1()==0) ||
         (SeqFil.Value(num)->IndexOfS2()==0) ); ) {
-      SeqFil.Remove(num); // On elimine le surplus
+      SeqFil.Remove(num); // The surplus is removed
     }
   }
   else {
    for (; num>1 && (
         (SeqFil.Value(num)->IndexOfS1()==0) ||
         (SeqFil.Value(num)->IndexOfS2()==0) ); ) {
-     SeqFil.Remove(num);// On elimine le surplus
+     SeqFil.Remove(num);// The surplus is removed
      num--;
     }
   }
   Handle(ChFiDS_SurfData)& Fd = SeqFil.ChangeValue(num);
   ChFiDS_CommonPoint& CV1 = Fd->ChangeVertex(isfirst,1);
   ChFiDS_CommonPoint& CV2 = Fd->ChangeVertex(isfirst,2);
-  //Pour evaluer la boule des nouveaux points.
+  //To evaluate the cloud of new points.
   Bnd_Box box1,box2;
 
-  // On traite separement les cas bouchon des cas intersection.
+  // The cases of cap are processed separately from intersection.
   // ----------------------------------------------------------
 
   TopoDS_Face Fv,Fad,Fop,Fopbis;
     if(!CV1.IsOnArc() && !CV2.IsOnArc())
       Standard_Failure::Raise("Corner intersmore : no point on arc");
     else if(CV1.IsOnArc() && CV2.IsOnArc()){
-      // on explore pour detromper les KPart qui seraient sortis
-      // au diable.
       Standard_Boolean sur1 = 0, sur2 = 0;
       for(ex.Init(CV1.Arc(),TopAbs_VERTEX); ex.More(); ex.Next()){
        if(Vtx.IsSame(ex.Current())) {
     Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
     Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
     TopTools_ListIteratorOfListOfShape It;
-    // On recupere la face en bout sans controle de son unicite.
+    // The face at end is returned without control of its unicity.
     for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
       if(!Fad.IsSame(It.Value())){
        Fv = TopoDS::Face(It.Value());
       }
     }
 
-    // est-ce que la face en bout contient le Vertex ?
+    // does the face at end contain the Vertex ?
     Standard_Boolean isinface = Standard_False;
     for (ex.Init(Fv,TopAbs_VERTEX); ex.More(); ex.Next()){
       if (ex.Current().IsSame(Vtx)) {
       Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
       Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
       //TopTools_ListIteratorOfListOfShape It;
-      // On recupere la face en bout sans controle de son unicite.
-      for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
+    // The face at end is returned without control of its unicity.
+     for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
        if(!Fad.IsSame(It.Value())){
          Fv = TopoDS::Face(It.Value());
          break;
     }
 
     if(Fv.IsNull()) StdFail_NotDone::Raise
-      ("OneCorner : face en bout non trouvee");
+      ("OneCorner : face at end is not found");
 
     Fv.Orientation(TopAbs_FORWARD);
     Fad.Orientation(TopAbs_FORWARD);
 
-    // On recupere de meme l edge qui sera a prolonger.
+    // In the same way the edge to be extended is returned.
     for(It.Initialize(myVEMap(Vtx));It.More() && Arcprol.IsNull();It.Next()){
       if(!Arcpiv.IsSame(It.Value())){
        for(ex.Init(Fv,TopAbs_EDGE); ex.More(); ex.Next()){
       }
     }
 
-    //Fopbis est la face contenant la trace du conge dont le CP.Arc() ne contient pas Vtx.
-    //Normalement soit Fobis est la meme que Fop (cylindre), soit Fobis est G1 avec Fop.
+    //Fopbis is the face containing the trace of fillet CP.Arc() which of does not contain Vtx.
+    //Normallly Fobis is either the same as Fop (cylinder), or Fobis is G1 with Fop.
     Fopbis.Orientation(TopAbs_FORWARD);
 
-    //on appelle Fop la 4eme face inutilisee du vertex
+    //Fop calls the 4th face non-used for the vertex
     cherche_face(myVFMap(Vtx),Arcprol,Fad,Fv,Fv,Fopbis);
     Fop.Orientation(TopAbs_FORWARD);
 
     if(Arcprol.IsNull()) StdFail_NotDone::Raise
-      ("OneCorner : edge a prolonger non trouve");
+      ("OneCorner : edge to be extended is not found");
     for(ex.Init(Fopbis,TopAbs_EDGE); ex.More(); ex.Next()){
       if(Arcprol.IsSame(ex.Current())) {
        OArcprolop = ex.Current().Orientation();
     Bad.Initialize(Fad);
     Bop.Initialize(Fop);
   }
-  // on va devoir modifier le CommonPoint
-  //dans le vide et son parametre dans la FaceInterference.
-  //On les recupere donc tous deux dans des references
-  //non const. Attention les modifs se font dans le dos
-  //de CV1,CV2,Fi1,Fi2.
+  // it is necessary to modify the CommonPoint
+  // in the space and its parameter in FaceInterference.
+  // So both of them are returned in references
+  // non const. Attention the modifications are done behind
+  // CV1,CV2,Fi1,Fi2.
   ChFiDS_CommonPoint& CPopArc = Fd->ChangeVertex(isfirst,IFopArc);
   ChFiDS_FaceInterference& FiopArc = Fd->ChangeInterference(IFopArc);
   ChFiDS_CommonPoint& CPadArc = Fd->ChangeVertex(isfirst,IFadArc);
   ChFiDS_FaceInterference& FiadArc = Fd->ChangeInterference(IFadArc);
-  //on initialise le parametre du vertex en l air a la valeur de son
-  //copain d en face (point sur arc).
+  // the parameter of the vertex is initialized with the value 
+  // of its opposing vertex (point on arc).
   Standard_Real wop = Fd->ChangeInterference(IFadArc).Parameter(isfirst);
   Handle(Geom_Curve) c3df;
   Handle(GeomAdaptor_HSurface)
   gp_Pnt2d p2dbout;
   {
 
-    // rajouter ici des criteres plus ou moins restrictifs pour
-    // decider si on fait l intersection avec la face en bout
-    // etendue ou si on aiguille sur bouchon.
+    // add here more or less restrictive criteria to
+    // decide if the intersection with face is done at the
+    // extended end or if there will be a cap on sharp end.
     c3df = DStr.Curve(FiopArc.LineIndex()).Curve();
     Standard_Real uf = FiopArc.FirstParameter();
     Standard_Real ul = FiopArc.LastParameter();
 //  if(!inters && BRep_Tool::Continuity(Arcprol,Fv,Fop) != GeomAbs_C0){
     if(!inters && isTangentFaces(Arcprol,Fv,Fop)){
 //  Modified by Sergey KHROMOV - Fri Dec 21 18:08:29 2001 End
-      // Arcprol etant une arete de tangence on tente un
-      // ultime rattrappage par un  extrema curve/curve.
+      // Arcprol is an edge of tangency, ultimate adjustment by an extrema curve/curve is attempted.
       Standard_Real ff,ll;
       Handle(Geom2d_Curve) gpcprol = BRep_Tool::CurveOnSurface(Arcprol,Fv,ff,ll);
       Handle(Geom2dAdaptor_HCurve) pcprol = new Geom2dAdaptor_HCurve(gpcprol);
     if (!ChFi3d_ComputeCurves(HGs,HBs,Pardeb,Parfin,Cc,
                              Ps,
                              Pc,tolesp,tol2d,tolreached))
-    Standard_Failure::Raise("OneCorner : echec calcul intersection");
+    Standard_Failure::Raise("OneCorner : failed calculation intersection");
 
     Udeb = Cc->FirstParameter();
     Ufin = Cc->LastParameter();
 
-    // on determine si la courbe a une intersection avec l'arete de couture
+    // check if the curve has an intersection with sewing edge
 
     ChFi3d_Couture(Fv,couture,edgecouture);
 
   }
 
   else{
-    Standard_NotImplemented::Raise("OneCorner : bouchon non ecrit");
+    Standard_NotImplemented::Raise("OneCorner : cap not written");
   }
   Standard_Integer IShape = DStr.AddShape(Fv);
 #ifndef DEB
   stripe->SetIndexPoint(ChFi3d_IndexPointInDS(CV2,DStr),isfirst,2);
 
   if (!intcouture) {
-// il n'y a pas d'intersection avec l'arete de couture
-// on stocke la courbe Cc dans la stripe
-// le stockage dans la DS se fera par FILDS.
+// there is no intersection with edge of sewing
+// curve Cc is stored in the stripe
+// the storage in the DS is done by FILDS.
 
     TopOpeBRepDS_Curve Tc(Cc,tolreached);
     ICurve = DStr.AddCurve(Tc);
     stripe->SetParameters(isfirst,Udeb,Ufin);
    }
   else {
-// on stocke les courbes curv1 et curv2 dans la DS
-// ces courbes ne seront pas reconstruites par FILDS car
-// on met stripe->InDS(isfirst);
+// curves curv1 and curv2 are stored in the DS
+// these curves are not reconstructed by FILDS as
+// stripe->InDS(isfirst) is placed;
 
-    // interferences de curv1 et curv2 sur Fv
+    // interferences of curv1 and curv2 on Fv
     ComputeCurve2d(curv1,Fv,c2d1);
     Handle(TopOpeBRepDS_SurfaceCurveInterference) InterFv;
     InterFv = ChFi3d_FilCurveInDS(Icurv1,IShape,c2d1,Et);
     ComputeCurve2d(curv2,Fv,c2d2);
     InterFv = ChFi3d_FilCurveInDS(Icurv2,IShape,c2d2,Et);
     DStr.ChangeShapeInterferences(IShape).Append(InterFv);
-     // interferences de curv1 et curv2 sur Isurf
+     // interferences of curv1 and curv2 on Isurf
     if (Fd->Orientation()== Fv.Orientation()) Et=TopAbs::Reverse(Et);
     c2d1=new Geom2d_TrimmedCurve(Ps,Udeb,par2);
     InterFv = ChFi3d_FilCurveInDS(Icurv1,Isurf,c2d1,Et);
        InterFv = ChFi3d_FilCurveInDS(Icurv2,Isurf,c2d2,Et);
     DStr.ChangeSurfaceInterferences(Isurf).Append(InterFv);
 
-      // limitation de l'arete de couture
+      // limitation of the sewing edge
     Standard_Integer Iarc=DStr.AddShape(edgecouture);
     Handle(TopOpeBRepDS_CurvePointInterference) Interfedge;
     TopAbs_Orientation ori;
     Interfedge = ChFi3d_FilPointInDS(ori,Iarc,indpt,par1);
     DStr.ChangeShapeInterferences(Iarc).Append(Interfedge);
 
-    // creation des CurveInterferences de Icurv1 et Icurv2
+    // creation of CurveInterferences from Icurv1 and Icurv2
     stripe->InDS(isfirst);
     Standard_Integer ind1= stripe->IndexPoint(isfirst,1);
     Standard_Integer ind2= stripe->IndexPoint(isfirst,2);
   if( inters){
 //
 
-    // On rajoute le petit bout de courbe qui manque pour l extension
-    // de la face en bout et la limitation de la face opposee.
+    // The small end of curve missing for the extension
+    // of the face at end and the limitation of the opposing face is added.
 
-    // Tout d abord on coupe les ponts avec l arete de la spine.
+    // Above all the points cut the points with the edge of the spine.
     Standard_Integer IArcspine = DStr.AddShape(Arcspine);
     Standard_Integer IVtx = DStr.AddShape(Vtx);
     TopAbs_Orientation OVtx2;
     DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
 
 
-    //Modif de lvt pour trouver la suite de Arcprol dans l'autre face
+    //Modif of lvt to find the suite of Arcprol in the other face
     {
       TopTools_ListIteratorOfListOfShape It;
       for (It.Initialize(myVEMap(Vtx)); It.More(); It.Next()){
        }
       }
     }
-    //fin de modif
+    //end of modif
 
-    // On construit maintenant les courbes qui manquent.
+    //Now the missing curves are constructed.
     for(ex.Init(Arcprolbis.Oriented(TopAbs_FORWARD),TopAbs_VERTEX);
        ex.More(); ex.Next()){
       if(Vtx.IsSame(ex.Current())) {
        break;
       }
     }
-// on determine si Fop a une arete de couture
+// it is checked if Fop has a sewing edge
 
 //     TopoDS_Edge edgecouture;
 //     Standard_Boolean couture;
     TopOpeBRepDS_Curve Zob(zob3d,tolreached);
     Standard_Integer IZob = DStr.AddCurve(Zob);
 
-    // on ne determine pas si la courbe a une intersection avec l'arete de couture
+    // it is not determined if the curve has an intersection with the sewing edge
 
 
     {
 
 
 //=======================================================================
 //function : PerformTwoCornerbyInter
-//purpose  : Effectue un PerformTwoCorner par intersection.
-//           Dans le cas Biseau on utilise pour tous les cas le 
-//           cheminement biparam/biparam; on reapproxime alors la courbe
-//           3d et les 2 pcurves .
+//purpose  : Performs PerformTwoCorner by intersection.
+//           In case of Biseau for all cases the 
+//           path is used; 3D curve and 2 pcurves are approximated.
 //=======================================================================
 
 Standard_Integer ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer Index)
   const TopoDS_Vertex& Vtx = myVDataMap.FindKey(Index);
   TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
 
-  //On extrait les informations necessaires sur les conges 
+  //Information on fillets is extracted 
   //------------------------------------------------------
 
-  //le premier
+  //the first
   //----------
   ChFiDS_ListIteratorOfListOfStripe It;
   It.Initialize(myVDataMap(Index));
     Corner1->ChangeSetOfSurfData()->ChangeSequence();
   Handle(ChFiDS_SurfData)& Fd1 = SeqFil1.ChangeValue(IFd1);
 
-  //le deuxieme
+  //the second
   //----------
   It.Next();
   Handle(ChFiDS_Stripe)& Corner2 = It.Value(); 
     Corner2->ChangeSetOfSurfData()->ChangeSequence();
   Handle(ChFiDS_SurfData)& Fd2 = SeqFil2.ChangeValue(IFd2);
 
-  // On analyse les concavites, dans le cas de concavites differentes, 
-  // prevoir un raccord evolutif du type ThreeCorner de R vers 0.
-  // Sinon on recherche la face en vis a vis 
-  // et l intersection  eventuelle des 2 pcurves sur cette face.
+  // The concavities are analysed in case of differents concavities, 
+  // preview an evolutionary connection of type ThreeCorner of R to 0.
+  // Otherwise the opposite face  
+  // and the eventual intersection of 2 pcurves on this face are found.
 
   ChFiDS_State Stat1,Stat2;
   Standard_Boolean isfirst1 = (Sens1 == 1);
     return done;
   }
   if (!OkinterCC) {
-     // On calcule l'intersection des pcurves sans les restreindre par les 
-    // common point
+     // The intersection of pcurves is calculated without restricting them by  
+    // common points.
     OkinterCC= ChFi3d_IsInFront(DStr,Corner1,Corner2,IFd1,IFd2,Sens1,Sens2,
                                 UIntPC1,UIntPC2,FaCo,SameSide,
                                 IFaCo1,IFaCo2,Okvisavis,Vtx,Standard_True,1);
   
   if (!Okvisavis) {
 #if DEB
-    cout<<"TwoCorner : pas de face commune"<<endl;
+    cout<<"TwoCorner : no common face"<<endl;
 #endif
     done=Standard_False;
     return done;
   }   
   if (!OkinterCC) {
 #if DEB
-    cout<<"biseau : echec intersection des lignes de tangence sur face commune"<<endl;
+    cout<<"biseau : failed intersection of tangency lines on common face"<<endl;
 #endif
     done=Standard_False;
     return done;
   }
   Standard_Integer IFaArc1 = 3-IFaCo1, IFaArc2 = 3-IFaCo2;
   
-  // On verifie que les conges ont bien un commonpoint sur un arc commun.
-  // Cet edge est le pivot du biseau ou de la rotule.
+  // It is checked if the fillets have a commonpoint on a common arc.
+  // This edge is the pivot of the bevel or of the kneecap.
   
   ChFiDS_CommonPoint& CP1 = Fd1->ChangeVertex(isfirst1,IFaArc1);
   ChFiDS_CommonPoint& CP2 = Fd2->ChangeVertex(isfirst2,IFaArc2);
 
   if (!CP1.IsOnArc() || !CP2.IsOnArc()) {
 #if DEB
-    cout<<"echec 1 des 2 conges n est pas sur arc"<<endl;
+    cout<<"fail 1 of 2 fillets are not on arc"<<endl;
 #endif
     done=Standard_False;
     return done;
   if ( ! CP1.Arc().IsSame( CP2.Arc()) ) {
     // look like OnSame + OnDiff case (eap, Arp 9 2002, occ266)
 #if DEB
-    cout<<"PerformTwoCornerbyInter(): conges ne sont pas sur la meme arc"<<endl;
+    cout<<"PerformTwoCornerbyInter(): fillets are not on the same arc"<<endl;
 #endif
     done = Standard_True;
     PerformMoreThreeCorner(Index, 2);
     }
   }
   if(!ok1 || !ok2){
-    //On est dans un contexte merdique
 #if DEB
-    cout<<"echec une des surfaces n a pas de face d appui commune avec l edge pivot"<<endl;
+    cout<<"fail one of surfaces has no common base face with the pivot edge"<<endl;
 #endif
     done=Standard_False;
     return done;
   Handle(Geom_Curve) Gc;
   
   if(sameparam) {
-    // Du cote face commune, calcul de Pardeb.
+    // Side common face, calculation of Pardeb.
     ChFi3d_ComputesIntPC (Fd1->Interference(IFaCo1),
                          Fd2->Interference(IFaCo2),
                          HS1,HS2,UIntPC1,UIntPC2);
     Pardeb(3)= UV.X(); Pardeb(4)=UV.Y();
     gp_Pnt PFaCo = HS1->Surface().Value(Pardeb(1),Pardeb(2));
     
-    // Du cote arc, calcul de Parfin.
+    // Side arc, calculation of Parfin.
     Standard_Real UIntArc1 = Fd1->Interference(IFaArc1).Parameter(isfirst1);
     Standard_Real UIntArc2 = Fd2->Interference(IFaArc2).Parameter(isfirst2);
     
        !ChFi3d_ComputeCurves(HS1,HS2,Pardeb,Parfin,Gc,
                              PGc1,PGc2,tolesp,tol2d,tolreached)) {
 #if DEB
-      cout<<"echec calcul biseau echec interSS"<<endl;
+      cout<<"failed to calculate bevel error interSS"<<endl;
 #endif
       done=Standard_False;
       return done;
             !ChFi3d_ComputeCurves(HS1,HS2,Parfin,Pardeb,Gc,
                                   PGc1,PGc2,tolesp,tol2d,tolreached)) {
 #if DEB
-      cout<<"echec calcul biseau echec interSS"<<endl;
+      cout<<"failed to calculate bevel error interSS"<<endl;
 #endif
       done=Standard_False;
       return done;     
     }
-    // On met a jour les CornerData avec les resultats de l intersection. 
+    // CornerData are updated with results of the intersection. 
     Standard_Real WFirst = Gc->FirstParameter();
     Standard_Real WLast = Gc->LastParameter();
     Standard_Integer Ipoin1;
                           isfirst2,IFaCo2);
     Corner2->SetIndexPoint(Corner1->IndexPoint(isfirst1,IFaArc1),
                           isfirst2,IFaArc2);
-    //On update les tolerances des points.
+    //The tolerances of points are updated.
     Bnd_Box bco,barc;
     if(IFaCo1 == 1) ChFi3d_EnlargeBox(DStr,Corner1,Fd1,bco,barc,isfirst1);
     else ChFi3d_EnlargeBox(DStr,Corner1,Fd1,barc,bco,isfirst1);
     ChFi3d_SetPointTolerance(DStr,bco,Corner1->IndexPoint(isfirst1,IFaCo1));
   }
   else {
-    // Il faut identifier la surface qui deborde,
-    // trouver le point de fin de l intersection Surf/Surf 
-    // par l intersection de la ligne de tangence du petit sur
-    // la face opposee avec la surface du gros,
-    // et enfin intersecter le gros avec la face en bout
-    // entre ce point et le point sur arc.
+    // It is necessary to identify the border surface,
+    // find the end point of the intersection Surf/Surf 
+    // by the intersection of the tangency line of the small
+    // on the opposing face with the surface of the big,
+    // and finally intersect the big with the face at end 
+    // between this point and the point on arc.
 #ifndef DEB
     Standard_Boolean parcrois = Standard_False ;
 #else
       isfirstBig = isfirst1; isfirstSma = isfirst2;
     }
     
-    //Intersection du gros avec le petit :
+    //Intersection of the big with the small :
     //------------------------------------
 
-    // Pardeb (parametres du point PFaCo)
-    // on verifie l'intersection 
+    // Pardeb (parameters of point PFaCo)
+    // the intersection is checked
     ChFi3d_ComputesIntPC (SmaFD->Interference(IFaCoSma),
                          BigFD->Interference(IFaCoBig),
                          SmaHS,BigHS,UIntPCSma,UIntPCBig);
     Pardeb(1)= UVi.X(); Pardeb(2)=UVi.Y();
     gp_Pnt PFaCo = SmaHS->Value(UVi.X(),UVi.Y());
 
-      // Parfin (parametres du point PMil)
+      // Parfin (parameters of point PMil)
     const ChFiDS_FaceInterference& FiArcSma = SmaFD->Interference(IFaArcSma);
     Handle(Geom_Curve) ctg = DStr.Curve(FiArcSma.LineIndex()).Curve();
     Handle(GeomAdaptor_HCurve) Hctg = new GeomAdaptor_HCurve();
     }
     if(!ChFi3d_IntCS(BigHS,Hctg,UVi,wi)){
 #if DEB
-      cout<<"biseau : echec inter C S"<<endl;
+      cout<<"bevel : failed inter C S"<<endl;
 #endif
       done=Standard_False;
       return done;
     if (!ChFi3d_ComputeCurves(SmaHS,BigHS,Pardeb,Parfin,Gc,
                              PGc1,PGc2,tolesp,tol2d,tolreached)) {
 #if DEB
-      cout<<"echec calcul biseau echec interSS"<<endl;
+      cout<<"failed to calculate bevel failed interSS"<<endl;
 #endif
       done=Standard_False;
       return done;
     }
-      // On met a jour la SmaCD, c est fini pour elle. 
+      // SmaCD is updated, for it this is all. 
     Standard_Real WFirst = Gc->FirstParameter();
     Standard_Real WLast = Gc->LastParameter();
     Standard_Integer IpointCo, IpointMil, IpointArc;
     SmaCD->SetIndexPoint(IpointMil,isfirstSma,IFaArcSma);
     if (IFaCoSma == 2) SmaCD->SetOrientation(TopAbs_REVERSED,isfirstSma);
 
-    // Pour la BigCD on met ces premiers resultats dans la DS.
+    // For BigCD the first results are met in the DS.
     BigCD->SetIndexPoint(IpointCo,isfirstBig,IFaCoBig);
     BigFD->ChangeVertex(isfirstBig,IFaCoBig) = psmaco;
     BigFD->ChangeInterference(IFaCoBig).SetParameter(UIntPCBig,isfirstBig);
     Interfp = ChFi3d_FilPointInDS(TopAbs_REVERSED,ICurv,IpointMil,WLast);
     Li.Append(Interfp);
     
-    // la transition des courbes d intersection sur la Big
+    // the transition of curves of intersection on the Big
     TopAbs_Orientation tra = BigFD->InterferenceOnS1().Transition();
     TopAbs_Orientation ofac = DStr.Shape(BigFD->IndexOfS1()).Orientation();
     TopAbs_Orientation ofil = BigFD->Orientation();
     Interfc = ChFi3d_FilCurveInDS (ICurv,ISurf,PGc2,tracurv);
     DStr.ChangeSurfaceInterferences(ISurf).Append(Interfc);
     
-    //On update les tolerances des points (on commence).
+    //The tolerances of points are updated (beginning).
     Bnd_Box bco,bmil,barc;
     if(IFaCoSma == 1) ChFi3d_EnlargeBox(DStr,SmaCD,SmaFD,bco,bmil,isfirstSma);
     else ChFi3d_EnlargeBox(DStr,SmaCD,SmaFD,bmil,bco,isfirstSma);
     ChFi3d_EnlargeBox(BigHS,PGc2,WFirst,WLast,bco,bmil);
     
-    // Intersection du gros avec la face en bout :
+    // Intersection of the big with the face at end :
     // -------------------------------------------
 
-    // Pardeb (parametres de PMil)
-    // On rejoue l intersection courbe surface mais avec la representation
-    // pcurve on face de la courbe pour etre bien sur.
+    // Pardeb (parameters of PMil)
+    // The intersection curve surface is tried again, now with representation
+    // pcurve on face of the curve to be sure.
     TopoDS_Face F = TopoDS::Face(DStr.Shape(SmaFD->Index(IFaArcSma)));
     Handle(BRepAdaptor_HSurface) HF = new BRepAdaptor_HSurface(F);
     Standard_Real fsma = FiArcSma.FirstParameter();
     Handle(Adaptor3d_HCurveOnSurface) Hconsf = new Adaptor3d_HCurveOnSurface(consf);
     if(!ChFi3d_IntCS(BigHS,Hconsf,UVi,wi)) {
 #if DEB
-      cout<<"biseau : echec inter C S"<<endl;
+      cout<<"bevel : failed inter C S"<<endl;
 #endif
       done=Standard_False;
       return done;
     Pardeb(1) = UVi.X(); Pardeb(2) = UVi.Y(); 
     gp_Pnt2d ppff1 = UVi;
 
-      // Parfin (parametres du point cpend)
+      // Parfin (parameters of the point cpend)
     Standard_Real ptg = BigFD->Interference(IFaArcBig).Parameter(isfirstBig);
     UVi = BigFD->Interference(IFaArcBig).PCurveOnSurf()->Value(ptg);
     Parfin(3) = UVi.X(); Parfin(4) = UVi.Y();
       // Intersection. 
     Standard_Real uu1,uu2,vv1,vv2;
     ChFi3d_Boite(ppff1,ppff2,uu1,uu2,vv1,vv2);
-    // pour le cas ou les deux chanfreins sont sur deux aretes OnSame,
-    // il faut etendre la surface portant F, sinon, au moins ne pas la
-    // restreindre.
+    // for the case when two chamfers are on two edges OnSame,
+    // it is necessary to extend the surface carrying F, or at least
+    // not to limit it.
     ChFi3d_BoundFac(HF->ChangeSurface(),uu1,uu2,vv1,vv2,Standard_True);
 
     if (!ChFi3d_ComputeCurves(HF,BigHS,Pardeb,Parfin,Gc,
                              PGc1,PGc2,tolesp,tol2d,tolreached)) {
 #if DEB
-      cout<<"echec calcul biseau echec interSS"<<endl;
+      cout<<"fail calculation bevel fail interSS"<<endl;
 #endif
       done=Standard_False;
       return done;
     }
     
-      // On finit de mettre a jour la BigCD et la DS.
+      // End of update of the BigCD and the DS.
     WFirst = Gc->FirstParameter();
     WLast = Gc->LastParameter();
     ICurv = DStr.AddCurve(TopOpeBRepDS_Curve(Gc,tolreached));
     DStr.ChangeSurfaceInterferences(ISurf).Append(Interfc);
     BigCD->InDS(isfirstBig);
     
-    // Et enfin on met dans la DS les informations cote face.
+    // Finally the information on faces is placed in the DS.
     Standard_Integer IShape = DStr.AddShape(F);
     if(SmaFD->Surf() == BigFD->Surf()){
       tracurv = TopAbs::Compose(etest.Orientation(),
     Interfc = ChFi3d_FilCurveInDS(ICurv,IShape,PGc1,tracurv);
     DStr.ChangeShapeInterferences(IShape).Append(Interfc);
 
-    //On update les tolerances des points (on finit).
+    //The tolerances of points are updated (end).
     Handle(ChFiDS_Stripe) bidst;
     if(IFaCoBig == 1) ChFi3d_EnlargeBox(DStr,bidst,BigFD,bco,barc,isfirstBig);
     else ChFi3d_EnlargeBox(DStr,bidst,BigFD,barc,bco,isfirstBig);
 
 
 //=======================================================================
 //function : cherche_edge1
-//purpose  : cherche l'edge commune entre les faces F1 et F2 
+//purpose  : find common edge of faces F1 and F2 
 //=======================================================================
 
 static void cherche_edge1 (const TopoDS_Face & F1,
 
 //=======================================================================
 //function : CurveHermite
-//purpose  : calcule une courbe 3d  au moyen des polynomes d'Hermite.
-//           l'arete ic est une arete de regularite . On construit une courbe 3d entre 
-//           les aretes icmoins et icplus. 
+//purpose  : calculate a  curve 3d using polynoms of Hermite.
+//           the edge is a regular edge. Curve 3D is constructed  
+//           between edges icmoins and icplus. 
 //=======================================================================
 
 static void CurveHermite (const TopOpeBRepDS_DataStructure& DStr,
 
 //=======================================================================
 //function : CalculDroite
-//purpose  : calcule une droite 2d  passant par le point  p2d1 et de direction xdir ydir 
+//purpose  : calculate a 2D straight line passing through point p2d1 and direction xdir ydir 
 //=======================================================================
 
 static void CalculDroite(const gp_Pnt2d & p2d1,
 
 //=======================================================================
 //function : CalculBatten
-//purpose  : calcule un batten entre les courbes 2d  curv2d1 et curv2d2  aux points p2d1 et p2d2  
+//purpose  : calcule a batten between curves 2d  curv2d1 and curv2d2 at points p2d1 and p2d2  
 //=======================================================================
 
 static void CalculBatten (const Handle (GeomAdaptor_HSurface) ASurf, 
     Ok = Bat.Compute(Iana,25,1.e-2);
 #if DEB
     if (!Ok) { 
-      cout<<"pas de batten :";
+      cout<<"no batten :";
       Bat.Dump(cout);
     }    
 #endif  
 
 //=======================================================================
 //function : OrientationIcNonVive
-//purpose  : calcule l'orientation de la courbe de raccord  entre ic et icplus sachant que ic 
-//           n'est pas une arete vive
+//purpose  : calculate the orientation of the curve between ic and icplus knowing that ic 
+//           is not a living edge.
 //=======================================================================
 
 static void OrientationIcNonVive (const Handle(ChFiDS_Stripe) & CDic,
 
 //=======================================================================
 //function : OrientationIcplusNonVive
-//purpose  : calcule l'orientation de la courbe de raccord  entre ic et icplus sachant que icplus
-//           n'est pas une arete vive;
+//purpose  : calculate the orientation of the curve between ic and icplus knowing that icplus
+//           is not a living edge;
 //=======================================================================
 
 static void OrientationIcplusNonVive (const Handle(ChFiDS_Stripe) & CDicplus,
 
 //=======================================================================
 //function : OrientationAreteViveConsecutive
-//purpose  : calcule l'orientation  de la courbe de raccord  entre les aretes ic et icplus 
-//           ou ic et icplus sont vives consecutives
+//purpose  : calculate the orientation of the curve between edges ic and icplus 
+//           where ic and icplus are consecutively living 
 //=======================================================================
 
 static void OrientationAreteViveConsecutive (const TopoDS_Shape & Fviveicicplus,
                                              const TopoDS_Vertex & V1,
                                              TopAbs_Orientation & orien)
 
-{ // orinterf est l'orientation de l'edge ic  par rapport a la face Fviveicicplus prise FORWARD
+{ // orinterf is orientation of edge ic corresponding to face Fviveicicplus taken FORWARD
 #ifndef DEB
   TopAbs_Orientation orinterf = TopAbs_FORWARD;
 #else
       break;
     }
   }
-  // si V1 est le vertex REVERSED  de l'edge ic alors la courbe de 
-  // raccord a la meme orientation que ic 
+  // if V1 is vertex REVERSED of edge ic the curve  
+  // has the same orientation as ic 
   TopoDS_Vertex vl;
   vl=TopExp::LastVertex(E);
   if (vl.IsSame(V1)){ 
 
 //=======================================================================
 //function : PerformTwoCornerSameExt
-//purpose  : calcule l'intersection entre les deux stripes stripe1 et stripe2 
+//purpose  : calculate intersection between two stripes stripe1 and stripe2 
 //=======================================================================
 
 static void PerformTwoCornerSameExt(TopOpeBRepDS_DataStructure& DStr,
 
 //=======================================================================
 //function : CpOnEdge
-//purpose  : determine si la surfdata num  a un common point sur Eadj1 ou Eadj2
+//purpose  : determine if surfdata num has a common point on Eadj1 or Eadj2
 //=======================================================================
 
 static void  CpOnEdge (const  Handle(ChFiDS_Stripe) & stripe,
 
 //=======================================================================
 //function : RemoveSurfData
-//purpose  : pour chaque stripe suppression des surfdatas initiles 
+//purpose  : for each stripe removal of unused surfdatas 
 //=======================================================================
 
 static void RemoveSurfData (const ChFiDS_StripeMap & myVDataMap,
       Standard_Integer ind;
       if (sense==1) {
         ind=0;
-       // parmi les surfdatas on cherche le plus grand indice ind tel que 
-       // la surfdata ait un de ses commonpoint sur Eadj1 et Eadj2
-       // on supprime les surfdata de 1 a ind-1   
+       // among surfdatas find the greatest indice ind so that 
+       // surfdata could have one of commonpoint on Eadj1 and Eadj2
+       // remove surfdata from 1 to ind-1   
        for (Standard_Integer i=1;i<=nbsurf;i++) {
          CpOnEdge (It.Value(),i,isfirst,Eadj1,Eadj2,compoint);
          if (compoint) ind=i;
       }
       else {
         ind=num;
-       // parmi les surfdatas on cherche le plus petit indice ind tel que 
-       // la surfdata ait un de ses commonpoint sur Eadj1 et Eadj2
-       // on supprime les surfdata de ind+1 a num   
+       // among surfdatas find the smallest indice ind so that 
+       // surfdata could have one of commonpoint on Eadj1 and Eadj2
+       // remove surfdata from ind+1 to num   
        for (Standard_Integer i=num;i>=1;i--) {
          CpOnEdge (It.Value(),i,isfirst,Eadj1,Eadj2,compoint);
          if (compoint) ind=i;
                                           
 //=======================================================================
 //function : PerformMoreThreeCorner
-//purpose  : Traite le cas d'un sommet a n aretes.      
+//purpose  : Process case of a top with n edges.      
 //=======================================================================
 
 void  ChFi3d_Builder::PerformMoreThreeCorner(const Standard_Integer Jndex,
   TopoDS_Face F1,F2;
   gp_Vec SumFaceNormalAtV1(0,0,0); // is used to define Plate orientation 
 
-  // on determine s'il y a une arete de couture 
-  // la face qui a une arete de couture et l'arete de couture
+  // it is determined if there is a sewing edge
   Standard_Boolean couture=Standard_False;
   TopoDS_Face facecouture;
   TopoDS_Edge edgecouture;
       facecouture=fcur;
   }
 
-// On enleve les surfdata inutiles 
+// unused surfdata are removed 
   RemoveSurfData (myVDataMap, myEFMap,edgecouture,facecouture,V1);
 
- // tri des aretes et des faces
+ // parse edges and faces
   trouve=Standard_False;
   TopoDS_Edge Enext;
   TopoDS_Vertex VV;
     ChFi3d_cherche_edge(V1,Evive,Fcur,Enext,VV);
     trouve= !Enext.IsNull();
   }
-  // find sum of all face normales at V1
+  // find sum of all face normals at V1
   SummarizeNormal(V1, Fcur, Ecur, SumFaceNormalAtV1);
   
   Standard_Integer nbcouture=0;
     }
     else ChFi3d_cherche_edge(V1,Evive,Fcur,Enext,VV);
     if (Enext.IsNull())Standard_Failure::Raise
-    ("PerformMoreThreeCorner: pb dans le tri des aretes et des faces"); 
+    ("PerformMoreThreeCorner: pb in the parsing of edges and faces"); 
     if (Enext.IsSame(edgelibre1)|| Enext.IsSame(edgelibre2)) {
       CD.SetValue(ii, cdbid);
       Index.SetValue(ii, 0);
       jf.SetValue(ii, 0); 
     }
     else {
-// on cherche si Enext est dans la map des stripes 
+// it is found if Enext is in the map of stripes 
       TopoDS_Edge EE;
       /*Standard_Boolean */trouve = Standard_False;
       for (It.Initialize(myVDataMap(Jndex));It.More()&&!trouve;It.Next()) {
        Evive.SetValue(ii, Enext);
       }
       else {
-       //      l'arete ii est vive
+       //      edge ii is alive
        CD.SetValue(ii, cdbid);
        Index.SetValue(ii, 0);
        sens.SetValue(ii, -1);
        Evive.SetValue(ii, Enext);
        jf.SetValue(ii, 0);
       }
-      // On cherche la face Fnext!=Fcur qui contient Enext 
+      // Face Fnext!=Fcur containing Enext 
       Fnext=Fcur;
       ChFi3d_cherche_face1(myEFMap(Enext),Fcur,Fnext);
       Indices(nedge,ii,icplus,icmoins);
       numfa.SetValue(icplus,ii,numfa.Value(ii,icplus));
       Standard_Integer numface1,numface2;
       if (trouve) {
-       // on regarde si numfa correspond a IndexOfS1 ou IndexOfS2 
-       // on met a jour en consequence jf 
-        // si ce n'est pas le cas on recherche parmi les faces precedentes 
-        // celle qui correspond a IndexOfs1 IndexOfS2  et on remet a jour 
-        // numfa et Fvive (cts16288)  
+       // it is checked if numfa corresponds to IndexOfS1 or IndexOfS2 
+       // jf is updated is consequently updated
+        // if it is not the case among the previous faces are found 
+        // those which correspond to  IndexOfs1 IndexOfS2  and  
+        // numfa and Fvive are reupdated (cts16288)  
        numface2 = SurfIndex(CD, ii, Index.Value(ii), FACE2);
        if (numface2==numfa.Value(ii,icplus))
          jf.SetValue(ii, 2);
       }
     }
   }
-  // on verifie qu'une arete de regularite n'est pas tangente a une autre arete
-  // dans ce cas on ne la considere pas comme reguliere (cts60072)
+  // it is checked if a regular edge is not tangent to another edge
+  // in case if it is not considered regular (cts60072)
   for (ic=0;ic<nedge;ic++) {
     if (regul.Value(ic) ) {
       trouve=Standard_False;
     }
   }
 
-  // la variable deuxconges permet de detecter les cas ou on a un sommet a
-  // n aretes et deux conges sur deux aretes tangentes qui ne sont pas
-  // des bords libres 
-  // les courbes de raccord partent du conge jusqu'au sommet 
+  // variable deuxconges allows detecting cases when there is a top with 
+  // n edges and two fillets on two tangent edges that are not free borders
+  // the connecting curves start from the fillet and end on top 
   
   Standard_Boolean deuxconges,deuxcgnontg;
   deuxconges=Standard_False;
     }
   }
 
-  // on utilise la variable deuxconges dans le cas particulier
-  // ou on a deux conges et si les deux autres aretes vives 
-  // sont tangentes (cts60072) 
+  // variable deuxconges is used in the special case when there are 
+  // two fillets and if two other living edges are tangent (cts60072) 
   if (nconges==2 && nedge==4) {
     TopoDS_Edge E1,E2; 
      for (ic=0;ic<nedge&&!deuxconges;ic++) {
     PerformOneCorner (Jndex, Standard_True);
   }
 
-// si le commonpoint est sur une arete qui n'a pas comme
-// extremite le vertex , on  determine a nouveau Evive     
-// On determine a nouveau Fvive si elle ne correspondant 
-// pas a une des deux faces adjacentes a Evive (cts16288)
+// if the commonpoint is on an edge that does not have a 
+// vertex at the extremity, Evive is found anew    
+// Fvive is found anew if it does not correspond 
+// to two faces adjacent to Evive (cts16288)
 
   if (!deuxconges && !isOnSameDiff) 
     for (ic=0;ic<nedge;ic++) { 
       }
     } 
 
-// on recupere la premiere arete libre si elle existe
+// the first free edge is restored if it exists
   trouve=Standard_False;
   for (ic=0; ic<nedge&&!trouve;ic++) {  
     TopoDS_Edge ecom;
     }
   }  
 
-// determination de la distance de recul distmin a ne pas depasser
+// determine the minimum recoil distance that can't be exceeded 
   Standard_Boolean distmini=Standard_False;
   gp_Pnt som=BRep_Tool::Pnt(V1),pic;  
   gp_Pnt2d p2;
     if (dst<distmin) distmin=dst;
   }
 
-//  calcul des intersections entre les stripes et determination des parametres
-// sur chaque pcurve  
+//  calculate intersections between stripes and determine the parameters on each pcurve  
   Standard_Boolean inters=Standard_True;
   for (ic=0;ic<nedge;ic++) {
     Indices(nedge,ic,icplus,icmoins);
       Handle(ChFiDS_Stripe) strip;
       Standard_Real angedg;
       Standard_Integer iface;
-      // si les deux aretes sont tangentes on ne tente pas
-      // l'intersection (cts60046)
+      // if two edges are tangent the intersection is not attempted (cts60046)
       angedg=Abs(ChFi3d_AngleEdge(V1,TopoDS::Edge(Evive.Value(ic)),TopoDS::Edge(Evive.Value(icplus))));
       if (Abs(angedg-PI)>0.01)
        ok = ChFi3d_SearchFD(DStr,CD.Value(ic),CD.Value(icplus),sens.Value(ic),sens.Value(icplus),
                                  Index.Value(ic),Index.Value(icplus),
                                  face,sameside,jf1,jfp);
       else ok=Standard_False;
-      // s'il y a une intersection on regarde si la surfdata ou il y a l'intersection
-     // correspond a la premiere ou  a la derniere 
-     // si ce n'est pas le cas on enleve de la SD les surfdata  
+     // if there is an intersection it is checked if surfdata with the intersection
+     // corresponds to the first or the last 
+     // if this is not the case, the surfdata are removed from SD 
       
       if (ok) {
        if (i1!=Index.Value(ic) ){
     if (!oksea.Value(ic) ) inters=Standard_False; 
   }
 
-  // cas ou il n'y a pas que des intersections 
-  // les parametres sur les Pcurves sont les extremites  de la stripe
+  // case if there are only intersections 
+  // the parametres on Pcurves are the extremities of the stripe
   Standard_Real para;
   if (!inters) {
     for (ic=0;ic<nedge;ic++) {
       }
     }
       
-//  calcul  de la distance max du sommet a chaque point  
+//  calculate max distance to the top at each point  
     TColStd_Array1OfReal dist1(0,size);
     TColStd_Array1OfReal dist2(0,size);
     Standard_Real distance=0.;
       }
     }
 
-//  decalage des parametres  et elimination des points d'intersections 
-//  trop proches du sommet 
+//  offset of parameters and removal of intersection points 
+//  too close to the top 
 
     Standard_Real ec, dist; 
     if (!deuxconges && !deuxcgnontg)
       Indices(nedge,ic,icplus,icmoins);
       if (sharp.Value(ic) ) {
         BRepAdaptor_Curve C(TopoDS::Edge(Evive.Value(ic)));
-        // pour passer d'une distance 3d a une distance parametrique
+        // to pass from 3D distance to a parametric distance
        if (!tangentregul(ic))
          ec = distance*100*C.Resolution(0.01);
         else ec=0.0;
           para=p.Value(ic,icmoins) - ec;
          p.SetValue(ic,icmoins,para);
         }
-// il faudra etre sur de rester sur l'edge
+// it is necessary to be on to remain on the edge
        p.SetValue(ic,icplus, p.Value(ic,icmoins));
       }
       else if (!distmini) {
     }
   }
 
-// on tente de limiter l'arete vive par un des commonpoint
+// it is attempted to limit the edge by a commonpoint
 //
  
   Standard_Real tolcp=0;
       if (!sharp.Value(icmoins) &&  !sharp.Value(icplus))
        samecompoint=cp1.Point().Distance(cp2.Point())<tolapp;
       if ((dS<d1 || dS<d2)&& !samecompoint) {
-// on recule jusqu'aux Common Points
-// sans sortir de l'Edge ??
+// step back till Common Points
+// without leaving the Edge ??
        if (d2<d1 &&cp1.IsOnArc() ) {
-// on choisit cp1
+// cp1 is chosen
          p.SetValue(ic,icmoins, cp1.ParameterOnArc());
          p.SetValue(ic,icplus, p.Value(ic,icmoins));
          isfirst=(sens.Value(icplus)==1);
           if (cp1.Tolerance()>tolcp &&cp1.Tolerance()<1 ) tolcp=cp1.Tolerance();
        }
        else if( cp2.IsOnArc()){
-// on choisit cp2
+// cp2 is chosen
          p.SetValue(ic,icmoins, cp2.ParameterOnArc());
          p.SetValue(ic,icplus, p.Value(ic,icmoins));
          isfirst=(sens.Value(icmoins)==1);
        }
       }
       else {
-// on se recale sur un Common Point uniquement si on en est tres pres
+// step back till Common Point only if it is very close
        if (!sharp.Value(icplus)) {
          if ((cp1.Point().Distance(PE)<cp1.Tolerance() || 
                samecompoint || nconges==1) && cp1.IsOnArc()) {
-// on est tres proche de cp1
+// it is very close to cp1
            p.SetValue(ic,icmoins, cp1.ParameterOnArc());
             ponctuel.SetValue(ic,Standard_True);
            p.SetValue(ic,icplus, p.Value(ic,icmoins));
         if (!sharp.Value(icmoins)){
          if ((cp2.Point().Distance(PE)<cp2.Tolerance() || 
               samecompoint || nconges==1) && cp2.IsOnArc()) {
-// on est tres proche de cp2
+// it is very close to cp2
             ponctuel.SetValue(icmoins,Standard_True);
            p.SetValue(ic,icmoins, cp2.ParameterOnArc());
            p.SetValue(ic,icplus,p.Value(ic,icmoins));
     }
   }
 
-// dans le cas d'un bord libre  on prend le parametre correspondant 
-// au common point sur l'arete libre. 
+// in case of a free border the parameter corresponding 
+// to the common point on the free edge is chosen. 
 
   for (ic=0;ic<nedge;ic++) {
     if (TopoDS::Edge(Evive.Value(ic)).IsSame(edgelibre1) || 
     }   
   }
 
-// si ic est une arete de regularite, on cherche l'arete indfin qui ne 
-// soit pas une arete de regularite, on construit une courbe 3d 
-// entre les aretes (ou stripes ) icmoins et indfin. 
-// On projette ensuite cette courbe3d sur toutes les faces (nbface) qui
-// separent icmoins et indfin
+// if ic is a regular edge, one finds edge indfin which is not 
+// a regular edge, and construtc a curve 3d 
+// between edges (or stripes ) icmoins and indfin. 
+// Then this courbe3d is projected on all faces (nbface) that
+// separate icmoins and indfin
 #ifndef DEB
   Standard_Integer nbface = 0;
 #else
     }       
   }
 
- // cas ou  la courbe de raccord entre ic et icplus traverse plusieurs faces
+ // case when the conncting curve between ic and icplus crosses many faces
   
   TopTools_SequenceOfShape Ecom;
   TopTools_SequenceOfShape Eproj;
     }
   } 
 
-// cas ou deux conges ont les memes commonpoints 
-// on procede alors par intersection 
-// on verifie cependant que les extremites de l'intersection coincident avec les commonpoints
+// case when two fillets have the same commonpoints 
+// one continues then by intersection 
+// it is checked if the extremities of the intersection coincide with commonpoints
 
   Standard_Boolean intersection=Standard_False, introuve;
   if (nconges==2 && !deuxconges) { 
     }
   } 
 
-// declaration pour plate 
+// declaration for plate 
   GeomPlate_BuildPlateSurface PSurf(3,10,3,tol2d,tolesp,angular);
 
-// calcul des courbes sur surface  pour chaque   stripe 
+// calculation of curves on surface for each stripe 
   for (ic=0;ic<nedge;ic++) {
     gp_Pnt2d p2d1, p2d2;
     if (!sharp.Value(ic)) {
       indice= SurfIndex(CD, ic, i.Value(ic,icplus), ChFiSURFACE);
       Handle (GeomAdaptor_HSurface) Asurf =
        new GeomAdaptor_HSurface(DStr.Surface(indice).Surface());
-      // calcul de la courbe 2d  
+      // calculation of curve 2d  
       xdir= p2d2.X()-p2d1.X();  
       ydir= p2d2.Y()-p2d1.Y();
       Standard_Real l0 = sqrt(xdir*xdir+ ydir*ydir );
        new GeomPlate_CurveConstraint(HCons,Order.Value(ic),10,tolesp,angular,0.1);
       PSurf.Add(Cont);
       
-      // calcul des indices de points  et de  la courbe pour la DS         
+      // calculate indexes of points and of the curve for the DS         
       isfirst=(sens.Value(ic)==1);
       GeomLib::BuildCurve3d(tolapp,CurvOnS,CurvOnS.FirstParameter(),
                            CurvOnS.LastParameter(),Curv3d,maxapp,avedev);
       TopOpeBRepDS_Point tpoint2 (point2,maxapp);
       errapp.SetValue(ic,maxapp);
       if (ic==0) {
-// il faut creer les deux points
+// it is necessary to create two points
        indpoint.SetValue(ic,0,DStr.AddPoint(tpoint1));
        indpoint.SetValue(ic,1,DStr.AddPoint(tpoint2));
       }
       else {
-// les points existent peut-etre deja sur un conge 
-// (intersection precedente,...)
+// probably the points are already on the fillet 
+// (previous intersection...)
        trouve = Standard_False;
        for (ii=0;ii<ic&&(!trouve);ii++) {
          if (!sharp.Value(ii)) {
          indpoint.SetValue(ic,1,DStr.AddPoint(tpoint2));
       }
       
-      //   mise a jour de la stripe 
+      //   update of the stripe 
       isurf1=3-jf.Value(ic); isurf2=jf.Value(ic);
       if (isurf1==2)  CD.Value(ic)->SetOrientation(TopAbs_REVERSED,isfirst);
       CD.Value(ic)->SetCurve(indcurve3d.Value(n3d),isfirst);
     }
   }
       
-// calcul des indices de points pour les aretes vives   
+// calculate the indices of points for living edges    
   for (ic=0;ic<nedge;ic++) {
     if (sharp.Value(ic)) {
       Indices(nedge,ic,icplus,icmoins);
        cp = CD.Value(icplus)->SetOfSurfData()->Value(i.Value(icplus,ic))->
          ChangeVertex (isfirst,jfp);
        if ( cp.Point().Distance(PE) <= Max(1.e-4,tolcp)) {
-// l'arete a ete limitee par le 1er CommonPoint de CD[icplus]
+// edge was limited by the 1st CommonPoint of CD[icplus]
          indpoint.SetValue(ic,0,indpoint.Value(icplus,0));
          indpoint.SetValue(ic,1,indpoint.Value(icplus,0));
        }
        cp = CD.Value(icmoins)->SetOfSurfData()->Value(i.Value(icmoins,ic))->
          ChangeVertex (isfirst,jf.Value(icmoins));
        if ( cp.Point().Distance(PE) <= Max(1.e-4,tolcp)) {
-// l'arete a ete limitee par le 2eme CommonPoint de CD[icmoins]
+// edge was limited by the 2nd CommonPoint of CD[icmoins]
         if (indpoint.Value(ic,0)==0) { 
           indpoint.SetValue(ic,0, indpoint.Value(icmoins,1));
          indpoint.SetValue(ic,1, indpoint.Value(icmoins,1));
     }
   }
 
- // calcul des courbes intermediaires reliant  deux stripes dans le cas ou il n'y a pas 
-// d'intersection. La courbe peut etre une droite une projection ou un batten 
+// calculation of intermediary curves connecting two stripes in case if  
+// there is no intersection. The curve is a straight line, projection or batten 
   
   Standard_Boolean raccordbatten;
   if (!inters) {
        Handle (GeomAdaptor_HSurface) Asurf;
        Standard_Real u1bid,u2bid;
        
-       // recuperation de la premiere courbe 2d 
-       // et du premier point de raccordement
+       // return the 1st curve 2d 
+       // and the 1st connection point 
        if (sharp.Value(ic))
          curv2d1 = BRep_Tool::CurveOnSurface(TopoDS::Edge(Evive.Value(ic)),TopoDS::Face(Fvive.Value(ic,icplus)),
                                               u1bid,u2bid);
        if (tolu>tolv) ratio=tolu/tolv;
        else ratio=tolv/tolu;
         
-        // dans le cas d'une arete de couture on recadre les parametres 
+        // in case of a sewing edge the parameters are reframed 
         if (couture) {
          Standard_Boolean PI1=Standard_False, PI2=Standard_False;
          Standard_Real xx;
 
        Standard_Real l0 = sqrt(xdir*xdir+ ydir*ydir );
        if (l0<1.e-7|| ponctuel.Value(ic)) {
-// raccord inutile
+// unused connection
          n3d--;
           ponctuel.SetValue(ic,Standard_True);
           if (!deuxconges) {
           }
           }
        }
-       else {  // le raccord est soit une droite soit une projection soit un batten 
+       else {  // the connection is a straight line, projection or batten 
          if (ratio>10 && nconges==1) raccordbatten=Standard_True; 
          if (ratio>10 && raccordbatten) {
            CalculDroite(p2d1,xdir,ydir,pcurve);
             raccordbatten=Standard_False;
           }
-          else  if (!raccordbatten){  // on recupere les courbes projetees 
+          else  if (!raccordbatten){  // the projected curves are returned 
            if (regul.Value(ic)) {
                if (cproj2.Value(ic).IsNull()){ 
                    raccordbatten=Standard_True;
                             contraint2=Standard_True;
           if (raccordbatten) {
 #ifdef DEB
-           ChFi3d_InitChron(ch);// init performances pour les batten  
+           ChFi3d_InitChron(ch);// initial performances for  battens  
 #endif  
             Standard_Boolean inverseic,inverseicplus;
             if (sharp.Value(ic)) {
            CalculBatten(Asurf,TopoDS::Face(Fvive(ic,icplus)),xdir,ydir,p2d1,p2d2,contraint1,contraint2,curv2d1,curv2d2,p.Value(ic,icplus),
                         p.Value(icplus,ic),inverseic,inverseicplus,pcurve);
 #ifdef DEB
-           ChFi3d_ResultChron( ch,t_batten);  // result performances pour les batten 
+           ChFi3d_ResultChron( ch,t_batten);  // resulting performances for battens 
 #endif 
           }
 
-         // construction des frontieres pour Plate 
+         // construction of borders for Plate 
          Handle (Geom2dAdaptor_HCurve)  Acurv=new Geom2dAdaptor_HCurve(pcurve);
          Adaptor3d_CurveOnSurface  CurvOnS (Acurv,Asurf);
          Handle(Adaptor3d_HCurveOnSurface) HCons =
            new Adaptor3d_HCurveOnSurface(CurvOnS);
 
-         // on met des contraintes G1  si les aretes ic et icplus ne sont pas toutes les deux vives 
+         // constraints G1 are set if edges ic and icplus are not both alive 
 
 
          Order.SetValue(n3d,0);
            new GeomPlate_CurveConstraint(HCons,Order.Value(n3d),10,tolesp,angular,0.1);
          PSurf.Add(Cont);
 
-         //calcul de la courbe 3d si ce n'est pas une projection 
+         //calculation of curve 3d if it is not a projection 
          if (curveint.IsNull()) {
            GeomLib::BuildCurve3d(tolapp,CurvOnS,CurvOnS.FirstParameter(),
                                  CurvOnS.LastParameter(),Curv3d,maxapp1,avedev);
            curveint= new Geom_TrimmedCurve(Curv3d,pardeb,parfin);
          }
 
-         //stockage dans la DS  
+         //storage in the DS  
          TopOpeBRepDS_Curve tcurv3d( curveint,maxapp1);
          indcurve3d.SetValue(n3d, DStr.AddCurve(tcurv3d));
          pardeb=curveint->FirstParameter();
          parfin=curveint->LastParameter();
          if ( sharp.Value(icplus) && indpoint.Value(icplus,0) == 0) {
-           // il faut initialiser indpoint[icplus][0] et indpoint[icplus][1]
+           // it is necessary to initialize indpoint[icplus][0] and indpoint[icplus][1]
            gp_Pnt point2; 
            point2 =curveint->Value(parfin);
            TopOpeBRepDS_Point tpoint2 (point2,maxapp); 
            tpt2.Tolerance (tpt2.Tolerance()+maxapp1);     
          }
 
-       // calcul de l'orientation de la courbe  
+       // calculate orientation of the curve  
          TopAbs_Orientation orinterf; 
          if (!sharp.Value(ic)) {
               OrientationIcNonVive(CD.Value(ic),jf.Value(ic),i.Value(ic,icplus),sens.Value(ic),orinterf);
          Interfc=ChFi3d_FilCurveInDS(indcurve3d.Value(n3d),numfa.Value(ic,icplus),pcurve,orinterf);      
          DStr.ChangeShapeInterferences(numfa.Value(ic,icplus)).Append(Interfc);
        }
-       } // fin du traitement par arete
-    } // fin de la boucle sur les aretes
-  }  // fin du traitement pour les courbes intermediaires 
+       } // end of processing by edge 
+    } // end of the loop on edges 
+  }  // end of processing for intermediary curves 
         
-//  stockage dans la DS des courbes projetees sur plusieurs faces 
+//  storage in the DS of curves projected on several faces 
   for (ic=0;ic<nedge;ic++) {
     if (moresurf.Value(ic) ){
       TopoDS_Vertex Vf,Vl;
            }
          }
 
-         //calcul de l'orientation       
+         //calculation of the orientation        
          TopAbs_Orientation orinterf;
          if (P1.Distance(Pcom)>1.e-4) {
            if (orvt==TopAbs_FORWARD) {
     }                     
   }
             
-// cas ou les deux bords libres sont tangents 
+// case when two free borders are tangent
   if (droit)      
     for (ic=0;ic<nedge;ic++) {
       Handle(Geom_Curve) curve,ctrim,rcurve;
   } 
  
 #ifdef DEB
-  ChFi3d_InitChron(ch); // init performances pour plate 
+  ChFi3d_InitChron(ch); // init performances for plate 
 #endif
 
   PSurf.Perform();
 
 #ifdef DEB  
-  ChFi3d_ResultChron(ch, t_plate); //result performances pour plate 
+  ChFi3d_ResultChron(ch, t_plate); //result performances for plate 
 #endif 
 
-  // appel a l'approx  
+  // call of approx  
  
 #ifdef DEB
-  ChFi3d_InitChron(ch);  // init performances pour approxplate
+  ChFi3d_InitChron(ch);  // init performances for approxplate
 #endif
   if (PSurf.IsDone()) {
     Standard_Integer nbcarreau=9;
     apperror=Mapp.CriterionError()*coef;
 
 #ifdef DEB  
-  ChFi3d_ResultChron(ch, t_approxplate); // result performances pour approxplate
+  ChFi3d_ResultChron(ch, t_approxplate); // result performances for approxplate
 #endif
   
-//  Stockage de la surface plate  et des courbes  correspondantes dans la DS 
+//  Storage of the surface plate and corresponding curves in the DS 
 
     TopAbs_Orientation orplate,orsurfdata,orpcurve,orien;
 #ifdef DEB
     TopOpeBRepDS_ListOfInterference& SolidInterfs = 
       DStr.ChangeShapeInterferences(SolInd);
  
-// dans le cas ou l'on relie au sommet , il faut que les 
-// aretes  vives qui arrivent au sommet  soient enlevees de la DS. 
-// Pour cela on les stocke dans la DS avec leur orientation inverse 
+// in case when one rereads at top, it is necessary that 
+// alive edges that arrive at the top should be removed from the DS. 
+// For this they are stored in the DS with their inverted orientation 
     Standard_Integer nbedge;
     TopExp_Explorer ex;
     if (deuxconges)
        }
       }
     
-    // calcul de l'orientation de Plate  orplate  par rapport aux surfdata 
-    // on fait le calcul par rapport a la premiere la stripe 
+    // calculate orientation of Plate orplate corresponding to surfdata 
+    // calculation corresponding to the first stripe 
     Indices(nedge,0,icplus,icmoins);
     isfirst=(sens.Value(0)==1);
     const Handle(ChFiDS_SurfData)& Fd = 
 //     else  orplate=TopAbs::Reverse(orsurfdata);  
     orplate = PlateOrientation(Surf,PSurf.Curves2d(),SumFaceNormalAtV1);
     
-    //  creation de la solidinterderence pour Plate 
+    //  creation of solidinterderence for Plate 
     Handle(TopOpeBRepDS_SolidSurfaceInterference) SSI = 
       new TopOpeBRepDS_SolidSurfaceInterference(TopOpeBRepDS_Transition(orplate),
                                              TopOpeBRepDS_SOLID,
                                              Isurf);
     SolidInterfs.Append(SSI);
   
-  // calcul de l'orientation orien des pcurves de Plate
-  // les courbes allant de ic a icplus les pcurves de Plate 
-  // ont toutes la meme orientation  
+  // calculate orientation orien of pcurves of Plate
+  // the curves from ic to icplus the pcurves of Plate 
+  // all have the same orientation  
     Standard_Integer Ishape1,Ishape2; 
 #ifndef DEB
     TopAbs_Orientation trafil1 = TopAbs_FORWARD, trafil2 = TopAbs_FORWARD;
        Indices(nedge,ic,icplus,icmoins);
        
        isfirst=(sens.Value(ic)==1);
-      //   calcul des curves interference relatives aux stripes
+      //   calculate curves interference relative to stripes
       
        apperror=Mapp.CriterionError()*coef;
        pardeb=CD.Value(ic)->PCurve(isfirst)->FirstParameter();
        tpt1.Tolerance (tpt1.Tolerance()+apperror);
        tpt2.Tolerance (tpt2.Tolerance()+apperror ); 
        
-      // calcul de la surfaceinterference
+      // calculate surfaceinterference
        Interfc=ChFi3d_FilCurveInDS(indcurve3d.Value(n3d),Isurf,
                                  PSurf.Curves2d()->Value(n3d),orien);     
        DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc);
       }
     }
 
-  // stockages des courbes de raccords 
+  // storage of connection curves 
 
     for (ic=0; ic<nedge;ic++) {
       Indices(nedge,ic,icplus,icmoins);
       if (!oksea.Value(ic)) {
        if (sharp.Value(ic) &&!deuxconges) {
-         // limitation de l'arete vive
+         // limitation of the alive edge 
          TopAbs_Orientation ori;
          gp_Pnt Pf,Pl,sommet1;
          TopoDS_Vertex Vd = TopExp::FirstVertex(TopoDS::Edge(Evive.Value(ic)));
        }
        
        if (!ponctuel.Value(ic) && !libre.Value(ic)) {
-         // raccord effectif
+         // actual connection
          if (!moresurf.Value(ic)){
            n3d++;
            TopOpeBRepDS_Curve& tcourb1 = DStr.ChangeCurve(indcurve3d.Value(n3d));
       }
     }
 
-  //stockage des courbes projetees sur plusieurs faces 
+  //storage of curves projected on several faces 
     for (ic=0; ic<nedge;ic++) {
       Indices(nedge,ic,icplus,icmoins);
       if (moresurf(ic))
        } 
     }
 
-  // stockage des courbes dans le cas de bords libres tangents 
+  // storage of curves in case of tangent free borders 
     if (droit)
       for (ic=0; ic<nedge;ic++) {
        Indices(nedge,ic,icplus,icmoins);  
        }         
       } 
   }
-  else { // il n'y a qu'un resultat partiel 
+  else { // there is only one partial result 
     done=Standard_False;
     hasresult=Standard_True;
     for (ic=0; ic<nedge;ic++) {
       Indices(nedge,ic,icplus,icmoins);
       if (!oksea.Value(ic)) {
        if (sharp.Value(ic) &&!deuxconges) {
-         // limitation de l'arete vive
+         // limitation of the alive edge
          TopAbs_Orientation ori;
          gp_Pnt Pf,Pl,sommet1;
          TopoDS_Vertex Vd = TopExp::FirstVertex(TopoDS::Edge(Evive.Value(ic)));
 
 #endif
 //=======================================================================
 //function : CompTra
-//purpose  : Calcule la Transition d'un point de debut.
+//purpose  : Calculate the Transition from start point.
 //=======================================================================
 
 static TopAbs_Orientation CompTra (const TopAbs_Orientation O1,
 
 //=======================================================================
 //function : CompCommonpoint
-//purpose  : Remplit le commonpoint dans le cas d un vertex.
+//purpose  : Fill the commonpoint in case of a vertex.
 //=======================================================================
 
 static void CompCommonPoint (ChFiDS_CommonPoint& FilPoint, 
 
 //=======================================================================
 //function : CpInterf
-//purpose  : Construit une nouvelle SurfData partageant les faces,
-//           la surface et les courbes.  
+//purpose  : Construct new SurfData sharing faces, surface and curves.  
 //=======================================================================
 
 static ChFiDS_FaceInterference CpInterf (TopOpeBRepDS_DataStructure&    DStr,
 
 //=======================================================================
 //function : CpSD
-//purpose  : Construit une nouvelle SurfData partageant les faces,
-//           la surface et les courbes.  
+//purpose  : Construct new SurfData sharing faces, surface and curves.  
 //=======================================================================
 
 static Handle(ChFiDS_SurfData) CpSD (      TopOpeBRepDS_DataStructure&         DStr,
   default:
     return 0;
   }    
-  Standard_NotImplemented::Raise("calcul abscisse non traite ");
+  Standard_NotImplemented::Raise("calculate abscisse non-processed");
   return 0.;
 }
 
     return Nl;
   }
   else {
-    //construction du plan contenant la section de CD au parametre ptg.
+    //construction of the plane containing the section of CD with parameter ptg.
     gp_Pnt PP;
     gp_Vec VV;
     Handle(Geom_Curve) c3d;
     Handle(GeomAdaptor_HSurface) 
       plan = new GeomAdaptor_HSurface(GeomAdaptor_Surface(pln));
     
-    // intersection plan spine.
+    // intersection plane spine.
     Standard_Boolean found = Standard_False;
     Standard_Boolean fini  = Standard_False;
     Standard_Integer sens = 1;
                           const Standard_Integer            cntlFiOnS)
 {
   TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
-  //On recupere points et tangentes sur edge et spine.
+  // Return points and tangents on edge and spine.
   Standard_Real wtg = SD->InterferenceOnS1().Parameter(isfirst);
   Standard_Boolean bid;
   Standard_Real wsp = ParamOnSpine(DStr,wtg,SD,Spine,iedge,0,0,tolesp,bid);
 
   
   const BRepAdaptor_Curve& bc = Spine->CurrentElementarySpine(iedge);
-//Modif contre Vertex isole sur spine
+//Modif against Vertex isolated on spine
   TopoDS_Edge support = bc.Edge();
   TopExp::Vertices(support,bout1,bout2);
   if (support.Orientation() == TopAbs_REVERSED) {
       }
     }
   }
-  //modif de lvt contre vertex isole
+  //modification of lvt against isolated vertex
   if(!tron && YaUnVoisin(Spine,iedge,ivois,isfirst)) {
     TopTools_ListIteratorOfListOfShape It;
     Standard_Integer nbed = -2;
   if (iSansFirst != 0) {
     if (iSansLast == 0) {
 #ifdef DEB
-      cout<<"Tri : Pb de Hatcher"<<endl;
+      cout<<"Parsing : Pb of Hatcher"<<endl;
 #endif
       return 0;
     }
     CD->ChangeVertex(isFirst,ons).SetPoint(Surf->Value(x,y));
   }
   else {
-//Modification pour tromper les vertex deja existants
+//Modification to find already existing vertexes
     Standard_Integer LeType = 1;
     Standard_Integer NbInt = pPH->NbPoints();
     if (NbInt>1) {
 
 //=======================================================================
 //function : SplitKPart
-//purpose  : Reconstitue les SurfData en fonction des restrictions
-//           des faces.
+//purpose  : Reconstruct SurfData depending on restrictions of faces.
 //=======================================================================
 
 Standard_Boolean ChFi3d_Builder::SplitKPart
    Standard_Boolean&                intf,
    Standard_Boolean&                intl)
 {
-  //On lance le hachurage de chacune des faces par les lignes de tangence.
+  //The the hatching of each faces is started by tangency lines.
   
   Standard_Real pitol = Precision::PIntersection();
   
 #endif
   Standard_Integer  Nb1 = 1,Nb2 = 1;
   
-  // Decoupe des lignes de tangence (hachurage).
+  // Cutting of tangency lines (hatching).
   Geom2dHatch_Intersector Inter(pitol,pitol);
   Geom2dHatch_Hatcher H1(Inter,tol2d,tolesp), H2(Inter,tol2d,tolesp);
   Standard_Integer ie;
     Nb1 = H1.NbDomains(iH1);
     if(Nb1 == 0) {
 #ifdef DEB
-      cout<<"SplitKPart : ligne de tangence en dehors de la face"<<endl;
+      cout<<"SplitKPart : tangency line out of the face"<<endl;
 #endif
       return Standard_False;
     }
     Nb2 = H2.NbDomains(iH2);
     if(Nb2 == 0) {
 #ifdef DEB
-      cout<<"SplitKPart : ligne de tangence en dehors de la face"<<endl;
+      cout<<"SplitKPart : tangency line out of the face"<<endl;
 #endif
       return Standard_False;
     }
   }
 
-  //Recuperation des vertex deb et fin de Spine
+  //Return start and end vertexes of the Spine
   TopoDS_Vertex bout1,bout2,boutemp;
   const BRepAdaptor_Curve& bc = Spine->CurrentElementarySpine(Iedge);
   TopoDS_Edge support = bc.Edge();
     bout1 = boutemp;
   }
   
-  // Recuperation des faces.
+  // Return faces.
   TopoDS_Face F1, F2;
   Handle(BRepAdaptor_HSurface) 
     bhs = Handle(BRepAdaptor_HSurface)::DownCast(S1);
   if(!bhs.IsNull()) F2 = bhs->ChangeSurface().Face();
   TopoDS_Face FBID;
   
-  // Restriction des SurfDatas par les lignes decoupees.
+  // Restriction of SurfDatas by cut lines.
   TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
   Handle(ChFiDS_SurfData) CD = Data;
   CD->ChangeIndexOfS1(DStr.AddShape(F1));
   
   if (C1.IsNull() && C2.IsNull()) {
 #ifdef DEB
-    cout<<"SplitData : 2 lignes nulles hachurage impossible"<<endl;
+    cout<<"SplitData : 2 zero lines hatching impossible"<<endl;
 #endif
     return Standard_False;
   }
   else if (C1.IsNull() || (Nb1 == 1 && !H1.Domain(iH1,1).HasFirstPoint())) {   
-    // On verifie que le point 2d de l arete degeneree est bien dans
-    // la face.
+    // It is checked if the point 2d of the degenerated edge is in the face.
     if (C1.IsNull()) {
       gp_Pnt2d p2d1 = CD->Get2dPoints(0,1);
       TopAbs_State situ = I1->Classify(p2d1,1.e-8,0);
       if(situ == TopAbs_OUT) return Standard_False;
     }
 
-    // Tri des domaines par parametres croissants,
+    // Parsing of domains by increasing parameters,
     if(!Tri(H2,iH2,Ind2,wref,0.,pitol,Nb2)) return 0;
-    // Remplissage des SurfData
+    // Filling of SurfData
     for(Standard_Integer i = 1; i <= Nb2; i++) {
       const HatchGen_Domain& Dom2 = H2.Domain(iH2,Ind2(i));
       FillSD(DStr,CD,M2,Dom2,Dom2.FirstPoint().Parameter(),1,2,pitol,bout1);
     }
   }
   else if (C2.IsNull() || (Nb2 == 1 && !H2.Domain(iH2,1).HasFirstPoint())) { 
-    // On verifie que le point 2d de l arete degeneree est bien dans
-    // la face.
+    // It is checked if the point 2d of the degenerated is in the face.
     if (C2.IsNull()) {
       gp_Pnt2d p2d2 = CD->Get2dPoints(0,2);
       TopAbs_State situ = I2->Classify(p2d2,1.e-8,0);
       if(situ == TopAbs_OUT) return Standard_False;
     }
 
-    // Tri des domaines par parametres croissants,
+    // Parsing of domains by increasing parameters,
     if(!Tri(H1,iH1,Ind1,wref,0.,pitol,Nb1)) return 0;
-    // Remplissage des SurfData
+    // Filling of SurfData
     for(Standard_Integer i = 1; i <= Nb1; i++) {
       const HatchGen_Domain& Dom1 = H1.Domain(iH1,Ind1(i));
       FillSD(DStr,CD,M1,Dom1,Dom1.FirstPoint().Parameter(),1,1,pitol,bout1);
   }
   else {
     
-    // Tri des domaines par parametres croissants,
-    // lorsqu il y a un cercle 2d sur un plan, on 
-    // se cale sur la ligne 2d d en face.
+    // Parsing of domains by increasing parameters,
+    // if there is a 2d circle on a plane, one goes on 2D line of opposite face.
     Standard_Real period1 = 0., period2 = 0.;
     if(ll1.IsPeriodic()) {
       if(!Tri(H2,iH2,Ind2,wref,0.,pitol,Nb2)) return 0;
     }
     
     
-    // Remplissage des SurfData
+    // Filling of SurfData
     TColStd_SequenceOfInteger ion1, ion2;
     for(Standard_Integer i = 1; i <= Nb1; i++) {
       const HatchGen_Domain& Dom1 = H1.Domain(iH1,Ind1(i));
       }
     }
     
-    // Traitement des prolongements.
-    // Ne pas tronquer, sinon, pb d'intersection pour les PerformCorner
+    // Processing of extensions.
+    // Do not truncate, otherwise, problems of intersection for PerformCorner
     // -----------------------------------------------------------------
-    // A l'appel de SplitKPart dans PerformSetOfKPart, les spines ont ete
-    // justement, prolongees aux extremites par les methodes Extent pour permettre 
-    // les intersections. On conserve les extensions des SurfData.
+    // After call of SplitKPart in PerformSetOfKPart, spines have been 
+    // extended to the extremities by methods Extent to permit 
+    // intersections. Extensions of  SurfData are preserved.
     
     if(intf) {
-      // On est en debut de spine
+      // We are at the beginning of the spine
       //-------------------------
       Standard_Integer ifirst = 0;
       Standard_Real dist = RealLast(), ptg, dsp; 
       }
     }
     if(intl) {
-      // on est en fin de spine
+      // we are at the end of the spine
       //-----------------------
       Standard_Integer ilast = 0;
       Standard_Real dist = RealLast(), ptg, dsp; 
   }
 
   if(!intf) { 
-    // On vire les SurfData entierement avant le debut de l'arete.
+    // SurfData are entirely suspended before the beginning of the edge.
     Standard_Boolean okdoc = SetData.IsEmpty();
     Standard_Integer i = 1;
     while(!okdoc) {
     }
   }
   if(!intl) { 
-    // On vire les SurfData entierement apres la fin de l'arete.
+    // SurfData are entirely suspended after the end of the edge.
     Standard_Boolean okdoc = SetData.IsEmpty();
     Standard_Integer i = 1;
     while(!okdoc) {
       okdoc = (SetData.IsEmpty() || i > SetData.Length());
     }
   }
-  // Ajout des parametres de la spine sur les SurfDatas.
+  // Add parameters of the spine on SurfDatas.
 //  for (Standard_Integer i = 1; i <= SetData.Length(); i++) {
   Standard_Integer i;
   for ( i = 1; i <= SetData.Length(); i++) {
   }
 
   if (intf && !SetData.IsEmpty()) {
-    // prolongement de la spine par extension
+    // extension of the spine
     Spine->SetFirstParameter(SetData.First()->FirstSpineParam());
   }
   else {
-    // Troncature au debut.
+    // Trnncation at the beginning.
     for (i = 1; i <= SetData.Length(); i++) {
       Handle(ChFiDS_SurfData)& CD8 = SetData.ChangeValue(i);
       Standard_Real fsp = CD8->FirstSpineParam();
 
 
   if (intl && !SetData.IsEmpty()) {
-    // prolongement de la spine par extension
+    // extension of the spine
     Spine->SetLastParameter(SetData.Last()->LastSpineParam()); 
   }
   else {
-    // Troncature a la fin.
+    // Truncation at the end.
     for (i = SetData.Length(); i >= 1; i--) {
       Handle(ChFiDS_SurfData)& CD9 = SetData.ChangeValue(i);
       Standard_Real fsp = CD9->FirstSpineParam();
 
 
 //=======================================================================
 //function : ExtentSpinesOnCommonFace
-//purpose  : Etend les spines des deux chanfreins de distances dis1,dis2
-//           sur leur face commune
-//           Les deux lignes guides Spine1 et Spine2 qui se coupent en V
-//           isfirst(i) = False si Spine(i) est orientee vers V (i = 1,2)
+//purpose  : Extend spines of two chamfers by distance dis1,dis2
+//           on their common face
+//           Two guide lines Spine1 and Spine2 cross in V
+//           isfirst(i) = False if Spine(i) is oriented to V (i = 1,2)
 //=======================================================================
 
 void ExtentSpineOnCommonFace(Handle(ChFiDS_Spine)&  Spine1,
 {                
   Standard_Real tolesp = 1.e-7;
 
-    // On determine alpha, l'angle d'ouverture entre les
-    // tangentes des deux lignes guides en V
+    // alpha, the opening angle between two 
+    // tangents of two guidelines in V is found
     Standard_Real tga1,tga2;
     Standard_Real d1plus = 0., d2plus = 0.;
 
       d2plus = dis2/tga2;
     }
 
-    //on prolonge avec les distances calculees
+    //extension by the calculated distance
     if (d1plus > 0.) {
       d1plus *= 3.;
       if (isfirst1){
 
     }
     else
-      Standard_DomainError::Raise("la face n'est commune a aucune des edges du contour");
+      Standard_DomainError::Raise("the face is not common to any of edges of the contour");
 
   }
 }
       else csp->SetDists(Dis1,Dis2);
     }
     else
-      Standard_DomainError::Raise("la face n'est commune a aucune des edges du contour");
+      Standard_DomainError::Raise("the face is not common to any of edges of the contour");
 
   }
 }
       }
     }
     else
-      Standard_DomainError::Raise("la face n'est commune a aucune des edges du contour");
+      Standard_DomainError::Raise("the face is not common to any edges of the contour");
 
   }
 }
 #ifdef DEB
   if(ChFi3d_GettraceCHRON()){
     simul.Stop();
-    cout<<"Temps total simulation : ";
+    cout<<"Total simulation time : ";
     simul.Show();
-    cout<<"dont temps construction spine : ";
+    cout<<"Spine construction time : ";
     elspine.Show();
-    cout<<"et temps cheminement : ";
+    cout<<"and progression time : ";
     chemine.Show();
   }
 #endif
   
   if (chsp.IsNull()) 
     Standard_ConstructionError::Raise
-      ("SimulSurf : la spine n est pas celle d un chanfrein");
+      ("SimulSurf : this is not the spine of a chamfer");
 
 
   Standard_Real radius;
-  // Des parametres souples!!!
+  // Flexible parameters!
   Standard_Real la = HGuide->LastParameter(), fi = HGuide->FirstParameter();
   Standard_Real longueur = la - fi;
   Standard_Real MaxStep = longueur * 0.05;
   Standard_Real radiusspine = 0, locfleche, w;
   gp_Pnt Pbid;
   gp_Vec d1,d2;
-  // Puisque l ElSpine est parametree par une quasi-abscissecurviligne,
-  // on evalue le rayon min par 1/D2 max;
+  // As ElSpine is parameterized by a curvilinear quasi-abscissa,
+  // the min radius is estimated as 1/D2 max;
   //for(Standard_Integer i = 0; i <= 20; i++){
   Standard_Integer i;
   for( i = 0; i <= 20; i++){ 
     Standard_Real dis;
     chsp->GetDist(dis);
     radius = Max(dis, radiusspine);
-    locfleche = radius*1.e-2; //critere graphique
+    locfleche = radius*1.e-2; //graphic criterion
 
     BRepBlend_Chamfer Func(S1,S2,HGuide);
     BRepBlend_ChamfInv FInv(S1,S2,HGuide); 
     chsp->Dists(dis1, dis2);
     radius = Max(dis1, dis2);
     radius = Max(radius, radiusspine);
-    locfleche = radius*1.e-2; //critere graphique
+    locfleche = radius*1.e-2; //graphic criterion
 
     BRepBlend_Chamfer Func(S1,S2,HGuide);
     BRepBlend_ChamfInv FInv(S1,S2,HGuide); 
     chsp->GetDistAngle(dis, angle, disonF1);
     radius = Max(dis, dis * tan(angle));
     radius = Max(radius, radiusspine);
-    locfleche = radius*1.e-2; //critere graphique
+    locfleche = radius*1.e-2; //graphic criterion
 
     Standard_Integer Ch = FindChoiceDistAngle(Choix, disonF1);
 
   
   if (chsp.IsNull()) 
     Standard_ConstructionError::Raise
-      ("PerformSurf : la spine n est pas celle d un chanfrein");
+      ("PerformSurf : this is not the spine of a chamfer");
 
   Standard_Real TolGuide = HGuide->Resolution(tolesp) ;
 
     Func.Set(dis,dis,Choix);
     BRepBlend_Walking TheWalk(S1,S2,I1,I2);
     
-    //calcul d'une solution de depart approchee
+    //calculate an approximate starting solution
     gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
     gp_Pnt pt1, pt2, ptgui;
     gp_XYZ temp;
     Func.Set(dis1,dis2,Choix);
     BRepBlend_Walking TheWalk(S1,S2,I1,I2);
     
-    //calcul d'une solution de depart approchee
+    //calculate an approximate starting solution
     gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
     gp_Pnt pt1, pt2, ptgui;
     gp_XYZ temp;
       Func.Set(dis1, angle, Ch);
       BRepBlend_Walking TheWalk(S1,S2,I1,I2);
     
-      //calcul d'une solution de depart approchee
+    //calculate an approximate starting solution
       gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
       gp_Pnt pt1, pt2, ptgui;
       gp_XYZ temp;
       Func.Set(dis1, angle, Ch);
       BRepBlend_Walking TheWalk(S2,S1,I2,I1);
     
-      //calcul d'une solution de depart approchee
+    //calculate an approximate starting solution
       gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
       gp_Pnt pt1, pt2, ptgui;
       gp_XYZ temp;
   
   if (chsp.IsNull()) 
     Standard_ConstructionError::Raise
-      ("PerformSurf : la spine n est pas celle d un chanfrein");
+      ("PerformSurf : this is not the spine of a chamfer");
   
   Standard_Boolean gd1,gd2,gf1,gf2;
   Handle(BRepBlend_Line) lin;
                       gd1,gd2,gf1,gf2,RecOnS1,RecOnS2);
     if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
     done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
   }
   else if (chsp->IsChamfer() == ChFiDS_TwoDist) {
     BRepBlend_Chamfer  Func(S1,S2,HGuide);
                       gd1,gd2,gf1,gf2,RecOnS1,RecOnS2);
     if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
     done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
   }
   else {
     Standard_Real d1, angle;
 
       if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
       done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
-      if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+      if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
     }
     else {
       Standard_Real Rtemp;
       Data->ChangeVertexLastOnS2() = tmp;
       if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
       done = CompleteData(Data,Func,lin,S1,S2,Or2,gd1,gd2,gf1,gf2, Standard_True);
-      if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+      if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
     }      
 
   }
 //=======================================================================
 //function : ExtentOneCorner
 //purpose  : extends the spine of the stripe S on the side of the vertex V
-// PMN : 28/11/97 : Reprend le code des conges, et cela semble marcher mieux...
+// PMN : 28/11/97 : Reproduces the code of fillets, and it seems to work better...
 //=======================================================================
 
 void ChFi3d_ChBuilder::ExtentOneCorner(const TopoDS_Vertex&          V,
   Standard_Real         Coeff = 0.5;
   Handle(ChFiDS_Spine)  Spine = S->Spine();
   ChFi3d_IndexOfSurfData(V,S,Sens);
-  if (Spine->IsTangencyExtremity((Sens == 1))) return; //Pas de prolongement sur queue
+  if (Spine->IsTangencyExtremity((Sens == 1))) return; //No extension on queue
   Standard_Real dU = Spine->LastParameter(Spine->NbEdges());
   if (Sens == 1) {
     Spine->SetFirstParameter(-dU*Coeff);
     }
     else {
       chsp[i]->GetDistAngle(tmd, tmpang, disonF1);
-      // on fait un calcul grossier de la distance 2
+      // an approximate calculation of distance 2 is done
       if (disonF1) {
        d[j]   = tmd;
        d[j+1] = tmd * tan(tmpang); 
   
   if (State[0] == ChFiDS_AllSame ){
 /*      
-   // On cherche l'intersection du chanfrein le plus gros (sur l'arete incidente)
-    // avec la face en bout
+   // The greatest intersection of the chamfer is found (on the incident edge)
+    // with the face at end
     i = 0;
     j = 1;
     if(dOnArc[j] > dOnArc[i]) {
     }
     ExtentOneCorner( V, Stripe[i] ); */
 
-    // il faut que les deux chanfreins touchent la face en bout 
+    // it is necessary that two chamfers touch the face at end 
     for (j=0; j<2; j++)
       ExtentOneCorner( V, Stripe[j] ); 
   }
     }
     else {
       chsp[i]->GetDistAngle(tmd, tmpangle, disonF1);
-      // on fait un calcul grossier de la distance 2 
+      // an approximate calculation of distance 2 is done
 
       if (disonF1) {
        d[i][0] = tmd;
   }
 
 
-  // dis[i][j] la distance du chanfrein i sur la face commune avec 
-  // le chanfrein j
+  // dis[i][j] distance from chamfer i on the common face with 
+  // chamfer j
   Standard_Real dis[3][3];
 
   for (i=0; i<3; i++) {
 
 //=======================================================================
 //function : ConexFaces
-//purpose  : F1, F2 connexes a l'edge telles que F1 corresponde
-//           a dis
+//purpose  : F1, F2 are connected to edge so that F1 corresponds to distance
 //=======================================================================
 
 void ChFi3d_ChBuilder::ConexFaces (const Handle(ChFiDS_Spine)&  Spine,
   Standard_Integer RC,Choix;
   TopoDS_Face f1,f2,ff1,ff2;
 
-  //calcul de l'orientation de reference
+  //calculate the reference orientation
   // ChFi3d_Builder::StripeOrientations is private
   SearchCommonFaces(myEFMap,Spine->Edges(1),ff1,ff2);
   ff1.Orientation(TopAbs_FORWARD);
   Sb2.Initialize(ff2);
   RC = ChFi3d::ConcaveSide(Sb1,Sb2,Spine->Edges(1),tmp1,tmp2);
                                  
-  //calcul des faces connexes
+  //calculate the connected faces
   SearchCommonFaces(myEFMap,Spine->Edges(IEdge),f1,f2);
   Sb1.Initialize(f1);
   Sb2.Initialize(f2);
 
 //=======================================================================
 //function : FindChoiceDistAngle
-//purpose  : F1, F2 connexes a l'edge telles que F1 corresponde
-//           a dis
+//purpose  : F1, F2 connected to the edge so that F1 corresponds to distance
 //=======================================================================
 
 Standard_Integer ChFi3d_ChBuilder::FindChoiceDistAngle(const Standard_Integer Choice,
 
 #endif
 
 //*********************************
-// chronometrage de la simulation
+// timing of the simulation
 //*********************************
 
 static Standard_Boolean ChFi3d_traceCHRON = Standard_False;
 { return ChFi3d_traceCHRON; }
 
 //*********************************
-// trace d une ligne de cheminement
+// trace a line of path
 //*********************************
 
 static Standard_Boolean ChFi3d_traceDRAWWALK = Standard_False;
 { return ChFi3d_traceDRAWWALK; }
 
 //**********************************
-// trace d une ligne d intersection
+// trace a line of intersection
 //**********************************
 
 static Standard_Boolean ChFi3d_traceDRAWINT = Standard_False;
 { return ChFi3d_traceDRAWINT; }
 
 //*************************************************
-// recuperation des surfaces des conges approximes.
+// return surfaces of approximated fillets.
 //*************************************************
 
 static Standard_Boolean ChFi3d_traceDRAWFIL = Standard_False;
 
 
 //*************************************************
-// recuperation des faces elargie pour le cheminement.
+// return extended faces for the path.
 //*************************************************
 
 static Standard_Boolean ChFi3d_traceDRAWENLARGE = Standard_False;
 { return ChFi3d_traceDRAWENLARGE; }
 
 //*************************************************
-// recuperation de la ligne guide pour les coins triples.
+// return the guideline for the triple corners.
 //*************************************************
 
 static Standard_Boolean ChFi3d_traceDRAWSPINE = Standard_False;
 { return ChFi3d_traceDRAWSPINE; }
 
 //*************************************************
-// set du type de ligne guide pour les coins triples.
+// set the type of guideline for the triple corners.
 //*************************************************
 
 void ChFi3d_SetcontextSPINEBEZIER(const Standard_Boolean b); 
 { return ChFi3d_contextSPINECE; }
 
 //*************************************************
-// Passage force par le cheminement pour les KPart
+// Forced passage by the path for KPart
 //*************************************************
 static Standard_Boolean ChFi3d_contextFORCEBLEND = Standard_False;
 void ChFi3d_SetcontextFORCEBLEND(const Standard_Boolean b) 
 { return ChFi3d_contextFORCEFILLING; }
 
 //*************************************************
-// Pas d optimisation pour les approx
+// No optimization for approx
 //*************************************************
 static Standard_Boolean ChFi3d_contextNOOPT = Standard_False;
 void ChFi3d_SetcontextNOOPT(const Standard_Boolean b) 
 { return ChFi3d_contextNOOPT; }
 
 // ***********************************************
-//    initialisation et resultat d'un chrono 
+//    initialization and result of a chrono 
 //************************************************
 Standard_EXPORT void ChFi3d_InitChron(OSD_Chronometer& ch)
 { 
 
 //==============================================================
 // function : ChFi3d_CheckSurfData
-// purpose  : fonction permettant de tracer une SurfData afin
-//            de verifier la bonne construction de tous les 
-//            elements, notamment des pcurves
+// purpose  : function allows to trace SurfData to check
+//            construction of all elements, namely pcurves
 //==============================================================
 #ifdef DRAW
 static Standard_Integer NbSD = 0; 
 void ChFi3d_CheckSurfData(const TopOpeBRepDS_DataStructure& DStr,
                          const Handle(ChFiDS_SurfData)& Data)
 {
-  //trace de la surface definie par le chanfrein ou le conge
-  // correspondant a la SurfData
+  //trace of the surface defined by the chamfer or the fillet
+  // corresponding to SurfData
   
   Handle(Geom_Surface) surf = (DStr.Surface( Data->Surf())).Surface();
   if (!surf.IsNull()){
 
                               const TopoDS_Edge&          E,
                               const Handle(Law_Function)& L)
 {
-  // Voir si il ne faut pas faire un controle des bounds ici!!!!!
+  // Check if it is necessary to check borders!
   if(IC <= NbElements()) {
     Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Value(IC));
     fsp->ChangeLaw(E) = L;
 #ifdef DEB
   if(ChFi3d_GettraceCHRON()){
     simul.Stop();
-    cout<<"Temps total simulation : ";
+    cout<<"Total simulation time : ";
     simul.Show();
-    cout<<"dont temps construction spine : ";
+    cout<<"Spine construction time : ";
     elspine.Show();
-    cout<<"et temps cheminement : ";
+    cout<<"and process time : ";
     chemine.Show();
   }
 #endif
 {
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("SimulSurf : la spine n est pas celle d un conge");
+    ("SimulSurf : this is not the spine of the fillet");
   Handle(BRepBlend_Line) lin;
 #ifdef DEB
 //  TopAbs_Orientation Or = S1->ChangeSurface().Face().Orientation();
 #endif
-  // Des parametres souples!!!
+  // Flexible parameters!!!
   Standard_Real locfleche, MaxStep;
   SimulParams(HGuide,fsp,MaxStep,locfleche);
   Handle(ChFiDS_SecHArray1) sec;
 {
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : this is not the spine of the fillet");
   Handle(BRepBlend_Line) lin;
   
-  // Des parametres souples!!!
+  // Flexible parameters!
   Standard_Real locfleche, MaxStep;
   SimulParams(HGuide,fsp,MaxStep,locfleche);
   Handle(ChFiDS_SecHArray1) sec;
                     PFirst,MaxStep,locfleche,TolGuide,First,Last,
                     Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
     if(!done) {
-      Standard_Failure::Raise("SimulSurf : Echec cheminement!");
+      Standard_Failure::Raise("SimulSurf : Failed process!");
     }
     Standard_Integer nbp = lin->NbPoints();
     sec = new ChFiDS_SecHArray1(1,nbp);
                     func,finv,finvp,finvc,
                     PFirst,MaxStep,locfleche,TolGuide,First,Last,
                     Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
-    if(!done) Standard_Failure::Raise("SimulSurf : Echec !");
+    if(!done) Standard_Failure::Raise("SimulSurf : Fail !");
     Standard_Integer nbp = lin->NbPoints();
     sec = new ChFiDS_SecHArray1(1,nbp);
     for(Standard_Integer i = 1; i <= nbp; i++){
                                   const Handle(BRepAdaptor_HSurface)& HSref2,
                                   const Handle(BRepAdaptor_HCurve2d)& PCref2,
                                   Standard_Boolean&                   Decroch2,
-                                  const Standard_Real                 /*Fleche*/,
+                                  const Standard_Real                 /*Arrow*/,
                                   const Standard_Real                 TolGuide,
                                   Standard_Real&                      First,
                                   Standard_Real&                      Last,
 {
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : it is not the spine of a fillet");
   Handle(BRepBlend_Line) lin;
   
-  // Des parametres souples!!!
+  // Flexible parameters!
   Standard_Real locfleche, MaxStep;
   SimulParams(HGuide,fsp,MaxStep,locfleche);
   Handle(ChFiDS_SecHArray1) sec;
                     func,finv,finvp,finvc,
                     PFirst,MaxStep,locfleche,TolGuide,First,Last,
                     Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
-    if(!done) Standard_Failure::Raise("SimulSurf : Echec cheminement!");
+    if(!done) Standard_Failure::Raise("SimulSurf : Failed Processing!");
     Standard_Integer nbp = lin->NbPoints();
     sec = new ChFiDS_SecHArray1(1,nbp);
     for(Standard_Integer i = 1; i <= nbp; i++){
                     func,finv,finvp,finvc,
                     PFirst,MaxStep,locfleche,TolGuide,First,Last,
                     Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
-    if(!done) Standard_Failure::Raise("SimulSurf : Echec !");
+    if(!done) Standard_Failure::Raise("SimulSurf : Fail !");
     Standard_Integer nbp = lin->NbPoints();
     sec = new ChFiDS_SecHArray1(1,nbp);
     for(Standard_Integer i = 1; i <= nbp; i++){
 {
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : it is not the spine of a fillet");
   Handle(BRepBlend_Line) lin;
   
-  // Des parametres souples!!!
+  // Flexible parameters!
   Standard_Real locfleche, MaxStep;
   SimulParams(HGuide,fsp,MaxStep,locfleche);
   Handle(ChFiDS_SecHArray1) sec;
                     func, finv1, finvp1, finv2, finvp2,
                     PFirst, MaxStep, locfleche, TolGuide, First, Last,
                     Soldep, 4, Inside, Appro, Forward, RecP1, RecRst1, RecP2, RecRst2);
-    if(!done) Standard_Failure::Raise("SimulSurf : Echec cheminement!");
+    if(!done) Standard_Failure::Raise("SimulSurf : Failed processing!");
     Standard_Integer nbp = lin->NbPoints();
     sec = new ChFiDS_SecHArray1(1,nbp);
     for(Standard_Integer i = 1; i <= nbp; i++){
                     PFirst, MaxStep, locfleche, TolGuide, First, Last,
                     Soldep, 4, Inside, Appro, Forward, RecP1, RecRst1, RecP2, RecRst2);
 
-    if(!done) Standard_Failure::Raise("SimulSurf : Echec !");
+    if(!done) Standard_Failure::Raise("SimulSurf : Fail !");
     Standard_Integer nbp = lin->NbPoints();
     sec = new ChFiDS_SecHArray1(1, nbp);
     for(Standard_Integer i = 1; i <= nbp; i++){
 {
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : this is not the spine of a fillet");
   Standard_Real TolGuide = HGuide->Resolution(tolesp);
   if(fsp->IsConstant()){
     BRepBlend_ConstRad Func(S1,S2,HGuide);
   Handle(ChFiDS_SurfData) Data = SeqData(1);
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : this is not the spine of a fillet");
   Standard_Boolean gd1,gd2,gf1,gf2, maybesingular;
   Handle(BRepBlend_Line) lin;
   TopAbs_Orientation Or = S1->ChangeSurface().Face().Orientation();
         ChFi3d_ResultChron(ch , t_computedata);// result perf ComputeData
 #endif 
 
-    if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
+    if(!done) return Standard_False; // recovery is possible PMN 14/05/1998
 
 #ifdef DEB 
           ChFi3d_InitChron(ch);// init  perf  CompleteData
          ChFi3d_ResultChron(ch , t_completedata);// result perf CompleteData
 #endif 
 
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
     maybesingular = (Func.GetMinimalDistance()<=100*tolapp3d);
   }
   else {
          ChFi3d_ResultChron(ch , t_completedata);// result perf CompleteData
 #endif 
 
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
     maybesingular = (Func.GetMinimalDistance()<=100*tolapp3d); 
   }
   if (maybesingular) SplitSurf(SeqData, lin);
   Handle(ChFiDS_SurfData)  Data = SeqData(1);
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : this is not the spine of a fillet");
   Handle(BRepBlend_Line) lin;
   Standard_Real PFirst = First;
   Standard_Boolean maybesingular;
                       Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
     if(!done) {
        Spine->SetErrorStatus(ChFiDS_WalkingFailure); 
-       Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+       Standard_Failure::Raise("PerformSurf : Failed processing!");
     }
     TopAbs_Orientation Or = HS2->ChangeSurface().Face().Orientation();
     done = CompleteData(Data,func,lin,HS1,HS2,Or,1);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
     maybesingular = (func.GetMinimalDistance()<=100*tolapp3d); 
   }
   else {
                       Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
     if(!done) {
       Spine->SetErrorStatus(ChFiDS_WalkingFailure);
-      Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+      Standard_Failure::Raise("PerformSurf : Failed processing!");
     }
     TopAbs_Orientation Or = HS2->ChangeSurface().Face().Orientation();
     done = CompleteData(Data,func,lin,HS1,HS2,Or,1);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
    maybesingular = (func.GetMinimalDistance()<=100*tolapp3d); 
   }
   if (maybesingular) SplitSurf(SeqData, lin);
   Handle(ChFiDS_SurfData) Data = SeqData(1);;
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : this is not the spine of a fillet");
   Handle(BRepBlend_Line) lin;
   Standard_Real PFirst = First;
   Standard_Boolean maybesingular;
                       Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
     if(!done) {
       Spine->SetErrorStatus(ChFiDS_WalkingFailure);
-      Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+      Standard_Failure::Raise("PerformSurf : Failed processing!");
     }
     TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
     done = CompleteData(Data,func,lin,HS1,HS2,Or,0);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
     maybesingular = (func.GetMinimalDistance()<=100*tolapp3d); 
   }
   else {
                       Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
     if(!done) {
       Spine->SetErrorStatus(ChFiDS_WalkingFailure);
-      Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+      Standard_Failure::Raise("PerformSurf : Failed processing!");
     }
     TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
     done = CompleteData(Data,func,lin,HS1,HS2,Or,0);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
     maybesingular = (func.GetMinimalDistance()<=100*tolapp3d); 
   }
   if (maybesingular) SplitSurf(SeqData, lin); 
   Handle(ChFiDS_SurfData) Data = SeqData(1);;
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : this is not the spine of a fillet");
   Handle(BRepBlend_Line) lin;
   Standard_Real PFirst = First;
   Standard_Boolean maybesingular;
                       Soldep, Inside, Appro, Forward, RecP1, RecRst1, RecP2, RecRst2);
     if(!done) {
        Spine->SetErrorStatus(ChFiDS_WalkingFailure);
-       Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+       Standard_Failure::Raise("PerformSurf : Failed processing!");
     }
     TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
     done = CompleteData(Data, func, lin, HS1, HS2, Or);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
     maybesingular = (func.GetMinimalDistance()<=100*tolapp3d); 
   }
   else {
 
     if(!done) {
       Spine->SetErrorStatus(ChFiDS_WalkingFailure);
-      Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+      Standard_Failure::Raise("PerformSurf : Failed processing!");
     }
     TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
     done = CompleteData(Data, func, lin, HS1, HS2, Or);
-    if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+    if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
     maybesingular = (func.GetMinimalDistance()<=100*tolapp3d); 
 
 
   Standard_Real precedant, suivant, courant;
   Standard_Real a, b, c;
   
-  // (1) Rechecheche des vi tel que l'iso v=vi soit ponctuelles
+  // (1) Finds vi so that iso v=vi is punctual
   VFirst = Min( ref->InterferenceOnS1().FirstParameter(),
                 ref->InterferenceOnS2().FirstParameter() );
   VLast  = Max( ref->InterferenceOnS1().LastParameter(),
                 ref->InterferenceOnS2().LastParameter() );
 
-  // (1.1) Recherche du premier point a l'interieur
+  // (1.1) Finds the first point inside
   for (ii=1; ii<=Nbpnt && Line->Point(ii).Parameter()<VFirst; ii++) {}
   if (ii==1) ii++;
   P =  Line->Point(ii);
   precedant = P.PointOnS1().Distance(P.PointOnS2());
   ii ++;
 
-  // (1.2) Recherche d'un minimum par "points"
+  // (1.2) Find a minimum by "points"
   for ( ; ii<=Nbpnt && Line->Point(ii).Parameter()<=VLast; ii++) {
     for (;ii<=Nbpnt && 
         Line->Point(ii).Parameter()<VLast &&
     c = pnt.Parameter();    
     suivant = pnt.PointOnS1().Distance(pnt.PointOnS2());
     if ( (courant <  precedant) && (courant < suivant) ) {
-      // (1.3) Recherche du minimum exact
+      // (1.3) Find the exact minimum
       math_FunctionRoot Resol(Fonc, (a+c)/2,
                              tol2d,//Surf->VResolution(toleps), 
                              a, c,
        
        Fonc.Value(Resol.Root(), Val);
         if (Val< tolapp3d) { 
-         // On insere la solution (en evitant les risques de confusion)
+         // the solution (avoiding the risks of confusion)
          if (LesVi.Length()==0) {
            if ( (racine > VFirst+tol2d) &&
                 (racine < VLast -tol2d) ) {
       }
       else {
 # if DEB
-       cout << "Echec calcul de la longeur minimum" << endl;
+       cout << "Failed calculation of the minimum length" << endl;
 # endif
       }
     }
-    // mise a jour si non duplication
+    // update if non duplication
     a = b;
     precedant = courant;
     b = c;
     courant = suivant;
   }
 
-  // (2) Mise a jour de la sequence de SurfData
+  // (2) Update of the sequence of SurfData
   if (LesVi.Length()>0) {
     TopOpeBRepDS_DataStructure& DStru = myDS->ChangeDS();
     Handle(ChFiDS_SurfData) SD;
     for (ii=1 ; ii<=LesVi.Length(); ii++) {
 
       T = LesVi(ii);
-      // (2.0) copie et insertion
+      // (2.0) copy and insertion
       SD = new (ChFiDS_SurfData);
       SD->Copy(ref);
       SeqData.InsertBefore(ii, SD);
       C2 = DStru.Curve(SD->InterferenceOnS2().LineIndex());
       SD->ChangeInterferenceOnS2().SetLineIndex(DStru.AddCurve(C2));
 
-      // (2.1) Modif des common Point
+      // (2.1) Modification of common Point
       SD-> ChangeVertexLastOnS1().Reset();
       SD-> ChangeVertexLastOnS2().Reset();
       ref->ChangeVertexFirstOnS1().Reset();
       ref->ChangeVertexFirstOnS1().SetTolerance(VertexTol);
       ref->ChangeVertexFirstOnS2().SetTolerance(VertexTol);     
 
-      // (2.2) Modif des interferences
+      // (2.2) Modification of interferences
       SD->ChangeInterferenceOnS1().SetLastParameter(T);
       SD->ChangeInterferenceOnS2().SetLastParameter(T);
       ref->ChangeInterferenceOnS1().SetFirstParameter(T);
       ref->ChangeInterferenceOnS2().SetFirstParameter(T);
 
-      // Les parametres sur l ElSpine
+      // Parameters on ElSpine
       SD->LastSpineParam(T);
       ref->FirstSpineParam(T);
     }
 void ChFi3d_FilBuilder::ExtentOneCorner(const TopoDS_Vertex& V,
                                        const Handle(ChFiDS_Stripe)& S)
 {
-  // revoir en utilisant les donnees au bout des conges (point,rayon,normale
-  // aux faces et tangentes a la ligne guide.
+  // review by using the data at end of fillets (point, radius, normal
+  // to the faces and tangents of the guideline).
 #ifndef DEB
   Standard_Integer      Sens = 0;
 #else
   ChFi3d_IndexOfSurfData(V,S,Sens);
   Standard_Real dU = Spine->LastParameter(Spine->NbEdges());
   if (Spine->IsTangencyExtremity((Sens == 1))) 
-    return; //Pas de prolongement sur queue de billard
+    return; //No extension in the queue
 
   if (Spine->Status((Sens == 1)) == ChFiDS_FreeBoundary) {
-    Coeff *= 2; // Il faut aller j'usquau bout.Il faudrait evaluer la longeur
+    Coeff *= 2; // It is necessary to go to the end and to evaluate the length
   }
 
   if (Sens == 1) {
 void ChFi3d_FilBuilder::ExtentTwoCorner(const TopoDS_Vertex& V,
                                        const ChFiDS_ListOfStripe& LS)
 {
-  // revoir en utilisant les donnees au bout des conges (point,rayon,normale
-  // aux faces et tangentes a la ligne guide.
+  // Review by using the data at end of fillets (point, radius, normal
+  // to faces and tangents to the guideline.
   Standard_Integer Sens;
   Standard_Real    Coeff = 0.3, Eval=0.0, dU, rad;
   Standard_Integer IE;
   Handle(ChFiDS_Stripe) Stripe;
   Handle(ChFiDS_Spine)  Spine;
 
-  // On calcul une valeur de prolongement symetrique
+  // A value of symetric extension is calculated
   for ( ; itel.More(); itel.Next()) {    
    Stripe = itel.Value();
    Spine = Stripe->Spine();
    if (dU > Eval) Eval = dU;
  }
 
-  // On applique
+  // One applies
   for (itel.Initialize(LS) ; itel.More(); itel.Next()) {    
     IE = ChFi3d_IndexOfSurfData(V,itel.Value(),Sens);
     if (!FF && Stripe == itel.Value()) Sens = -Sens;
     Stripe = itel.Value();
     Spine = Stripe->Spine();
-    if (! Spine->IsTangencyExtremity((Sens == 1))) { //Pas de prolongement sur queue
+    if (! Spine->IsTangencyExtremity((Sens == 1))) { //No extension on queue
       if (Sens == 1){ 
        Spine->SetFirstParameter(-Eval);
        Spine->SetFirstTgt(0.);
 void ChFi3d_FilBuilder::ExtentThreeCorner(const TopoDS_Vertex& V,
                                          const ChFiDS_ListOfStripe& LS)
 {
-  // revoir en utilisant les donnees au bout des conges (point,rayon,normale
-  // aux faces et tangentes a la ligne guide.
+  // Review by using the data at end of fillets (point, radius, normal
+  // to faces and tangents to the guideline.
 #ifndef DEB
   Standard_Integer Sens = 0;
 #else
       }
     }
     Handle(ChFiDS_Spine) Spine = Stripe->Spine();
-    if (Spine->IsTangencyExtremity((Sens == 1))) return; //Pas de prolongement sur queue
+    if (Spine->IsTangencyExtremity((Sens == 1))) return; //No extension on queue
     Standard_Real dU = Spine->LastParameter(Spine->NbEdges());
     if (Sens == 1){ 
       Spine->SetFirstParameter(-dU*Coeff);
 
 
 //=======================================================================
 //function : ToricRotule
-//purpose  : Teste si on est dans un cas particulier de rotule torique.
-//           Il faut trois plans avec deux conges incidents constants
-//           de meme rayon et la troisieme face perpendiculaire aux 
-//           deux autres.
+//purpose  : Test if it is a particular case of torus routine.
+//           Three planes with two constant incident fillets
+//           of the same radius and the third face perpendicular to  
+//           two others are required.
 //=======================================================================
 
 static Standard_Boolean ToricRotule(const BRepAdaptor_Surface& fac,
 //  gp_Pnt P1,P2;
   Standard_Integer nbsurf1,nbsurf2,deb1,fin1,deb2,fin2;
   Standard_Real parE1,parE2;
-  //On extrait les informations necessaires sur les conges 
+  //Necessary information on fillets is extracted 
   //------------------------------------------------------
   
-  //le premier
+  //the first
   //----------
  
   st1 = It.Value(); 
   Isd1 = ChFi3d_IndexOfSurfData(Vtx,st1,Sens1);
   
   
-  //le deuxieme
+  //the second
   //----------
   It.Next();
   st2 = It.Value();
   }
   else{ Isd2 = ChFi3d_IndexOfSurfData(Vtx,st2,Sens2); }
   
-  // Si les deux aretes a arrondir  sont tangentes on appelle GeomPlate
+  // If two edges to rounded are tangent GeomPlate is called
 
   if (Sens1==1)  E1= st1->Spine()->Edges(1);
   else E1= st1->Spine()->Edges( st1->Spine()->NbEdges());
   if (!Okvisavis) {
 
   
-// on ne se limite plus aux premieres ou aux dernieres surfdata 
-// pour rechercher celles qui son en vis a vis
+// one is not limited to the first or the last surfdata 
+// to find the opposing data
     nbsurf1=st1->SetOfSurfData()->Length();
     nbsurf2=st2->SetOfSurfData()->Length();
     deb1=1; 
     Isd1=ChFi3d_IndexOfSurfData(Vtx,st1,Sens1);
     Isd2=ChFi3d_IndexOfSurfData(Vtx,st2,Sens2);
   }
-   // StdFail_NotDone::Raise("TwoCorner : pas de face commune");
+   // StdFail_NotDone::Raise("TwoCorner : no common face");
   Standard_Integer IFaArc1 = 3-IFaCo1, IFaArc2 = 3-IFaCo2;
   SeqFil1 = st1->ChangeSetOfSurfData()->ChangeSequence();
   SeqFil2 = st2->ChangeSetOfSurfData()->ChangeSequence();
   sd2 = SeqFil2.ChangeValue(Isd2);
   surf2 = DStr.Surface(sd2->Surf()).Surface();
   TopAbs_Orientation OFaCo = FaCo.Orientation(); 
-  // On analyse les concavites et on recherche la face en vis a vis 
-  // et l intersection  eventuelle des 2 pcurves sur cette face.
+  // The concavities are analyzed and the opposite face and the
+  // eventual intersection of 2 pcurves on this face are found.
   
   ChFiDS_State Stat1,Stat2;
   Standard_Boolean isfirst1 = (Sens1 == 1);
   Standard_Boolean c1biseau = (Stat1 == ChFiDS_AllSame); 
   Standard_Boolean c1rotule = (Stat1 == ChFiDS_OnSame && Stat2 == ChFiDS_OnSame);
   
-  // On verifie que les conges ont bien un commonpoint 
-  // sur un arc commun. 
-  // Cet edge est le pivot du biseau ou de la rotule.
+  // It is checked if the fillets have a commonpoint on a common arc. 
+  // This edge is the pivot of the bevel or the knee.
   
   ChFiDS_CommonPoint& CP1 = sd1->ChangeVertex(isfirst1,IFaArc1);
   ChFiDS_CommonPoint& CP2 = sd2->ChangeVertex(isfirst2,IFaArc2);
       }
     }
     if(!ok1 || !ok2){
-      //On est dans un contexte merdique
       PerformMoreThreeCorner(Index,2);
       done=1;
       return;
   ChFi3d_ResultChron(ch ,t_t2cornerinit);//result perf initialisation 
 #endif 
   
-  //biseau
+  //bevel
   //------
   ChFiDS_CommonPoint cp11,cp12,cp21,cp22;
   ChFiDS_FaceInterference intf11,intf12,intf21,intf22;
       return;
     }
   } 
-  else if(c1rotule){//on sauve.
+  else if(c1rotule){//save.
     cp11 = sd1->Vertex(isfirst1,1);
     cp12 = sd1->Vertex(isfirst1,2);
     cp21 = sd2->Vertex(isfirst2,1);
       ChFi3d_ResultChron(ch , t_perf2cornerbyinter); // result perf  PerformTwoCornerbyInter
 #endif 
     if (!done) {
-      //on restore
+      // restore
       sd1->ChangeVertex(isfirst1,1) = cp11;
       sd1->ChangeVertex(isfirst1,2) = cp12;
       sd2->ChangeVertex(isfirst2,1) = cp21;
   }
   
   if(!c1biseau && !done){
-    //on cree une nouvelle cornerdata
+    //new cornerdata is created
     //-------------------------------
     Handle(ChFiDS_Stripe) corner = new ChFiDS_Stripe();
     Handle(ChFiDS_HData)& cornerset = corner->ChangeSetOfSurfData();
     
     if (SameSide) {
       if(ToricRotule(BRFaCo,BRS1,BRS2,st1,st2)){
-       // Construction directe.
+       // Direct construction.
        // ---------------------
        
-       //un petit coup de NextSide, leger....
-       //------------------------------------
        Standard_Integer bid;
        TopAbs_Orientation ori = OFaCo;
        TopAbs_Orientation oriS = st1->Orientation(IFaCo1);
 #endif 
       }
       else {
-       // Construction par remplissage
+       // Construction by filling remplissage
        // ----------------------------
        Standard_Real  uPCArc1,  uPCArc2;
        gp_Pnt2d p2da1,p2df1,p2da2,p2df2,p2dfac1,p2dfac2;
        p2df2 = sd2->Interference(IFaCo2).PCurveOnSurf()->Value(uPCArc2);
        sd2->Interference(IFaCo2).PCurveOnFace()->D1(uPCArc2,p2dfac2,v2dfac2);
 #ifdef DEB 
-       ChFi3d_InitChron(ch ); // init perf remplissage 
+       ChFi3d_InitChron(ch ); // init perf filling
 #endif 
        B1 = ChFi3d_mkbound(surf1,p2df1,p2da1,tolesp,2.e-4);
        B2 = ChFi3d_mkbound(surf2,p2df2,p2da2,tolesp,2.e-4);
                            HFaPiv,PCurveOnPiv,OFaCo,1,
                            0,0,0,0);
 #ifdef DEB 
-       ChFi3d_ResultChron(ch , t_remplissage);// result perf remplissage 
+       ChFi3d_ResultChron(ch , t_remplissage);// result perf filling 
 #endif 
       }
 #ifdef DEB   
-      ChFi3d_InitChron(ch); // init perf mise a jour DS
+      ChFi3d_InitChron(ch); // init perf update DS
 #endif 
       if (done){
-       // Mise a jour des 3 CornerData et de la DS
+       // Update 3 CornerData and the DS
        // ----------------------------------------
        if(resetcp1){
          gp_Pnt pjyl = CP1.Point();
        Pf2 = CP1;
        Pl2 = CP2;
        
-       // le coin pour commencer,
+       // the corner to start,
        // -----------------------
        ChFiDS_Regul regdeb, regfin;
        If1 = ChFi3d_IndexPointInDS(Pf1,DStr);
        }
        corner->SetSolidIndex(st1->SolidIndex());
        
-       // puis la Stripe du debut,
+       // then the starting Stripe,
        // ------------------------
        st1->SetCurve(Icf,isfirst1);
        st1->SetIndexPoint(If1,isfirst1,IFaCo1);
        sd1->ChangeInterference(IFaCo1).SetParameter(par1,isfirst1);
        if (IFaCo1 == 2) st1->SetOrientation(TopAbs_REVERSED,isfirst1);
        
-       // puis la Stripe de la fin,
+       // then the end Stripe,
        // -------------------------
        st2->SetCurve(Icl,isfirst2);
        st2->SetIndexPoint(Il1,isfirst2,IFaCo2);
        if (IFaCo2 == 2) st2->SetOrientation(TopAbs_REVERSED,isfirst2);
       }
 #ifdef DEB   
-      ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf mise a jour DS 
+      ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf update DS 
 #endif 
     }
     else {
-      //ici il faut distinguer celui ondiff
+      //it is necessary to make difference with
       if(!OkinterCC) {
-       Standard_Failure::Raise("TwoCorner : Pas d intersetion pc pc");
+       Standard_Failure::Raise("TwoCorner : No intersection pc pc");
       }
       Handle(ChFiDS_Stripe) stsam, stdif;
       Handle(ChFiDS_SurfData) sdsam, sddif;
        ifacodif = IFaCo1; ifaopdif = IFaArc1; isfirstdif = isfirst1;
       }
       else {
-       Standard_Failure::Raise("TwoCorner : Config inconnue");
+       Standard_Failure::Raise("TwoCorner : Config unknown");
       }
-      //On verifie que la surface ondiff a un point sur arc du cote oppose
-      //a la face commune et que cet arc est connexe a la face d appui 
-      //oppose a la face commune de la surface onsame.
+      //It is checked if surface ondiff has a point on arc from the side opposed
+      //to the common face and if this arc is connected to the base face  
+      //opposed to common face of the surface onsame.
       ChFiDS_CommonPoint& cpopdif = sddif->ChangeVertex(isfirstdif,ifaopdif);
       if(!cpopdif.IsOnArc()) {
        Standard_Failure::Raise
-         ("TwoCorner : Pas de point sur restriction sur la surface OnDiff");
+         ("TwoCorner : No point on restriction on surface OnDiff");
       }
       const TopoDS_Edge& Arcopdif = cpopdif.Arc();
       const TopoDS_Face& Fopsam = TopoDS::Face(DStr.Shape(sdsam->Index(ifaopsam)));
        }
        else if(!ex.More()) {
          Standard_Failure::Raise
-           ("TwoCorner : Pas de face commune pour boucler le contour");
+           ("TwoCorner : No common face to loop the contour");
        }
       }
 #ifdef DEB 
-      ChFi3d_InitChron(ch ); // init perf remplissage 
+      ChFi3d_InitChron(ch ); // init perf filling 
 #endif 
       Handle(GeomFill_Boundary) Bsam,Bdif,Bfac;
       gp_Pnt2d ppopsam = 
                          HBRFopsam,pcnul,Osurfsam,1,
                          0,0,0,0);
 #ifdef DEB 
-      ChFi3d_ResultChron(ch , t_remplissage);// result perf remplissage 
+      ChFi3d_ResultChron(ch , t_remplissage);// result perf filling 
 #endif 
-      if(!done) Standard_Failure::Raise("concavites inverses : echec");
+      if(!done) Standard_Failure::Raise("concavites inverted : fail");
 #ifdef DEB   
-      ChFi3d_InitChron(ch); // init perf mise a jour DS
+      ChFi3d_InitChron(ch); // init perf update DS
 #endif 
-      // Mise a jour des 3 CornerData et de la DS
+      // Update 3 CornerData and the DS
       // ----------------------------------------
-      // le coin pour commencer,
+      // the corner to start,
       // -----------------------
       Standard_Real P1deb,P2deb,P1fin,P2fin;
       Standard_Integer If1,If2,Il1,Il2,Icf,Icl;
       tolreached = Max(tolreached,tolr1);
       TopOpeBRepDS_Curve Tcurv1(C3d,tolreached);
       Icf = DStr.AddCurve(Tcurv1);
-      // ici petite veru pour mettre la pcurve on face dans la DS
+      // place the pcurve on face in the DS
       TopAbs_Orientation OpcFopsam = sdsam->Interference(ifaopsam).Transition();
       Standard_Integer IFopsam = sdsam->Index(ifaopsam);
       if(isfirstsam) OpcFopsam = TopAbs::Reverse(OpcFopsam);
 
       corner->SetSolidIndex(stsam->SolidIndex());
        
-      // puis la Stripe OnSame
+      // then Stripe OnSame
       // ---------------------
       const ChFiDS_FaceInterference& intcoin1 = coin->InterferenceOnS1();
       stsam->SetCurve(intcoin1.LineIndex(),isfirstsam);
-      stsam->InDS(isfirstsam); // filDS fait deja le boulot depuis le coin.
+      stsam->InDS(isfirstsam); // filDS already works from the corner.
       stsam->ChangePCurve(isfirstsam) = coin->InterferenceOnS1().PCurveOnFace();
       stsam->SetIndexPoint(If1,isfirstsam,ifaopsam);
       stsam->SetIndexPoint(Il1,isfirstsam,ifacosam);
       sdsam->ChangeInterferenceOnS2().SetParameter(uintpcsam,isfirstsam);
       if (ifaopsam == 2) stsam->SetOrientation(TopAbs_REVERSED,isfirstsam);
        
-      // puis la Stripe OnDiff
+      // then Stripe OnDiff
       // ---------------------
       stdif->SetCurve(Icl,isfirstdif);
       stdif->ChangePCurve(isfirstdif) = pcsurfdif;
       sddif->ChangeInterference(ifacodif).SetParameter(uintpcdif,isfirstdif);
       if (ifaopdif == 1) stdif->SetOrientation(TopAbs_REVERSED,isfirstdif);
 #ifdef DEB   
-      ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf mise a jour DS 
+      ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf update DS 
 #endif 
     }
     if(!myEVIMap.IsBound(Vtx)){
 
 
 //=======================================================================
 //function : ToricCorner
-//purpose  : Teste si on est dans le cas pariculier d un coin torique 
-//           (ou spherique limite par des isos).
+//purpose  : Test if this is a paricular cas of a torus corner 
+//           (or spherical limited by isos).
 //=======================================================================
 
 static Standard_Boolean ToricCorner(const TopoDS_Face& F,
 
 //=======================================================================
 //function : PerformThreeCorner
-//purpose  : Calcul du conge sur un sommet avec trois aretes 
-//           incidentes portant chacune un conge.
+//purpose  : Calculate fillet on a top with three edges 
+//           incident carrying each edge.
 //=======================================================================
 
 void ChFi3d_FilBuilder::PerformThreeCorner(const Standard_Integer Jndex)
     Index[ii] = ChFi3d_IndexOfSurfData(Vtx,It.Value(),sens[ii]);
     CD[ii] = It.Value();
   }
-  // On verifie que l une des CD ne figure pas deux fois, au quel cas 
-  // il faut modifier le retour de IndexOfSurfData qui prend la 
-  // premiere des solutions.
+  // It is checked if one of CD is not present twice in which  
+  // case it is necessary to modify the return of IndexOfSurfData  
+  // that takes the first solution.
   if(CD[0] == CD[1]){ 
     Index[1] = CD[1]->SetOfSurfData()->Length();
     sens[1] = -1;
                      p[1][2],p[2][1],Index[1],Index[2],face[0],sameside[0],
                      jf[1][2],jf[2][1]);
   //
-  // Analyse des concavites des 3 conges :
-  //        - 2 concavites identiques et 1 inverse.
-  //        - 3 concavites identiques
+  // Analyze concavities of 3 fillets :
+  //        - 2 concavities identic and 1 inverted.
+  //        - 3 concavities identic
   //
   if(oksea[2] && oksea[1] && !sameside[2] && !sameside[1])
     { pivot = 0; deb = 1; fin = 2;}
   else if(oksea[1] && oksea[0] && !sameside[1] && !sameside[0])
     { pivot = 2; deb = 0; fin = 1;}
   else if(oksea[0] && oksea[1] && oksea[2]){ 
-    // 3 concavites identiques.
+    // 3 concavities identic.
     pivot = SearchPivot(sens,p,tol2d);
     if(pivot < 0){ 
 #ifdef DEB
-      cout<<"pivot non trouve, on appelle plate"<<endl;
+      cout<<"pivot not found, plate is called"<<endl;
 #endif
       PerformMoreThreeCorner(Jndex, 3);
       return;
   ifacfin = CD[fin]->ChangeSetOfSurfData()->Value(i[fin][pivot])->Index(3-jf[fin][pivot]);
   if(ifacfin != ifacdeb){
 #ifdef DEB
-    cout<<"plusieurs faces d'appui, on appelle plate"<<endl;
+    cout<<"several base faces, plate is called"<<endl;
 #endif
     PerformMoreThreeCorner(Jndex, 3);
     return;
   }
   if(i[pivot][deb] != i[pivot][fin]){
 #ifdef DEB
-    cout<<"changement de surfdata sur le pivot, on appelle plate"<<endl;
+    cout<<"load surfdata on the pivot, plate is called"<<endl;
 #endif
     PerformMoreThreeCorner(Jndex, 3);
     return;
     if(!c1toric)c1spheric=(Abs(qr[0]-qr[1])<tolesp && Abs(qr[0]-qr[2])<tolesp);
   }
   
-  //  Autrefois pour eviter les bouclages on mettait toujours les
-  //  points a l interieur, ca pouvait gener la construction de la
-  //  ligne guide du coin qui aujourd hui est un cercle.
+  //  Previously to avoid loops the points were always located 
+  //  inside, which could impede the construction of the
+  //  guideline of the corner which now is a circle.
   //  Standard_Integer jjjd = jf[deb][fin], jjjf = jf[fin][deb];
   //  if (pivdif) jjjd = jf[deb][pivot], jjjf = jf[fin][pivot];
   Standard_Integer jjjd = jf[deb][pivot], jjjf = jf[fin][pivot];
                        0,sens[pivot],Pdp,Vdp,Rdp);
   ChFi3d_ExtrSpineCarac(DStr,CD[pivot],i[pivot][fin],p[pivot][fin],
                        0,sens[pivot],Pfp,Vfp,Rfp);
-  //dans le cas allsame on controle que les points sur la face ne 
-  //sont pas trop pres ce qui risque de faire foirer le cheminement.
+  //in cas of allsame it is checked that points on the face are not 
+  //too close, which can stop the work.
   if(!pivdif) {
     gp_Pnt ptestdeb,ptestfin; gp_Vec bidvec; Standard_Real bidr;
     ChFi3d_ExtrSpineCarac(DStr,CD[deb],i[deb][pivot],p[deb][pivot],
     if(Abs(p[pivot][deb] - p[pivot][fin]) <= tol2d)
       c1toric = ToricCorner(face[pivot],Rdeb,Rfin,Vdp);
   }
-  // on a le pivot, le CD deb et le CD fin (enfin on espere !?!) :
+  // there is a pivot, the start and the end CD (finally !?!) :
   // -------------------------------------------------------------
-  // les criteres determinant si le coin est un tore ou une sphere
-  // sont uniquement fondes sur la configuration des sections en 
-  // bout et la nature des faces, il faudra faire des tests pour 
-  // determiner si une analyse plus subtile des conges incidents
-  // n est pas necessaire pour assurer la tangence entre ceux-ci
-  // et le coin (en particulier dans les cas a rayon variable).
+  // the criterions determining if the corner is a torus or a sphere
+  // are based only on the configuration of sections at end and the 
+  // nature of faces, it is necessary to make tests to 
+  // determine if a more detailed analysis of incident fillets
+  // is necessare to provide tangency between them and 
+  // the corner (in particular in the case with variable radius).
   
   
   
     fdpiv = CD[pivot]->ChangeSetOfSurfData()->ChangeValue(i[pivot][deb]);
   
   
-  // On construit les HSurfaces et autres outils qui vont bien.
+  // HSurfaces and other suitable tools are constructed.
   // ----------------------------------------------------------
   
   TopAbs_Orientation OFac = face[pivot].Orientation();
   
   Handle(GeomAdaptor_HSurface) Surf = new GeomAdaptor_HSurface(gasurf);
   //  Handle(BRepTopAdaptor_TopolTool) IFac = new BRepTopAdaptor_TopolTool(Fac);
-  // Essai de ne pas classifier sur la face pour les cas de conges rentrants
-  // qui debordent naturellement.  
+  // Try to not classify on the face for cases of reentering fillets which naturally depass 
+  // the border.  
   Handle(GeomAdaptor_HSurface) 
     bidsurf = new GeomAdaptor_HSurface(Fac->ChangeSurface().Surface());
   Handle(Adaptor3d_TopolTool) 
     IFac = new Adaptor3d_TopolTool(bidsurf);
-  // fin de l essai.
+  // end of the attempt.
   Handle(Adaptor3d_TopolTool) ISurf = new Adaptor3d_TopolTool(Surf);
   Handle(ChFiDS_Stripe) corner = new ChFiDS_Stripe();
   Handle(ChFiDS_HData)& cornerset = corner->ChangeSetOfSurfData();
   if (c1toric){
     
 #ifdef DEB 
-    ChFi3d_InitChron(ch); // init perf cas torique 
+    ChFi3d_InitChron(ch); // init perf case torus 
 #endif 
     
-    // Construction directe.
+    // Direct Construction.
     // ---------------------
     done = ChFiKPart_ComputeData::ComputeCorner
       (DStr,coin,Fac,Surf,oo1,oo2,o1,o2,Rdeb,Rdp,pfac1,pfac2,psurf1,psurf2);
     
 #ifdef DEB 
-    ChFi3d_ResultChron(ch , t_torique); // result perf cas torique 
+    ChFi3d_ResultChron(ch , t_torique); // result perf case torus 
 #endif 
     
   }
   else if(c1spheric){
     
 #ifdef DEB   
-    ChFi3d_InitChron(ch); //init perf cas spherique 
+    ChFi3d_InitChron(ch); //init perf case sphere 
 #endif 
     
     done = ChFiKPart_ComputeData::ComputeCorner
       (DStr,coin,Fac,Surf,oo1,oo2,o1,o2,Rdp,pfac1,psurf1,psurf2);
     
 #ifdef DEB  
-    ChFi3d_ResultChron(ch , t_spherique);// result perf cas spherique 
+    ChFi3d_ResultChron(ch , t_spherique);// result perf cas sphere 
 #endif 
     
   }
       ChFi3d_InitChron(ch);// init perf not filling 
 #endif
       
-      //on se calcule une ligne guide,
+      //Calculate a guideline,
       //------------------------------
-      //Problemes nombreux de bouclages et demi-tours lies 
-      //a la courbure de la ligne guide !!!!!! 
-      //POUR L INSTANT CERCLE.
-      //Si un jour on change de nature de ligne guide il faudra
-      //remettre les points Pdeb et Pfin a l interieur (voir le
-      //commentaire a ce sujet a la ligne du calcul de Pdeb et Pfin).
+      //Numerous problems with loops and half-turns connected to 
+      //the curvature of the guideline !!!!!! 
+      //FOR CIRCLE.
+      //If the nature of guideline is changed it is necessary to 
+      //reset points Pdeb and Pfin at the inside (see the
+      //comments about it in the calculation of Pdeb and Pfin).
       
       Standard_Real radpondere = (Rdp+Rfp)/2.;
       Standard_Real locfleche = fleche;
                                                          Pdeb,Vdeb,
                                                          Pfin,Vfin,radpondere);
       if(spinecoin.IsNull()){
-       // On est dans un cas pourri ou l intersection des plans 
-       // de section se fait en dehors du secteur.
+       // This is a bad case when the intersection of 
+       // section planes is done out of the sector.
        spinecoin = ChFi3d_Spine(Pdeb,Vdeb,
                                 Pfin,Vfin,radpondere);
        WFirst = 0.; WLast = 1.;
       cornerspine->ChangeCurve().SetCurve(spinecoin);
       cornerspine->ChangeCurve().FirstParameter(WFirst - pasmax);
       cornerspine->ChangeCurve().LastParameter(WLast + pasmax);
-      // Juste pour leurrer le Compute data qui ne doit pas
-      // en avoir besoin dans ce cas precis ...
+      // Just to confuse Compute that should not require this 
+      // in this exact case ...
       Handle(ChFiDS_Spine) NullSpine;
-      // On calcule le conge : - de deb vers fin 
-      //                       - de la face vers la surface
+      // The fillet is calculated - from beginning to end 
+      //                       - from the face to the surface
       //
       math_Vector Soldep(1,4);
       Soldep(1) = pfac1.X();
       ChFi3d_InitChron(ch); // init perf filling
 #endif
       
-      // le contour a remplir est constitue de droites uv sur deb et fin
-      // de deux pcurves (une seule si c1pointu) calculees comme on peut
-      // sur piv et la face opposee.
+      // the contour to be fillet consists of straight lines uv in beginning and end 
+      // of two pcurves (only one if c1pointu) calculted as possible
+      // on piv and the opposite face.
       Handle(GeomFill_Boundary) Bdeb,Bfin,Bpiv,Bfac;
       Handle(Geom2d_Curve) PCurveOnFace;
       if(!c1pointu) 
       else fil.Init(Bpiv,Bfin,Bfac,Bdeb,1);
       
       Handle(Geom_Surface) Surfcoin = fil.Surface();
-      Surfcoin->VReverse(); // on se ramene au sens face surf;
+      Surfcoin->VReverse(); // revert to direction face surface;
       done = CompleteData(coin,Surfcoin,
                          Fac,PCurveOnFace,
                          Surf,PCurveOnPiv,fdpiv->Orientation(),0,
   }
   
   if (done){    
-    // Mise a jour des 4 Stripes et de la DS
+    // Update of 4 Stripes and the DS
     // -------------------------------------
     
 #ifdef DEB  
-    ChFi3d_InitChron(ch);// init perf mise a jour DS
+    ChFi3d_InitChron(ch);// init perf update DS
 #endif 
     
     gp_Pnt2d pp1,pp2;
     pbf1->Add(Pf1.Point());pbf2->Add(Pf2.Point());
     pbl1->Add(Pl1.Point());pbl2->Add(Pl2.Point());
     
-    // le coin pour commencer,
+    // the start corner,
     // -----------------------
     ChFiDS_Regul regdeb, regfin;
     If1 = ChFi3d_IndexPointInDS(Pf1,DStr);
     corner->ChangeIndexLastPointOnS2(Il2);
     ChFi3d_EnlargeBox(DStr,corner,coin,*pbl1,*pbl2,0);
     
-    // puis la CornerData du debut,
-    // ----------------------------
+    // then CornerData of the beginning,
+    // --------------------------------
     Standard_Boolean isfirst = (sens[deb] == 1), rev = (jf[deb][fin] == 2);
     Standard_Integer isurf1 = 1, isurf2 = 2;
     parpp1 = p[deb][fin]; parpp2 = p[deb][pivot]; 
     if(rev) ChFi3d_EnlargeBox(DStr,CD[deb],fddeb,*pbf2,*pbf1,isfirst);
     else ChFi3d_EnlargeBox(DStr,CD[deb],fddeb,*pbf1,*pbf2,isfirst);
     
-    // puis la CornerData de la fin,
-    // -----------------------------
+    // then the end CornerData,
+    // ------------------------
     isfirst = (sens[fin] == 1); rev = (jf[fin][deb] == 2);
     isurf1 = 1; isurf2 = 2;
     parpp1 = p[fin][deb]; parpp2 = p[fin][pivot]; 
     if(rev) ChFi3d_EnlargeBox(DStr,CD[fin],fdfin,*pbl2,*pbl1,isfirst);
     else ChFi3d_EnlargeBox(DStr,CD[fin],fdfin,*pbl1,*pbl2,isfirst);
     
-    // et enfin le pivot.
+    // anf finally the pivot.
     // ------------------
     ChFiDS_FaceInterference& fi = coin->ChangeInterferenceOnS2();
     isfirst = (sens[pivot] == 1); rev = (jf[pivot][deb] == 2);
     fdpiv->ChangeVertex(isfirst,isurf2) = Pl2;
     fdpiv->ChangeInterference(isurf1).SetParameter(p[pivot][deb],isfirst);
     fdpiv->ChangeInterference(isurf2).SetParameter(p[pivot][fin],isfirst);
-    CD[pivot]->InDS(isfirst); // filDS fait deja le boulot depuis le coin.
+    CD[pivot]->InDS(isfirst); // filDS already does it from the corner.
     if(rev) ChFi3d_EnlargeBox(DStr,CD[pivot],fdpiv,*pbl2,*pbf2,isfirst);
     else ChFi3d_EnlargeBox(DStr,CD[pivot],fdpiv,*pbf2,*pbl2,isfirst);
     
-    //Pour finir on recale les tolerances des points.
+    //To end the tolerances of points are rescaled.
     ChFi3d_SetPointTolerance(DStr,*pbf1,If1);
     ChFi3d_SetPointTolerance(DStr,*pbf2,If2);
     ChFi3d_SetPointTolerance(DStr,*pbl1,Il1);
     ChFi3d_SetPointTolerance(DStr,*pbl2,Il2);
   }
   
-  //On tronque les corners data et met a jour les index.
+  //The data corners are truncated and index is updated.
   //----------------------------------------------------
   
   if(i[deb][pivot] < Index[deb]){
     CD[fin]->ChangeSetOfSurfData()->Remove(Index[fin],i[fin][pivot]-1);
     i[fin][pivot] = Index[fin]; 
   }
-  // il faudra ici tenir compte des coins mutants.
+  // it is necessary to take into account mutant corners.
   if(i[pivot][deb] < Index[pivot]) {
     CD[pivot]->ChangeSetOfSurfData()->Remove(i[pivot][deb]+1,Index[pivot]);
     Index[pivot] = i[pivot][deb];
   myListStripe.Append(corner);
   
 #ifdef DEB  
-  ChFi3d_ResultChron(ch , t_t3cornerDS);// result perf mise a jour DS
+  ChFi3d_ResultChron(ch , t_t3cornerDS);// result perf update DS
 #endif 
 }
 
       par = parandrad(i).X();
       rad = parandrad(i).Y();
       if (Abs( rad-StartRad ) > Precision::Confusion())
-       Standard_DomainError::Raise("Arete non constante");
+       Standard_DomainError::Raise("Edge is not constant");
       if (Abs( Ul-par ) <= gp::Resolution())
        return StartRad;
       if (par > Ul)
 
 Standard_Real  ChFiDS_FilSpine::Radius()const 
 {
-  if (!IsConstant()) Standard_DomainError::Raise("Spine non constante");
+  if (!IsConstant()) Standard_DomainError::Raise("Spine is not constant");
   return parandrad(1).Y();
 }
 
 
   if(npr.IsEmpty()){
     if( Rdeb < 0. && Rfin <0. ) 
-      Standard_DomainError::Raise("construction de la loi impossible");
+      Standard_DomainError::Raise("Impossible to create the law");
     else if(Rdeb < 0. || Rfin <0.){
       Standard_Real r = (Rfin<0.)? Rdeb  : Rfin;
       Handle(Law_Constant) loi = new Law_Constant();
     }
   }
   else{
-    //tri bourrin!!
     if(!yaunpointsurledeb && Rdeb >= 0.) npr.Append(gp_XY(curdeb,Rdeb));
     if(!yaunpointsurlefin && Rfin >= 0.) npr.Append(gp_XY(curfin,Rfin));
     Standard_Integer nbp = npr.Length();
        }
       }      
     }
-    //On vire les doublons.
+    //Duplicates are removed.
     Standard_Boolean fini = (nbp <= 1);
     i = 1;
     while (!fini) {
   Standard_Integer ideb = Index(deb,Standard_True);
   Standard_Integer ifin = Index(fin,Standard_False);
   Standard_Integer len = NbEdges();
-  // si la spine est periodique attention aux index et aux parametres!!!
+  // if the spine is periodic, attention to the index and parameters
   Standard_Real spinedeb = FirstParameter();
   Standard_Real spinefin = LastParameter();
 
   }
 
   if(Els->IsPeriodic()){
-    //On cree une composite periodique de range eventuellement 
-    //decale par rapport a l elspine, pour ne pas faire de l 
-    //origine un point singulier.
+    // A pereodic composite is created at range, which is eventually  
+    // offset relatively to the elspine, to avoid a single point at 
+    // origin.
     loi->SetPeriodic();
-    //Y a t il une arete constante?
+    //Is there a constant edge?
 //    for(Standard_Integer k = 1; k <= len; k++){
     Standard_Integer k;
     for( k = 1; k <= len; k++){
-      if (IsConstant(k)){ // oui !
+      if (IsConstant(k)){ // yes  !
        spinedeb = deb = curdeb = FirstParameter(k);
        spinefin = fin = deb + Period();
        for(Standard_Integer l = 1; l <= len; l++){
        }
        Rdeb = Rfin = Radius(k);
        icur++;
-       if(len == 1) curfin = LastParameter(k);//car le InPeriod va rendre 0.!!!
+       if(len == 1) curfin = LastParameter(k);//because InPeriod will make 0.!!!
        else curfin = ElCLib::InPeriod(LastParameter(k),spinedeb,spinefin);
        Handle(Law_Constant) curloi = new Law_Constant();
        curloi->Set(Rdeb,curdeb,curfin);
        break;
       }
     }
-    if(k > len){ // non !
+    if(k > len){ // no !
       if(parandrad.IsEmpty()) 
-       Standard_DomainError::Raise("Rayon non defini");
+       Standard_DomainError::Raise("Radius not defined");
       Standard_Integer nbp = parandrad.Length();
       if(nbp > 1){
        deb = parandrad.First().X();
     }
   }
   else if(IsPeriodic()){
-    // le rayon au debut.
+    // start radius.
     if (IsConstant(ind(1))) {
       Rdeb = Radius(ind(1));
       curfin = LastParameter(ind(1));
       icur++;
     } 
     else{
-      // Il y a forcement un kpart juste avant!
+      // There is inevitably kpart right before!
       Standard_Integer iprec = (ind(1) - 1);
       if(iprec == 0) iprec = len;
       if (IsConstant(iprec)){
        Rdeb = Radius(iprec);
       }
-      else Standard_DomainError::Raise("AppendLaw : pas de precedant constant bizarre!!");
+      else Standard_DomainError::Raise("AppendLaw : previous constant is missing!");
       lawencours = Standard_True;
     }
-    // le rayon a la fin.
+    // the raduis at end.
     if (IsConstant(ind(nbed))) Rfin = Radius(ind(nbed));
     else{
-      // Il y a forcement un kpart juste apres!
+      // There is inevitably kpart right after!
       Standard_Integer isuiv = (ind(nbed) + 1);
       if(isuiv == len + 1) isuiv = 1;
       if (IsConstant(isuiv)) {
        Rfin = Radius(isuiv);
       }
-      else Standard_DomainError::Raise("AppendLaw : pas de suivant constant bizarre!!");
+      else Standard_DomainError::Raise("AppendLaw : next constant is missing!");
     }
   }
   else{
-    // le rayon au debut.
+    // the radius at start.
     if (IsConstant(ind(1))) {
       Rdeb = Radius(ind(1));
       curfin = Min(fin,LastParameter(ind(1)));
        if (IsConstant(ind(1) - 1)){
          Rdeb = Radius(ind(1) - 1);
        }
-       else Standard_DomainError::Raise("AppendLaw : pas de precedant constant");
+       else Standard_DomainError::Raise("AppendLaw : previous constant is missing");
       }
       else if(parandrad.IsEmpty()){
-       Standard_DomainError::Raise("AppendLaw : pas rayon sur vertex");
+       Standard_DomainError::Raise("AppendLaw : no radius on vertex");
       }
       else Rdeb = -1.;
       lawencours = Standard_True;
     }
-    // le rayon a la fin.
+    // the radius at end.
     if (IsConstant(ind(nbed))) Rfin = Radius(ind(nbed));
     else{
       if(ind(nbed) < len){
        if (IsConstant(ind(nbed) + 1)) Rfin = Radius(ind(nbed) + 1);
-       else Standard_DomainError::Raise("AppendLaw : pas de suivant constant");
+       else Standard_DomainError::Raise("AppendLaw : next constant is missing");
       }
       else if(parandrad.IsEmpty()){
-       Standard_DomainError::Raise("AppendLaw : pas rayon sur vertex");
+       Standard_DomainError::Raise("AppendLaw : no radius on vertex");
       }
       else Rfin = -1.;
     }
   }
 
-  // On a les infos sur les extremites de l elspine, 
-  // on parcourt toutes les aretes 
+  // There are infos on the extremities of the elspine, 
+  // all edges are parsed 
   for(; icur <= nbed; icur++){
     if (IsConstant(ind(icur))) {
       Rcur = Radius(ind(icur));
       if(IsPeriodic()){ 
        curfin = ElCLib::InPeriod(curfin,spinedeb + tol3d, spinefin + tol3d);
        if(ind(icur) == ind(nbed)){
-         // Attention le curfin peut etre faut si le dernier edge passe par
-         // dessus l origine de la spine periodique.
+         // Attention the curfin can be wrong if the last edge passes 
+         // above the  origin periodic spline.
          Standard_Real biddeb = FirstParameter(ind(icur));
          biddeb = ElCLib::InPeriod(biddeb,spinedeb + tol3d, spinefin + tol3d);
          if(biddeb >= curfin) curfin = fin;
       curfin = Min(fin,curfin);
       lawencours = Standard_True;
       if(ind(icur) == ind(nbed)){
-       // Attention le curfin peut etre faut si le dernier edge passe par
-       // dessus l origine de la spine periodique.
+       // Attention the curfin can be wrong if the last edge passes 
+         // above the  origin periodic spline.
        if(IsPeriodic()) {
          Standard_Real biddeb = FirstParameter(ind(icur));
          curfin = LastParameter(ind(icur));
          if(biddeb >= curfin) curfin = fin;
          else curfin = Min(fin,curfin);
        }
-       // ou si on est en fin de spine avec prolongement.
+       // or if it is the end of spine with extension.
        else if(ind(icur) == len) curfin = fin;
        Law_Laws temp;
        mklaw(temp,parandrad,curdeb,curfin,Rdeb,Rfin,
 Handle(Law_Function)& ChFiDS_FilSpine::ChangeLaw(const TopoDS_Edge& E)
 {
   if(!SplitDone()) {
-    Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : les bornes ne sont pas a jour");
+    Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : the limits are not up-to-date");
   }
   Standard_Integer IE = Index(E);
   if (IsConstant(IE)) {
-    Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : pas de loi sur les aretes constantes");
+    Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : no law on constant edges");
   }
   Handle(ChFiDS_HElSpine) hsp = ElSpine(IE);
   Standard_Real w = 0.5*(FirstParameter(IE) + LastParameter(IE));
 
 
 class Spine from ChFiDS inherits TShared from MMgt
 
-       ---Purpose: Contient  les  informations  necessaires   a    la
-       --          construction d un conge volumique :
+       ---Purpose: Contains information necessary for construction of
+       --          a 3D fillet :
        --          
        --          
-       --          - ligne guide composee d'edges du solide, tangents
-       --          entre eux, et bordes par des faces tangentes entre
-       --          elles. 
+       --          - guideline composed of edges of the solid, tangents
+       --          between them, and borders by faces tangents
+       --          between them. 
        --          
-       --          Les outils de construction du   Sp
-       --          par propagation a partir d un  edge du solide sont
-       --          fournis dans le Builder de Fil3d.
+       --          Tools for construction of the Sp
+       --          by propagation from an edge of solid 
+       --          are provided in the Builder of Fil3d.
        --          
-       --          Le Spine contient par aileurs     des
-       --          informations concernant la nature des   extremites
-       --          du conge ( sur bord libre, sur cassure ou ferme ).
+       --          The Spine contains among others the 
+       --          information about the nature of extremities
+       --          of the fillet ( on free border , on section or closed ).
        --          
-       --          REMARQUE  IMPORTANTE  :    la  ligne  guide  ainsi
-       --          representee n est pas C2, alors que le cheminement
-       --          le  reclame.   Un  certain  nombre d  amenagements
-       --          paliatifs (voir les  methodes en fin) sont prevus,
-       --          s  ils  sont insuffisants  il faudra changer notre
-       --          fusil d  epaule et doubler le Spine d
-       --          une  ligne C2 avec  les consequences que l on sait
-       --          pour gerer les va et  vient entre KPart Blend dans
-       --          Fil3d.
+       --          IMPORTANT NOTE  :    the guideline 
+       --          represented in this way is not C2, although the path
+       --          claims it. Several palliative workarounds 
+       --          (see the methods at the end) are planned,
+       --          but they are not enough. It is necessary to change
+       --          the approach and double the Spine of line C2 with
+       --          the known consequences for management of
+       --          interactions between KPart Blend in Fil3d.
 
 
 
     Create(Tol : Real from Standard) returns mutable Spine from ChFiDS;
 
     SetEdges(me : mutable; E : Edge from TopoDS) is static;
-    ---Purpose: stocker les edges qui vont composer la ligne guide
+    ---Purpose: store edges composing the guideline
     ---C++: inline
 
     PutInFirst(me : mutable; E : Edge from TopoDS) is static;
-    ---Purpose:stocker l edge en premiere position avant tous les autres
+    ---Purpose: store the edge at the first position before all others
     ---C++: inline
 
     NbEdges(me) returns Integer is static;
 
     
     SetFirstStatus(me : mutable; S : State from ChFiDS) is static;
-    ---Purpose: stocker si le debut de l ensemble des edges demarre
-    --          sur une cassure un bord libre ou forme un contour ferme
+    ---Purpose: stores if the start of a set of edges starts on a
+    -- section of free border or forms  a closed contour
     ---C++: inline
 
 
     SetLastStatus(me : mutable; S : State from ChFiDS) is static;
-    ---Purpose: stocker si la fin de l ensemble des edges demarre
-    --          sur une cassure un bord libre ou forme un contour ferme
+   ---Purpose: stores if the end of a set of edges starts on a
+    -- section of free border or forms  a closed contour
     ---C++: inline
 
     AppendElSpine(me : mutable; Els : HElSpine from ChFiDS) 
 ----------------------
 
     Load(me : mutable) is static;
-    ---Purpose: preparer la ligne guide en fonction  des edges qui
-    --          sont des arcs elementaires (prendre un parametrage
-    --          unique  abscisse curviligne );pour pouvoir appeller
-    --          les methodes sur la geometrie (first,last,value,d1,d2)
-    --          il faut d abord preparer sinon une exception sera levee
+    ---Purpose: prepare the guideline depending on the edges that 
+    --          are elementary arks (take parameters from
+    --          a single curvilinear abscissa); to be able to call 
+    --          methods on the geometry (first,last,value,d1,d2)
+    --          it is necessary to start with preparation otherwise an
+    --          exception will be raised
 
     Resolution(me; R3d : Real) returns Real
     is static;
     is static;
     
     FirstParameter(me; IndexSpine : Integer ) returns Real 
-    ---Purpose: donne  la longueur cumulee  de tous les  arcs avant le
-    --          numero IndexSp
+    ---Purpose: gives the total length of all arcs before the 
+    --          number IndexSp
     is static;
     
     LastParameter(me; IndexSpine : Integer ) returns Real 
-    ---Purpose: donne  la longueur cumulee  jusqu  a l  arc de  numero
+    ---Purpose: gives the total length till the ark with number
     --          IndexSpine (inclus)
     is static;
     
     Length(me;IndexSpine : Integer ) returns Real 
-    ---Purpose: donne la longueur de l arc de numero IndexSp
+    ---Purpose: gives the length of ark with number IndexSp
     is static;
     
     IsPeriodic(me) returns Boolean
     is static;
     
     CurrentElementarySpine (me : mutable; Index : Integer ) 
-    ---Purpose: set la courbe courante et la renvoie 
+    ---Purpose: sets the current curve and returns it 
     returns Curve from BRepAdaptor is static; 
     ---C++: return const &
 
 
 {
 #ifdef DEB
   if(Par >= Precision::Confusion()) 
-    cout<<"Prolongement interieur en debut de ligne guide"<<endl;
+    cout<<"Interior extension at the start of guideline"<<endl;
   if(IsPeriodic())
-    cout<<"WARNING!!! Prolongement sur ligne guide periodique."<<endl;
+    cout<<"WARNING!!! Extension on periodic guideline."<<endl;
 #endif
   firstprolon = Standard_True;
   firstparam = Par;
 #ifdef DEB
   Standard_Real lll = abscissa->Value(abscissa->Upper());
   if((Par - lll) <= -Precision::Confusion()) 
-    cout<<"Prolongement interieur en fin de ligne guide"<<endl;
+    cout<<"Interior extension at the end of guideline"<<endl;
   if(IsPeriodic())
-    cout<<"WARNING!!! Prolongement sur ligne guide periodique."<<endl;
+    cout<<"WARNING!!! Extension on periodic guideline."<<endl;
 #endif
   lastprolon = Standard_True;
   lastparam = Par;
 
 Standard_Real ChFiDS_Spine::Period() const
 {
-  if(!IsPeriodic()) Standard_Failure::Raise("Spine non periodique");
+  if(!IsPeriodic()) Standard_Failure::Raise("Non-periodic Spine");
   return abscissa->Value(abscissa->Upper());
 }
 
 void  ChFiDS_Spine::SetFirstTgt(const Standard_Real W)
 {
   if(IsPeriodic()) Standard_Failure::Raise
-    ("Pas de prolongement par tangente sur les contours periodiques"); 
+    ("No extension by tangent on periodic contours"); 
 #ifdef DEB
   if(W >= Precision::Confusion()) 
-    cout<<"Prolongement interieur en debut de ligne guide"<<endl;
+    cout<<"Interior extension at start of the guideline"<<endl;
 #endif
-  //On vire le flag au cas ou il serait deja positionne pour 
-  //ne pas planter le d1
+  //The flag is suspended if is already positioned to avoid  
+  //stopping d1
   hasfirsttgt = Standard_False;
   D1(W,firstori,firsttgt);
-  //et on le remet.
+  //and it is reset.
   hasfirsttgt = Standard_True;
   firsttgtpar = W;
 }
 void  ChFiDS_Spine::SetLastTgt(const Standard_Real W)
 {
   if(IsPeriodic()) Standard_Failure::Raise
-    ("Pas de prologement par tangente sur les contours periodiques"); 
+    ("No extension by tangent periodic contours"); 
 
 #ifdef DEB
   Standard_Real L = W - abscissa->Value(abscissa->Upper());
   if(L <= -Precision::Confusion()) 
-    cout<<"Prolongement interieur en fin de ligne guide"<<endl;
+    cout<<"Interior extension at the end of guideline"<<endl;
 #endif
-  //On vire le flag au cas ou il serait deja positionne pour 
-  //ne pas planter le d1
+  //The flag is suspended if is already positioned to avoid  
+  //stopping d1 
   haslasttgt = Standard_False;
   D1(W,lastori,lasttgt);
-  //et on le remet.
+  //and it is reset.
   haslasttgt = Standard_True;
   lasttgtpar = W;
 }
 {
   if(!abscissa.IsNull()){
 #ifdef DEB
-    cout<<"nouveau load du CE"<<endl;
+    cout<<"new load of CE"<<endl;
 #endif
   }
   Standard_Integer len = spine.Length();
 
     break;
 #endif
   }    
-  Standard_NotImplemented::Raise("calcul abscisse non traite ");
+  Standard_NotImplemented::Raise("calcul abscisse not processed");
   return 0.;
 }
 #endif
   else 
     ctyp = CSpine->CurrentElementarySpine(Iedge).GetType();
 
-  // Recuperation des orientations.
+  // Return orientations.
   TopAbs_Orientation OrFace1 = TopAbs_FORWARD, OrFace2 = TopAbs_FORWARD;
   Handle(BRepAdaptor_HSurface) HS = Handle(BRepAdaptor_HSurface)::DownCast(S1);
   if (!HS.IsNull()) OrFace1 = HS->ChangeSurface().Face().Orientation();
                                    Wref,OrFace2,Standard_False);
     }
     else{
-      Standard_NotImplemented::Raise("cas particulier non ecrit");
+      Standard_NotImplemented::Raise("particular case not written");
     }
   }
   else if(!CSpine.IsNull()){
                                       Wref,OrFace2,Standard_False); 
       }
       else{
-       Standard_NotImplemented::Raise("cas particulier non ecrit");
+       Standard_NotImplemented::Raise("particular case not written");
       }
     }
     else if (CSpine->IsChamfer() == ChFiDS_TwoDist) {    
                                       Wref,OrFace2,Standard_False); 
       }
       else{
-       Standard_NotImplemented::Raise("cas particulier non ecrit");
+       Standard_NotImplemented::Raise("particular case not written");
       }
     }
     else {
                                      Wref,OrFace2,Standard_False, DisOnP); 
       }
       else{
-       Standard_NotImplemented::Raise("cas particulier non ecrit");
+       Standard_NotImplemented::Raise("particular case not written");
       }
     }
   }
     Standard_ConstructionError::Raise
       ("la face du conge torique doit etre plane");
   }
-  // On calcule comme ligne guide le cercle correspondant 
-  // a la section de S2, et divers elements de construction.
+  // The guideline is the circle corresponding 
+  // to the section of S2, and other construction elements.
 
   gp_Cylinder cyl;
   gp_Circ circ;
       typ1 != GeomAbs_Plane ||
       typ2 != GeomAbs_Plane){
     Standard_ConstructionError::Raise
-      ("rotule torique seulement entre des plans");
+      ("torus joint only between the planes");
   }
   return ChFiKPart_MakeRotule(DStr,Data,S->Plane(),S1->Plane(),
                              S2->Plane(),OS,OS1,OS2,Radius,OfS);
 
       if ( Abs(ChamfRad) < Precision::Confusion() ) pointu = Standard_True;
       if( ChamfRad < 0 ) {
 #ifdef DEB
-       cout<<"le chanfrein ne passe pas"<<endl;
+       cout<<"the chamfer can't pass"<<endl;
 #endif
        return Standard_False;
       }
 
     if (ouvert) {
       if (Abs(angCon) - Abs(SemiAngl) > -Precision::Confusion() ) {
-       cout<<"mauvais choix d'angle pour le chanfrein"<<endl;
+       cout<<"wrong choice of angle for the chamfer"<<endl;
        return Standard_False; 
       } 
     }
       SemiAngl =  Abs(angCon) + Angle;
 
       if ( (PI / 2. - SemiAngl) < Precision::Confusion() ) {
-       cout <<"mauvais choix d'angle pour le chanfrein"<<endl;
+       cout <<"wrong choice of angle for the chamfer"<<endl;
        return Standard_False;
       }
       Dis1 =  move * Tan(SemiAngl) - Dis * Abs(Sin(angCon));
       if ( Abs(ChamfRad) < Precision::Confusion() ) pointu = Standard_True;
       if( ChamfRad < 0 ) {
 #ifdef DEB
-       cout<<"le chanfrein ne passe pas"<<endl;
+       cout<<"the chamfer can't pass"<<endl;
 #endif
        return Standard_False;
       }
 
   Standard_Boolean pointu = Standard_False;
   Standard_Real ConRad, Rad, SemiAngl;
 
-  //Calcul des distance
+  //Calculation of distance
   Standard_Real dis1, dis2, cosNPCyl, sinNPCyl;
 
   if ( (plandab && DisOnP) || (!plandab && !DisOnP) ) {
     Rad = Cyl.Radius() - dis1;
     if ( Abs(Rad) <= Precision::Confusion() ) pointu = Standard_True;
     if(Rad < 0 ) {
-      cout<<"le chanfrein ne passe pas"<<endl;
+      cout<<"the chamfer can't pass"<<endl;
       return Standard_False;
     }
   }
 
 //=======================================================================
 //function : MakeChAsym
-//purpose  : cas cylindre/plan ou plan/cylindre.
+//purpose  : case cylinder/plane or plane/cylinder.
 //=======================================================================
 
 Standard_Boolean ChFiKPart_MakeChAsym(TopOpeBRepDS_DataStructure& DStr,
                                      const Standard_Boolean plandab,
                                      const Standard_Boolean DisOnP)
 {
-  // calcul du conge plan.
-  // or1 et or2 permettent de determiner dans lequel des 4 cotes crees par
-  // l'intersection des 2 surfaces_on est
-  //        _|_  et Ofpl qui est l'orientation de la face du plan permettant
-  //         |4          de determiner le cote de la matiere
+  // calculation of the fillet plane.
+  // or1 and or2 permit to determine in which of four sides created by
+  // intersection of 2 surfaces we are
+  //        _|_          Ofpl is orientation of the plane face allowing
+  //         |4          to determine the side of the material
 
   gp_Pnt OrSpine = ElCLib::Value(First, Spine);
   gp_Pnt POnCyl, POnPln, OrCyl;
     {NorF.Reverse();} 
 
   gp_Ax3 AxCyl = Cyl.Position();
-  // OrCyl est le point sur l'axe du cylindre dans le plan normal a l'axe
-  // contenant OrSpine
+  // OrCyl is the point on axis of cylinder in the plane normal to the
+  // axis containing OrSpine
   gp_Pnt Loc = AxCyl.Location();
   gp_Vec LocSp(Loc, OrSpine);
   gp_XYZ temp = AxCyl.Direction().XYZ();
   temp = temp.Multiplied(LocSp.XYZ().Multiplied(temp) );
   OrCyl.SetXYZ( (Loc.XYZ()).Added(temp) );
  
-  //construction de POnPln
+  //construction of POnPln
   gp_Vec VecTranslPln,tmp;
 
  tmp = gp_Vec(OrSpine,OrCyl);
   gp_Vec VecTranslCyl;
   VecTranslCyl = gp_Vec(OrSpine,OrCyl);
 
-  // Calcul des distances dis1 et dis2, en fonction de Dis et Angle
+  // Calculation of distances dis1 and dis2, depending on Dis and Angle
   gp_Vec DirSOrC = VecTranslCyl.Normalized();
   Standard_Real cosA1 = DirSOrC.Dot(VecTranslPln.Normalized());
   Standard_Real sinA1 = Sqrt(1. - cosA1 * cosA1);
     dis2 = temp2 + temp1 * (cosAhOC - temp1);
 
     if (dis2 < -1.E-09) {
-      cout<<"angle du chanfrein trop grand"<<endl;
+      cout<<"too great angle of chamfer"<<endl;
       return Standard_False;
     }
     else if (dis2 < 1.E-09) {
     dis2 = Dis;
   }
 
-  //construction de POnCyl 
+  //construction of POnCyl 
   Standard_Real alpha = ( 2*ASin(dis2*0.5/ray) );
   gp_Vec VecTemp = VecTranslCyl.Reversed();
 
   ElSLib::CylinderD1(UOnCyl, VOnCyl, AxCyl, Cyl.Radius(),
                      POnCyl, DUOnCyl, DVOnCyl);                
 
-  // Construction du point sur le plan
+  // Construction of the point on the plane
   if (!IsDisOnP) {
     gp_Vec Corde(POnCyl, OrSpine);
     gp_Vec TCyl = DUOnCyl.Crossed(DVOnCyl);
 
   POnPln.SetXYZ( (OrSpine.XYZ()).Added(VecTranslPln.XYZ()) );
 
-  //construction du chanfrein  
+  //construction of the chamfer  
   ElSLib::Parameters(Pln,POnPln,UOnPln,VOnPln);
   POnPln = ElSLib::PlaneValue(UOnPln,VOnPln,AxPln);
 
-  //construction de YDir pour aller de face1 vers face2.
+  //construction of YDir to go from face1 to face2.
   gp_Vec YDir(POnPln,POnCyl);
   if (!plandab){ 
     YDir.Reverse();
   Handle(Geom_Plane) Chamfer = new Geom_Plane(AxCh);
   Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(Chamfer,DStr));
 
-  // On charge les FaceInterferences avec les pcurves et courbes 3d.
+  // FaceInterferences are loaded with pcurves and curves 3d.
      //----------- edge plan-Chamfer
   gp_Pnt2d PPln2d(UOnPln,VOnPln);
   gp_Dir2d VPln2d(XDir.Dot(AxPln.XDirection()),
 
   if ( !IsDisOnP && PosChamfPln )
     toreverse = !toreverse;
-  // On regarde si l orientation du Chamfer est la meme que celle du plan
+  // It is checked if the orientation of the Chamfer is the same as of the plane
   if (toreverse)
     {Data->ChangeOrientation() = TopAbs::Reverse(Ofpl);}
   else          
   if ((!plandab && toreverse) || (plandab && !toreverse))
     {trans=TopAbs_REVERSED;}
   
-  //trans permet de determiner le cote "matiere" sur S1(2) delimite par L3d
+  //trans allows to determine the "material" side on S1(2) limited by L3d
   if (plandab) 
     {Data->ChangeInterferenceOnS1().
      SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),trans,LFac,LFil);}
 
     Rad = Cyl.Radius()- Dis1;
     if ( Abs(Rad) <= Precision::Confusion() ) pointu = Standard_True;
     if(Rad < 0 ) {
-      cout<<"le chanfrein ne passe pas"<<endl;
+      cout<<"the chamfer can't pass"<<endl;
       return Standard_False;
     }
   }
 
 //=======================================================================
 //function : MakeChamfer
-//purpose  : cas cylindre/plan ou plan/cylindre.
+//purpose  : case cylinder/plane or plane/cylinder.
 //=======================================================================
 
 Standard_Boolean ChFiKPart_MakeChamfer(TopOpeBRepDS_DataStructure& DStr,
                                       const TopAbs_Orientation Ofpl,
                                       const Standard_Boolean plandab)
 {
-  //calcul du conge plan.
-   //or1 et or2 permettent de determiner dans lequel des 4 cotes crees par
-   //l'intersection des 2 surfaces_ on est
-   //        _|_  et Ofpl qui est l'orientation de la face du plan permettant
-   //         |4          de determiner le cote de la matiere
+  // calculation of the fillet plane.
+  // or1 and or2 permit to determine in which of four sides created by
+  // intersection of 2 surfaces we are
+  //        _|_          Ofpl is orientation of the plane face allowing
+  //         |4          to determine the side of the material
+
 
   Standard_Real dis1=Dis1, dis2=Dis2; 
   if (!plandab){
     {NorF.Reverse();} 
 
   gp_Ax3 AxCyl = Cyl.Position();
-  // OrCyl est le point sur l'axe du cylindre dans le plan normal a l'axe
-  // contenant OrSpine
+  // OrCyl is the point on axis of cylinder in the plane normal to the
+  // axis containing OrSpine
   gp_Pnt Loc = AxCyl.Location();
   gp_Vec LocSp(Loc, OrSpine);
   gp_XYZ temp = AxCyl.Direction().XYZ();
 //  OrCyl.SetXYZ( (AxCyl.Location().XYZ()).Added(temp) );
 
  
-  //construction de POnPln
+  //construction of POnPln
   gp_Vec VecTranslPln,tmp;
 
   tmp = gp_Vec(OrSpine,OrCyl);
 
   POnPln.SetXYZ( (OrSpine.XYZ()).Added(VecTranslPln.XYZ()) );
 
-  //construction de POnCyl 
+  //construction of POnCyl 
   Standard_Real alpha = ( 2*ASin(dis2*0.5/Cyl.Radius()) );
 //  gp_Vec VecTranslCyl;
 //  VecTranslCyl = gp_Vec(OrSpine,OrCyl);
 
   POnCyl.SetXYZ( OrCyl.XYZ().Added(VecCylTransl.XYZ()) );
 
-  //construction du chanfrein  
+  //construction of chamfer  
   Standard_Real UOnCyl,VOnCyl,UOnPln,VOnPln;
   ElSLib::Parameters(Cyl,POnCyl,UOnCyl,VOnCyl);
   POnCyl = ElSLib::CylinderValue(UOnCyl,VOnCyl,AxCyl,Cyl.Radius());            
   ElSLib::Parameters(Pln,POnPln,UOnPln,VOnPln);
   POnPln = ElSLib::PlaneValue(UOnPln,VOnPln,AxPln);
 
-  //construction de YDir pour aller de face1 vers face2.
+  //construction of YDir to go to face1 from face2.
   gp_Vec YDir(POnPln,POnCyl);
   if (!plandab){ 
     YDir.Reverse();
   Handle(Geom_Plane) Chamfer = new Geom_Plane(AxCh);
   Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(Chamfer,DStr));
 
-  // On charge les FaceInterferences avec les pcurves et courbes 3d.
-     //----------- edge plan-Chamfer
+  // FaceInterferences are loaded with pcurves and curves 3d.
+     //----------- edge plane-Chamfer
   gp_Pnt2d PPln2d(UOnPln,VOnPln);
   gp_Dir2d VPln2d(XDir.Dot(AxPln.XDirection()),
                  XDir.Dot(AxPln.YDirection()));
 
   if (PosChamfPln )
     toreverse = !toreverse; 
-  // On regarde si l orientation du Chamfer est la meme que celle du plan
+  // It is checked if the orientation of the Chamfer is the same as of the plane
   if (toreverse)
     {Data->ChangeOrientation() = TopAbs::Reverse(Ofpl);}
   else          
   if ((!plandab && toreverse) || (plandab && !toreverse))
     {trans=TopAbs_REVERSED;}
   
-  //trans permet de determiner le cote "matiere" sur S1(2) delimite par L3d
+  //trans permits to determine the "material" side on S1(2) limited by L3d
   if (plandab) 
     {Data->ChangeInterferenceOnS1().
      SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),trans,LFac,LFil);}
     {Data->ChangeInterferenceOnS2().
      SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),trans,LFac,LFil);}
   
-     //------------edge cylindre-Chamfer       
+     //------------edge cylinder-Chamfer       
   gp_Pnt2d PCyl2d(UOnCyl,VOnCyl);
   gp_Dir2d VCyl2d=gp::DY2d();
   if ( XDir.Dot(AxCyl.Direction())<0 )
 
 
 //=======================================================================
 //function : PCurve 
-//purpose  : Calcule une droite sous forme de BSpline pour garantir 
-//           les parametres.
+//purpose  : Calculate a straight line in form of BSpline to guarantee 
+//           the parameters.
 //=======================================================================
 
 Handle(Geom2d_BSplineCurve) ChFiKPart_PCurve(const gp_Pnt2d& UV1,
 
 //=======================================================================
 //function : ProjPC
-//purpose  : Pour les coins spheriques dont les contours ne sont 
-//           pas des isos on projette le cercle.
+//purpose  : For spherical corners the contours which of are not 
+//           isos the circle is projected.
 //=======================================================================
 
 void ChFiKPart_ProjPC(const GeomAdaptor_Curve& Cg, 
       break;
 #endif
       default :
-      Standard_NotImplemented::Raise("echec approximation de la pcurve ");
+      Standard_NotImplemented::Raise("failed approximation of the pcurve ");
     }
   }
   else {
-    Standard_NotImplemented::Raise("approx pcurve sur une surface gauche");
+    Standard_NotImplemented::Raise("approximate pcurve on the left surface");
   }
 }
 
 //=======================================================================
 //function : IndexCurveInDS
-//purpose  : Met une Curve dans la DS et renvoie son index.
+//purpose  : Place a Curve in the DS and return its index.
 //=======================================================================
 
 Standard_Integer ChFiKPart_IndexCurveInDS(const Handle(Geom_Curve)& C,
 
 //=======================================================================
 //function : IndexSurfaceInDS
-//purpose  : Met une Surface dans la DS et renvoie son index.
+//purpose  : Place a Surface in the DS and return its index.
 //=======================================================================
 
 Standard_Integer ChFiKPart_IndexSurfaceInDS(const Handle(Geom_Surface)& S,
 
 
 //=======================================================================
 //function : MakeFillet
-//purpose  : cas cone/plan ou plan/cone.
+//purpose  : case cone/plane or plane/cone.
 //=======================================================================
 
 Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr,
                                      const TopAbs_Orientation Ofpl,
                                      const Standard_Boolean plandab)
 {
-//calcul du conge (tore ou sphere).
+//calculate the fillet (torus or sphere).
   Standard_Boolean c1sphere = Standard_False;
   gp_Ax3 PosPl = Pln.Position();
   gp_Dir Dpnat = PosPl.XDirection().Crossed(PosPl.YDirection());
                           Precision::Confusion());
   gp_Pnt Pv;
   if (CInt.IsDone()) {
-    //On met l origine du conge au point de depart fourni sur la 
-    //ligne guide.
+    //The origin of the fillet is set at the start point on the  
+    //guideline.
     Pv = ElCLib::Value(ElCLib::Parameter(CInt.Circle(1),PtSp),
                       CInt.Circle(1));
   }
     Rad = Maxrad - Rabio;
     if(Abs(Rad) <= Precision::Confusion()){ c1sphere = Standard_True; }
     else if(Rad < 0){ 
-      cout<<"le conge ne passe pas"<<endl; 
+      cout<<"the fillet does not pass"<<endl; 
       return Standard_False;
     }
   }
     Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(gtor,DStr));
   }
   
-  // On regarde si l orientation du conge est la meme que celle 
-  // des faces.
+  // It is checked if the orientation of the fillet is the same  
+  // as of the faces.
   gp_Pnt P,PP;
   gp_Vec deru,derv;
   P.SetCoord(cPln.X()+Rad*Dx.X(),
   if (toreverse) { Data->ChangeOrientation() = TopAbs_REVERSED; }
   else { Data->ChangeOrientation() = TopAbs_FORWARD; }
 
-  // On charge les FaceInterferences avec les pcurves et courbes 3d.
+  // FaceInterferences are loaded with pcurves and curves 3d.
   // ---------------------------------------------------------------
 
-  // La face plane.
+  // The plane face.
   // --------------
 
   Handle(Geom2d_Circle) GCirc2dPln;
                      trans,GCirc2dPln,GLin2dFil1);
   }
 
-  // La face conique.
+  // The conic face.
   // ----------------
 
   P.SetCoord(Pv.X()+Rabio*ddc.X(),
 
 
 //=======================================================================
 //function : MakeFillet
-//purpose  : cas cylindre/plan ou plan/cylindre.
+//purpose  : case cylinder/plane or plane/cylinder.
 //=======================================================================
 
 Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr,
                                      const TopAbs_Orientation Ofpl,
                                      const Standard_Boolean plandab)
 {
-  //calcul du conge cylindre.
+  //calculate the cylinder fillet.
 
-  //plan deporte de radius
+  //plane deviated from radius
   gp_Ax3 AxPln  = Pln.Position();
   gp_Dir NorPln = AxPln.XDirection().Crossed(AxPln.YDirection());
   gp_Dir NorF(NorPln);
   if (Or1 == TopAbs_REVERSED) { NorF.Reverse(); } 
   gp_Pln PlanOffset = Pln.Translated(Radius*gp_Vec(NorF));
 
-  // Cylindre parallele
+  // Parallel cylinder
   Standard_Real    ROff = Cyl.Radius();
   Standard_Boolean dedans = Standard_False;
 
   }
   else {
 #ifdef DEB
-    cout<<"le conge ne passe pas"<<endl; 
+    cout<<"the fillet does not pass"<<endl; 
 #endif
     return Standard_False;
   }
-  // intersection du plan parallele et du cylindre parallele.
+  // intersection of the parallel plane and of the parallel cylinder.
   gp_Cylinder CylOffset(Cyl.Position(),ROff);
   IntAna_QuadQuadGeo LInt(PlanOffset,CylOffset,
                          Precision::Angular(),Precision::Confusion());
   }
   else {return Standard_False;}
 
-  // Construction conge
+  // Construction fillet
   if (DirFillet.Dot(Spine.Direction()) < 0.) {DirFillet.Reverse();}
 
   Standard_Real UOnCyl,VOnCyl,UOnPln,VOnPln;
     OtherDir = tmp;
   }
   gp_Ax3 AxFil (OrFillet,DirFillet,XDir);
-  // construction YDir pour aller de face1 vers face2.
+  // construction YDir to go from face1 to face2.
   if ((XDir^OtherDir).Dot(DirFillet) < 0.)
     AxFil.YReverse();
 
     Fillet = new Geom_CylindricalSurface(AxFil,Radius);
   Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(Fillet,DStr));
 
-  // On charge les FaceInterferences avec les pcurves et courbes 3d.
-  // edge plan-Fillet
+  // FaceInterferences are loaded with pcurves and curves 3D.
+  // edge plane-Fillet
   gp_Pnt2d PPln2d(UOnPln,VOnPln);
   gp_Dir2d VPln2d(DirFillet.Dot(AxPln.XDirection()),
                  DirFillet.Dot(AxPln.YDirection()));
   ElSLib::CylinderD1(UOnFillet,V,AxFil,Radius,P,deru,derv);
   gp_Dir NorFil(deru.Crossed(derv));
   Standard_Boolean toreverse = ( NorFil.Dot(NorPln) <= 0. );
-  // On regarde si l orientation du cylindre est la meme que celle 
-  // du plan.
+  // It is checked if the orientation of the cylinder is the same as of the plane.
   if (toreverse) {Data->ChangeOrientation() = TopAbs::Reverse(Ofpl);}
   else           {Data->ChangeOrientation() = Ofpl;}
 
     SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),
                    trans,LFac,LFil);
 
-  // edge cylindre-Fillet.
+  // edge cylinder-Fillet.
   gp_Pnt2d PCyl2d(UOnCyl,VOnCyl);
   gp_Dir2d DPC = gp::DY2d();
   if (DirFillet.Dot(AxCyl.Direction()) < 0.) DPC.Reverse();
 
 //=======================================================================
 //function : MakeFillet
-//purpose  : cas cylindre/plan ou plan/cylindre.
+//purpose  : case cylinder/plane or plane/cylinder.
 //=======================================================================
 
 Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr,
                                      const Standard_Boolean plandab)
 {
 
-//calcul du conge (tore ou sphere).
+//calculation of the fillet (torus or sphere).
   Standard_Boolean c1sphere = Standard_False;
   gp_Ax3 PosPl = Pln.Position();
   gp_Dir Dpnat = PosPl.XDirection().Crossed(PosPl.YDirection());
              Or.Z()+Radius*Dp.Z());
   gp_Pnt PtSp;
   gp_Vec DSp;
- // Modification pour les PtSp trouves du mauvais cote de l'arete de couture.
+ // Modification for the PtSp found at the wrong side of the sewing edge.
   gp_Pnt PtSp2;
   gp_Vec DSp2;
   Standard_Real acote = 1e-7;
       ElCLib::D1(PR,Spine,PtSp2,DSp);
     }
   }
-  // fin de modif
+  // end of modif
   gp_Dir Dx(gp_Vec(Or,PtSp));
   Dx = Dp.Crossed(Dx.Crossed(Dp));
   gp_Dir Dy(DSp);
     if(Abs(Rad) <= Precision::Confusion()){ c1sphere = Standard_True; }
     else if(Rad < 0){ 
 #ifdef DEB
-      cout<<"le conge ne passe pas"<<endl; 
+      cout<<"the fillet can't pass"<<endl; 
 #endif
       return Standard_False;
     }
     Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(gtor,DStr));
   }
   
-  // On regarde si l orientation du conge est la meme que celle 
-  // des faces.
+  // It is checked if the orientation of the fillet is the same as of faces.
   gp_Pnt P,PP;
   gp_Vec deru,derv;
   P.SetCoord(cPln.X()+Rad*Dx.X(),
   if (toreverse) { Data->ChangeOrientation() = TopAbs_REVERSED; }
   else { Data->ChangeOrientation() = TopAbs_FORWARD; }
 
-  // On charge les FaceInterferences avec les pcurves et courbes 3d.
+  // FaceInterferences are loaded with pcurves and curves 3d.
 
-  // La face plane.
+  // The plane face.
   Handle(Geom2d_Circle) GCirc2dPln;
   Handle(Geom_Circle) GCircPln;
   gp_Ax2 circAx2 = FilAx3.Ax2();
                      trans,GCirc2dPln,GLin2dFil1);
   }
 
-  // La face cylindrique.
+  // The cylindrical face.
   P.SetCoord(Or.X()+cylrad*Dx.X(),
             Or.Y()+cylrad*Dx.Y(),
             Or.Z()+cylrad*Dx.Z());
 
 
 //=======================================================================
 //function : ChFiKPart_Sphere
-//purpose  : Construction d un conge spherique dont les contours ne sont
-//           pas tous des isos, a partir de ses trois sommets.
+//purpose  : Construction of a spherical fillet the contours which of 
+//           are not all isos, from three tops.
 //=======================================================================
 
 Standard_Boolean ChFiKPart_Sphere(TopOpeBRepDS_DataStructure& DStr,
                                  const gp_Pnt2d& P1S2,
                                  const gp_Pnt2d& P2S2)
 {
-  // Construction de la sphere :
-  // - pole sud sur PS1
-  // - origine des u donnee par P1S2
-  // - u+ vers P2S2
+  // Construction of the sphere :
+  // - pole south on PS1
+  // - origine of u given by P1S2
+  // - u+ to P2S2
 
   Standard_Real ptol = Precision::Confusion();
   gp_Pnt p1,p2,p3;
     dz = gp_Dir(gp_Vec(p1,cen));
     if(Abs(ds1.Dot(dz)-1.)>ptol){
 #ifdef DEB
-      cout<<"centre du coin spherique non trouve"<<endl;
+      cout<<"center of the spherical corner not found"<<endl;
 #endif
       return Standard_False;
     }
     gsph = new Geom_SphericalSurface(FilAx3,Rad);
   Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(gsph,DStr));
 
-  // on compare la normale de la sphere a celle de la face
-  // orientee pour determiner l orientation finale du conge.
+  // the normal of the sphere is compared to the normal of the face
+  // oriented to determine the final orientation of the fillet.
   Standard_Boolean toreverse = ( ddz.Dot(df1) <= 0. );
   if (toreverse) { Data->ChangeOrientation() = TopAbs_REVERSED; }
   else { Data->ChangeOrientation() = TopAbs_FORWARD; }
 
-  // On calcule les parametres de p2 et p3 sur la Sphere pour avoir
-  // les ranges des courbes.
+  // Parameters of p2 and p3 are calculated on the Sphere to have 
+  // ranges of curves.
   Standard_Real uu1,vv1,uu2,vv2;
   ElSLib::SphereParameters(FilAx3,Rad,p2,uu1,vv1);
   uu1 = 0.;
   ElSLib::SphereParameters(FilAx3,Rad,p3,uu2,vv2);
 
-  // On charge les FaceInterferences avec les pcurves et courbes 3d.
+  // FaceInterferences are loaded with pcurves and curves 3d.
 
-  // Le cote pointu.
+  // Pointed side.
   
   Handle(Geom_Curve) C;
   Handle(Geom2d_Curve) C2d;
     SetInterference(ChFiKPart_IndexCurveInDS(C,DStr),
                    trans,C2d,C2dFil);
 
-  // L autre cote.
+  // The other side.
 
   Standard_Real ang = ddx.Angle(ddy);
   gp_Dir dci = ddx.Crossed(ddy);
 
 
   if (uco > ufin) {
     if (Abs(theval)<PI) {
-      // test si uco est dans le secteur oppose 
+      // test if uco is in the opposite sector 
       if (uco > udeb+PI && uco < ufin+PI){
        udeb = udeb + PI;
        ufin = ufin + PI;
   ElCLib::D1(uc1,cer,ptarr,vecarr);
   gp_Ax1 ax1(ptarr, axisdir);
   gp_Dir dirarr(-vecarr);
-  //calcul de l'angle de rotation
+  //calculate angle of rotation
   Standard_Real beta(0.);
   Standard_Real length = LA->ArrowAspect()->Length();
   if (length <  Precision::Confusion()) length = 1.e-04;
        }      
       else
        {
-         // Creating the arc from AttachmentPoint2 to its "projection"
+         // Creating the arc from AttachmentPoint2 to its projection
          Standard_Real Alpha  = Abs( LastParAttachCirc - FirstParAttachCirc );
          Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / PI));
          Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 );
 
   if (uco > ufin) {
     if (Abs(theval)<PI) {
-      // test si uco est dans le secteur oppose 
+      // test if uco is in the opposite sector 
       if (uco > udeb+PI && uco < ufin+PI){
        udeb = udeb + PI;
        ufin = ufin + PI;
   ElCLib::D1(uc1,cer,ptarr,vecarr);
   gp_Ax1 ax1(ptarr, Norm);
   gp_Dir dirarr(-vecarr);
-  //calcul de l'angle de rotation
+  //calculate the angle of rotation
   Standard_Real beta;
   Standard_Real length = LA->ArrowAspect()->Length();
   if (length <  Precision::Confusion()) length = 1.e-04;
 
 //==========================================================================
 // function : DsgPrs_AnglePresentation::Add
-// purpose  : ODL 4-fevrier-97 
-//  on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose  : It is possible to choose the symbol of extremities of the face (arrow, point...)
 //==========================================================================
 
 void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
 
   if (uco > ufin) {
     if (Abs(theval)<PI) {
-      // test si uco est dans le secteur oppose 
+      // test if uco is in the opposite sector 
       if (uco > udeb+PI && uco < ufin+PI){
        udeb = udeb + PI;
        ufin = ufin + PI;
   
   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,OffsetPoint);
   
-// Lignes de rappel
+// Lines of recall
   gp_Vec vecarr;
   gp_Pnt ptarr;
   ElCLib::D1(uc1,cer,ptarr,vecarr);
   gp_Ax1 ax1(ptarr, Norm);
   gp_Dir dirarr(-vecarr);
-  //calcul de l'angle de rotation
+  //calculate angle of rotation
   Standard_Real beta(0.);
   Standard_Real length = LA->ArrowAspect()->Length();
   if (length <  Precision::Confusion()) length = 1.e-04;
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
 
 
-// On trace les fleches
+// One traces the arrows
   DsgPrs::ComputeSymbol(aPresentation,LA,ptarr,ptarr1,dirarr,dirarr2,ArrowPrs);
 }
 
 
   if (uco > ufin) {
     if (Abs(theval)<PI) {
-      // test si uco est dans le secteur oppose 
+      // test if uco is in the opposite sector 
       if (uco > udeb+PI && uco < ufin+PI){
        udeb = udeb + PI;
        ufin = ufin + PI;
   ElCLib::D1(uc1,cer,ptarr,vecarr);
   gp_Ax1 ax1(ptarr, Norm);
   gp_Dir dirarr(-vecarr);
-  //calcul de l'angle de rotation
+  //calculate the angle of rotation
   Standard_Real beta;
   Standard_Real length = LA->ArrowAspect()->Length();
   if (length <  Precision::Confusion()) length = 1.e-04;
 
 
 //==========================================================================
 // function : DsgPrs_Chamf2dPresentation::Add
-// purpose  : ODL 4-fevrier-97 
-//  on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose  : it is possible to choose the symbol of extremities of the face (arrow, point ...)
 //==========================================================================
 
 void DsgPrs_Chamf2dPresentation::Add(
 
 
 //==========================================================================
 // function : DsgPrs_DiameterPresentation::Add
-// purpose  : ODL 4-fevrier-97 
-//  on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose  : it is possible to choose the symbol of extremities of the face (arrow, point ...)
 //==========================================================================
 void DsgPrs_DiameterPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
                                       const Handle(Prs3d_Drawer)& aDrawer,
   Standard_Real parat    = ElCLib::Parameter(aCircle, AttachmentPoint);
   gp_Pnt        ptoncirc = ElCLib::Value    (parat, aCircle);
 
-  // ligne de cote
+  // sideline
 
   gp_Pnt        center  = aCircle.Location();
   gp_Vec        vecrap  (ptoncirc,center);
 // AspectText3d from Graphic3d
   Standard_Real parEndOfArrow = ElCLib::Parameter(aCircle,AttachmentPoint); //
   gp_Pnt EndOfArrow;
-  gp_Pnt DrawPosition = AttachmentPoint;// attachment point
+  gp_Pnt DrawPosition = AttachmentPoint;// point of attachment
   Standard_Boolean otherside = Standard_False;
 
   gp_Pnt Center = aCircle.Location();
 
 
   PointMax.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
-  // trait de cote : 1er groupe
+  // face processing : 1st group
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
   Prs3d_Root::NewGroup(aPresentation);
   if (outside) {
     arrdir.Reverse();
   }
-  // fleche 1 : 2eme groupe
+  // arrow 1 : 2nd group
   Prs3d_Arrow::Draw(aPresentation,Proj1,arrdir,
                    LA->Arrow1Aspect()->Angle(),
                    LA->Arrow1Aspect()->Length());
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   
-  // fleche 2 : 3eme groupe
+  // arrow 2 : 3rd group
   Prs3d_Arrow::Draw(aPresentation,Proj2,arrdir.Reversed(),
                    LA->Arrow2Aspect()->Angle(),
                    LA->Arrow2Aspect()->Length());
 
   Prs3d_Root::NewGroup(aPresentation);
   
-  // texte : 4eme groupe
+  // text : 4th group
   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
   
   AttachmentPoint1.Coord(X,Y,Z);
 
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
-  // trait de rappel 1 : 5eme groupe
+  // processing of call 1 : 5th group
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
   AttachmentPoint2.Coord(X,Y,Z);
 
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
-  // trait de rappel 2 : 6eme groupe
+  // processing of call 2 : 6th group
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
 }
   PointMax.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
 
-  // trait de cote 
+  // processing of face 
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
   
   Proj1.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
 
-  // trait de rappel 1 
+  // processing of call  1 
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
   AttachmentPoint2.Coord(X,Y,Z);
   Proj2.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
 
-  // trait de rappel 2 
+  // processing of call 2 
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
  
-  // texte 
+  // text 
   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
 
-  // symbols aux extremites de la cote
+  // symbols at the extremities of the face
   DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs);
 }
 
 
 
   PointMax.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
-  // trait de cote : 1er groupe
+  // processing of side : 1st group
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
   Prs3d_Root::NewGroup(aPresentation);
   if (outside) {
     arrdir.Reverse();
   }
-  // fleche 1 : 2eme groupe
+  // arrow 1 : 2nd group
   Prs3d_Arrow::Draw(aPresentation,Proj1,arrdir,
                    LA->Arrow1Aspect()->Angle(),
                    LA->Arrow1Aspect()->Length());
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   
-  // fleche 2 : 3eme groupe
+  // arrow 2 : 3rd group
   Prs3d_Arrow::Draw(aPresentation,Proj2,arrdir.Reversed(),
                    LA->Arrow2Aspect()->Angle(),
                    LA->Arrow2Aspect()->Length());
 
   Prs3d_Root::NewGroup(aPresentation);
   
-  // texte : 4eme groupe
+  // text : 4th group
   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
   
   AttachmentPoint1.Coord(X,Y,Z);
 
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
-  // trait de rappel 1 : 5eme groupe
+  // processing of call 1 : 5th group
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
   AttachmentPoint2.Coord(X,Y,Z);
 
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
-  // trait de rappel 2 : 6eme groupe
+  // processing of call 2 : 6th group
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
 }
 
 //==========================================================================
 // function : DsgPrs_ParalPresentation::Add
-// purpose  : ODL 4-fevrier-97 
-//  on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose  : it is possible to choose the symbol of extremities of the face (arrow, point...)
 //==========================================================================
 void DsgPrs_ParalPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
                                    const Handle(Prs3d_Drawer)& aDrawer,
   PointMax.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
 
-  // trait de cote 
+  // processing of face 
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
   if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) {
   Proj1.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
 
-  // trait de rappel 1 
+  // processing of call 1 
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
   AttachmentPoint2.Coord(X,Y,Z);
   Proj2.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
 
-   // trait de rappel 2 
+   // processing of call 2 
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
   
-  // texte 
+  // text 
   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
   
-  //fleches
+  //arrows
   DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs);
 
 
 
   gp_Pnt P1,P2;
 
   //===================================
-  // SYMETRIE D'EDGE PERPEND. A L'AXE    
+  // SYMETRY OF EDGE PERPEND. TO THE AXIS    
   //   ____        :        ____
   // edge2 |       : -=-   | edge 1
   //       |<------:------>|
 
   
 /*//=======================================================
-  // POUR EVITER LES CROISSEMENTS
-  //        P1  -=- P2                 P2  -=- P1         
-  //          \<-->/                     |<-->|
-  //           \  /                      |    |
-  //            \/                       |    | 
-  //            /\                       |    |
-  //           /  \                      |    |
-  // Pattach2 /____\ Pattach1  Pattach2 /______\ Pattach1
-  //         /  NON \                  /   OUI  \
+  // TO AVOID CROSSING
+  //        P1  -=- P2                P2  -=- P1         
+  //          \<-->/                    |<-->|
+  //           \  /                     |    |
+  //            \/                      |    | 
+  //            /\                      |    |
+  //           /  \                     |    |
+  // Pattach2 /____\ Pattach1 Pattach2 /______\ Pattach1
+  //         /  NO \                  /   YES  \
   //=======================================================
 */
 
     P2       = PntTempo;
   }  
 /*  //===================================
-  // CASSURES DES TRAITS DE RAPPEL    
+  // FRACTURES OF TRAITS OF CALL    
   //        /             \         
   //       /               \
   //       |      -=-      |
 
   if(aAxis.Distance(P1) > D1*(1 + coeff) && !Cross){
 
-    //==== TRAIT DE COTE ===========
+    //==== PROCESSING OF FACE ===========
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Pj_P1 = ElCLib::Value(ElCLib::Parameter(aAxis,P1),aAxis);
     P2.SetCoord(X,Y,Z);
 
     //=================================
-    // COTATION A L'EXTERIEUR
+    // LISTING AT THE EXTERIOR
     //                        -=-
     //      ->|----------|<------
     //        |          |
     V(2).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
     
-    //==== TRAIT DE RAPPEL 1 =====
+    //==== PROCESSING OF CALL 1 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     AttachmentPoint1.Coord(X,Y,Z);
     Vc(3).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc);
     
-    //==== TRAIT DE RAPPEL 2 =====
+    //==== PROCESSING OF CALL 2 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     AttachmentPoint2.Coord(X,Y,Z);
   }
 
 /*//===================================
-  // CASSURES DES TRAITS DE RAPPEL    
+  // FRACTURES OF PROCESSING OF CALL    
   //              -=-    
   //         |<--------->| 
   //         |           |   
 */
   else if (aAxis.Distance(P1) < D1*(1 - coeff) || Cross) {
 
-    //------ TRAIT DE COTE ------------
+    //------ PROCESSING OF FACE ------------
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Pj_P1 = ElCLib::Value(ElCLib::Parameter(aAxis,P1),aAxis);
     P2.SetCoord(X,Y,Z);
 
     //=================================
-    // COTATION A L'EXTERIEUR
+    // LISTING AT THE EXTERIOR
     //                        -=-
     //      ->|----------|<------
     //        |          |
     V(2).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
     
-    //==== TRAIT DE RAPPEL 1 =====
+    //==== PROCESSING OF CALL 1 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     AttachmentPoint1.Coord(X,Y,Z);
     Vc(3).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc);
     
-    //==== TRAIT DE RAPPEL 2 =====
+    //==== PROCESSING OF CALL 2 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     AttachmentPoint2.Coord(X,Y,Z);
   }
   else {
     
-    //==== TRAIT DE COTE ===========
+    //==== PROCESSING OF FACE ===========
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     PointMin.Coord(X,Y,Z);
     V(2).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
-    //==== TRAIT DE RAPPEL 1 =====
+    //==== PROCESSING OF CALL 1 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     AttachmentPoint1.Coord(X,Y,Z);
     V(2).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
-    //==== TRAIT DE RAPPEL 2 =====
+    //==== PROCESSING OF CALL 2 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     AttachmentPoint2.Coord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   }
 
-  //==== FLECHES ================
+  //==== ARROWS ================
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   
   if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) outside = Standard_True;
   gp_Dir arrdir = L3.Direction().Reversed();
   if (outside) arrdir.Reverse();
-  // fleche 1 ----
+  // arrow 1 ----
   Prs3d_Arrow::Draw(aPresentation,P1,arrdir,
                    LA->Arrow1Aspect()->Angle(),
                    LA->Arrow1Aspect()->Length());
   
-  // fleche 2 ----
+  // arrow 2 ----
   Prs3d_Arrow::Draw(aPresentation,P2,arrdir.Reversed(),
                    LA->Arrow2Aspect()->Angle(),
                    LA->Arrow2Aspect()->Length());
 
-  //--------------------------------------------------------------------------------------
-  //|                                SYMBOLE DE SYMETRIE                                 |
-  //--------------------------------------------------------------------------------------
+  //-------------------------------------------------------------------------------------
+  //|                                SYMBOL OF SYMMETRY                                 |
+  //-------------------------------------------------------------------------------------
 
-  //           -------    : Segment superieur
-  //         -----------  : Axe
-  //           -------    : Segment inferieur
+  //           -------    : Superior Segment 
+  //         -----------  : Axis
+  //           -------    : Inferior Segment 
   
   gp_Vec Vvar(P1,P2);
   gp_Vec vec;
   //pm = P1.Translated(Vvar.Multiplied(.5));
   pOff = OffsetPoint.Translated(vecB);
   
-  //Calcul des points extremes de l'axe du symbole
+  //Calculate the extremities of the symbol axis
   gp_Vec vecAxe = vecA.Multiplied(.7);
   pOff.Translated(vecAxe).Coord(X,Y,Z);
   V(1).SetCoord(X,Y,Z);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
-  //Calcul des points extremes du segment sup du symbole
+  //Calculate the extremities of the superior segment of the symbol
   gp_Vec vec1 = vecAxe.Multiplied(.6);
   vecAxe = Vaxe.Multiplied(vecAxe.Magnitude());
   gp_Vec vec2 = vecAxe.Multiplied(.4);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
-  //Calcul des points extremes du segment inf du symbole
+  //Calculate the extremities of the inferior segment of the symbol
   pOff.Translated(vec1.Added(vec2.Reversed())).Coord(X,Y,Z);
   V(1).SetCoord(X,Y,Z);
   pOff.Translated(vec1.Reversed().Added(vec2.Reversed())).Coord(X,Y,Z);
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
 /*//--------------------------------------------------------------------------------------
-  //|                          REPERAGE DE L'AXE DE SYMETRIE                             |
+  //|                          MARKING OF THE SYMMETRY AXIS                             |
   //--------------------------------------------------------------------------------------     
   //        ____
-  //        \  / :Curseur
+  //        \  / :Cursor
   //         \/
   //         /\
   //        /__\
   Graphic3d_Array1OfVertex V(1,2);
   Quantity_Length X,Y,Z;
     
-  //==== TRAIT DE COTE ===========
+  //==== PROCESSING OF FACE ===========
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   PointMin.Coord(X,Y,Z);
   V(2).SetCoord(X,Y,Z);
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
-  //==== TRAIT DE RAPPEL 1 =====
+  //==== PROCESSING OF CALL 1 =====
   Standard_Integer nbp = 10;
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); 
   }
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc1);
   
-  //==== TRAIT DE RAPPEL 2 =====
+  //==== PROCESSING OF CALL 2 =====
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   gp_Pnt Center2 = ProjCenter1.Translated(Vp.Reversed());
   }
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc2);
   
-  //==== FLECHES ================
+  //==== ARROWS ================
   Prs3d_Root::NewGroup(aPresentation);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   
   if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) outside = Standard_True;
   gp_Dir arrdir = L3.Direction().Reversed();
   if (outside) arrdir.Reverse();
-  // fleche 1 ----
+  // arrow 1 ----
   Prs3d_Arrow::Draw(aPresentation,P1,arrdir,
                    LA->Arrow1Aspect()->Angle(),
                    LA->Arrow1Aspect()->Length());
   
-  // fleche 2 ----
+  // arrow 2 ----
   Prs3d_Arrow::Draw(aPresentation,P2,arrdir.Reversed(),
                    LA->Arrow2Aspect()->Angle(),
                    LA->Arrow2Aspect()->Length());
 
-  //--------------------------------------------------------------------------------------
-  //|                                SYMBOLE DE SYMETRIE                                 |
-  //--------------------------------------------------------------------------------------
+  //-------------------------------------------------------------------------------------
+  //|                                SYMBOL OF SYMMETRY                                 |
+  //-------------------------------------------------------------------------------------
 
-  //           -------    : Segment superieur
-  //         -----------  : Axe
-  //           -------    : Segment inferieur
+  //           -------    : Superior Segment
+  //         -----------  : Axis
+  //           -------    : Inferior Segment 
   
   gp_Vec Vvar(P1,P2);
   gp_Vec vec;
   pm = P1.Translated(Vvar.Multiplied(.5));
   pOff = OffsetPnt.Translated(vecB);
 
-  //Calcul des points extremes de l'axe du symbole
+  //Calculation of extremas of the axis of the symbol
   gp_Vec vecAxe = vecA.Multiplied(.7);
   pOff.Translated(vecAxe).Coord(X,Y,Z);
   V(1).SetCoord(X,Y,Z);
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
-  //Calcul des points extremes du segment sup du symbole
+  //Calculation of extremas of the superior segment of the symbol
   gp_Vec vec1 = vecAxe.Multiplied(.6);
 
   vecAxe = Vaxe.Multiplied(vecAxe.Magnitude());
   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
 
-  //Calcul des points extremes du segment inf du symbole
+  //Calculation of extremas of the inferior segment of the symbol
   pOff.Translated(vec1.Added(vec2.Reversed())).Coord(X,Y,Z);
   V(1).SetCoord(X,Y,Z);
   pOff.Translated(vec1.Reversed().Added(vec2.Reversed())).Coord(X,Y,Z);
   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
   
 /*//--------------------------------------------------------------------------------------
-  //|                          REPERAGE DE L'AXE DE SYMETRIE                             |
+  //|                          MARKING OF THE AXIS OF SYMMETRY                           |
   //--------------------------------------------------------------------------------------     
   //        ____
-  //        \  / :Curseur
+  //        \  / :Cursor
   //         \/
   //         /\
   //        /__\
 
   if (AttachmentPoint1.IsEqual(AttachmentPoint2,Precision::Confusion())){
     //==============================================================
-    //  CAS DE SYMETRIE OU LE POINT REFERENCE EST SUR L'AXE DE SYM.:
+    //  SYMMETRY WHEN THE REFERENCE POINT IS ON THE AXIS OF SYM.:
     //==============================================================
-    //Marker de localisation de la cote
+    //Marker of localisation of the face
     Handle(Graphic3d_AspectMarker3d) MarkerAsp = new Graphic3d_AspectMarker3d();
     MarkerAsp->SetType(Aspect_TOM_BALL);
     MarkerAsp->SetScale(0.8);
                         AttachmentPoint1.Z());
     Prs3d_Root::CurrentGroup(aPresentation)->Marker(V3d);
 
-    //Trace du segment de raccordement
+    //Trace of the linking segment 
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Graphic3d_Array1OfVertex Vrac(1,2);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
   
     //--------------------------------------------------------------------------------------
-    //|                                SYMBOLE DE SYMETRIE                                 |
+    //|                                SYMBOL OF SYMMETRY                                 |
     //--------------------------------------------------------------------------------------
-    //           -------    : Segment superieur
-    //         -----------  : Axe
-    //           -------    : Segment inferieur
+    //           -------    : Superior Segment 
+    //         -----------  : Axis
+    //           -------    : Inferior Segment 
 
-    //Calcul des points extremes de l'axe du symbole
+    //Calculate extremas of the axis of the symbol
     gp_Vec VAO (AttachmentPoint1,OffsetPoint);
     gp_Vec uVAO  = VAO.Divided(VAO.Magnitude());
     gp_Pnt pDaxe = OffsetPoint.Translated(uVAO.Multiplied(3.));
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
 
-    //Calcul des points extremes du segment sup du symbole
+    //Calculate extremas of the superior segment of the symbol
     gp_Vec nVAO  (-uVAO.Y(),uVAO.X(),uVAO.Z());
     gp_Pnt sgP11 = pDaxe.Translated(uVAO.Multiplied(2.).Added(nVAO.Multiplied(2.)));
     gp_Pnt sgP12 = sgP11.Translated(uVAO.Multiplied(8.));
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
 
-    //Calcul des points extremes du segment inf du symbole
+    //Calculate extremas of the inferior segment of the symbol
     gp_Vec nVAOr = nVAO.Reversed();
     gp_Pnt sgP21 = pDaxe.Translated(uVAO.Multiplied(2.).Added(nVAOr.Multiplied(2.)));
     gp_Pnt sgP22 = sgP21.Translated(uVAO.Multiplied(8.));
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
   }
   //==============================================================
-  //  AUTRES CAS                                                 :
+  //  OTHER CASES                                                 :
   //==============================================================
 
   else{
     Graphic3d_Array1OfVertex V(1,2);
     Quantity_Length X,Y,Z;
     
-    //==== TRAIT DE COTE ===========
+    //==== PROCESSING OF FACE ===========
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     PointMin.Coord(X,Y,Z);
     V(2).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
     
-    //==== TRAIT DE RAPPEL 1 =====
+    //==== PROCESSING OF CALL 1 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); 
     AttachmentPoint1.Coord(X,Y,Z);
     V(2).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
     
-    //==== TRAIT DE RAPPEL 2 =====
+    //==== PROCESSING OF CALL 2 =====
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); 
     AttachmentPoint2.Coord(X,Y,Z);
     V(2).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
  
-    //==== FLECHES ================
+    //==== ARROWS ================
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     
     if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) outside = Standard_True;
     gp_Dir arrdir = L3.Direction().Reversed();
     if (outside) arrdir.Reverse();
-    // fleche 1 ----
+    // arrow 1 ----
     Prs3d_Arrow::Draw(aPresentation,P1,arrdir,
                      LA->Arrow1Aspect()->Angle(),
                      LA->Arrow1Aspect()->Length());
   
-    // fleche 2 ----
+    // arrow 2 ----
     Prs3d_Arrow::Draw(aPresentation,P2,arrdir.Reversed(),
                      LA->Arrow2Aspect()->Angle(),
                      LA->Arrow2Aspect()->Length());
     
     //==== POINTS ================
-    //Marker de localisation des points d'attachement:
+    //Marker of localization of attachment points:
     Prs3d_Root::NewGroup(aPresentation);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Handle(Graphic3d_AspectMarker3d) MarkerAspAtt = new Graphic3d_AspectMarker3d();
                           AttachmentPoint2.Z());
     Prs3d_Root::CurrentGroup(aPresentation)->Marker(Vatt2);    
       
-    //--------------------------------------------------------------------------------------
-    //|                                SYMBOLE DE SYMETRIE                                 |
-    //--------------------------------------------------------------------------------------
+    //-------------------------------------------------------------------------------------
+    //|                                SYMBOL OF SYMMETRY                                 |
+    //-------------------------------------------------------------------------------------
     
-    //           -------    : Segment superieur
-    //         -----------  : Axe
-    //           -------    : Segment inferieur
+    //           -------    : Superior Segment 
+    //         -----------  : Axis
+    //           -------    : Inferior Segment
     
     gp_Vec vec(P1,P2);
     gp_Vec vecA = vec.Multiplied(.1);
     pm = P1.Translated(vec.Multiplied(.5));
     pOff = OffsetPoint.Translated(vecB);
     
-    //Calcul des points extremes de l'axe du symbole
+    //Calculate the extremas of the axis of the symbol
     gp_Vec vecAxe = vecA.Multiplied(.7);
     pOff.Translated(vecAxe).Coord(X,Y,Z);
     V(1).SetCoord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
     
-    //Calcul des points extremes du segment sup du symbole
+    //Calculate the extremas of the superior segment of the symbol
     gp_Vec vec1 = vecAxe.Multiplied(.6);
 
     vecAxe = Vaxe.Multiplied(vecAxe.Magnitude());
     Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
     
-    //Calcul des points extremes du segment inf du symbole
+    //Calculate the extremas of the inferior segment of the symbol
     pOff.Translated(vec1.Added(vec2.Reversed())).Coord(X,Y,Z);
     V(1).SetCoord(X,Y,Z);
     pOff.Translated(vec1.Reversed().Added(vec2.Reversed())).Coord(X,Y,Z);
     Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
     
 /*  //--------------------------------------------------------------------------------------
-    //|                          REPERAGE DE L'AXE DE SYMETRIE                             |
+    //|                          MARKING OF THE AXIS OF SYMMETRY                           |
     //--------------------------------------------------------------------------------------     
     //        ____
-    //        \  / :Curseur
+    //        \  / :Cursor
     //         \/
     //         /\
     //        /__\
 
 // Created:    Wed Jun 24 12:49:59 1992
 // Author:     Gilles DEBARBOUILLE
 //             <gde@phobox>
-// Historique :
-// CRD : 03/07/97 : Portage Windows NT.
+// History :
+// CRD : 03/07/97 : Porting Windows NT.
 
 #include <Standard_Stream.hxx>
 
   const Standard_CString avalue) const
 {
   Handle(Dynamic_ObjectParameter) objectparameter;
-  cout<<"Le parametre "<<aname<<" du type "<<atype<<" avec "<<avalue<<" n'existe pas."<<endl;
+  cout<<"Parameter "<<aname<<" of type "<<atype<<" with "<<avalue<<" does not exist."<<endl;
   return objectparameter;
 }
 
 
 // Author:     Gilles DEBARBOUILLE
 //             <gde@phobox>
 // Historique :
-// CRD : 15/04/97 : Passage WOK++ : Remplacement de TYPE par STANDARD_TYPE
-// CRD : 03/07/97 : Portage Windows NT.
+// CRD : 15/04/97 : Passage WOK++ : Replace TYPE by STANDARD_TYPE
+// CRD : 03/07/97 : Porting Windows NT.
 
 #include <Standard_Stream.hxx>
 
     }
   else
     {
-      cout<<"la definition n'est pas une method definition"<<endl;
+      cout<<"the definition is not a method definition"<<endl;
       return Standard_False;
     }
 }
   const Standard_CString avalue) const
 {
   Handle(Dynamic_ObjectParameter) objectparameter;
-  cout<<"Le parametre "<<aname<<" du type "<<atype<<" avec "<<avalue<<" n'existe pas."<<endl;
+  cout<<"Parameter "<<aname<<" of type "<<atype<<" with "<<avalue<<" does not exist."<<endl;
   return objectparameter;
 }
 
 
   gp_Pnt pdeb = Ed->Value(f);
   gp_Pnt pfin = Ed->Value(l);
   Standard_Real u,v;
-  //on regarde si les extremites ne sont pas solution
+  //check if the extremities are not solution
   ElSLib::Parameters(P,pdeb,u,v);
   gp_Pnt projdeb = ElSLib::Value(u,v,P);
   Standard_Real dprojdeb = pdeb.Distance(projdeb);
 
 //=======================================================================
 //function : Add
-//purpose  : creation d une spine sur un paquet d'aretes
+//purpose  : creation of spine on a set of edges
 // 
-//  0 : pas de probleme  
-//  1 : liste vide 
-//  2 : aretes non g1 
-//  3 : faces adjacentes non G1
-//  4 : l'arete n'est pas sur le shape
-//  5 : l'arete n'est pas vive 
+//  0 : no problem  
+//  1 : empty list 
+//  2 : non g1 edges
+//  3 : non G1 adjacent faces
+//  4 : edge is not on the shape
+//  5 : edge is not alive 
 //=======================================================================
 
 Standard_Integer  FilletSurf_InternalBuilder::Add(const TopTools_ListOfShape& E, 
     TopoDS_Edge cured = TopoDS::Edge(It.Value());
     if(cured.IsNull()) return 4;
     if(!myEFMap.Contains(cured)) return 4;
-    //on controle que l arete est bien une arete de cassure
+    //check if the edge is a fracture edge
     TopoDS_Face ff1,ff2;  
     for(It.Initialize(myEFMap(cured));It.More();It.Next()){  
       if (ff1.IsNull()) {
   Handle(ChFiDS_Spine)& sp = st->ChangeSpine();
   Standard_Boolean periodic = sp->IsPeriodic();
   
-  //On controle que les aretes de la liste E sont bien dans le contour,
-  //on retire les aretes du contour qui ne sont pas dans la liste,
-  //on controle que le residu est bien monobloc.
+  //It is checked if edges of list E are in the contour,
+  //the edges that arenot in the list are removed from the contour,
+  //it is checked that the remainder is monoblock.
  
   for(It.Initialize(E); It.More(); It.Next()){
     TopoDS_Edge cured = TopoDS::Edge(It.Value());
     sp = newsp;
   }
 
-  //On construit l ElSpine dans la foulee
+  //ElSpine is immediately constructed
   Handle(ChFiDS_HElSpine) hels =  new ChFiDS_HElSpine();
   gp_Vec TFirst,TLast;
   gp_Pnt PFirst,PLast;
 
 void FilletSurf_InternalBuilder::Perform()
 {
-  //On se contente d un PerformSetOfSurfOnElSpine.
+  //PerformSetOfSurfOnElSpine is enough.
   
   Handle(ChFiDS_Stripe) Stripe = myListStripe.First();
   Handle(ChFiDS_HData)&  HData  = Stripe->ChangeSetOfSurfData();
   Handle(ChFiDS_SurfData) Data = SeqData(1);
   Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
   if(fsp.IsNull()) Standard_ConstructionError::Raise
-    ("PerformSurf : la spine n est pas celle d un conge");
+    ("PerformSurf : this is not the spine of a fillet");
   Handle(BRepBlend_Line) lin;
   TopAbs_Orientation Or = S1->ChangeSurface().Face().Orientation();
   if(!fsp->IsConstant()) Standard_ConstructionError::Raise
-    ("PerformSurf : pas de rayons variables");
+    ("PerformSurf : no variable radiuses");
   // Standard_Boolean maybesingular; //pour scinder les Surfdata singulieres 
   
   BRepBlend_ConstRad Func(S1,S2,Guide);
                          Standard_False, Data->ChangeVertexLastOnS2(), tolesp);
   }
   done = CompleteData(Data,Func,lin,S1,S2,Or,0,0,0,0);
-  if(!done)  Standard_Failure::Raise("PerformSurf : Echec approximation!");
+  if(!done)  Standard_Failure::Raise("PerformSurf : Failed approximation!");
 //  maybesingular = (Func.GetMinimalDistance()<=100*tolapp3d);
   Standard_Boolean ok = 0;
   if(!Forward){
 
 #define PERF    //GG_270298
-//              Eviter d'appeler IsKind() qui est couteux.
 
 
 #ifdef WNT
 
        if( i <= myObjects.Length() ) {
          myObjects.Remove(i) ;
-         // pas tres astucieux mais qui va utiliser Remove (anObject) ?
+         // not very clever, but who will use Remove (anObject) ?
          for( j=1 ; j<=anObject->Length() ; j++ ) {
            Remove(anObject->Primitive(j)) ;
          }
 
            myBufferId = this->HashCode(IntegerLast());
 
-           // On a demande l'epaisseur maximum des primitives lignes
-           // contenues dans le buffer
+           // Maximum depth of primitive lines
+           // contained in the buffer is required
            if (theWidthIndex < 0) {
                Standard_Real theWidthMax;
-               // Il n'y a pas de primitives lignes => epaisseur par defaut
+               // There are no primitive lines => thickness by default
                if (! MaxWidth (theWidthMax, theWidthIndex))
                    theWidthIndex = 0;
            }
 
-           // On demande la font de la 1ere primitive text du buffer
+           // The font of the 1st primitive text from the buffer is required
            if( theFontIndex < 0) {
                Standard_Integer i;
                Handle(Graphic2d_Primitive) agp;
                if( theFontIndex < 0 ) theFontIndex = 0;
            }
 
-           // On demande la couleur de la 1ere primitive du buffer
+           // The color of the 1st primitive from the buffer is required
            if( theColorIndex < 0) {
                Standard_Integer i;
                 for (i=1; i<=myPrimitives.Length(); i++) {
 #else
            if (agp->IsKind (STANDARD_TYPE (Graphic2d_Line))) {
 #endif
-               // Il y a des lignes dans le Buffer
-               // et non pas de la friture sur la ligne
+               // There are lines in the Buffer
+               // and not by fracture on the line
                Result = Standard_True;
                IndexCur =
                    (*(Handle(Graphic2d_Line) *) &agp)->WidthIndex ();
                if ((IndexCur <= 0) || (IndexCur > size)) {
-                   // Cas des epaisseurs non precisees, IndexCur == 0
-                   // ou alors il y a vraiment un gros probleme !
+                   // Case when thicknesses are not precised, IndexCur == 0
+                   // or there is a really huge problem !
                }
                else {
-                   // +1 car dans la table il y a en 1 une entry par defaut
-                   // qui definit une epaisseur par defaut
+                   // +1 because in the table there is 1 default entry
+                   // which defines default thickness
                    WidthCur = (theWidthMap->Entry (IndexCur+1)).Width ();
                    if (theWidth < WidthCur) {
                        theWidth = WidthCur;
 
           aTrsf.Transforms (A, B);
           a = Standard_ShortReal (A); b = Standard_ShortReal (B);
           if( Abs(f-e) < Standard_ShortReal(2.*Standard_PI) ) {
-         // Pour calculer les nouveaux angles d'ouverture
-         // le calcul est fait sur le cercle trigonometrique
-         // et l'on tient pas compte dans ce cas de la translation
-         // sauf pour les transformation de type Mirror
-         // dont le determinant est negatif.
+         // To calculate new aperture angles 
+         // the calculation is done on the trigonometric circle
+         // and in this case the translation is not taken into account
+         // except for transformations of type Mirror
+         // with negative determinant.
 #ifndef BUC50076
          aTrsf.SetValue (1, 3, 0.0);
          aTrsf.SetValue (2, 3, 0.0);
 
 // Modified     23/02/98 : FMN ; Remplacement PI par Standard_PI
 // Modified     16/03/98 GG
 //              OPTIMISATION
-//              Ajouter un champs myWDriver et myPDriver initialise correctement        
-//              lorsque le driver est du type "WindowDriver" ou "plotterdriver".
-//              Eviter l'appel des contructeurs vides.
+//              Add fields myWDriver and myPDriver initializing correctly        
+//              when the driver is "WindowDriver" or "plotterdriver".
+//              Avoid call of empty contructors.
 
 #define CTS17857//GG_200897
-//              Permettre d'inhiber le clipping sur les primitives.
+//              Allow suppressing clipping on primitives.
 
 #define CSR_PRO12324        //SYL_030798
-//              le Plot d'un objet en echo doit se faire en normal
+//              the Plot of an objet should be a normal
 
 #define DCB_220798 // DCB
 //    Using pointers to drivers instead of handles
  Standard_Boolean status = Standard_True;
 
  if ( dx == 0. ) {
-   // Bug de rejection des lignes infinies
+   // Bug with rejection of infinite lines
    // if ( my >= 0. && my <= mySpaceHeight )
    x1 = mx; y1 = 0.; x2 = mx; y2 = mySpaceHeight;
  }
  else if ( dy == 0.) {
-   // Bug de rejection des lignes infinies
+   // Bug with rejection of infinite lines
    // if ( mx >= 0. && mx <= mySpaceWidth )
    x1 = 0.; y1 = my; x2 = mySpaceWidth; y2 = my;
  }
 
 /*=====================================================================
 
-     FONCTION :
+     FUNCTION :
      ----------
-        Classe Graphic2d_Ellips
+        Class Graphic2d_Ellips
 
      TEST :
      ------
 
         Voir TestG2D/TestG21
 
-     REMARQUES:
+     NOTES:
      ----------
 
-     HISTORIQUE DES MODIFICATIONS   :
+     HISTORY OF MODIFICATIONS   :
      --------------------------------
 
       27-01-98 : GG ; OPTIMISATION LOADER
-                    Transformer les variables static globales en static
-                   locales.
+                    Transform global static variables into static locals.
 
 =====================================================================*/
 #define G002   //Add new DrawElement(), DrawVertex() methods
 
       myAngle =Standard_ShortReal(anAngle); 
 
-      // Cas de l'ellipse horizontale
+      // Case of horizontal ellipse 
       if (Abs (anAngle) <= RealEpsilon ()) {
           myMinX = myX - myMajorRadius;
           myMaxX = myX + myMajorRadius;
               }
             }   
         }
-        Standard_ShortReal xf1,yf1,xf2,yf2; //Les foyers.
+        Standard_ShortReal xf1,yf1,xf2,yf2; //Sources.
         Standard_ShortReal q = 
            Standard_ShortReal(Sqrt( Abs( myMajorRadius*myMajorRadius - myMinorRadius*myMinorRadius) ));
 
         Standard_ShortReal cos = Standard_ShortReal(Cos(myAngle));
         Standard_ShortReal sin = Standard_ShortReal(Sin(myAngle));
 
-     //Focus 1 et 2 calcules pour l' ellipse dont le centre 
-     // est ramene a l' origine du repere(0,0)
+     // Focus 1 and 2 calculated for the ellipse with centre 
+     // at the origin of mark(0,0)
         xf1 = q*cos; 
         yf1 = q*sin;
         xf2 = -q*cos; 
           SetPickedIndex( 0 );
      }
  #else  
-         Standard_ShortReal xf1,yf1,xf2,yf2; //Les foyers.
+         Standard_ShortReal xf1,yf1,xf2,yf2; //Sourses.
       Standard_ShortReal Xp, Yp; 
       Standard_ShortReal q = 
          Sqrt( Abs( myMajorRadius*myMajorRadius - myMinorRadius*myMinorRadius) );
       Standard_ShortReal cos = Cos (myAngle);
       Standard_ShortReal sin = Sin (myAngle);
 
-     //Focus 1 et 2 calcules pour l' ellipse dont le centre 
-     // est ramene a l' origine du repere(0,0)
+     // Focus 1 and 2 calculated for the ellipse with centre 
+     // at the origin of mark(0,0)
       xf1 = q*cos; 
       yf1 = q*sin;
       xf2 = -q*cos; 
 
      Standard_ShortReal cos = Standard_ShortReal( Cos(myAngle) );
      Standard_ShortReal sin = Standard_ShortReal( Sin(myAngle) );
 
-     //Focus 1 et 2 calcules pour l' ellipse dont le centre 
+     //Focus 1 and 2 calcules pour l' ellipse dont le centre 
      // est ramene a l' origine du repere(0,0)
      xf1 = Standard_ShortReal( q * cos ); 
      yf1 = Standard_ShortReal( q * sin );
 
 // S3824        10/06/98 : GG ;
-//              1) La methode "Fit" comporte un argum optionnel supplementaire
-//                 "Expand" permettant de ne pas ajuster la largeur du texte
-//                  lorsque celle ci est < a la taille du FIT.
-//              2) La methode "Trunc" permet de tronquer le texte a la
-//                 taille precisee.
+//              1) Method "Fit" includes optional argument 
+//                 "Expand" allowing to avoid adjusting text width
+//                 when it is less then size of FIT.
+//              2) Method "Trunc" allows trunkating the text to the 
+//                 exact size.
 
 #define PRO14304       //GG_160698
-//             Corrige une erreur de calcul sur les MINMAX provoquant
-//             la disparition du text
 
 #define PERF    //GG_200898
 //              The MinMax are now computed at the right time and no more
             cosa -= A; sina -= B;
             if( aTrsf.IsNegative() ) hscale = - hscale;
 #else
-           // Pour calculer les nouveaux angles d'ouverture
-           // le calcul est fait sur le cercle trigonometrique
-           // et l'on tient pas compte dans ce cas de la translation.
+           // To calculate new aperture angles 
+           // the calculation is done on the trigonometric circle
+           // and taken into account in case of translation.
            aTrsf.SetValue (1, 3, 0.0);
            aTrsf.SetValue (2, 3, 0.0);
             aTrsf.Transforms (cosa, sina);
 
 //
 // S3593    //GG_270298
-//              Eviter d'appeler IsKind() qui est couteux.
-//             Ajouter un champs myIsUpToDate permettant de savoir
-//             si l'objet est a jour.
-//             Ajouter un champs myIsTransformed permettant de savoir
-//             si l'objet est transforme.
+//              Avoid calling IsKind() which is expensive.
+//             Add field myIsUpToDate informing if the object is updated.
+//             Add field myIsTransformed informing if the object is transformed.
 //
 
 #define G002       //GG_140400
 
 #ifdef OK
        //
-       // Pour retracer ce qui est necessaire
-       // On parcourt les primitives de 1 jusqu'a Index
-       // et on recupere l'Index de la premiere primitive
-       // dont le rectangle englobant intersecte celui
-       // de la primitive retiree.
+       // To retrace whatever is necessary
+       // Parse the primitives from 1 to Index
+       // and return l'Index of the first primitive
+       // with bounding box intersecting the bounding
+        // box of the removed primitive.
        //
 Standard_Boolean stop = Standard_False;
 Standard_ShortReal sMinx, sMiny, sMaxx, sMaxy;
        for (Standard_Integer i=1; i<Index && ! stop; i++) {
                (Primitive (i))->MinMax (x, X, y, Y);
                //
-               // Les lignes infinies
+               // Infinite lines
                //
                if ((x == RF) || (X == RL) || (y == RF) || (Y == RL)) {
-                       // infinie horizontale
+                       // infinite horizontal
                        if (y == Y) stop = (sMiny <= y) && (y <= sMaxy);
-                       // infinie verticale
+                       // infinite vertical
                        if (x == X) stop = (sMinx <= x) && (x <= sMaxx);
-                       // infinie oblique
+                       // infinite diagonal
                        if ((y != Y) && (x != X)) {
-                               // Pb pas d'interrogation possible
-                               // sur le contenu de la primitive.
+                               // no interrogation possible
+                               // about the content of the primitive.
                                stop = Standard_True;
                        }
                }
                    (thePrimitive->Family() == Graphic2d_TOP_MARKER);
                    if (! TheFlag) {
                      if( thePrimitive->MinMax (x, X, y, Y) ) {
-                       // Tests pour cause de lignes infinies
+                       // Tests for cause of infinite lines
                        if (x != RF) sMinx = (sMinx < x ? sMinx : x);
                        if (X != RL) sMaxx = (sMaxx > X ? sMaxx : X);
                        if (y != RF) sMiny = (sMiny < y ? sMiny : y);
                }
        }
 
-       // Attention, il se peut que :
-       // sMinx = sMiny = ShortRealLast (); et
+       // Attention, it is possible that :
+       // sMinx = sMiny = ShortRealLast (); and
        // sMaxx = sMaxy = ShortRealFirst();
        if (sMinx > sMaxx) {
          status = Standard_False;
                    (thePrimitive->Family() == Graphic2d_TOP_MARKER);
                    if (TheFlag) {
                      if( thePrimitive->MinMax (x, X, y, Y) ) {
-                       // Tests pour cause de lignes infinies
+                       // Tests for cause of infinite lines
                        if (x != RF) sMinx = (sMinx < x ? sMinx : x);
                        if (X != RL) sMaxx = (sMaxx > X ? sMaxx : X);
                        if (y != RF) sMiny = (sMiny < y ? sMiny : y);
                }
        }
 
-       // Attention, il se peut que :
-       // sMinx = sMiny = ShortRealLast (); et
+       // Attention, it is possible that :
+       // sMinx = sMiny = ShortRealLast (); and
        // sMaxx = sMaxy = ShortRealFirst();
        if (sMinx > sMaxx) {
          status = Standard_False;
 
 #define PRO6894 //GG_150197
-//              Completer les cas de justification des textes
+//              Complete cases of text justification 
 // S3824        10/06/98 : GG ;
-//              1) La methode "Fit" comporte un argum optionnel supplementaire
-//                 "Expand" permettant de ne pas ajuster la largeur du texte
+//              1) Method "Fit" includes optional argument
+//                 "Expand" allowing to not adjust the text width
 //                  lorsque celle ci est < a la taille du FIT.
-//              2) La methode "Trunc" permet de tronquer le texte a la
-//                 taille precisee.
+//              2) Method "Trunc" allows truncating the text to the
+//                 indicated size.
 
 #define PRO14304        //GG_160698
-//              Corrige une erreur de calcul sur les MINMAX provoquant
-//              la disparition du text
+//              Correct calculation error on MINMAX causing
+//              the text to disappear
 
 #define PERF    //GG_200898
 //              The MinMax are now computed at the right time and no more
             cosa -= A; sina -= B;
             if( aTrsf.IsNegative() ) hscale = - hscale;
 #else
-           // Pour calculer les nouveaux angles d'ouverture
-           // le calcul est fait sur le cercle trigonometrique
-           // et l'on tient pas compte dans ce cas de la translation.
+           // To calculate new aperture angles 
+           // calculation is done on the trigonometric circle
+           // and in this case translation is taken into account.
            aTrsf.SetValue (1, 3, 0.0);
            aTrsf.SetValue (2, 3, 0.0);
             aTrsf.Transforms (cosa, sina);
 
 #define WTO0001         //GG_140596
-//                      Calcul des min-max faux apres transformation.
 
 #define PRO5663         //GG_291196
-//                      Renseigner les MinMax de l'image !.
 
 #include <Graphic2d_Image.ixx>
 #include <Graphic2d_Image.pxx>
         else
                 FillAndDraw (aDrawer);
 
-        // Dans le cas d'un GraphicObject Highlighted
-        // on trace le rectangle englobant de l'image
+        // In case of GraphicObject Highlighted
+        // bounding box of the image is traced
         if (myGOPtr->IsHighlighted ()) {
 
 Standard_Integer Width  = myImage->Width ();
 Standard_Integer Height = myImage->Height ();
                 //
-                // - 2 sur Width et Height pour eviter que
-                // le bord soit en dehors de l'image.
+                // - 2 on Width and Height to avoid
+                // border outside of the image.
                 //
                 if (Width > 2) Width -= 2;
                 if (Height > 2) Height -= 2;
         UpperY  = myImage->UpperY ();
 
         if (Height*Width <= Graphic2d_Image::SmallSize ()) {
-                // Les petites images sont remplies d'un coup
+                // Small images are filled at once
                 pixels  = new Aspect_RGBPixel [Height*Width];
 
                 Quantity_Array1OfColor Array (0, Width-1);
 
-                // Parcours de l'image Lignes-Colonnes (Height-Width)
+                // Parsing of the image Lines-Columns (Height-Width)
                 for (i=0, ii=LowerY; ii<=UpperY; i++, ii++) {
                         myImage->RowColor (ii, Array);
                         for (j=0; j<Width; j++) {
                 delete [] pixels;
         }
         else {
-                // Les grandes images sont remplies ligne a ligne
+                // Great images are filled line by line
                 pixels  = new Aspect_RGBPixel [Width];
 
                 Quantity_Array1OfColor Array (0, Width-1);
 
-                // Parcours de l'image Lignes-Colonnes (Height-Width)
+                // Parsing of image Lines-Columns (Height-Width)
                 for (i=0, ii=LowerY; ii<=UpperY; i++, ii++) {
                         myImage->RowColor (ii, Array);
                         for (j=0; j<Width; j++) {
 
 /*=====================================================================
 
-     FONCTION :
+     FUNCTION :
      ----------
-        Classe Graphic2d_ImageFile
+        Class Graphic2d_ImageFile
 
      TEST :
      ------
 
-        Voir TestG2D/TestG21
+        See TestG2D/TestG21
 
-     REMARQUES:
-     ----------
-
-     HISTORIQUE DES MODIFICATIONS   :
-     --------------------------------
-
-      27-01-98 : GG ; OPTIMISATION LOADER
-                Transformer les variables static globales en static
-                locales.
-
-      05-11-97 : GG :  JAP60017
-                Nouvelle methode SetScale(...) pour pouvoir
-                changer le facteur d'echelle de l'image dynamiquement
-
-      11-07-97 : GG ; BUC50015
-                Tenir compte de l'attribut Zoomable de l'image
-                pour en determiner les MIN-MAX.
 
 =====================================================================*/
 
 #define S3593           //GG_100398
-//                      Optimisation concernant le chargement des images,
-//                      eviter de recharger des images deja chargees!
-//                      Utiliser les methodes du driver qui sont optimisees.
 
 #define xTRACE
 
     Standard_ShortReal scale = (myIsZoomable) ? Standard_ShortReal(aDrawer->Scale()) : Standard_ShortReal(1.);
     aDrawer->DrawImageFile (myFileName.ToCString(), Xc, Yc, scale*myScale);
 
-    // Dans le cas d'un GraphicObject Highlighted
-    // on trace le rectangle englobant de l'image
+    // In case of GraphicObject Highlighted
+    // the bounding box of the image is traced
     if (myGOPtr->IsHighlighted ()) {
 
 #ifdef TRACE
 Standard_Boolean Reopen = Standard_False;
         aWidth = aHeight = aDepth = 0;
         if (aFile.IsOpen () && aFile.IsLocked()) {
-                cout << "Can't analyse an locked file.\n" << flush;
+                cout << "Can't analyse a locked file.\n" << flush;
                 return Result;
         }
 
 
 
         Voir TestG2D/TestG21
 
-     REMARQUES:
-     ----------
-
-     HISTORIQUE DES MODIFICATIONS   :
-     --------------------------------
-
-      27-01-98 : GG ; OPTIMISATION LOADER
-                    Transformer les variables static globales en static
-                   locales.
-      23/02/98 : FMN ; Remplacement PI par Standard_PI
-
 =====================================================================*/
 
 #define PRO12982  //GG_230498
-//            Prendre en compte le soulignement dans le calcul de la taille
-//            du paragraphe.
+//            Take into account the underlining in calculation of 
+//            paragraph size.
 
 #define PRO11004  //GG_051197
-//            Le pourtour du paragraphe n'est pas un rectangle
+//            The contour of the paragraph is not rectangle
 
 #define PRO11005  //GG_131197
-//            La couleur de fond du paragraphe n'est pas respectee
-//            En mode Highlight,on ne voit plus les textes.
+//            Text can't be seen in mode Highlight.
 
 #define PRO11041 //GG_201197
-//            Modification de SetCurrentFont(...,aHScale,aWScale)
-//            de maniere a pouvoir parametrer la taille du texte.
+//            Modification of SetCurrentFont(...,aHScale,aWScale)
+//            to parameterize the size of the text.
 
 #define PRO12320//GG_120297
-//            Espacer les textes en fonction de la hauteur capitalisee de la
-//            chaine de caracteres.
+//            Compose texts depending on the summary height of the
+//            chain of characters.
 
 #define PERF    //GG_200898
 //              The MinMax are now computed at the right time and no more
 
             aTrsf.Transforms (A, B);
 
-            // Pour calculer les nouveaux angles d'ouverture
-            // le calcul est fait sur le cercle trigonometrique
-            // et l'on tient pas compte dans ce cas de la translation.
+            // To calculate new aperture angles
+            // the calculation is done on trigonometric circle
+            // and in this case translation is not taken into account.
             aTrsf.SetValue (1, 3, 0.0);
             aTrsf.SetValue (2, 3, 0.0);
             aTrsf.Transforms (cosa, sina);
           Standard_ShortReal twidth = 0.,theight = 0.,txoffset = 0.,tyoffset = 0.;
           Standard_ShortReal lwidth = 0.,lheight = 0.,loffset = 0.;
           myWidth = myHeight = 0. ;
-          for( i=1,j=lrow=0 ; i<=length ; i++ ) {       // Passe 1,gets texts minmax 
+          for( i=1,j=lrow=0 ; i<=length ; i++ ) {       // Passe 1, gets texts minmax 
             descriptor = myTextDescriptorList.Value(i) ;
             atext = myTextStringList.Value(i) ;
             hscale = scale*myTextHScaleList.Value(i) ;
 
 
         Voir TestG2D/TestG21
 
-     REMARQUES:
-     ----------
-
-     HISTORIQUE DES MODIFICATIONS   :
-     --------------------------------
-
-      27-01-98 : GG ; OPTIMISATION LOADER
-                    Transformer les variables static globales en static
-                   locales.
 
-      10-12-97 : GG ; Envoyer plutot des polylines que des segments lorsque
-               le type de trait n'est pas SOLID de maniere a assurer
-               la continuite.
 
 =====================================================================*/
 
 // PRO13369    //GG_280498
-//                     Attention sous WNT
-//                     MapPolylineFromTo() doit etre appele avec le 
-//                     nombre exacte de points
+//                     MapPolylineFromTo() should be called with exact number of points
 
 #define G002    //GG_140400 Use SetPickedIndex method 
 
              if( V1.IsEqual(P->Value(lv)) ) {
                //first vertex of segment is the same that the last vertex of the
                //ref line
-               if( ip > 1 ) {  //Try to concatenates ref line with others
+               if( ip > 1 ) {  //Try to concatenate ref line with others
                  for( ipp=1 ; ipp<ip ; ipp++ ) {
                    PP = myPolylines.Value(ipp);        //other polyline 
                    if( V2.IsEqual(PP->Value(1)) ) {
              } else if( V2.IsEqual(P->Value(lv)) ) {
                //second vertex of segment is the same that the last vertex of the
                //ref line
-               if( ip > 1 ) {  //Try to concatenates ref line with others
+               if( ip > 1 ) {  //Try to concatenate ref line with others
                  for( ipp=1 ; ipp<ip ; ipp++ ) {
                    PP = myPolylines.Value(ipp);        //other polyline 
                    if( V1.IsEqual(PP->Value(1)) ) {
              } else if( V1.IsEqual(P->Value(1)) ) {
                //first vertex of segment is the same that the first vertex of the
                //ref line
-               if( ip > 1 ) {  //Try to concatenates ref line with others
+               if( ip > 1 ) {  //Try to concatenate ref line with others
                  for( ipp=1 ; ipp<ip ; ipp++ ) {
                    PP = myPolylines.Value(ipp);        //other polyline 
                    if( V2.IsEqual(PP->Value(PP->Length())) ) {
              } else if( V2.IsEqual(P->Value(1)) ) {
                //second vertex of segment is the same that the first vertex of the
                //ref line
-               if( ip > 1 ) {  //Try to concatenates ref line with others
+               if( ip > 1 ) {  //Try to concatenate ref line with others
                  for( ipp=1 ; ipp<ip ; ipp++ ) {
                    PP = myPolylines.Value(ipp);        //other polyline 
                    if( V1.IsEqual(PP->Value(PP->Length())) ) {
 
-// Modified     23/02/98 : FMN ; Remplacement PI par Standard_PI
-// S3824       10/06/98 : GG ; 
-//             1) La methode "Fit" comporte un argum optionnel supplementaire
-//                "Expand" permettant de ne pas ajuster la largeur du texte
-//                 lorsque celle ci est < a la taille du FIT.
-//             2) La methode "Trunc" permet de tronquer le texte a la
-//                taille precisee.
 
 #define PERF   //GG_200898
 //             The MinMax are now computed at the right time and no more
             cosa -= A; sina -= B;
             if( aTrsf.IsNegative() ) hscale = - hscale;
 #else
-           // Pour calculer les nouveaux angles d'ouverture
-           // le calcul est fait sur le cercle trigonometrique
-           // et l'on tient pas compte dans ce cas de la translation.
+           // To calculate new aperture angles 
+           // calculation is done on the trigonometric circle
+           // and in this case translation is not taken into account.
            aTrsf.SetValue (1, 3, 0.0);
            aTrsf.SetValue (2, 3, 0.0);
             aTrsf.Transforms (cosa, sina);
 
 #define xTRACE
 
 #define CSR_PRO12324        //SYL_030798
-//                      Pas de plot si objet non plottable                      
+//                      No plot if object not plottable                      
 //
 // Modified     17/12/1998 SYL pour S3604
 //              Aspect_PlotterDriver devient PlotMgt_PlotterDriver
 
         for (i=1; i<=Length; i++) {
                 myGraphicObjects.Value (i)->MinMax (x, X, y, Y);
-                // Le GraphicObject peut etre vide
+                // GraphicObject can be empty
                 if (x > RF) Minx = (Minx < x ? Minx : x); 
                 if (X < RL) Maxx = (Maxx > X ? Maxx : X);
                 if (y > RF) Miny = (Miny < y ? Miny : y);
                 if (Y < RL) Maxy = (Maxy > Y ? Maxy : Y);
         }
 
-        // Attention, il se peut que :
-        // Minx = Miny = ShortRealLast (); et
+        // Attention, it is possible that :
+        // Minx = Miny = ShortRealLast (); and
         // Maxx = Maxy = ShortRealFirst();
         if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
         if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
         for (i=1; i<=Length; i++) {
                 if (IsIn (aList->Value(i))) {
                         (aList->Value(i))->MinMax (x, X, y, Y);
-                        // Le GraphicObject peut etre vide
+                        //  GraphicObject can be empty
                         if (x > RF) Minx = (Minx < x ? Minx : x); 
                         if (X < RL) Maxx = (Maxx > X ? Maxx : X);
                         if (y > RF) Miny = (Miny < y ? Miny : y);
                 }
         }
 
-        // Attention, il se peut que :
-        // Minx = Miny = ShortRealLast (); et
+        // Attention, it is possible that :
+        // Minx = Miny = ShortRealLast (); and
         // Maxx = Maxy = ShortRealFirst();
         if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
         if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
 
         for (i=1; i<=Length; i++) {
                 myGraphicObjects.Value (i)->MarkerMinMax (x, X, y, Y);
-                // Le GraphicObject peut etre vide
+                // GraphicObject can be empty 
                 if (x > RF) Minx = (Minx < x ? Minx : x); 
                 if (X < RL) Maxx = (Maxx > X ? Maxx : X);
                 if (y > RF) Miny = (Miny < y ? Miny : y);
                 if (Y < RL) Maxy = (Maxy > Y ? Maxy : Y);
         }
 
-        // Attention, il se peut que :
-        // Minx = Miny = ShortRealLast (); et
+        // Attention, it is possible that :
+        // Minx = Miny = ShortRealLast (); and
         // Maxx = Maxy = ShortRealFirst();
         if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
         if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
         for (i=1; i<=Length; i++) {
                 if (IsIn (aList->Value(i))) {
                         (aList->Value(i))->MarkerMinMax (x, X, y, Y);
-                        // Le GraphicObject peut etre vide
+                        // GraphicObject can be empty
                         if (x > RF) Minx = (Minx < x ? Minx : x); 
                         if (X < RL) Maxx = (Maxx > X ? Maxx : X);
                         if (y > RF) Miny = (Miny < y ? Miny : y);
                 }
         }
 
-        // Attention, il se peut que :
-        // Minx = Miny = ShortRealLast (); et
+        // Attention, it is possible that :
+        // Minx = Miny = ShortRealLast (); and
         // Maxx = Maxy = ShortRealFirst();
         if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
         if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
   for (Index=1; Index<=Length; Index++)
     //myGraphicObjects.Value(Index)->Erase ();
     // CAL le 17/11/97.
-    // On met 1 car il faut effacer N fois le premier de la liste
-    // En effet cette liste est mise a jour par la methode ci dessous
-    // qui est appelee par Graphic2d_GraphicObject::Erase.
+    // 1 is set as it is required to remove N times the first from the list
+    // Acytually this list is updated by method below
+    // called by Graphic2d_GraphicObject::Erase.
 #ifdef OCC154
     myGraphicObjects.Value(Index)->Erase();
 #else
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques au contexte
-//             de trace des facettes 3d
+//-Design      Declaration of variables specific to the context
+//             of tracing of facets 3D
 
-//-Warning     Un contexte de trace de facette 3d herite du contexte
-//             defini par :
-//             - le style de l'interieur de la facette
-//             - le style du bord de la facette
-//             - la couleur
-//             Il possede en plus d'une definition de matiere
-//             pour les faces internes et externes.
+//-Warning     Ccontext of tracing of facets 3d inherits the context
+//             defined by :
+//             - the style of the interior of the facet
+//             - the style of the facet border
+//             - the color
+//             Additionally, it has more than one definition of material
+//             for internal and external faces.
 
 //-References  
 
   // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets 
 }
 
-// le :(InteriorStyle, InteriorColor, EdgeColor, EdgeLineType, EdgeLineWidth)
-// car AspectFillArea3d herite de AspectFillArea et il faut appeler
-// l'initialisation de AspectFillArea avec InteriorStyle, InteriorColor,
-// EdgeColor, EdgeLineType et EdgeLineWidth.
+// (InteriorStyle, InteriorColor, EdgeColor, EdgeLineType, EdgeLineWidth)
+// because AspectFillArea3d inherits AspectFillArea and it is necessary to call
+// initialisation of AspectFillArea with InteriorStyle, InteriorColor,
+// EdgeColor, EdgeLineType and EdgeLineWidth.
 
 Graphic3d_AspectFillArea3d::Graphic3d_AspectFillArea3d (const Aspect_InteriorStyle InteriorStyle, const Quantity_Color& InteriorColor, const Quantity_Color& EdgeColor, const Aspect_TypeOfLine EdgeLineType, const Standard_Real EdgeLineWidth, const Graphic3d_MaterialAspect& FrontMaterial, const Graphic3d_MaterialAspect& BackMaterial):
 Aspect_AspectFillArea (InteriorStyle, InteriorColor, EdgeColor, EdgeLineType, EdgeLineWidth), DistinguishModeActive (Standard_False), EdgeModeActive (Standard_False), BackFaceRemovalActive (Standard_False), MyTextureMap(), MyTextureMapState(Standard_False), MyFrontMaterial (FrontMaterial), MyBackMaterial (BackMaterial) {
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques au contexte
-//             de trace des lignes 3d
+//-Design      Declaration of variables specific to the context
+//             of tracing of lines 3d
 
-//-Warning     Un contexte de trace de lignes 3d herite du contexte
-//             defini par :
-//             - la couleur
-//             - le type de trait
-//             - l'epaisseur
+//-Warning     Context of tracing of lines 3d inherits the context
+//             defined by :
+//             - the color
+//             - the type of trait
+//             - the thickness
 
 //-References  
 
 Graphic3d_AspectLine3d::Graphic3d_AspectLine3d () {
 }
 
-// le :(AColor, AType, AWidth)
-// car AspectLine3d herite de AspectLine et il faut appeler
-// l'initialisation de AspectLine avec AColor, AType, AWidth.
+// (AColor, AType, AWidth)
+// because  AspectLine3d inherits AspectLine and it is necessary to call
+// initialisation of AspectLine with AColor, AType, AWidth.
 
 Graphic3d_AspectLine3d::Graphic3d_AspectLine3d (const Quantity_Color& AColor, const Aspect_TypeOfLine AType, const Standard_Real AWidth):Aspect_AspectLine (AColor, AType, AWidth) {}
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques au contexte
-//             de trace des markers 3d
-
-// Rappels     Un contexte de trace de markers 3d herite du contexte
-//             defini par :
-//             - la couleur
-//             - le type de marker
-//             - l'echelle
+//-Design      Declaration of variables specific to the context
+//             of trace of markers 3d
+
+// Rappels     Context of trace of markers 3d inherits the context
+//             defined by :
+//             - the color
+//             - the type of marker
+//             - the scale
 
 //-Warning     
 
 
 
 //-Version  
 
-//-Design Declaration des variables specifiques au contexte
-//    de trace des textes 3d
-
-//-Warning  Un contexte de trace de texte est defini par :
-//    - la font utilisee
-//    - la couleur
-//    - l'echelle
-//    - l'espace entre caracteres
+//-Design Declaration of variables specific to the context
+//    of trace of texts 3d
+
+//-Warning  A context of trace of text is defined by :
+//    - the font used
+//    - the color
+//    - the scale
+//    - the space between characters
 
 //-References 
 
 
        }
 
        this->InitMaps (connexion,Xw_TOM_READONLY,Ncolors,UseDefault);
-       // 24/07/97
-       // avant : this->InitMaps (connexion,Mapping,Ncolors,UseDefault);
-       //         uniquement pour HPUX
-       // info GG :
-       //  L'action doit etre generalisee puisque l'on trouve le meme pb
-       //sur HP et SIL lie au fait que la root est PseudoColor.
-       //  Ceci est donc compatible avec SUN et DEC ou la root est TrueColor.
-       //  De toute facon seul le driver Xdps a besoin d'un ColorCube et
-       //il le cree tout seul s'il n'existe pas deja .
+
 
 }
 
                (TheSharedLibrary.DlError ());
        }
        else {
-           // Gestion des traces
+           // Management of traces
 char *tracevalue = NULL;
            tracevalue = (char *)(getenv ("CSF_GraphicTrace"));
            if (tracevalue)
                        (TheSharedLibrary.DlError ());
            }
            else {
-               // Sequence artistique :
-               // new_GLGraphicDriver est une OSD_Function :
+               // Sequence :
+               // new_GLGraphicDriver is OSD_Function :
                // typedef int (* OSD_Function)(...);
-               // d'ou le magnifique cast en GraphicDriver.
+               // that is why good cast in GraphicDriver.
                Handle(Graphic3d_GraphicDriver)
                        (*fp) (Standard_CString) = NULL;
                fp = (Handle(Graphic3d_GraphicDriver)
 
 //             MyGraphicDriver = (*fp) (TheSharedLibrary.Name ());
 
-               // Gestion des traces
+               // Management of traces
                if (tracevalue)
                    MyGraphicDriver->SetTrace
                        ((Standard_Integer) atoi (tracevalue));
 
     -- File:    Graphic3d_Group.cdl
     -- Created: Vendredi 6 Septembre 1991
     -- Author:  NW,JPB,CAL
-    --      27/09/97 ; PCT : ajout du controle manuel des textures
+    --      27/09/97 ; PCT : add manual control of  textures
     --              11/97 ; CAL : ajout polyline par 2 points
     --      16/06/2000 : ATS: Study G005 - Group store presentations of it's objects in field
     --                        MyListOfPArray to avoid deletion of handle-manipulating 
         ---Level: Public
         ---Purpose: Links up points to create a face drawn
         --      using the current fill attributes (AspectFillArea3d))
-        --      The first and last points are not duplicates.
+        --      The first and last points are not duplicated.
         --      The normal is defined and normalised for each vertex.
         --          The texture coordinate is defined for each vertex.
         ---Category: Methods to create Polygon
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques aux groupes
-//             de primitives
+//-Design      Declaration of variables specific to groups
+//             of primitives
 
-//-Warning     Un groupe est defini dans une structure
-//             Il s'agit de la plus petite entite editable
+//-Warning     A group is definedv in a structure
+//             This is the smallest editable entity
 
 //-References  
 
   MyBounds.ZMax        = ShortRealFirst ();
 
 //
-// Un petit commentaire sur l'utilisation du This !
+// A small commentary on the usage of This !
 //
-// Un Graphic3d_Group est cree dans une structure. Graphic3d_Structure est
-// donc un manager de Graphic3d_Group. Dans le constructeur de Graphic3d_Group
-// est appele une methode de Graphic3d_Structure, Add, qui permet d'ajouter
-// l'instance du Graphic3d_Group dans son manager. Il y a donc 2 references
-// a <me> et tout va bien.
+// Graphic3d_Group is created in a structure. Graphic3d_Structure is a
+// manager of Graphic3d_Group. In the constructor of Graphic3d_Group
+// a method Add of Graphic3d_Structure is called. It allows adding
+// the instance of Graphic3d_Group in its manager. So there are 2 references
+// to <me> and everything works well.
 //
-// This () est l'instance de la classe, c-a-d le groupe courant
+// This () is the instance of the class, the current groupe
 //Handle(Graphic3d_Group) me   = Handle(Graphic3d_Group)::DownCast (This ());
 
 Standard_Integer TheLabelBegin, TheLabelEnd;
 
 
 //-Version  
 
-//-Design Declaration des variables specifiques aux groupes
-//    de primitives
+//-Design Declaration of variables specific to groups
+//    of primitives
 
-//-Warning  Un groupe est defini dans une structure
-//    Il s'agit de la plus petite entite editable
+//-Warning  A group is defined in a structure
+// This is the smallest editable entity
 
 //-References 
 
 
 #include <Graphic3d_StructureManager.hxx>
 
-// Structures c necessaires a l'interfacage avec les routines c
-// Routines C a declarer en extern
+// Structures are necessairy for interfacing with routines c
+// Routines C should be declared externally
 //-Methods, in order
 
 Standard_Boolean Graphic3d_Group::IsDeleted () const {
 void Graphic3d_Group::MinMaxCoord (Standard_Real& XMin, Standard_Real& YMin, Standard_Real& ZMin, Standard_Real& XMax, Standard_Real& YMax, Standard_Real& ZMax) const {
 
   if (IsEmpty ()) {
-    // Groupe vide
+    // Empty Group
     XMin  = YMin  = ZMin  = ShortRealFirst ();
     XMax  = YMax  = ZMax  = ShortRealLast ();
   }
 
 // File                Graphic3d_MaterialAspect.cxx
 // Created     Fevrier 1992
-// Author      NW,JPB,CAL
-// modified     1/07/97 ; PCT : ajout texture mapping
-//              8/04/98 ; FGU : Ajout Emission
-//              9/07/98 ; CAL : Ajout de l'initialisation de l'EmissiveCoef
-//              26/03/99 ; FMN : Ajout methodes SetColor() et Color()
-//              26/03/99 : FMN ; Compatibilite ascendante: Ajout des anciens noms de materiaux.
-//              09/04/99 : GG ; Compatibilite ascendante: NameOfPhysicalMaterial disparait
-//             07/07/99 : GG ; MyEmissiveActivity MUST be initialized in the
-//                        constructor of the class.
-//              23/11/99 : GG ; BUC60488 : Add Name() & Reset() methods
 
 #define BUC60565        //GG_19/10/99 ; Don't change the color components when the corresponding
 //                      coefficient is modified because the resulting color is computed in
 
 //-Version     
 
-//-Design      Declaration des variables specifiques aux definition
-//             des matieres
+//-Design      Declaration of variables specific to the definition
+//             of materials
 
-//-Warning     Une matiere est definie par :
-//             - Un coefficient de transparence
-//             - Un coefficient de reflection diffuse
-//             - Un coefficient de reflection ambiante
-//             - Un coefficient de reflection speculaire
-//              - Un coefficient d emission
+//-Warning     A material is defined by :
+//             - coefficient of transparence
+//             - coefficient of disperse reflection
+//             - coefficient of ambiant reflection
+//             - coefficient of specular reflection
+//              - coefficient of emission
 
-//             2 proprietes permettent de definir une matiere :
-//             - sa transparence
-//             - sa reflection c-a-d ses proprietes d'absorbtion
-//             et de diffusion de la lumiere
+//             2 properties permiting to define a material :
+//             - transparence
+//             - reflection, i.e. absorbtion properties
+//             and light diffusion
 
-//             La reflection diffuse est percue comme une composante
-//             La reflection speculaire est percue comme une composante
-//             de la couleur de la source lumineuse
+//             Disperse reflection is considered a component
+//             The specular reflection is considered a component
+//             of the color of the light source
 
-//             Pour determiner les 3 couleurs de reflection il faut :
-//             - Un coefficient de reflection diffuse
-//             - Un coefficient de reflection ambiante
-//             - Un coefficient de reflection speculaire
+//             To determine 3 colors of reflection it is necessary :
+//             - coefficient of disperse reflection
+//             - coefficient of ambiant reflection
+//             - coefficient of specular reflection
 
-//             ( Sous GL, on determine 3 couleurs )
+//             ( Under GL, 3 colors are determined)
 
 //-References  Getting started with DEC PHIGS, annexe C
 //             Iris Advanced Graphics, unite D
 
        switch (AName) {
                case Graphic3d_NOM_PLASTIC : /* Blue plastic */
-                       /* Coefficient d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.0078125);
                        MyAmbientCoef           = Standard_ShortReal (0.5);
                        MyDiffuseCoef           = Standard_ShortReal (0.24);
                break;                          
                
                case Graphic3d_NOM_SHINY_PLASTIC : /* black plastic */
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (1.0);
                        MyAmbientCoef           = Standard_ShortReal (0.44);
                        MyDiffuseCoef           = Standard_ShortReal (0.5);
                break;
                
                case Graphic3d_NOM_NEON_GNC: 
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.05);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                break;
                
                case Graphic3d_NOM_METALIZED :                  
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.13);
                        MyAmbientCoef           = Standard_ShortReal (0.9);
                        MyDiffuseCoef           = Standard_ShortReal (0.47);
                        MySpecularCoef          = Standard_ShortReal (0.45);
                        MyAmbientActivity  = Standard_False;
                                                
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        //MyDiffuseColor.SetValues (0.87, 0.96, 1.0, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        //MySpecularColor.SetValues (0.93, 0.95, 0.78, Quantity_TOC_RGB);                                               
                break;
 
-// Compatibilite ascendante materiaux physiques. On prend la meme definition
-// que dans le createur suivant.       
+// Ascending Compatibility physical materials. The same definition is taken
+// as in the next constructor. 
 
                case Graphic3d_NOM_BRASS :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Initialisation des coefficients et couleur d eclairage : brass */
+                       /* Initialisation of coefficients and lighting color : brass */
                        MyShininess             = Standard_ShortReal (0.21794844);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.329412, 0.223529, 0.027451, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.780392, 0.568627, 0.113725, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.992157, 0.941176, 0.807843, Quantity_TOC_RGB);                                                             
                break;
 
                case Graphic3d_NOM_BRONZE :                                             
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.2);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.2125, 0.1275, 0.054, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.714, 0.4284, 0.18144, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.393548, 0.271906, 0.166721, Quantity_TOC_RGB);                                             
                break;
 
                case Graphic3d_NOM_COPPER :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                        /* Coefficient d eclairage */
+                        /*  Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.93);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.33, 0.26, 0.23, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.50, 0.11, 0.0, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.95, 0.73, 0.0, Quantity_TOC_RGB);                  
                break;
 
                case Graphic3d_NOM_GOLD :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coefficient d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.0625);
                        MyAmbientCoef           = Standard_ShortReal (0.3);
                        MyDiffuseCoef           = Standard_ShortReal (0.4);
                        MySpecularCoef          = Standard_ShortReal (0.9);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (1.0, 0.76862745, 0.31764706, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (1.0, 0.69, 0.0, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (1.0, 0.98, 0.78, Quantity_TOC_RGB);                                                                  
                break;          
 
                case Graphic3d_NOM_PEWTER :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coefficient d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.076923047);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.105882, 0.058824, 0.113725, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.427451, 0.470588, 0.541176, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.333333, 0.333333, 0.521569, Quantity_TOC_RGB);                                     
                break;  
 
                case Graphic3d_NOM_PLASTER :
 #ifdef BUG      // The plaster material must be considered as Generic.
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                        /* Coefficient d eclairage */
+                        /*  Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.2);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
 #else
-                        /* Coefficient d eclairage */
+                        /* Lighting Coefficient */
                         MyShininess             = Standard_ShortReal (0.0078125)
 ;
                         MyAmbientCoef           = Standard_ShortReal (0.26);
                         MySpecularCoef          = Standard_ShortReal (0.06);
 #endif
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.19225, 0.19225, 0.19225, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.50754, 0.50754, 0.50754, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.508273, 0.508273, 0.508273, Quantity_TOC_RGB);
                break;
 
                case Graphic3d_NOM_SILVER :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                        /* Coefficient d eclairage */
+                        /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.2);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.19225, 0.19225, 0.19225, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.50754, 0.50754, 0.50754, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.508273, 0.508273, 0.508273, Quantity_TOC_RGB);
                break;
                
                case Graphic3d_NOM_STEEL :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coefficient d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.06); 
                        MyAmbientCoef           = Standard_ShortReal (0.01);
                        MyDiffuseCoef           = Standard_ShortReal (0.03);
                        MySpecularCoef          = Standard_ShortReal (0.98);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
                break;  
                
                case Graphic3d_NOM_STONE :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coefficient d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.17);
                        MyAmbientCoef           = Standard_ShortReal (0.19);
                        MyDiffuseCoef           = Standard_ShortReal (0.75);
                        MySpecularCoef          = Standard_ShortReal (0.08);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (1.0, 0.8, 0.62, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (1.0, 0.8, 0.62, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */                                               
+                       /* Color resulting from specular */                                             
                        MySpecularColor.SetValues (0.98, 1.0, 0.60, Quantity_TOC_RGB);                  
                break;
 
-// Compatibilite ascendante materiaux physiques. On prend la meme definition
-// que dans le createur suivant. Nouveaux materials
+// Ascending Compatibility of physical materials. Takes the same definition
+// as in the next constructor. New materials
                
                case Graphic3d_NOM_CHROME :                     
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.1);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.35, 0.35, 0.35, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.4, 0.4, 0.4, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /*  Color resulting from specular */
                        MySpecularColor.SetValues (0.974597, 0.974597, 0.974597, Quantity_TOC_RGB);                                             
                break;
                
                case Graphic3d_NOM_NEON_PHC: 
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.05);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MyAmbientActivity = Standard_False;
                        MyDiffuseActivity  = Standard_False;
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */                       
+                       /* Color resulting from specular */                     
                        MyEmissiveColor.SetValues (0.0, 1.0, 0.46, Quantity_TOC_RGB);                                                     
                break;
                
                case Graphic3d_NOM_ALUMINIUM :                  
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.09);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.30, 0.30, 0.30, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.30, 0.30, 0.30, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.70, 0.70, 0.80, Quantity_TOC_RGB);                                         
                break;
                
                case Graphic3d_NOM_OBSIDIAN :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.3);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.05375, 0.05, 0.06625, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.18275, 0.17, 0.22525, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.332741, 0.328634, 0.346435, Quantity_TOC_RGB);                                             
                break;  
                
                case Graphic3d_NOM_JADE :
                        MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
-                       /* Coef d eclairage */
+                       /* Lighting Coefficient */
                        MyShininess             = Standard_ShortReal (0.1);
                        MyAmbientCoef           = Standard_ShortReal (1.0);
                        MyDiffuseCoef           = Standard_ShortReal (1.0);
                        MySpecularCoef          = Standard_ShortReal (1.0);
                        
-                       /* Couleur issue de l ambient */
+                       /* Color resulting from ambient */
                        MyAmbientColor.SetValues (0.135, 0.2225, 0.1575, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du diffus */
+                       /* Color resulting from dispersed */
                        MyDiffuseColor.SetValues (0.54, 0.89, 0.63, Quantity_TOC_RGB);
                        
-                       /* Couleur issue du speculaire */
+                       /* Color resulting from specular */
                        MySpecularColor.SetValues (0.316228, 0.316228, 0.316228, Quantity_TOC_RGB);                                             
                break;
                default:
        }
 }
 
-/* Affectation type du materiel */
+/* Attribution of the type of material */
 void Graphic3d_MaterialAspect::SetMaterialType( const Graphic3d_TypeOfMaterial AType ) {
        MyMaterialType = AType ;
 #ifdef IMP171201
 #endif
 }
 
-/* Affectation couleur eclairage ambient */
+/* Attribution of color ambient lighting */
 void Graphic3d_MaterialAspect::SetAmbientColor (const Quantity_Color& AColor) {
 
        MyAmbientColor  = AColor;
 #endif
 }
 
-/*  Affectation couleur eclairage diffus */
+/*  Attribution of color dispersed lighting */
 void Graphic3d_MaterialAspect::SetDiffuseColor (const Quantity_Color& AColor) {
 
        MyDiffuseColor  = AColor;
 #endif
 }
 
-/*  Affectation couleur eclairage speculaire */
+/*  Attribution of color specular lighting */
 void Graphic3d_MaterialAspect::SetSpecularColor (const Quantity_Color& AColor) {
 
        MySpecularColor = AColor;
 #endif
 }
 
-/* Affectation du coefficient d emission */
+/* Attribution of coefficient of emission */
 void Graphic3d_MaterialAspect::SetEmissive (const Standard_Real AValue) {
 
        if ((AValue < 0.0) || (AValue > 1.0))
        return (MyAmbientColor);
 }
 
-/* Acces a la couleur de l eclairage ambient */
+/* Access to the color of the ambient lighting */
 Quantity_Color Graphic3d_MaterialAspect::AmbientColor () const {
 
        return (MyAmbientColor);
 }
 
-/* Acces a la couleur de l eclairage diffus */
+/* Access to the color of the dispersed lighting */
 Quantity_Color Graphic3d_MaterialAspect::DiffuseColor () const {
 
        return (MyDiffuseColor);
 }
 
-/* Acces a la couleur de l eclairage speculaire */
+/* Access to the color of the specular lighting */
 Quantity_Color Graphic3d_MaterialAspect::SpecularColor () const {
 
        return (MySpecularColor);
 }
 
-/* Acces a la couleur d emission */
+/* Access to the color of emission */
 Quantity_Color Graphic3d_MaterialAspect::EmissiveColor () const {
 
        return (MyEmissiveColor);
 }
 
-/* Acces type du materiel */
+/* Access to the type of material */
 Standard_Boolean Graphic3d_MaterialAspect::MaterialType( const Graphic3d_TypeOfMaterial AType ) const {
        return ( MyMaterialType == AType ) ;
 }
 
 }
 
-/* Acces a la couleur de l eclairage ambient */
+/* Access to the color of the ambient lighting */
 Standard_Real Graphic3d_MaterialAspect::Ambient () const {
 
        return (Standard_Real (MyAmbientCoef));
 
 }
 
-/* Acces a la couleur de l eclairage diffus */
+/* Access to the color of the dispersed lighting */
 Standard_Real Graphic3d_MaterialAspect::Diffuse () const {
 
        return (Standard_Real (MyDiffuseCoef));
 
 }
 
-/* Valeur du coefficient d emission */
+/* Value of the coefficient of emission */
 Standard_Real Graphic3d_MaterialAspect::Emissive () const {
 
        return (Standard_Real (MyEmissiveCoef));
 
 }
 
-/* Acces a la couleur de l eclairage speculaire */
+/* Access to the color of the specular lighting */
 Standard_Real Graphic3d_MaterialAspect::Specular () const {
 
        return (Standard_Real (MySpecularCoef));
 
 }
 
-/* Acces au coefficient de transparence */
+/* Access to the coefficient of transparency */
 Standard_Real Graphic3d_MaterialAspect::Transparency () const {
 
        return (Standard_Real (MyTransparencyCoef));
 
 }
 
-/* Acces au coefficient de brillance */
+/* Access to the coefficient of shineness */
 Standard_Real Graphic3d_MaterialAspect::Shininess () const {
 
        return (Standard_Real (MyShininess));
 
 }
 
-/* Affectation du coefficient de brillance */
+/* Attribution of the coefficient of shineness */
 void Graphic3d_MaterialAspect::SetShininess (const Standard_Real AValue) {
 
        if ((AValue < 0.0) || (AValue > 1.0))
 Standard_Integer Graphic3d_MaterialAspect::NumberOfMaterials() {
 Standard_Integer n =sizeof(theMaterials)/sizeof(Material);
   if( n > Graphic3d_NOM_DEFAULT ) {
-    cout << " *** Graphic3d_MaterialAspect::NumberOfMaterials() may returns a badvalue due to incoherente size between material name array and enum" << endl;
+    cout << " *** Graphic3d_MaterialAspect::NumberOfMaterials() may return a badvalue due to incoherente size between material name array and enum" << endl;
   }
   return Graphic3d_NOM_DEFAULT;
 }
 
 
 //-Version      
 
-//-Design       Declaration des variables specifiques aux structures
-//              graphiques
+//-Design       Declaration of variables specific to graphic structures
 
-//-Warning      Une structure est definie dans un manager
-//              Il s'agit d'une sequence de groupes de primitives
+//-Warning      A structure is defined in a manager
+//              This is a sequence of groups of primitives
 
 //-References   
 
   Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d =
     new Graphic3d_AspectFillArea3d ();
 
-  // Recuperation des valeurs par defaut
+  // Return default values
   AManager->PrimitivesAspect (aAspectLine3d, aAspectText3d,
     aAspectMarker3d, aAspectFillArea3d);
 
   aAspectFillArea3d->SetPolygonOffsets( Aspect_POM_Fill, 1., 0. );
   // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets 
 
-  // Mise a jour de la CStructure associee
+  // Update the associated CStructure
   UpdateStructure (aAspectLine3d, aAspectText3d,
     aAspectMarker3d, aAspectFillArea3d);
 
   Standard_Integer i, Length;
   //        Standard_Address APtr = (void *) This ().operator->();
   Standard_Address APtr = (void *) this;
-  // Il faut enlever le pointeur possible sur cette structure
-  // que l'on est en train de detruire, dans la liste des descendants
-  // des ancetres de cette structure et dans la liste des ancetres
-  // des descendants de cette meme structure.
+  // It is necessary to remove the eventual pointer on the structure
+  // that can be destroyed, in the list of descendants
+  // of ancesters of this structure and in the list of ancesters
+  // of descendants of the same structure.
 
   Length  = MyDescendants.Length ();
   for (i=1; i<=Length; i++)
   MyCStructure.ContainsFacet      = 0;
   MyCStructure.IsDeleted  = 1;
 
-  // Destruction de me dans la bibliotheque graphique
+  // Destruction of me in the graphic library
   MyGraphicDriver->RemoveStructure (MyCStructure);
 
-  // Liberation de l'identification de la structure detruite
-  // dans le premier manager qui a gere la creation de la structure.
+  // Liberation of the identification if the destroyed structure 
+  // in the first manager that performs creation of the structure.
   if ( MyFirstPtrStructureManager )
     MyFirstStructureManager->Remove (Standard_Integer (MyCStructure.Id));
 
 
   if (IsDeleted ()) return;
 
-  // Highlight sur une structure deja Highlighted.
+  // Highlight on already Highlighted structure.
   if (MyCStructure.highlight) {
 
     Aspect_TypeOfUpdate UpdateMode = MyStructureManager->UpdateMode ();
     if (UpdateMode == Aspect_TOU_WAIT)
       UnHighlight ();
     else {
-      // Pour eviter d'appeler la methode : Update ()
-      // Inutile et peut-etre couteux.
+      // To avoid call of method : Update ()
+      // Not useful and can be costly.
       MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
       UnHighlight ();
       MyStructureManager->SetUpdateMode (UpdateMode);
   if (! MyCStructure.highlight)
     MyHighlightColor = AColor;
   else {
-    // Changement de highlight color sur une structure deja Highlighted.
+    // Change highlight color on already Highlighted structure.
 
     Aspect_TypeOfUpdate UpdateMode  = MyStructureManager->UpdateMode ();
     if (UpdateMode == Aspect_TOU_WAIT)
       UnHighlight ();
     else {
-      // Pour eviter d'appeler la methode : Update ()
-      // Inutile et peut-etre couteux.
+      // To avoid call of method : Update ()
+      // Not useful and can be costly.
       MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
       UnHighlight ();
       MyStructureManager->SetUpdateMode (UpdateMode);
 
 Standard_Boolean Graphic3d_Structure::IsRotated () const {
 
-  // Test un peu leger !
+  // A somewhat light test !
   return   ( MyCStructure.Transformation[0][1] != 0.
     || MyCStructure.Transformation[0][2] != 0.
     || MyCStructure.Transformation[1][0] != 0.
         Result = MyCStructure.Transformation[i][j] != 0.;
 
 #ifdef TRACE_ISTRSF
-  cout << "La structure " << Identification ();
+  cout << "Structure " << Identification ();
   if (Result)
-    cout << " est transformee\n" << flush;
+    cout << " is transformed\n" << flush;
   else
-    cout << " n'est pas transformee\n" << flush;
+    cout << " is not transformed\n" << flush;
 #endif
 
   return Result;
 
   if (IsDeleted ()) return (Standard_False);
 
-  // Une structure contient au moins une facette :
-  // si l'un de ses groupes est contient au moins une facette.
+  // A structure contains at least one facet :
+  // if one of these groups contains at least one facet.
 
   Standard_Boolean Result1 = Standard_False;
   Standard_Boolean Result2 = Standard_False;
 
   Result1 = (MyCStructure.ContainsFacet > 0);
 
-  // Si un des groupes contient au moins une facette alors
-  // la structure aussi.
+  // If one of groups contains at least one facet, the structure contains it too.
   if (Result1) return (Result1);
 
   Length  = MyDescendants.Length ();
 
-  // Je m'arrete au premier descendant qui contient au moins une facette.
+  // Stop at the first descendant  containing at least one facet.
   for (i=1; i<=Length && ! Result2; i++)
     Result2 = ((Graphic3d_Structure *)
     (MyDescendants.Value (i)))->ContainsFacet ();
 
   if (IsDeleted ()) return (Standard_True);
 
-  // Une structure est vide :
-  // si l'ensemble de ses groupes est vide ou tous ses
-  // groupes sont vides et si l'ensemble de ses descendants
-  // est vide ou tous ses descendants sont vides.
+  // A structure is empty :
+  // if all these groups are empty or if all 
+  // groups are empty and all their descendants
+  // are empty or if all its descendants are empty.
 
   Standard_Boolean Result1   = Standard_True;
   Standard_Integer i, Length = MyGroups.Length ();
 
-  // Je m'arrete au premier groupe non vide
+  // Stop at the first non-empty group
   for (i=1; i<=Length && Result1; i++)
     Result1 = (MyGroups.Value (i))->IsEmpty ();
 
-  // Si un des groupes est non vide alors la structure l'est aussi.
+  // If a group is non-empty the structure is also non-empty.
   if (! Result1) return (Standard_False);
 
   Standard_Boolean Result2 = Standard_True;
 
   Length  = MyDescendants.Length ();
 
-  // Je m'arrete au premier descendant non vide
+  // Stop at the first non-empty descendant 
   for (i=1; i<=Length && Result2; i++)
     Result2 = ((Graphic3d_Structure *)
     (MyDescendants.Value (i)))->IsEmpty ();
   MyGraphicDriver->ContextStructure (MyCStructure);
 
   // CAL 14/04/95
-  // Les attributs sont "IsSet" lors de la premiere mise a jour
-  // d'un contexte (line, marker...)
+  // attributes are "IsSet" during the first update 
+  // of a context (line, marker...)
   MyCStructure.ContextLine.IsSet          = 1;
   MyCStructure.ContextFillArea.IsSet      = 1;
   MyCStructure.ContextMarker.IsSet        = 1;
 #endif
 
   // CAL 14/04/95
-  // Les attributs sont "IsSet" lors de la premiere mise a jour
-  // d'un contexte (line, marker...)
+  // Attributes are "IsSet" during the first update
+  // of context (line, marker...)
   MyCStructure.ContextLine.IsSet          = 1;
   MyCStructure.ContextFillArea.IsSet      = 1;
   MyCStructure.ContextMarker.IsSet        = 1;
   MyGraphicDriver->ContextStructure (MyCStructure);
 
   // CAL 14/04/95
-  // Les attributs sont "IsSet" lors de la premiere mise a jour
-  // d'un contexte (line, marker...)
+  // Attributes are "IsSet" during the first update of a context (line, marker...)
   MyCStructure.ContextLine.IsSet          = 1;
   MyCStructure.ContextFillArea.IsSet      = 1;
   MyCStructure.ContextMarker.IsSet        = 1;
 
   MyGraphicDriver->ContextStructure (MyCStructure);
 
-  // CAL 14/04/95
-  // Les attributs sont "IsSet" lors de la premiere mise a jour
-  // d'un contexte (line, marker...)
+  // Attributes are "IsSet" during the first update of a context (line, marker...)
   MyCStructure.ContextLine.IsSet          = 1;
   MyCStructure.ContextFillArea.IsSet      = 1;
   MyCStructure.ContextMarker.IsSet        = 1;
       Display ();
     }
     else {
-      // Pour eviter d'appeler la methode : Update ()
-      // Inutile et peut-etre couteux.
+      // To avoid calling method : Update ()
+      // Not useful and can be costly.
       MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
       Erase ();
       MyVisual        = AVisual;
         MyAncestors.Append ((void *) AStructure.operator->());
         AStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
 
-        // MyGraphicDriver->Connect est appele dans le cas
-        // d'un connect entre mere et fille
+        // MyGraphicDriver->Connect is called in case
+        // if connection between parent and child
       }
     }
     break;
     if ((void *) (MyDescendants.Value (i)) ==
       (void *) (AStructure.operator->())) indexD  = i;
 
-  // On cherche dans les Descendants
+  // Search in the Descendants
   if (indexD != 0) {
     MyDescendants.Remove (indexD);
     AStructure->Disconnect (this);
       if ((void *) (MyAncestors.Value (i)) ==
         (void *) (AStructure.operator->())) indexA  = i;
 
-    // On cherche dans les Ancestors
+    // Search in the Ancestors
     if (indexA != 0) {
       MyAncestors.Remove (indexA);
       AStructure->Disconnect (this);
 
-      // Pas de call a MyGraphicDriver->Disconnect
-      // dans le cas d'un ancetre
+      // No call of MyGraphicDriver->Disconnect
+      // in case of an ancestor
     }
   }
 
   case Graphic3d_TOC_DESCENDANT :
     Length      = MyDescendants.Length ();
     for (i=1; i<=Length; i++)
-      // Value (1) et non Value (i) car MyDescendants
-      // est modifiee par :
+      // Value (1) instead of Value (i) as MyDescendants
+      // is modified by :
       // Graphic3d_Structure::Disconnect (AStructure)
-      // qui enleve AStructure de MyDescendants
+      // that takes AStructure from MyDescendants
       ((Graphic3d_Structure *)
       (MyDescendants.Value (1)))->Disconnect (this);
     break;
   case Graphic3d_TOC_ANCESTOR :
     Length      = MyAncestors.Length ();
     for (i=1; i<=Length; i++)
-      // Value (1) et non Value (i) car MyAncestors
-      // est modifiee par :
+     // Value (1) instead of Value (i) as MyAncestors
+      // is modified by :
       // Graphic3d_Structure::Disconnect (AStructure)
-      // qui enleve AStructure de MyAncestors
+      // that takes AStructure from MyAncestors
       ((Graphic3d_Structure *)
       (MyAncestors.Value (1)))->Disconnect (this);
     break;
   TColStd_Array2OfReal AMatrix44 (0, 3, 0, 3);
 
   // Assign the new transformation in an array [0..3][0..3]
-  // Evite des problemes si le user a defini sa matrice [1..4][1..4]
+  // Avoid problemes if the user has defined matrice [1..4][1..4]
   //                                                 ou [3..6][-1..2] !!
   lr      = AMatrix.LowerRow ();
   ur      = AMatrix.UpperRow ();
 
   if (AType == Graphic3d_TOC_REPLACE) {
     MyCStructure.Composition = 0;
-    // La mise a jour de la CStructure
+    // Update of CStructure
     for (i=0; i<=3; i++)
       for (j=0; j<=3; j++) {
         MyCStructure.Transformation[i][j] =
 
   if (AType == Graphic3d_TOC_POSTCONCATENATE) {
     MyCStructure.Composition = 1;
-    // Pour simplifier la gestion des indices
+    // To simplify management of indices
     for (i=0; i<=3; i++)
       for (j=0; j<=3; j++)
         AMatrix44 (i, j) = AMatrix (lr + i, lc + j);
-    // Le calcul de produit de matrices
+    // Calculation of the product of matrices
     for (i=0; i<=3; i++)
       for (j=0; j<=3; j++) {
         NewTrsf (i, j) = 0.0;
           NewTrsf (i, j) = valuenewtrsf;
         }
       }
-      // La mise a jour de la CStructure
+      // Update of CStructure
       for (i=0; i<=3; i++)
         for (j=0; j<=3; j++)
           MyCStructure.Transformation[i][j] = float (NewTrsf (i, j));
   }
 
-  // Si transformation, non validation des parties cachees deja calculees.
+  // If transformation, no validation of hidden already calculated parts.
   if (IsRotated ())
     ReCompute ();
 
   if ((XTMin == RF) && (YTMin == RF) &&
       (ZTMin == RF) && (XTMax == RL) &&
       (YTMax == RL) && (ZTMax == RL)) {
-      // Cas impossible car cela voudrait dire
-      // que la structure est vide
+      // Case impossible as it would mean that 
+      // the structure is empty
       XMin = RF; 
       YMin = RF; 
       ZMin = RF;
 
 void Graphic3d_Structure::Add (const Handle(Graphic3d_Group)& AGroup) {
 
-  // Methode appelee que par le constructeur de Graphic3d_Group
-  // Ce n'est pas la peine de tester l'existence de <AGroup>
-  // dans la sequence MyGroups.
+  // Method called only by the constructor of Graphic3d_Group
+  // It is easy to check presence of <AGroup>
+  // in sequence MyGroups.
   MyGroups.Append (AGroup);
 
 }
   for (Standard_Integer i=1; i<=Length && index==0; i++)
     if (MyGroups.Value (i) == AGroup) index = i;
 
-  // On cherche dans les Groups
+  // Search in Groups
   if (index != 0) {
     Standard_Integer GroupLabelBegin, GroupLabelEnd;
     AGroup->Labels (GroupLabelBegin, GroupLabelEnd);
           if ((XMin == RL) && (YMin == RL) &&
               (ZMin == RL) && (XMax == RF) &&
               (YMax == RF) && (ZMax == RF)) {
-              // Cas impossible car cela voudrait dire
-              // que la structure est vide
+              // Case impossible as it would mean 
+              // that the structure is empty
               XMin    = RF;
               YMin    = RF;
               ZMin    = RF;
     while (IteratorD.More ()) {
       Graphic3d_Structure::Network
         (IteratorD.Key (), AType, ASet);
-      // IteratorD.Next () se positionne
-      // sur la prochaine structure
+      // IteratorD.Next () is located on the next structure
       IteratorD.Next ();
     }
     break;
     while (IteratorA.More ()) {
       Graphic3d_Structure::Network
         (IteratorA.Key (), AType, ASet);
-      // IteratorA.Next () se positionne
-      // sur la prochaine structure
-      IteratorA.Next ();
+      // IteratorD.Next () is located on the next structure
+     IteratorA.Next ();
     }
     break;
   }
     break;
   case Aspect_TOHM_BOUNDBOX :
     if (IsEmpty () || IsInfinite ()) {
-      // Structure vide ou infinie
+      // Empty or infinite structure
       XMin = YMin = ZMin = 0.;
       XMax = YMax = ZMax = 0.;
     }
 
 void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure AVisual) {
 
-  // On ne memorise le ComputeVisual que lorsque la structure est
-  // declaree TOS_ALL, TOS_WIREFRAME ou TOS_SHADING.
-  // C'est cette declaration qui va nous permettre de calculer
-  // la bonne representation de la structure calculee par Compute
-  // et non pas le passage en TOS_COMPUTED.
+  // The ComputeVisual is saved only if the structure is
+  // declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
+  // This declaration permits to calculate
+  // proper representation of the structure calculated by Compute
+  // instead of passage to TOS_COMPUTED.
   if (AVisual != Graphic3d_TOS_COMPUTED)
     MyComputeVisual = AVisual;
 
 
 void Graphic3d_Structure::SetManager (const Handle(Graphic3d_StructureManager)& AManager, const Standard_Boolean WithPropagation) {
 
-  // Toutes les structures connectees doivent suivre ?
+  // All connected structures should follow ?
 #ifdef IMPLEMENTED
   if (WithPropagation) {
     Standard_Integer i, Length;
   }
 #endif
 
-  // changement d'identification ?
+  // change of identification ?
   // MyStructureManager->Remove (Standard_Integer (MyCStructure.Id));
   // AManager->NewIdentification ();
   // MyCStructure.Id      = int (AManager->NewIdentification ());
   MyStructureManager->SetUpdateMode (UpdateMode);
   AManager->SetUpdateMode (NewUpdateMode);
 
-  // Nouveau manager
+  // New manager
   MyPtrStructureManager   = (void *) AManager.operator->();
 
 }
 
 Standard_Boolean Graphic3d_Structure::HLRValidation () const {
 
-  // Les parties cachees stockees dans <me> sont valides si :
-  // 1/ le proprietaire est defini.
-  // 2/ elles n'ont pas ete invalidees.
+  // Hidden parts stored in <me> are valid if :
+  // 1/ the owner is defined.
+  // 2/ they are not invalid.
 
   Standard_Boolean Result = MyOwner != NULL && MyCStructure.HLRValidation != 0;
 
 
 
 //-Version      
 
-//-Design       Declaration des variables specifiques aux managers
+//-Design       Declaration of variables specific to managers
 
-//-Warning      Un manager manipule un ensemble de structures
+//-Warning      Manager manages a set of structures
 
 //-References   
 
         if (Initialisation) {
 
                 Initialisation = Standard_False;
-                /* tableau pour gerer les identificateurs de StructureManager */
+                /* table to manage IDs of StructureManager */
                 for (i=1; i<=Limit; i++) StructureManager_ArrayId[i]    = 0;
 
                 StructureManager_CurrentId      = 1;
           }
         }
 
-        // Si toutes les structures sont vides ou infinies
+        // If all structures are empty or infinite
         if (Flag) {
           XMin = YMin = ZMin = RF;
           XMax = YMax = ZMax = RL;
 
   OSD_File File(MyPath);
   File.Open(OSD_ReadOnly, Protection);
 
-  // ouverture du fichier ok ?
+  // open file ok ?
   if ( File.IsOpen() == Standard_False ) {
     TCollection_AsciiString sysname;
     MyPath.SystemName(sysname);
 
 
   ////////////////////////
-  // lecture du fichier //
+  // file reading       //
   ////////////////////////
 
 
 
   // Euclid ?
   ///////////
-  // plantouille royalement
   Handle(AlienImage_EuclidAlienImage) EuclidAlienImage = new AlienImage_EuclidAlienImage() ;
 
   if (EuclidAlienImage->Read( File )) {
   }
 
 
-  // lever exception: type de fichier inconnu
+  // raise exception: file type unknown 
   return TheAlienImage;
 }
 
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques aux points
+//-Design      Declaration of variables specific to points
 
-//-Warning     Un point est defini par ses coordonnees et sa couleur
+//-Warning     A point is defined by its coordinates and color
 
 //-References  
 
 
 //-Global data definitions
 
-//     -- la couleur du point
+//     -- point color
 //     MyColor         :       Color;
 
 //-Constructors
 Graphic3d_VertexC::Graphic3d_VertexC () {
 }
 
-// le :(AX, AY, AZ) car VertexC herite de Vertex et il faut appeler le
-// constructeur de Vertex avec AX, AY et AZ pour mettre a jour
-// les fields MyX, MyY, MyZ.
+// :(AX, AY, AZ) as VertexC inherits Vertex and it is necessary to call
+// constructor of Vertex with AX, AY and AZ to update fields MyX, MyY, MyZ.
 
 Graphic3d_VertexC::Graphic3d_VertexC (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ, const Quantity_Color& AColor):
 Graphic3d_Vertex (AX, AY, AZ),
 MyColor (AColor) {
 }
 
-// le :(APoint) car VertexC herite de Vertex et il faut appeler le
-// constructeur de Vertex avec APoint pour mettre a jour
-// les fields MyX, MyY, MyZ.
+// :(APoint) as VertexC inherits Vertex and it is necessary to call
+// constructor of Vertex with APoint to update fields MyX, MyY, MyZ.
 
 Graphic3d_VertexC::Graphic3d_VertexC (const Graphic3d_Vertex& APoint, const Quantity_Color& AColor):
 Graphic3d_Vertex (APoint),
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques aux points
+//-Design      Declaration of variables specific to points
 
-//-Warning     Un point est defini par ses coordonnees, sa normale
-//             et sa couleur
+//-Warning     A point is defined by its coordinates, normal 
+//             and color
 
 //-References  
 
 
 //-Global data definitions
 
-//     -- la couleur
+//     -- the color
 //     MyColor         :       Color;
 
 //-Constructors
 
 }
 
-// le :(AX, AY, AZ) car VertexNC herite de VertexN et il faut appeler le
-// constructeur de VertexN avec AX, AY, AZ, ANX, ANY et ANZ pour
-// mettre a jour les fields.
+// :(AX, AY, AZ) as VertexNC inherits VertexN and it is necessary to call
+// constructor of VertexN with AX, AY, AZ, ANX, ANY and ANZ to
+// update fields.
 
 Graphic3d_VertexNC::Graphic3d_VertexNC (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ, const Standard_Real ANX, const Standard_Real ANY, const Standard_Real ANZ, const Quantity_Color& AColor,const Standard_Boolean FlagNormalise):
 Graphic3d_VertexN (AX, AY, AZ, ANX, ANY, ANZ,FlagNormalise),
 MyColor (AColor) {
 }
 
-// le :(APoint, AVector) car VertexNC herite de VertexN et il faut appeler le
-// constructeur de VertexN avec APoint et AVector pour mettre a jour
-// les fields.
+//  :(APoint, AVector) as VertexNC inherits VertexN and it is necessary to call
+// constructor of VertexN with APoint and AVector to
+// update fields.
 
 Graphic3d_VertexNC::Graphic3d_VertexNC (const Graphic3d_Vertex& APoint, const Graphic3d_Vector& AVector, const Quantity_Color& AColor,const Standard_Boolean FlagNormalise):
 Graphic3d_VertexN (APoint, AVector,FlagNormalise),
 
       (MySharedLibrary.DlError ());
   }
   else {
-    // Gestion des traces
+    // Management of traces
     OSD_Environment beurk("CSF_GraphicTrace");
     TCollection_AsciiString val = beurk.Value();
     if (val.Length() > 0 )
         (MySharedLibrary.DlError ());
     }
     else {
-      // Sequence artistique :
-      // new_GLGraphicDriver est une OSD_Function :
+      // Sequence :
+      // new_GLGraphicDriver is OSD_Function :
       // typedef int (* OSD_Function)(...);
-      // d'ou le magnifique cast en GraphicDriver.
+      // wherefrom a good cast in GraphicDriver.
       //Handle( Graphic3d_GraphicDriver ) ADriver = new Graphic3d_GraphicDriver ( TheShr );
 
       GET_DRIVER_PROC fp = ( GET_DRIVER_PROC )new_GLGraphicDriver;
         (MySharedLibrary.DlError ());
       MyGraphicDriver = ( *fp ) ( TheShr );
 
-      // Gestion des traces
+      // Management of traces
       if ( val.Length() > 0 && val.IsIntegerValue() )
         MyGraphicDriver->SetTrace(val.IntegerValue());
     }
 
        TolVertex=TolVertex1;
       }        
       //
-      //-- Verification des cas ou on a oublie de coder degenereted
+      //-- Verification of cases when forgotten to code degenereted
       if(!degenerated) {
        Standard_Real aR2;
        gp_Pnt P3da, P3db;
       }
       //
       //-- ------------------------------------------------------------
-      //-- On regarde la distance uv entre le point de debut de l edge
-      //-- et le dernier point enregistre dans SeqPnt2d
-      //-- On cherche a eloigner le premier point de l edge courant 
-      //-- du dernier point enregistre
+      //-- Check distance uv between the start point of the edge
+      //-- and the last point saved in SeqPnt2d
+      //-- To to set the first point of the current 
+      //-- afar from the last saved point
       Avant = nbpnts;
       for(iX=firstpoint; iX<=aNbs1; iX++) {
        Standard_Boolean IsRealCurve3d;
     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     //
     if(NbEdges) { 
-      //-- on compte ++ avec un explorateur normal et -- avec le Wire Exploreur
+      //-- count ++ with normal explorer and -- with Wire Explorer
       TColgp_Array1OfPnt2d PClass(1,2);
       gp_Pnt2d anInitPnt(0., 0.);
       //
   Standard_Integer nbtabclass = TabClass.Length();
   //
   if(nbtabclass>0) { 
-    //-- Si une erreur sur un wire a ete detecte : On met tous les TabOrien a -1
+    //-- if an error on a wire was detected : all TabOrien set to -1
     if(BadWire) {
       TabOrien(1)=-1;
     }
     return(TopAbs_IN);
   }
   
-  //-- U1 est le First Param et U2 ds ce cas est U1+Period
+  //-- U1 is the First Param and U2 is in this case U1+Period
   Standard_Real u, v, uu, vv,  uperiod, vperiod;
   Standard_Boolean IsUPer, IsVPer, urecadre, vrecadre;
   TopAbs_State Status= TopAbs_UNKNOWN;
       }
     } // if(TabOrien(1)!=-1) {
     
-    else {  //-- TabOrien(1)=-1    Wire Faux
+    else {  //-- TabOrien(1)=-1   Wrong Wire
       BRepClass_FaceClassifier aClassifier;
       aClassifier.Perform(Face,Puv,Toluv);
       Status = aClassifier.State();
     return(TopAbs_IN);
   }
   
-  //-- U1 est le First Param et U2 ds ce cas est U1+Period
+  //-- U1 is the First Param and U2 in this case is U1+Period
   Standard_Real u=_Puv.X();
   Standard_Real v=_Puv.Y();
   Standard_Real uu = u, vv = v;
        Status = TopAbs_OUT;
       }
     }
-    else {  //-- TabOrien(1)=-1    Wire Faux
+    else {  //-- TabOrien(1)=-1  Wrong  Wire 
       BRepClass_FaceClassifier aClassifier;
       aClassifier.Perform(Face,Puv,Tol);
       Status = aClassifier.State();
 
       } // end of if (!Precision::IsNegativeInfinite(fprm) &&  !Precision::IsPositiveInfinite(lprm))
 
       else {
-       //  on regarde si on garde
+       //  check if keep
        //
        Standard_Boolean bFNIt, bLPIt;
        Standard_Real aTestPrm, dT=100.;
 
            }//  end of if (ok) {
          }//  end of for (Standard_Integer j=0; j<=17; j++)
-       }//  end of else { on regarde si on garde
+       }//  end of else { check if keep
       }// for (i=1; i<=myLConstruct.NbParts(); i++)
     }// IntPatch_Circle: IntPatch_Ellipse:
     break;
            ilprm = (Standard_Integer)lprm;
          }
        }
-       //-- lbr : 
-       //-- Si une des surfaces est un plan , on approxime en 2d
-       //-- sur cette surface et on remonte les points 2d en 3d.
+       //-- If one of surfaces is a plane , 2D approximation is done on 
+       //-- this surface and 2D points are returned in 3D.
        if(typs1 == GeomAbs_Plane) { 
          theapp3d.Perform(myHS1, myHS2, WL, Standard_False,Standard_True, myApprox2,ifprm,ilprm);
        }         
     S->Bounds(umin, umax, vmin, vmax);
 
     if (S->IsUPeriodic() && !C2d.IsNull()) {
-      // Recadre dans le domaine UV de la face
+      // Reframe in domain UV of the face
       Standard_Real period, U0, du, aEps; 
       
       du =0.0;
   IntTools_SequenceOfCurves aNewCvs;
 
   //
-  // 1. Treatment of periodic and closed  curves
+  // 1. Processing of periodic and closed  curves
   aNbCurves=mySeqOfCurve.Length();
   for (i=1; i<=aNbCurves; i++) {
     const IntTools_Curve& aIC=mySeqOfCurve(i);
 // ------------------------------------------------------------------------------------------------
 // static function: ParameterOutOfBoundary
 // purpose:         Computes a new parameter for given curve. The corresponding 2d points 
-//                  does not lay on any boundary of given faces
+//                  do not lie on any boundary of given faces
 // ------------------------------------------------------------------------------------------------
 Standard_Boolean ParameterOutOfBoundary(const Standard_Real       theParameter, 
                                        const Handle(Geom_Curve)& theCurve, 
 
     }
     default:
     {
-      //-- Le cas de biparametrees periodiques est gere en amont
+      //-- Case of periodic biparameters is processed upstream
       myHS1IsUPeriodic = myHS1IsVPeriodic = Standard_False;
       break;
     }
     }
     default:
     {
-      //-- Le cas de biparametrees periodiques est gere en amont
+      //-- Case of periodic biparameters is processed upstream
       myHS2IsUPeriodic = myHS2IsVPeriodic = Standard_False;
       break;
     }
          Pmid.Parameters(u1,v1,u2,v2);
          Recadre(myHS1,myHS2,u1,v1,u2,v2);
          const TopAbs_State in1 = myDom1->Classify(gp_Pnt2d(u1,v1),Tol);
-         if(in1 !=  TopAbs_OUT) {  //-- !=ON donne Pb 
+         if(in1 !=  TopAbs_OUT) {   
            const TopAbs_State in2 = myDom2->Classify(gp_Pnt2d(u2,v2),Tol);
-           if(in2 != TopAbs_OUT) { //-- !=ON  
+           if(in2 != TopAbs_OUT) {   
              seqp.Append(firstp);
              seqp.Append(lastp);
            }
       }
     }      
     if (!intrvtested) {
-      // on garde a priori. Il faudrait un point 2d sur chaque
-      // surface pour prendre la decision. Sera fait dans 
-      // l`appelant
+      // Keep a priori. A point 2d on each
+      // surface is required to make the decision. Will be done in the caller
       seqp.Append(GeomInt_LineTool::FirstParameter(L));
       seqp.Append(GeomInt_LineTool::LastParameter(L));
     }
   done = Standard_False;
   seqp.Clear();
   nbvtx = GeomInt_LineTool::NbVertex(L);
-  if (nbvtx == 0) { // on garde a priori. Il faudrait un point 2d sur chaque
-                    // surface pour prendre la decision. Sera fait dans 
-                    // l`appelant
+  if (nbvtx == 0) { // Keep a priori. Point 2d is required on each
+                    // surface to make the decision. Will be done in the caller
     seqp.Append(GeomInt_LineTool::FirstParameter(L));
     seqp.Append(GeomInt_LineTool::LastParameter(L));
     done = Standard_True;
     {
       if (Abs(prm-seqpss(j).Parameter()) <= Tol)
       {
-       // on cumule
+       // accumulate
        GeomInt_ParameterAndOrientation& valj = seqpss.ChangeValue(j);
        if (or1 != TopAbs_INTERNAL) {
          if (valj.Orientation1() != TopAbs_INTERNAL) {
       }
       
       if (prm < seqpss(j).Parameter()-Tol ) {
-       // on insere avant la position j
+       // insert before position j
        seqpss.InsertBefore(j,GeomInt_ParameterAndOrientation(prm,or1,or2));
        inserted = Standard_True;
        break;
     }
   }
 
-  // on determine l`etat en debut de ligne
+  // determine the state at the beginning of line
   Standard_Boolean trim = Standard_False;
   Standard_Boolean dansS1 = Standard_False;
   Standard_Boolean dansS2 = Standard_False;
         break;
       }
     }
-    dansS1 = Standard_True; // on garde dans le doute
+    dansS1 = Standard_True; // Keep in doubt
   }
 
   for (i=1; i<= nbvtx; i++)
         break;
       }
     }
-    dansS2 = Standard_True; // on garde dans le doute
+    dansS2 = Standard_True; //  Keep in doubt
   }
 
-  if (!trim) { // on a necessairement dansS1 == dansS2 == Standard_True
+  if (!trim) { // necessarily dansS1 == dansS2 == Standard_True
     seqp.Append(GeomInt_LineTool::FirstParameter(L));
     seqp.Append(GeomInt_LineTool::LastParameter(L));
     done = Standard_True;
     return;
   }
 
-  // On epluche la sequence seqpss pour constituer les bouts valides
-  // et les stocker dans seqp(2*i+1) et seqp(2*i+2)
+  // sequence seqpss is peeled to create valid ends 
+  // and store them in seqp(2*i+1) and seqp(2*i+2)
 
   Standard_Real thefirst = GeomInt_LineTool::FirstParameter(L);
   Standard_Real thelast = GeomInt_LineTool::LastParameter(L);
     }
   }
 
-  // le petit dernier a rajouter
+  // finally to add
   if (dansS1 && dansS2)
   {
     lastp  = thelast;
 
 
   Quantity_Length dx,dy,dz;  aDirection.Coord(dx,dy,dz);
 //
-// Pointe de la fleche:
+// Point of the arrow:
   Quantity_Length xo,yo,zo;  aLocation.Coord(xo,yo,zo);
 
-// Centre du cercle base de la fleche:
+// Center of the base circle of the arrow:
   Quantity_Length xc = xo - dx * aLength;
   Quantity_Length yc = yo - dy * aLength;
   Quantity_Length zc = zo - dz * aLength;
 
-// Construction d'un repere i,j pour le cercle:
+// Construction of i,j mark for the circle:
   Quantity_Length xn=0., yn=0., zn=0.;
 
   if ( Abs(dx) <= Abs(dy) && Abs(dx) <= Abs(dz)) xn=1.;
 
 // Author:     Jean-Louis FRENKEL
 // Modified by  rob 09-oct-96
 //             <jlf@stylox>
-//              rob 18-may-98 : Pb de la Trsf dont le type n'est pas calcule en fonction
-//                              des coefficients.
+
 
 #define IMP040200      //GG Recompute HLR after transformation
 //                     in all the case.
 
 //=======================================================================
 //function : Compute
-//purpose  : Les methodes pour les parties cachees...
+//purpose  : Methods for hidden parts...
 //=======================================================================
 
 Handle(Graphic3d_Structure) PrsMgr_Presentation3d::
 Compute(const Handle(Graphic3d_DataStructureManager)& aProjector)
 {
 #ifdef DEB
-  cout<<"passage dans g = Compute(P) "<<endl;
+  cout<<"passage in g = Compute(P) "<<endl;
 #endif
   Handle(Prs3d_Presentation) g = new Prs3d_Presentation(Handle(PrsMgr_PresentationManager3d)::DownCast(PresentationManager())->StructureManager());
   myPresentableObject->Compute(Projector(aProjector),g);
                                    const Handle(Graphic3d_Structure)& TheStructToFill)
 {
 #ifdef DEB
-  cout<<"passage dans Compute(P,Str)"<<endl;
+  cout<<"passage in Compute(P,Str)"<<endl;
 #endif
   TheStructToFill->Clear();
   const Handle(Prs3d_Presentation)& P = *((Handle(Prs3d_Presentation)*) &TheStructToFill);
        const Handle(Geom_Transformation)& TheTrsf)
 {
 #ifdef DEB
-  cout<<"passage dans G =  Compute(P,Trsf)"<<endl;
+  cout<<"passage in G =  Compute(P,Trsf)"<<endl;
 #endif
   Handle(Prs3d_Presentation) g = new Prs3d_Presentation(Handle(PrsMgr_PresentationManager3d)::DownCast(PresentationManager())->StructureManager());
 
     g->Transform(TheTrsf);
   }
   else{
-    // en attendant que la chose soit effectue dans gp_Trsf...rob
+    // waiting that something is done in gp_Trsf...rob
     Standard_Boolean good (Standard_True);
     for (Standard_Integer i=1;i<=3 && good ;i++){
       for (Standard_Integer j=1;j<=3 && good ;j++){
     
     if(good){
 #ifdef DEB
-      cout<<"\ton a verifie que la Trsf est une Translation"<<endl;
+      cout<<"\t it is checked if Trsf is a Translation"<<endl;
 #endif
     myPresentableObject->Compute(Projector(aProjector),g);
     g->Transform(TheTrsf);
     }
     else{
 #ifdef DEB
-      cout<<"\tla Trsf n'est pas seulement translation..."<<endl;
+      cout<<"\t Trsf is not only translation..."<<endl;
 #endif
       myPresentableObject->Compute(Projector(aProjector),TheTrsf,g);
     }
 {
   
 #ifdef DEB
-  cout<<"passage dans Compute(P,Trsf,Str)"<<endl;
+  cout<<"passage in Compute(P,Trsf,Str)"<<endl;
 #endif
 
   Handle(Prs3d_Presentation) P = *((Handle(Prs3d_Presentation)*)&TheStructToFill);
 #ifdef IMP040200       
   TheStructToFill->Clear();
   myPresentableObject->Compute(Projector(aProjector),TheTrsf,P);
-#else  //Does not work properly ,HLR seems deactivated for view rotation 
+#else  //Does not work properly, HLR seems deactivated for view rotation 
   if(TheTrsf->Form()== gp_Translation){
 #ifdef DEB
-    cout<<"\tla Trsf est une translation"<<endl;
+    cout<<"\t Trsf is a translation"<<endl;
 #endif
 //    myPresentableObject->Compute(Projector(aProjector),P);
     P->Transform(TheTrsf);
   }
   else{
-    // en attendant que la chose soit effectue dans gp_Trsf...rob
+    //  waiting that something is done in gp_Trsf...rob
     Standard_Boolean good (Standard_True);
     for (Standard_Integer i=1;i<=3 && good ;i++){
       for (Standard_Integer j=1;j<=3 && good ;j++){
     }
     if(good && !TheStructToFill->IsEmpty()){
 #ifdef DEB
-      cout<<"\ton a verifie que la Trsf est une Translation"<<endl;
+      cout<<"\t it is checked if Trsf is a Translation"<<endl;
 #endif
       
       P->Transform(TheTrsf);
       TheStructToFill->Clear();
       
 #ifdef DEB
-      cout<<"\tla Trsf n'est pas seulement translation..."<<endl;
+      cout<<"\t Trsf is not only translation..."<<endl;
 #endif
       
       myPresentableObject->Compute(Projector(aProjector),TheTrsf,P);
 
 
 //=======================================================================
 //function : Select3D_SensitiveCircle (constructeur)
-//purpose  : Definition d'un cercle sensible
+//purpose  : Definition of a sensitive circle
 //=======================================================================
 static Standard_Integer S3D_GetCircleNBPoints(const Handle(Geom_Circle)& C,
                                               const Standard_Integer anInputNumber)
 
 //=======================================================================
 //function : Select3D_SensitiveCircle (constructeur)
-//purpose  : Definition d'un arc sensible
+//purpose  : Definition of a sensitive arc
 //=======================================================================
 Select3D_SensitiveCircle::
 Select3D_SensitiveCircle(const Handle(SelectBasics_EntityOwner)& OwnerId, 
 {
   
 
-  // dans le cas Edge (pourtour de la face seulement 
-  //on regarde si le point souris X,Y se trouve a l'interieur du triangle
-  // pi,pi+1,pi+2 a la tolerance pres... si oui on a fini...
+  // in case of Edge (for the face it is only checked if 
+  // the mouse point X,Y is found inside the triangle
+  // pi,pi+1,pi+2 with close tolerance... if yes, finish...
   if(mynbpoints>1){
     Standard_Boolean Found =Standard_False;
     Standard_Integer i = 0;
          Standard_Real V1V1 = V1.SquareModulus();
          DMin2 = 
            (V1V1 <=aTol2) ? 
-             Min(DMin2,V.SquareModulus()): // si le segment est trop petit...
+             Min(DMin2,V.SquareModulus()): // if the segment is too small...
                Min(DMin2,Vector*Vector/V1V1);
          
        }
 
 //Modif on jul-21-97 : changement en harray1 pour eventuelles connexions ...
 
 #include <Select3D_SensitiveFace.ixx>
-#include <Select3D_Projector.hxx>
 #include <SelectBasics_BasicTool.hxx>
 #include <gp_Pnt2d.hxx>
 #include <gp_Pnt.hxx>
 #define AutoInitFlags(aflag) (aflag = 0)
 
 //==================================================
-// Function: faire disparaitre ce constructeur a la prochaine version...
-// Purpose : simplement garde pour ne pas perturber la version update
+// Function: Hide this constructor to the next version...
+// Purpose : simply avoid interfering with the version update
 //==================================================
 
 Select3D_SensitiveFace::
     Bnd_Box2d(mybox2d).Get(Xmin,Ymin,Xmax,Ymax);
     DMin2 = gp_XY(Xmax-Xmin,Ymax-Ymin).SquareModulus();
   }
-  // calcul d'un critere de distance mini...
-  // au depart Dmin = taille de la boite englobante 2D,
-  // ensuite distance mini du polyedre ou du cdg...
+  // calculation of a criterion of minimum distance...
+  // from start Dmin = size of the bounding box 2D,
+  // then min. distance of the polyhedron or cdg...
 
   Standard_Real aTol2 = aTol*aTol;
   gp_XY CDG(0.,0.);
     Standard_Real V1V1 = V1.SquareModulus();
     DMin2 = 
       (V1V1 <=aTol2) ? 
-    Min(DMin2,V.SquareModulus()): // si le segment est trop petit...
+    Min(DMin2,V.SquareModulus()): // if the segment is too small...
       Min(DMin2,Vector*Vector/V1V1);
     //cdg ...
     gp_XY PlaneTest(CDG);PlaneTest-=((Select3D_Pnt2d*)mypolyg2d)[I-1];
     Standard_Real valtst = PlaneTest^V1;
     if(isplane2d && Abs(valtst)>aTol) isplane2d=Standard_False;
   }
-  if (isplane2d)
-  {
-    return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+
+  if(isplane2d) {
+    Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+    
+    return Standard_True;
   }
   //detection d'une auto - intersection dans le polygon 2D; si oui on sort
 //    if (!AutoComputeFlag(myautointer)) {
 //   if (AutoInterFlag(myautointer)) return Standard_True;
 // //  
 
-  //sinon on regarde si le point est dans la face...
+  //otherwise it is checked if the point is in the face...
   TColgp_Array1OfPnt2d aArrayOf2dPnt(1, mynbpoints);
   Points2D(aArrayOf2dPnt);
   CSLib_Class2d TheInOutTool(aArrayOf2dPnt,aTol,aTol,Xmin,Ymin,Xmax,Ymax);
        res = Standard_True;
     }
   }
-  if (res)
-  {
-    return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
-  }
-  return Standard_False;
+  if(res)
+    Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+    
+  return res;
 }
 
 //=======================================================================
 //=======================================================================
 Standard_Real Select3D_SensitiveFace::ComputeDepth(const gp_Lin& EyeLine) const
 {
-  Standard_Real aDepth = Precision::Infinite();
-  Standard_Real aDepthMin = !mylastprj.IsNull() ? mylastprj->DepthMin() : -Precision::Infinite();
-  Standard_Real aDepthMax = !mylastprj.IsNull() ? mylastprj->DepthMax() :  Precision::Infinite();
-  Standard_Real aDepthTest;
-  for (Standard_Integer i = 0; i < mynbpoints - 1; i++)
-  {
-    aDepthTest = ElCLib::Parameter (EyeLine, ((Select3D_Pnt* )mypolyg3d)[i]);
-    if (aDepthTest < aDepth && (aDepthTest > aDepthMin) && (aDepthTest < aDepthMax))
-    {
-      aDepth = aDepthTest;
-    }
-  }
-  return aDepth;
+  Standard_Real val(Precision::Infinite());
+  for(Standard_Integer i=0;i<mynbpoints-1;i++)
+    val = Min(val,ElCLib::Parameter(EyeLine,((Select3D_Pnt*)mypolyg3d)[i]));
+  return val;
 }
 
 //purpose  : 
 //=======================================================================
 
-void Select3D_SensitiveGroup::Project(const Handle(Select3D_Projector)& aProjector) 
+void Select3D_SensitiveGroup::Project(const Select3D_Projector& aProjector) 
 {
   Select3D_SensitiveEntity::Project(aProjector); // to set the field last proj...
-
+  
   for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next()){
     It.Value()->Project(aProjector);
   }
   myLastTol = aTol;
   for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next()){
     myLastRank++;
-    if (It.Value()->Matches (X, Y, aTol, DMin))
-    {
-      myX = X; myY = Y; myLastTol = aTol;
-      // compute and validate the depth (will call ::ComputeDepth())
-      return Select3D_SensitiveEntity::Matches (X, Y, aTol, DMin);
+    if(It.Value()->Matches(X,Y,aTol,DMin)){
+      myX = X;myY = Y;myLastTol = aTol;
+      SetLastDepth( Precision::Infinite() );
+      
+      Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+      return Standard_True;
     }
   }
-  // no match
-  myLastRank = 0;
-  SetLastDepth (ShortRealLast());
+  myLastRank =0;
+  SetLastDepth(0.0);
   return Standard_False;
 }
 
 
 //=======================================================================
 //function : ComputeDepth
-//purpose  : pour optimiser, on prend le min des profondeurs pour 
-//          les entites qui repondent OUI a Matches(X,Y,...)
-//          on commence le test a partir de mylastRank...
+//purpose  : to optimise, the minimum depth for 
+//          entities that answer YES to Matches(X,Y,...) is taken
+//          the test is started from mylastRank...
 //=======================================================================
 Standard_Real Select3D_SensitiveGroup::ComputeDepth(const gp_Lin& EyeLine) const
 {
-  Standard_Integer currank = 0;
-  Standard_Real DMin, thedepth (Precision::Infinite());
-  for (Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next())
-  {
+  Standard_Integer currank(0);
+  Standard_Real DMin,thedepth(Precision::Infinite());
+  for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next()){
     currank++;
-    if (currank >= myLastRank)
-    {
-      // this recomputes and validates the depth for the entity
-      if (It.Value()->Matches (myX, myY, myLastTol, DMin))
-      {
-        It.Value()->ComputeDepth (EyeLine);
-        if (It.Value()->Depth() < thedepth)
-        {
-          // search for topmost entity
-          thedepth = It.Value()->Depth();
-          //myLastRank = currank; // can not do this here...
-        }
+    if(currank>=myLastRank){
+      if(It.Value()->Matches(myX,myY,myLastTol,DMin)){
+       It.Value()->ComputeDepth(EyeLine);
+       thedepth = Min(Depth(),
+                      It.Value()->Depth());
       }
     }
+    
   }
   return thedepth;
 }
   return nbboxes;
 }
 
-void Select3D_SensitiveGroup::SetLastPrj(const Handle(Select3D_Projector)& Prj)
+void Select3D_SensitiveGroup::SetLastPrj(const Select3D_Projector& Prj)
 {
   Select3D_SensitiveEntity::SetLastPrj(Prj);
   for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next())
 
   B.Enlarge(aTol);
   if(B.IsOut(TheP)) return 2; 
   
-  // on classifie le point par rapport aux demi -espaces delimites
-  // par chaque cote du triangle (a la tolerance pres)
+  // the point is classified corresponding to demi-spaces limited
+  // by each side of the triangle (with tolerance)
   gp_XY V01(p1);V01-=p0;
   gp_XY V02(p2);V02-=p0;
   gp_XY V12(p2);V12-=p1;
 
   Standard_Real TolTol = aTol*aTol;
 
-  // regardons les cas particuliers...
-  //si l'un des vecteurs est quasi nul (2 points sont confondus), 
-  // on sort tout de suite (on est deja dans la boite d'encombrement, c'est bon...)
+  // check these particular cases...
+  // if one of vectors is almost null (2 points are mixed), 
+  // leave at once (it is already in the bounding box, which is good...)
   
   DMin = aTol;
   
   {
     Standard_Real LV = V02.SquareModulus();
     if ( LV <= gp::Resolution())
-      return 0; // les 3 points sont confondus, et TheP est dans la boite englobante B...
+      return 0; // 3 points are mixed, and TheP is in the bounding box B...
 
     if ( S3D_Str_NearSegment (p0, p2, TheP, aTol, DMin) )
       return 0;
     return 2;
   }
 
-  // normale a p0p1 orientee...
+  // oriented normal to p0p1...
   gp_Dir2d N (-V01.Y(), V01.X()); 
   Standard_Boolean Neg = (N * V02 < 0.);
   if ( Neg ) 
   if ( aD1 < -aTol ) 
     return 2;
 
-  // normale a p1p2 orientee...
+  // oriented normal to p1p2...
   if(Neg)
     N.SetCoord(p2.Y()-p1.Y(),p1.X()-p2.X());
   else
   Vec.SetCoord(TheP.X()-p1.X(),TheP.Y()-p1.Y());
   Standard_Real aD2 = Vec * N.XY();
   if ( aD2 < -aTol ) 
-    return 2;   // dehors
+    return 2;   // outside
 
-  // normale a p2p0 orientee...
+  // oriented normal to p2p0...
   // attention v20 (x0-x2)    =>   N y2-y0   => -N  y0-y2
   //               (y0-y2)           x0-x2          x2-x0
   if(Neg)
   Vec.SetCoord(TheP.X()-p2.X(),TheP.Y()-p2.Y());
   Standard_Real aD3 = Vec * N.XY();
   if ( aD3 < -aTol ) 
-    return 2;  // dehors
+    return 2;  // outside
 
   // compute 2d distance to triangle
   Standard_Real aD = Min (aD1, Min (aD2, aD3));
 
 void Select3D_SensitiveTriangle::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const 
 {
-  // les generalites....
+  // general information....
   
   S<<"\tSensitiveTriangle 3D :\n";
   if(HasLocation())
   }
   
   Standard_Real prof(Precision::Infinite());
-  // formule calcul du parametre du point sur l'intersection
+  // formula calculation of the point parameters on intersection
   // t = (P1P2 ^P1P3)* OP1  / ((P1P2^P1P3)*Dir)
   
-  gp_Pnt Oye  = EyeLine.Location(); // origine de la ligne oeil/point vise...
+  gp_Pnt Oye  = EyeLine.Location(); // origin of the target line eye/point...
   gp_Dir Dir  = EyeLine.Direction();
   
   gp_Vec P1P2 (P1,P2), P1P3(P1,P3);
 
 
 #include <Select3D_SensitiveTriangulation.ixx>
 #include <gp_Pnt2d.hxx>
-#include <Poly.hxx>
 #include <Poly_Connect.hxx>
 #include <CSLib_Class2d.hxx>
 #include <TColStd_Array1OfInteger.hxx>
     for (j = 0; j < 3; j++)
       if (t[j] == 0) nFree++;
   }
-  return nFree;
+  return nFree; 
 }
 static Standard_Boolean S3D_STriangul_NearSegment (const gp_XY& p0, const gp_XY& p1, const gp_XY& TheP,
                                                    const Standard_Real aTol, Standard_Real& aDMin)
 
   gp_XY V01(p1);V01-=p0;
   gp_XY Vec(TheP);Vec -= p0;
-
+  
   Standard_Real u = Vec*V01.Normalized();
   if(u<-aTol) return Standard_False;
   Standard_Real u1 = u-aTol;
 //   VEdg-= PEdg2.XY();
 //   VCur-=PCur.XY();
 //   Standard_Real long1 = VEdg.SquareModulus();
-
+  
 //   if(long1<=TolTol)
 //     return VCur.SquareModulus();
 //   Standard_Real Val = VEdg^VCur;
 //   return Val*Val/long1;
-
+  
 // }
 
 static Standard_Boolean S3D_IsEdgeIn(const Standard_Integer e1,
 
 //=======================================================================
 //function : Select3D_SensitiveTriangulation
-//purpose  :
+//purpose  : 
 //=======================================================================
 
 Select3D_SensitiveTriangulation::
 myNodes2d(1,Trg->NbNodes()),
 myDetectedTr(-1)
 {
-  // Code honteusement vole a DBRep_DrawableShape::Display...
-  // calcul des edges libres et du cdg 3d de la triangulation:
-  // Ce code devrait, pour plus de facilites etre integre dans la poly_triangulation...
+  // calculate free edges and cdg 3d of the triangulation:
+  // This code should have been integrated in poly_triangulation...
 
   Standard_Integer fr = 1;
   const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
-  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();  
   Standard_Integer nbTriangles (myTriangul->NbTriangles());
   gp_XYZ cdg(0,0,0);
   Standard_Integer n[3];
-
-  // pour rechercher les connexions dans le cas ou on ne s'occupe de la frontiere...
+  
+  // to find connections in case when the border is not concerned...
   if(!myIntFlag){
     myFreeEdges = new TColStd_HArray1OfInteger(1,2*S3D_NumberOfFreeEdges(Trg));
     TColStd_Array1OfInteger& FreeE = myFreeEdges->ChangeArray1();
     }
   }
 
-
+  
   if(nbTriangles!=0) cdg /= nbTriangles;
   myCDG3D = gp_Pnt(cdg);
-
+  
   ComputeTotalTrsf();
 
   if(myTrsf.Form()!=gp_Identity)
 
 //=======================================================================
 //function : Select3D_SensitiveTriangulation
-//purpose  :
+//purpose  : 
 //=======================================================================
 Select3D_SensitiveTriangulation::
 Select3D_SensitiveTriangulation(const Handle(SelectBasics_EntityOwner)& OwnerId,
 }
 //=======================================================================
 //function : Project
-//purpose  :
+//purpose  : 
 //=======================================================================
 
-void Select3D_SensitiveTriangulation::Project(const Handle(Select3D_Projector)& aPrj)
+void Select3D_SensitiveTriangulation::Project(const Select3D_Projector& aPrj) 
 {
   Select3D_SensitiveEntity::Project(aPrj); // to set the field last proj...
-
+  
   mybox2d.SetVoid();
-  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
-
+  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();  
+  
   gp_Pnt2d ProjPT;
-
+  
   for(Standard_Integer I=1;I<=myTriangul->NbNodes();I++){
     if(myTrsf.Form()!=gp_Identity)
-      aPrj->Project(Nodes(I).Transformed(myTrsf),ProjPT);
+      aPrj.Project(Nodes(I).Transformed(myTrsf),ProjPT);
     else
-      aPrj->Project(Nodes(I),ProjPT);
-
+      aPrj.Project(Nodes(I),ProjPT);
+    
     myNodes2d.SetValue(I,ProjPT);
     mybox2d.Add(ProjPT);
   }
-
-  aPrj->Project(myCDG3D,myCDG2D);
+  
+  aPrj.Project(myCDG3D,myCDG2D);
 }
 
 //=======================================================================
 //function : Areas
-//purpose  :
+//purpose  : 
 //=======================================================================
 
-void Select3D_SensitiveTriangulation::Areas(SelectBasics_ListOfBox2d& boxes)
+void Select3D_SensitiveTriangulation::Areas(SelectBasics_ListOfBox2d& boxes) 
 {
   boxes.Append(mybox2d);
 }
 
+//=======================================================================
+//function : getUV
+//purpose  : compute parameters of the picked point on triangle in 2d
+//     Note: parameters of point P on triangle (P1, P2, P3) are defined 
+//           as U and V such that P = P1 + U * (P2 - P1) + V * (P3 - P1);
+//    Range: U >= 0, V >= 0, U + V <= 1
+//=======================================================================
+
+static gp_XY getUV (const gp_XY& aP2d1, const gp_XY& aP2d2, const gp_XY& aP2d3,
+                    const gp_XY& aPick)
+{
+  gp_XY aDU = aP2d2 - aP2d1;
+  gp_XY aDV = aP2d3 - aP2d1;
+  Standard_Real aDet = aDU ^ aDV;
+
+  // case of non-degenerated triangle
+  gp_XY aDP = aPick - aP2d1;
+  if ( Abs (aDet) > gp::Resolution() )
+  {
+    Standard_Real aU =  (aDP ^ aDV) / aDet;
+    Standard_Real aV = -(aDP ^ aDU) / aDet;
+    if ( aU < 0. ) aU = 0.;
+    if ( aV < 0. ) aV = 0.;
+    if ( aU + aV > 1. ) { Standard_Real aD = aU + aV; aU /= aD; aV /= aD; }
+    return gp_XY (aU, aV);
+  }
+
+  // degenerated case (in 2d projection)
+  Standard_Real aL2U = aDU.SquareModulus();
+  Standard_Real aL2V = aDV.SquareModulus();
+  if ( aL2U < gp::Resolution() ) // side 1-2 is degenerated 
+  {
+    if ( aL2V < gp::Resolution() ) // whole triangle is degenerated to point
+      return gp_XY (0., 0.);
+    else
+      return gp_XY (0., (aDP * aDV) / aL2V);
+  }
+  else if ( aL2V < gp::Resolution() ) // side 1-3 is degenerated
+    return gp_XY ((aDP * aDU) / aL2U, 0.);
+  else // sides 1-2 and 1-3 are collinear
+  {
+    // select parameter on one of sides so as to have points closer to picked
+    Standard_Real aU = Min (1., Max (0., (aDP * aDU) / aL2U));
+    Standard_Real aV = Min (1., Max (0., (aDP * aDV) / aL2V));
+    gp_XY aP2dU = aP2d1 + aU * aDU;
+    gp_XY aP2dV = aP2d1 + aV * aDV;
+    if ( (aPick - aP2dU).SquareModulus() < (aPick - aP2dV).SquareModulus() )
+      return gp_XY ((aDP * aDU) / aL2U, 0.);
+    else
+      return gp_XY (0., (aDP * aDV) / aL2V);
+  }
+}
+
 //=======================================================================
 //function : Matches
-//purpose  :
+//purpose  : 
 //=======================================================================
 Standard_Boolean Select3D_SensitiveTriangulation::Matches(const Standard_Real X,
                                                          const Standard_Real Y,
                                                          const Standard_Real aTol,
-                                                         Standard_Real& DMin)
+                                                         Standard_Real& DMin) 
 {
   // get view direction (necessary for calculation of depth) from field mylastprj of the base class
-  if (mylastprj.IsNull())
+  if ( ! mylastprj )
     return Standard_False;
 
   DMin = Precision::Infinite();
   myDetectedTr = -1;
   const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
 
-  // on regarde si on est a l'interieur d'1 triangle 2d.
+  // it is checked if we are inside the triangle 2d.
   if(myIntFlag)
   {
-    gp_Lin EyeLine = mylastprj->Shoot(X,Y);
+    gp_Lin EyeLine = (*((Select3D_Projector*)mylastprj)).Shoot(X,Y);
     if ( myTrsf.Form()!=gp_Identity )
       EyeLine.Transform (myTrsf.Inverted());
 
     Standard_Real aMinDepth = Precision::Infinite();
-    const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+    const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();  
     for (Standard_Integer itr=1; itr<=myTriangul->NbTriangles(); itr++)
     {
       Standard_Integer n1,n2,n3;
       const gp_XY& aPnt2d1 = myNodes2d(n1).XY();
       const gp_XY& aPnt2d2 = myNodes2d(n2).XY();
       const gp_XY& aPnt2d3 = myNodes2d(n3).XY();
-      gp_XY aUV;
-      Standard_Real aDistSquare = Poly::PointOnTriangle (aPnt2d1, aPnt2d2, aPnt2d3, BidPoint, aUV);
-      if ( aDistSquare > aTol * aTol )
+      Standard_Real DD = 0.;
+      if (Status (BidPoint, aPnt2d1, aPnt2d2, aPnt2d3, aTol, DD) == 2)
         continue;
 
       // compute depth on this triangle
+      gp_XY aUV = getUV (aPnt2d1, aPnt2d2, aPnt2d3, BidPoint);
       Standard_Real aDepth1 = ElCLib::Parameter (EyeLine, Nodes(n1));
       Standard_Real aDepth2 = ElCLib::Parameter (EyeLine, Nodes(n2));
       Standard_Real aDepth3 = ElCLib::Parameter (EyeLine, Nodes(n3));
-      Standard_Real aDepth = aDepth1 + aUV.X() * (aDepth2 - aDepth1) +
+      Standard_Real aDepth = aDepth1 + aUV.X() * (aDepth2 - aDepth1) + 
                                        aUV.Y() * (aDepth3 - aDepth1);
 
-      // take triangle with lowest depth and within defined depth interval
-      if (aDepth < aMinDepth &&
-          aDepth > mylastprj->DepthMin() &&
-          aDepth < mylastprj->DepthMax())
+      // take triangle with lowest depth
+      if ( aDepth < aMinDepth )
       {
         aMinDepth = aDepth;
         myDetectedTr = itr;
-        DMin = Sqrt (aDistSquare);
+        DMin = DD;
       }
     }
   }
-
-  //    Cas Uniquement Test sur Frontiere de la triangulation...
-  //
+  
+  //    Case only Test on Border of the triangulation...
+  //   
   else
   {
     //Standard_Integer ifirst;
     Standard_Integer nn = FreeE.Length(), Node1,Node2;
     //Standard_Real LEdg;
     //Standard_Real DMinDMin,TolTol = aTol*aTol;
-
+    
     for (Standard_Integer ifri =1; ifri <= nn && myDetectedTr < 0; ifri+=2)
     {
       Node1 = FreeE(ifri);
                                      myNodes2d(Node2).XY(),
                                      BidPoint, aTol, DMin) )
       {
-        for(Standard_Integer itr=1; itr <= myTriangul->NbTriangles(); itr++)
+       for(Standard_Integer itr=1; itr <= myTriangul->NbTriangles(); itr++)
         {
           Standard_Integer n1,n2,n3;
-          triangles(itr).Get(n1,n2,n3);
-          if(S3D_IsEdgeIn(Node1,Node2,n1,n2,n3))
+         triangles(itr).Get(n1,n2,n3);
+         if(S3D_IsEdgeIn(Node1,Node2,n1,n2,n3))
           {
-            myDetectedTr = itr;
+           myDetectedTr = itr;
             break; // return first found; selection of closest is not implemented yet
           }
-        }
+       }
       }
     }
-  }
+  } 
   if ( myDetectedTr <= 0 )
     return Standard_False;
-
-  // compute and validate the depth (::Depth()) along the eyeline
-  return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+  Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+  return Standard_True;
 }
 
 
 //=======================================================================
 //function : Matches
-//purpose  :
+//purpose  : 
 //=======================================================================
 
 Standard_Boolean Select3D_SensitiveTriangulation::Matches(const Standard_Real XMin,
                                                          const Standard_Real YMin,
                                                          const Standard_Real XMax,
                                                          const Standard_Real YMax,
-                                                         const Standard_Real aTol)
+                                                         const Standard_Real aTol) 
 {
   Bnd_Box2d B;
   B.Update(Min(XMin,XMax)-aTol,
           Min(YMin,YMax)-aTol,
           Max(XMin,XMax)+aTol,
           Max(YMin,YMax)+aTol);
-
+  
   for(Standard_Integer i=myNodes2d.Lower();i<=myNodes2d.Upper();i++){
     if(B.IsOut(myNodes2d(i)))
       return Standard_False;
 
 //=======================================================================
 //function : Matches
-//purpose  :
+//purpose  : 
 //=======================================================================
 
 Standard_Boolean Select3D_SensitiveTriangulation::
 Matches (const TColgp_Array1OfPnt2d& aPoly,
         const Bnd_Box2d& aBox,
         const Standard_Real aTol)
-{
+{ 
   Standard_Real Umin,Vmin,Umax,Vmax;
   aBox.Get(Umin,Vmin,Umax,Vmax);
   Standard_Real Tolu,Tolv;
 
 //=======================================================================
 //function : IsFree
-//purpose  :
+//purpose  : 
 //=======================================================================
 
 Standard_Boolean Select3D_SensitiveTriangulation::IsFree(const Standard_Integer IndexOfTriangle,
     TColStd_Array1OfInteger& FreeE = myFreeEdges->ChangeArray1();
 
   for(Standard_Integer I=1;I<=FreeE.Length() && FoundIndex==-1;I+=2){
-
+    
     if(FreeE(I) == n[0]){
-
+      
       if(FreeE(I+1)== n[1] || FreeE(I+1)== n[2]) FoundIndex=I;}
     else if(FreeE(I) == n[1]){
       if(FreeE(I+1)== n[0] || FreeE(I+1)== n[2]) FoundIndex=I;}
     else if(FreeE(I) == n[2]){
       if(FreeE(I+1)== n[0] || FreeE(I+1)== n[1]) FoundIndex=I;}
   }
-
+  
   return FoundIndex!=-1;
 }
 
 
 //=======================================================================
 //function : GetConnected
-//purpose  :
+//purpose  : 
 //=======================================================================
 Handle(Select3D_SensitiveEntity) Select3D_SensitiveTriangulation::
 GetConnected(const TopLoc_Location& aLoc)
 {
-
-  Handle(Select3D_SensitiveTriangulation) NiouEnt =
+  
+  Handle(Select3D_SensitiveTriangulation) NiouEnt = 
     new Select3D_SensitiveTriangulation(myOwnerId,myTriangul,myiniloc,myFreeEdges,myCDG3D,myIntFlag);
-
+  
   if(HasLocation()) NiouEnt->SetLocation(Location());
 //  TopLoc_Location TheLocToApply = HasLocation() ?  Location()*aLoc : aLoc;
 //  if(!TheLocToApply.IsIdentity())
   NiouEnt->UpdateLocation(aLoc);
-
+    
 
   return NiouEnt;
 }
 
 //=======================================================================
 //function : ResetLocation
-//purpose  :
+//purpose  : 
 //=======================================================================
-void Select3D_SensitiveTriangulation::ResetLocation()
+void Select3D_SensitiveTriangulation::ResetLocation() 
 {
   Select3D_SensitiveEntity::ResetLocation();
   ComputeTotalTrsf();
 
 //=======================================================================
 //function : Dump
-//purpose  :
+//purpose  : 
 //=======================================================================
-void Select3D_SensitiveTriangulation::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
+void Select3D_SensitiveTriangulation::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const 
 {
   S<<"\tSensitiveTriangulation 3D :"<<endl;
   if(myiniloc.IsIdentity())
     S<<"\t\tExisting Initial Location"<<endl;
   if(HasLocation())
     S<<"\t\tExisting Location"<<endl;
-
+  
   S<<"\t\tNb Triangles : "<<myTriangul->NbTriangles()<<endl;
   S<<"\t\tNb Nodes     : "<<myTriangul->NbNodes()<<endl;
   S<<"\t\tNb Free Edges: "<<myFreeEdges->Length()/2<<endl;
 
 //=======================================================================
 //function : ComputeDepth
-//purpose  :
+//purpose  :  
 //=======================================================================
 Standard_Real Select3D_SensitiveTriangulation::ComputeDepth(const gp_Lin& EyeLine) const
 {
-  if(myDetectedTr==-1) return Precision::Infinite(); // non implemente actuellement...
+  if(myDetectedTr==-1) return Precision::Infinite(); // currently not implemented...
   const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
-  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
-
+  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();  
+  
   Standard_Integer n1,n2,n3;
   triangles(myDetectedTr).Get(n1,n2,n3);
   gp_Pnt P[3]={Nodes(n1),Nodes(n2),Nodes(n3)};
       P[i].Transform(myTrsf);
     }
   }
-
-  // formule calcul du parametre du point sur l'intersection
+  
+  // formula calculate the parameter of the point on the intersection
   // t = (P1P2 ^P1P3)* OP1  / ((P1P2^P1P3)*Dir)
   Standard_Real prof(Precision::Infinite());
-  gp_Pnt Oye  = EyeLine.Location(); // origine de la ligne oeil/point vise...
+  gp_Pnt Oye  = EyeLine.Location(); // origin of the target line eye/point...
   gp_Dir Dir  = EyeLine.Direction();
 
-  gp_Vec Vtr[3];
+  gp_Vec Vtr[3]; 
   for(Standard_Integer i=0;i<=2;i++)
     Vtr[i] = gp_Vec(P[i%3],P[(i+1)%3]);
   Vtr[2] = -Vtr[2];
-
-  // eliminons tout de suite les cas singuliers...
+  
+  // remove singular cases immediately...
   Standard_Integer SingularCase(-1);
   if(Vtr[0].SquareMagnitude()<= Precision::Confusion())
     SingularCase = 0;
   if(Vtr[2].SquareMagnitude()<= Precision::Confusion())
     if( SingularCase < 0 ) SingularCase = 1;
 #endif
-
-  // 3 pts confondus...
+  
+  // 3 pts mixed...
   if(SingularCase ==2){
     prof= ElCLib::Parameter(EyeLine,P[0]);
     return prof;
   }
-
+  
   if(SingularCase!=0)
     Vtr[0].Normalize();
   if(SingularCase!=1 &&
      SingularCase!=2)
     Vtr[2].Normalize();
   gp_Vec OPo(Oye,P[0]);
-  // 2 points confondus... on recherche l'intersection entre le segment et la ligne oeil/point vise.
-  //
+  // 2 points mixed... the intersection between the segment and the target line eye/point.
+  // 
   if(SingularCase!=-1){
     gp_Vec V = SingularCase==0 ? Vtr[2] : Vtr[0];
     gp_Vec Det = Dir^V;
       prof = VSM.Z()/Det.Z();
   }
   else{
-
+    
     Standard_Real val1 = OPo.DotCross(Vtr[0],Vtr[2]);
     Standard_Real val2 = Dir.DotCross(Vtr[0],Vtr[2]);
-
+    
     if(Abs(val2)>Precision::Confusion())
       prof =val1/val2;
-  }
+  } 
   if (prof==Precision::Infinite()){
     prof= ElCLib::Parameter(EyeLine,P[0]);
     prof = Min (prof, ElCLib::Parameter(EyeLine,P[1]));
     prof = Min (prof, ElCLib::Parameter(EyeLine,P[2]));
   }
-
+  
   return prof;
 }
 
 //=======================================================================
 //function : DetectedTriangle
-//purpose  :
+//purpose  : 
 //=======================================================================
 Standard_Boolean Select3D_SensitiveTriangulation::DetectedTriangle(gp_Pnt& P1,
                                                                   gp_Pnt& P2,
                                                                   gp_Pnt& P3) const
 {
-  if(myDetectedTr==-1) return Standard_False; // non implemente actuellement...
+  if(myDetectedTr==-1) return Standard_False; // currently not implemented...
   const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
-  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();  
   Standard_Integer n1,n2,n3;
   triangles(myDetectedTr).Get(n1,n2,n3);
-
+  
   P1 = Nodes(n1);
   P2 = Nodes(n2);
   P3 = Nodes(n3);
     P2.Transform(myTrsf);
     P3.Transform(myTrsf);
   }
-
+  
   return Standard_True;
 }
 
 //=============================================================================
 // Function : DetectedTriangle2d
-// Purpose  :
+// Purpose  : 
 //=============================================================================
-Standard_Boolean Select3D_SensitiveTriangulation::DetectedTriangle2d(
+Standard_Boolean Select3D_SensitiveTriangulation::DetectedTriangle2d( 
   gp_Pnt2d& P1, gp_Pnt2d& P2, gp_Pnt2d& P3) const
 {
-  if(myDetectedTr==-1)
-    return Standard_False; // non implemente actuellement...
+  if(myDetectedTr==-1) 
+    return Standard_False; //  currently not implemented...
   const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
-  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+  const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();  
   Standard_Integer n1,n2,n3;
   triangles( myDetectedTr ).Get(n1,n2,n3);
 
   int aLower = myNodes2d.Lower();
   int anUpper = myNodes2d.Upper();
-  if ( n1 >= aLower && n1 <= anUpper &&
+  if ( n1 >= aLower && n1 <= anUpper && 
        n2 >= aLower && n2 <= anUpper &&
        n3 >= aLower && n3 <= anUpper )
   {
     P3 = myNodes2d.Value( n3 );
     return Standard_True;
   }
-  else
+  else 
     return Standard_False;
-
+  
 }
 
-void Select3D_SensitiveTriangulation::ComputeTotalTrsf()
+void Select3D_SensitiveTriangulation::ComputeTotalTrsf() 
 {
   Standard_Boolean hasloc = (HasLocation() || !myiniloc.IsIdentity());
-
+  
   if(hasloc){
     if(myiniloc.IsIdentity())
       myTrsf = Location().Transformation();
 
 // Author:  Mister rmi
 //  <rmi>
 
-
-// Modified     jmi/rob 29/8/96
-//              appel de Loadmode dans Load d'un objet fait une seule fois.
-//              
+             
 
 #include <SelectMgr_SelectionManager.ixx>
 #include <SelectMgr_ViewerSelector.hxx>
 
   if (!anObject->HasSelection(aMode)) LoadMode(anObject,aMode);
 
-  // ATTENTION : si la selection est a remettre a jour, on le fait la ....      
   const Handle(SelectMgr_Selection)& Sel = anObject->Selection(aMode);
 
   switch(Sel->UpdateStatus()){
   if( SelectDebugModeOnSM() ) cout<<"===>SelectMgr_SelectionManager::Update"<<endl;
 
   if(ForceUpdate){
-    if( SelectDebugModeOnSM() ) cout<<"\tRecalcul Complet des selections"<<endl;
+    if( SelectDebugModeOnSM() ) cout<<"\t Global Recalculation of selections"<<endl;
     if(aMode==-1){
       anObject->UpdateSelection();
       anObject->UpdateLocation();
     }
     return;
   }
-  // l'objet n'est pas connu du SMgr.
+  // objet is not known to SMgr.
   if (!(myglobal.Contains(anObject) || mylocal.IsBound(anObject))){
-    if( SelectDebugModeOnSM() ) {cout<<"\tObjet non charge dans le SelectionManager"<<endl;
-    cout<<"\t on flagge ses selections eventuelles"<<endl;}
+    if( SelectDebugModeOnSM() ) {cout<<"\t Object not loaded in the SelectionManager"<<endl;
+    cout<<"\t eventual selections are flagged"<<endl;}
     if( aMode == -1 ){
       for(anObject->Init();anObject->More();anObject->Next()){
         if( SelectDebugModeOnSM() ) cout<<"\t\t Mode "<<anObject->CurrentSelection()->Mode()<<"  ";
       anObject->Selection(aMode)->UpdateStatus(SelectMgr_TOU_Full);
   }
 
-  // la il l'est, il s'agit de recalculer ce qui doit l'etre
-  // et de flagger ce qui est en sommeil...
+  // recalculate whatever is required
+  // and set flag on top...
   else{
     TColStd_MapIteratorOfMapOfTransient It;
     Handle(Standard_Transient) Tr;
     Standard_Boolean Found;
-    // on balaye les selections de l'objet
+    // object selections are parsed
 
     for(anObject->Init();anObject->More();anObject->Next()){
       const Handle(SelectMgr_Selection)& Sel = anObject->CurrentSelection();
       Standard_Integer curmode = Sel->Mode();
       Found = Standard_False;
 
-      // balayage des selecteurs ...
+      // parsing of selections ...
       for(It.Initialize(myselectors);It.More();It.Next()){
         Tr = It.Key();
         Handle(SelectMgr_ViewerSelector) VS = *((Handle(SelectMgr_ViewerSelector)*)&Tr);
           Found  = Standard_True;
           switch(Sel->UpdateStatus()){
     case SelectMgr_TOU_Full:
-      anObject->UpdateSelection(curmode); // pas de break expres...
+      anObject->UpdateSelection(curmode); // no break on purpose...
     case SelectMgr_TOU_Partial:
       anObject->UpdateLocation(Sel);
       break;
 
 //=======================================================================
 //function : Update
-//purpose  : On recalcule les Selections si elles sont flaggees
-//           "A RECALCULER" et qu'elles sont activees dans un des selecteurs.
-//           Si ForceUpdate = True, et qu'elles sont "A RECALCULER"
-//           On le fait sans se preoccuper de l'etat d'activation.
+//purpose  : Selections are recalculated if they are flagged
+//           "TO RECALCULATE" and activated in one of selectors.
+//           If ForceUpdate = True, and they are "TO RECALCULATE"
+//           This is done without caring for the state of activation.
 //=======================================================================
 void SelectMgr_SelectionManager::Update(const Handle(SelectMgr_SelectableObject)& anObject,
                                         const Standard_Boolean ForceUpdate)
     if(ForceUpdate){
       switch(Sel->UpdateStatus()){
       case SelectMgr_TOU_Full:
-        anObject->UpdateSelection(Sel->Mode()); // pas de break expres...
+        anObject->UpdateSelection(Sel->Mode()); // no break on purpose...
       case SelectMgr_TOU_Partial:
         anObject->UpdateLocation(Sel);
         wasrecomputed = Standard_True;
       Sel->UpdateStatus(SelectMgr_TOU_None);
     }
 
-    // on regarde quels selecteurs sont concernes par la selection
-    // pour refaire les projections si besoin est.
+    // it is checked which selectors are concerned by the selection
+    // to redo projections if necessary.
     Handle(Standard_Transient) Tr;
     for(TColStd_MapIteratorOfMapOfTransient It(myselectors);It.More();It.Next()){
       Tr = It.Key();
       if(VS->Status(Sel)==SelectMgr_SOS_Activated)
         switch(Sel->UpdateStatus()){
   case SelectMgr_TOU_Full:
-    anObject->UpdateSelection(Sel->Mode()); // pas de break expres...
+    anObject->UpdateSelection(Sel->Mode()); // no break on purpose...
   case SelectMgr_TOU_Partial:
     anObject->UpdateLocation(Sel);
     wasrecomputed = Standard_True;
 
 //==================================================
 // Function: Update
-// Purpose : Attention, il faut savoir ce que l'on fait....
+// Purpose : Attention, it is required to know what is done...
 //==================================================
 void SelectMgr_SelectionManager::
 Update(const Handle(SelectMgr_SelectableObject)& anObject,
     if(ForceUpdate){
       switch(Sel->UpdateStatus()){
       case SelectMgr_TOU_Full:
-        anObject->UpdateSelection(Sel->Mode()); // pas de break expres...
+        anObject->UpdateSelection(Sel->Mode()); //  no break on purpose...
       case SelectMgr_TOU_Partial:
         anObject->UpdateLocation(Sel);
         wasrecomputed = Standard_True;
 
   if (toupdate) UpdateConversion();
   if (tosort)   UpdateSort();
   if (myactivenb!=0){
-    // on utilise les Bnd box dans un premier temps  
+    // the Bnd boxes are used for the first time  
     Bnd_Box2d aBox;
     Standard_Integer NbPnt = aPoly.Length();
     Standard_Integer i;
 
 //==================================================
 // Function: LoadResult
-// Purpose : on laisse tomber pour l'instant la taille 
-//          de la primitive dans les criteres de tri...
-//          On prend la priorite, la profondeur et 
-//         la distance mini au CDG ou Bords...
+// Purpose : for the moment the size of the primitive 
+//           is not taken into account in the search criteriai...
+//           The priority, the depth and the min. distance to CDG or Borders is taken...
 //==================================================
 void SelectMgr_ViewerSelector::
 LoadResult()
     }
   }
 
-  // pas de tri a faire dans le cas d'une selection par rectangle elastique (BUG ANALYST)
+  // do not parse in case of selection by elastic rectangle (BUG ANALYST)
   if(mystored.IsEmpty()) return; 
   if(myIndexes.IsNull()) 
     myIndexes = new TColStd_HArray1OfInteger(1,mystored.Extent()); 
   else if(mystored.Extent() !=myIndexes->Length()) 
     myIndexes = new TColStd_HArray1OfInteger (1,mystored.Extent()); 
 
-  // pour travailler plus vite... 
+  // to work faster... 
   TColStd_Array1OfInteger& thearr = myIndexes->ChangeArray1(); 
   for(Standard_Integer I=1;I<=mystored.Extent();I++) 
     thearr(I)=I; 
     else if(mystored.Extent() !=myIndexes->Length()) 
       myIndexes = new TColStd_HArray1OfInteger (1,mystored.Extent()); 
 
-    // pour travailler plus vite... 
+    // to work faster... 
     TColStd_Array1OfInteger& thearr = myIndexes->ChangeArray1(); 
     for(Standard_Integer I=1;I<=mystored.Extent();I++) 
       thearr(I)=I; 
 TCollection_AsciiString SelectMgr_ViewerSelector::
 Status(const Handle(SelectMgr_SelectableObject)& SO) const
 {
-  TCollection_AsciiString Status("Status Objet :\n\t");
+  TCollection_AsciiString Status("Status Object :\n\t");
   Standard_Boolean Found= Standard_False;
   for(SO->Init();SO->More();SO->Next()){
     if(myselections.IsBound(SO->CurrentSelection()))
         TCollection_AsciiString(SO->CurrentSelection()->Mode()) +
         " present - " ;
       if(myselections(SO->CurrentSelection())) 
-        Status = Status + " Actif \n\t";
+        Status = Status + " Active \n\t";
       else
-        Status = Status + " Inactif \n\t";
+        Status = Status + " Inactive \n\t";
     }
   }
 
-  if(!Found) Status = Status + "Non Present dans le selecteur\n\n";
+  if(!Found) Status = Status + "Not Present in the selector\n\n";
   return Status;
 }
 
 TCollection_AsciiString SelectMgr_ViewerSelector::
 Status () const 
 {
-  // les primitives sensibles presentes 
-  //------------------------------------
+  // sevsitive primitives present 
+  //-----------------------------
   TCollection_AsciiString Status("\t\tSelector Status :\n\t");
-  // les selections
-  //---------------
+  // selections
+  //-----------
   Standard_Integer NbActive =0,NbPrim=0;
   Status = Status + "Number of already computed selections : " + 
     TCollection_AsciiString(myselections.Extent());
 
 //=======================================================================
 //function : SortResult
-//purpose  :  on a un certain nombre d'entites rangees avec leur critere 
-//            (profondeur, taille, priorite , distance de la souris 
-//            par rapport aux bords ou au CDG de la primitive detectee.
-//            on va trier :
-//             les priorites maxi.
-//             puis un savant dosage entre profondeur et distance...
-// enfin on stocke dans myindexes les rangs en fonction de ce tri.
-// il ne reste plus qu'a lire 
+//purpose  :  there is a certain number of entities ranged by criteria 
+//            (depth, size, priority, mouse distance from borders or
+//            CDG of the detected primitive. Parsing :
+//             maximum priorities .
+//             then a reasonable compromise between depth and distance...
+// finally the ranges are stored in myindexes depending on the parsing.
+// so, it is possible to only read 
 //=======================================================================
 void SelectMgr_ViewerSelector::SortResult()
 {
   if(myIndexes.IsNull() || anExtent != myIndexes->Length())
     myIndexes = new TColStd_HArray1OfInteger (1, anExtent);
 
-  // pour travailler plus vite...
+  // to work faster...
   TColStd_Array1OfInteger& thearr = myIndexes->ChangeArray1();
 
-  // on charge les index de 1 a N
+  // indices from 1 to N are loaded
   Standard_Integer I ;
   for (I=1; I <= anExtent; I++)
     thearr(I)=I;
       myprim (I) = myPrimArr (ind);
   }
   // OCC4201 (AGV): fin
-  // ne nous restera plus qu'a recuperer les proprietaires correspondant aux index tries...
+  // it is enough to return owners corresponding to parced indices...
 
 }
 
 
   // find vertices not under ancestors.
   TopAbs_ShapeEnum E = aShape.ShapeType();
   if (E == TopAbs_COMPOUND) {
-    // il faut presenter les vertex isoles a defaut de les cacher.
+    // it is necessary to present isolated vertexes instead of hiding them.
     for (ex.Init(aShape, TopAbs_VERTEX, TopAbs_EDGE); ex.More(); ex.Next()) {
       StdPrs_WFShape::Add(aPresentation, ex.Current(), aDrawer);
     }
   }
   
   
-  // stockage dans le groupe:
+  // storage in the group:
   
   HLRBRep_ListIteratorOfListOfBPoint ItB;
 
 
 {
   if ( ! aDrawer->ShadingAspectGlobal() ) {
 
-// Si la surface est fermee, on ne tracera pas les faces tournant le dos:
+// If the surface is closed, the faces from back-side are not traced:
 
 
     Handle(Graphic3d_AspectFillArea3d) Asp = aDrawer->ShadingAspect()->Aspect();
 
   
   if ( ! aDrawer->ShadingAspectGlobal() ) {
 
-// Si la surface est fermee, on ne tracera pas les faces tournant le dos:
+// If the surface is closed, the faces from back-side are not traced:
 
     Handle(Graphic3d_AspectFillArea3d) Asp = aDrawer->ShadingAspect()->Aspect();
 
       DU = (U2-U1)/ N1;
       DV = (V2-V1)/ N2;
       
-      // Calcul de la premiere ligne;
+      // Calculation of the first line;
       
       for ( i = 1; i<= N2+1; i++) {
        aSurface.D1(U1 , V1 + DV * (i-1),P,D1U,D1V);
 
     }
       break;
     } 
-    Standard_Boolean First = Standard_True; // pour eviter de faire le begindraw s'il n'y a 
-                                            // rien (couteux ) rob 230996
+    Standard_Boolean First = Standard_True; // to avoid begindraw if there is nothing (expensive)
     
     for(it.Initialize(mynew);it.More();it.Next()){
       
 
 
 //==================================================
 // Function: Load 
-// Purpose :  Version debuggee....
+// Purpose : 
   //==================================================
 
 void StdSelect_BRepSelectionTool
         aPriority,
         NbPOnEdge);
 
-  //chargement des selectables...
+  //loading of selectables...
   for (aSelection->Init();aSelection->More();aSelection->Next()) {
     Handle(SelectBasics_EntityOwner) BOwn = aSelection->Sensitive()->OwnerId();
     Handle(SelectMgr_EntityOwner) Own = *((Handle(SelectMgr_EntityOwner)*) &BOwn);
 
 //=====================================================
 // Function : GetEdgeSensitive
-// Purpose  : cree un edge sensible pour pouvoir l'ajouter 
-//            dans computeselection a "aselection" (cas d'une selection d'un edge)
-//            ou a "aSensitiveWire" (cas d'une selection d'un wire; dans ce cas la,
-//            c'est le sensitive wire qui est ajoute a "aselection" )
-//            odl - pour la selection par rectangle -
+// Purpose  : create a sensitive edge to add it  
+//            in computeselection to "aselection" (case of selection of an edge)
+//            or to "aSensitiveWire" (case of selection of a wire; in this case,
+//            the sensitive wire is added to "aselection" )
+//            odl - for selection by rectangle -
 //=====================================================   
 void StdSelect_BRepSelectionTool
 ::GetEdgeSensitive (const TopoDS_Shape& shap,
     }
   default:
     {
-      // modif-rob : on prend le meme deroulement que dans StdPrs_Curve
-      // nb de points...
-      //============================================
-
+   
       //aLimit = myDrawer->MaximalParameterValue(); ??
       Standard_Real aLimit = 200.; // TODO (kgv) - do we need set MaxParam here?
       Standard_Real V1 = cu3d.FirstParameter();
                                                                  const Standard_Real MaxParam,
                                                                  const Standard_Boolean InteriorFlag)
 {
-  // voyons s y a une triangulation de la face...
+  // check if there is triangulation of the face...
    BRepAdaptor_Curve cu3d;
   Handle(Poly_Triangulation) T;
   TopLoc_Location loc;
     return Standard_True;
   }
 
-  // pour les faces a bugs de triangulation ou sans autotriangulation ....
-  // tres laid et  ne devrait meme plus exister ...
+  // for faces with triangulation bugs or without autotriangulation ....
+  // very ugly and should not even exist ...
    BRepAdaptor_Surface BS;
   BS.Initialize (F);
   
     BS.D0(FirstU,LastV,pcur);
     P->SetValue(4,pcur);
     P->SetValue(5,P->Value(1));
-    // si le plan est "infini", on ne le rend sensible que sur sa frontiere delimitee par MaxParam
+    // if the plane is "infinite", it is sensitive only on the border limited by MaxParam
     if(FirstU ==-MaxParam && LastU==MaxParam && FirstV ==-MaxParam && LastV==MaxParam)
       LL.Append(new Select3D_SensitiveFace
                (Owner, P, Select3D_TOS_BOUNDARY));
     return Standard_True;
   }
   
-  // IL S'AGIT DE CONSTRUIRE UN POLYGONE "SENSIBLE" A PARTIR DU CONTOUR EXTERIEUR DE LA FACE...
-  // CA N'EST PAS BEAU DU TOUT MAIS...
+  // This is construction of a sevsitive polygon from the exterior contour of the face...
+  // It is not good at all, but...
   TopoDS_Wire aWire;
 //  Standard_Integer NbEdges=1;
 
 
   TopExp_Explorer EW(F,TopAbs_WIRE);
   if(EW.More())
-    aWire = TopoDS::Wire(EW.Current()); // en esperant que c'est le premier... a voir
+    aWire = TopoDS::Wire(EW.Current()); // believing that this is the first... to be seen
 
 #ifdef OCC872
    if ( aWire.IsNull() )
          if(BS.GetType()==GeomAbs_Cylinder ||
             BS.GetType()==GeomAbs_Torus ||
             BS.GetType()==GeomAbs_Cone  ||
-            BS.GetType()==GeomAbs_BSplineSurface) // beuurkk pour l'instant...
+            BS.GetType()==GeomAbs_BSplineSurface) 
            {
              Standard_Real ff= wf ,ll= wl ;
              Standard_Real dw
   Standard_Integer ArrayPosition = WirePoints.Length();
   
   Handle(TColgp_HArray1OfPnt)  facepoints = new TColgp_HArray1OfPnt(1,ArrayPosition);
-  // beurk beurk beurk...
   for(Standard_Integer I=1 ;I<=ArrayPosition;I++)
     {facepoints->SetValue (I, WirePoints.Value(I));}
   
-  if ((facepoints->Array1()).Length() > 1) { // 1 si un seul edge circulaire plein.
+  if ((facepoints->Array1()).Length() > 1) { // 1 if only one circular edge
     Select3D_TypeOfSensitivity TS = InteriorFlag ? Select3D_TOS_INTERIOR : Select3D_TOS_BOUNDARY;
     LL.Append(new Select3D_SensitiveFace
               (Owner, facepoints, TS));
 
 //             <rob@fidox>
 
 
-// Modifie par jmi le 21/9/96
-// Utilisation des termes StdSelect_Sphere  pour StdSelect_Cone 
-//                        StdSelect_Torus   pour StdSelect_PlaneOrCone
-//                        StdSelect_Revol   pour StdSelect_CylinderOrCone
-// en attendant la possibilite de modifier du CDL.
-// mettre a jour alors Placement-menu.ccl de DsgFront
-//                  et Part-placement.ccl de AssemblyScripts
-
 #define BUC60576       //GG_5/10/99 Adds Cone to enum TypeOfFace
 
 
             ); 
     }
 #ifdef BUC60576
-  case StdSelect_Cone: // en attendant la liberation du cdl, on l'utilise pour Cone
+  case StdSelect_Cone: // waiting for the free cdl, it is used for Cone
     {
       BRepAdaptor_Surface surf(TopoDS::Face(anobj));
       return (surf.GetType() == GeomAbs_Cone);      
 
-//syl le 28/9/98: reactivation de 3 polices buggees + reagencement des polices
 #include <V2d_DefaultMap.ixx>
 #include <TColStd_Array1OfInteger.hxx>
 #include <Aspect_ColorMapEntry.hxx>
 
       if ( Norme >= 0.0001 ) {
         VX= DX/Norme; VY = DY/Norme; VZ = DZ/Norme;
 
-//Construction d'un repere i,j pour le cercle:
+//Construction of marker i,j for the circle:
         Xn=0., Yn=0., Zn=0.;   
         if ( Abs(VX) <= Abs(VY) && Abs(VX) <= Abs(VZ)) Xn=1.;
         else if ( Abs(VY) <= Abs(VZ) && Abs(VY) <= Abs(VX)) Yn=1.;
         cin >> u; cin >> v;
         V3d::SetPlane (aViewer, x1, y1, z1, x2, y2, z2);
 
-        // Pour relancer le calcul selon le nouveau plan
+        // To restart the calculation on the new plane
         if (aViewer->Grid ()->IsActive ()) {
                 Standard_Real xo, yo;
                 Quantity_PlaneAngle angle;
 
   Standard_Real X,Y,Z;
   Graphic3d_Vertex P,T;
 
-// Le point oeil definit la position de la camera
+// The eye point defines the position of the camera
   aView->Eye(X,Y,Z);
   P.SetCoord(X,Y,Z);
   MyPosition = P;
-  // Le point vise definit la cible de la camera
+  // The target point defines the target of the camera
   aView->At(X,Y,Z);
   T.SetCoord(X,Y,Z);
   MyTarget = T;
-// Angle d'inclinaison de la camera
+// Incline Angle of the camera
   MyAngle = aView->Twist();
-// Angle d'ouverture de la camera
+// Aperture Angle of the camera
   MyAperture = (aView->DynamicType()==STANDARD_TYPE(V3d_PerspectiveView)) ?
     ((Handle(V3d_PerspectiveView)&)aView)->Angle() : 0.;
    
 
   Standard_Real X0,Y0,Z0,Xn,Yn,Zn;
 
-// Le point cible reste inchange, seul la position de la camera est modifiee
-// en conservant la direction.
+// Targer point remains unchanged, only the position of the camera is modified
+// preserving the direction.
   Graphic3d_Vector D(MyTarget,MyPosition);
   D.Normalize();
   D.Coord(Xn,Yn,Zn);
   Rayon = this->Radius();
   MyPosition.Coord(XP,YP,ZP);
   SymetricPointOnSphere(aView,MyTarget,MyPosition,Rayon,X,Y,Z,VX,VY,VZ);
-  //      Actuellement est on sur le point vu
+  //      This point is visible
   if ( (VX*(X-XP) < 0.) && (VY*(Y-YP) < 0.) && (VZ*(Z-ZP) < 0.) ) {
     this->SetPosition(X,Y,Z);
   }
   Rayon = this->Radius();
   MyPosition.Coord(XP,YP,ZP);
   SymetricPointOnSphere(aView,MyTarget,MyPosition,Rayon,X,Y,Z,VX,VY,VZ);
-  //      Actuellement est on sur le point cache
+  //      This point is hidden
   if ( (VX*(X-XP) > 0.) && (VY*(Y-YP) > 0.) && (VZ*(Z-ZP) > 0.) ) {
     this->SetPosition(X,Y,Z);
   }
   Rayon = this->Radius();
   MyPosition.Coord(XP,YP,ZP);
   SymetricPointOnSphere(aView,MyTarget,MyPosition,Rayon,X,Y,Z,VX,VY,VZ);
-  //      Avons nous le point cache ou le point vu
+  //      Is it a visible or a hidden point?
   if ( (VX*(X-XP) > 0.) || (VY*(Y-YP) > 0.) || (VZ*(Z-ZP) > 0.) )
-//      la source est sur la face cachee
+//      the source is on the hidden face
     Val = Standard_False; 
   else
-    //      la source est sur la face vue.
+    //  the source is on the visible face.
     Val = Standard_True;
 
   return Val;
   Graphic3d_Array1OfVertex VN2(1,NbPoints+1);
   Graphic3d_Array1OfVertex V2(1,2);
 
-//      Direction de la camera
+//      Direction of the camera
   MyPosition.Coord(XP,YP,ZP);
   MyTarget.Coord(X0,Y0,Z0);
   Dx = X0 - XP; Dy = Y0 - YP; Dz = Z0 - ZP;
   Lng = this->Radius()/10.;
   
-//      Recherche des centres des carres de base du boitier de la camera :
+//      Find centers of base squares of the case of the camera :
   Xc1 = XP - Dx * Lng; Yc1 = YP - Dy * Lng; Zc1 = ZP - Dz * Lng;
   Xc2 = XP + Dx * Lng; Yc2 = YP + Dy * Lng; Zc2 = ZP + Dz * Lng;
   
-//      Construction d'un repere i,j pour les rectangles :
+//      Construction of a mark i,j for rectangles :
   Xn=0., Yn=0., Zn=0.;
 
   if ( Abs(Dx) <= Abs(Dy) && Abs(Dx) <= Abs(Dz)) Xn=1.;
   Yj = Dz * Xi - Dx * Zi;
   Zj = Dx * Yi - Dy * Xi;
 
-//      Dessin du boitier
+//      Scheme of the case
   for (i = 1 ; i <= NbPoints ; i++) {
 
     cosinus = Cos ( Alpha + (i - 1) *  Standard_PI/2. );   
     sinus   = Sin ( Alpha + (i - 1) *  Standard_PI/2. );   
     
-    //          Premier carre de base
+    //          First base square
     X = Xc1 + (cosinus * Xi + sinus * Xj) * Lng / 2.;
     Y = Yc1 + (cosinus * Yi + sinus * Yj) * Lng / 2.;
     Z = Zc1 + (cosinus * Zi + sinus * Zj) * Lng / 2.;
     if(i==1) VN1(NbPoints+1).SetCoord(X,Y,Z);
     V2(1).SetCoord(X,Y,Z);
     
-//          Second carre de base
+//          Second base square
     X = Xc2 + (cosinus * Xi + sinus * Xj) * Lng / 2.;
     Y = Yc2 + (cosinus * Yi + sinus * Yj) * Lng / 2.;
     Z = Zc2 + (cosinus * Zi + sinus * Zj) * Lng / 2.;
   gsymbol->Polyline(VN1);
   gsymbol->Polyline(VN2);
 
-//      Dessin de l'objectif
+//      Scheme of the objective
   for (i = 1 ; i <= NbPoints ; i++) {
     
     cosinus = Cos ( Alpha + (i - 1) *  Standard_PI/2. );   
     if(i==1) VN1(NbPoints+1).SetCoord(X,Y,Z);
     V2(1).SetCoord(X,Y,Z);
 
-//          Second carre de base
+//          Second base square
     X = Xc2 + Dx * Lng / 6. + (cosinus * Xi + sinus * Xj) * Lng / 3.;
     Y = Yc2 + Dy * Lng / 6. + (cosinus * Yi + sinus * Yj) * Lng / 3.;
     Z = Zc2 + Dz * Lng / 6. + (cosinus * Zi + sinus * Zj) * Lng / 3.;
   V3d_TypeOfUpdate UpdSov;
 
 
-//  Creation d'une structure d'elements reperables (la position de
-//  la camera, et la sphere de deplacement de cette camera)
+//  Creation of a structure of markable elements (position of the
+//  camera, and the sphere of displacement of this camera)
 
   Pres = TPres;
   Handle(V3d_Viewer) TheViewer = aView->Viewer();
   Handle(Graphic3d_Group) gsphere;
   if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) gsphere = new Graphic3d_Group(MyGraphicStructure);    
   
-//  Creation d'une structure d'elements non reperables ( meridien et 
-//  parallele ).
+//  Creation of a structure of non-markable elements (meridian and 
+//  parallel ).
   Handle(Graphic3d_Group) gnopick = new Graphic3d_Group(MyGraphicStructure1);
   MyGraphicStructure1->SetPick(Standard_False);
 
   MyTarget.Coord(X0,Y0,Z0);
 
-//Affichage de la position de la camera.
+// Display of the position of the camera.
 
   gcamera->SetPickId(1);
   if (Pres == V3d_SIMPLE) {
-//    on dessine un viseur
+//    a viewfinder is drawn
     Graphic3d_Array1OfVertex PViseur(1,2);
     aView->Project(X0,Y0,Z0,PXT,PYT);
     aView->Convert(PXT,PYT,IXP,IYP);
     PViseur(2).SetCoord(X+X0-XT,Y+Y0-YT,Z+Z0-ZT);
     gcamera->Polyline(PViseur);
   }
-//  on dessine une camera
+//  a camera is drawn
   else this->Symbol(gcamera,aView);
 
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the marking sphere (limited to circle).
     
   if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
 
     gsphere->SetPickId(2);
     V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
     
-//Affichage du rayon de la sphere (ligne + texte)
+// Display of the radius of the sphere (line + text)
 
     if (Pres == V3d_COMPLETE) {
       gradius->SetPickId(3);
       gradius->Text(ValOfRadius.ToCString(),PText,0.01);
     }
  
-//Affichage du meridien
+// Display of the meridian
 
     Quantity_Color Col2(Quantity_NOC_GREEN);
     Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
       (Col2,Aspect_TOL_SOLID,1.);
     gnopick->SetPrimitivesAspect(Asp2);
     
-    //    Definition de l'axe du cercle
+    // Definition of the axis of circle
     aView->Up(DXRef,DYRef,DZRef);
     this->Position(X,Y,Z);
     DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
     
     V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
 
-//Affichage de la parallele
+// Display of the parallel
 
-//    Definition de l'axe du cercle
+// Definition of the axis of circle
     aView->Proj(VX,VY,VZ);
     aView->Up(X1,Y1,Z1);
     DXRef = VY * Z1 - VZ * Y1;
   MyTarget.Coord(X0,Y0,Z0);
   aView->Project(X0,Y0,Z0,PXT,PYT);
   aView->Convert(PXT,PYT,IPX,IPY);
-  //      Coord 3d dans le plan de projection de la cible.
+  //      Coord 3d in the plane of projection of the target.
   aView->Convert(IPX,IPY,XT,YT,ZT);
   switch (WhatPick) {
   case V3d_POSITIONCAMERA : 
-    // Les Coordonnees doivent rester a l'interieur de la sphere
+    // Coordinates should remain inside of the sphere
     Rayon = this->Radius();
     XMinTrack = PXT - Rayon;
     XMaxTrack = PXT + Rayon;
        DeltaY = Y0 - YP;
        DeltaZ = Z0 - ZP;
        
-//             On recherche le point d'intersection des droites definies
-//             par :
-//              - Droite passant par le point de projection et l'oeil
-//                si on est en perspective, parralele a la normale de la 
-//                vue si on a une vue axonometrique.
-//                position dans la vue est // a la normale de la vue
-//              - La distance position de la camera cible est egale au 
-//                rayon.
+//             The point of intersection of straight lines defined by :
+//              - Straight line passing by the point of projection and the eye
+//                if this is a perspective, parallel to the normal of the 
+//                view if there is an axonometric view.
+//                position in the view is parallel to the normal of the view
+//              - The distance position of the target camera cible is equal 
+//                to the radius.
 
        A = VX*VX + VY*VY + VZ*VZ ;
        B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
     }
   case V3d_SPACECAMERA : 
     aView->Convert(PXT,PYT,IPX,IPY);
-//               Dans ce cas Xpix,Ypix correspondent a une distance , relative
-//               a la translation que l'on veut effectuer sur la sphere. 
+//               In case Xpix,Ypix corresponding to a distance , relative
+//               to the translation that is planned to be done on the sphere. 
     aView->Convert(IPX+Xpix,IPY+Ypix,X,Y,Z);
     X = X+X0-XT;
     Y = Y+Y0-YT; 
     break;
   
   case V3d_ExtRADIUSCAMERA :
-//             on cherche a conserver la direction cible positionnement de la 
-//             camera ==> on projette le point sur la direction cible camera.
+//             It is attempted to preserve the target positioning direction of the  
+//             camera ==> the point is projected on the target camera direction.
     this->Position(Xi,Yi,Zi);
     aView->Project(Xi,Yi,Zi,PXP,PYP);
     DX = PXP - PXT;
     }
     break;
   case V3d_IntRADIUSCAMERA :
-//               on cherche a conserver la direction cible positionnement 
-//               de la camera ==> on projette le point sur la direction 
-//               cible camera.
+//               It is attempted to preserve the target positioning direction of the  
+//             camera ==> the point is projected on the target camera direction.
     this->Position(Xi,Yi,Zi);
     aView->Project(Xi,Yi,Zi,PXP,PYP);
     DX = PXP - PXT;
       Rap = NewRprj/OldRprj;
       Rayon = this->Radius();
       Rayon = Rayon * Rap;
-//                 la camera doit rester a une position fixe, seule la cible
-//                 est modifie.
+//                 the camera should remain at a fixed position, only the target is modified.
       Graphic3d_Vector Dir(MyPosition,MyTarget);
       Dir.Normalize();
       Dir.Coord(X,Y,Z);
   aView->At(Xv,Yv,Zv);
   aView->Project(Xv,Yv,Zv,PXT,PYT);
   aView->Convert(PXT,PYT,IPX,IPY);
-//      Recherche de tangage ==> Xpix = IPX et Ypix inverse
-//      C'est le point vise qui tourne autour de l'axe passant par l'oeil et 
-//      de direction un vecteur appartenant au plan de la vue et 
-//      perpendiculaire au vecteur haut de la vue.
+//      Find the pitching ==> Xpix = IPX and Ypix inverted
+//      The target point turns around an axis passing through the eye and the  
+//      direction of vector belonging to the view plane  
+//      and perpendicular to the vector above the view.
   if ( Ypix != IPY ) {
     aView->Size(Width,Height);
     IHeight = aView->Convert(Height);
     Xf = Xp * MatRot(0,0) + Yp * MatRot(0,1) + Zp * MatRot(0,2);
     Yf = Xp * MatRot(1,0) + Yp * MatRot(1,1) + Zp * MatRot(1,2);
     Zf = Xp * MatRot(2,0) + Yp * MatRot(2,1) + Zp * MatRot(2,2);
-//        Rotation du point vise (cible de la camera)
+//        Rotation of the target point (target of the camera)
     X1 = Xc * MatRot(0,0) + Yc * MatRot(0,1) + Zc * MatRot(0,2);
     Y1 = Xc * MatRot(1,0) + Yc * MatRot(1,1) + Zc * MatRot(1,2);
     Z1 = Xc * MatRot(2,0) + Yc * MatRot(2,1) + Zc * MatRot(2,2);
     Xc = X1 + Xp - Xf ; Yc = Y1 + Yp - Yf ; Zc = Z1 + Zp - Zf;
     MyTarget.SetCoord(Xc,Yc,Zc);
   }
-//      Recherche de roulis determine par Xpix 
+//      Find the rolling determined by Xpix 
   if ( Xpix != IPX ) {
     IWidth = aView->Convert(Width);
     Beta  = ((IPX - Xpix)*Standard_PI)/(IWidth*2.);
 void V3d_Camera::EarthPilot( const Handle(V3d_View)& aView,
                             const Standard_Integer Xpix,
                             const Standard_Integer Ypix) {
-// Le pilotage en mode terrestre, ressemble a la conduite d'une voiture
-// Dans ce cas, seul le point cible est modifie.
+// Piloting in land mode, resembles to the car driving 
+// In this case, only the target point is modified.
 
   Standard_Real    Xp,Yp,Zp,Xc,Yc,Zc,Xv,Yv,Zv,Xf,Yf,Zf;
   Standard_Real    VX,VY,VZ,DXH,DYH,DZH,A,B,C,PXT,PYT,X1,Y1,Z1,Dist;
   aView->At(Xv,Yv,Zv);
   aView->Project(Xv,Yv,Zv,PXT,PYT);
   aView->Convert(PXT,PYT,IPX,IPY);
-  //      Recherche d' inclinaison==> Xpix = IPX et Ypix inverse
-//      C'est le point vise qui tourne autour de l'axe passant par l'oeil et 
-//      de direction un vecteur appartenant au plan de la vue et 
-//      perpendiculaire au vecteur haut de la vue.
+//      Find the pitching ==> Xpix = IPX and Ypix inverted
+//      The target point turns around an axis passing through the eye and the  
+//      direction of vector belonging to the view plane  
+//      and perpendicular to the vector above the view.
   if ( Ypix != IPY ) {
     aView->Size(Width,Height);
     IHeight = aView->Convert(Height);
     Xf = Xp * MatRot(0,0) + Yp * MatRot(0,1) + Zp * MatRot(0,2);
     Yf = Xp * MatRot(1,0) + Yp * MatRot(1,1) + Zp * MatRot(1,2);
     Zf = Xp * MatRot(2,0) + Yp * MatRot(2,1) + Zp * MatRot(2,2);
-//        Rotation du point vise (cible de la camera)
+//        Rotation of the target point (target of the camera)
     X1 = Xc * MatRot(0,0) + Yc * MatRot(0,1) + Zc * MatRot(0,2);
     Y1 = Xc * MatRot(1,0) + Yc * MatRot(1,1) + Zc * MatRot(1,2);
     Z1 = Xc * MatRot(2,0) + Yc * MatRot(2,1) + Zc * MatRot(2,2);
          Xc = X1 + Xp - Xf ; Yc = Y1 + Yp - Yf ; Zc = Z1 + Zp - Zf;
   }
-//      Recherche de virage ==> Ypix = IPY . Le point vise tourne aoutour 
-//      d'un axe // au vecteur haut passant par l'oeil
+//      Find turning ==> Ypix = IPY . The target point rotates around  
+//      an axis // a vector above passing through the eye
   if ( Xpix != IPX ) {
     IWidth = aView->Convert(Width);
     Beta  = ((IPX - Xpix)*Standard_PI)/(IWidth*2.);
     Xf = Xp * MatRot(0,0) + Yp * MatRot(0,1) + Zp * MatRot(0,2);
     Yf = Xp * MatRot(1,0) + Yp * MatRot(1,1) + Zp * MatRot(1,2);
     Zf = Xp * MatRot(2,0) + Yp * MatRot(2,1) + Zp * MatRot(2,2);
-    //        Rotation du point vise (cible de la camera)
+    //        Rotation of the target point (target of the camera)
     X1 = Xc * MatRot(0,0) + Yc * MatRot(0,1) + Zc * MatRot(0,2);
     Y1 = Xc * MatRot(1,0) + Yc * MatRot(1,1) + Zc * MatRot(1,2);
     Z1 = Xc * MatRot(2,0) + Yc * MatRot(2,1) + Zc * MatRot(2,2);
 }
 
 void V3d_Camera::Move (const Standard_Real Dist) {
-// Deplacement de la camera en conservant la direction camera - cible.
+// Displacement of the camera by preserving the direction camera - target.
 
   Standard_Real XP,YP,ZP,X0,Y0,Z0,DX,DY,DZ,Norme;
 
 
 void V3d_Camera::GoUp (const Standard_Real Haut) {
 
-// Deplacement de la camera suivant l'axe z, en conservant la direction camera
-// cible de la camera
+// Displacement of the camera by axis z, preserving the direction camera -
+// target of the camera
 
   MyPosition.SetZCoord(MyPosition.Z()+Haut);
   MyTarget.SetZCoord(MyTarget.Z()+Haut);
   DeltaY = Y0 - YP;
   DeltaZ = Z0 - ZP;
 
-//      On recherche le point d'intersection des droites definies
-//      par :
-//      - Droite passant par le point de projection et l'oeil
-//        si on est en perspective, parralele a la normale de la 
-//        vue si on a une vue axonometrique.
-//        position dans la vue est // a la normale de la vue
-//      - La distance position de la camera cible est egale au 
-//        rayon.
+//             The point of intersection of straight lines defined by :
+//              - Straight line passing by the point of projection and the eye
+//                if this is a perspective, parallel to the normal of the 
+//                view if there is an axonometric view.
+//                position in the view is parallel to the normal of the view
+//              - The distance position of the target camera cible is equal 
+//                to the radius.
 
   A = VX*VX + VY*VY + VZ*VZ ;
   B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
 
      ----------
         Classe V3d_CircularGrid :
  
-     HISTORIQUE DES MODIFICATIONS   :
+     VERSION HISTORY  :
      --------------------------------
-      16-08-98 : CAL ; S3892. Ajout grilles 3d.
-      13-10-98 : CAL ; S3892. Ajout de la gestion de la taille des grilles 3d.
-      23-10-98 : CAL ; PRO 15885. Patch K4403 et K4404
-      03-11-98 : CAL ; PRO 16161. Patch K4418 et K4419
       IMP230300: GG The color fields and methods have moved in Aspect_Grid
 
 
                Trsf (1, 4) = xl,
                Trsf (2, 4) = yl,
                Trsf (3, 4) = zl;
-               // Transformation de changement de repere
+               // Transformation  change of marker
                Trsf (1, 1) = xdx,
                Trsf (2, 1) = xdy,
                Trsf (3, 1) = xdz,
                Trsf (3, 3) = dz;
                myStructure->SetTransform (Trsf, Graphic3d_TOC_REPLACE);
 
-               // Translation de l'origine
+               // Translation of the origin
                Trsf (1, 4) = -XOrigin (),
                Trsf (2, 4) = -YOrigin (),
                Trsf (3, 4) = 0.0;
-               // Rotation Alpha autour de l'axe -Z
+               // Rotation Alpha around axis -Z
                Trsf (1, 1) = CosAlpha,
                Trsf (2, 1) = -SinAlpha,
                Trsf (3, 1) = 0.0,
                Trsf (3, 3) = 1.0;
                myStructure->SetTransform (Trsf,Graphic3d_TOC_POSTCONCATENATE);
 
-               // CAL : 19 aout 1998
-               // Il y avait aussi la possibilite de faire le calcul
-               // de changement de repere par :
-               // gp_Trsf::SetTransformation
-               //      (myGridPlane, myViewer->PrivilegedPlane ());
 
 #ifdef TRACE_VALUES
 Standard_Integer i, j;
 #ifdef TRACE_MAKE
                cout << "MakeCercles" << endl;
 #endif
-               // cercles
+               // circles
 #ifdef IMP300300
                Standard_Integer nblines = 0;
 #endif
 #ifdef TRACE_MAKE
                cout << "MakeDiametres" << endl;
 #endif
-               // diametres
+               // diameters
                myGroup1->Clear ();
                myGroup1->SetGroupPrimitivesAspect (MarkerAttrib);
                myGroup1->BeginPrimitives ();
 
   
   MyType = V3d_DIRECTIONAL ;
   MyLight = new Visual3d_Light(C,V, Headlight) ;
-  // On choisit aleatoirement comme cible l'origine
+  // The initial target is chosen at random
   MyTarget = T;
-// On deduit une position
+// Position is found
   P.SetCoord(-V.X(),-V.Y(),-V.Z());
   MyDisplayPosition = P; 
 
   Rayon = this->Radius();
   aView->Project(Xi,Yi,Zi,PXT,PYT); 
   aView->Convert(PXT,PYT,IXP,IYP);
-//  Coord 3d dans le plan de projection de la source.
+//  Coordinated 3d in the plane of projection of the source.
   aView->Convert(IXP,IYP,XT,YT,ZT);
   aView->Convert(PXT,PYT+Rayon,IXP,IYP);
   aView->Convert(IXP,IYP,X,Y,Z);
   X = X+Xi-XT; Y = Y+Yi-YT; Z = Z+Zi-ZT;
   Dist = Sqrt( Square(X-Xi) + Square(Y-Yi) + Square(Z-Zi) );
-//  Axe de rotation.
+//  Axis of rotation.
   A = (X-Xi)/Dist;
   B = (Y-Yi)/Dist;
   C = (Z-Zi)/Dist;
 
-//  On dessine une sphere
+//  A sphere is drawn
   V3d::CircleInPlane(gsymbol,Xi,Yi,Zi,VX,VY,VZ,Rayon/40.);
   for( j=1 ; j<=3 ; j++ ) {
     Beta = j * Standard_PI/4.;
     Xf = Xi * MatRot(0,0) + Yi * MatRot(0,1) + Zi * MatRot(0,2);
     Yf = Xi * MatRot(1,0) + Yi * MatRot(1,1) + Zi * MatRot(1,2);
     Zf = Xi * MatRot(2,0) + Yi * MatRot(2,1) + Zi * MatRot(2,2);
-//    Rotation de la normale
+//    Rotation of the normal
     X1 = VX * MatRot(0,0) + VY * MatRot(0,1) + VZ * MatRot(0,2);
     Y1 = VX * MatRot(1,0) + VY * MatRot(1,1) + VZ * MatRot(1,2);
     Z1 = VX * MatRot(2,0) + VY * MatRot(2,1) + VZ * MatRot(2,2);
     V3d::CircleInPlane(gsymbol,Xi,Yi,Zi,VX,VY,VZ,Rayon/40.);
   }
 
-//  On dessine la fleche
+//  The arrow is drawn
   Rayon = this->Radius();
   this->Direction(DX,DY,DZ);
   X = Xi + DX*Rayon/10.; Y = Yi + DY*Rayon/10.; Z = Zi + DZ*Rayon/10.;
   V3d_TypeOfRepresentation Pres;
   V3d_TypeOfUpdate UpdSov;
 
-//  Creation d'une structure slight d'elements reperables (la position de
-//  la light, et le domaine d'eclairage represente par un cercle)
-//  Creation d'une structure snopick d'elements non reperables ( cible, meridien et 
-//  parallele ).
+//  Creation of a structure of markable elements (position of the
+//  light, and the domain of lighting represented by a circle)
+//  Creation of a structure of non-markable elements (target, meridian and 
+//  parallel).
 
     Pres = TPres;
     Handle(V3d_Viewer) TheViewer = aView->Viewer();
   Y0 = MyTarget.Y();
   Z0 = MyTarget.Z();
 
-//Affichage de la position de la light.
+//Display of the position of the light.
 
   glight->SetPickId(1);
   this->Color(Quantity_TOC_RGB,R1,G1,B1);
   glight->SetPrimitivesAspect(Asp1);
   this->Symbol(glight,aView);
   
-  //Affichage de la sphere de reperage (limite au cercle).
+  // Display of the markable sphere (limit at the circle).
 
   if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
     
     gsphere->SetPickId(2);
     V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
     
-//Affichage du meridien
+//Display of the meridian
 
     Quantity_Color Col2(Quantity_NOC_GREEN);
     Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
       (Col2,Aspect_TOL_SOLID,1.);
     gnopick->SetPrimitivesAspect(Asp2);
     
-//    Definition de l'axe du cercle
+//    Definition of the axis of circle
     aView->Up(DXRef,DYRef,DZRef);
     this->DisplayPosition(X,Y,Z);
     DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
     
     V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
       
-//  Affichage de la parallele
+//  Display of the parallel
 
-//    Definition de l'axe du cercle
+//    Definition of the axis of circle
     aView->Proj(VX,VY,VZ);
     aView->Up(X1,Y1,Z1);
     DXRef = VY * Z1 - VZ * Y1;
 
      HISTORIQUE DES MODIFICATIONS   :
      --------------------------------
       00-09-92 : GG  ; Creation.
-      18-06-96 : FMN ; Ajout MyGraphicStructure1 pour sauvegarder snopick
       30-03-98 : ZOV ; PRO6774 (reconstruction of the class hierarchy and suppressing useless methods)
       IMP230300: GG Add SetColor() and Color() methods
       IMP231100: GG Add IsDisplayed() method
   DeltaY = Y0 - YP;
   DeltaZ = Z0 - ZP;
 
-//      On recherche le point d'intersection des droites definies
-//      par :
-//      - Droite passant par le point de projection et l'oeil
-//        si on est en perspective, parralele a la normale de la 
-//        vue si on a une vue axonometrique.
-//        position dans la vue est // a la normale de la vue
-//      - La distance position de la camera cible est egale au 
-//        rayon.
+//      The point of intersection of straight lines defined by :
+//      - Straight line passing by the point of projection and the eye
+//        if this is a perspective, parralel to the normal of the view 
+//        if this is an axonometric view.
+//        position in the view is parallel to the normal of the view
+//      - The distance position of the target camera is equal to the radius.
 
   A = VX*VX + VY*VY + VZ*VZ ;
   B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
 
 
   Standard_Real Xc,Yc,Zc, Xp,Yp,Zp;
   
-  // Recalcul de la position
+  // Recalculation of the position
   MyTarget.Coord(Xc,Yc,Zc);
   Position (Xp,Yp,Zp) ;
 
 
   Standard_Real X0,Y0,Z0, Xn,Yn,Zn, Xp,Yp,Zp;
   
-  // Le point cible reste inchange, seul la position de la lumiere est modifiee
-  // en conservant la direction.
+  // The target point remains unchanged, only the position of the light is modified
+  // by preserving the direction.
        Position (Xp,Yp,Zp);
   Graphic3d_Vector  D(MyTarget, Graphic3d_Vertex(Xp, Yp, Zp));
   D.Normalize();
        V3d_Light::SymetricPointOnSphere (aView, 
                MyTarget, Graphic3d_Vertex(Xp,Yp,Yp), Radius(), X,Y,Z, VX,VY,VZ);
 
-  // Actuellement est on sur le point vu
+  // This is a visible point
   if ((VX*(X-Xp) < 0.) && (VY*(Y-Yp) < 0.) && (VZ*(Z-Zp) < 0.))
     SetPosition (X,Y,Z);
 }
        V3d_Light::SymetricPointOnSphere (aView, 
                MyTarget, Graphic3d_Vertex(Xp,Yp,Yp), Radius(), X,Y,Z, VX,VY,VZ);
 
-  // Actuellement est on sur le point cache
+  // This is a hidden point
   if ((VX*(X-Xp) > 0.) && (VY*(Y-Yp) > 0.) && (VZ*(Z-Zp) > 0.))
     SetPosition (X,Y,Z);
 }
        V3d_Light::SymetricPointOnSphere (aView, 
                MyTarget, Graphic3d_Vertex(Xp,Yp,Yp), Radius(), X,Y,Z, VX,VY,VZ);
 
-  // Avons nous le point cache ou le point vu
+  // Is it a visible or a hidden point
   return ( (VX*(X-Xp) > 0.) || (VY*(Y-Yp) > 0.) || (VZ*(Z-Zp) > 0.) )?
-    // la source est sur la face cachee
+    // the source is on the hidden face 
     Standard_False:
-    // la source est sur la face vue.
+    // the source is on the visible face.
     Standard_True;
 }
 
   V3d_TypeOfRepresentation Pres;
   V3d_TypeOfUpdate UpdSov;
 
-//  Creation d'une structure slight d'elements reperables (la position de
-//  la light, et le domaine d'eclairage represente par un cercle)
-//  Creation d'une structure snopick d'elements non reperables ( cible, meridien et 
-//  parallele ).
+//  Creation of a structure of markable elements (position of the
+//  light, and the domain of lighting represented by a circle)
+//  Creation of a structure snopick of non-markable elements (target, meridian and 
+//  parallel).
+
 
     Pres = TPres;
     Handle(V3d_Viewer) TheViewer = aView->Viewer();
   Y0 = MyTarget.Y();
   Z0 = MyTarget.Z();
   
-//Affichage de la position de la light.
+// Display of the light position.
 
   glight->SetPickId(1);
   this->Color(Quantity_TOC_RGB,R1,G1,B1);
   glight->SetPrimitivesAspect(Asp1);
   this->Symbol(glight,aView);
 
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the marking sphere (limit at the circle).
 
   if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
       
 
                if (MyType != V3d_DIRECTIONAL) {
 
-      //Affichage du rayon de la sphere (ligne + texte)
+      //Display of the radius of the sphere (line + text)
 
                        if (Pres == V3d_COMPLETE) {
                                gradius->SetPickId(3);
                }
 
 
-    //Affichage du meridien
+    // Display of the meridian
 
     Quantity_Color Col2(Quantity_NOC_GREEN);
     Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
       (Col2,Aspect_TOL_SOLID,1.);
     gnopick->SetPrimitivesAspect(Asp2);
     
-    // Definition de l'axe du cercle
+    // Definition of the axis of circle
     aView->Up(DXRef,DYRef,DZRef);
     this->Position(X,Y,Z);
     DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
     
     V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
       
-    // Affichage de la parallele
+    // Display of the parallel
 
-    // Definition de l'axe du cercle
+    // Definition of the axis of circle
     aView->Proj(VX,VY,VZ);
     aView->Up(X1,Y1,Z1);
     DXRef = VY * Z1 - VZ * Y1;
   Z0 = MyTarget.Z();
   aView->Project(X0,Y0,Z0,PXT,PYT);
   aView->Convert(PXT,PYT,IPX,IPY);
-//      Coord 3d dans le plan de projection de la cible.
+//      Coord 3d in the plane of projection of the target.
   aView->Convert(IPX,IPY,XT,YT,ZT);
   switch (WhatPick) {
   case V3d_POSITIONLIGHT :
-         // Les Coordonnees doivent rester a l'interieur de la sphere
+         // The Coordinates should remain inside of the sphere
     Rayon = Radius();
     XMinTrack = PXT - Rayon;
     XMaxTrack = PXT + Rayon;
        DeltaY = Y0 - YP;
        DeltaZ = Z0 - ZP;
        
-//                   On recherche le point d'intersection des droites definies
-//                   par :
-//                   - Droite passant par le point de projection et l'oeil
-//                     si on est en perspective, parralele a la normale de la 
-//                     vue si on a une vue axonometrique.
-//                     position dans la vue est // a la normale de la vue
-//                   - La distance position de la camera cible est egale au 
-//                     rayon.
+//      The point of intersection of straight lines defined by :
+//      - Straight line passing by the point of projection and the eye
+//        if this is a perspective, parralel to the normal of the view 
+//        if this is an axonometric view.
+//        position in the view is parallel to the normal of the view
+//      - The distance position of the target camera is equal to the radius.
 
        A = VX*VX + VY*VY + VZ*VZ ;
        B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
 
   case V3d_SPACELIGHT :
     aView->Convert(PXT,PYT,IPX,IPY);
-//               Dans ce cas Xpix,Ypix correspondent a une distance , relative
-//               a la translation que l'on veut effectuer sur la sphere. 
+//               In this case Xpix,Ypix correspond to a distance, relative
+//               to the translation that is planned to be performed on the sphere. 
     aView->Convert(IPX+Xpix,IPY+Ypix,X,Y,Z);
     X = X+X0-XT;
     Y = Y+Y0-YT; 
   case V3d_ExtRADIUSLIGHT :
                if (MyType == V3d_DIRECTIONAL)
                        break;
-//             on cherche a conserver la direction cible positionnement de la 
-//             source ==> on projette le point sur la direction cible source.
+//             it is attempted to preserve the target direction position of the  
+//             source ==> the point is projected on the target source direction.
     this->Position(Xi,Yi,Zi);
     aView->Project(Xi,Yi,Zi,PXP,PYP);
     DX = PXP - PXT;
   case V3d_IntRADIUSLIGHT :
                if (MyType == V3d_DIRECTIONAL)
                        break;
-//               on cherche a conserver la direction cible positionnement 
-//               de la source ==> on projette le point sur la direction 
-//               cible source.
+//             it is attempted to preserve the target direction position of the  
+//             source ==> the point is projected on the target source direction.
     Position(Xi,Yi,Zi);
     aView->Project(Xi,Yi,Zi,PXP,PYP);
     DX = PXP - PXT;
       Rap = NewRprj/OldRprj;
       Rayon = Radius();
       Rayon = Rayon * Rap;
-//                 la source doit rester a une position fixe, seule la cible
-//                 est modifie.
+//                 the source should remain at a fixed position, 
+//                 only the target is modified.
       Position (xPos, yPos, zPos);
       Graphic3d_Vector  Dir(Graphic3d_Vertex(xPos,yPos,zPos), MyTarget);
       Dir.Normalize();
       X = Xi + Rayon*X;
       Y = Yi + Rayon*Y;
       Z = Zi + Rayon*Z;
-//                 la source doit rester a une position fixe, seule la cible
-//                 est modifie.
+//                 the source should remain at a fixed position, 
+//                 only the target is modified.
       MyTarget.SetCoord(X,Y,Z);
       Display(aView,MyTypeOfRepresentation);            
       (aView->Viewer())->UpdateLights();
 
   MyType = V3d_POSITIONAL ;
   MyLight = new Visual3d_Light(C,P,A1,A2) ;
   MyTarget = T;
-  // La Structure graphique sera initialisee lors de l'affichage.
+  // Graphic structure is initialized during the display.
 
 }
 
   Rayon = this->Radius();
   aView->Project(Xi,Yi,Zi,PXT,PYT); 
   aView->Convert(PXT,PYT,IXP,IYP);
-//  Coord 3d dans le plan de projection de la source.
+//  3D Coordinate in the plane of projection of the source.
   aView->Convert(IXP,IYP,XT,YT,ZT);
   aView->Convert(PXT,PYT+Rayon,IXP,IYP);
   aView->Convert(IXP,IYP,X,Y,Z);
   X = X+Xi-XT; Y = Y+Yi-YT; Z = Z+Zi-ZT;
   Dist = Sqrt( Square(X-Xi) + Square(Y-Yi) + Square(Z-Zi) );
-//  Axe de rotation.
+//  Axis of rotation.
   A = (X-Xi)/Dist;
   B = (Y-Yi)/Dist;
   C = (Z-Zi)/Dist;
 
-//  On dessine une sphere
+//  A sphere is drawn
   V3d::CircleInPlane(gsymbol,Xi,Yi,Zi,VX,VY,VZ,Rayon/40.);
   for( j=1 ; j<=3 ; j++ ) {
     Beta = j * Standard_PI/4.;
     Xf = Xi * MatRot(0,0) + Yi * MatRot(0,1) + Zi * MatRot(0,2);
     Yf = Xi * MatRot(1,0) + Yi * MatRot(1,1) + Zi * MatRot(1,2);
     Zf = Xi * MatRot(2,0) + Yi * MatRot(2,1) + Zi * MatRot(2,2);
-//    Rotation de la normale
+//    Rotation of the normal
     X1 = VX * MatRot(0,0) + VY * MatRot(0,1) + VZ * MatRot(0,2);
     Y1 = VX * MatRot(1,0) + VY * MatRot(1,1) + VZ * MatRot(1,2);
     Z1 = VX * MatRot(2,0) + VY * MatRot(2,1) + VZ * MatRot(2,2);
   V3d_TypeOfRepresentation Pres;
   V3d_TypeOfUpdate UpdSov;
 
-//  Creation d'une structure slight d'elements reperables (la position de
-//  la light, et le domaine d'eclairage represente par un cercle)
-//  Creation d'une structure snopick d'elements non reperables ( cible, meridien et 
-//  parallele ).
+//  Creation of a structure slight of markable elements (position of the
+//  light, and the domain of lighting represented by a circle)
+//  Creation of a structure snopick of non-markable elements (target, meridian and 
+//  parallel).
 
     Pres = TPres;
     Handle(V3d_Viewer) TheViewer = aView->Viewer();
   Y0 = MyTarget.Y();
   Z0 = MyTarget.Z();
   
-//Affichage de la position de la light.
+// Display of the position of the light.
 
   glight->SetPickId(1);
   this->Color(Quantity_TOC_RGB,R1,G1,B1);
   glight->SetPrimitivesAspect(Asp1);
   this->Symbol(glight,aView);
 
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the markable sphere (limit at the cercle).
 
   if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
       
     gsphere->SetPickId(2);
     V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
 
-//Affichage du rayon de la sphere (ligne + texte)
+// Display of the radius of the sphere (line + text)
 
     if (Pres == V3d_COMPLETE) {
       gradius->SetPickId(3);
       gradius->Text(ValOfRadius.ToCString(),PText,0.01);
     }
     
-//Affichage du meridien
+// Display of the meridian
 
     Quantity_Color Col2(Quantity_NOC_GREEN);
     Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
       (Col2,Aspect_TOL_SOLID,1.);
     gnopick->SetPrimitivesAspect(Asp2);
     
-//    Definition de l'axe du cercle
+//    Definition of the axis of circle
     aView->Up(DXRef,DYRef,DZRef);
     this->Position(X,Y,Z);
     DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
     
     V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
       
-//  Affichage de la parallele
+//  Display of the parallel
 
-//    Definition de l'axe du cercle
+//  Definition of the axis of circle
     aView->Proj(VX,VY,VZ);
     aView->Up(X1,Y1,Z1);
     DXRef = VY * Z1 - VZ * Y1;
 
 #define NO_TRACE_MINMAX
 #define NO_TRACE_MAKE
 #define NO_TRACE_VALUES
-#define NO_TRACE_PLANE // Penser a virer du cdl my*GridPlane my*ViewPlane
+#define NO_TRACE_PLANE 
 
 #define MYMINMAX 25.
 #define MYFACTOR 50.
                Trsf (1, 4) = xl,
                Trsf (2, 4) = yl,
                Trsf (3, 4) = zl;
-               // Transformation de changement de repere
+               // Transformation of change of marker
                Trsf (1, 1) = xdx,
                Trsf (2, 1) = xdy,
                Trsf (3, 1) = xdz,
                Trsf (3, 3) = dz;
                myStructure->SetTransform (Trsf, Graphic3d_TOC_REPLACE);
 
-               // Translation de l'origine
+               // Translation of the origin
                Trsf (1, 4) = -XOrigin (),
                Trsf (2, 4) = -YOrigin (),
                Trsf (3, 4) = 0.0;
-               // Rotation Alpha autour de l'axe -Z
+               // Rotation Alpha around axis -Z
                Trsf (1, 1) = CosAlpha,
                Trsf (2, 1) = -SinAlpha,
                Trsf (3, 1) = 0.0,
                Trsf (3, 3) = 1.0;
                myStructure->SetTransform (Trsf,Graphic3d_TOC_POSTCONCATENATE);
 
-               // CAL : 19 aout 1998
-               // Il y avait aussi la possibilite de faire le calcul
-               // de changement de repere par :
-               // gp_Trsf::SetTransformation
-               //      (myGridPlane, myViewer->PrivilegedPlane ());
 
 #ifdef TRACE_VALUES
 Standard_Integer i, j;
 #ifdef TRACE_MAKE
                cout << "MakeVerticales" << endl;
 #endif
-               // verticales
+               // verticals
                myGroup1->Clear ();
                LineAttrib->SetColor (myTenthColor);
                myGroup1->SetGroupPrimitivesAspect (LineAttrib);
                P1.SetCoord (0.0, -myYSize, -zl);
                P2.SetCoord (0.0, myYSize, -zl);
                myGroup1->Polyline (P1, P2, Standard_False);
-               nblines = 1; // on commence par une ligne gris fonce
+               nblines = 1; // start with a dark grey line 
                LineAttrib->SetColor (myColor);
                myGroup1->SetPrimitivesAspect (LineAttrib);
                for (xl = aXStep; xl < myXSize; xl += aXStep) {
 #ifdef TRACE_MAKE
                cout << "MakeHorizontales" << endl;
 #endif
-               // horizontales
+               // horizontals
                myGroup2->Clear ();
                LineAttrib->SetColor (myTenthColor);
                myGroup2->SetGroupPrimitivesAspect (LineAttrib);
                P1.SetCoord (-myXSize, 0., -zl);
                P2.SetCoord (myXSize, 0., -zl);
                myGroup2->Polyline (P1, P2, Standard_False);
-               nblines = 1; // on commence par une ligne gris fonce
+               nblines = 1; // start with a dark grey line
                LineAttrib->SetColor (myColor);
                myGroup2->SetPrimitivesAspect (LineAttrib);
                for (yl = aYStep; yl < myYSize; yl += aYStep) {
 #ifdef TRACE_MAKE
                cout << "MakeHorizontales" << endl;
 #endif
-               // horizontales
+               // horizontals
                myGroup1->Clear ();
                myGroup1->SetGroupPrimitivesAspect (MarkerAttrib);
                myGroup1->BeginPrimitives ();
 
 
   MyType = V3d_SPOT ;
   MyLight = new Visual3d_Light(C,P,D,CN,A1,A2,AN) ;
-  // On fixe la cible, a partir de la position de la light et de la direction.
+  // The target is fixed, starting from the light position and the direction.
   T.SetCoord(X + D.X(), Y + D.Y(), Z + D.Z());
   MyTarget = T;
 } 
   V3d_TypeOfRepresentation Pres;
   V3d_TypeOfUpdate UpdSov;
 
-//  Creation d'une structure slight d'elements reperables (la position de
-//  la light, et le domaine d'eclairage represente par un cercle)
-//  Creation d'une structure snopick d'elements non reperables ( cible, meridien et 
-//  parallele ).
+//  Creation of a structure slight of markable elements (position of the
+//  light, and the domain of lighting represented by a circle)
+//  Creation of a structure snopick of non-markable elements (target, meridian and 
+//  parallel).// 
 
     Pres = TPres;
     Handle(V3d_Viewer) TheViewer = aView->Viewer();
   Y0 = MyTarget.Y();
   Z0 = MyTarget.Z();
   
-//Affichage de la position de la light.
+//Display of the position of the light.
 
   glight->SetPickId(1);
   this->Color(Quantity_TOC_RGB,R1,G1,B1);
   glight->SetPrimitivesAspect(Asp1);
   this->Symbol(glight,aView);
   
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the reference sphere (limited by circle).
 
   if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
     
     gsphere->SetPickId(2);
     V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
 
-//Affichage du rayon de la sphere (ligne + texte)
+// Display of the radius of the sphere (line + text)
 
     if (Pres == V3d_COMPLETE) {
       gradius->SetPickId(3);
       gradius->Text(ValOfRadius.ToCString(),PText,0.01);
     }
     
-//Affichage du meridien
+// Display of the meridian
 
     Quantity_Color Col2(Quantity_NOC_GREEN);
     Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
       (Col2,Aspect_TOL_SOLID,1.);
     gnopick->SetPrimitivesAspect(Asp2);
     
-//    Definition de l'axe du cercle
+//    Definition of the axis of the circle
     aView->Up(DXRef,DYRef,DZRef);
     this->Position(X,Y,Z);
     DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
     
     V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
 
-//    Affichage de la parallele
+//    Display of the parallel
 
-//    Definition de l'axe du cercle
+//    Definition of the axis of the circle
     aView->Proj(VX,VY,VZ);
     aView->Up(X1,Y1,Z1);
     DXRef = VY * Z1 - VZ * Y1;
 
         File V3d_View_1.cxx :
 
 
-     HISTORIQUE DES MODIFICATIONS   :
-     --------------------------------
-       01-03-92 : NW,JPB,CAL ; Creation.
-       13-07-97 : FMN: Debug sur le ZClipping BUC40193
-                      Debug sur le ZCueing aussi
-       24-12-97 : FMN ; Suppression de GEOMLITE
-
-************************************************************************/
-
 /*----------------------------------------------------------------------*/
 /*
  * Includes
 
 #include <V3d_RectangularGrid.hxx>
 #include <V3d_CircularGrid.hxx>
 
-// Pour l'echo du point choisi
+// For the echo of the chosen point
 #include <Visual3d_TransientManager.hxx>
 
 /*----------------------------------------------------------------------*/
  * Constant
  */
 
-// en cas NO_TRACE_ECHO et de NO_TRACE_POINTS, dans V3d_View_4.cxx ET dans
-// V3d_View.cxx, virer MyGridEchoStructure et MyGridEchoGroup dans le cdl
+// in case NO_TRACE_ECHO and NO_TRACE_POINTS, in V3d_View_4.cxx and 
+// V3d_View.cxx, suspend MyGridEchoStructure and MyGridEchoGroup in cdl
 #define TRACE_ECHO
 #define NO_TRACE_VALUES
 #define NO_TRACE_POINTS
 
-#define MYEPSILON1 0.0001              // Comparaison avec 0.0
-#define MYEPSILON2 Standard_PI / 180.  // Delta entre 2 angles
+#define MYEPSILON1 0.0001              // Comparison with 0.0
+#define MYEPSILON2 Standard_PI / 180.  // Delta between 2 angles
 
 #ifdef TRACE_POINTS
 #include <Graphic3d_AspectLine3d.hxx>
        Trsf1 (1, 4) = xl,
        Trsf1 (2, 4) = yl,
        Trsf1 (3, 4) = zl;
-       // Transformation de changement de repere
+       // Transformation change of marker
        Trsf1 (1, 1) = xdx,
        Trsf1 (2, 1) = xdy,
        Trsf1 (3, 1) = xdz,
 TColStd_Array2OfReal Trsf2 (1, 4, 1, 4);
        Trsf2 (4, 4) = 1.0;
        Trsf2 (4, 1) = Trsf2 (4, 2) = Trsf2 (4, 3) = 0.0;
-       // Translation de l'origine
+       // Translation of the origin
        Trsf2 (1, 4) = -MyGrid->XOrigin (),
        Trsf2 (2, 4) = -MyGrid->YOrigin (),
        Trsf2 (3, 4) = 0.0;
-       // Rotation Alpha autour de l'axe -Z
+       // Rotation Alpha around axis -Z
        Trsf2 (1, 1) = CosAlpha,
        Trsf2 (2, 1) = -SinAlpha,
        Trsf2 (3, 1) = 0.0,
 Standard_Real valueoldtrsf;
 Standard_Real valuenewtrsf;
 Standard_Integer i, j, k;
-       // Le calcul de produit de matrices
+       // Calculation of the product of matrices
        for (i=1; i<=4; i++)
            for (j=1; j<=4; j++) {
                MyTrsf (i, j) = 0.0;
        cout << "AVertex : " << X1 << ", " << Y1 << ", " << Z1 << endl;
 #endif
 
-       // Cas ou le plan de la grille et le plan de la vue
-       // sont perpendiculaires a MYEPSILON2 radians pres
+       // Casw when the plane of the grid and the plane of the view
+       // are perpendicular to MYEPSILON2 close radians
        if (Abs (VPN.Angle (GPN) - Standard_PI / 2.) < MYEPSILON2) {
                NewPoint.SetCoord (X1, Y1, Z1);
 #ifdef TRACE_POINTS
 Standard_Real XBp, YBp;
 
        X1 = XO, Y1 = YO, Z1 = 0.0;
-       // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+       // MyTrsf * Point to return to the plane of 3D grid
        P1.SetCoord (X1, Y1, Z1);
        CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
        CurPoint.Coord (X2, Y2, Z2);
                XS = theGrid->XStep (), YS = theGrid->YStep ();
 
                X1 = XO + XS, Y1 = YO, Z1 = 0.0;
-               // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+               // MyTrsf *  Point to return to the plane of 3D grid
                P1.SetCoord (X1, Y1, Z1);
                CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
                CurPoint.Coord (X2, Y2, Z2);
 #endif
 
                X1 = XO, Y1 = YO + YS, Z1 = 0.0;
-               // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+               // MyTrsf *  Point to return to the plane of 3D grid
                P1.SetCoord (X1, Y1, Z1);
                CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
                CurPoint.Coord (X2, Y2, Z2);
                        Standard_Real (Standard_Integer (Abs (Y1)+0.5)) * YS :
                        - Standard_Real (Standard_Integer (Abs (Y1)+0.5)) * YS);
 #ifdef TRACE_VALUES
-                       cout << "Point choisi : " << X1 << ", " << Y1 << endl;
+                       cout << "Chosen point : " << X1 << ", " << Y1 << endl;
 #endif
-                       // MyTrsf * Point pour se retrouver sur le plan
-                       // de la grille 3D
+                       // MyTrsf *  Point to return to the plane of 3D grid
                        P1.SetCoord (X1, Y1, Z1);
                        CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
                        CurPoint.Coord (X2, Y2, Z2);
                }
                else {
 cout << "*****************" << endl;
-cout << "Determinant nul !" << endl;
+cout << "Zero Determinant!" << endl;
 cout << "*****************" << endl;
 #ifdef TRACE_VALUES
-                       cout << "Determinant nul !" << endl;
+                       cout << "Zero Determinant !" << endl;
 #endif
                        AVertex.Coord (X2, Y2, Z2);
                        CurPoint.SetCoord (X2, Y2, Z2);
                        X1 = XO + Cos (Alpha * i) * RS,
                        Y1 = YO + Sin (Alpha * i) * RS,
                        Z1 = 0.0;
-                       // MyTrsf * Point pour se retrouver sur le plan
-                       // de la grille 3D
+                       // MyTrsf * Point to return to the plane of 3D grid
                        P1.SetCoord (X1, Y1, Z1);
                        CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
                        CurPoint.Coord (X2, Y2, Z2);
                                AngleCur = Angle;
                                XCurp = XAp, YCurp = YAp;
 #ifdef TRACE_VALUES
-                               cout << "Angle entre OP et O" << CAR [i-1]
+                               cout << "Angle between OP and O" << CAR [i-1]
                                     << " : " << Angle << endl;
 #endif
                        }
 
 Standard_Real DistOCur = Sqrt (XCurp*XCurp + YCurp*YCurp);
 
-               // Determination du cercle de la grille le plus proche de P
+               // Determination of the circle of the grid closest to P
 Standard_Integer N = Standard_Integer (DistOP / DistOCur + 0.5);
 Standard_Real Radius = N * RS;
 #ifdef TRACE_VALUES
-               cout << "Cercle : " << N << " Radius : " << Radius << endl;
+               cout << "Circle : " << N << " Radius : " << Radius << endl;
 #endif
 
                X1 = Cos (Alpha * ICur) * Radius,
                Z1 = 0.0;
 
 #ifdef TRACE_VALUES
-               cout << "Point choisi : " << X1 << ", " << Y1 << endl;
+               cout << "Chosen Point : " << X1 << ", " << Y1 << endl;
 #endif
-               // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+               // MyTrsf * Point to return to the plane of 3D grid
                P1.SetCoord (X1, Y1, Z1);
                CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
                CurPoint.Coord (X2, Y2, Z2);
 
 /***********************************************************************
 
-     FONCTION :
+     FUNCTION :
      ----------
-        Classe Visual3d_ContextView.cxx :
+        Class Visual3d_ContextView.cxx :
 
-       Declaration des variables specifiques aux contextes des vues.
+       Declaration of variables specific to view contexts.
 
-       Un contexte de vues est defini par :
-               - l'activite de l'aliasing
-               - l'activite du depth-cueing
-               - l'activite du Z clipping
-               - l'activite des sources lumineuses definies
-               - le type de visualisation demande
-               - le modele de shading si besoin est
+       A view context is defined by :
+               - the activity of aliasing
+               - the activity of depth-cueing
+               - the activity of Z clipping
+               - the activity of defined light sources
+               - the required type of visualization
+               - the model of shading if required
 
-     HISTORIQUE DES MODIFICATIONS   :
-     --------------------------------
-      Mars 1992 : NW,JPB,CAL ; Creation.
-      01-08-97  : PCT ; Ajout support texture mapping
-      01-10-97  : CAL ; Retrait de DownCast.
 
 ************************************************************************/
 
 Standard_Integer LengthL       = MyLights.Length ();
 Standard_Integer indexL = 0;
 
-       // Recherche de la light <ALight> dans la
-       // sequence des lights deja allumees
+       // Find light <ALight> in 
+       // the sequence of already active lights
        for (Standard_Integer i=1; i<=LengthL && indexL==0; i++)
                if ((void *) (MyLights.Value (i)) ==
                    (void *) (ALight.operator->())) indexL = i;
 
-       // Il s'agit d'une nouvelle light a activer
+       // This is the activation of a new light
        if (indexL == 0)
                MyLights.Append ((void *) ALight.operator->());
 
 Standard_Integer LengthL       = MyLights.Length ();
 Standard_Integer indexL = 0;
 
-       // Recherche de la light <ALight> dans la
-       // sequence des lights deja allumees
+       // Find light <ALight> in 
+       // the sequence of already active lights
        for (Standard_Integer i=1; i<=LengthL && indexL==0; i++)
                if ((void *) (MyLights.Value (i)) ==
                    (void *) (ALight.operator->())) indexL = i;
 
-       // Il s'agit d'une light allumee
+       // This is the activation of a new light
        if (indexL != 0) MyLights.Remove (indexL);
 
 }
 Standard_Integer LengthC       = MyClipPlanes.Length ();
 Standard_Integer indexC                = 0;
 
-       // Recherche du plan <AClipPlane> dans la
-       // sequence des plans deja actives
+       // Find plane <AClipPlane> in the
+       // sequence of already active planes 
        for (Standard_Integer i=1; i<=LengthC && indexC==0; i++)
                if ((void *) (MyClipPlanes.Value (i)) ==
                    (void *) (AClipPlane.operator->())) indexC = i;
 
-       // Il s'agit d'un nouveau plan a activer
+       // This is the activation of a new plane
        if (indexC == 0)
                MyClipPlanes.Append ((void *) AClipPlane.operator->());
 
 Standard_Integer LengthC       = MyClipPlanes.Length ();
 Standard_Integer indexC                = 0;
 
-       // Recherche du plan <AClipPlane> dans la
-       // sequence des plans deja actives
+       // Find plane <AClipPlane> in the
+       // sequence of already active planes 
        for (Standard_Integer i=1; i<=LengthC && indexC==0; i++)
                if ((void *) (MyClipPlanes.Value (i)) ==
                    (void *) (AClipPlane.operator->())) indexC = i;
 
-       // Il s'agit d'un plane actif
+       // This is an active plane
        if (indexC != 0) MyClipPlanes.Remove (indexC);
 
 }
 
 /***********************************************************************
 
-     FONCTION :
+     FUNCTION :
      ----------
         File Visual3d_Light :
 
-       Declaration des variables specifiques aux sources lumineuses
+       Declaration of variables specific to light sources
 
-     REMARQUES:
+     NOTES:
      ----------
 
-       Une source lumineuse est definie par :
-       - son type
-       - sa couleur
-       - les facteurs d'attenuation (positionnelle et spot uniquement )
-       - son angle ( pour spot uniquement )
-       - sa concentration ( pour spot uniquement )
-       - sa direction ( directionnelle et spot uniquement )
-       - sa position ( positionnelle et spot uniquement )
+       A light source is defined by :
+       - type
+       - color
+       - reduction factors  ( for positional and spot only )
+       - its angle ( for spot only )
+       - its concentration ( for spot only )
+       - its direction ( directional and spot only )
+       - its position ( positional and spot only )
 
-       Elle est active dans une vue, dans le contexte associe.
+       It is active in a view, in the associated context.
 
      ATTENTION:
      ----------
 
-       - AngleCone est exprime en radian [Pex] alors que OpenGl travaille
-       en degres. Les limites pour Pex sont [0,PI] alors que pour OpenGl
-       ce sont [0,90].
-       - On utilise 2 facteurs d'attenuation avec Pex alors qu'OpenGl en utilise 3.
-       - Les facteurs d'attenuation sont limites entre [0.0,1.0] pour Pex alors 
-       que pour OpenGl la limite est [0.0,n] 
-       - La concentration varie entre [0.,1.0] pour Pex et [0,128] pour OpenGl.        
-
-     HISTORIQUE DES MODIFICATIONS   :
-     --------------------------------
-       01-03-92 : NW,JPB,CAL ; Creation.
-       19-12-96 : FMN ; PRO6793: 
-               Modification des bornes pour AngleCone [0,PI/2]
-               Ajout commentaires dans le cdl.
-               Ajout tests sur les bornes.
-       10-07-97 : PCT
-                Ajout des headlights
-       23-02-98 : FMN ; Remplacement PI par Standard_PI
+       - AngleCone is given in radian [Pex] while OpenGl works in 
+       degreees. The limits for Pex are [0,PI] while for OpenGl this is [0,90].
+       - Two reduction factors are used with Pex while OpenGl uses three.
+       - The ereduction factors have range [0.0,1.0] for Pex and 
+       for OpenGl the range is [0.0,n] 
+       - The concentration varies from [0.,1.0] for Pex to [0,128] for OpenGl. 
 
 ************************************************************************/
 
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques a la classe
-//             decrivant un reperage.
+//-Design      Declaration of variables specific to the class
+//             describing marking.
 
-//-Warning     Un retour de reperage est defini par :
-//             - une sequence de (Elem_Num, Pick_Id, Structure)
-//             - une profondeur
+//-Warning     A return of marking is defined by :
+//             - sequence of (Elem_Num, Pick_Id, Structure)
+//             - depth
 
 //-References  
 
        switch (MyContext.Order ()) {
 
                case Visual3d_TOO_TOPFIRST :
-                       // MyPickPathSequence->First retourne le premier
-                       // PickPath qui se trouve dans la sequence.
+                       // MyPickPathSequence->First returns the first
+                       // PickPath found in the sequence.
                        Result  = MyPickPathSequence->Sequence().First ();
                break;
 
                case Visual3d_TOO_BOTTOMFIRST :
-                       // MyPickPathSequence->Last retourne le dernier
-                       // PickPath qui se trouve dans la sequence.
+                       // MyPickPathSequence->Last returns the last
+                       // PickPath found in the sequence.
                        Result  = MyPickPathSequence->Sequence().Last ();
                break;
 
        switch (MyContext.Order ()) {
 
                case Visual3d_TOO_TOPFIRST :
-                       // MyPickPathSequence->First retourne le premier
-                       // PickPath qui se trouve dans la sequence.
+                       // MyPickPathSequence->First returns the first
+                       // PickPath found in the sequence.
                        Result  = MyPickPathSequence->Sequence().First ();
                break;
 
                case Visual3d_TOO_BOTTOMFIRST :
-                       // MyPickPathSequence->Last retourne le dernier
-                       // PickPath qui se trouve dans la sequence.
+                       // MyPickPathSequence->Last returns the last
+                       // PickPath found in the sequence.
                        Result  = MyPickPathSequence->Sequence().Last ();
                break;
 
        switch (MyContext.Order ()) {
 
                case Visual3d_TOO_TOPFIRST :
-                       // MyPickPathSequence->First retourne le premier
-                       // PickPath qui se trouve dans la sequence.
+                       // MyPickPathSequence->First returns the first
+                       // PickPath found in the sequence.
                        Result  = MyPickPathSequence->Sequence().First ();
                break;
 
                case Visual3d_TOO_BOTTOMFIRST :
-                       // MyPickPathSequence->Last retourne le dernier
-                       // PickPath qui se trouve dans la sequence.
+                       // MyPickPathSequence->Last returns the last
+                       // PickPath found in the sequence.
                        Result  = MyPickPathSequence->Sequence().Last ();
                break;
 
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques a la classe
-//             decrivant un reperage.
+//-Design      Declaration of variables specific to the classe
+//             describing a marking.
 
-//-Warning     Un reperage est defini par :
-//             - un vecteur (Elem_Num, Pick_Id, Structure)
+//-Warning     Marking is defined by :
+//             - vector (Elem_Num, Pick_Id, Structure)
 
 //-References  
 
 
         Classe Visual3d_View.cxx :
 
 
-        Declaration des variables specifiques aux vues.
+        Declaration of variables specific to views.
 
-        Une vue est definie par :
-                - un ViewManager
-                - un ContextView
-                - un ViewMapping
-                - une ViewOrientation
+        A view is defined by :
+                -  ViewManager
+                -  ContextView
+                -  ViewMapping
+                -  ViewOrientation
 
      HISTORIQUE DES MODIFICATIONS   :
      --------------------------------
 #ifdef RIC120302
         MyCView.DefWindow.XParentWindow = ( HWND )(theWindow->HParentWindow());
 #endif
-        wd = ( WNT_WindowData* )GetWindowLongPtr (( HWND )(theWindow->HWindow()), GWLP_USERDATA);
+#ifndef _WIN64
+        wd = ( WNT_WindowData* )GetWindowLong (( HWND )(theWindow->HWindow()), GWL_USERDATA);
+#else
+        wd = ( WNT_WindowData* )GetWindowLong (( HWND )(theWindow->HWindow()), GWLP_USERDATA);
+#endif
         wd -> WNT_WDriver_Ptr = ( void* )this;
         wd -> WNT_VMgr        = ( void* )MyPtrViewManager;
 #endif  /* WNT */
         MyGradientBackground = MyWindow->GradientBackground();
         SetGradientBackground(MyGradientBackground,1);
 
-        Standard_Boolean AWait = Standard_False;        // => mise a jour immediate
+        Standard_Boolean AWait = Standard_False;        // => immediate update
         MyGraphicDriver->SetVisualisation (MyCView);
         MyGraphicDriver->AntiAliasing (MyCView, MyContext.AliasingIsOn ());
         MyGraphicDriver->DepthCueing (MyCView, MyContext.DepthCueingIsOn ());
         MyGraphicDriver->ClipLimit (MyCView, AWait);
         MyGraphicDriver->Environment(MyCView);
 
-        // Mise a jour des plans de model clipping
+        // Update planses of model clipping
         UpdatePlanes ();
 
-        // Mise a jour des sources lumineuses
+        // Update light sources 
         UpdateLights ();
 
         /*
-         * Association view-window n'entraine pas le display
-         * des structures qui peuvent etre affichees dans la
-         * nouvelle vue.
-         * En effet, l'association vue-fenetre est faite, mais
-         * l'affichage ne sera realise que lorsque la vue sera
-         * activee (Activate).
+         * Association view-window does not cause the display
+         * of structures that can be displayed in the new view.
+         * In fact, association view-window is done, but the
+         * display is produced only if the view is activated (Activate).
          */
 
         SetRatio ();
 
             MyViewMapping.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
 
-            // Mise a jour avant le SetViewMapping.
+            // Update before SetViewMapping.
 
             MyCView.DefWindow.dx        = float( Dxw );
             MyCView.DefWindow.dy        = float( Dyw );
 
             SetViewMapping (MyViewMapping);
 //          SetViewMappingDefault ();
-            // FMN+ Mise a jout Ratio pour le MyViewMappingReset
+            // FMN+ Update Ratio for MyViewMappingReset
 
             MyViewMappingReset.WindowLimit(Umin,Vmin,Umax,Vmax) ;
             Xc  = (Umin + Umax)/2. ; Yc = (Vmin + Vmax)/2. ;
 
             MyViewMappingReset.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
 
-            // FMN- Mise a jout Ratio pour le MyViewMappingReset
+            // FMN- Update Ratio for MyViewMappingReset
 
             MyGraphicDriver->RatioWindow (MyCView);
         }
 
-        // On force a recalculer les 2 matrices.
+        // Force recalculation of 2 matrices.
         //
-        // La vue courante peut servir a reconstruire une vue copie
-        // qui est elle meme. Grace au SetWindow et au SetRatio on
-        // impose le recalcul des matrices de cette nouvelle vue.
+        // The current view can help to reconstruct a copied view
+        // that is itself. Owing to SetWindow and SetRatio the
+        // recalculation of matrices of this new view is imposed.
         MyMatOfMapIsEvaluated   = Standard_False;
         MyMatOfOriIsEvaluated   = Standard_False;
 
 
         if (MyCView.Context.NbActiveLight > 0) {
 
-                // Allocation dynamique
+                // Dynamic Allocation
                 lights  = new CALL_DEF_LIGHT [MyCView.Context.NbActiveLight];
 
                 MyCView.Context.ActiveLight     = lights;
 Graphic3d_Vector LightDirection;
 Visual3d_TypeOfLightSource LightType=Visual3d_TOLS_AMBIENT;
 
-                // Parcours des sources lumineuses
+                // Parcing of light sources
                 for (j=0; j<MyCView.Context.NbActiveLight; j++) {
                         LightType       = (MyContext.ActivatedLight (j+1))->LightType ();
 
 #ifdef BUC60570
   }
 #endif
-        // gestion des sources lumineuses
+        // management of light sources
         if (! IsDeleted ())
                 if (IsDefined ())
                         MyGraphicDriver->SetLight (MyCView);
 
-        // Desallocation dynamique
+        // Dynamic allocation
         if (MyCView.Context.NbActiveLight > 0) delete [] lights;
 
 }
 
         if (MyCView.Context.NbActivePlane > 0) {
 
-                // Allocation dynamique
+                // Dynamic Allocation 
 #ifdef GER61454 //Keep the plane address for the next Update !
                 if( !MyCView.Context.ActivePlane )
                    MyCView.Context.ActivePlane = new CALL_DEF_PLANE [j];
 #endif
 Standard_Real A, B, C, D;
 
-                // Parcours des plans de clipping
+                // Parcing of clipping planes
                 for (j=0; j<MyCView.Context.NbActivePlane; j++) {
 
                         planes[j].WsId          = MyCView.ViewId;
 
         }
 
-        // gestion des plans de model clipping
+        // Management of planes of clipping model
         if (! IsDeleted ())
                 if (IsDefined ())
                         MyGraphicDriver->SetPlane (MyCView);
 
-        // Desallocation dynamique
+        // Dynamic allocation
 #ifdef GER61454
         if ( MyCView.Context.ActivePlane && (MyCView.Context.NbActivePlane == 0)
  ) {
         if (! IsDefined ())
                 Visual3d_ViewDefinitionError::Raise ("Window not defined");
 
-        // A ce niveau, seule la GL peut mettre a jour le background.
-        // Il ne faut pas appeler MyWindow->SetBackground (ABack); car
-        // cette methode lance une mise a jour du fond de fenetre par X
-        // (si le fenetrage est X bien-sur)
+        // At this level, only GL can update the background.
+        // It is not necessary to call MyWindow->SetBackground (ABack); as
+        // this method starts update of window background by X
+        // (if the windowing is X)
 
         Standard_Real R, G, B;
         MyBackground    = ABack;
 Standard_Integer i, j;
 
         // Assign the new transformation in an array [0..3][0..3]
-        // Evite des problemes si le user a defini sa matrice [1..4][1..4]
+        // Avoid problems if the has defined a matrice [1..4][1..4]
         //                                                 ou [3..6][-1..2] !!
         lr      = AMatrix.LowerRow ();
         ur      = AMatrix.UpperRow ();
 
 Standard_Real X, Y, Z;
 
-        // Tests sur la modification des parametres.
+        // Tests on modification of parameters.
 Standard_Boolean VUPIsModified  = Standard_False;
 Standard_Boolean VRPIsModified  = Standard_False;
 Standard_Boolean VRUIsModified  = Standard_False;
                 cout << "no modification\n" << flush;
 #endif
 
-        // Mise en route que si l'un des parametres est modifie
+        // restart if one of parameters is modified
         if (VUPIsModified || VRPIsModified || VRUIsModified || ScaleIsModified || CustomIsModified) {
 
          if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
 
                 if (! IsDefined ()) return;
 
-Standard_Boolean AWait = Standard_False;        // => mise a jour immediate
+Standard_Boolean AWait = Standard_False;        // => immediate update
                 MyGraphicDriver->ViewOrientation (MyCView, AWait);
 
                 Compute ();
 
 Standard_Real X, Y, Z;
 
-        // Tests sur la modification des parametres.
+        // Tests on modification of parameters.
 Standard_Boolean VUPIsModified  = Standard_False;
 Standard_Boolean VRPIsModified  = Standard_False;
 Standard_Boolean VRUIsModified  = Standard_False;
 cout << "no modification\n" << flush;
 #endif
 
-        // Mise en route que si l'un des parametres est modifie
+        // Restart if one of parameters is modified
         if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
 
          if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
 
                 if (! IsDefined ()) return;
 
-Standard_Boolean AWait = Standard_False;        // => mise a jour immediate
+Standard_Boolean AWait = Standard_False;        // => immediate update
                 MyGraphicDriver->ViewOrientation (MyCView, AWait);
 
                 Compute ();
 
         if (! IsDefined ()) return;
 
-Standard_Boolean AWait = Standard_False;        // => mise a jour immediate
+Standard_Boolean AWait = Standard_False;        // => immediate update
         MyGraphicDriver->ViewMapping (MyCView, AWait);
 
         // Passage Parallele/Perspective
 
         if (! IsDefined ()) return;
 
-Standard_Boolean AWait = Standard_False;        // => mise a jour immediate
+Standard_Boolean AWait = Standard_False;        // => immediate update
         MyGraphicDriver->ViewMapping (MyCView, AWait);
 
         if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
 Visual3d_TypeOfVisualization OldVisualMode;
 Visual3d_TypeOfVisualization NewVisualMode;
 
-        // Pour gerer l'affichage uniquement en cas de
-        // changement de mode de visualisation.
+        // To manage display only in case of 
+        // change of visualisation mode.
         OldVisualMode   = MyContext.Visualization ();
         NewVisualMode   = CTX.Visualization ();
 
 Visual3d_TypeOfModel OldModel;
 Visual3d_TypeOfModel NewModel;
 
-        // Pour gerer le changement de visualisation uniquement
-        // en cas de changement de mode de visualisation ou de
-        // type de shading.
+        // To manage change of visualisation only in case 
+        // of change of mode of visualisation or of type of shading.
         OldModel        = MyContext.Model ();
         NewModel        = CTX.Model ();
 
 Standard_Boolean OldAliasingMode;
 Standard_Boolean NewAliasingMode;
 
-        // Pour gerer l'antialiasing uniquement en cas de changement.
+        // To manage antialiasing only in case of change.
         OldAliasingMode = MyContext.AliasingIsOn ();
         NewAliasingMode = CTX.AliasingIsOn ();
 
 Standard_Real OldDepthCueingBackPlane;
 Standard_Real NewDepthCueingBackPlane;
 
-        // Pour gerer le depth cueing uniquement en cas de changement.
+        // To manage the depth cueing only in case of change.
         OldDepthCueingMode              = MyContext.DepthCueingIsOn ();
         NewDepthCueingMode              = CTX.DepthCueingIsOn ();
 
 Standard_Real OldZClippingBackPlane;
 Standard_Real NewZClippingBackPlane;
 
-        // Pour gerer le Zclipping uniquement en cas de changement.
+        // To manage the Zclipping only in case of change.
         OldFrontZClippingMode   = MyContext.FrontZClippingIsOn ();
         NewFrontZClippingMode   = CTX.FrontZClippingIsOn ();
         OldBackZClippingMode    = MyContext.BackZClippingIsOn ();
 
         UpdateView ();
 
-Standard_Boolean AWait = Standard_False;        // => mise a jour immediate
+Standard_Boolean AWait = Standard_False;        // => immediate update
         if (IsDefined ()) {
-                // gestion des modes de visualisation et des types de shading.
+                // management of visualization modes and types of shading.
                 if ((OldVisualMode != NewVisualMode) || (OldModel != NewModel))
                         MyGraphicDriver->SetVisualisation (MyCView);
 
-                // gestion de l'antialiasing.
+                // management of antialiasing.
                 if (OldAliasingMode != NewAliasingMode)
                 MyGraphicDriver->AntiAliasing (MyCView, NewAliasingMode);
 
-                // gestion du depth_cueing.
+                // management of depth_cueing.
                 if ((OldDepthCueingMode != NewDepthCueingMode) ||
                     (OldDepthCueingFrontPlane != NewDepthCueingFrontPlane) ||
                     (OldDepthCueingBackPlane != NewDepthCueingBackPlane)) {
                                 (MyCView, NewDepthCueingMode);
                 }
 
-                // gestion du Zclipping
+                // management of Zclipping
                 if ((OldFrontZClippingMode != NewFrontZClippingMode) ||
                     (OldBackZClippingMode != NewBackZClippingMode) ||
                     (OldZClippingFrontPlane != NewZClippingFrontPlane) ||
                         MyGraphicDriver->ClipLimit (MyCView, AWait);
                 }
 
-                // gestion des textures
+                // management of textures
                 if ( (OldTexEnvId != NewTexEnvId) ||
                      (OldSurfaceDetail != NewSurfaceDetail) )
                   MyGraphicDriver->Environment(MyCView);
 
-                // Mise a jour des plans de model clipping
+                // Update of planes of model clipping
                 UpdatePlanes ();
 
-                // Mise a jour des sources lumineuses
+                // Update of light sources 
                 UpdateLights ();
         }
 
         if (OldVisualMode != NewVisualMode) {
 
                 /*
-                 * Changement de contexte =>
-                 * Erase des structures qui ne peuvent pas etre affichees
-                 * avec le nouveau mode de visualisation.
-                 * On ne doit pas prevenir le ViewManager car
-                 * cette structure ne doit pas disparaitre de la
-                 * liste des structures affichees chez celui-ci.
+                 * Change of context =>
+                 * Remove structures that cannot be displayed
+                 * in the new visualisation mode.
+                 * It is not necessary to warn ViewManager as
+                 * this structure should not disappear from
+                 * the list of structures displayed in it.
                  */
 Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
 Visual3d_TypeOfAnswer Answer;
 
                 while (S1Iterator.More ()) {
                         Answer  = AcceptDisplay (S1Iterator.Key ());
-                        // Si la structure n'est plus affichable dans le
-                        // nouveau contexte de la vue, on l'efface.
+                        // If the structure can't be displayed in the 
+                        // new context of the view, it is removed.
                         if ((Answer == Visual3d_TOA_NO) ||
                             (Answer == Visual3d_TOA_COMPUTE))
                                 //Erase (S1Iterator.Key (), Aspect_TOU_WAIT);
                                 FooSequence.Append (S1Iterator.Key ());
 
-                        // S1Iterator.Next () se positionne sur la
-                        // prochaine structure
+                        // S1Iterator.Next () is located on the next structure
                         S1Iterator.Next ();
                 }
 
 Standard_Integer Length = FooSequence.Length ();
-                // On efface les structures stockees
+                // The stored structures are removed
                 for (i=1; i<=Length; i++)
                         Erase (FooSequence.Value (i), Aspect_TOU_WAIT);
                 if (Length != 0) FooSequence.Clear ();
 
                 /*
-                 * Changement de contexte =>
-                 * Display des structures qui  peuvent etre affichees
-                 * avec le nouveau mode de visualisation.
-                 * On recupere toutes  les structures ayant le statut
-                 * Displayed dans le ViewManager et on l'affiche dans
-                 * la vue directement, si la structure n'est pas deja
-                 * affichee et si la vue l'accepte dans son contexte.
+                 * Change of context =>
+                 * Display structures that can be displayed 
+                 * with the new visualisation mode.
+                 * All structures with status Displayed are removed from the ViewManager 
+                 * and displayed in the view directly, if the structure is not already 
+                 * displayed and if the view accepts it in its context.
                  */
 
                 i       = MyViewManager->NumberOfDisplayedStructures ();
                   Handle(Graphic3d_Structure) SG = it.Key();
                     if (! IsDisplayed (SG)) {
                       Answer = AcceptDisplay(SG);
-                        // Si la structure est affichable dans le
-                        // nouveau contexte de la vue, on l'affiche.
+                        // If the structure can be displayed in the 
+                        // new context of the view, it is displayed.
                         if ((Answer == Visual3d_TOA_YES) ||
                             (Answer == Visual3d_TOA_COMPUTE))
                             //Display (MyViewManager->DisplayedStructure (j),
                 }
 
                 Length  = FooSequence.Length ();
-                // On affiche les structures stockees
+                // The stored structures are displayed
                 for (i=1; i<=Length; i++)
                         Display (FooSequence.Value (i), Aspect_TOU_WAIT);
                 if (Length != 0) FooSequence.Clear ();
   while (Iterator.More ()) {
     SG.Add (Iterator.Key ());
 
-    // Iterator.Next () se positionne sur la
-    // prochaine structure
+    // Iterator.Next () is located on the next structure
     Iterator.Next ();
   }
 
                 MyCView.Active  = 1;
 
                 /*
-                 * Activation d'une nouvelle vue =>
-                 * Display des structures qui  peuvent etre affichees
-                 * dans cette nouvelle vue.
-                 * On recupere toutes  les structures ayant le statut
-                 * Displayed dans le ViewManager et on l'affiche dans
-                 * la vue directement, si la structure n'est pas deja
-                 * affichee et si la vue l'accepte dans son contexte.
+                 * Activation of a new view =>
+                 * Display structures that can be displayed in this new view.
+                 * All structures with status
+                 * Displayed in ViewManager are returned and displayed in 
+                 * the view directly, if the structure is not already 
+                 * displayed and if the view accepts it in its context.
                  */
 
                Visual3d_TypeOfAnswer Answer;
                   Handle(Graphic3d_Structure) SG = it.Key();
                     if (! IsDisplayed (SG)) {
                       Answer    = AcceptDisplay(SG);
-                        // Si la structure est affichable dans le
-                        // nouveau contexte de la vue, on l'affiche.
+                        // If the structure can be displayed in the
+                        // new context of the view, it is displayed.
                         if ((Answer == Visual3d_TOA_YES) ||
                             (Answer == Visual3d_TOA_COMPUTE))
                         Display (SG,Aspect_TOU_WAIT);
 
         }
 
-        // Si l'activation/desactivation du ZBuffer doit etre automatique
-        // en fonction de la presence de facettes ou pas
+        // If the activation/desactivation of ZBuffer should be automatic
+        // depending on the presence or absence of facets.
         if (MyViewManager->ZBufferAuto ()) {
 Standard_Boolean BContainsFacet = ContainsFacet ();
 Standard_Boolean BZBuffer       = ZBufferIsActivated ();
-                // Si la vue contient des facettes
-                // et si le ZBuffer n'est pas actif
+                // If the view contains facets
+                // and if ZBuffer is not active
                 if (BContainsFacet && ! BZBuffer)
                         SetZBufferActivity (1);
-                // Si la vue ne contient pas des facettes
-                // et si le ZBuffer est actif
+                // If the view does not contain facets
+                // and if ZBuffer is active
                 if (! BContainsFacet && BZBuffer)
                         SetZBufferActivity (0);
         }
                 MyGraphicDriver->DeactivateView (MyCView);
 
                 /*
-                 * Deactivation d'une vue =>
-                 * Effacement des structures qui sont affichees
-                 * dans cette vue.
-                 * On recupere toute structure ayant le statut
-                 * Displayed dans le ViewManager et on l'efface dans
-                 * la vue directement, si la structure n'est pas deja
-                 * effacee et si la vue l'accepte dans son contexte.
-                 */
+                 * Deactivation of a view =>
+                 * Removal of structures displayed in this view.
+                 * All structures with status
+                 * Displayed in ViewManager are returned and removed from 
+                 * the view directly, if the structure is not already 
+                 * displayed and if the view accepts it in its context.
+                */
 
                Visual3d_TypeOfAnswer Answer;
                 Graphic3d_MapOfStructure Map;
                   Handle(Graphic3d_Structure) SG = it.Key();
                     if (! IsDisplayed (SG)) {
                         Answer  = AcceptDisplay(SG);
-                        // Si la structure etait affichable, on l'efface.
+                        // If the structure was displayed it is removed.
                         if ((Answer == Visual3d_TOA_YES) ||
                             (Answer == Visual3d_TOA_COMPUTE))
                                 Erase (SG,Aspect_TOU_WAIT);
 
                 if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
 
-                // Plus d'action possible sur la vue maintenant
+                // No action currently possible in the view
                 MyCView.Active  = 0;
         }
 
         if (! MyWindow->IsMapped ()) return;
 
         // san - 14/04/2004 - set up Z buffer state before redrawing
-        // Si l'activation/desactivation du ZBuffer doit etre automatique
-        // en fonction de la presence de facettes ou pas
+       // If the activation/desactivation of ZBuffer should be automatic
+        // depending on the presence or absence of facets.
         if (MyViewManager->ZBufferAuto ()) {
                 Standard_Boolean BContainsFacet = ContainsFacet ();
                 Standard_Boolean BZBuffer       = ZBufferIsActivated ();
-                // Si la vue contient des facettes
-                // et si le ZBuffer n'est pas actif
+                // If the view contains facets
+                // and if ZBuffer is not active
                 if (BContainsFacet && ! BZBuffer)
                         SetZBufferActivity (1);
-                // Si la vue ne contient pas des facettes
-                // et si le ZBuffer est actif
+                // If the view contains only facets
+                // and if ZBuffer is active
                 if (! BContainsFacet && BZBuffer)
                         SetZBufferActivity (0);
         }
         if (! MyWindow->IsMapped ()) return;
 
         // san - 14/04/2004 - set up Z buffer state before redrawing
-        // Si l'activation/desactivation du ZBuffer doit etre automatique
-        // en fonction de la presence de facettes ou pas
+          // If activation/desactivation of ZBuffer should be automatic
+        // depending on the presence or absence of facets.
         if (MyViewManager->ZBufferAuto ()) {
         Standard_Boolean BContainsFacet = ContainsFacet ();
         Standard_Boolean BZBuffer       = ZBufferIsActivated ();
-                // Si la vue contient des facettes
-                // et si le ZBuffer n'est pas actif
+                // If the view contains facets
+                // and if ZBuffer is not active
                 if (BContainsFacet && ! BZBuffer)
                         SetZBufferActivity (1);
-                // Si la vue ne contient pas des facettes
-                // et si le ZBuffer est actif
+                // If the view contains only facets
+                // and if ZBuffer is active
                 if (! BContainsFacet && BZBuffer)
                         SetZBufferActivity (0);
         }
 
         if (! MyWindow->IsMapped ()) return;
 
-        // Si l'activation/desactivation du ZBuffer doit etre automatique
-        // en fonction de la presence de facettes ou pas
+        // If activation/desactivation of ZBuffer should be automatic
+        // depending on the presence or absence of facets.
         if (MyViewManager->ZBufferAuto ()) {
 Standard_Boolean BContainsFacet = ContainsFacet ();
 Standard_Boolean BZBuffer       = ZBufferIsActivated ();
-                // Si la vue contient des facettes
-                // et si le ZBuffer n'est pas actif
-                if (BContainsFacet && ! BZBuffer)
+                // If the view contains facets
+                // and if ZBuffer is not active
+                        if (BContainsFacet && ! BZBuffer)
                         SetZBufferActivity (1);
-                // Si la vue ne contient pas des facettes
-                // et si le ZBuffer est actif
+                   // If the view does not contain facets
+                // and if ZBuffer is active
                 if (! BContainsFacet && BZBuffer)
                         SetZBufferActivity (0);
         }
 
 Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Structure)& AStructure) const {
 
-// Recuperation type de visualisation de la vue
+// Return type of visualization of the view
 Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
 
-// Recuperation type de visualisation de la structure
+// Return type of visualization of the structure
 Graphic3d_TypeOfStructure StructType = AStructure->Visual ();
 
 Visual3d_TypeOfAnswer Result = Visual3d_TOA_NO;
 
         if (StructType == Graphic3d_TOS_ALL)
-                // La structure accepte tout type de vue
+                // The structure accepts any type of view
                 Result  = Visual3d_TOA_YES;
         else {
                 if ((StructType == Graphic3d_TOS_SHADING)
 Standard_Integer Index = IsComputed (AStructure);
         if (Index != 0) {
 #ifdef TRACE_CLEAR
-        cout << "La structure " << AStructure->Identification ()
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
+        cout << "Structure " << AStructure->Identification ()
+             << " calculated in the view "
+             << Identification () << ", by structure "
              << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " est videe.\n";
+             << " is emptied.\n";
         cout << flush;
 #endif
                 MyCOMPUTEDSequence.Value (Index)->GraphicClear (WithDestruction);
 
         if (IndexM != 0 && IndexD != 0) {
 #ifdef TRACE_CONNECT
-        cout << "La structure " << AMother->Identification ()
-             << " est connectee a la structure "
+        cout << "Structure " << AMother->Identification ()
+             << " is connected to structure "
              << ADaughter->Identification () << endl;
-        cout << "Ces structures sont calculees.\n";
-        cout << "Dans la view " << Identification ()
-             << "La structure "
+        cout << "These structures are calculated.\n";
+        cout << "In the view " << Identification ()
+             << "Structure "
              << MyCOMPUTEDSequence.Value (IndexM)->Identification ()
-             << " est connectee a la structure "
+             << " is connected to the structure "
              << MyCOMPUTEDSequence.Value (IndexD)->Identification ()
              << endl;
 #endif
 
         if (IndexM != 0 && IndexD != 0) {
 #ifdef TRACE_CONNECT
-        cout << "La structure " << AMother->Identification ()
-             << " est disconnectee de la structure "
+        cout << "Structure " << AMother->Identification ()
+             << " is disconnected from the structure "
              << ADaughter->Identification () << endl;
-        cout << "Ces structures sont calculees.\n";
-        cout << "Dans la view " << Identification ()
-             << "La structure "
+        cout << "These structures are calculated.\n";
+        cout << "In the view " << Identification ()
+             << "Structure "
              << MyCOMPUTEDSequence.Value (IndexM)->Identification ()
-             << " est disconnectee de la structure "
+             << " is disconnected from the structure "
              << MyCOMPUTEDSequence.Value (IndexD)->Identification ()
              << endl;
 #endif
         if (! IsDefined ()) return;
         if (! IsActive ()) return;
 
-        // Si Display sur une structure qui est dans la liste
-        // des structures calculees alors qu'elle n'est pas
-        // ou plus, du type calcule =>
-        // On l'enleve ainsi que l'ancienne compute associee
-        // Ceci arrive lorsque la hlhsr redevient du type
-        // non computed apres un SetVisual.
+        // If Display on a structure present in the list
+        // of calculated structures while it is not 
+        // or more, of calculated type =>
+        // - removes it as well as the associated old computed
+        // THis happens when hlhsr becomes again of type e
+        // non computed after SetVisual.
 Standard_Integer Index = IsComputed (AStructure);
 
         if ((Index != 0) && (AStructure->Visual () != Graphic3d_TOS_COMPUTED)) {
                 return;
         }
 
-        // Mode degenere actif
+        // Mode degenerated active
 #ifdef G003
         if (  !ComputedMode () || DegenerateModeIsOn ()  )
                                         Answer = Visual3d_TOA_YES;
             cout << "Index : " << Index << "\n" << flush;
 #endif
             if (Index != 0) {
-                // Deja calculee, mais la COMPUTED est-elle encore valide ?
+                // Already computed, is COMPUTED still valid?
 #ifdef TRACE_DISPLAY
                 if (MyCOMPUTEDSequence.Value (Index)->HLRValidation ()) {
-                  cout << "La structure "
+                  cout << "Structure "
                      << MyTOCOMPUTESequence.Value (Index)->Identification ()
-                     << " deja calculee, dans la view "
+                     << "already calculated, in the view "
                      << Identification () << ", par la structure "
                      << MyCOMPUTEDSequence.Value (Index)->Identification ()
-                     << "\n n'a pas a etre recalculee car HLR est valide\n";
+                     << "\n was not recalculated as HLR is valid\n";
                   cout << flush;
                 }
                 else {
-                  cout << "La structure "
+                  cout << "Structure "
                      << MyTOCOMPUTESequence.Value (Index)->Identification ()
-                     << " deja calculee, dans la view "
-                     << Identification () << ", par la structure "
+                     << " already calculated, in the view "
+                     << Identification () << ", by the structure "
                      << MyCOMPUTEDSequence.Value (Index)->Identification ()
-                     << "\n doit etre recalculee car HLR est invalide\n";
+                     << "\n should be recalculated as HLR is invalid\n";
                   cout << flush;
                 }
 #endif
 Standard_Integer OldStructId =
         MyCOMPUTEDSequence.Value (Index)->Identification ();
 
-                // Cas COMPUTED valide
+                // Case COMPUTED valide
                 if (MyCOMPUTEDSequence.Value (Index)->HLRValidation ()) {
-                    // a afficher
+                    // to be displayed
                     if (! IsDisplayed (AStructure)) {
                         MyDisplayedStructure.Add (AStructure);
                         MyGraphicDriver->DisplayStructure (
                     return;
                 }
 
-                // Cas COMPUTED invalide
+                // Case COMPUTED invalid
                 else {
-                    // Existe-t-il une autre representation valide ?
-                    // Recherche dans la sequence des structures deja calculees
-                    // 1/ D'une structure ayant le meme Owner que <AStructure>
-                    // 2/ Qui ne soit pas <AStructure>
-                    // 3/ Dont la COMPUTED soit valide
+                    // Is there another valid representation ?
+                    // Find in the sequence of already calculated structures
+                    // 1/ Structure having the same Owner as <AStructure>
+                    // 2/ That is not <AStructure>
+                    // 3/ The COMPUTED which of is valid
                     Standard_Integer NewIndex = HaveTheSameOwner (AStructure);
 
-                    // Cas COMPUTED invalide, AVEC une valide de remplacement
+                    // Case of COMPUTED invalid, WITH a valid of replacement
                     if (NewIndex != 0) {
-                        // a afficher
+                        // to be displayed
                         if (! IsDisplayed (AStructure)) {
                             MyCOMPUTEDSequence.SetValue
                                 (Index, MyCOMPUTEDSequence.Value (NewIndex));
                         return;
                     }
 
-                    // Cas COMPUTED invalide, SANS une valide de remplacement
+                    // Cas COMPUTED invalid, WITHOUT a valid of replacement
                     else {
-                        // On efface la COMPUTED si affichee
+                        // COMPUTED is removed if displayed 
                         if (IsDisplayed (AStructure))
                             MyGraphicDriver->EraseStructure (
                                 MyCView,
                      << "\n" << flush;
 #endif
 
-            // On ajoute la TOCOMPUTE et la COMPUTED associee aux sequences
+            // TOCOMPUTE and COMPUTED associated to sequences are added
             MyTOCOMPUTESequence.Append (AStructure);
             MyCOMPUTEDSequence.Append (TheStructure);
 
                      << "\n" << flush;
 #endif
 
-            // On enleve, si necessaire, les anciennes
+            // The previous are removed if necessary
             if (Index != 0) {
                 MyTOCOMPUTESequence.Remove (Index);
                 MyCOMPUTEDSequence.Remove (Index);
                      << "\n" << flush;
 #endif
 
-// Recuperation type de visualisation de la vue
+// Return type of visualisation of the view
 Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
 
-// De quel type sera la computed ?
+// Of which type will be the computed ?
 Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
                 (AStructure->ComputeVisual () != Graphic3d_TOS_SHADING));
 
             }
 
 #ifdef TRACE_DISPLAY
-            cout << "La structure " << StructId
-                 << " dans la view " << Identification ()
-                 << " est calculee par la structure "
+            cout << "Structure " << StructId
+                 << " in the view " << Identification ()
+                 << " is calculated by the structure "
                  << TheStructure->Identification ();
             if (Answer == Visual3d_TOA_YES)
-                cout << " et affichee\n";
+                cout << " and displayed\n";
             else
-                cout << " mais pas affichee\n";
+                cout << " but not displayed\n";
             cout << flush;
 #endif
 
-            // On ne l'affiche que si la structure calculee
-            // est du bon type par rapport a celui de la vue.
+            // It is displayed only if the calculated structure 
+            // has a proper type corresponding to the one of the view.
             if (Answer != Visual3d_TOA_NO) {
                 if (! IsDisplayed (AStructure))
                         MyDisplayedStructure.Add (AStructure);
 
         if (IsDeleted ()) return;
 
-        // Pas de test sur window car la structure est affichee que
-        // si la window existe, donc un seul test suffit.
+        // No test on window as the structure is displayed only if 
+        // the window exists, so only one test is enough.
         if (IsDisplayed (AStructure)) {
 Visual3d_TypeOfAnswer Answer = AcceptDisplay (AStructure);
 
-                // Mode degenere actif
+                // Degenerated mode is active
 #ifdef G003
                 if (  !ComputedMode () || DegenerateModeIsOn ()  )
                                         Answer = Visual3d_TOA_YES;
                         MyCOMPUTEDSequence.Value (Index)->Identification ();
 #ifdef TRACE_COMP
         cout << "Structure " << AStructure->Identification ()
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
-             << StructId << " est effacee. \n";
+             << " calculated, in the view "
+             << Identification () << ", by the structure "
+             << StructId << " is removed. \n";
         cout << flush;
 #endif
                         MyGraphicDriver->EraseStructure
                                 (MyCView, *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
                     }
-                    // Le else est impossible
+                    // else is impossible
                 }
                 MyDisplayedStructure.Remove (AStructure);
                 if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
 Standard_Integer Index = IsComputed (AStructure);
         if (Index != 0) {
 #ifdef TRACE_HIGH
-        cout << "La structure " << AStructure->Identification ()
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
+        cout << "Structure " << AStructure->Identification ()
+             << " calculated, in the view "
+             << Identification () << ", by the structure "
              << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " passe en mode highlight.\n";
+             << " passes in highlight mode.\n";
         cout << flush;
 #endif
                 (MyCOMPUTEDSequence.Value (Index))->SetHighlightColor
 Standard_Integer Index = IsComputed (AStructure);
         if (Index != 0) {
 #ifdef TRACE_TRSF
-        cout << "La structure " << AStructure->Identification ()
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
+        cout << "The structure " << AStructure->Identification ()
+             << " calculated, in the view "
+             << Identification () << ", by the structure "
              << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " est transformee.\n";
+             << " is transformed.\n";
         cout << flush;
 #endif
-                // Test un peu leger !
-                // On ne transmet la trsf que si c'est :
-                // une translation
-                // un scale
+                // Test is somewhat light !
+                // trsf is transferred only if it is :
+                // a translation
+                // a scale
                 if (ATrsf (0, 1) != 0. || ATrsf (0, 2) != 0.
                  || ATrsf (1, 0) != 0. || ATrsf (1, 2) != 0.
                  || ATrsf (2, 0) != 0. || ATrsf (2, 1) != 0.)
 Standard_Integer Index = IsComputed (AStructure);
         if (Index != 0) {
 #ifdef TRACE_HIGH
-        cout << "La structure " << AStructure->Identification ()
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
+        cout << "Structure " << AStructure->Identification ()
+             << " calculated, in the view "
+             << Identification () << ", by the structure "
              << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " passe en mode unhighlight.\n";
+             << " passes in unhighlight mode.\n";
         cout << flush;
 #endif
                 MyCOMPUTEDSequence.Value (Index)->GraphicUnHighlight ();
                 if ((MyTOCOMPUTESequence.Value (i))->Identification ()
                         == StrId) Result        = i;
 #ifdef TRACE_ISCOMP
-        cout << "\nDans la vue " << Identification () << " la structure ";
+        cout << "\n In the view " << Identification () << " the structure ";
         if (Result != 0)
-                cout << StrId << " est calculee par "
+                cout << StrId << " is calculated by "
                      << MyCOMPUTEDSequence.Value (Result)->Identification ()
                      << "\n" << flush;
         else
-                cout << StrId << " n'est pas calculee\n" << flush;
+                cout << StrId << " is not calculated\n" << flush;
 #endif
 
 #ifdef TRACE_LENGTH
 
         Standard_Integer i      = MyDisplayedStructure.Extent ();
 
-        // On s'arrette a la premiere structure qui est du type TOS_COMPUTED
+        // Stop at the first structure of type TOS_COMPUTED
         while (! Result && Iterator.More ()) {
                 Result  =
                 (((Iterator.Key ())->Visual ()) == Graphic3d_TOS_COMPUTED);
 
-                // Iterator.Next () se positionne sur la
-                // prochaine structure
+                // Iterator.Next () is located on the 
+                // next structure
                 Iterator.Next ();
         }
 
 
 Graphic3d_MapIteratorOfMapOfStructure Iterator (ASet);
 
-        // On s'arrette a la premiere structure qui contient une facette
+        // Stop at the first structure containing a facet
         for ( Iterator.Initialize (ASet);
               Iterator.More () && ! Result;
               Iterator.Next ())
         if ( ZM != RealLast()  && ZM > ZMax )
           ZMax = ZM ;
       }
-      // Seules les structures non vides et non infinies
-      // sont prises en compte pour le calcul des MinMax
+      // Only non-empty and non-infinite structures 
+      // are taken into account for calculation of MinMax
       if (! (Iterator.Key ())->IsInfinite () &&
           ! (Iterator.Key ())->IsEmpty ()) {
             (Iterator.Key ())->MinMaxValues(Xm, Ym, Zm, XM, YM, ZM);
         }
     }
 
-    // Les cas suivants ne sont pas debiles
-    // Par exemple si toutes les structures sont vides ou infinies
+    // The following cases are relevant
+    // For exemple if all structures are empty or infinite
     if (XMax < XMin) { Xm = XMin; XMin = XMax; XMax = Xm; }
     if (YMax < YMin) { Ym = YMin; YMin = YMax; YMax = Ym; }
     if (ZMax < ZMin) { Zm = ZMin; ZMin = ZMax; ZMax = Zm; }
 math_Vector PtDC (0,3), PtWC (0,3);
 
 // RLE method:
-// Sinon utiliser un new sur une Visual3d_View (constructeur+destructeur)
-// car Projects est une const methode or MatrixOfOrientation et
-// MatrixOfMapping ne le sont pas.
+// Otherwise use new on Visual3d_View (constructor+destructor)
+// as Projects is a const method or MatrixOfOrientation and
+// MatrixOfMapping is not.
 Visual3d_View * const newthis = (Visual3d_View * const) this;
         newthis->MatrixOfOrientation ();
         newthis->MatrixOfMapping ();
         Standard_Real bpd       = MyViewMapping.BackPlaneDistance ();
 
         /*
-         * Les coordonnees de PtNPC sont decrites dans l'espace
+         * Coordinates of PtNPC are described in the space
          * [0-1]x[0-1]x[0-1].
-         * Il faut transformer x et y dans le window space.
-         * Il faut transformer z dans l'espace du back et front
-         * plane, en pensant aux plans de clipping.
-         * Ces plans de z clipping sont definis entre 0 et 1.
+         * It is necessary to transform x and y in the window space.
+         * It is necessary to transform z in the space of back and front
+         * plane, taking into account clipping planes.
+         * Z clipping planes are defined between 0 and 1.
         */
 
         APX     = PtNPC (0) * (uM - um) + um;
                        APX /= Ratio;
 
                /*
-               * Les coordonnees de APX, APY, APZ sont decrites dans
-               * l'espace [0-1]x[0-1]x[0-1].
-               * Il faut transformer x et y dans le window space.
-               * Il faut transformer z dans l'espace du back et front
-               * plane, en pensant aux plans de clipping.
-               * Ces plans de z clipping sont definis entre 0 et 1.
-               */
+         * Coordinates of APX, APY, APZ are described in the space
+         * [0-1]x[0-1]x[0-1].
+         * It is necessary to transform x and y in the window space.
+         * It is necessary to transform z in the space of back and front
+         * plane, taking into account clipping planes.
+         * Z clipping planes are defined between 0 and 1.
+               */
             APX     = APX * (uM - um) + um;
             APY     = APY * (vM - vm) + vm;
         }
 
         if ((! IsDefined ()) || (! IsActive ())) return (Standard_False);
 
-// -1 => non force par le programmeur => depend du type de visualisation
-//  0 ou 1 => force par le programmeur
+// -1 => not forced by the programmer => depends on the type of visualisation
+//  0 ou 1 => forced by the programmer
 
         if (MyCView.Context.ZBufferActivity == -1)
                 if (MyContext.Visualization () == Visual3d_TOV_SHADING)
         for (i=1; i<=Length; i++)
             (MyCOMPUTEDSequence.Value (i))->SetHLRValidation (Standard_False);
 
-        // Si le mode degenere est actif, on ne recalcule rien
+        // if the degenerated node is active, nothing is recomputed
 #ifdef G003
         if (  DegenerateModeIsOn () || !ComputedMode ()  ) return;
 #else
 #endif  // G003
 
         /*
-         * Forcer le HLRValidation a False sur toutes les structures
-         * calculees dans la vue.
+         * Force HLRValidation to False on all structures
+         * calculated in the view.
          */
 #ifdef TRACE_LENGTH
         if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
 #endif
 
         /*
-         * Changement d'orientation ou de type de projection =>
-         * Erase des structures qui ont ete calculees pour
-         * l'orientation precedente.
-         * Recalcul des nouvelles structures.
-         * Passage du mode degenere ON a OFF =>
-         * Erase des structures qui ont ete calculees avant que
-         * le mode degenere passe a ON.
-         * Recalcul des nouvelles structures.
+         * Change of orientation or of projection type =>
+         * Remove structures that were calculated for the
+         * previous orientation.
+         * Recalculation of new structures.
+         * Passage of the degenerated mode ON to OFF =>
+         * Remove structures that were calculated before 
+         * the degenerated mode passed to ON.
+         * Recalculate new structures.
          */
 Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
 Visual3d_TypeOfAnswer Answer;
 
         while (S1Iterator.More ()) {
                 Answer  = AcceptDisplay (S1Iterator.Key ());
-                // Si la structure etait calculee, on la recalcule.
+                // If the structure was calculated, it is recalculated.
                 if (Answer == Visual3d_TOA_COMPUTE) {
 #ifdef TRACE
                         cout << "AcceptDisplay ("
                         FooSequence.Append (S1Iterator.Key ());
                 }
 
-                // S1Iterator.Next () se positionne sur la
-                // prochaine structure
+                // S1Iterator.Next () is located on the next structure
                 S1Iterator.Next ();
         }
 
         Length  = FooSequence.Length ();
-        // On affiche les structures stockees
+        // All stored structures are displayed
         for (i=1; i<=Length; i++)
                 Display (FooSequence.Value (i), Aspect_TOU_WAIT);
         if (Length != 0) FooSequence.Clear ();
 Standard_Integer Index = IsComputed (AStructure);
                 if (Index == 0) {
 #ifdef TRACE_COMP
-        cout << "La structure " << AStructure->Identification ()
-             << " n'est pas calculee dans la view "
+        cout << "Structure " << AStructure->Identification ()
+             << " is not calculated in the view "
              << Identification () << "\n";
         cout << flush;
 #endif
                         MyCOMPUTEDSequence.Value (Index)->Identification ();
 #ifdef TRACE_COMP
        Standard_Integer StructId = AStructure->Identification ();
-        cout << "La structure " << StructId
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
-             << OldStructId << " est recalculee.\n";
+        cout << "Structure " << StructId
+             << " calculated, in the view "
+             << Identification () << ", by the structure "
+             << OldStructId << " is recalculated.\n";
         cout << flush;
 #endif
 
 #endif
         TheStructure->SetHLRValidation (Standard_True);
 
-// Recuperation type de visualisation de la vue
+// Return type of visualisation of the view
 Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
 
-// De quel type sera la computed ?
+// Of which type will be the computed ?
 Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
         (AStructure->ComputeVisual () != Graphic3d_TOS_SHADING));
 
                             TheStructure->GraphicHighlight (Aspect_TOHM_COLOR);
                         }
 
-                        // On la range
-                        // Recherche de la structure <AStructure>
-                        // dans la sequence des structures a calculer
+                        // Ot is ranged
+                        // Find structure <AStructure>
+                        // in the sequence of structures to be calculated.
                         NewStructId = TheStructure->Identification ();
 
-                        // On efface l'ancienne calculee et on affiche la nouvelle
+                        // The previous calculation is removed and the new one is dislayed
                         MyGraphicDriver->EraseStructure (
                                 MyCView,
                                 *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
         }
 #endif
 
-                          // On ajoute la hlhsr et
-                          // la nouvelle compute associee
+                          // hlhsr and the new associated compute are added
                           MyTOCOMPUTESequence.Append (AStructure);
                           MyCOMPUTEDSequence.Append (TheStructure);
 
                      << "\n" << flush;
 #endif
 
-                          // On enleve la hlhsr et
-                          // l'ancienne compute associee
+                          // hlhsr and the new associated compute are removed 
 
                           MyTOCOMPUTESequence.Remove (Index);
                           MyCOMPUTEDSequence.Remove (Index);
         cout << flush;
 #endif
 
-        // Si le mode degenere est deja actif, on ne recalcule rien
+        // If the degenerated mode is already active, nothing is recalculated
         if (DegenerateModeIsOn ()) return;
         DegenerateModeIsActive = Standard_True;
 
         MyCView.IsDegenerates  = 1;
 #else
         /*
-         * Changement d'activite du mode degenere
-         * Erase des structures qui ont ete calculees
-         * et affichees quand le mode etait off.
-         * Affichage des structures non calculees.
+         * Change of activity of the degenerated mode
+         * Remove structures that were calculated
+         * and displayed when the mode was off.
+         * Display of non-calculated structures.
          */
 Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
 Visual3d_TypeOfAnswer Answer;
         while (S1Iterator.More ()) {
 
                 Answer  = AcceptDisplay (S1Iterator.Key ());
-                // Si la structure etait a calculer, on efface la
-                // structure calculee et l'on l'affiche
-                // (C'est le role du passage en mode degenere)
+                // If the structure was calculated, the previous one is 
+                // removed and the new one is displayed
+                // (This is the role of passage into degenerated mode)
 
                 if (Answer == Visual3d_TOA_COMPUTE) {
 Standard_Integer Index = IsComputed (S1Iterator.Key ());
                         StructId =
                         MyCOMPUTEDSequence.Value (Index)->Identification ();
 #ifdef TRACE_COMP
-        cout << "La structure " << S1Iterator.Key ()->Identification ()
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
-             << StructId << " passe en mode degenere.\n";
-        cout << "On efface " << StructId << " puis on affiche "
+        cout << "Structure " << S1Iterator.Key ()->Identification ()
+             << " calculated, in the view "
+             << Identification () << ", by structure "
+             << StructId << " passes in degenerated mode.\n";
+        cout << "Remove" << StructId << " then display "
              << S1Iterator.Key ()->Identification () << "\n";
         cout << flush;
 #endif
                         );
                     }
                     else {
-                        // Le else est impossible (OUI !)
-                        // Si le mode etait non degenere avant alors la
-                        // structure calculee associee a S1Iterator.Key ()
-                        // existe vraiment et donc Index != 0
+                        // Else is impossible)
+                        // If the mode was not degenerated previously, the
+                        // calculated structure associated to S1Iterator.Key ()
+                        // really exists and Index != 0
                     }
                 }
 
-                // S1Iterator.Next () se positionne sur la
-                // prochaine structure
+                // S1Iterator.Next () is located on the next structure
                 S1Iterator.Next ();
         }
 #endif  //G003
         cout << flush;
 #endif
 
-        // Si le mode degenere est deja inactif, on ne recalcule rien
+        // If the degenerated mode is already inactive, nothing is recalculated
         if (! DegenerateModeIsOn ()) return;
 
         DegenerateModeIsActive  = Standard_False;
         MyCView.IsDegenerates  = 0;
 #else
         /*
-         * Changement d'activite du mode degenere
-         * Erase des structures qui ont ete affichees
-         * quand le mode etait on.
-         * Calcul des structures.
+         * Change of activity of degenerated mode
+         * Remove structures that were displayed
+         * when the mode was on.
+         * Calculation of structures.
          */
 Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
 Visual3d_TypeOfAnswer Answer;
         while (S1Iterator.More ()) {
 
                 Answer  = AcceptDisplay (S1Iterator.Key ());
-                // Si la structure etait a calculer, on l'efface
-                // et on affiche la structure calculee
-                // (C'est le role du passage en mode non degenere)
-
+                // If the structure was calculated, the previous one is 
+                // removed and the new one is displayed
+                // (This is the role of passage into degenerated mode)
+           
                 if (Answer == Visual3d_TOA_COMPUTE) {
 Standard_Integer Index = IsComputed (S1Iterator.Key ());
                     if (Index != 0) {
                         StructId =
                         MyCOMPUTEDSequence.Value (Index)->Identification ();
 #ifdef TRACE_COMP
-        cout << "La structure " << S1Iterator.Key ()->Identification ()
-             << " calculee, dans la view "
-             << Identification () << ", par la structure "
-             << StructId << " passe en mode normal.\n";
-        cout << "On efface " << S1Iterator.Key ()->Identification ()
-             << " puis on affiche " << StructId << "\n";
+        cout << "Structure " << S1Iterator.Key ()->Identification ()
+             << " calculated, in the view "
+             << Identification () << ", by the structure "
+             << StructId << " passes into normal mode.\n";
+        cout << "Remove " << S1Iterator.Key ()->Identification ()
+             << " then display " << StructId << "\n";
         cout << flush;
 #endif
                         MyGraphicDriver->EraseStructure
                         }
                     }
                     else {
-                        // Le else est impossible (NON !)
-                        // Le mode degenere a ete active avant l'affichage
-                        // de la structure. La structure a donc ete ensuite
-                        // affichee dans le mode degenere et donc sans que la
-                        // structure calculee existe.
-                        // On la calcule
+                        // Else is impossible 
+                        // Degenerated mode was activated before display of the
+                        // structure. So the structure was displayed in the
+                        // degenerated mode, but the calculated structure didn't exist.
+                        // It is calculated.
 
         // Compute + Validation
 Handle(Graphic3d_Structure) AStructure = (S1Iterator.Key ());
 #endif
         TheStructure->SetHLRValidation (Standard_True);
 
-// Recuperation type de visualisation de la vue
+// Return type of visualisation of the view
 Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
 
-// De quel type sera la computed ?
+// Of which type will be the computed ?
 Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
         ((S1Iterator.Key ())->ComputeVisual () != Graphic3d_TOS_SHADING));
 
                             TheStructure->GraphicHighlight (Aspect_TOHM_COLOR);
                         }
 
-                        // On la range
+                        // Make range
 Standard_Integer Result = 0;
 Standard_Integer Length = MyTOCOMPUTESequence.Length ();
-                        // Recherche de la structure <S1Iterator.Key ()>
-                        // dans la sequence des structures a calculer
+                        // Find structure <S1Iterator.Key ()>
+                        // in the sequence of structures to be calculated
                         StructId = (S1Iterator.Key ())->Identification ();
                         for (i=1; i<=Length && Result==0; i++)
                           if ((MyTOCOMPUTESequence.Value (i))->Identification () ==
                         if (Result != 0)
                           MyCOMPUTEDSequence.ChangeValue (Result) = TheStructure;
                         else {
-                          // On ajoute la hlhsr et la nouvelle compute associee
+                          // hlhsr and the associated new compute are added
 #ifdef TRACE_LENGTH
         if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
                 cout << "In Visual3d_View::SetDegenerateModeOff, ";
 #endif
                         }
 
-                        // On efface la degeneree et on affiche la calculee
+                        // The degenerated is removed and the calculated is displayed
                         MyGraphicDriver->EraseStructure
                                 (MyCView,
                                 *(Graphic3d_CStructure *)(S1Iterator.Key ()->CStructure ()));
                     }
                 }
 
-                // S1Iterator.Next () se positionne sur la
-                // prochaine structure
+                // S1Iterator.Next () is located on the next structure
                 S1Iterator.Next ();
         }
 
         while (S1Iterator.More ()) {
 
                 if (DegenerateModeIsOn ())
-                        // Le mode etant degenere on plotte la structure
-                        // affichee sans s'occuper si elle est calculee
+                        // As the  mode is degenerated the displayed structure
+                        // is plotted without taking into account if it is calculated or not
                         (S1Iterator.Key ())->Plot (APlotter);
                 else {
 Standard_Integer Index = IsComputed (S1Iterator.Key ());
-                        // Le mode n'etant pas degenere on plotte la structure
-                        // affichee si elle n'est pas calculee sinon
-                        // on plotte la structure calculee associee
+                        // As the  mode is not degenerated the displayed structure
+                        // is plotted as if it was not calculated, otherwise the 
+                        // associated calculated structure is plotted.
                         if (Index == 0)
                             (S1Iterator.Key ())->Plot (APlotter);
                         else
                             (MyCOMPUTEDSequence.Value (Index))->Plot (APlotter);
                 }
 
-                // S1Iterator.Next () se positionne sur la
-                // prochaine structure
+                // S1Iterator.Next () is located on the next structure
                 S1Iterator.Next ();
         }
 
 Standard_Integer Result = 0;
 Standard_Integer Length = MyTOCOMPUTESequence.Length ();
 
-        // Recherche dans la sequence des structures deja calculees
-        // 1/ D'une structure ayant le meme Owner que <AStructure>
-        // 2/ Qui ne soit pas <AStructure>
-        // 3/ Dont la COMPUTED soit valide
+        // Find in the sequence of already calculated structures 
+        // 1/ Structure with the same Owner as <AStructure>
+        // 2/ Which is not <AStructure>
+        // 3/ COMPUTED which of is valid
         for (Standard_Integer i=1; i<=Length && Result==0; i++)
            if ((MyTOCOMPUTESequence.Value (i)->Owner () == AStructure->Owner ())
             && (MyTOCOMPUTESequence.Value (i)->Identification () !=
 
      ----------
         Classe Visual3d_ViewManager.cxx :
 
-       Declaration des variables specifiques aux visualiseurs
+       Declaration of variables specific to visualisers
 
      HISTORIQUE DES MODIFICATIONS   :
      --------------------------------
 
 /*----------------------------------------------------------------------*/
 /*
- * Constantes
+ * Constants
  */
 
 #define NO_DOWNCAST
                (MyIterator.Value ())->ChangeDisplayPriority
                        (AStructure, OldPriority, NewPriority);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
 
   //Standard_Integer LengthD   = MyDisplayedStructure.Extent() ();
 
-  // Meme si physiquement la structure ne peut pas
-  // etre affichee (pb de type de visualisation)
-  // elle a le statut Displayed.
+  // Even if physically the structure cannot
+  // be displayed (pb of visualisation type)
+  // it has status Displayed.
  
   if (!MyDisplayedStructure.Contains(AStructure))
     return;
   while (MyIterator.More ()) {
     (MyIterator.Value ())->ReCompute (AStructure);
 
-    // MyIterator.Next () se positionne sur la prochaine vue
+    // MyIterator.Next () is located on the next view
     MyIterator.Next ();
   }
   
 
   Standard_Integer indexD = 0;
 
-// Meme si physiquement la structure ne peut pas
-// etre affichee (pb de type de visualisation)
-// elle a le statut Displayed.
+  // Even if physically the structure cannot
+  // be displayed (pb of visualisation type)
+  // it has status Displayed.
   if (!MyDisplayedStructure.Contains(AStructure))
     return;
        
   //
-  // Recompute structure in one activated view
+  // Recompute structure in all activated views
   //
   Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
  
     if ((MyIterator.Value ())->Identification () == ViewId)
       theView->ReCompute (AStructure);
 
-    // MyIterator.Next () se positionne sur la prochaine vue
+    // MyIterator.Next () is located on the next view
     MyIterator.Next ();
   }
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Clear (AStructure, WithDestruction);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next ()  is located on the next view
                MyIterator.Next ();
        }
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Connect (AMother, ADaughter);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next ()  is located on the next view
                MyIterator.Next ();
        }
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Disconnect (AMother, ADaughter);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next ()  is located on the next view
                MyIterator.Next ();
        }
 
 void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) { 
 
 
-  // Meme si physiquement la structure ne peut pas
-  // etre affichee (pb de type de visualisation)
-  // elle a le statut Displayed.
+ // Even if physically the structure cannot
+  // be displayed (pb of visualisation type)
+  // it has status Displayed.
 
   MyDisplayedStructure.Add(AStructure);
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Display (AStructure);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
 void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure) {
 
 
-// Meme si physiquement la structure ne pouvait pas
-// etre affichee (pb de type de visualisation)
-// elle avait le statut Displayed.
+// Even if physically the structure cannot
+  // be displayed (pb of visualisation type)
+  // it has status Displayed.
 
  MyDisplayedStructure.Remove(AStructure);
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Erase (AStructure);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Highlight (AStructure, AMethod);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->SetTransform (AStructure, ATrsf);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->UnHighlight (AStructure);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
                if (Dx > MaxDx) MaxDx = Dx;
                if (Dy > MaxDy) MaxDy = Dy;
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
            }
            if (! MyUnderLayer.IsNull ())
        while (MyIterator.More ()) {
            (MyIterator.Value ())->Redraw (MyUnderLayer, MyOverLayer);
 
-           // MyIterator.Next () se positionne sur la prochaine vue
+           // MyIterator.Next () is located on the next view
            MyIterator.Next ();
        }
 
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Update (MyUnderLayer, MyOverLayer);
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
                if ((MyIterator.Value ())->IsActive ())
                        SG->Add (MyIterator.Value ());
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
                        Result  =
                        (MyIterator.Value ())->ContainsComputedStructure ();
 
-               // MyIterator.Next () se positionne
-               // sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
        while (MyIterator.More ()) {
                SG->Add (MyIterator.Value ());
 
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
 
 void Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Graphic3d_Vertex& AVertex, Standard_Integer& AU, Standard_Integer& AV) const {
 
-// On convertit que si les donnees sont correctes
+// Convert only if the data is correct
 Standard_Boolean Exist;
 Graphic3d_CView  TheCView;
 //Graphic3d_Vertex Point;
          stop  = 1;
        }
 
-       // MyIterator.Next () se positionne
-       // sur la prochaine vue
+       // MyIterator.Next () is located on the next view
        MyIterator.Next ();
       }
 
 
 Graphic3d_Vertex Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV) const {
 
-// On convertit que si les donnees sont correctes
+// Convert only if the data is correct
 Graphic3d_CView TheCView;
 Graphic3d_Vertex Point;
 
                                0, 0, Width, Height,
                                AU, AV, x, y, z);
 
-           // Le unproject est realise par UnProjectRaster
+           // unproject is done by UnProjectRaster
            if (Result) {
                Point.SetCoord
                    (Standard_Real (x), Standard_Real (y), Standard_Real (z));
            }
-           // Le unproject n'est pas realisable par UnProjectRaster
-           // Code a virer des que les drivers Phigs et Pex seront abandonnes.
+           // unproject cannot be done by UnProjectRaster
+           // Code suspended since drivers Phigs and Pex are abandoned.
            else {
 
 Standard_Real NPCX, NPCY, NPCZ;
                        stop    = 1;
                    }
 
-                   // MyIterator.Next () se positionne
-                   // sur la prochaine vue
+                   // MyIterator.Next () is located on the next view
                    MyIterator.Next ();
                }
 
 
 void Visual3d_ViewManager::ConvertCoordWithProj (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV, Graphic3d_Vertex& Point, Graphic3d_Vector& Proj) const {
 
-// On convertit que si les donnees sont correctes
+// Conversion only if the data is correct
 Graphic3d_CView TheCView;
 
         if (! ViewExists (AWindow, TheCView)) {
                                0, 0, Width, Height,
                                AU, AV, x, y, z, dx, dy, dz);
 
-           // Le unproject est realise par UnProjectRaster
+           // unproject is done by UnProjectRaster
            if (Result) {
                Point.SetCoord
                    (Standard_Real (x), Standard_Real (y), Standard_Real (z));
                    (Standard_Real (dx), Standard_Real (dy), Standard_Real (dz));
                 Proj.Normalize();
            }
-           // Le unproject n'est pas realisable par UnProjectRaster
-           // Code a virer des que les drivers Phigs et Pex seront abandonnes.
+           // unproject cannot be done by UnProjectRaster
+           // Code is suspended since drivers Phigs are Pex abandoned.
            else {
 
 Standard_Real NPCX, NPCY, NPCZ;
                        stop    = 1;
                    }
 
-                   // MyIterator.Next () se positionne
-                   // sur la prochaine vue
+                   // MyIterator.Next () is located on the next view
                    MyIterator.Next ();
                }
 
 
 Visual3d_PickDescriptor Visual3d_ViewManager::Pick (const Visual3d_ContextPick& CTX, const Handle(Aspect_Window)& AWindow, const Standard_Integer AX, const Standard_Integer AY) {
 
-// On active le reperage que si les donnees sont correctes
+// The marking is activated only if the data is correct
 Standard_Boolean DoPick = Standard_False;
 
 CALL_DEF_PICK apick;
 Standard_Integer Width, Height;
 
-       // Parcours de la liste des vues pour rechercher
-       // une vue ayant pour fenetre celle specifiee
+       // Parse the list of views to find a 
+       // view having this specified window
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
        int TheWindowIdOfView;
 
 const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
        TheWindowIdOfView = int (theWindow->HWindow ());
 #endif  // WNT
-               // Comparaison sur les windows ids
+               // Comparision on window IDs
                if (TheWindowIdOfView == TheSpecifiedWindowId) {
                        DoPick          = Standard_True;
 
-                       // Mise a jour
+                       // Update
                        apick.WsId      =
                        int ((MyIterator.Value ())->Identification ());
 
                }
           } /* if ((MyIterator.Value ())->IsDefined ()) { */
 
-          // MyIterator.Next () se positionne
-          // sur la prochaine vue
+          // MyIterator.Next () is located on the next view
           MyIterator.Next ();
        }
 
        else
                apick.Pick.depth        = 0;
 
-       // Picking : le retour
+       // Picking : return
 Standard_Integer i, j=0;
 Standard_Integer NbPick;
 
            }
        }
 
-       // Pas tres efficace, a revoir (CAL 22/09/95)
+       // Not very efficient, revise (CAL 22/09/95)
        if (apick.Pick.depth > 2) {
 Handle(Graphic3d_Structure) StructCur =
        Graphic3d_StructureManager::Identification (j);
                        PDes.AddPickPath (PPat);
                        NbPick++;
                    }
-                   // IteratorD.Next () se positionne
-                   // sur la prochaine structure
+                   // IteratorD.Next () is located on the next structure
                    IteratorD.Next ();
                }
            }
 
 Standard_Boolean Exist = Standard_False;
 
-       // Parcours de la liste des vues pour rechercher
-       // une vue ayant pour fenetre celle specifiee
+       // Parse the list of views to find
+       // a view with the specified window
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
        int TheWindowIdOfView;
 
 const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
        TheWindowIdOfView = int (theWindow->HWindow ());
 #endif  // WNT
-               // Comparaison sur les windows ids
+               // Comparaison on window IDs
                if (TheWindowIdOfView == TheSpecifiedWindowId) {
                        Exist   = Standard_True;
                        TheCView        = *(CALL_DEF_VIEW *)(MyIterator.Value ())->CView ();
                }
           } /* if ((MyIterator.Value ())->IsDefined ()) */
 
-          // MyIterator.Next () se positionne
-          // sur la prochaine vue
+          // MyIterator.Next () is located on the next view
           MyIterator.Next ();
        }
 
                if (! (MyIterator.Value ())->IsActive ())
                        (MyIterator.Value ())->Activate ();
 
-               // MyIterator.Next () se positionne
-               // sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
                if ((MyIterator.Value ())->IsActive ())
                        (MyIterator.Value ())->Deactivate ();
 
-               // MyIterator.Next () se positionne
-               // sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
 
 Standard_Integer Visual3d_ViewManager::MaxNumOfViews () const {
 
-       // on retourne le nombre theorique de vues definissables pour le
-       // Visual3d_ViewManager courant.
+       // Retourne the planned of definable views for the current
+       // Visual3d_ViewManager.
        return
 (Standard_Integer ((View_IDMAX-View_IDMIN+1)/Visual3d_ViewManager::Limit ()));
 
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
        while (MyIterator.More ()) {
                (MyIterator.Value ())->SetTransparency (AFlag);
-               // MyIterator.Next () se positionne sur la prochaine vue
+               // MyIterator.Next () is located on the next view
                MyIterator.Next ();
        }
 
        if (MyZBufferAuto && AFlag) return;
        if (! MyZBufferAuto && ! AFlag) return;
 
-       // si de False on passe a True :
-       // pas de probleme, au prochain update de vue, celle-ci se
-       // posera les bonnes questions pour reagir (SetVisualisation)
-       // si de True on passe a False :
-       // il faut modifier le ZBufferActivity de chaque vue pour que
-       // le zbuffer ne soit actif que si le contexte le demande.
-       // Dans ce cas on passe -1 pour que la vue se pose la question
-       // Rappel : 0 on force la desactivation, 1 on force l'activation
+       // if pass from False to True :
+       // no problem, at the next view update, it 
+       // will properly ask questions to answer (SetVisualisation)
+       // if pass from True to False :
+       // it is necessary to modify ZBufferActivity at each view so that
+       // zbuffer could be active only if required by context.
+       // In this case -1 is passed so that the view ask itself the question
+       // Note : 0 forces the desactivation, 1 forces the activation
        if (! AFlag) {
                Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
                while (MyIterator.More ()) {
                        (MyIterator.Value ())->SetZBufferActivity (-1);
-                       // MyIterator.Next () se positionne sur la prochaine vue
+                       // MyIterator.Next () is located on the next view
                        MyIterator.Next ();
                }
        }
 
 // Created     Fevrier 1992
 // Author      NW,JPB,CAL
 // Modified    
-//    18-11-98  : FMN ; Correction sur la gestion de la perspective (cf Programming Guide)
-//             Nouvelle valeur init du ViewMapping
 //    22-12-98  : FMN ; Rename CSF_WALKTHROW en CSF_WALKTHROUGH
 //    23-07-07  : NKV ; Define custom PROJECTION matrix for OpenGl context
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques au
-//             mapping des vues
+//-Design      Declaration of variables specific to mapping of views
 
-//-Warning     Rappels Le mapping d'une vue est defini par :
-//             - le point reference de projection
-//             - le type de projection
-//             - une distance pour le Back Plane
-//             - une distance pour le Front Plane
-//             - une distance pour le Projection Plane
+//-Warning     Mapping of a view is defined by :
+//             - reference point of projection
+//             - type of projection
+//             - distance for the Back Plane
+//             - distance for the Front Plane
+//             - distance for the Projection Plane
 
 //-References  
 
 
 
 //-Version     
 
-//-Design      Declaration des variables specifiques a
-//             l'orientation des vues
+//-Design      Declaration of variables specific to the orientation of views
 
-//-Warning     L'orientation d'une vue est definie par :
-//             - le point origine du repere
-//             - le vecteur normal au plan de visualisation
-//             - le vecteur vertical de l'observateur
+//-Warning     The view orientation is defined by :
+//             - the point of origin of the reference mark 
+//             - the normal vector to the visualisation plane
+//             - the vertical vector of the viewer
 
 //-References