static Handle(Geom_Plane) getGeomPlane(const TopoDS_Face &faceIn) { Handle_Geom_Plane planeSurfaceOut; Handle_Geom_Surface surface = BRep_Tool::Surface(faceIn); if (!surface.IsNull()) { planeSurfaceOut = Handle(Geom_Plane)::DownCast(surface); if (planeSurfaceOut.IsNull()) { Handle_Geom_RectangularTrimmedSurface trimmedSurface = Handle(Geom_RectangularTrimmedSurface)::DownCast(surface); if (!trimmedSurface.IsNull()) planeSurfaceOut = Handle(Geom_Plane)::DownCast(trimmedSurface->BasisSurface()); } } return planeSurfaceOut; }
Py::Object TopoShapeFacePy::getSurface() const { const TopoDS_Face& f = TopoDS::Face(getTopoShapePtr()->getShape()); BRepAdaptor_Surface adapt(f); switch(adapt.GetType()) { case GeomAbs_Plane: { GeomPlane* plane = new GeomPlane(); Handle_Geom_Plane this_surf = Handle_Geom_Plane::DownCast (plane->handle()); this_surf->SetPln(adapt.Plane()); return Py::Object(new PlanePy(plane),true); } case GeomAbs_Cylinder: { GeomCylinder* cylinder = new GeomCylinder(); Handle_Geom_CylindricalSurface this_surf = Handle_Geom_CylindricalSurface::DownCast (cylinder->handle()); this_surf->SetCylinder(adapt.Cylinder()); return Py::Object(new CylinderPy(cylinder),true); } case GeomAbs_Cone: { GeomCone* cone = new GeomCone(); Handle_Geom_ConicalSurface this_surf = Handle_Geom_ConicalSurface::DownCast (cone->handle()); this_surf->SetCone(adapt.Cone()); return Py::Object(new ConePy(cone),true); } case GeomAbs_Sphere: { GeomSphere* sphere = new GeomSphere(); Handle_Geom_SphericalSurface this_surf = Handle_Geom_SphericalSurface::DownCast (sphere->handle()); this_surf->SetSphere(adapt.Sphere()); return Py::Object(new SpherePy(sphere),true); } case GeomAbs_Torus: { GeomToroid* toroid = new GeomToroid(); Handle_Geom_ToroidalSurface this_surf = Handle_Geom_ToroidalSurface::DownCast (toroid->handle()); this_surf->SetTorus(adapt.Torus()); return Py::Object(new ToroidPy(toroid),true); } case GeomAbs_BezierSurface: { GeomBezierSurface* surf = new GeomBezierSurface(adapt.Bezier()); return Py::Object(new BezierSurfacePy(surf),true); } case GeomAbs_BSplineSurface: { GeomBSplineSurface* surf = new GeomBSplineSurface(adapt.BSpline()); return Py::Object(new BSplineSurfacePy(surf),true); } case GeomAbs_SurfaceOfRevolution: { Handle_Geom_Surface s = BRep_Tool::Surface(f); Handle_Geom_SurfaceOfRevolution rev = Handle_Geom_SurfaceOfRevolution::DownCast(s); if (rev.IsNull()) { Handle_Geom_RectangularTrimmedSurface rect = Handle_Geom_RectangularTrimmedSurface::DownCast(s); rev = Handle_Geom_SurfaceOfRevolution::DownCast(rect->BasisSurface()); } if (!rev.IsNull()) { GeomSurfaceOfRevolution* surf = new GeomSurfaceOfRevolution(rev); return Py::Object(new SurfaceOfRevolutionPy(surf),true); } else { throw Py::RuntimeError("Failed to convert to surface of revolution"); } } case GeomAbs_SurfaceOfExtrusion: { Handle_Geom_Surface s = BRep_Tool::Surface(f); Handle_Geom_SurfaceOfLinearExtrusion ext = Handle_Geom_SurfaceOfLinearExtrusion::DownCast(s); if (ext.IsNull()) { Handle_Geom_RectangularTrimmedSurface rect = Handle_Geom_RectangularTrimmedSurface::DownCast(s); ext = Handle_Geom_SurfaceOfLinearExtrusion::DownCast(rect->BasisSurface()); } if (!ext.IsNull()) { GeomSurfaceOfExtrusion* surf = new GeomSurfaceOfExtrusion(ext); return Py::Object(new SurfaceOfExtrusionPy(surf),true); } else { throw Py::RuntimeError("Failed to convert to surface of extrusion"); } } case GeomAbs_OffsetSurface: { Handle_Geom_Surface s = BRep_Tool::Surface(f); Handle_Geom_OffsetSurface off = Handle_Geom_OffsetSurface::DownCast(s); if (off.IsNull()) { Handle_Geom_RectangularTrimmedSurface rect = Handle_Geom_RectangularTrimmedSurface::DownCast(s); off = Handle_Geom_OffsetSurface::DownCast(rect->BasisSurface()); } if (!off.IsNull()) { GeomOffsetSurface* surf = new GeomOffsetSurface(off); return Py::Object(new OffsetSurfacePy(surf),true); } else { throw Py::RuntimeError("Failed to convert to offset surface"); } } case GeomAbs_OtherSurface: break; } throw Py::TypeError("undefined surface type"); }