CartesianAxisView.js 7.0 KB
Newer Older
S
sushuang 已提交
1
import * as zrUtil from 'zrender/core/util';
S
sushuang 已提交
2 3 4 5
import * as graphic from '../../util/graphic';
import AxisBuilder from './AxisBuilder';
import AxisView from './AxisView';
import * as cartesianAxisHelper from './cartesianAxisHelper';
P
pah100 已提交
6

S
sushuang 已提交
7 8
var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick;
var getInterval = AxisBuilder.getInterval;
P
pah100 已提交
9

S
sushuang 已提交
10 11 12 13 14 15
var axisBuilderAttrs = [
    'axisLine', 'axisTickLabel', 'axisName'
];
var selfBuilderAttrs = [
    'splitArea', 'splitLine'
];
P
pah100 已提交
16

S
sushuang 已提交
17 18 19 20 21 22 23
// function getAlignWithLabel(model, axisModel) {
//     var alignWithLabel = model.get('alignWithLabel');
//     if (alignWithLabel === 'auto') {
//         alignWithLabel = axisModel.get('axisTick.alignWithLabel');
//     }
//     return alignWithLabel;
// }
P
pah100 已提交
24

S
sushuang 已提交
25
var CartesianAxisView = AxisView.extend({
P
pah100 已提交
26

S
sushuang 已提交
27
    type: 'cartesianAxis',
P
pah100 已提交
28

S
sushuang 已提交
29
    axisPointerClass: 'CartesianAxisPointer',
P
pah100 已提交
30

S
sushuang 已提交
31 32 33 34
    /**
     * @override
     */
    render: function (axisModel, ecModel, api, payload) {
P
pah100 已提交
35

S
sushuang 已提交
36
        this.group.removeAll();
P
pah100 已提交
37

S
sushuang 已提交
38 39
        var oldAxisGroup = this._axisGroup;
        this._axisGroup = new graphic.Group();
P
pah100 已提交
40

S
sushuang 已提交
41
        this.group.add(this._axisGroup);
P
pah100 已提交
42

S
sushuang 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
        if (!axisModel.get('show')) {
            return;
        }

        var gridModel = axisModel.getCoordSysModel();

        var layout = cartesianAxisHelper.layout(gridModel, axisModel);

        var axisBuilder = new AxisBuilder(axisModel, layout);

        zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);

        this._axisGroup.add(axisBuilder.getGroup());

        zrUtil.each(selfBuilderAttrs, function (name) {
            if (axisModel.get(name + '.show')) {
                this['_' + name](axisModel, gridModel, layout.labelInterval);
P
pah100 已提交
60
            }
S
sushuang 已提交
61
        }, this);
P
pah100 已提交
62

S
sushuang 已提交
63
        graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);
P
pah100 已提交
64

S
sushuang 已提交
65 66
        CartesianAxisView.superCall(this, 'render', axisModel, ecModel, api, payload);
    },
P
pah100 已提交
67

S
sushuang 已提交
68 69 70 71 72 73 74 75
    /**
     * @param {module:echarts/coord/cartesian/AxisModel} axisModel
     * @param {module:echarts/coord/cartesian/GridModel} gridModel
     * @param {number|Function} labelInterval
     * @private
     */
    _splitLine: function (axisModel, gridModel, labelInterval) {
        var axis = axisModel.axis;
P
pah100 已提交
76

S
sushuang 已提交
77 78 79 80 81 82 83 84 85
        if (axis.scale.isBlank()) {
            return;
        }

        var splitLineModel = axisModel.getModel('splitLine');
        var lineStyleModel = splitLineModel.getModel('lineStyle');
        var lineColors = lineStyleModel.get('color');

        var lineInterval = getInterval(splitLineModel, labelInterval);
P
pah100 已提交
86

S
sushuang 已提交
87
        lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors];
P
pah100 已提交
88

S
sushuang 已提交
89 90
        var gridRect = gridModel.coordinateSystem.getRect();
        var isHorizontal = axis.isHorizontal();
P
pah100 已提交
91

S
sushuang 已提交
92
        var lineCount = 0;
P
pah100 已提交
93

S
sushuang 已提交
94 95 96 97
        var ticksCoords = axis.getTicksCoords(
            // splitLineModel.get('alignWithLabel')
        );
        var ticks = axis.scale.getTicks();
P
pah100 已提交
98

