UNPKG

@visactor/vgrammar-core

Version:

VGrammar is a visual grammar library

84 lines (75 loc) 4.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.transform = void 0; const vutils_1 = require("@visactor/vutils"), constants_1 = require("../../graph/constants"); function reset(elements) { return elements.forEach((element => { element.getGraphicAttribute(constants_1.MARK_OVERLAP_HIDE_KEY) && (element.setGraphicAttribute("visible", !0), element.setGraphicAttribute(constants_1.MARK_OVERLAP_HIDE_KEY, !1)); })), elements; } function overlapX(elements, delta, deltaMul, useRadius) { if (useRadius) { let lastX = -1 / 0, lastR = 0; const useDeltaMul = (0, vutils_1.isNil)(delta); let itemDelta = delta; elements.forEach((element => { if (!1 === element.getGraphicAttribute("visible")) return; const r = element.getGraphicAttribute("size") / 2, currentX = element.getGraphicAttribute("x"); useDeltaMul && (itemDelta = (r + lastR) * deltaMul), Math.abs(currentX - lastX) < itemDelta + lastR + r ? element.getGraphicAttribute("forceShow") || (element.setGraphicAttribute(constants_1.MARK_OVERLAP_HIDE_KEY, !0), element.setGraphicAttribute("visible", !1)) : lastX = currentX, lastR = r; })); } } function overlapY(elements, delta, deltaMul, useRadius) { if (useRadius) { let lastY = -1 / 0, lastR = 0; const useDeltaMul = (0, vutils_1.isNil)(delta); let itemDelta = delta; elements.forEach((element => { if (!1 === element.getGraphicAttribute("visible")) return; const r = element.getGraphicAttribute("size") / 2, currentY = element.getGraphicAttribute("y"); useDeltaMul && (itemDelta = (r + lastR) * deltaMul), Math.abs(currentY - lastY) < itemDelta + lastR + r ? element.getGraphicAttribute("forceShow") || (element.setGraphicAttribute(constants_1.MARK_OVERLAP_HIDE_KEY, !0), element.setGraphicAttribute("visible", !1)) : lastY = currentY, lastR = r; })); } } function overlapXY(elements, delta, deltaMul, useRadius) { if (useRadius) { const lastX = -1 / 0; let lastY = -1 / 0, lastR = 0, dis = 0; const useDeltaMul = (0, vutils_1.isNil)(delta); let itemDelta = delta; elements.forEach((element => { if (!1 === element.getGraphicAttribute("visible")) return; const r = element.getGraphicAttribute("size") / 2, currentX = element.getGraphicAttribute("x"), currentY = element.getGraphicAttribute("y"); useDeltaMul && (itemDelta = (r + lastR) * deltaMul), dis = (lastX - currentX) ** 2 + (lastY - currentY) ** 2, dis < (itemDelta + lastR + r) ** 2 ? element.getGraphicAttribute("forceShow") || (element.setGraphicAttribute(constants_1.MARK_OVERLAP_HIDE_KEY, !0), element.setGraphicAttribute("visible", !1)) : lastY = currentY, lastR = r; })); } } const transform = (options, upstreamData) => { if (!upstreamData || 0 === upstreamData.length) return; let {radius: radius} = options; (0, vutils_1.isNil)(radius) && "symbol" === upstreamData[0].mark.markType && (radius = !0); const {direction: direction, delta: delta, deltaMul: deltaMul = 1, groupBy: groupBy} = options, handleOverlap = elements => { reset(elements); const sortedElements = options.sort ? elements.slice().sort(((a, b) => a.getGraphicAttribute("x") - b.getGraphicAttribute("x"))) : elements; 0 === direction ? overlapXY(sortedElements, delta, deltaMul, radius) : 1 === direction ? overlapX(sortedElements, delta, deltaMul, radius) : overlapY(sortedElements, delta, deltaMul, radius); }; if (groupBy) { const map = upstreamData.reduce(((res, element) => { const groupName = element.getDatum()[groupBy]; return res[groupName] ? res[groupName].push(element) : res[groupName] = [ element ], res; }), {}); Object.keys(map).forEach((key => { handleOverlap(map[key]); })); } else handleOverlap(upstreamData); return upstreamData; }; exports.transform = transform; //# sourceMappingURL=mark-overlap.js.map