Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 78dcde9

Browse files
committed
Merge branch 'multiselect' into rescatter
2 parents 76c9fa9 + ca4aaae commit 78dcde9

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

src/lib/polygon.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ polygon.multitester = function multitester(list) {
186186

187187
for(var i = 0; i < list.length; i++) {
188188
var tester = polygon.tester(list[i]);
189+
tester.subtract = list[i].subtract;
189190
testers.push(tester);
190191
xmin = Math.min(xmin, tester.xmin);
191192
xmax = Math.max(xmax, tester.xmax);
@@ -194,10 +195,15 @@ polygon.multitester = function multitester(list) {
194195
}
195196

196197
function contains(pt, arg) {
198+
var yes = false;
197199
for(var i = 0; i < testers.length; i++) {
198-
if(testers[i].contains(pt, arg)) return true;
200+
if(testers[i].contains(pt, arg)) {
201+
// if contained by subtract polygon - exclude the point
202+
yes = testers[i].subtract === false;
203+
}
199204
}
200-
return false;
205+
206+
return yes;
201207
}
202208

203209
return {

src/plots/cartesian/dragbox.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,15 @@ module.exports = function dragBox(gd, plotinfo, x, y, w, h, ns, ew) {
173173
dragOptions.yaxes = ya;
174174

175175
// take over selection polygons from prev mode, if any
176-
if(e.shiftKey && plotinfo.selection.polygons && !dragOptions.polygons) {
176+
if((e.shiftKey || e.altKey) && (plotinfo.selection && plotinfo.selection.polygons) && !dragOptions.polygons) {
177177
dragOptions.polygons = plotinfo.selection.polygons;
178178
dragOptions.mergedPolygons = plotinfo.selection.mergedPolygons;
179179
}
180180
// create new polygons, if shift mode
181-
else if(!e.shiftKey || (e.shiftKey && !plotinfo.selection.polygons)) {
181+
else if((!e.shiftKey && !e.altKey) || ((e.shiftKey || e.altKey) && !plotinfo.selection)) {
182182
plotinfo.selection = {};
183183
plotinfo.selection.polygons = dragOptions.polygons = [];
184-
dragOptions.mergedPolygons = plotinfo.selection.mergedPolygons = [];
184+
plotinfo.selection.mergedPolygons = dragOptions.mergedPolygons = [];
185185
}
186186

187187
prepSelect(e, startX, startY, dragOptions, dragModeNow);

src/plots/cartesian/select.js

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) {
4141
xAxisIds = dragOptions.xaxes.map(getAxId),
4242
yAxisIds = dragOptions.yaxes.map(getAxId),
4343
allAxes = dragOptions.xaxes.concat(dragOptions.yaxes),
44-
filterPoly, testPoly, mergedPolygons, currentPolygon;
44+
filterPoly, testPoly, mergedPolygons, currentPolygon,
45+
subtract = e.altKey;
4546

4647
if(mode === 'lasso') {
4748
filterPoly = filteredPolygon([[x0, y0]], constants.BENDPX);
@@ -196,7 +197,8 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) {
196197

197198
// create outline & tester
198199
if(dragOptions.polygons && dragOptions.polygons.length) {
199-
mergedPolygons = joinPolygons(dragOptions.mergedPolygons, currentPolygon);
200+
mergedPolygons = mergePolygons(dragOptions.mergedPolygons, currentPolygon, subtract);
201+
currentPolygon.subtract = subtract;
200202
testPoly = multipolygonTester(dragOptions.polygons.concat([currentPolygon]));
201203
}
202204
else {
@@ -265,17 +267,33 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) {
265267

266268
if(currentPolygon && dragOptions.polygons) {
267269
// save last polygons
270+
currentPolygon.subtract = subtract;
268271
dragOptions.polygons.push(currentPolygon);
269272

270-
// we have to keep reference to arrays, therefore just replace items
271-
dragOptions.mergedPolygons.splice.apply(dragOptions.mergedPolygons, [0, dragOptions.mergedPolygons.length].concat(mergedPolygons));
273+
// we have to keep reference to arrays container
274+
dragOptions.mergedPolygons.length = 0;
275+
[].push.apply(dragOptions.mergedPolygons, mergedPolygons);
272276
}
273277
});
274278
};
275279
};
276280

277-
function joinPolygons(list, poly) {
278-
var res = polybool.union({
281+
function mergePolygons(list, poly, subtract) {
282+
var res;
283+
284+
if(subtract) {
285+
res = polybool.difference({
286+
regions: list,
287+
inverted: false
288+
}, {
289+
regions: [poly],
290+
inverted: false
291+
});
292+
293+
return res.regions;
294+
}
295+
296+
res = polybool.union({
279297
regions: list,
280298
inverted: false
281299
}, {

0 commit comments

Comments
 (0)