@@ -71,28 +71,53 @@ function render(scene) {
71
71
trace = lastPicked . data ;
72
72
var ptNumber = selection . index ;
73
73
var hoverinfo = Fx . castHoverinfo ( trace , scene . fullLayout , ptNumber ) ;
74
+ var hoverinfoParts = hoverinfo . split ( '+' ) ;
75
+ var isHoverinfoAll = hoverinfo === 'all' ;
74
76
75
- var xVal = formatter ( 'xaxis' , selection . traceCoordinate [ 0 ] ) ,
76
- yVal = formatter ( 'yaxis' , selection . traceCoordinate [ 1 ] ) ,
77
- zVal = formatter ( 'zaxis' , selection . traceCoordinate [ 2 ] ) ;
77
+ var xVal = formatter ( 'xaxis' , selection . traceCoordinate [ 0 ] ) ;
78
+ var yVal = formatter ( 'yaxis' , selection . traceCoordinate [ 1 ] ) ;
79
+ var zVal = formatter ( 'zaxis' , selection . traceCoordinate [ 2 ] ) ;
78
80
79
- if ( hoverinfo !== 'all' ) {
80
- var hoverinfoParts = hoverinfo . split ( '+' ) ;
81
+ if ( ! isHoverinfoAll ) {
81
82
if ( hoverinfoParts . indexOf ( 'x' ) === - 1 ) xVal = undefined ;
82
83
if ( hoverinfoParts . indexOf ( 'y' ) === - 1 ) yVal = undefined ;
83
84
if ( hoverinfoParts . indexOf ( 'z' ) === - 1 ) zVal = undefined ;
84
85
if ( hoverinfoParts . indexOf ( 'text' ) === - 1 ) selection . textLabel = undefined ;
85
86
if ( hoverinfoParts . indexOf ( 'name' ) === - 1 ) lastPicked . name = undefined ;
86
87
}
87
88
89
+ var tx ;
90
+
91
+ if ( trace . type === 'cone' ) {
92
+ var coneTx = [ ] ;
93
+ if ( isHoverinfoAll || hoverinfoParts . indexOf ( 'u' ) !== - 1 ) {
94
+ coneTx . push ( 'u: ' + formatter ( 'xaxis' , selection . traceCoordinate [ 3 ] ) ) ;
95
+ }
96
+ if ( isHoverinfoAll || hoverinfoParts . indexOf ( 'v' ) !== - 1 ) {
97
+ coneTx . push ( 'v: ' + formatter ( 'yaxis' , selection . traceCoordinate [ 4 ] ) ) ;
98
+ }
99
+ if ( isHoverinfoAll || hoverinfoParts . indexOf ( 'w' ) !== - 1 ) {
100
+ coneTx . push ( 'w: ' + formatter ( 'zaxis' , selection . traceCoordinate [ 5 ] ) ) ;
101
+ }
102
+ if ( isHoverinfoAll || hoverinfoParts . indexOf ( 'norm' ) !== - 1 ) {
103
+ coneTx . push ( 'norm: ' + selection . traceCoordinate [ 6 ] . toPrecision ( 3 ) ) ;
104
+ }
105
+ if ( selection . textLabel ) {
106
+ coneTx . push ( selection . textLabel ) ;
107
+ }
108
+ tx = coneTx . join ( '<br>' ) ;
109
+ } else {
110
+ tx = selection . textLabel ;
111
+ }
112
+
88
113
if ( scene . fullSceneLayout . hovermode ) {
89
114
Fx . loneHover ( {
90
115
x : ( 0.5 + 0.5 * pdata [ 0 ] / pdata [ 3 ] ) * width ,
91
116
y : ( 0.5 - 0.5 * pdata [ 1 ] / pdata [ 3 ] ) * height ,
92
117
xLabel : xVal ,
93
118
yLabel : yVal ,
94
119
zLabel : zVal ,
95
- text : selection . textLabel ,
120
+ text : tx ,
96
121
name : lastPicked . name ,
97
122
color : Fx . castHoverOption ( trace , ptNumber , 'bgcolor' ) || lastPicked . color ,
98
123
borderColor : Fx . castHoverOption ( trace , ptNumber , 'bordercolor' ) ,
@@ -306,41 +331,44 @@ proto.recoverContext = function() {
306
331
307
332
var axisProperties = [ 'xaxis' , 'yaxis' , 'zaxis' ] ;
308
333
309
- function coordinateBound ( axis , coord , len , d , bounds , calendar ) {
310
- var x ;
311
- if ( ! Lib . isArrayOrTypedArray ( coord ) ) {
312
- bounds [ 0 ] [ d ] = Math . min ( bounds [ 0 ] [ d ] , 0 ) ;
313
- bounds [ 1 ] [ d ] = Math . max ( bounds [ 1 ] [ d ] , len - 1 ) ;
314
- return ;
315
- }
334
+ function computeTraceBounds ( scene , trace , bounds ) {
335
+ var sceneLayout = scene . fullSceneLayout ;
316
336
317
- for ( var i = 0 ; i < ( len || coord . length ) ; ++ i ) {
318
- if ( Lib . isArrayOrTypedArray ( coord [ i ] ) ) {
319
- for ( var j = 0 ; j < coord [ i ] . length ; ++ j ) {
320
- x = axis . d2l ( coord [ i ] [ j ] , 0 , calendar ) ;
321
- if ( ! isNaN ( x ) && isFinite ( x ) ) {
322
- bounds [ 0 ] [ d ] = Math . min ( bounds [ 0 ] [ d ] , x ) ;
323
- bounds [ 1 ] [ d ] = Math . max ( bounds [ 1 ] [ d ] , x ) ;
337
+ for ( var d = 0 ; d < 3 ; d ++ ) {
338
+ var axisName = axisProperties [ d ] ;
339
+ var axLetter = axisName . charAt ( 0 ) ;
340
+ var ax = sceneLayout [ axisName ] ;
341
+ var coords = trace [ axLetter ] ;
342
+ var calendar = trace [ axLetter + 'calendar' ] ;
343
+ var len = trace [ '_' + axLetter + 'length' ] ;
344
+
345
+ if ( ! Lib . isArrayOrTypedArray ( coords ) ) {
346
+ bounds [ 0 ] [ d ] = Math . min ( bounds [ 0 ] [ d ] , 0 ) ;
347
+ bounds [ 1 ] [ d ] = Math . max ( bounds [ 1 ] [ d ] , len - 1 ) ;
348
+ } else {
349
+ var v ;
350
+
351
+ for ( var i = 0 ; i < ( len || coords . length ) ; i ++ ) {
352
+ if ( Lib . isArrayOrTypedArray ( coords [ i ] ) ) {
353
+ for ( var j = 0 ; j < coords [ i ] . length ; ++ j ) {
354
+ v = ax . d2l ( coords [ i ] [ j ] , 0 , calendar ) ;
355
+ if ( ! isNaN ( v ) && isFinite ( v ) ) {
356
+ bounds [ 0 ] [ d ] = Math . min ( bounds [ 0 ] [ d ] , v ) ;
357
+ bounds [ 1 ] [ d ] = Math . max ( bounds [ 1 ] [ d ] , v ) ;
358
+ }
359
+ }
360
+ } else {
361
+ v = ax . d2l ( coords [ i ] , 0 , calendar ) ;
362
+ if ( ! isNaN ( v ) && isFinite ( v ) ) {
363
+ bounds [ 0 ] [ d ] = Math . min ( bounds [ 0 ] [ d ] , v ) ;
364
+ bounds [ 1 ] [ d ] = Math . max ( bounds [ 1 ] [ d ] , v ) ;
365
+ }
324
366
}
325
367
}
326
368
}
327
- else {
328
- x = axis . d2l ( coord [ i ] , 0 , calendar ) ;
329
- if ( ! isNaN ( x ) && isFinite ( x ) ) {
330
- bounds [ 0 ] [ d ] = Math . min ( bounds [ 0 ] [ d ] , x ) ;
331
- bounds [ 1 ] [ d ] = Math . max ( bounds [ 1 ] [ d ] , x ) ;
332
- }
333
- }
334
369
}
335
370
}
336
371
337
- function computeTraceBounds ( scene , trace , bounds ) {
338
- var sceneLayout = scene . fullSceneLayout ;
339
- coordinateBound ( sceneLayout . xaxis , trace . x , trace . _xlength , 0 , bounds , trace . xcalendar ) ;
340
- coordinateBound ( sceneLayout . yaxis , trace . y , trace . _ylength , 1 , bounds , trace . ycalendar ) ;
341
- coordinateBound ( sceneLayout . zaxis , trace . z , trace . _zlength , 2 , bounds , trace . zcalendar ) ;
342
- }
343
-
344
372
proto . plot = function ( sceneData , fullLayout , layout ) {
345
373
346
374
// Save parameters
@@ -477,9 +505,12 @@ proto.plot = function(sceneData, fullLayout, layout) {
477
505
var axLetter = axis . _name . charAt ( 0 ) ;
478
506
479
507
for ( j = 0 ; j < objects . length ; j ++ ) {
480
- var objBounds = objects [ j ] . bounds ;
481
- sceneBounds [ 0 ] [ i ] = Math . min ( sceneBounds [ 0 ] [ i ] , objBounds [ 0 ] [ i ] / dataScale [ i ] ) ;
482
- sceneBounds [ 1 ] [ i ] = Math . max ( sceneBounds [ 1 ] [ i ] , objBounds [ 1 ] [ i ] / dataScale [ i ] ) ;
508
+ var obj = objects [ j ] ;
509
+ var objBounds = obj . bounds ;
510
+ var pad = obj . _trace . data . _pad || 0 ;
511
+
512
+ sceneBounds [ 0 ] [ i ] = Math . min ( sceneBounds [ 0 ] [ i ] , objBounds [ 0 ] [ i ] / dataScale [ i ] - pad ) ;
513
+ sceneBounds [ 1 ] [ i ] = Math . max ( sceneBounds [ 1 ] [ i ] , objBounds [ 1 ] [ i ] / dataScale [ i ] + pad ) ;
483
514
}
484
515
485
516
for ( j = 0 ; j < annotations . length ; j ++ ) {
0 commit comments