NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/lib/interaction/brush.js
2023-09-14 14:47:11 +08:00

548 lines
14 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
var Util = require('../util');
var Interaction = require('./base'); // const G2 = require('../core.js');
var BRUSH_TYPES = ['X', 'Y', 'XY', 'POLYGON'];
var DEFAULT_TYPE = 'XY';
var Brush = /*#__PURE__*/function (_Interaction) {
_inheritsLoose(Brush, _Interaction);
var _proto = Brush.prototype;
_proto.getDefaultCfg = function getDefaultCfg() {
var cfg = _Interaction.prototype.getDefaultCfg.call(this);
return Util.mix({}, cfg, {
type: DEFAULT_TYPE,
startPoint: null,
brushing: false,
dragging: false,
brushShape: null,
container: null,
polygonPath: null,
style: {
fill: '#C5D4EB',
opacity: 0.3,
lineWidth: 1,
stroke: '#82A6DD'
},
draggable: false,
dragOffX: 0,
dragOffY: 0,
inPlot: true,
xField: null,
yField: null
});
};
function Brush(cfg, view) {
var _this;
_this = _Interaction.call(this, cfg, view) || this;
var me = _assertThisInitialized(_this);
me.filter = !me.draggable;
me.type = me.type.toUpperCase();
me.chart = view;
if (!BRUSH_TYPES.includes(me.type)) {
me.type = DEFAULT_TYPE;
}
var canvas = me.canvas;
if (canvas) {
var plotRange;
canvas.get('children').map(function (child) {
if (child.get('type') === 'plotBack') {
plotRange = child.get('plotRange');
return false;
}
return child;
});
me.plot = {
start: plotRange.bl,
end: plotRange.tr
};
}
if (view) {
var coord = view.get('coord');
me.plot = {
start: coord.start,
end: coord.end
};
view.on('afterrender', function () {
me.plot = {
start: coord.start,
end: coord.end
};
});
me.isTransposed = coord.isTransposed;
var xScales = view._getScales('x');
var yScales = view._getScales('y');
me.xScale = me.xField ? xScales[me.xField] : view.getXScale();
me.yScale = me.yField ? yScales[me.yField] : view.getYScales()[0];
}
return _this;
} // onBurshstart() { }
// onBrushmove() { }
// onBrushend() {}
// onDragstart() {}
// onDragmove() {}
// onDragend() {}
_proto.start = function start(ev) {
var me = this;
var canvas = me.canvas,
type = me.type,
brushShape = me.brushShape;
if (!type) return;
if (me.brushing) {
// 鼠标移动到图表外up, 回到图表内点击即结束绘制mousedown的时候却正在绘制中
me.end(ev);
}
var startPoint = {
x: ev.offsetX,
y: ev.offsetY
};
if (!startPoint.x) return;
var isInPlot = me.plot && me.inPlot;
var canvasDOM = canvas.get('canvasDOM');
var pixelRatio = canvas.get('pixelRatio');
if (me.selection) me.selection = null;
if (me.draggable && brushShape && !brushShape.get('destroyed')) {
// allow drag the brushShape
if (brushShape.isHit(startPoint.x * pixelRatio, startPoint.y * pixelRatio)) {
canvasDOM.style.cursor = 'move';
me.selection = brushShape;
me.dragging = true;
if (type === 'X') {
me.dragoffX = startPoint.x - brushShape.attr('x');
me.dragoffY = 0;
} else if (type === 'Y') {
me.dragoffX = 0;
me.dragoffY = startPoint.y - brushShape.attr('y');
} else if (type === 'XY') {
me.dragoffX = startPoint.x - brushShape.attr('x');
me.dragoffY = startPoint.y - brushShape.attr('y');
} else if (type === 'POLYGON') {
var box = brushShape.getBBox();
me.dragoffX = startPoint.x - box.minX;
me.dragoffY = startPoint.y - box.minY;
}
if (isInPlot) {// me.selection.attr('clip', canvas.addShape('rect', {
// attrs: {
// x: this.plot.start.x,
// y: this.plot.end.y,
// width: this.plot.end.x - this.plot.start.x,
// height: this.plot.start.y - this.plot.end.y,
// fill: '#fff',
// fillOpacity: 0
// }
// }));
}
me.onDragstart && me.onDragstart(ev);
}
me.prePoint = startPoint;
}
if (!me.dragging) {
// brush start
me.onBrushstart && me.onBrushstart(startPoint);
var container = me.container;
if (isInPlot) {
var _me$plot = me.plot,
start = _me$plot.start,
end = _me$plot.end;
if (startPoint.x < start.x || startPoint.x > end.x || startPoint.y < end.y || startPoint.y > start.y) return;
}
canvasDOM.style.cursor = 'crosshair';
me.startPoint = startPoint;
me.brushShape = null;
me.brushing = true;
if (!container) {
container = canvas.addGroup({
zIndex: 5 // upper
});
container.initTransform();
} else {
container.clear();
}
me.container = container;
if (type === 'POLYGON') me.polygonPath = "M " + startPoint.x + " " + startPoint.y;
}
};
_proto.process = function process(ev) {
var me = this;
var brushing = me.brushing,
dragging = me.dragging,
type = me.type,
plot = me.plot,
startPoint = me.startPoint,
xScale = me.xScale,
yScale = me.yScale,
canvas = me.canvas;
if (!brushing && !dragging) {
return;
}
var currentPoint = {
x: ev.offsetX,
y: ev.offsetY
};
var canvasDOM = canvas.get('canvasDOM');
if (brushing) {
canvasDOM.style.cursor = 'crosshair';
var start = plot.start,
end = plot.end;
var polygonPath = me.polygonPath;
var brushShape = me.brushShape;
var container = me.container;
if (me.plot && me.inPlot) {
currentPoint = me._limitCoordScope(currentPoint);
}
var rectStartX;
var rectStartY;
var rectWidth;
var rectHeight;
if (type === 'Y') {
rectStartX = start.x;
rectStartY = currentPoint.y >= startPoint.y ? startPoint.y : currentPoint.y;
rectWidth = Math.abs(start.x - end.x);
rectHeight = Math.abs(startPoint.y - currentPoint.y);
} else if (type === 'X') {
rectStartX = currentPoint.x >= startPoint.x ? startPoint.x : currentPoint.x;
rectStartY = end.y;
rectWidth = Math.abs(startPoint.x - currentPoint.x);
rectHeight = Math.abs(end.y - start.y);
} else if (type === 'XY') {
if (currentPoint.x >= startPoint.x) {
rectStartX = startPoint.x;
rectStartY = currentPoint.y >= startPoint.y ? startPoint.y : currentPoint.y;
} else {
rectStartX = currentPoint.x;
rectStartY = currentPoint.y >= startPoint.y ? startPoint.y : currentPoint.y;
}
rectWidth = Math.abs(startPoint.x - currentPoint.x);
rectHeight = Math.abs(startPoint.y - currentPoint.y);
} else if (type === 'POLYGON') {
polygonPath += "L " + currentPoint.x + " " + currentPoint.y;
me.polygonPath = polygonPath;
if (!brushShape) {
brushShape = container.addShape('path', {
attrs: Util.mix(me.style, {
path: polygonPath
})
});
} else {
!brushShape.get('destroyed') && brushShape.attr(Util.mix({}, brushShape._attrs, {
path: polygonPath
}));
}
}
if (type !== 'POLYGON') {
if (!brushShape) {
brushShape = container.addShape('rect', {
attrs: Util.mix(me.style, {
x: rectStartX,
y: rectStartY,
width: rectWidth,
height: rectHeight
})
});
} else {
!brushShape.get('destroyed') && brushShape.attr(Util.mix({}, brushShape._attrs, {
x: rectStartX,
y: rectStartY,
width: rectWidth,
height: rectHeight
}));
}
}
me.brushShape = brushShape;
} else if (dragging) {
canvasDOM.style.cursor = 'move';
var selection = me.selection;
if (selection && !selection.get('destroyed')) {
if (type === 'POLYGON') {
var prePoint = me.prePoint;
me.selection.translate(currentPoint.x - prePoint.x, currentPoint.y - prePoint.y);
} else {
me.dragoffX && selection.attr('x', currentPoint.x - me.dragoffX);
me.dragoffY && selection.attr('y', currentPoint.y - me.dragoffY);
}
}
}
me.prePoint = currentPoint;
canvas.draw();
var _me$_getSelected = me._getSelected(),
data = _me$_getSelected.data,
shapes = _me$_getSelected.shapes,
xValues = _me$_getSelected.xValues,
yValues = _me$_getSelected.yValues;
var eventObj = {
data: data,
shapes: shapes
};
if (xScale) {
eventObj[xScale.field] = xValues;
}
if (yScale) {
eventObj[yScale.field] = yValues;
} // 将框选的数据传递给 ev供 onEnd 钩子使用
Util.mix(ev, eventObj);
eventObj.x = currentPoint.x;
eventObj.y = currentPoint.y;
me.onDragmove && me.onDragmove(eventObj);
me.onBrushmove && me.onBrushmove(eventObj);
};
_proto.end = function end(ev) {
var me = this;
if (!me.brushing && !me.dragging) {
return;
}
var data = me.data,
shapes = me.shapes,
xValues = me.xValues,
yValues = me.yValues,
canvas = me.canvas,
type = me.type,
startPoint = me.startPoint,
chart = me.chart,
container = me.container,
xScale = me.xScale,
yScale = me.yScale;
var offsetX = ev.offsetX,
offsetY = ev.offsetY;
var canvasDOM = canvas.get('canvasDOM');
canvasDOM.style.cursor = 'default';
if (startPoint === null) {
return;
}
if (Math.abs(startPoint.x - offsetX) <= 1 && Math.abs(startPoint.y - offsetY) <= 1) {
// 防止点击事件
me.brushing = false;
me.dragging = false;
container.clear();
canvas.draw();
return;
}
var eventObj = {
data: data,
shapes: shapes
};
if (xScale) {
eventObj[xScale.field] = xValues;
}
if (yScale) {
eventObj[yScale.field] = yValues;
} // 将框选的数据传递给 ev供 onEnd 钩子使用
Util.mix(ev, eventObj);
eventObj.x = offsetX;
eventObj.y = offsetY;
if (me.dragging) {
me.dragging = false;
me.onDragend && me.onDragend(eventObj);
} else if (me.brushing) {
me.brushing = false;
var brushShape = me.brushShape;
var polygonPath = me.polygonPath;
if (type === 'POLYGON') {
polygonPath += 'z';
brushShape && !brushShape.get('destroyed') && brushShape.attr(Util.mix({}, brushShape._attrs, {
path: polygonPath
}));
me.polygonPath = polygonPath;
canvas.draw();
}
if (me.onBrushend) {
me.onBrushend(eventObj);
} else if (chart && me.filter) {
container.clear(); // clear the brush
// filter data
if (!me.isTransposed && type === 'X' || me.isTransposed && type === 'Y') {
xScale && chart.filter(xScale.field, function (val) {
return xValues.indexOf(val) > -1;
});
} else if (!me.isTransposed && type === 'Y' || me.isTransposed && type === 'X') {
yScale && chart.filter(yScale.field, function (val) {
return yValues.indexOf(val) > -1;
});
} else {
xScale && chart.filter(xScale.field, function (val) {
return xValues.indexOf(val) > -1;
});
yScale && chart.filter(yScale.field, function (val) {
return yValues.indexOf(val) > -1;
});
}
chart.repaint();
}
}
};
_proto.reset = function reset() {
var me = this;
var chart = me.chart,
filter = me.filter,
brushShape = me.brushShape,
canvas = me.canvas;
this._init(); // 重置各种参考值
if (chart && filter) {
chart.get('options').filters = {};
chart.repaint();
}
if (brushShape) {
brushShape.destroy();
canvas.draw();
}
};
_proto._limitCoordScope = function _limitCoordScope(point) {
var plot = this.plot;
var start = plot.start,
end = plot.end;
if (point.x < start.x) {
point.x = start.x;
}
if (point.x > end.x) {
point.x = end.x;
}
if (point.y < end.y) {
point.y = end.y;
}
if (point.y > start.y) {
point.y = start.y;
}
return point;
};
_proto._getSelected = function _getSelected() {
var me = this;
var chart = me.chart,
xScale = me.xScale,
yScale = me.yScale,
brushShape = me.brushShape,
canvas = me.canvas;
var pixelRatio = canvas.get('pixelRatio');
var selectedShapes = [];
var xValues = [];
var yValues = [];
var selectedData = [];
if (chart) {
var geoms = chart.get('geoms');
geoms.map(function (geom) {
var shapes = geom.getShapes();
shapes.map(function (shape) {
var shapeData = shape.get('origin');
if (!Array.isArray(shapeData)) {
// 线图、区域图等
shapeData = [shapeData];
}
shapeData.map(function (each) {
if (brushShape.isHit(each.x * pixelRatio, each.y * pixelRatio)) {
selectedShapes.push(shape);
var origin = each._origin;
selectedData.push(origin);
xScale && xValues.push(origin[xScale.field]);
yScale && yValues.push(origin[yScale.field]);
}
return each;
});
return shape;
});
return geom;
});
}
me.shapes = selectedShapes;
me.xValues = xValues;
me.yValues = yValues;
me.data = selectedData;
canvas.draw();
return {
data: selectedData,
xValues: xValues,
yValues: yValues,
shapes: selectedShapes
};
};
return Brush;
}(Interaction); // G2.registerInteraction('brush', Brush);
// G2.registerInteraction('Brush', Brush);
module.exports = Brush;