NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/esm/geometry/base.d.ts
2023-09-14 14:47:11 +08:00

707 lines
22 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Adjust } from '@antv/adjust';
import { Attribute } from '@antv/attr';
import Base from '../base';
import { BBox, Coordinate, IGroup, IShape, Scale } from '../dependents';
import { AdjustOption, AnimateOption, AttributeOption, ColorAttrCallback, Data, Datum, GeometryLabelCfg, GeometryTooltipOption, LabelCallback, LabelOption, LooseObject, MappingDatum, ScaleOption, ShapeAttrCallback, ShapeFactory, ShapeInfo, ShapeMarkerCfg, ShapePoint, SizeAttrCallback, StateOption, StyleCallback, StyleOption, TooltipCallback } from '../interface';
import Element from './element';
/** geometry.init() 传入参数 */
export interface InitCfg {
/** 坐标系 */
coordinate?: Coordinate;
/** 数据 */
data?: Data;
/** 主题对象 */
theme?: LooseObject;
/** 列定义 */
scaleDefs?: Record<string, ScaleOption>;
/** 因为数据使用的引用,所以需要有一个标识位标识数据是否发生了更新 */
isDataChanged?: boolean;
isCoordinateChanged?: boolean;
}
/** Geometry 构造函数参数 */
export interface GeometryCfg {
/** Geometry shape 的容器。 */
container: IGroup;
/** 绘制的坐标系对象。 */
coordinate?: Coordinate;
/** 绘制数据。 */
data?: Data;
/** 需要的 scales。 */
scales?: Record<string, Scale>;
/** 列定义 */
scaleDefs?: Record<string, ScaleOption>;
/** Geometry labels 的容器 */
labelsContainer?: IGroup;
/** 是否对数据进行排序 */
sortable?: boolean;
/** 是否可见 */
visible?: boolean;
/** 主题配置 */
theme?: LooseObject;
}
/**
* Geometry 几何标记基类,主要负责数据到图形属性的映射以及绘制逻辑。
*/
export default class Geometry extends Base {
/** Geometry 几何标记类型。 */
readonly type: string;
/** ShapeFactory 对应的类型。 */
readonly shapeType: string;
/** Coordinate 坐标系实例。 */
coordinate: Coordinate;
/** 用户绘制数据。 */
data: Data;
/** 图形绘制容器。 */
readonly container: IGroup;
/** label 绘制容器。 */
readonly labelsContainer: IGroup;
/** 是否对数据进行排序,默认为 false。 */
sortable: boolean;
/** 当前 Geometry 实例主题。 */
theme: LooseObject;
/** 存储 geometry 需要的 scales需要外部传入。 */
scales: Record<string, Scale>;
/** scale 定义,需要外部传入。 */
scaleDefs: Record<string, ScaleOption>;
/** 画布区域,用于 label 布局。 */
canvasRegion: BBox;
/** Attribute map */
attributes: Record<string, Attribute>;
/** Element map */
elements: Element[];
/**
* 存储处理后的数据,
* + init() 及 updateData() 逻辑后, 结构为 Data[]
* + paint() 逻辑后,结构为 MappingDatum[][]。
*/
dataArray: MappingDatum[][];
/** 存储 tooltip 配置信息。 */
tooltipOption: GeometryTooltipOption | boolean;
/** 存储 label 配置信息。 */
labelOption: LabelOption | false;
/** 状态量相关的配置项 */
stateOption: StateOption;
/** 使用 key-value 结构存储 Elementkey 为每个 Element 实例对应的唯一 ID */
elementsMap: Record<string, Element>;
/** animate 配置项 */
animateOption: AnimateOption | boolean;
/** 图形属性映射配置 */
protected attributeOption: Record<string, AttributeOption>;
/** adjust 配置项 */
protected adjustOption: AdjustOption[];
/** style 配置项 */
protected styleOption: StyleOption;
/** 每个 Geometry 对应的 Shape 工厂实例,用于创建各个 Shape */
protected shapeFactory: ShapeFactory;
/** 存储上一次渲染时的 element 映射表,用于更新逻辑 */
protected lastElementsMap: Record<string, Element>;
/** 是否生成多个点来绘制图形。 */
protected generatePoints: boolean;
/** 存储发生图形属性映射前的数据 */
protected beforeMappingData: Data[];
/** 存储每个 shape 的默认 size用于 Interval、Schema 几何标记 */
protected defaultSize: number;
private userTheme;
private adjusts;
private lastAttributeOption;
private idFields;
private geometryLabel;
/** 虚拟 Group用于图形更新 */
private offscreenGroup;
private groupScales;
private hasSorted;
protected isCoordinateChanged: boolean;
/**
* 创建 Geometry 实例。
* @param cfg
*/
constructor(cfg: GeometryCfg);
/**
* 配置 position 通道映射规则。
*
* @example
* ```typescript
* // 数据结构: [{ x: 'A', y: 10, color: 'red' }]
* geometry.position('x*y');
* geometry.position([ 'x', 'y' ]);
* geometry.position({
* fields: [ 'x', 'y' ],
* });
* ```
*
* @param cfg 映射规则
* @returns
*/
position(cfg: string | string[] | AttributeOption): Geometry;
/**
* 配置 color 通道映射规则。
*
* @example
* ```typescript
* // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
* geometry.color({
* fields: [ 'x' ],
* values: [ '#1890ff', '#5AD8A6' ],
* });
* ```
*
* @param field 映射规则
* @returns
*/
color(field: AttributeOption): Geometry;
/**
* @example
* ```typescript
* // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
*
* // 使用 '#1890ff' 颜色渲染图形
* geometry.color('#1890ff');
*
* // 根据 x 字段的数据值进行颜色的映射,这时候 G2 会在内部调用默认的回调函数,读取默认提供的颜色进行数据值到颜色值的映射。
* geometry.color('x');
*
* // 将 'x' 字段的数据值映射至指定的颜色值 colors可以是字符串也可以是数组此时用于通常映射分类数据
* geometry.color('x', [ '#1890ff', '#5AD8A6' ]);
*
* // 使用回调函数进行颜色值的自定义;可以使用多个字段使用、*号连接
* geometry.color('x', (xVal) => {
* if (xVal === 'a') {
* return 'red';
* }
* return 'blue';
* });
*
* // 指定颜色的渐变路径,用于映射连续的数据
* geometry.color('x', '#BAE7FF-#1890FF-#0050B3');
* ```
*
* @param field 参与颜色映射的数据字段,多个字段使用 '*' 连接符进行连接。
* @param cfg Optional, color 映射规则。
* @returns
*/
color(field: string, cfg?: string | string[] | ColorAttrCallback): Geometry;
/**
* 配置 shape 通道映射规则。
*
* @example
*
* ```typescript
* // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
* geometry.shape({
* fields: [ 'x' ],
* });
* ```
*
* @param field 映射规则配置。
* @returns
*/
shape(field: AttributeOption): Geometry;
/**
*
* @example
* ```typescript
* // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
*
* // 指定常量,将所有数据值映射到固定的 shape
* geometry.shape('circle');
*
* // 将指定的字段映射到内置的 shapes 数组中
* geometry.shape('x');
*
* // 将指定的字段映射到指定的 shapes 数组中
* geometry.shape('x', [ 'circle', 'diamond', 'square' ]);
*
* // 使用回调函数获取 shape用于个性化的 shape 定制,可以根据单个或者多个字段确定
* geometry.shape('x', (xVal) => {
* if (xVal === 'a') {
* return 'circle';
* }
* return 'diamond';
* });
* ```
*
* @param field 参与 shape 映射的数据字段,多个字段使用 '*' 连接符进行连接。
* @param cfg Optional, shape 映射规则。
* @returns
*/
shape(field: string, cfg?: string[] | ShapeAttrCallback): Geometry;
/**
* 配置 size 通道映射规则。
*
* @example
* ```typescript
* // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
* geometry.size({
* values: [ 10 ],
* })
* ```
*
* @param field 映射规则。
* @returns
*/
size(field: AttributeOption): Geometry;
/**
*
* @example
* ```typescript
* // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
*
* // 直接指定像素大小
* geometry.size(10);
*
* // 指定映射到 size 的字段,使用内置的默认大小范围为 [1, 10]
* geometry.size('x');
*
* // 指定映射到 size 字段外,还提供了 size 的最大值和最小值范围
* geometry.size('x', [ 5, 30 ]);
*
* // 使用回调函数映射 size用于个性化的 size 定制,可以使用多个字段进行映射
* geometry.size('x', (xVal) => {
* if (xVal === 'a') {
* return 10;
* }
* return 5;
* });
* ```
*
* @param field 参与 size 映射的数据字段,多个字段使用 '*' 连接符进行连接。
* @param cfg Optional, size 映射规则
* @returns
*/
size(field: number | string, cfg?: [number, number] | SizeAttrCallback): Geometry;
/**
* 设置数据调整方式。G2 目前内置了四种类型:
* 1. dodge
* 2. stack
* 3. symmetric
* 4. jitter
*
*
* **Tip**
* + 对于 'dodge' 类型,可以额外进行如下属性的配置:
* ```typescript
* geometry.adjust('dodge', {
* marginRatio: 0, // 取 0 到 1 范围的值(相对于每个柱子宽度),用于控制一个分组中柱子之间的间距
* dodgeBy: 'x', // 该属性只对 'dodge' 类型生效,声明以哪个数据字段为分组依据
* });
* ```
*
* + 对于 'stack' 类型,可以额外进行如下属性的配置:
* ```typescript
* geometry.adjust('stack', {
* reverseOrder: false, // 用于控制是否对数据进行反序操作
* });
* ```
*
* @example
* ```typescript
* geometry.adjust('stack');
*
* geometry.adjust({
* type: 'stack',
* reverseOrder: false,
* });
*
* // 组合使用 adjust
* geometry.adjust([ 'stack', 'dodge' ]);
*
* geometry.adjust([
* { type: 'stack' },
* { type: 'dodge', dodgeBy: 'x' },
* ]);
* ```
*
* @param adjustCfg 数据调整配置
* @returns
*/
adjust(adjustCfg: string | string[] | AdjustOption | AdjustOption[]): Geometry;
/**
* 图形样式配置。
*
* @example
* ```typescript
* // 配置图形样式
* style({
* lineWidth: 2,
* stroke: '#1890ff',
* });
*
* // 根据具体的数据进行详细配置
* style({
* fields: [ 'x', 'y' ], // 数据字段
* callback: (xVal, yVal) => {
* const style = { lineWidth: 2, stroke: '#1890ff' };
* if (xVal === 'a') {
* style.lineDash = [ 2, 2 ];
* }
* return style;
* },
* });
* ```
*
* @param field 配置样式属性或者样式规则。
* @returns
*/
style(field: StyleOption | LooseObject): Geometry;
/**
* @example
* ```typescript
* style('x*y', (xVal, yVal) => {
* const style = { lineWidth: 2, stroke: '#1890ff' };
* if (xVal === 'a') {
* style.lineDash = [ 2, 2 ];
* }
* return style;
* });
* ```
*
* @param field 数据字段或者样式配置规则。
* @param styleFunc Optional, 样式配置回调函数。
* @returns
*/
style(field: string, styleFunc: StyleCallback): Geometry;
/**
* 配置 Geometry 显示的 tooltip 内容。
*
* `tooltip(false)` 代表关闭 tooltip。
* `tooltip(true)` 代表开启 tooltip。
*
* Geometry 默认允许 tooltip 展示,我们可以使用以下方法对 tooltip 的展示内容进行配置:
*
* @example
* ```typescript
* // data: [{x: 'a', y: 10}]
* tooltip({
* fields: [ 'x' ],
* });
* ```
* ![](https://gw.alipayobjects.com/mdn/rms_2274c3/afts/img/A*268uQ50if60AAAAAAAAAAABkARQnAQ)
*
* ```typescript
* tooltip({
* fields: [ 'x', 'y' ],
* });
* ```
* ![](https://gw.alipayobjects.com/mdn/rms_2274c3/afts/img/A*A_ujSa8QhtcAAAAAAAAAAABkARQnAQ)
*
* tooltip() 方法同样支持数据映射及回调用法:
*
* @example
* ```typescript
* chart.tooltip({
* itemTpl: '<li>{x}: {y}</li>',
* });
*
* chart.line()
* .position('x*y')
* .tooltip({
* fields: [ 'x', 'y' ],
* callback: (x, y) => {
* return {
* x,
* y,
* };
* },
* });
* ```
*
* 其返回的值必须为对象,该值中的属性同 chart.tooltip() 的 itemTpl 模板相对应,返回的变量可用于 itemTpl 的字符串模板。
*
* @param field tooltip 配置信息。
* @returns
*/
tooltip(field: GeometryTooltipOption | boolean): Geometry;
/**
* @example
* ```typescript
* // data: [{x: 'a', y: 10}]
*
* // 等同于 tooltip({ fields: [ 'x' ] })
* tooltip('x');
*
* // 等同于 tooltip({ fields: [ 'x', 'y' ] })
* tooltip('x*y');
*
* // 等同于 tooltip({ fields: [ 'x', 'y' ], callback: (x, y) => { x, y } })
* tooltip('x*y', (x, y) => {
* return {
* x,
* y,
* };
* });
* ```
*
* @param field 参与映射的字段。
* @param cfg Optional, 回调函数
* @returns
*/
tooltip(field: string, cfg?: TooltipCallback): Geometry;
/**
* Geometry 动画配置。
*
* + `animate(false)` 关闭动画
* + `animate(true)` 开启动画,默认开启。
*
* 我们将动画分为四个场景:
* 1. appear: 图表第一次加载时的入场动画;
* 2. enter: 图表绘制完成,发生更新后,产生的新图形的进场动画;
* 3. update: 图表绘制完成,数据发生变更后,有状态变更的图形的更新动画;
* 4. leave: 图表绘制完成,数据发生变更后,被销毁图形的销毁动画。
*
* @example
* ```typescript
* animate({
* enter: {
* duration: 1000, // enter 动画执行时间
* },
* leave: false, // 关闭 leave 销毁动画
* });
* ```
*
* @param cfg 动画配置
* @returns
*/
animate(cfg: AnimateOption | boolean): Geometry;
/**
* Geometry label 配置。
*
* @example
* ```ts
* // data: [ {x: 1, y: 2, z: 'a'}, {x: 2, y: 2, z: 'b'} ]
* // 在每个图形上显示 z 字段对应的数值
* label({
* fields: [ 'z' ]
* });
*
* label(false); // 不展示 label
*
* // 在每个图形上显示 x 字段对应的数值,同时配置文本颜色为红色
* label('x', {
* style: {
* fill: 'red',
* },
* })
*
* // 以 type 类型的 label 渲染每个图形上显示 x 字段对应的数值,同时格式化文本内容
* label('x', (xValue) => {
* return {
* content: xValue + '%',
* };
* }, {
* type: 'base' // 声明 label 类型
* })
* ```
*
* @param field
* @returns label
*/
label(field: LabelOption | false | string): Geometry;
label(field: string, secondParam: GeometryLabelCfg | LabelCallback): Geometry;
label(field: string, secondParam: LabelCallback, thirdParam: GeometryLabelCfg): Geometry;
/**
* 设置状态对应的样式。
*
* @example
* ```ts
* chart.interval().state({
* selected: {
* animate: { duration: 100, easing: 'easeLinear' },
* style: {
* lineWidth: 2,
* stroke: '#000',
* },
* },
* });
* ```
*
* 如果图形 shape 是由多个 shape 组成,即为一个 G.Group 对象,那么针对 group 中的每个 shape我们需要使用下列方式进行状态样式设置
* 如果我们为 group 中的每个 shape 设置了 'name' 属性(shape.set('name', 'xx')),则以 'name' 作为 key否则默认以索引值即 shape 的 添加顺序)为 key。
*
* ```ts
* chart.interval().shape('groupShape').state({
* selected: {
* style: {
* 0: { lineWidth: 2 },
* 1: { fillOpacity: 1 },
* }
* }
* });
* ```
*
* @param cfg 状态样式
*/
state(cfg: StateOption): this;
/**
* 初始化 Geomtry 实例:
* 创建 [[Attribute]] and [[Scale]] 实例,进行数据处理,包括分组、数值化以及数据调整。
*/
init(cfg?: InitCfg): void;
/**
* Geometry 更新。
* @param [cfg] 更新的配置
*/
update(cfg?: InitCfg): void;
/**
* 将原始数据映射至图形空间,同时创建图形对象。
*/
paint(isUpdate?: boolean): void;
/**
* 清空当前 Geometry配置项仍保留但是内部创建的对象全部清空。
* @override
*/
clear(): void;
/**
* 销毁 Geometry 实例。
*/
destroy(): void;
/**
* 获取决定分组的图形属性对应的 scale 实例。
* @returns
*/
getGroupScales(): Scale[];
/**
* 根据名字获取图形属性实例。
*/
getAttribute(name: string): Attribute;
/** 获取 x 轴对应的 scale 实例。 */
getXScale(): Scale;
/** 获取 y 轴对应的 scale 实例。 */
getYScale(): Scale;
/**
* 获取决定分组的图形属性实例。
*/
getGroupAttributes(): Attribute[];
/** 获取图形属性默认的映射值。 */
getDefaultValue(attrName: string): any;
/**
* 获取该数据发生图形映射后对应的 Attribute 图形空间数据。
* @param attr Attribute 图形属性实例。
* @param obj 需要进行映射的原始数据。
* @returns
*/
getAttributeValues(attr: Attribute, obj: Datum): any[];
getAdjust(adjustType: string): Adjust;
/**
* 获取 shape 对应的 marker 样式。
* @param shapeName shape 具体名字
* @param cfg marker 信息
* @returns
*/
getShapeMarker(shapeName: string, cfg: ShapeMarkerCfg): import("../interface").ShapeMarkerAttrs;
/**
* 根据一定的规则查找 Geometry 的 Elements。
*
* ```typescript
* getElementsBy((element) => {
* const data = element.getData();
*
* return data.a === 'a';
* });
* ```
*
* @param condition 定义查找规则的回调函数。
* @returns
*/
getElementsBy(condition: (element: Element) => boolean): Element[];
/**
* 获取数据对应的唯一 id。
* @param data Element 对应的绘制数据
* @returns
*/
getElementId(data: MappingDatum | MappingDatum[]): any;
/**
* 获取所有需要创建 scale 的字段名称。
*/
getScaleFields(): string[];
/**
* 显示或者隐藏 geometry。
* @param visible
*/
changeVisible(visible: boolean): void;
/**
* 获取当前配置中的所有分组 & 分类的字段。
* @return fields string[]
*/
getGroupFields(): string[];
/**
* 获得图形的 x y 字段。
*/
getXYFields(): string[];
/**
* 获取该 Geometry 下所有生成的 shapes。
* @returns shapes
*/
getShapes(): Array<IShape | IGroup>;
/**
* 获取虚拟 Group。
* @returns
*/
getOffscreenGroup(): IGroup;
sort(mappingArray: Data[]): void;
/**
* 调整度量范围。主要针对发生层叠以及一些特殊需求的 Geometry比如 Interval 下的柱状图 Y 轴默认从 0 开始。
*/
protected adjustScale(): void;
/**
* 获取当前 Geometry 对应的 Shape 工厂实例。
*/
protected getShapeFactory(): ShapeFactory;
/**
* 获取每个 Shape 对应的关键点数据。
* @param obj 经过分组 -> 数字化 -> adjust 调整后的数据记录
* @returns
*/
protected createShapePointsCfg(obj: Datum): ShapePoint;
/**
* 创建 Element 实例。
* @param mappingDatum Element 对应的绘制数据
* @param [isUpdate] 是否处于更新阶段
* @returns element 返回创建的 Element 实例
*/
protected createElement(mappingDatum: MappingDatum, isUpdate?: boolean): Element;
/**
* 获取每条数据对应的图形绘制数据。
* @param mappingDatum 映射后的数据
* @returns draw cfg
*/
protected getDrawCfg(mappingDatum: MappingDatum): ShapeInfo;
/**
* 创建所有的 Elements。
* @param mappingData
* @param [isUpdate]
* @returns elements
*/
protected createElements(mappingData: MappingDatum[], index: number, isUpdate?: boolean): Element[];
/**
* 获取渲染的 label 类型。
*/
protected getLabelType(): string;
/**
* 获取 Y 轴上的最小值。
*/
protected getYMinValue(): number;
private createAttrOption;
private initAttributes;
private processData;
private adjustData;
private groupData;
private updateStackRange;
private beforeMapping;
private generateShapePoints;
private normalizeValues;
private mapping;
private convertPoint;
private getStyleCfg;
private setCfg;
private renderLabels;
/**
* 是否需要进行群组入场动画
* 规则:
* 1. 如果发生更新,则不进行
* 2. 如果用户关闭 geometry 动画,则不进行
* 3. 如果用户关闭了 appear 动画,则不进行
* 4. 如果用户配置了 appear.animation则不进行
*/
private canDoGroupAnimation;
}