Loft command is unreliable - surface off curve, selection location dependent

The Loft command is unreliable.

Loft with straight option between point and curve produces two different results depending on where the curve is selected. One result is as expected with the surface between point and curve. The other result is in error with the surface not on the curve.
LoftBugDC01.3dm (87.4 KB)
It is reproducable.

  1. Open attached file.
  2. Loft
  3. Point option and select the point
  4. Select the curve close to the red point near the label A.
  5. Enter to complete the command.
    The resulting surface will not be on the curve.
    If the curve is selected close to the red point near the label B the resulting surface will be on the curve.
    LoftOptions
    Command: Loft
    Select curves to loft ( Point ): p
    Loft start point
    Select curves to loft ( Point )
    Select curves to loft. Press Enter when done ( Point )
    Creating meshes… Press Esc to cancel

I found the cause of the problem.

The curve has non-uniform knots. Both surfaces have control points in identical locations. But the order of the control points is reversed for the incorrect result while the knot vector is the same. Since the knots are non-uniform the order of the control points relative to the knot vector is important. Apparently the location of the selection of the input curve determines the order of the control points. It appears to only occur when a point and single curve are used as input to Loft.

Results of List for the input curve.
Rhino object: curve
DEVELOPER DEBUGGING INFORMATION ONLY
Use the Rhino “What” command.
Runtime serial number: 21683
name: “”
id: 94B3E679-8CA2-4d3a-A670-669BD5CF2E0D
layer index: 6
render material index: -1 (from layer)
ON_NurbsCurve dim = 3 is_rat = 0
order = 4 cv_count = 6
Knot Vector ( 8 knots )
index value mult delta
0 -0.13928117378768429 3
3 1 1 1.139
4 1.5000000000000004 1 0.5
5 2.1348588519826133 3 0.6349
Control Points 6 non-rational points
index value
CV[ 0] (10.780814273295119, 14.28070692671632, 7.5217582344216076)
CV[ 1] (41.735297066317102, 22.320870941518013, 3.667117704487254)
CV[ 2] (89.473185780838662, 27.455290697777677, 0.6547844885216092)
CV[ 3] (153.22551927025751, 15.420011139079213, 1.9508174434699974)
CV[ 4] (183.53335187533142, 3.2019973336466134, 3.9839054119284971)
CV[ 5] (200.26243098127392, -5.0743053908031364, 5.3543846938331443)

Results of List for the incorrect result:
Rhino object: surface
DEVELOPER DEBUGGING INFORMATION ONLY
Use the Rhino “What” command.
Runtime serial number: 38489
name: “”
id: C5F887BC-3C34-48bf-8533-CEFEDECA8F84
layer index: 3
render material index: -1 (from layer)
ON_Brep:
(B-rep geometry is the same as underlying surface.)
surfaces: 1
3d curve: 3
2d curves: 4
vertices: 3
edges: 3
trims: 4
loops: 1
faces: 1
curve2d[ 0]: TL_NurbsCurve domain(0,113.452) start(0,0) end(113.452,0)
curve2d[ 1]: TL_NurbsCurve domain(0,196.668) start(113.452,0) end(113.452,196.668)
curve2d[ 2]: TL_NurbsCurve domain(0,113.452) start(113.452,196.668) end(0,196.668)
curve2d[ 3]: TL_NurbsCurve domain(0,196.668) start(0,196.668) end(0,0)
curve3d[ 0]: TL_NurbsCurve domain(0,113.452) start(106.814,10.3971,-52.7598) end(200.262,-5.07431,5.35438)
curve3d[ 1]: TL_NurbsCurve domain(0,196.668) start(200.262,-5.07431,5.35438) end(10.7808,14.2807,7.52176)
curve3d[ 2]: TL_NurbsCurve domain(-113.452,-0) start(10.7808,14.2807,7.52176) end(106.814,10.3971,-52.7598)
surface[ 0]: TL_NurbsSurface u(0,113.452) v(0,196.668)
surface details:
ON_NurbsSurface dim = 3 is_rat = 0
order = 2 X 4 cv_count = 2 X 6
Knot Vector 0 ( 2 knots )
index value mult delta
0 0 1
1 113.45202334374729 1 113.5
Knot Vector 1 ( 8 knots )
index value mult delta
0 0 3
3 98.525098343982947 1 98.53
4 141.76512574495538 1 43.24
5 196.6677540559115 3 54.9
Control Points 12 non-rational points
index value
CV[ 0][ 0] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 1] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 2] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 3] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 4] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 5] (106.8142332161097, 10.397114608006019, -52.759762629323156)

    CV[ 1][ 0] (200.26243098127392, -5.0743053908031364, 5.3543846938331443)
    CV[ 1][ 1] (183.53335187533142, 3.2019973336466134, 3.9839054119284971)
    CV[ 1][ 2] (153.22551927025751, 15.420011139079213, 1.9508174434699974)
    CV[ 1][ 3] (89.473185780838662, 27.455290697777677, 0.6547844885216092)
    CV[ 1][ 4] (41.735297066317102, 22.320870941518013, 3.667117704487254)
    CV[ 1][ 5] (10.780814273295119, 14.28070692671632, 7.5217582344216076)

