May I get a suggestion about how to correct use Geom_BSplineSurface to build a TopoDS_Face through BRepBuilderAPI_MakeFace

jianbaoxia

CAD master
Hi Bros, it's me again. I seem to fail in simple problem again o_O
I get make a offset with a BSpline face, then I get a Handle(Geom_Surface) with the face after offset.
And I try to transform it to TopoDS_Face through BRepBuilderAPI_MakeFace,
actually it also happen when a try to get a TopoDS_Edge from Geom_Curve through BRepBuilderAPI_MakeFEdge.
I must ignore something what I don't know, the continuous failure is frustrating:eek:

There is my demo:
Code:
#include <BRepTools.hxx>
//
#include <BRepPrimAPI_MakeCylinder.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
//
#include <GCE2d_MakeSegment.hxx>
//
#include <BRepAlgoAPI_Common.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
#include <BRepAlgoAPI_Section.hxx>
#include <BRepFeat_Gluer.hxx>
#include <BRepAlgoAPI_Cut.hxx>
#include <BRepBuilderAPI_Sewing.hxx>
//
#include <gp_Pln.hxx>
//
#include <TopoDS.hxx>
#include <TopExp_Explorer.hxx>
//
#include <ShapeAnalysis.hxx>
#include <ShapeAnalysis_Surface.hxx>
//
#include <STEPControl_Writer.hxx>
#include <STEPControl_Reader.hxx>
#include <Interface_Static.hxx>
//
#include <BRepBndLib.hxx>
//
#include <BRepBuilderAPI_Copy.hxx>
#include <BRepBuilderAPI_Transform.hxx>
//
#include <BRepAdaptor_Surface.hxx>
#include <BRepAdaptor_Curve.hxx>
//
#include <Geom_BSplineCurve.hxx>
#include <Geom_BSplineSurface.hxx>
#include <Geom2d_BSplineCurve.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <Geom_Line.hxx>
//
#include <GeomLProp_CLProps.hxx>
//
#include <Geom_BezierSurface.hxx>
#include <Geom_CylindricalSurface.hxx>
//
#include <TColGeom_Array2OfBezierSurface.hxx>
//
#include <GeomConvert_CompBezierSurfacesToBSplineSurface.hxx>
#include <GeomAPI_PointsToBSplineSurface.hxx>
#include <BRepClass_FaceExplorer.hxx>
//
#include <BRepExtrema_DistShapeShape.hxx>
//
#include <Geom_OffsetSurface.hxx>

// use for get a BSpline Surface
TopoDS_Face BSplinSurDemo(double xmin=0,double xmax= M_PI,double ymin=0,double ymax= M_PI)
{
    std::string filePath = "C:/Users/14656/Desktop/Program/Open Cascade/Demo/";

    int n = 100;    // 
    // 
    double step_x = (xmax - xmin) / n;
    double step_y = (ymax - ymin) / n;
    std::vector<double> value_x;
    std::vector<double> value_y;
    for (int i = 0; i < n; i++)
    {
        value_x.push_back(xmin + i * step_x);
        value_y.push_back(ymin + i * step_y);
    }

    // 
    TColgp_Array2OfPnt pointsList(1, value_x.size(), 1, value_y.size());
    int row = 1;
    for (int i = 0; i < value_x.size(); i++)
    {
        int colu = 1;
        for (int j = 0; j < value_y.size(); j++)
        {
            const double& x = value_x[i];
            const double& y = value_y[j];
            double z = 5 * cos(x) * sin(x) * cos(y) * sin(y);
            pointsList.SetValue(row, colu, gp_Pnt(x, y, z));
            colu++;
        }
        row++;
    }

    // 
    Handle(Geom_Surface) aBSplineSur = GeomAPI_PointsToBSplineSurface(pointsList).Surface();
    TopoDS_Face aBSplinFace = BRepBuilderAPI_MakeFace(aBSplineSur,Precision::Confusion());
    /*BRepTools::Dump(aBSplinFace, std::cout);
    WriteStepFile(aBSplinFace, filePath + "aBSplinFace.step");*/

    return aBSplinFace;
}

int main()
{
    TopoDS_Face aBSplineFace = BSplinSurDemo();    // basic face

    // offset
    Handle(Geom_BSplineSurface) aBSplineSur = BRepAdaptor_Surface(aBSplineFace).BSpline();
    Standard_Real disOff = 23;
    Handle(Geom_OffsetSurface) aOffset = new Geom_OffsetSurface(aBSplineSur, disOff);
    Handle(Geom_Surface) aOffsetSur = aOffset->Surface();

    Standard_Real blade_umin;
    Standard_Real blade_umax;
    Standard_Real blade_vmin;
    Standard_Real blade_vmax;
    BRepTools::UVBounds(aBSplineFace, blade_umin, blade_umax, blade_vmin, blade_vmax);

    // both ways all fail
    TopoDS_Face aOffsetFace = BRepBuilderAPI_MakeFace(aOffsetSur, Precision::Confusion());
    // TopoDS_Face aOffsetFace = BRepBuilderAPI_MakeFace(aOffsetSur,blade_umin, blade_umax, blade_vmin, blade_vmax, Precision::Confusion());
    
    return 0;
}
 
Top