(gd, trace, pa, mainData, _overlayEdgeCase)
| 240 | * bingroup. |
| 241 | */ |
| 242 | function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) { |
| 243 | var binAttr = mainData + 'bins'; |
| 244 | var fullLayout = gd._fullLayout; |
| 245 | var groupName = trace['_' + mainData + 'bingroup']; |
| 246 | var binOpts = fullLayout._histogramBinOpts[groupName]; |
| 247 | var isOverlay = fullLayout.barmode === 'overlay'; |
| 248 | var i, traces, tracei, calendar, pos0, autoVals, cumulativeSpec; |
| 249 | |
| 250 | var r2c = function(v) { return pa.r2c(v, 0, calendar); }; |
| 251 | var c2r = function(v) { return pa.c2r(v, 0, calendar); }; |
| 252 | |
| 253 | var cleanBound = pa.type === 'date' ? |
| 254 | function(v) { return (v || v === 0) ? Lib.cleanDate(v, null, calendar) : null; } : |
| 255 | function(v) { return isNumeric(v) ? Number(v) : null; }; |
| 256 | |
| 257 | function setBound(attr, bins, newBins) { |
| 258 | if(bins[attr + 'Found']) { |
| 259 | bins[attr] = cleanBound(bins[attr]); |
| 260 | if(bins[attr] === null) bins[attr] = newBins[attr]; |
| 261 | } else { |
| 262 | autoVals[attr] = bins[attr] = newBins[attr]; |
| 263 | Lib.nestedProperty(traces[0], binAttr + '.' + attr).set(newBins[attr]); |
| 264 | } |
| 265 | } |
| 266 | |
| 267 | // all but the first trace in this group has already been marked finished |
| 268 | // clear this flag, so next time we run calc we will run autobin again |
| 269 | if(trace['_' + mainData + 'autoBinFinished']) { |
| 270 | delete trace['_' + mainData + 'autoBinFinished']; |
| 271 | } else { |
| 272 | traces = binOpts.traces; |
| 273 | var allPos = []; |
| 274 | |
| 275 | // Note: we're including `legendonly` traces here for autobin purposes, |
| 276 | // so that showing & hiding from the legend won't affect bins. |
| 277 | // But this complicates things a bit since those traces don't `calc`, |
| 278 | // hence `isFirstVisible`. |
| 279 | var isFirstVisible = true; |
| 280 | var has2dMap = false; |
| 281 | var hasHist2dContour = false; |
| 282 | for(i = 0; i < traces.length; i++) { |
| 283 | tracei = traces[i]; |
| 284 | |
| 285 | if(tracei.visible) { |
| 286 | var mainDatai = binOpts.dirs[i]; |
| 287 | pos0 = tracei['_' + mainDatai + 'pos0'] = pa.makeCalcdata(tracei, mainDatai); |
| 288 | |
| 289 | allPos = Lib.concat(allPos, pos0); |
| 290 | delete tracei['_' + mainData + 'autoBinFinished']; |
| 291 | |
| 292 | if(trace.visible === true) { |
| 293 | if(isFirstVisible) { |
| 294 | isFirstVisible = false; |
| 295 | } else { |
| 296 | delete tracei._autoBin; |
| 297 | tracei['_' + mainData + 'autoBinFinished'] = 1; |
| 298 | } |
| 299 | if(Registry.traceIs(tracei, '2dMap')) { |
no test coverage detected
searching dependent graphs…