8
8
9
9
'use strict' ;
10
10
11
+ var Lib = require ( '../../lib' ) ;
11
12
var colorscaleCalc = require ( '../../components/colorscale/calc' ) ;
12
13
13
14
module . exports = function calc ( gd , trace ) {
14
- var i ;
15
+ var i , j , k ;
15
16
16
17
var u = trace . u ;
17
18
var v = trace . v ;
@@ -56,19 +57,114 @@ module.exports = function calc(gd, trace) {
56
57
var zMax = - Infinity ;
57
58
var zMin = Infinity ;
58
59
59
- for ( i = 0 ; i < len ; i ++ ) {
60
- var xx = x [ i ] ;
61
- xMax = Math . max ( xMax , xx ) ;
62
- xMin = Math . min ( xMin , xx ) ;
60
+ var gridFill = '' ;
61
+ var filledX ;
62
+ var filledY ;
63
+ var filledZ ;
64
+ var firstX ;
65
+ var firstY ;
66
+ var firstZ ;
67
+ if ( len ) {
68
+ firstX = x [ 0 ] ;
69
+ firstY = y [ 0 ] ;
70
+ firstZ = z [ 0 ] ;
71
+ }
63
72
64
- var yy = y [ i ] ;
65
- yMax = Math . max ( yMax , yy ) ;
66
- yMin = Math . min ( yMin , yy ) ;
73
+ for ( i = 0 ; i < len ; i ++ ) {
74
+ xMax = Math . max ( xMax , x [ i ] ) ;
75
+ xMin = Math . min ( xMin , x [ i ] ) ;
76
+
77
+ yMax = Math . max ( yMax , y [ i ] ) ;
78
+ yMin = Math . min ( yMin , y [ i ] ) ;
79
+
80
+ zMax = Math . max ( zMax , z [ i ] ) ;
81
+ zMin = Math . min ( zMin , z [ i ] ) ;
82
+
83
+ if ( ! filledX && x [ i ] !== firstX ) {
84
+ filledX = true ;
85
+ gridFill += 'x' ;
86
+ }
87
+ if ( ! filledY && y [ i ] !== firstY ) {
88
+ filledY = true ;
89
+ gridFill += 'y' ;
90
+ }
91
+ if ( ! filledZ && z [ i ] !== firstZ ) {
92
+ filledZ = true ;
93
+ gridFill += 'z' ;
94
+ }
95
+ }
96
+ // fill if not filled - case of having dimension(s) with one item
97
+ if ( ! filledX ) gridFill += 'x' ;
98
+ if ( ! filledY ) gridFill += 'y' ;
99
+ if ( ! filledZ ) gridFill += 'z' ;
100
+
101
+ var Xs = distinctVals ( trace . x . slice ( 0 , len ) ) ;
102
+ var Ys = distinctVals ( trace . y . slice ( 0 , len ) ) ;
103
+ var Zs = distinctVals ( trace . z . slice ( 0 , len ) ) ;
104
+
105
+ gridFill = gridFill . replace ( 'x' , ( x [ 0 ] > x [ len - 1 ] ? '-' : '+' ) + 'x' ) ;
106
+ gridFill = gridFill . replace ( 'y' , ( y [ 0 ] > y [ len - 1 ] ? '-' : '+' ) + 'y' ) ;
107
+ gridFill = gridFill . replace ( 'z' , ( z [ 0 ] > z [ len - 1 ] ? '-' : '+' ) + 'z' ) ;
108
+
109
+ var empty = function ( ) {
110
+ len = 0 ;
111
+ Xs = [ ] ;
112
+ Ys = [ ] ;
113
+ Zs = [ ] ;
114
+ } ;
115
+
116
+ // Over-specified mesh case, this would error in tube2mesh
117
+ if ( ! len || len < Xs . length * Ys . length * Zs . length ) empty ( ) ;
118
+
119
+ var getArray = function ( c ) { return c === 'x' ? x : c === 'y' ? y : z ; } ;
120
+ var getVals = function ( c ) { return c === 'x' ? Xs : c === 'y' ? Ys : Zs ; } ;
121
+ var getDir = function ( c ) { return ( c [ len - 1 ] < c [ 0 ] ) ? - 1 : 1 ; } ;
122
+
123
+ var arrK = getArray ( gridFill [ 1 ] ) ;
124
+ var arrJ = getArray ( gridFill [ 3 ] ) ;
125
+ var arrI = getArray ( gridFill [ 5 ] ) ;
126
+ var nk = getVals ( gridFill [ 1 ] ) . length ;
127
+ var nj = getVals ( gridFill [ 3 ] ) . length ;
128
+ var ni = getVals ( gridFill [ 5 ] ) . length ;
129
+
130
+ var arbitrary = false ;
131
+
132
+ var getIndex = function ( _i , _j , _k ) {
133
+ return nk * ( nj * _i + _j ) + _k ;
134
+ } ;
135
+
136
+ var dirK = getDir ( getArray ( gridFill [ 1 ] ) ) ;
137
+ var dirJ = getDir ( getArray ( gridFill [ 3 ] ) ) ;
138
+ var dirI = getDir ( getArray ( gridFill [ 5 ] ) ) ;
139
+
140
+ for ( i = 0 ; i < ni - 1 ; i ++ ) {
141
+ for ( j = 0 ; j < nj - 1 ; j ++ ) {
142
+ for ( k = 0 ; k < nk - 1 ; k ++ ) {
143
+ var q000 = getIndex ( i , j , k ) ;
144
+ var q001 = getIndex ( i , j , k + 1 ) ;
145
+ var q010 = getIndex ( i , j + 1 , k ) ;
146
+ var q100 = getIndex ( i + 1 , j , k ) ;
147
+
148
+ if (
149
+ ! ( arrK [ q000 ] * dirK < arrK [ q001 ] * dirK ) ||
150
+ ! ( arrJ [ q000 ] * dirJ < arrJ [ q010 ] * dirJ ) ||
151
+ ! ( arrI [ q000 ] * dirI < arrI [ q100 ] * dirI )
152
+ ) {
153
+ arbitrary = true ;
154
+ }
155
+
156
+ if ( arbitrary ) break ;
157
+ }
158
+ if ( arbitrary ) break ;
159
+ }
160
+ if ( arbitrary ) break ;
161
+ }
67
162
68
- var zz = z [ i ] ;
69
- zMax = Math . max ( zMax , zz ) ;
70
- zMin = Math . min ( zMin , zz ) ;
163
+ if ( arbitrary ) {
164
+ Lib . warn ( 'Encountered arbitrary coordinates! Unable to input data grid.' ) ;
165
+ empty ( ) ;
71
166
}
167
+
72
168
for ( i = 0 ; i < slen ; i ++ ) {
73
169
var sx = startx [ i ] ;
74
170
xMax = Math . max ( xMax , sx ) ;
@@ -89,4 +185,12 @@ module.exports = function calc(gd, trace) {
89
185
trace . _xbnds = [ xMin , xMax ] ;
90
186
trace . _ybnds = [ yMin , yMax ] ;
91
187
trace . _zbnds = [ zMin , zMax ] ;
188
+ trace . _Xs = Xs ;
189
+ trace . _Ys = Ys ;
190
+ trace . _Zs = Zs ;
191
+ trace . _gridFill = gridFill ;
92
192
} ;
193
+
194
+ function distinctVals ( col ) {
195
+ return Lib . distinctVals ( col ) . vals ;
196
+ }
0 commit comments