Skip to content

Commit c52fbe7

Browse files
committedMay 28, 2018
fix #2671 - fix transform on 'scattergl' traces
- by mapping 'selectedpoints' input their post-transform values, using trace._indexToPoints - by clearing 'dirty' flag after 1st of 2 _module.calc call, so that 2nd _module.calc does not append phony batches to scene render queue.
1 parent b042f93 commit c52fbe7

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed
 

‎src/lib/index.js

+36-7
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,17 @@ lib.extractOption = function(calcPt, trace, calcKey, traceKey) {
478478
if(!Array.isArray(traceVal)) return traceVal;
479479
};
480480

481+
function makePtIndex2PtNumber(indexToPoints) {
482+
var ptIndex2ptNumber = {};
483+
for(var k in indexToPoints) {
484+
var pts = indexToPoints[k];
485+
for(var j = 0; j < pts.length; j++) {
486+
ptIndex2ptNumber[pts[j]] = +k;
487+
}
488+
}
489+
return ptIndex2ptNumber;
490+
}
491+
481492
/** Tag selected calcdata items
482493
*
483494
* N.B. note that point 'index' corresponds to input data array index
@@ -498,13 +509,7 @@ lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) {
498509

499510
// make pt index-to-number map object, which takes care of transformed traces
500511
if(indexToPoints) {
501-
ptIndex2ptNumber = {};
502-
for(var k in indexToPoints) {
503-
var pts = indexToPoints[k];
504-
for(var j = 0; j < pts.length; j++) {
505-
ptIndex2ptNumber[pts[j]] = k;
506-
}
507-
}
512+
ptIndex2ptNumber = makePtIndex2PtNumber(indexToPoints);
508513
}
509514

510515
function isCdIndexValid(v) {
@@ -525,6 +530,30 @@ lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) {
525530
}
526531
};
527532

533+
lib.selIndices2selPoints = function(trace) {
534+
var selectedpoints = trace.selectedpoints;
535+
var indexToPoints = trace._indexToPoints;
536+
537+
if(indexToPoints) {
538+
var ptIndex2ptNumber = makePtIndex2PtNumber(indexToPoints);
539+
var out = [];
540+
541+
for(var i = 0; i < selectedpoints.length; i++) {
542+
var ptIndex = selectedpoints[i];
543+
if(lib.isIndex(ptIndex)) {
544+
var ptNumber = ptIndex2ptNumber[ptIndex];
545+
if(lib.isIndex(ptNumber)) {
546+
out.push(ptNumber);
547+
}
548+
}
549+
}
550+
551+
return out;
552+
} else {
553+
return selectedpoints;
554+
}
555+
};
556+
528557
/** Returns target as set by 'target' transform attribute
529558
*
530559
* @param {object} trace : full trace object

‎src/plots/plots.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -2342,7 +2342,15 @@ plots.doCalcdata = function(gd, traces) {
23422342
// we need one round of trace module calc before
23432343
// the calc transform to 'fill in' the categories list
23442344
// used for example in the data-to-coordinate method
2345-
if(_module && _module.calc) _module.calc(gd, trace);
2345+
if(_module && _module.calc) {
2346+
var cdi = _module.calc(gd, trace);
2347+
2348+
// must clear scene 'batches', so that 2nd
2349+
// _module.calc call starts from scratch
2350+
if(cdi[0] && cdi[0].t && cdi[0].t._scene) {
2351+
delete cdi[0].t._scene.dirty;
2352+
}
2353+
}
23462354

23472355
for(j = 0; j < trace.transforms.length; j++) {
23482356
var transform = trace.transforms[j];

‎src/traces/scattergl/index.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -492,12 +492,11 @@ function plot(gd, subplot, cdata) {
492492

493493
// regenerate scene batch, if traces number changed during selection
494494
if(trace.selectedpoints) {
495-
scene.selectBatch[id] = trace.selectedpoints;
495+
var selPts = scene.selectBatch[id] = Lib.selIndices2selPoints(trace);
496496

497-
var selPts = trace.selectedpoints;
498497
var selDict = {};
499498
for(i = 0; i < selPts.length; i++) {
500-
selDict[selPts[i]] = true;
499+
selDict[selPts[i]] = 1;
501500
}
502501
var unselPts = [];
503502
for(i = 0; i < stash.count; i++) {

0 commit comments

Comments
 (0)