import type { DisplayObject } from '@antv/g';
/**
* 获取图形的所有子元素
*
* Get all the child elements of the shape
* @param shape - 图形元素 | shape
* @returns 子元素数组 | child elements array
*/
export function getDescendantShapes(shape: T) {
const succeeds: DisplayObject[] = [];
// 遍历所有子元素,并将子元素的子元素加入到数组中
const traverse = (shape: DisplayObject) => {
if (shape?.children.length) {
(shape.children as DisplayObject[]).forEach((child) => {
succeeds.push(child);
traverse(child);
});
}
};
traverse(shape);
return succeeds;
}
/**
* 获取图形的所有祖先元素
*
* Get all the ancestor elements of the shape
* @param shape - 图形元素 | shape
* @returns 祖先元素数组 | ancestor elements array
*/
export function getAncestorShapes(shape: T) {
const ancestors: DisplayObject[] = [];
let currentNode = shape.parentNode as DisplayObject;
while (currentNode) {
ancestors.push(currentNode);
currentNode = currentNode.parentNode as DisplayObject;
}
return ancestors;
}