NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/esm/interaction/action/util.js

361 lines
9.7 KiB
Java
Raw Normal View History

2023-09-14 14:47:11 +08:00
import { each, isArray } from '@antv/util';
import { catmullRom2bezier, getLinePath } from '../../geometry/shape/util/path';
import { toPoints } from '../../util/bbox';
import isPolygonsIntersect from '@antv/path-util/lib/is-polygons-intersect';
function getMaskBBox(context, tolerance) {
var event = context.event;
var maskShape = event.target;
var maskBBox = maskShape.getCanvasBBox();
// 如果 bbox 过小则不返回
if (!(maskBBox.width >= tolerance || maskBBox.height >= tolerance)) {
return null;
}
return maskBBox;
}
function getMaskPath(context, tolerance) {
var event = context.event;
var maskShape = event.target;
var maskBBox = maskShape.getCanvasBBox();
// 如果 bbox 过小则不返回
if (!(maskBBox.width >= tolerance || maskBBox.height >= tolerance)) {
return null;
}
return maskShape.attr('path');
}
/**
* 获取当前事件相关的图表元素
* @param context 交互的上下文
* @ignore
*/
export function getCurrentElement(context) {
var event = context.event;
var element;
var target = event.target;
if (target) {
element = target.get('element');
}
return element;
}
/**
* 获取委托对象
* @param context 上下文
* @ignore
*/
export function getDelegationObject(context) {
var event = context.event;
var target = event.target;
var delegateObject;
if (target) {
delegateObject = target.get('delegateObject');
}
return delegateObject;
}
export function isElementChange(context) {
var event = context.event.gEvent;
// 在同一个 element 内部移动label 和 shape 之间
if (event && event.fromShape && event.toShape && event.fromShape.get('element') === event.toShape.get('element')) {
return false;
}
return true;
}
/**
* 是否是列表组件
* @param delegateObject 委托对象
* @ignore
*/
export function isList(delegateObject) {
return delegateObject && delegateObject.component && delegateObject.component.isList();
}
/**
* 是否是滑块组件
* @param delegateObject 委托对象
* @ignore
*/
export function isSlider(delegateObject) {
return delegateObject && delegateObject.component && delegateObject.component.isSlider();
}
/**
* 是否由 mask 触发
* @param context 上下文
* @ignore
*/
export function isMask(context) {
var event = context.event;
var target = event.target;
return target && target.get('name') === 'mask';
}
/**
* 获取被遮挡的 elements
* @param context 上下文
* @ignore
*/
export function getMaskedElements(context, tolerance) {
var target = context.event.target;
if (target.get('type') === 'path') {
var maskPath = getMaskPath(context, tolerance);
if (!maskPath) {
return;
}
return getElementsByPath(context.view, maskPath);
}
var maskBBox = getMaskBBox(context, tolerance);
// 如果 bbox 过小则不返回
if (!maskBBox) {
return null;
}
return getIntersectElements(context.view, maskBBox);
}
/**
* @ignore
*/
export function getSiblingMaskElements(context, sibling, tolerance) {
var maskBBox = getMaskBBox(context, tolerance);
// 如果 bbox 过小则不返回
if (!maskBBox) {
return null;
}
var view = context.view;
var start = getSiblingPoint(view, sibling, { x: maskBBox.x, y: maskBBox.y });
var end = getSiblingPoint(view, sibling, { x: maskBBox.maxX, y: maskBBox.maxY });
var box = {
minX: start.x,
minY: start.y,
maxX: end.x,
maxY: end.y
};
return getIntersectElements(sibling, box);
}
/**
* 获取所有的图表元素
* @param view View/Chart
* @ignore
*/
export function getElements(view) {
var geometries = view.geometries;
var rst = [];
each(geometries, function (geom) {
var elements = geom.elements;
rst = rst.concat(elements);
});
if (view.views && view.views.length) {
each(view.views, function (subView) {
rst = rst.concat(getElements(subView));
});
}
return rst;
}
/**
* 获取所有的图表元素
* @param view View/Chart
* @param field 字段名
* @param value 字段值
* @ignore
*/
export function getElementsByField(view, field, value) {
var elements = getElements(view);
return elements.filter(function (el) {
return getElementValue(el, field) === value;
});
}
/**
* 根据状态名获取图表元素
* @param view View/Chart
* @param stateName 状态名
* @ignore
*/
export function getElementsByState(view, stateName) {
var geometries = view.geometries;
var rst = [];
each(geometries, function (geom) {
var elements = geom.getElementsBy(function (el) { return el.hasState(stateName); });
rst = rst.concat(elements);
});
return rst;
}
/**
* 获取图表元素对应字段的值
* @param element 图表元素
* @param field 字段名
* @ignore
*/
export function getElementValue(element, field) {
var model = element.getModel();
var record = model.data;
var value;
if (isArray(record)) {
value = record[0][field];
}
else {
value = record[field];
}
return value;
}
/**
* 两个包围盒是否相交
* @param box1 包围盒1
* @param box2 包围盒2
* @ignore
*/
export function intersectRect(box1, box2) {
return !(box2.minX > box1.maxX || box2.maxX < box1.minX || box2.minY > box1.maxY || box2.maxY < box1.minY);
}
/**
* 获取包围盒内的图表元素
* @param view View/Chart
* @param box 包围盒
* @ignore
*/
export function getIntersectElements(view, box) {
var elements = getElements(view);
var rst = [];
each(elements, function (el) {
var shape = el.shape;
var shapeBBox = shape.getCanvasBBox();
if (intersectRect(box, shapeBBox)) {
rst.push(el);
}
});
return rst;
}
function pathToPoints(path) {
var points = [];
each(path, function (seg) {
var command = seg[0];
if (command !== 'A') {
for (var i = 1; i < seg.length; i = i + 2) {
points.push([seg[i], seg[i + 1]]);
}
}
else {
var length_1 = seg.length;
points.push([seg[length_1 - 2], seg[length_1 - 1]]);
}
});
return points;
}
/**
* 获取包围盒内的图表元素
* @param view View/Chart
* @param path 路径
* @ignore
*/
export function getElementsByPath(view, path) {
var elements = getElements(view);
var points = pathToPoints(path);
var rst = elements.filter(function (el) {
var shape = el.shape;
var shapePoints;
if (shape.get('type') === 'path') {
shapePoints = pathToPoints(shape.attr('path'));
}
else {
var shapeBBox = shape.getCanvasBBox();
shapePoints = toPoints(shapeBBox);
}
return isPolygonsIntersect(points, shapePoints);
});
return rst;
}
/**
* 获取当前 View 的所有组件
* @param view View/Chart
* @ignore
*/
export function getComponents(view) {
return view.getComponents().map(function (co) { return co.component; });
}
/** @ignore */
export function distance(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
return Math.sqrt(dx * dx + dy * dy);
}
/** @ignore */
export function getSpline(points, z) {
if (points.length <= 2) {
return getLinePath(points, false);
}
var first = points[0];
var arr = [];
each(points, function (point) {
arr.push(point.x);
arr.push(point.y);
});
var path = catmullRom2bezier(arr, z, null);
path.unshift(['M', first.x, first.y]);
return path;
}
/**
* 检测点是否在包围盒内
* @param box 包围盒
* @param point
* @ignore
*/
export function isInBox(box, point) {
return box.x <= point.x && box.maxX >= point.x && box.y <= point.y && box.maxY > point.y;
}
/**
* 获取同 view 同一级的 views
* @param view 当前 view
* @returns 同一级的 views
* @ignore
*/
export function getSilbings(view) {
var parent = view.parent;
var siblings = null;
if (parent) {
siblings = parent.views.filter(function (sub) { return sub !== view; });
}
return siblings;
}
function point2Normalize(view, point) {
var coord = view.getCoordinate();
return coord.invert(point);
}
/**
* view 上的一点转换成另一个 view 的点
* @param view 当前的 view
* @param sibling 同一层级的 view
* @param point 指定点
* @ignore
*/
export function getSiblingPoint(view, sibling, point) {
var normalPoint = point2Normalize(view, point);
return sibling.getCoordinate().convert(normalPoint);
}
/**
* 是否在记录中临时因为所有的 view 中的数据不是引用而使用的方法
* 不同 view 上对数据的引用不相等导致无法直接用 includes
* 假设 x, y 值相等时是同一条数据这个假设不完全正确而改成 isEqual 则成本太高
* 后面改成同一个引用时可以修改回来
* @param records
* @param record
* @param xFiled
* @param yField
* @returns
* @ignore
*/
export function isInRecords(records, record, xFiled, yField) {
var isIn = false;
each(records, function (r) {
if (r[xFiled] === record[xFiled] && r[yField] === record[yField]) {
isIn = true;
return false;
}
});
return isIn;
}
// 级联获取 field 对应的 scale如果 view 上没有,遍历子 view
export function getScaleByField(view, field) {
var scale = view.getScaleByField(field);
if (!scale && view.views) {
each(view.views, function (subView) {
scale = getScaleByField(subView, field);
if (scale) {
return false; // 终止循环
}
});
}
return scale;
}
//# sourceMappingURL=util.js.map