Fast Way to Split Filleted Surface into Faces?

Hello, I’m back with a performance-related question.

I’m currently working on optimizing a workflow that goes from a filleted curve to a filleted solid Brep.

My initial approach was to create a single surface and then offset it using Brep.CreateFromOffsetFace. This was the fastest method for generating the solid. However, I ran into an issue: I need all individual faces, including the filleted ones. When I use Brep.Faces.SplitFacesAtTangents(), I do get the desired face separation, but this operation takes just as long as offsetting the entire Brep.

So my question is:
Is there a more performant way to split a filleted surface into individual faces?

FilletedSurfaceToOffsetBrep.gh (18.6 KB)

Base Surface:

Result:

Thanks already in advance!

I see no filleted curve? And a bunch of C#, which I ignored and deleted. This is standard GH:


FilletedSurfaceToOffsetBrep_2025May8a.gh (25.9 KB)

1 Like

FYI and hope it help to you.
SplitFilletedSurface.gh (12.0 KB)

I think you also can give it a try with the ConvertToBeziers in Grasshopper,

Thank you, @Joseph_Oster and @jessesn

I am sorry, I realized I might have been not super precise in formulating and providing data.

Why C# → Because it will live inside a grasshopper component. (Maybe Rhino Developer would have been the right topic)

@Joseph_Oster that’s it!

I ended with that, if someone is interested:

    public static Brep CreateExtrudedProfileFromCurve(Curve curve, double thickness, Plane referencePlane, double length)
    {
        var toll = RhinoDoc.ActiveDoc.ModelAbsoluteTolerance;
        var secondFilledCurves = curve.Offset(referencePlane, thickness, toll,
            CurveOffsetCornerStyle.None)[0];

        if (secondFilledCurves == null || !secondFilledCurves.IsValid)
            throw new InvalidOperationException("Failed to create second filled curves.");

        var fistStartPoint = curve.PointAtStart;
        var seconStartPoint = secondFilledCurves.PointAtStart;

        var startLine = new Line(fistStartPoint, seconStartPoint).ToNurbsCurve();

        var fistEndPoint = curve.PointAtEnd;
        var secondEndPoint = secondFilledCurves.PointAtEnd;

        var endLine = new Line(fistEndPoint, secondEndPoint).ToNurbsCurve();

        var allCurves = new List<Curve> { curve, secondFilledCurves, startLine, endLine };
        var joinedCurves = Curve.JoinCurves(allCurves,toll)[0];
        
        if (joinedCurves == null || joinedCurves.IsClosed == false)
            throw new InvalidOperationException("Failed to join filleted curves.");
        
        var extrusion = Extrusion.Create(joinedCurves, length, true).ToBrep();

        return extrusion ?? throw new InvalidOperationException("Failed to create extrusion from joined curves.");
    }

FilletedSurfaceToOffsetBrep.gh (11.9 KB)