diff --git a/src/traces/streamtube/convert.js b/src/traces/streamtube/convert.js index a958fb3cbfc..6a3542752b4 100644 --- a/src/traces/streamtube/convert.js +++ b/src/traces/streamtube/convert.js @@ -123,8 +123,8 @@ function convert(scene, trace) { tubeOpts.meshgrid = [meshx, meshy, meshz]; - if(trace.starts) { - var slen = trace._slen; + var slen = trace._slen; + if(slen) { tubeOpts.startingPositions = zip3( toDataCoords(trace.starts.x.slice(0, slen), 'xaxis'), toDataCoords(trace.starts.y.slice(0, slen), 'yaxis'), diff --git a/test/jasmine/tests/streamtube_test.js b/test/jasmine/tests/streamtube_test.js index 6e31ef37d25..fc0b7c7281e 100644 --- a/test/jasmine/tests/streamtube_test.js +++ b/test/jasmine/tests/streamtube_test.js @@ -147,6 +147,24 @@ describe('Test streamtube starting positions defaults:', function() { expect(exp.cellsLength).toBe(obj.cells.length, 'cells length'); } + it('@gl should ignore starts if one (x | y | z) dimension missing', function(done) { + var mock = makeFigure(4, 4, 4); + mock.data[0].starts = { + x: [0, 1, 2, 3], + // missing y + z: [0, 1, 2, 3] + }; + + Plotly.plot(gd, mock).then(function() { + _assert({ + positionsLength: 6144, + cellsLength: 2048 + }); + }) + .catch(failTest) + .then(done); + }); + it('@gl should cut xz at min-y and take all x/y/z pts on that plane except those on the edges', function(done) { Plotly.plot(gd, makeFigure(3, 3, 3)).then(function() { _assert({