/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import GlobalModel from '../model/Global'; import {ParsedModelFinder} from '../util/model'; import ExtensionAPI from '../core/ExtensionAPI'; import { DimensionDefinitionLoose, ScaleDataValue, DimensionName } from '../util/types'; import Axis from './Axis'; import { BoundingRect } from '../util/graphic'; import { MatrixArray } from 'zrender/src/core/matrix'; import ComponentModel from '../model/Component'; import { RectLike } from 'zrender/src/core/BoundingRect'; import type { PrepareCustomInfo } from '../chart/custom/CustomSeries'; export interface CoordinateSystemCreator { create: (ecModel: GlobalModel, api: ExtensionAPI) => CoordinateSystemMaster[]; // FIXME current dimensions must be string[]. // check and unify the definition. // FIXME:TS check where used (seams only HeatmapSeries used?) // Some coordinate system do not have static dimensions (like parallel) dimensions?: DimensionName[]; // dimensionsInfo like [{name: ..., type: ...}, 'xxx', ...] getDimensionsInfo?: () => DimensionDefinitionLoose[]; } /** * The instance get from `CoordinateSystemManger` is `CoordinateSystemMaster`. */ export interface CoordinateSystemMaster { // FIXME current dimensions must be string[]. // check and unify the definition. // Should be the same as its coordinateSystemCreator. dimensions: DimensionName[]; model?: ComponentModel; update?: (ecModel: GlobalModel, api: ExtensionAPI) => void; // This methods is also responsible for determining whether this // coordinate system is applicable to the given `finder`. // Each coordinate system will be tried, until one returns non- // null/undefined value. convertToPixel?( ecModel: GlobalModel, finder: ParsedModelFinder, value: ScaleDataValue | ScaleDataValue[] ): number | number[]; // This methods is also responsible for determining whether this // coordinate system is applicable to the given `finder`. // Each coordinate system will be tried, until one returns non- // null/undefined value. convertFromPixel?( ecModel: GlobalModel, finder: ParsedModelFinder, pixelValue: number | number[] ): number | number[]; // @param point Point in global pixel coordinate system. // The signature of this method should be the same as `CoordinateSystemExecutive` containPoint(point: number[]): boolean; // Must be implemented when `axisPointerEnabled` is `true`. getAxes?: () => Axis[]; axisPointerEnabled?: boolean; getTooltipAxes?: (dim: DimensionName | 'auto') => {baseAxes: Axis[], otherAxes: Axis[]}; /** * Get layout rect or coordinate system */ getRect?: () => RectLike } /** * For example: cartesian is CoordinateSystem. * series.coordinateSystem is CoordinateSystem. */ export interface CoordinateSystem { type: string /** * Master of coordinate system. For example: * Grid is master of cartesian. */ master?: CoordinateSystemMaster // Should be the same as its coordinateSystemCreator. dimensions: DimensionName[]; model?: ComponentModel; /** * @param data * @param reserved Defined by the coordinate system itself * @param out * @return {Array.} point Point in global pixel coordinate system. */ dataToPoint( data: ScaleDataValue | ScaleDataValue[], reserved?: any, out?: number[] ): number[]; /** * Some coord sys (like Parallel) might do not have `pointToData`, * or the meaning of this kind of features is not clear yet. * @param point point Point in global pixel coordinate system. * @param clamp Clamp range * @return data */ pointToData?( point: number[], clamp?: boolean ): number | number[]; // @param point Point in global pixel coordinate system. containPoint(point: number[]): boolean; getAxes?: () => Axis[]; getAxis?: (dim?: DimensionName) => Axis; getBaseAxis?: () => Axis; getOtherAxis?: (baseAxis: Axis) => Axis; clampData?: (data: ScaleDataValue[], out?: number[]) => number[]; getRoamTransform?: () => MatrixArray; getArea?: () => CoordinateSystemClipArea // Only `coord/View.js` implements `getBoundingRect`. // But if other coord sys implement it, should follow this signature. getBoundingRect?: () => BoundingRect; // Currently only Cartesian2D implements it. // But if other coordinate systems implement it, should follow this signature. getAxesByScale?: (scaleType: string) => Axis[]; prepareCustoms?: PrepareCustomInfo; } /** * Like GridModel, PolarModel, ... */ export interface CoordinateSystemHostModel extends ComponentModel { coordinateSystem?: CoordinateSystemMaster } /** * Clip area will be returned by getArea of CoordinateSystem. * It is used to clip the graphic elements with the contain methods. */ export interface CoordinateSystemClipArea { contain(x: number, y: number): boolean } export function isCoordinateSystemType( coordSys: CoordinateSystem, type: S ): coordSys is T { return (coordSys.type as unknown as S) === type; }