MakePrism generating incomplete shape

I have the following C++ code. It generates with three of the four side faces and no top or bottom. Any thoughts on what is wrong here?

TopoDS_Shape MakeShape();

int main() {
    const char * filename = "/home/mwu/src/occtest_native/build/myshape.stl";
    TopoDS_Shape shape = MakeShape();

    StlAPI_Writer stlWriter;
    BRepMesh_IncrementalMesh mesh = BRepMesh_IncrementalMesh(shape, 0.01, false, 0.1);

    Standard_Boolean success = stlWriter.Write(shape, filename);

    STEPControl_Writer writer;
    writer.Transfer(shape, STEPControl_ManifoldSolidBrep);
    writer.Write("/home/mwu/src/occtest_native/build/myshape.step");

    if (success) {
        printf("success\n");
    } else {
        printf("error\n");
    }
    return 0;
}

TopoDS_Shape MakeShape() {
    gp_Pnt aPnt1(10.5, 14, 0);        
    gp_Pnt aPnt2(-10.5, 14., 0);
    gp_Pnt aPnt3(-12.737739, 12, 0);
    gp_Pnt aPnt4(12.737739, 12, 0);

    gp_Pnt origin(0, 0, 0);
    gp_Dir normal(0, 0, 1);
    gp_Dir xDir(1, 0, 0);
    gp_Ax2 circleOrigin(origin, normal, xDir);
    gp_Circ circle(circleOrigin, 17.5);

    Handle(Geom_TrimmedCurve) line1 = GC_MakeSegment(aPnt2, aPnt1);
    Handle(Geom_TrimmedCurve) line2 = GC_MakeSegment(aPnt4, aPnt3);
    // Handle(Geom_TrimmedCurve) line3 = GC_MakeSegment(aPnt3, aPnt2);
    // Handle(Geom_TrimmedCurve) line4 = GC_MakeSegment(aPnt1, aPnt4);
    Handle(Geom_TrimmedCurve) arc1 = GC_MakeArcOfCircle(circle, aPnt2, aPnt3, true);
    Handle(Geom_TrimmedCurve) arc2 = GC_MakeArcOfCircle(circle, aPnt4, aPnt1, true);

    TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(line1);
    TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(line2);
    TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(arc1);
    TopoDS_Edge anEdge4 = BRepBuilderAPI_MakeEdge(arc2);
    // TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(line3);
    // TopoDS_Edge anEdge4 = BRepBuilderAPI_MakeEdge(line4);
    TopoDS_Wire wire1 = BRepBuilderAPI_MakeWire(anEdge1).Wire();
    TopoDS_Wire wire2 = BRepBuilderAPI_MakeWire(anEdge2).Wire();
    TopoDS_Wire wire3 = BRepBuilderAPI_MakeWire(anEdge3).Wire();
    TopoDS_Wire wire4 = BRepBuilderAPI_MakeWire(anEdge4).Wire();
    BRepBuilderAPI_MakeWire mkWire;
    mkWire.Add(wire1);
    mkWire.Add(wire2);
    mkWire.Add(wire3);
    mkWire.Add(wire4);
    TopoDS_Wire profile = mkWire.Wire();

    // Body : Prism the Profile
    TopoDS_Face face = BRepBuilderAPI_MakeFace(profile);
    gp_Vec aPrismVec(0, 0, 2);
    TopoDS_Shape myBody = BRepPrimAPI_MakePrism(profile, aPrismVec);

    return myBody;
}
Marcus Wu's picture

Turns out this is related to some inaccuracy in the edges.