Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c52fbe7

Browse filesBrowse files
committed
fix plotly#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
Copy full SHA for c52fbe7

File tree

Expand file treeCollapse file tree

3 files changed

+47
-11
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+47
-11
lines changed

‎src/lib/index.js

Copy file name to clipboardExpand all lines: src/lib/index.js
+36-7Lines changed: 36 additions & 7 deletions
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

Copy file name to clipboardExpand all lines: src/plots/plots.js
+9-1Lines changed: 9 additions & 1 deletion
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

Copy file name to clipboardExpand all lines: src/traces/scattergl/index.js
+2-3Lines changed: 2 additions & 3 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.