diff --git a/src/traces/scatter3d/convert.js b/src/traces/scatter3d/convert.js index 8ee2c6418c7..2e1b4aec6a2 100644 --- a/src/traces/scatter3d/convert.js +++ b/src/traces/scatter3d/convert.js @@ -432,7 +432,7 @@ proto.dispose = function() { this.scatterPlot.dispose(); } if(this.errorBars) { - this.scene.remove(this.errorBars); + this.scene.glplot.remove(this.errorBars); this.errorBars.dispose(); } if(this.textMarkers) { @@ -440,7 +440,7 @@ proto.dispose = function() { this.textMarkers.dispose(); } if(this.delaunayMesh) { - this.scene.glplot.remove(this.textMarkers); + this.scene.glplot.remove(this.delaunayMesh); this.delaunayMesh.dispose(); } }; diff --git a/test/jasmine/tests/gl_plot_interact_test.js b/test/jasmine/tests/gl_plot_interact_test.js index 6f6cdd96336..ab5274be3f6 100644 --- a/test/jasmine/tests/gl_plot_interact_test.js +++ b/test/jasmine/tests/gl_plot_interact_test.js @@ -73,7 +73,17 @@ describe('Test gl plot interactions', function() { beforeEach(function(done) { gd = createGraphDiv(); - Plotly.plot(gd, mock.data, mock.layout).then(function() { + + var mockCopy = Lib.extendDeep({}, mock); + + // lines, markers, text, error bars and surfaces each + // correspond to one glplot object + mockCopy.data[0].mode = 'lines+markers+text'; + mockCopy.data[0].error_z = { value: 10 }; + mockCopy.data[0].surfaceaxis = 2; + mockCopy.layout.showlegend = true; + + Plotly.plot(gd, mockCopy.data, mockCopy.layout).then(function() { delay(done); }); }); @@ -190,6 +200,22 @@ describe('Test gl plot interactions', function() { }); }); + it('should be able to toggle visibility', function(done) { + var objects = gd._fullLayout.scene._scene.glplot.objects; + + expect(objects.length).toEqual(5); + + Plotly.restyle(gd, 'visible', 'legendonly').then(function() { + expect(objects.length).toEqual(0); + + return Plotly.restyle(gd, 'visible', true); + }).then(function() { + expect(objects.length).toEqual(5); + + done(); + }); + }); + }); describe('gl2d plots', function() {