vertex[ 0]: (106.814233 10.397115 -52.759763) tolerance(0)
edges (0,2)
vertex[ 1]: (200.262431 -5.074305 5.354385) tolerance(0)
edges (0,1)
vertex[ 2]: (10.780814 14.280707 7.521758) tolerance(0)
edges (1,2)
edge[ 0]: v0( 0) v1( 1) 3d_curve(0) tolerance(0)
domain(0,113.452) start(106.814,10.3971,-52.7598) end(200.262,-5.07431,5.35438)
trims (+0)
edge[ 1]: v0( 1) v1( 2) 3d_curve(1) tolerance(0)
domain(0,196.668) start(200.262,-5.07431,5.35438) end(10.7808,14.2807,7.52176)
trims (+1)
edge[ 2]: v0( 2) v1( 0) 3d_curve(2) tolerance(0)
domain(-113.452,-0) start(10.7808,14.2807,7.52176) end(106.814,10.3971,-52.7598)
trims (+2)
face[ 0]: surface(0) reverse(0) loops(0)
Custom render mesh: 2977 polygons
(Face geometry is the same as underlying surface.)
loop[ 0]: type(outer) 4 trims(0,1,2,3)
trim[ 0]: edge( 0) v0( 0) v1( 1) tolerance(0,0)
type(boundary-south side iso) rev3d(0) 2d_curve(0)
domain(0,113.452) start(0,0) end(113.452,0)
surface points start(106.814,10.3971,-52.7598) end(200.262,-5.07431,5.35438)
trim[ 1]: edge( 1) v0( 1) v1( 2) tolerance(0,0)
type(boundary-east side iso) rev3d(0) 2d_curve(1)
domain(0,196.668) start(113.452,0) end(113.452,196.668)
surface points start(200.262,-5.07431,5.35438) end(10.7808,14.2807,7.52176)
trim[ 2]: edge( 2) v0( 2) v1( 0) tolerance(0,0)
type(boundary-north side iso) rev3d(0) 2d_curve(2)
domain(0,113.452) start(113.452,196.668) end(0,196.668)
surface points start(10.7808,14.2807,7.52176) end(106.814,10.3971,-52.7598)
trim[ 3]: edge(-1) v0( 0) v1( 0) tolerance(0,0)
type(singular-west side iso) rev3d(0) 2d_curve(3)
domain(0,196.668) start(0,196.668) end(0,0)
surface points start(106.814,10.3971,-52.7598) end(106.814,10.3971,-52.7598)

