You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
5.7 KiB
137 lines
5.7 KiB
1 month ago
|
|
||
|
/*
|
||
|
* 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.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* 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 { getPrecisionSafe, round } from '../util/number.js';
|
||
|
import IntervalScale from '../scale/Interval.js';
|
||
|
import { getScaleExtent } from './axisHelper.js';
|
||
|
import { warn } from '../util/log.js';
|
||
|
import { increaseInterval, isValueNice } from '../scale/helper.js';
|
||
|
var mathLog = Math.log;
|
||
|
export function alignScaleTicks(scale, axisModel, alignToScale) {
|
||
|
var intervalScaleProto = IntervalScale.prototype;
|
||
|
// NOTE: There is a precondition for log scale here:
|
||
|
// In log scale we store _interval and _extent of exponent value.
|
||
|
// So if we use the method of InternalScale to set/get these data.
|
||
|
// It process the exponent value, which is linear and what we want here.
|
||
|
var alignToTicks = intervalScaleProto.getTicks.call(alignToScale);
|
||
|
var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true);
|
||
|
var alignToSplitNumber = alignToTicks.length - 1;
|
||
|
var alignToInterval = intervalScaleProto.getInterval.call(alignToScale);
|
||
|
var scaleExtent = getScaleExtent(scale, axisModel);
|
||
|
var rawExtent = scaleExtent.extent;
|
||
|
var isMinFixed = scaleExtent.fixMin;
|
||
|
var isMaxFixed = scaleExtent.fixMax;
|
||
|
if (scale.type === 'log') {
|
||
|
var logBase = mathLog(scale.base);
|
||
|
rawExtent = [mathLog(rawExtent[0]) / logBase, mathLog(rawExtent[1]) / logBase];
|
||
|
}
|
||
|
scale.setExtent(rawExtent[0], rawExtent[1]);
|
||
|
scale.calcNiceExtent({
|
||
|
splitNumber: alignToSplitNumber,
|
||
|
fixMin: isMinFixed,
|
||
|
fixMax: isMaxFixed
|
||
|
});
|
||
|
var extent = intervalScaleProto.getExtent.call(scale);
|
||
|
// Need to update the rawExtent.
|
||
|
// Because value in rawExtent may be not parsed. e.g. 'dataMin', 'dataMax'
|
||
|
if (isMinFixed) {
|
||
|
rawExtent[0] = extent[0];
|
||
|
}
|
||
|
if (isMaxFixed) {
|
||
|
rawExtent[1] = extent[1];
|
||
|
}
|
||
|
var interval = intervalScaleProto.getInterval.call(scale);
|
||
|
var min = rawExtent[0];
|
||
|
var max = rawExtent[1];
|
||
|
if (isMinFixed && isMaxFixed) {
|
||
|
// User set min, max, divide to get new interval
|
||
|
interval = (max - min) / alignToSplitNumber;
|
||
|
} else if (isMinFixed) {
|
||
|
max = rawExtent[0] + interval * alignToSplitNumber;
|
||
|
// User set min, expand extent on the other side
|
||
|
while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) {
|
||
|
interval = increaseInterval(interval);
|
||
|
max = rawExtent[0] + interval * alignToSplitNumber;
|
||
|
}
|
||
|
} else if (isMaxFixed) {
|
||
|
// User set max, expand extent on the other side
|
||
|
min = rawExtent[1] - interval * alignToSplitNumber;
|
||
|
while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) {
|
||
|
interval = increaseInterval(interval);
|
||
|
min = rawExtent[1] - interval * alignToSplitNumber;
|
||
|
}
|
||
|
} else {
|
||
|
var nicedSplitNumber = scale.getTicks().length - 1;
|
||
|
if (nicedSplitNumber > alignToSplitNumber) {
|
||
|
interval = increaseInterval(interval);
|
||
|
}
|
||
|
var range = interval * alignToSplitNumber;
|
||
|
max = Math.ceil(rawExtent[1] / interval) * interval;
|
||
|
min = round(max - range);
|
||
|
// Not change the result that crossing zero.
|
||
|
if (min < 0 && rawExtent[0] >= 0) {
|
||
|
min = 0;
|
||
|
max = round(range);
|
||
|
} else if (max > 0 && rawExtent[1] <= 0) {
|
||
|
max = 0;
|
||
|
min = -round(range);
|
||
|
}
|
||
|
}
|
||
|
// Adjust min, max based on the extent of alignTo. When min or max is set in alignTo scale
|
||
|
var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval;
|
||
|
var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval;
|
||
|
// NOTE: Must in setExtent -> setInterval -> setNiceExtent order.
|
||
|
intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1);
|
||
|
intervalScaleProto.setInterval.call(scale, interval);
|
||
|
if (t0 || t1) {
|
||
|
intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval);
|
||
|
}
|
||
|
if (process.env.NODE_ENV !== 'production') {
|
||
|
var ticks = intervalScaleProto.getTicks.call(scale);
|
||
|
if (ticks[1] && (!isValueNice(interval) || getPrecisionSafe(ticks[1].value) > getPrecisionSafe(interval))) {
|
||
|
warn(
|
||
|
// eslint-disable-next-line
|
||
|
"The ticks may be not readable when set min: " + axisModel.get('min') + ", max: " + axisModel.get('max') + " and alignTicks: true");
|
||
|
}
|
||
|
}
|
||
|
}
|