Spaces:
Running
Running
/* | |
* 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 {isDimensionStacked} from '../../data/helper/dataStackHelper'; | |
import {isNumber, map} from 'zrender/src/core/util'; | |
import type Polar from '../../coord/polar/Polar'; | |
import type Cartesian2D from '../../coord/cartesian/Cartesian2D'; | |
import SeriesData from '../../data/SeriesData'; | |
import Axis from '../../coord/Axis'; | |
import type { LineSeriesOption } from './LineSeries'; | |
interface CoordInfo { | |
dataDimsForPoint: string[] | |
valueStart: number | |
valueAxisDim: string | |
baseAxisDim: string | |
stacked: boolean | |
valueDim: string | |
baseDim: string | |
baseDataOffset: number | |
stackedOverDimension: string | |
} | |
export function prepareDataCoordInfo( | |
coordSys: Cartesian2D | Polar, | |
data: SeriesData, | |
valueOrigin?: LineSeriesOption['areaStyle']['origin'] | |
): CoordInfo { | |
const baseAxis = coordSys.getBaseAxis(); | |
const valueAxis = coordSys.getOtherAxis(baseAxis as any); | |
const valueStart = getValueStart(valueAxis, valueOrigin); | |
const baseAxisDim = baseAxis.dim; | |
const valueAxisDim = valueAxis.dim; | |
const valueDim = data.mapDimension(valueAxisDim); | |
const baseDim = data.mapDimension(baseAxisDim); | |
const baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; | |
const dims = map(coordSys.dimensions, function (coordDim) { | |
return data.mapDimension(coordDim); | |
}); | |
let stacked = false; | |
const stackResultDim = data.getCalculationInfo('stackResultDimension'); | |
if (isDimensionStacked(data, dims[0] /* , dims[1] */)) { // jshint ignore:line | |
stacked = true; | |
dims[0] = stackResultDim; | |
} | |
if (isDimensionStacked(data, dims[1] /* , dims[0] */)) { // jshint ignore:line | |
stacked = true; | |
dims[1] = stackResultDim; | |
} | |
return { | |
dataDimsForPoint: dims, | |
valueStart: valueStart, | |
valueAxisDim: valueAxisDim, | |
baseAxisDim: baseAxisDim, | |
stacked: !!stacked, | |
valueDim: valueDim, | |
baseDim: baseDim, | |
baseDataOffset: baseDataOffset, | |
stackedOverDimension: data.getCalculationInfo('stackedOverDimension') | |
}; | |
} | |
function getValueStart(valueAxis: Axis, valueOrigin: LineSeriesOption['areaStyle']['origin']) { | |
let valueStart = 0; | |
const extent = valueAxis.scale.getExtent(); | |
if (valueOrigin === 'start') { | |
valueStart = extent[0]; | |
} | |
else if (valueOrigin === 'end') { | |
valueStart = extent[1]; | |
} | |
// If origin is specified as a number, use it as | |
// valueStart directly | |
else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) { | |
valueStart = valueOrigin; | |
} | |
// auto | |
else { | |
// Both positive | |
if (extent[0] > 0) { | |
valueStart = extent[0]; | |
} | |
// Both negative | |
else if (extent[1] < 0) { | |
valueStart = extent[1]; | |
} | |
// If is one positive, and one negative, onZero shall be true | |
} | |
return valueStart; | |
} | |
export function getStackedOnPoint( | |
dataCoordInfo: CoordInfo, | |
coordSys: Cartesian2D | Polar, | |
data: SeriesData, | |
idx: number | |
) { | |
let value = NaN; | |
if (dataCoordInfo.stacked) { | |
value = data.get(data.getCalculationInfo('stackedOverDimension'), idx) as number; | |
} | |
if (isNaN(value)) { | |
value = dataCoordInfo.valueStart; | |
} | |
const baseDataOffset = dataCoordInfo.baseDataOffset; | |
const stackedData = []; | |
stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); | |
stackedData[1 - baseDataOffset] = value; | |
return coordSys.dataToPoint(stackedData); | |
} | |