| /* |
| * 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 * as zrUtil from 'zrender/src/core/util'; |
| import GridModel from './GridModel'; |
| import CartesianAxisModel from './AxisModel'; |
| import SeriesModel from '../../model/Series'; |
| import { SINGLE_REFERRING } from '../../util/model'; |
| |
| interface CartesianAxisLayout { |
| position: [number, number]; |
| rotation: number; |
| labelOffset: number; |
| labelDirection: -1 | 1; |
| tickDirection: -1 | 1; |
| nameDirection: -1 | 1; |
| labelRotate: number; |
| z2: number; |
| } |
| |
| /** |
| * Can only be called after coordinate system creation stage. |
| * (Can be called before coordinate system update stage). |
| */ |
| export function layout( |
| gridModel: GridModel, axisModel: CartesianAxisModel, opt?: {labelInside?: boolean} |
| ): CartesianAxisLayout { |
| opt = opt || {}; |
| const grid = gridModel.coordinateSystem; |
| const axis = axisModel.axis; |
| const layout = {} as CartesianAxisLayout; |
| const otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; |
| |
| const rawAxisPosition = axis.position; |
| const axisPosition: 'onZero' | typeof axis.position = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition; |
| const axisDim = axis.dim; |
| |
| const rect = grid.getRect(); |
| const rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; |
| const idx = {left: 0, right: 1, top: 0, bottom: 1, onZero: 2}; |
| const axisOffset = axisModel.get('offset') || 0; |
| |
| const posBound = axisDim === 'x' |
| ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] |
| : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; |
| |
| if (otherAxisOnZeroOf) { |
| const onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); |
| posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); |
| } |
| |
| // Axis position |
| layout.position = [ |
| axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], |
| axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3] |
| ]; |
| |
| // Axis rotation |
| layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1); |
| |
| // Tick and label direction, x y is axisDim |
| const dirMap = {top: -1, bottom: 1, left: -1, right: 1} as const; |
| |
| layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; |
| layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0; |
| |
| if (axisModel.get(['axisTick', 'inside'])) { |
| layout.tickDirection = -layout.tickDirection as 1 | -1; |
| } |
| if (zrUtil.retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { |
| layout.labelDirection = -layout.labelDirection as 1 | -1; |
| } |
| |
| // Special label rotation |
| const labelRotate = axisModel.get(['axisLabel', 'rotate']); |
| layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate; |
| |
| // Over splitLine and splitArea |
| layout.z2 = 1; |
| |
| return layout; |
| } |
| |
| export function isCartesian2DSeries(seriesModel: SeriesModel): boolean { |
| return seriesModel.get('coordinateSystem') === 'cartesian2d'; |
| } |
| |
| export function findAxisModels(seriesModel: SeriesModel): { |
| xAxisModel: CartesianAxisModel; |
| yAxisModel: CartesianAxisModel; |
| } { |
| const axisModelMap = { |
| xAxisModel: null, |
| yAxisModel: null |
| } as ReturnType<typeof findAxisModels>; |
| zrUtil.each(axisModelMap, function (v, key) { |
| const axisType = key.replace(/Model$/, ''); |
| const axisModel = seriesModel.getReferringComponents( |
| axisType, SINGLE_REFERRING |
| ).models[0] as CartesianAxisModel; |
| |
| if (__DEV__) { |
| if (!axisModel) { |
| throw new Error(axisType + ' "' + zrUtil.retrieve3( |
| seriesModel.get(axisType + 'Index' as any), |
| seriesModel.get(axisType + 'Id' as any), |
| 0 |
| ) + '" not found'); |
| } |
| } |
| |
| axisModelMap[key] = axisModel; |
| }); |
| |
| return axisModelMap; |
| } |
| |