123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /*
- * 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");
- }
- }
- }
|