BRepBuilderAPI_MakeEdge() fails, who knows why?

Objectif: Just try to use :
BRepBuilderAPI_MakeEdge(const Handle(Geom2d_Curve)& L,const Handle(Geom_Surface)& S,const Standard_Real p1,const Standard_Real p2)
to make an edge on a surface.
Result: FAILED!
Program:
face is a given TopoDS_Face.
for (expw.Init(face,TopAbs_WIRE);expw.More(); expw.Next())
{
TopoDS_Wire wire = TopoDS::Wire(expw.Current());
TopTools_IndexedMapOfShape eInFmap;
nEdgesOfFace=0;
for (expe.Init(expw.Current(), TopAbs_EDGE);expe.More(); expe.Next()){
TopoDS_Edge edge = TopoDS::Edge(expe.Current());
Handle(Geom_Curve) myCurve=BRep_Tool::Curve(edge,dummy1,dummy2);
if(!myCurve.IsNull()){
Standard_Real aFirst, aLast;
Handle(Geom_Surface) gsrf=BRep_Tool::Surface(face);
Handle(Geom2d_Curve) aC2D= BRep_Tool::CurveOnSurface(edge,face,aFirst,aLast);
TopoDS_Edge edge1=BRepBuilderAPI_MakeEdge(aC2D,gsrf,aFirst,aLast);
if (!edge1.IsNull())
{
cout }
else
{
Handle(Geom_Curve) myCurve1=BRep_Tool::Curve(edge1,dummy1,dummy2);
if(myCurve1.IsNull()){
cout }
else {
nEdgesOfFace++;
eInFmap.Add(edge1);
}
}
}
}
}
}

LI's picture

I've made an error my self, see the following code it works!

for (expw.Init(face,TopAbs_WIRE);expw.More(); expw.Next())
{
TopoDS_Wire wire = TopoDS::Wire(expw.Current());
TopTools_IndexedMapOfShape eInFmap,NeweInFmap;
nEdgesOfFace=0;
for (expe.Init(expw.Current(), TopAbs_EDGE);expe.More(); expe.Next()){
TopoDS_Edge edge = TopoDS::Edge(expe.Current());
Handle(Geom_Curve) myCurve=BRep_Tool::Curve(edge,dummy1,dummy2);
if(!myCurve.IsNull()){
//withdraw of the CurveOnSurface
Standard_Real aFirst, aLast;
Handle(Geom_Surface) gsrf=BRep_Tool::Surface(face);
Handle(Geom2d_Curve) aC2D = BRep_Tool::CurveOnSurface(edge,face,aFirst,aLast);
Handle(Geom_Surface) gsrf1=BRep_Tool::Surface(face1);
TopoDS_Edge edge1=BRepBuilderAPI_MakeEdge(aC2D,gsrf1,aC2D->FirstParameter(),aC2D->LastParameter());
BRep_Builder B;
Standard_Real dmax = 1.e-3;
B.UpdateVertex(TopExp::FirstVertex(edge1),dmax );
B.UpdateVertex(TopExp::LastVertex(edge1), dmax );
BRepLib::BuildCurve3d(edge1); //****error 1 in previous description
if (edge1.IsNull()) //*****error2 in previous description
{
cout <