S
sushuang 已提交
99 100
        var showMinLabel = axisModel.get('axisLabel.showMinLabel');
        var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
P
pah100 已提交
101

S
sushuang 已提交
102 103 104 105 106 107 108 109 110 111 112
        var p1 = [];
        var p2 = [];
        // Simple optimization
        // Batching the lines if color are the same
        var lineStyle = lineStyleModel.getLineStyle();
        for (var i = 0; i < ticksCoords.length; i++) {
            if (ifIgnoreOnTick(
                axis, i, lineInterval, ticksCoords.length,
                showMinLabel, showMaxLabel
            )) {
                continue;
P
pah100 已提交
113 114
            }

S
sushuang 已提交
115 116 117 118 119 120 121
            var tickCoord = axis.toGlobalCoord(ticksCoords[i]);

            if (isHorizontal) {
                p1[0] = tickCoord;
                p1[1] = gridRect.y;
                p2[0] = tickCoord;
                p2[1] = gridRect.y + gridRect.height;
P
pah100 已提交
122
            }
S
sushuang 已提交
123 124 125 126 127
            else {
                p1[0] = gridRect.x;
                p1[1] = tickCoord;
                p2[0] = gridRect.x + gridRect.width;
                p2[1] = tickCoord;
P
pah100 已提交
128 129
            }

S
sushuang 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
            var colorIndex = (lineCount++) % lineColors.length;
            this._axisGroup.add(new graphic.Line(graphic.subPixelOptimizeLine({
                anid: 'line_' + ticks[i],

                shape: {
                    x1: p1[0],
                    y1: p1[1],
                    x2: p2[0],
                    y2: p2[1]
                },
                style: zrUtil.defaults({
                    stroke: lineColors[colorIndex]
                }, lineStyle),
                silent: true
            })));
        }
    },

    /**
     * @param {module:echarts/coord/cartesian/AxisModel} axisModel
     * @param {module:echarts/coord/cartesian/GridModel} gridModel
     * @param {number|Function} labelInterval
     * @private
     */
    _splitArea: function (axisModel, gridModel, labelInterval) {
        var axis = axisModel.axis;

        if (axis.scale.isBlank()) {
            return;
P
pah100 已提交
159 160
        }

S
sushuang 已提交
161 162 163
        var splitAreaModel = axisModel.getModel('splitArea');
        var areaStyleModel = splitAreaModel.getModel('areaStyle');
        var areaColors = areaStyleModel.get('color');
P
pah100 已提交
164

S
sushuang 已提交
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
        var gridRect = gridModel.coordinateSystem.getRect();

        var ticksCoords = axis.getTicksCoords(
            // splitAreaModel.get('alignWithLabel')
        );
        var ticks = axis.scale.getTicks();

        var prevX = axis.toGlobalCoord(ticksCoords[0]);
        var prevY = axis.toGlobalCoord(ticksCoords[0]);

        var count = 0;

        var areaInterval = getInterval(splitAreaModel, labelInterval);

        var areaStyle = areaStyleModel.getAreaStyle();
        areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors];

        var showMinLabel = axisModel.get('axisLabel.showMinLabel');
        var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');

        for (var i = 1; i < ticksCoords.length; i++) {
            if (ifIgnoreOnTick(
                axis, i, areaInterval, ticksCoords.length,
                showMinLabel, showMaxLabel
            )) {
                continue;
            }

            var tickCoord = axis.toGlobalCoord(ticksCoords[i]);

            var x;
            var y;
            var width;
            var height;
            if (axis.isHorizontal()) {
                x = prevX;
                y = gridRect.y;
                width = tickCoord - x;
                height = gridRect.height;
            }
            else {
                x = gridRect.x;
                y = prevY;
                width = gridRect.width;
                height = tickCoord - y;
            }

            var colorIndex = (count++) % areaColors.length;
            this._axisGroup.add(new graphic.Rect({
                anid: 'area_' + ticks[i],

                shape: {
                    x: x,
                    y: y,
                    width: width,
                    height: height
                },
                style: zrUtil.defaults({
                    fill: areaColors[colorIndex]
                }, areaStyle),
                silent: true
            }));

            prevX = x + width;
            prevY = y + height;
        }
    }
});

CartesianAxisView.extend({
    type: 'xAxis'
});
CartesianAxisView.extend({
    type: 'yAxis'
});