Files
railwaysystem/RuoYi-Vue/ruoyi-ui/node_modules2/@antv/g-svg/src/group.ts
T
2026-09-10 15:40:10 +08:00

100 lines
2.5 KiB
TypeScript

import { AbstractGroup } from '@antv/g-base';
import { ChangeType } from '@antv/g-base';
import { each } from '@antv/util';
import { IElement, IGroup } from './interfaces';
import * as Shape from './shape';
import Defs from './defs';
import { drawChildren, refreshElement } from './util/draw';
import { setClip, setTransform } from './util/svg';
import { SVG_ATTR_MAP } from './constant';
import { createSVGElement } from './util/dom';
class Group extends AbstractGroup {
// SVG 中分组对应实体标签 <g>
isEntityGroup() {
return true;
}
createDom() {
const element = createSVGElement('g');
this.set('el', element);
const parent = this.getParent();
if (parent) {
let parentNode = parent.get('el');
if (parentNode) {
parentNode.appendChild(element);
} else {
// parentNode maybe null for group
parentNode = (parent as IGroup).createDom();
parent.set('el', parentNode);
parentNode.appendChild(element);
}
}
return element;
}
// 覆盖基类的 afterAttrsChange 方法
afterAttrsChange(targetAttrs) {
super.afterAttrsChange(targetAttrs);
const canvas = this.get('canvas');
// 只有挂载到画布下,才对元素进行实际渲染
if (canvas && canvas.get('autoDraw')) {
const context = canvas.get('context');
this.createPath(context, targetAttrs);
}
}
/**
* 一些方法调用会引起画布变化
* @param {ChangeType} changeType 改变的类型
*/
onCanvasChange(changeType: ChangeType) {
refreshElement(this, changeType);
}
getShapeBase() {
return Shape;
}
getGroupBase() {
return Group;
}
draw(context: Defs) {
const children = this.getChildren() as IElement[];
const el = this.get('el');
if (this.get('destroyed')) {
if (el) {
el.parentNode.removeChild(el);
}
} else {
if (!el) {
this.createDom();
}
setClip(this, context);
this.createPath(context);
if (children.length) {
drawChildren(context, children);
}
}
}
/**
* 绘制分组的路径
* @param {Defs} context 上下文
* @param {ShapeAttrs} targetAttrs 渲染的目标属性
*/
createPath(context: Defs, targetAttrs?) {
const attrs = this.attr();
const el = this.get('el');
each(targetAttrs || attrs, (value, attr) => {
if (SVG_ATTR_MAP[attr]) {
el.setAttribute(SVG_ATTR_MAP[attr], value);
}
});
setTransform(this);
}
}
export default Group;