| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575 | define('echarts/chart/gauge', [    'require',    './base',    '../util/shape/GaugePointer',    'zrender/shape/Text',    'zrender/shape/Line',    'zrender/shape/Rectangle',    'zrender/shape/Circle',    'zrender/shape/Sector',    '../config',    '../util/ecData',    '../util/accMath',    'zrender/tool/util',    '../chart'], function (require) {    var ChartBase = require('./base');    var GaugePointerShape = require('../util/shape/GaugePointer');    var TextShape = require('zrender/shape/Text');    var LineShape = require('zrender/shape/Line');    var RectangleShape = require('zrender/shape/Rectangle');    var CircleShape = require('zrender/shape/Circle');    var SectorShape = require('zrender/shape/Sector');    var ecConfig = require('../config');    ecConfig.gauge = {        zlevel: 0,        z: 2,        center: [            '50%',            '50%'        ],        clickable: true,        legendHoverLink: true,        radius: '75%',        startAngle: 225,        endAngle: -45,        min: 0,        max: 100,        splitNumber: 10,        axisLine: {            show: true,            lineStyle: {                color: [                    [                        0.2,                        '#228b22'                    ],                    [                        0.8,                        '#48b'                    ],                    [                        1,                        '#ff4500'                    ]                ],                width: 30            }        },        axisTick: {            show: true,            splitNumber: 5,            length: 8,            lineStyle: {                color: '#eee',                width: 1,                type: 'solid'            }        },        axisLabel: {            show: true,            textStyle: { color: 'auto' }        },        splitLine: {            show: true,            length: 30,            lineStyle: {                color: '#eee',                width: 2,                type: 'solid'            }        },        pointer: {            show: true,            length: '80%',            width: 8,            color: 'auto'        },        title: {            show: true,            offsetCenter: [                0,                '-40%'            ],            textStyle: {                color: '#333',                fontSize: 15            }        },        detail: {            show: true,            backgroundColor: 'rgba(0,0,0,0)',            borderWidth: 0,            borderColor: '#ccc',            width: 100,            height: 40,            offsetCenter: [                0,                '40%'            ],            textStyle: {                color: 'auto',                fontSize: 30            }        }    };    var ecData = require('../util/ecData');    var accMath = require('../util/accMath');    var zrUtil = require('zrender/tool/util');    function Gauge(ecTheme, messageCenter, zr, option, myChart) {        ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);        this.refresh(option);    }    Gauge.prototype = {        type: ecConfig.CHART_TYPE_GAUGE,        _buildShape: function () {            var series = this.series;            this._paramsMap = {};            for (var i = 0, l = series.length; i < l; i++) {                if (series[i].type === ecConfig.CHART_TYPE_GAUGE) {                    series[i] = this.reformOption(series[i]);                    this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink;                    this._buildSingleGauge(i);                    this.buildMark(i);                }            }            this.addShapeList();        },        _buildSingleGauge: function (seriesIndex) {            var serie = this.series[seriesIndex];            this._paramsMap[seriesIndex] = {                center: this.parseCenter(this.zr, serie.center),                radius: this.parseRadius(this.zr, serie.radius),                startAngle: serie.startAngle.toFixed(2) - 0,                endAngle: serie.endAngle.toFixed(2) - 0            };            this._paramsMap[seriesIndex].totalAngle = this._paramsMap[seriesIndex].startAngle - this._paramsMap[seriesIndex].endAngle;            this._colorMap(seriesIndex);            this._buildAxisLine(seriesIndex);            this._buildSplitLine(seriesIndex);            this._buildAxisTick(seriesIndex);            this._buildAxisLabel(seriesIndex);            this._buildPointer(seriesIndex);            this._buildTitle(seriesIndex);            this._buildDetail(seriesIndex);        },        _buildAxisLine: function (seriesIndex) {            var serie = this.series[seriesIndex];            if (!serie.axisLine.show) {                return;            }            var min = serie.min;            var total = serie.max - min;            var params = this._paramsMap[seriesIndex];            var center = params.center;            var startAngle = params.startAngle;            var totalAngle = params.totalAngle;            var colorArray = params.colorArray;            var lineStyle = serie.axisLine.lineStyle;            var lineWidth = this.parsePercent(lineStyle.width, params.radius[1]);            var r = params.radius[1];            var r0 = r - lineWidth;            var sectorShape;            var lastAngle = startAngle;            var newAngle;            for (var i = 0, l = colorArray.length; i < l; i++) {                newAngle = startAngle - totalAngle * (colorArray[i][0] - min) / total;                sectorShape = this._getSector(center, r0, r, newAngle, lastAngle, colorArray[i][1], lineStyle);                lastAngle = newAngle;                sectorShape._animationAdd = 'r';                ecData.set(sectorShape, 'seriesIndex', seriesIndex);                ecData.set(sectorShape, 'dataIndex', i);                this.shapeList.push(sectorShape);            }        },        _buildSplitLine: function (seriesIndex) {            var serie = this.series[seriesIndex];            if (!serie.splitLine.show) {                return;            }            var params = this._paramsMap[seriesIndex];            var splitNumber = serie.splitNumber;            var min = serie.min;            var total = serie.max - min;            var splitLine = serie.splitLine;            var length = this.parsePercent(splitLine.length, params.radius[1]);            var lineStyle = splitLine.lineStyle;            var color = lineStyle.color;            var center = params.center;            var startAngle = params.startAngle * Math.PI / 180;            var totalAngle = params.totalAngle * Math.PI / 180;            var r = params.radius[1];            var r0 = r - length;            var angle;            var sinAngle;            var cosAngle;            for (var i = 0; i <= splitNumber; i++) {                angle = startAngle - totalAngle / splitNumber * i;                sinAngle = Math.sin(angle);                cosAngle = Math.cos(angle);                this.shapeList.push(new LineShape({                    zlevel: this.getZlevelBase(),                    z: this.getZBase() + 1,                    hoverable: false,                    style: {                        xStart: center[0] + cosAngle * r,                        yStart: center[1] - sinAngle * r,                        xEnd: center[0] + cosAngle * r0,                        yEnd: center[1] - sinAngle * r0,                        strokeColor: color === 'auto' ? this._getColor(seriesIndex, min + total / splitNumber * i) : color,                        lineType: lineStyle.type,                        lineWidth: lineStyle.width,                        shadowColor: lineStyle.shadowColor,                        shadowBlur: lineStyle.shadowBlur,                        shadowOffsetX: lineStyle.shadowOffsetX,                        shadowOffsetY: lineStyle.shadowOffsetY                    }                }));            }        },        _buildAxisTick: function (seriesIndex) {            var serie = this.series[seriesIndex];            if (!serie.axisTick.show) {                return;            }            var params = this._paramsMap[seriesIndex];            var splitNumber = serie.splitNumber;            var min = serie.min;            var total = serie.max - min;            var axisTick = serie.axisTick;            var tickSplit = axisTick.splitNumber;            var length = this.parsePercent(axisTick.length, params.radius[1]);            var lineStyle = axisTick.lineStyle;            var color = lineStyle.color;            var center = params.center;            var startAngle = params.startAngle * Math.PI / 180;            var totalAngle = params.totalAngle * Math.PI / 180;            var r = params.radius[1];            var r0 = r - length;            var angle;            var sinAngle;            var cosAngle;            for (var i = 0, l = splitNumber * tickSplit; i <= l; i++) {                if (i % tickSplit === 0) {                    continue;                }                angle = startAngle - totalAngle / l * i;                sinAngle = Math.sin(angle);                cosAngle = Math.cos(angle);                this.shapeList.push(new LineShape({                    zlevel: this.getZlevelBase(),                    z: this.getZBase() + 1,                    hoverable: false,                    style: {                        xStart: center[0] + cosAngle * r,                        yStart: center[1] - sinAngle * r,                        xEnd: center[0] + cosAngle * r0,                        yEnd: center[1] - sinAngle * r0,                        strokeColor: color === 'auto' ? this._getColor(seriesIndex, min + total / l * i) : color,                        lineType: lineStyle.type,                        lineWidth: lineStyle.width,                        shadowColor: lineStyle.shadowColor,                        shadowBlur: lineStyle.shadowBlur,                        shadowOffsetX: lineStyle.shadowOffsetX,                        shadowOffsetY: lineStyle.shadowOffsetY                    }                }));            }        },        _buildAxisLabel: function (seriesIndex) {            var serie = this.series[seriesIndex];            if (!serie.axisLabel.show) {                return;            }            var splitNumber = serie.splitNumber;            var min = serie.min;            var total = serie.max - min;            var textStyle = serie.axisLabel.textStyle;            var textFont = this.getFont(textStyle);            var color = textStyle.color;            var params = this._paramsMap[seriesIndex];            var center = params.center;            var startAngle = params.startAngle;            var totalAngle = params.totalAngle;            var r0 = params.radius[1] - this.parsePercent(serie.splitLine.length, params.radius[1]) - 5;            var angle;            var sinAngle;            var cosAngle;            var value;            for (var i = 0; i <= splitNumber; i++) {                value = accMath.accAdd(min, accMath.accMul(accMath.accDiv(total, splitNumber), i));                angle = startAngle - totalAngle / splitNumber * i;                sinAngle = Math.sin(angle * Math.PI / 180);                cosAngle = Math.cos(angle * Math.PI / 180);                angle = (angle + 360) % 360;                this.shapeList.push(new TextShape({                    zlevel: this.getZlevelBase(),                    z: this.getZBase() + 1,                    hoverable: false,                    style: {                        x: center[0] + cosAngle * r0,                        y: center[1] - sinAngle * r0,                        color: color === 'auto' ? this._getColor(seriesIndex, value) : color,                        text: this._getLabelText(serie.axisLabel.formatter, value),                        textAlign: angle >= 110 && angle <= 250 ? 'left' : angle <= 70 || angle >= 290 ? 'right' : 'center',                        textBaseline: angle >= 10 && angle <= 170 ? 'top' : angle >= 190 && angle <= 350 ? 'bottom' : 'middle',                        textFont: textFont,                        shadowColor: textStyle.shadowColor,                        shadowBlur: textStyle.shadowBlur,                        shadowOffsetX: textStyle.shadowOffsetX,                        shadowOffsetY: textStyle.shadowOffsetY                    }                }));            }        },        _buildPointer: function (seriesIndex) {            var serie = this.series[seriesIndex];            if (!serie.pointer.show) {                return;            }            var total = serie.max - serie.min;            var pointer = serie.pointer;            var params = this._paramsMap[seriesIndex];            var length = this.parsePercent(pointer.length, params.radius[1]);            var width = this.parsePercent(pointer.width, params.radius[1]);            var center = params.center;            var value = this._getValue(seriesIndex);            value = value < serie.max ? value : serie.max;            var angle = (params.startAngle - params.totalAngle / total * (value - serie.min)) * Math.PI / 180;            var color = pointer.color === 'auto' ? this._getColor(seriesIndex, value) : pointer.color;            var pointShape = new GaugePointerShape({                zlevel: this.getZlevelBase(),                z: this.getZBase() + 1,                clickable: this.query(serie, 'clickable'),                style: {                    x: center[0],                    y: center[1],                    r: length,                    startAngle: params.startAngle * Math.PI / 180,                    angle: angle,                    color: color,                    width: width,                    shadowColor: pointer.shadowColor,                    shadowBlur: pointer.shadowBlur,                    shadowOffsetX: pointer.shadowOffsetX,                    shadowOffsetY: pointer.shadowOffsetY                },                highlightStyle: {                    brushType: 'fill',                    width: width > 2 ? 2 : width / 2,                    color: '#fff'                }            });            ecData.pack(pointShape, this.series[seriesIndex], seriesIndex, this.series[seriesIndex].data[0], 0, this.series[seriesIndex].data[0].name, value);            this.shapeList.push(pointShape);            this.shapeList.push(new CircleShape({                zlevel: this.getZlevelBase(),                z: this.getZBase() + 2,                hoverable: false,                style: {                    x: center[0],                    y: center[1],                    r: pointer.width / 2.5,                    color: '#fff'                }            }));        },        _buildTitle: function (seriesIndex) {            var serie = this.series[seriesIndex];            if (!serie.title.show) {                return;            }            var data = serie.data[0];            var name = data.name != null ? data.name : '';            if (name !== '') {                var title = serie.title;                var offsetCenter = title.offsetCenter;                var textStyle = title.textStyle;                var textColor = textStyle.color;                var params = this._paramsMap[seriesIndex];                var x = params.center[0] + this.parsePercent(offsetCenter[0], params.radius[1]);                var y = params.center[1] + this.parsePercent(offsetCenter[1], params.radius[1]);                this.shapeList.push(new TextShape({                    zlevel: this.getZlevelBase(),                    z: this.getZBase() + (Math.abs(x - params.center[0]) + Math.abs(y - params.center[1]) < textStyle.fontSize * 2 ? 2 : 1),                    hoverable: false,                    style: {                        x: x,                        y: y,                        color: textColor === 'auto' ? this._getColor(seriesIndex) : textColor,                        text: name,                        textAlign: 'center',                        textFont: this.getFont(textStyle),                        shadowColor: textStyle.shadowColor,                        shadowBlur: textStyle.shadowBlur,                        shadowOffsetX: textStyle.shadowOffsetX,                        shadowOffsetY: textStyle.shadowOffsetY                    }                }));            }        },        _buildDetail: function (seriesIndex) {            var serie = this.series[seriesIndex];            if (!serie.detail.show) {                return;            }            var detail = serie.detail;            var offsetCenter = detail.offsetCenter;            var color = detail.backgroundColor;            var textStyle = detail.textStyle;            var textColor = textStyle.color;            var params = this._paramsMap[seriesIndex];            var value = this._getValue(seriesIndex);            var x = params.center[0] - detail.width / 2 + this.parsePercent(offsetCenter[0], params.radius[1]);            var y = params.center[1] + this.parsePercent(offsetCenter[1], params.radius[1]);            this.shapeList.push(new RectangleShape({                zlevel: this.getZlevelBase(),                z: this.getZBase() + (Math.abs(x + detail.width / 2 - params.center[0]) + Math.abs(y + detail.height / 2 - params.center[1]) < textStyle.fontSize ? 2 : 1),                hoverable: false,                style: {                    x: x,                    y: y,                    width: detail.width,                    height: detail.height,                    brushType: 'both',                    color: color === 'auto' ? this._getColor(seriesIndex, value) : color,                    lineWidth: detail.borderWidth,                    strokeColor: detail.borderColor,                    shadowColor: detail.shadowColor,                    shadowBlur: detail.shadowBlur,                    shadowOffsetX: detail.shadowOffsetX,                    shadowOffsetY: detail.shadowOffsetY,                    text: this._getLabelText(detail.formatter, value),                    textFont: this.getFont(textStyle),                    textPosition: 'inside',                    textColor: textColor === 'auto' ? this._getColor(seriesIndex, value) : textColor                }            }));        },        _getValue: function (seriesIndex) {            return this.getDataFromOption(this.series[seriesIndex].data[0]);        },        _colorMap: function (seriesIndex) {            var serie = this.series[seriesIndex];            var min = serie.min;            var total = serie.max - min;            var color = serie.axisLine.lineStyle.color;            if (!(color instanceof Array)) {                color = [[                        1,                        color                    ]];            }            var colorArray = [];            for (var i = 0, l = color.length; i < l; i++) {                colorArray.push([                    color[i][0] * total + min,                    color[i][1]                ]);            }            this._paramsMap[seriesIndex].colorArray = colorArray;        },        _getColor: function (seriesIndex, value) {            if (value == null) {                value = this._getValue(seriesIndex);            }            var colorArray = this._paramsMap[seriesIndex].colorArray;            for (var i = 0, l = colorArray.length; i < l; i++) {                if (colorArray[i][0] >= value) {                    return colorArray[i][1];                }            }            return colorArray[colorArray.length - 1][1];        },        _getSector: function (center, r0, r, startAngle, endAngle, color, lineStyle) {            return new SectorShape({                zlevel: this.getZlevelBase(),                z: this.getZBase(),                hoverable: false,                style: {                    x: center[0],                    y: center[1],                    r0: r0,                    r: r,                    startAngle: startAngle,                    endAngle: endAngle,                    brushType: 'fill',                    color: color,                    shadowColor: lineStyle.shadowColor,                    shadowBlur: lineStyle.shadowBlur,                    shadowOffsetX: lineStyle.shadowOffsetX,                    shadowOffsetY: lineStyle.shadowOffsetY                }            });        },        _getLabelText: function (formatter, value) {            if (formatter) {                if (typeof formatter === 'function') {                    return formatter.call(this.myChart, value);                } else if (typeof formatter === 'string') {                    return formatter.replace('{value}', value);                }            }            return value;        },        refresh: function (newOption) {            if (newOption) {                this.option = newOption;                this.series = newOption.series;            }            this.backupShapeList();            this._buildShape();        }    };    zrUtil.inherits(Gauge, ChartBase);    require('../chart').define('gauge', Gauge);    return Gauge;});define('echarts/util/shape/GaugePointer', [    'require',    'zrender/shape/Base',    'zrender/tool/util',    './normalIsCover'], function (require) {    var Base = require('zrender/shape/Base');    var zrUtil = require('zrender/tool/util');    function GaugePointer(options) {        Base.call(this, options);    }    GaugePointer.prototype = {        type: 'gauge-pointer',        buildPath: function (ctx, style) {            var r = style.r;            var width = style.width;            var angle = style.angle;            var x = style.x - Math.cos(angle) * width * (width >= r / 3 ? 1 : 2);            var y = style.y + Math.sin(angle) * width * (width >= r / 3 ? 1 : 2);            angle = style.angle - Math.PI / 2;            ctx.moveTo(x, y);            ctx.lineTo(style.x + Math.cos(angle) * width, style.y - Math.sin(angle) * width);            ctx.lineTo(style.x + Math.cos(style.angle) * r, style.y - Math.sin(style.angle) * r);            ctx.lineTo(style.x - Math.cos(angle) * width, style.y + Math.sin(angle) * width);            ctx.lineTo(x, y);            return;        },        getRect: function (style) {            if (style.__rect) {                return style.__rect;            }            var width = style.width * 2;            var xStart = style.x;            var yStart = style.y;            var xEnd = xStart + Math.cos(style.angle) * style.r;            var yEnd = yStart - Math.sin(style.angle) * style.r;            style.__rect = {                x: Math.min(xStart, xEnd) - width,                y: Math.min(yStart, yEnd) - width,                width: Math.abs(xStart - xEnd) + width,                height: Math.abs(yStart - yEnd) + width            };            return style.__rect;        },        isCover: require('./normalIsCover')    };    zrUtil.inherits(GaugePointer, Base);    return GaugePointer;});
 |