You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2022/01/04 08:55:57 UTC
[echarts] branch optimize-code updated: style: fix circular dependencies
This is an automated email from the ASF dual-hosted git repository.
shenyi pushed a commit to branch optimize-code
in repository https://gitbox.apache.org/repos/asf/echarts.git
The following commit(s) were added to refs/heads/optimize-code by this push:
new 50fcadb style: fix circular dependencies
50fcadb is described below
commit 50fcadb0903f8aa0b70a2a2bf2bac100b9790059
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Jan 4 16:55:30 2022 +0800
style: fix circular dependencies
---
src/coord/axisAlignTicks.ts | 121 ++++++++++++++++++++++++++++++++++++++++++
src/coord/cartesian/Grid.ts | 3 +-
src/coord/radar/Radar.ts | 2 +-
src/scale/helper.ts | 125 ++------------------------------------------
4 files changed, 128 insertions(+), 123 deletions(-)
diff --git a/src/coord/axisAlignTicks.ts b/src/coord/axisAlignTicks.ts
new file mode 100644
index 0000000..d2c083a
--- /dev/null
+++ b/src/coord/axisAlignTicks.ts
@@ -0,0 +1,121 @@
+import { NumericAxisBaseOptionCommon } from './axisCommonTypes';
+import { getPrecisionSafe, round } from '../util/number';
+import IntervalScale from '../scale/Interval';
+import { getScaleExtent } from './axisHelper';
+import { AxisBaseModel } from './AxisBaseModel';
+import LogScale from '../scale/Log';
+import { warn } from '../util/log';
+import { mathLog, increaseInterval, isValueNice } from '../scale/helper';
+
+
+export function alignScaleTicks(
+ scale: IntervalScale | LogScale,
+ axisModel: AxisBaseModel<Pick<NumericAxisBaseOptionCommon, 'min' | 'max'>>,
+ alignToScale: IntervalScale | LogScale
+) {
+
+ const 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.
+ const alignToTicks = intervalScaleProto.getTicks.call(alignToScale);
+ const alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true);
+ const alignToSplitNumber = alignToTicks.length - 1;
+ const alignToInterval = intervalScaleProto.getInterval.call(alignToScale);
+
+ const scaleExtent = getScaleExtent(scale, axisModel);
+ let rawExtent = scaleExtent.extent;
+ const isMinFixed = scaleExtent.fixMin;
+ const isMaxFixed = scaleExtent.fixMax;
+
+ if (scale.type === 'log') {
+ const logBase = mathLog((scale as LogScale).base);
+ rawExtent = [mathLog(rawExtent[0]) / logBase, mathLog(rawExtent[1]) / logBase];
+ }
+
+ scale.setExtent(rawExtent[0], rawExtent[1]);
+ scale.calcNiceExtent({
+ splitNumber: alignToSplitNumber,
+ fixMin: isMinFixed,
+ fixMax: isMaxFixed
+ });
+ const 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];
+ }
+
+ let interval = intervalScaleProto.getInterval.call(scale);
+ let min: number = rawExtent[0];
+ let max: number = 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 {
+ const nicedSplitNumber = scale.getTicks().length - 1;
+ if (nicedSplitNumber > alignToSplitNumber) {
+ interval = increaseInterval(interval);
+ }
+
+ const 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
+ const t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval;
+ const 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 (__DEV__) {
+ const 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`
+ );
+ }
+ }
+}
diff --git a/src/coord/cartesian/Grid.ts b/src/coord/cartesian/Grid.ts
index d9c6de6..e389538 100644
--- a/src/coord/cartesian/Grid.ts
+++ b/src/coord/cartesian/Grid.ts
@@ -49,7 +49,8 @@ import OrdinalScale from '../../scale/Ordinal';
import { isCartesian2DSeries, findAxisModels } from './cartesianAxisHelper';
import { CategoryAxisBaseOption, NumericAxisBaseOptionCommon } from '../axisCommonTypes';
import { AxisBaseModel } from '../AxisBaseModel';
-import { alignScaleTicks, isIntervalOrLogScale } from '../../scale/helper';
+import { isIntervalOrLogScale } from '../../scale/helper';
+import { alignScaleTicks } from "../axisAlignTicks";
import IntervalScale from '../../scale/Interval';
import LogScale from '../../scale/Log';
diff --git a/src/coord/radar/Radar.ts b/src/coord/radar/Radar.ts
index 3b5ffa4..f96d6c0 100644
--- a/src/coord/radar/Radar.ts
+++ b/src/coord/radar/Radar.ts
@@ -29,7 +29,7 @@ import ExtensionAPI from '../../core/ExtensionAPI';
import { ScaleDataValue } from '../../util/types';
import { ParsedModelFinder } from '../../util/model';
import { map, each, isString, isNumber } from 'zrender/src/core/util';
-import { alignScaleTicks } from '../../scale/helper';
+import { alignScaleTicks } from "../axisAlignTicks";
class Radar implements CoordinateSystem, CoordinateSystemMaster {
diff --git a/src/scale/helper.ts b/src/scale/helper.ts
index a04ec38..1f20f03 100644
--- a/src/scale/helper.ts
+++ b/src/scale/helper.ts
@@ -17,16 +17,12 @@
* under the License.
*/
-import { NumericAxisBaseOptionCommon } from '../coord/axisCommonTypes';
-import {getPrecisionSafe, getPrecision, round, nice, quantityExponent} from '../util/number';
+import {getPrecision, round, nice, quantityExponent} from '../util/number';
import IntervalScale from './Interval';
-import { getScaleExtent } from '../coord/axisHelper';
-import { AxisBaseModel } from '../coord/AxisBaseModel';
import LogScale from './Log';
import Scale from './Scale';
-import { warn } from '../util/log';
-const mathLog = Math.log;
+export const mathLog = Math.log;
type intervalScaleNiceTicksResult = {
interval: number,
@@ -34,7 +30,7 @@ type intervalScaleNiceTicksResult = {
niceTickExtent: [number, number]
};
-function isValueNice(val: number) {
+export function isValueNice(val: number) {
const exp10 = Math.pow(10, quantityExponent(Math.abs(val)));
const f = Math.abs(val / exp10);
return f === 0
@@ -82,7 +78,7 @@ export function intervalScaleNiceTicks(
return result;
}
-function increaseInterval(interval: number) {
+export function increaseInterval(interval: number) {
const exp10 = Math.pow(10, quantityExponent(interval));
// Increase interval
let f = interval / exp10;
@@ -101,119 +97,6 @@ function increaseInterval(interval: number) {
return f * exp10;
}
-export function alignScaleTicks(
- scale: IntervalScale | LogScale,
- axisModel: AxisBaseModel<Pick<NumericAxisBaseOptionCommon, 'min' | 'max'>>,
- alignToScale: IntervalScale | LogScale
-) {
-
- const 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.
- const alignToTicks = intervalScaleProto.getTicks.call(alignToScale);
- const alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true);
- const alignToSplitNumber = alignToTicks.length - 1;
- const alignToInterval = intervalScaleProto.getInterval.call(alignToScale);
-
- const scaleExtent = getScaleExtent(scale, axisModel);
- let rawExtent = scaleExtent.extent;
- const isMinFixed = scaleExtent.fixMin;
- const isMaxFixed = scaleExtent.fixMax;
-
- if (scale.type === 'log') {
- const logBase = mathLog((scale as LogScale).base);
- rawExtent = [mathLog(rawExtent[0]) / logBase, mathLog(rawExtent[1]) / logBase];
- }
-
- scale.setExtent(rawExtent[0], rawExtent[1]);
- scale.calcNiceExtent({
- splitNumber: alignToSplitNumber,
- fixMin: isMinFixed,
- fixMax: isMaxFixed
- });
- const 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];
- }
-
- let interval = intervalScaleProto.getInterval.call(scale);
- let min: number = rawExtent[0];
- let max: number = 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 {
- const nicedSplitNumber = scale.getTicks().length - 1;
- if (nicedSplitNumber > alignToSplitNumber) {
- interval = increaseInterval(interval);
- }
-
- const 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
- const t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval;
- const 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 (__DEV__) {
- const 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`
- );
- }
- }
-}
-
/**
* @return interval precision
*/
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org