{"version":3,"file":"limit-in-plot.js","sourceRoot":"","sources":["../../../../src/geometry/label/layout/limit-in-plot.ts"],"names":[],"mappings":"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","sourcesContent":["import { each, pick } from '@antv/util';\nimport { BBox, IGroup, IShape } from '../../../dependents';\nimport { getCoordinateBBox } from '../../../util/coordinate';\nimport { getEllipsisText } from '../../../util/text';\nimport { translate } from '../../../util/transform';\nimport { LabelItem } from '../interface';\n\n/** limitInPlot layout 的可选配置 */\nexport interface LimitInPlotLayoutCfg {\n /** 需要限制哪些方向上不能超过 Plot 范围,默认四个方向上都限制 */\n direction?: ('top' | 'right' | 'bottom' | 'left')[];\n /** 可以允许的 margin */\n margin?: number;\n /** 超过限制后的动作,默认 translate 移动位置; ellipsis 对 text 进行省略展示 */\n action?: 'hide' | 'translate' | 'ellipsis';\n}\n\n/**\n * @ignore\n * 将 label 限制在 Plot 范围内,将超出 Plot 范围的 label 可选择进行隐藏或者移动位置\n * @param labels\n * @param cfg\n */\nexport function limitInPlot(\n items: LabelItem[],\n labels: IGroup[],\n shapes: IShape[] | IGroup[],\n region: BBox,\n cfg?: LimitInPlotLayoutCfg\n) {\n if (labels.length <= 0) {\n return;\n }\n const direction = cfg?.direction || ['top', 'right', 'bottom', 'left'];\n const action = cfg?.action || 'translate';\n const margin = cfg?.margin || 0;\n const coordinate = labels[0].get('coordinate');\n if (!coordinate) {\n return;\n }\n const {\n minX: regionMinX,\n minY: regionMinY,\n maxX: regionMaxX,\n maxY: regionMaxY,\n } = getCoordinateBBox(coordinate, margin);\n\n each(labels, (label: IGroup) => {\n const { minX, minY, maxX, maxY, x, y, width, height } = label.getCanvasBBox();\n\n let finalX = x;\n let finalY = y;\n if (direction.indexOf('left') >= 0 && (minX < regionMinX || maxX < regionMinX)) {\n // 超出左侧\n finalX = regionMinX;\n }\n if (direction.indexOf('top') >= 0 && (minY < regionMinY || maxY < regionMinY)) {\n // 超出顶部\n finalY = regionMinY;\n }\n\n if (direction.indexOf('right') >= 0) {\n if (minX > regionMaxX) {\n // 整体超出右侧\n finalX = regionMaxX - width;\n } else if (maxX > regionMaxX) {\n // 超出右侧\n finalX = finalX - (maxX - regionMaxX);\n }\n }\n\n if (direction.indexOf('bottom') >= 0) {\n if (minY > regionMaxY) {\n // 整体超出底部\n finalY = regionMaxY - height;\n } else if (maxY > regionMaxY) {\n // 超出底部\n finalY = finalY - (maxY - regionMaxY);\n }\n }\n\n if (finalX !== x || finalY !== y) {\n const translateX = finalX - x;\n if (action === 'translate') {\n translate(label, translateX, finalY - y);\n } else if (action === 'ellipsis') {\n const textShapes = label.findAll((shape) => shape.get('type') === 'text');\n textShapes.forEach((textShape) => {\n const style = pick(textShape.attr(), ['fontSize', 'fontFamily', 'fontWeight', 'fontStyle', 'fontVariant']);\n const textBox = textShape.getCanvasBBox();\n const text = getEllipsisText(textShape.attr('text'), textBox.width - Math.abs(translateX), style);\n textShape.attr('text', text);\n });\n } else {\n label.hide();\n }\n }\n });\n}\n"]}