/// import { deepMix, mix, debounce, each, throttle, isNil, isArray, remove, extend, augment, clone, uniqueId, isNumber, isPlainObject, isString, isObject, wrapBehavior, upperFirst, } from '@antv/util'; import vec2 from '@antv/util/lib/matrix/vec2'; import vec3 from '@antv/util/lib/matrix/vec3'; import mat3 from '@antv/util/lib/matrix/mat3'; import transform from '@antv/util/lib/matrix/transform'; import createDom from '@antv/util/lib/dom/create-dom'; import modifyCSS from '@antv/util/lib/dom/modify-css'; import addEventListener from '@antv/util/lib/dom/add-event-listener'; import { G } from './g'; /** * 元素类型 */ type ElementType = 'node' | 'edge'; interface IMode { type: string; [key: string]: any; } interface G6Event extends MouseEvent { item: G6.Node & G6.Edge; target: any; } // tslint:disable-next-line:export-just-namespace export = G6; export as namespace G6; declare namespace G6 { interface EdgeConfig { source: string; target: string; [key: string]: any; } interface NodeConfig { id?: string; [key: string]: any; } /** * 坐标点 */ interface Point { x: number; y: number; } /** * 矩形 */ interface Rect extends Point { width: number; height: number; } /** * 圆 */ interface Circle extends Point { r: number; } /** * 椭圆 */ interface Ellipse extends Point { rx: number; ry: number; } export class Item { constructor(cfg: any); isItem(): boolean; getDefaultCfg(): any; getKeyShapeStyle(): any; /** * 获取当前元素的所有状态 * @return {Array} 元素的所有状态 */ getStates(): any; /** * 当前元素是否处于某状态 * @param {String} state 状态名 * @return {Boolean} 是否处于某状态 */ hasState(state: string): boolean; getStateStyle(state: string): any; getOriginStyle(): any; getCurrentStatesStyle(): any; /** * 更改元素状态, visible 不属于这个范畴 * @internal 仅提供内部类 graph 使用 * @param {String} state 状态名 * @param {Boolean} enable 节点状态值 */ setState(state: string, enable: boolean): void; clearStates(states: string | string[]): void; /** * 节点的图形容器 * @return {G.Group} 图形容器 */ getContainer(): G.Group; /** * 节点的关键形状,用于计算节点大小,连线截距等 * @return {G.Shape} 关键形状 */ getKeyShape(): G.Shape; /** * 节点数据模型 * @return {Object} 数据模型 */ getModel(): T; /** * 节点类型 * @return {string} 节点的类型 */ getType(): string; getShapeCfg(model: any): any; /** * 刷新一般用于处理几种情况 * 1. item model 在外部被改变 * 2. 边的节点位置发生改变,需要重新计算边 * * 因为数据从外部被修改无法判断一些属性是否被修改,直接走位置和 shape 的更新 */ refresh(): void; /** * 将更新应用到 model 上,刷新属性 * @internal 仅提供给 Graph 使用,外部直接调用 graph.update 接口 * @param {Object} cfg 配置项,可以是增量信息 */ update(cfg: any): void; /** * 更新元素内容,样式 */ updateShape(): void; /** * 更新位置,避免整体重绘 * @param {object} cfg 待更新数据 */ updatePosition(cfg: any): void; /** * 更新/刷新等操作后,清除 cache */ clearCache(): void; /** * 绘制元素 */ draw(): void; /** * 获取元素的包围盒 */ getBBox(): G.Box; /** * 将元素放到最前面 */ toFront(): void; /** * 将元素放到最后面 */ toBack(): void; /** * 显示元素 */ show(): void; /** * 隐藏元素 */ hide(): void; /** * 更改是否显示 * @param {Boolean} visible 是否显示 */ changeVisibility(visible: boolean): void; /** * 是否捕获及触发该元素的交互事件 * @param {Boolean} enable 标识位 */ enableCapture(enable: boolean): void; isVisible(): boolean; get(key: string): any; set(key: string, value: any): void; } export class Edge extends Item { setSource(source: any): void; setTarget(target: any): void; getSource(): any; getTarget(): any; } export class Node extends Item { /** * 获取从节点关联的所有边 * @return {Array} 边的集合 */ getEdges(): Edge[]; /** * 获取引入节点的边 target == this * @return {Array} 边的集合 */ getInEdges(): any[]; /** * 获取从节点引出的边 source == this * @return {Array} 边的集合 */ getOutEdges(): any[]; /** * 根据锚点的索引获取连接点 * @param {Number} index 索引 * @return {Object} 连接点 {x,y} */ getLinkPointByAnchor(index: number): G6.Point; /** * 获取连接点 * @param {Object} point 节点外面的一个点,用于计算交点、最近的锚点 * @return {Object} 连接点 {x,y} */ getLinkPoint(point: G6.Point): G6.Point; /** * 添加边 * @param {Edge} edge 边 */ addEdge(edge: Edge): void; /** * 移除边 * @param {Edge} edge 边 */ removeEdge(edge: Edge): void; clearCache(): void; /** * 获取锚点的定义 * @return {array} anchorPoints, {x,y,...cfg} */ getAnchorPoints(): any; } interface GraphOptions { /** * 图的 DOM 容器,可以传入该 DOM 的 id 或者直接传入容器的 HTML 节点对象 */ container: string | HTMLElement; /** * 指定画布宽度,单位为 'px' */ width: number; /** * 指定画布高度,单位为 'px' */ height: number; /** * 渲染引擎,支持canvas和svg。 */ renderer?: 'canvas' | 'svg'; fitView?: boolean; layout?: any; /** * 图适应画布时,指定四周的留白。 * 可以是一个值, 例如:fitViewPadding: 20 * 也可以是一个数组,例如:fitViewPadding: [20, 40, 50,20] * 当指定一个值时,四边的边距都相等,当指定数组时,数组内数值依次对应 上,右,下,左四边的边距。 */ fitViewPadding?: number[] | number; /** * 各种元素是否在一个分组内,决定节点和边的层级问题,默认情况下所有的节点在一个分组中,所有的边在一个分组中,当这个参数为 false 时,节点和边的层级根据生成的顺序确定。 * 默认值:true */ groupByTypes?: boolean; groupStyle?: { default?: any; hover?: any; /** * 收起状态样式 */ collapseStyle?: any; }; /** * 当图中元素更新,或视口变换时,是否自动重绘。建议在批量操作节点时关闭,以提高性能,完成批量操作后再打开,参见后面的 setAutoPaint() 方法。 * 默认值:true */ autoPaint?: boolean; /** * 设置画布的模式。详情可见G6中的Mode文档。 */ modes?: { default?: Array; addNode?: Array; addEdge?: Array; }; /** * 各个状态下节点的样式,对 G6 内置节点有效。 */ nodeStyle?: any; /** * 各个状态下边的样式,对 G6 内置边有效。 */ edgeStyle?: any; /** * 默认状态下节点的配置,比如 shape, size, color。会被写入的 data 覆盖。 */ defaultNode?: any; /** * 默认状态下边的配置,比如 shape, size, color。会被写入的 data 覆盖。 */ defaultEdge?: any; nodeStateStyles?: any; edgeStateStyles?: any; /** * 向 graph 注册插件。插件机制请见:plugin */ plugins?: any[]; /** * 是否启用全局动画。 */ animate?: boolean; /** * 动画配置项,仅在animate为true时有效。 */ animateCfg?: { /** * 回调函数,用于自定义节点运动路径。 */ onFrame?: Function | null; /** * 动画时长,单位为毫秒。 */ duration?: number; /** * 动画动效。 * 默认值:easeLinear */ easing?: string; }; /** * 最小缩放比例 * 默认值 0.2 */ minZoom?: number; /** * 最大缩放比例 * 默认值 10 */ maxZoom?: number; /** * 像素比率 * 默认值 1.0 */ pixelRatio?: number; groupType?: string; /** * Edge 是否连接到节点中间 */ linkCenter?: boolean; } /** * Graph Class */ export class Graph { constructor(options: GraphOptions); on(eventName: string, handler: (e: T) => void): void; emit(eventName: string, params: object): void; /** * 获取指定配置项的值 * @param key 配置项名称,只支持第一层级 */ get(key: string): any; /** * 设置指定配置项的值 * @param key * @param val */ set(key: string, val: any): this; /** * 更新元素 * @param {string|object} item 元素id或元素实例 * @param {object} cfg 需要更新的数据 */ update(item: any, cfg: any): void; /** * 更新元素 * @param {string|object} item 元素id或元素实例 * @param {object} cfg 需要更新的数据 */ updateItem(item: any, cfg: any): void; /** * 设置元素状态 * @param {string|object} item 元素id或元素实例 * @param state 状态 * @param enabled 是否启用状态 */ setItemState(item: any, state: string, enabled: boolean): void; /** * 清理元素多个状态 * @param {string|object} item 元素id或元素实例 * @param states 状态 */ clearItemStates(item: any, states?: string[] | string | null): void; /** * 新增元素 * @param type 元素类型(node | edge) * @param {object} model 元素数据模型 * @return {object} 元素实例 */ add(type: ElementType, model: any): void; /** * 新增元素 或 节点分组 * @param {string} type 元素类型(node | edge | group) * @param {object} model 元素数据模型 * @return {object} 元素实例 */ addItem(type: ElementType | 'group', model: any): any; /** * 删除元素 * @param {string|object} item 元素id或元素实例 */ remove(item: string | object): void; /** * 删除元素 * @param {string|object} item 元素id或元素实例 */ removeItem(item: string | object): void; /** * 设置视图初始化数据 * @param {object} data 初始化数据 */ data(data: { edges?: EdgeConfig[]; nodes?: NodeConfig[]; [key: string]: any }): any; /** * 设置各个节点样式,以及在各种状态下节点 keyShape 的样式。 * 若是自定义节点切在各种状态下 * graph.node(node => { * return { * { shape: 'rect', label: node.id, style: { fill: '#666' }, stateStyles: { selected: { fill: 'blue' }, custom: { fill: 'green' } } } * } * }); * @param {function} nodeFn 指定每个节点样式 */ node(nodeFn: Function): void; /** * 设置各个边样式 * @param {function} edgeFn 指定每个边的样式,用法同 node */ edge(edgeFn: Function): any; /** * 刷新元素 * @param {string|object} item 元素id或元素实例 */ refreshItem(item: string | object): void; /** * 当源数据在外部发生变更时,根据新数据刷新视图。但是不刷新节点位置 */ refresh(): void; /** * 当节点位置在外部发生改变时,刷新所有节点位置,重计算边 */ refreshPositions(): void; /** * 根据data接口的数据渲染视图 */ render(): void; /** * 根据数据渲染群组 * @param {object} data 渲染图的数据 * @param {string} groupType group类型 */ renderCustomGroup(data: any, groupType: string): any; /** * 接收数据进行渲染 * @Param {Object} data 初始化数据 */ read(data: { edges?: EdgeConfig[]; nodes?: NodeConfig[]; [key: string]: any }): void; /** * 更改源数据,根据新数据重新渲染视图 * @param {object} data 源数据 * @return {object} this */ changeData(data?: { edges?: EdgeConfig[]; nodes?: NodeConfig[]; [key: string]: any }): this; /** * 仅画布重新绘制 */ paint(): void; /** * 导出图数据 * @return {object} data */ save(): any; /** * 改变画布大小 * @param {number} width 画布宽度 * @param {number} height 画布高度 * @return {object} this */ changeSize(width: number, height: number): this; /** * 平移画布 * @param {number} dx 水平方向位移 * @param {number} dy 垂直方向位移 */ translate(dx: number, dy: number): void; /** * 平移画布到某点 * @param {number} x 水平坐标 * @param {number} y 垂直坐标 */ moveTo(x: number, y: number): void; /** * 调整视口适应视图 * @param {object} padding 四周围边距 */ fitView(padding?: any): void; /** * 新增行为 * @param {string|array} behaviors 添加的行为 * @param {string|array} modes 添加到对应的模式 * @return {object} this */ addBehaviors(behaviors: string | string[], modes: string | string[]): this; /** * 移除行为 * @param {string|array} behaviors 移除的行为 * @param {string|array} modes 从指定的模式中移除 * @return {object} this */ removeBehaviors(behaviors: string | string[], modes: string | string[]): this; /** * 切换行为模式 * @param {string} mode 指定模式 * @return {object} this */ setMode(mode: string): this; /** * 获取当前的行为模式 * @return {string} 当前行为模式 */ getCurrentMode(): string; /** * 获取当前视口伸缩比例 * @return {number} 比例 */ getZoom(): number; /** * 获取当前图中所有节点的item实例 * @return {array} item数组 */ getNodes(): G6.NodeConfig[]; /** * 获取当前图中所有边的item实例 * @return {array} item数组 */ getEdges(): G6.EdgeConfig[]; /** * 伸缩视口 * @param {number} ratio 伸缩比例 * @param {object} center 以center的x, y坐标为中心缩放 */ zoom(ratio: number, center?: object): void; /** * 伸缩视口到一固定比例 * @param {number} toRatio 伸缩比例 * @param {object} center 以center的x, y坐标为中心缩放 */ zoomTo(toRatio: number, center?: object): void; /** * 根据 graph 上的 animateCfg 进行视图中节点位置动画接口 */ positionsAnimate(): void; stopAnimate(): void; isAnimating(): boolean; /** * 将元素移动到视口中心 * @param {string|object} item 指定元素 */ focusItem(item: string | object): void; /** * 将屏幕坐标转换为视口坐标 * @param {number} clientX 屏幕x坐标 * @param {number} clientY 屏幕y坐标 * @return {object} 视口坐标 */ getPointByClient(clientX: number, clientY: number): any; /** * 将视口坐标转换为屏幕坐标 * @param {number} x 视口x坐标 * @param {number} y 视口y坐标 * @return {object} 视口坐标 */ getClientByPoint(x: number, y: number): any; /** * 将画布坐标转换为视口坐标 * @param {number} canvasX 屏幕x坐标 * @param {number} canvasY 屏幕y坐标 * @return {object} 视口坐标 */ getPointByCanvas(canvasX: number, canvasY: number): any; /** * 将视口坐标转换为画布坐标 * @param {number} x 屏幕x坐标 * @param {number} y 屏幕y坐标 * @return {object} 画布坐标 */ getCanvasByPoint(x: number, y: number): any; /** * 显示元素 * @param {string|object} item 指定元素 */ showItem(item: string | object): void; /** * 隐藏元素 * @param {string|object} item 指定元素 */ hideItem(item: string | object): void; /** * 查找对应id的元素 * @param {string} id 元素id * @return {object} 元素实例 */ findById(id: string): any; /** * 根据对应规则查找单个元素 * @param {string} type 元素类型(node|edge) * @param {string} fn 指定规则 * @return {object} 元素实例 */ find(type: ElementType, fn: Function): any; /** * 查找所有满足规则的元素 * @param {string} type 元素类型(node|edge) * @param {string} fn 指定规则 * @return {array} 元素实例 */ findAll(type: ElementType, fn: Function): any; /** * 查找所有处于指定状态的元素 * @param {string} type 元素类型(node|edge) * @param {string} state z状态 * @return {object} 元素实例 */ findAllByState(type: ElementType, state: string): any; /** * 设置是否在更新/刷新后自动重绘 * @param {boolean} auto 自动重绘 */ setAutoPaint(auto: boolean): void; /** * 返回图表的 dataUrl 用于生成图片 * @return {string/Object} 图片 dataURL */ toDataURL(): string | object; /** * 画布导出图片 * @param {String} name 图片的名称 */ downloadImage(name: string): void; /** * 添加插件 * @param {object} plugin 插件实例 */ addPlugin(plugin: any): void; /** * 添加插件 * @param {object} plugin 插件实例 */ removePlugin(plugin: any): void; /** * 更换布局配置项 * @param {object} cfg 新布局配置项 * 若 cfg 含有 type 字段或为 String 类型,且与现有布局方法不同,则更换布局 * 若 cfg 不包括 type ,则保持原有布局方法,仅更新布局配置项 */ updateLayout(cfg: any): void; /** * 重新以当前示例中配置的属性进行一次布局 */ layout(): void; /** * 清除画布元素 * @return {object} this */ clear(): this; /** * 销毁画布 */ destroy(): void; // group 相关方法 /** * 收起分组 * @param {string} groupId 分组ID */ collapseGroup(groupId: string): void; /** * 展开分组 * @param {string} groupId 分组ID */ expandGroup(groupId: string): void; clearItemStates(node: Node): void; downloadImage(): void; } interface TreeGraphOptions extends GraphOptions {} /** * TreeGraph Class */ export class TreeGraph extends Graph { constructor(config: TreeGraphOptions); getDefaultCfg(): Partial; /** * 添加子树到对应 id 的节点 * @param {object} data 子树数据模型 * @param {string} parent 子树的父节点id */ addChild(data: any, parent: string): void; /** * 更新源数据,差量更新子树 * @param {object} data 子树数据模型 * @param {string} parent 子树的父节点id */ updateChild(data: any, parent: string): void; /** * 删除子树 * @param {string} id 子树根节点id */ removeChild(id: string): void; /** * 根据id获取对应的源数据 * @param {string|object} id 元素id * @param {object} parent 从哪个节点开始寻找,为空时从根节点开始查找 * @return {object} 对应源数据 */ findDataById(id: string | object, parent?: object): any; /** * 更改并应用树布局算法 * @param {object} layout 布局算法 */ changeLayout(layout: object): void; /** * 根据目前的 data 刷新布局,更新到画布上。用于变更数据之后刷新视图。 * @param {boolean} fitView 更新布局时是否需要适应窗口 */ refreshLayout(fitView: boolean): void; /** * 布局动画接口,用于数据更新时做节点位置更新的动画 * @param {object} data 更新的数据 * @param {function} onFrame 定义节点位置更新时如何移动 */ layoutAnimate(data: any, onFrame: Function): void; /** * 立即停止布局动画 */ stopLayoutAnimate(): void; /** * 是否在布局动画 * @return {boolean} 是否有布局动画 */ isLayoutAnimating(): boolean; } /** * Util */ interface Util { deepMix: typeof deepMix; mix: typeof mix; debounce: typeof debounce; each: typeof each; throttle: typeof throttle; mat3: typeof mat3; vec2: typeof vec2; vec3: typeof vec3; transform: typeof transform; clone: typeof clone; upperFirst: typeof upperFirst; isNil: typeof isNil; isArray: typeof isArray; createDom: typeof createDom; modifyCSS: typeof modifyCSS; isObject: typeof isObject; isPlainObject: typeof isPlainObject; isNumber: typeof isNumber; isString: typeof isString; uniqueId: typeof uniqueId; addEventListener: typeof addEventListener; wrapBehavior: typeof wrapBehavior; extend: typeof extend; augment: typeof augment; remove: typeof remove; /** * turn padding into [top, right, bottom, right] * @param padding */ formatPadding(padding: number | string | number[]): [number, number, number, number]; /** * 拷贝事件 * @param e */ cloneEvent(e: any): any; getBBox(element: any, parent: any): G.Box; /** * 获取某元素的自环边配置 * @param cfg */ getLoopCfgs(cfg: any): any; traverseTree(data: any, fn: Function): void; radialLayout(data: any, layout?: any): any; /** * 根据 label 所在线条的位置百分比,计算 label 坐标 * @param {object} pathShape G 的 path 实例,一般是 Edge 实例的 keyShape * @param {number} percent 范围 0 - 1 的线条百分比 * @param {number} refX x 轴正方向为基准的 label 偏移 * @param {number} refY y 轴正方向为基准的 label 偏移 * @param {boolean} rotate 是否根据线条斜率旋转文本 * @return {object} 文本的 x, y, 文本的旋转角度 */ getLabelPosition( pathShape: any, percent: number, refX: number, refY: number, rotate: boolean, ): { x: number; y: number; angle: number; rotate?: number; }; getSpline(points: any): any; /** * 根据起始点、相对位置、偏移量计算控制点 * @param {Object} startPoint 起始点,包含 x,y * @param {Object} endPoint 结束点, 包含 x,y * @param {Number} percent 相对位置,范围 0-1 * @param {Number} offset 偏移量 * @return {Object} 控制点,包含 x,y */ getControlPoint(startPoint: Point, endPoint: Point, percent: number, offset: number): Point; /** * 是否在区间内 * @param {number} value 值 * @param {number} min 最小值 * @param {number} max 最大值 * @return {boolean} bool 布尔 */ isBetween(value: number, min: number, max: number): boolean; /** * 两线段交点 * @param {object} p0 第一条线段起点 * @param {object} p1 第一条线段终点 * @param {object} p2 第二条线段起点 * @param {object} p3 第二条线段终点 * @return {object} 交点 */ getLineIntersect(p0: Point, p1: Point, p2: Point, p3: Point): Point; /** * point and rectangular intersection point * @param {object} rect rect * @param {object} point point * @return {object} rst; */ getRectIntersectByPoint(rect: Rect, point: Point): Point; /** * get point and circle inIntersect * @param {Object} circle 圆点,x,y,r * @param {Object} point 点 x,y * @return {object} applied point */ getCircleIntersectByPoint(circle: Circle, point: Point): Point; /** * get point and ellipse inIntersect * @param {Object} ellipse 椭圆 x,y,rx,ry * @param {Object} point 点 x,y * @return {object} applied point */ getEllispeIntersectByPoint(ellipse: Ellipse, point: Point): Point; /** * coordinate matrix transformation * @param {number} point coordinate * @param {number} matrix matrix * @param {number} tag could be 0 or 1 * @return {object} transformed point */ applyMatrix(point: Point, matrix: number, tag?: number): Point; /** * coordinate matrix invert transformation * @param {number} point coordinate * @param {number} matrix matrix * @param {number} tag could be 0 or 1 * @return {object} transformed point */ invertMatrix(point: Point, matrix: number, tag?: number): Point; /** * 扁平的数据格式转成树形 * @param {array} data 扁平结构的数据 * @param {string} value 树状结构的唯一标识 * @param {string} parentId 父节点的键值 * @return {array} 转成的树形结构数据 */ flatToTree(data: any[], value?: string, parentId?: string): any[]; /** * 获取各个group中的节点 * @param {object} data G6的数据模型 * @return {object} 各个group中的节点 */ getAllNodeInGroups(data: any): any; } export const Util: Util; export const Layout: any; export const G: any; /** * Global */ interface Global { /** * 只读,版本号 */ readonly version: string; /** * 根容器类名 */ rootContainerClassName: string; /** * 节点容器类名 */ nodeContainerClassName: string; /** * 连接线容器类名 */ edgeContainerClassName: string; /** * 自定义组容器类名 */ customGroupContainerClassName: string; /** * 委托容器类名 */ delegateContainerClassName: string; defaultNode: any; defaultEdge: any; nodeLabel: any; edgeLabel: any; /** * 节点应用状态后的样式,默认仅提供 active 和 selected 用户可以自己扩展 */ nodeStateStyle: any; edgeStateStyle: any; loopPosition: any; delegateStyle: any; } export const Global: Global; /** * Sharp */ interface Sharp { // 注册 Geometry 获取图形的入口 registerFactory(factoryType: string, cfg: any): any; // 获得 ShapeFactory getFactory(factoryType: string): any; get(key: string): any; } export const Sharp: Sharp; export function registerNode(shapeType: string, cfg: any, extendShapeType?: string): any; export function registerEdge(shapeType: string, cfg: any, extendShapeType?: string): any; export function registerLayout(layoutType: string, cfg: any, extendLayoutType?: string): void; export function registerBehavior(type: string, behavior: any): void; /** * 版本号 */ export const version: string; }