Results of List for the correct result:
Rhino object: surface
DEVELOPER DEBUGGING INFORMATION ONLY
Use the Rhino “What” command.
Runtime serial number: 63413
name: “”
id: 10735D05-F007-4d8a-87E5-E9CB0059D8B9
layer index: 29
render material index: -1 (from layer)
ON_Brep:
(B-rep geometry is the same as underlying surface.)
surfaces: 1
3d curve: 3
2d curves: 4
vertices: 3
edges: 3
trims: 4
loops: 1
faces: 1
curve2d[ 0]: TL_NurbsCurve domain(0,113.452) start(0,0) end(113.452,0)
curve2d[ 1]: TL_NurbsCurve domain(0,196.668) start(113.452,0) end(113.452,196.668)
curve2d[ 2]: TL_NurbsCurve domain(0,113.452) start(113.452,196.668) end(0,196.668)
curve2d[ 3]: TL_NurbsCurve domain(0,196.668) start(0,196.668) end(0,0)
curve3d[ 0]: TL_NurbsCurve domain(0,113.452) start(106.814,10.3971,-52.7598) end(10.7808,14.2807,7.52176)
curve3d[ 1]: TL_NurbsCurve domain(0,196.668) start(10.7808,14.2807,7.52176) end(200.262,-5.07431,5.35438)
curve3d[ 2]: TL_NurbsCurve domain(-113.452,-0) start(200.262,-5.07431,5.35438) end(106.814,10.3971,-52.7598)
surface[ 0]: TL_NurbsSurface u(0,113.452) v(0,196.668)
surface details:
ON_NurbsSurface dim = 3 is_rat = 0
order = 2 X 4 cv_count = 2 X 6
Knot Vector 0 ( 2 knots )
index value mult delta
0 0 1
1 113.45202334374729 1 113.5
Knot Vector 1 ( 8 knots )
index value mult delta
0 0 3
3 98.525098343982947 1 98.53
4 141.76512574495538 1 43.24
5 196.6677540559115 3 54.9
Control Points 12 non-rational points
index value
CV[ 0][ 0] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 1] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 2] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 3] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 4] (106.8142332161097, 10.397114608006019, -52.759762629323156)
CV[ 0][ 5] (106.8142332161097, 10.397114608006019, -52.759762629323156)

    CV[ 1][ 0] (10.780814273295119, 14.28070692671632, 7.5217582344216076)
    CV[ 1][ 1] (41.735297066317102, 22.320870941518013, 3.667117704487254)
    CV[ 1][ 2] (89.473185780838662, 27.455290697777677, 0.6547844885216092)
    CV[ 1][ 3] (153.22551927025751, 15.420011139079213, 1.9508174434699974)
    CV[ 1][ 4] (183.53335187533142, 3.2019973336466134, 3.9839054119284971)
    CV[ 1][ 5] (200.26243098127392, -5.0743053908031364, 5.3543846938331443)

vertex[ 0]: (106.814233 10.397115 -52.759763) tolerance(0)
edges (0,2)
vertex[ 1]: (10.780814 14.280707 7.521758) tolerance(0)
edges (0,1)
vertex[ 2]: (200.262431 -5.074305 5.354385) tolerance(0)
edges (1,2)
edge[ 0]: v0( 0) v1( 1) 3d_curve(0) tolerance(0)
domain(0,113.452) start(106.814,10.3971,-52.7598) end(10.7808,14.2807,7.52176)
trims (+0)
edge[ 1]: v0( 1) v1( 2) 3d_curve(1) tolerance(0)
domain(0,196.668) start(10.7808,14.2807,7.52176) end(200.262,-5.07431,5.35438)
trims (+1)
edge[ 2]: v0( 2) v1( 0) 3d_curve(2) tolerance(0)
domain(-113.452,-0) start(200.262,-5.07431,5.35438) end(106.814,10.3971,-52.7598)
trims (+2)
face[ 0]: surface(0) reverse(1) loops(0)
Custom render mesh: 1766 polygons
(Face geometry is the same as underlying surface.)
loop[ 0]: type(outer) 4 trims(0,1,2,3)
trim[ 0]: edge( 0) v0( 0) v1( 1) tolerance(0,0)
type(boundary-south side iso) rev3d(0) 2d_curve(0)
domain(0,113.452) start(0,0) end(113.452,0)
surface points start(106.814,10.3971,-52.7598) end(10.7808,14.2807,7.52176)
trim[ 1]: edge( 1) v0( 1) v1( 2) tolerance(0,0)
type(boundary-east side iso) rev3d(0) 2d_curve(1)
domain(0,196.668) start(113.452,0) end(113.452,196.668)
surface points start(10.7808,14.2807,7.52176) end(200.262,-5.07431,5.35438)
trim[ 2]: edge( 2) v0( 2) v1( 0) tolerance(0,0)
type(boundary-north side iso) rev3d(0) 2d_curve(2)
domain(0,113.452) start(113.452,196.668) end(0,196.668)
surface points start(200.262,-5.07431,5.35438) end(106.814,10.3971,-52.7598)
trim[ 3]: edge(-1) v0( 0) v1( 0) tolerance(0,0)
type(singular-west side iso) rev3d(0) 2d_curve(3)
domain(0,196.668) start(0,196.668) end(0,0)
surface points start(106.814,10.3971,-52.7598) end(106.814,10.3971,-52.7598)

Hi David -
That is this YT:
RH-56721 Loft misses input

Fixed in V7…

-Pascal

@Pascal Thanks for the quick reply. This needs to be fixed in V6, the current, recommended for production use version of Rhino, as soon as possible, not in V7… It results in a fundamental, unexpected error in the resulting geometry. And it is an error which the user may not recognize until it causes other problems such as surfaces not joining or naked edges. I have had that occur in the past and not understood the cause.

1 Like

I had forgotten about the problem. Oh well. It still should be fixed in V6, not wait until V7.

1 Like